ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDJlODBjMzkuLmI4MmQ4NjQgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMSw1ICsxLDYgQEAKIHBsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2Jpbi1pbnRyby8KIC8qLyovYmluLworcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vYmluLWludHJvLwogKn4KICoucmVqCiAqLmJhawpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlLy5jbGFzc3BhdGggYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM5MmM2Mi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IG91dHB1dD0ic3JjX2FudF9iaW4iIGtpbmQ9InNyYyIgcGF0aD0ic3JjX2FudC8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvQnVpbGQgQW50IFN1cHBvcnQgSkFSLmxhdW5jaCBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvQnVpbGQgQW50IFN1cHBvcnQgSkFSLmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY1ZDMxMy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0J1aWxkIEFudCBTdXBwb3J0IEpBUi5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UuYW50LkFudEJ1aWxkZXJMYXVuY2hDb25maWd1cmF0aW9uVHlwZSI+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkFUVFJfTEFVTkNIX0lOX0JBQ0tHUk9VTkQiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5hbnQudWkuREVGQVVMVF9WTV9JTlNUQUxMIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5ERUZBVUxUX0NMQVNTUEFUSCIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfUlVOX0JVSUxEX0tJTkRTIiB2YWx1ZT0iZnVsbCxpbmNyZW1lbnRhbCxhdXRvLGNsZWFuIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmFudC51aS5BVFRSX1RBUkdFVFNfVVBEQVRFRCIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1RSSUdHRVJTX0NPTkZJR1VSRUQiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5DTEFTU1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5hbnQudWkuQW50Q2xhc3NwYXRoUHJvdmlkZXIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS50YXJnZXRfcnVuX3BlcnNwZWN0aXZlIiB2YWx1ZT0icGVyc3BlY3RpdmVfbm9uZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmFudC51aS5BVFRSX0FOVF9DTEVBTl9UQVJHRVRTIiB2YWx1ZT0iY2xlYW4sIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0JVSUxEX1NDT1BFIiB2YWx1ZT0iJHt3b3JraW5nX3NldDombHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDtVVEYtOCZxdW90Oz8mZ3Q7JiMxMDsmbHQ7bGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQgZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtpbmdTZXRGYWN0b3J5JnF1b3Q7IG5hbWU9JnF1b3Q7d29ya2luZ1NldCZxdW90OyBlZGl0UGFnZUlkPSZxdW90O29yZy5lY2xpcHNlLnVpLnJlc291cmNlV29ya2luZ1NldFBhZ2UmcXVvdDsmZ3Q7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQmcXVvdDsgdHlwZT0mcXVvdDsyJnF1b3Q7LyZndDsmIzEwOyZsdDtpdGVtIGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5tb2RlbC5SZXNvdXJjZUZhY3RvcnkmcXVvdDsgcGF0aD0mcXVvdDsvb3JnLmVjbGlwc2UuYW50LmNvcmUvYnVpbGRmaWxlcy9idWlsZEV4dHJhSkFSLnhtbCZxdW90OyB0eXBlPSZxdW90OzEmcXVvdDsvJmd0OyYjMTA7Jmx0Oy9sYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ1NldCZndDsmIzEwO30iLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkFUVFJfUkVGUkVTSF9TQ09QRSIgdmFsdWU9IiR7d29ya2luZ19zZXQ6Jmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7VVRGLTgmcXVvdDs/Jmd0OyYjMTA7Jmx0O2xhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nU2V0IGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JraW5nU2V0RmFjdG9yeSZxdW90OyBuYW1lPSZxdW90O3dvcmtpbmdTZXQmcXVvdDsgZWRpdFBhZ2VJZD0mcXVvdDtvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVdvcmtpbmdTZXRQYWdlJnF1b3Q7Jmd0OyYjMTA7Jmx0O2l0ZW0gZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLm1vZGVsLlJlc291cmNlRmFjdG9yeSZxdW90OyBwYXRoPSZxdW90Oy9vcmcuZWNsaXBzZS5hbnQuY29yZSZxdW90OyB0eXBlPSZxdW90OzQmcXVvdDsvJmd0OyYjMTA7Jmx0Oy9sYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ1NldCZndDsmIzEwO30iLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfTE9DQVRJT04iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2M6L29yZy5lY2xpcHNlLmFudC5jb3JlL2J1aWxkZmlsZXMvYnVpbGRFeHRyYUpBUi54bWx9Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkFUVFJfUlVOX0lOX0JBQ0tHUk9VTkQiIHZhbHVlPSJmYWxzZSIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlLy5wcm9qZWN0IGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzdkMWM1Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmFudC5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkV4dGVybmFsVG9vbEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5PkxhdW5jaENvbmZpZ0hhbmRsZTwva2V5PgotCQkJCQk8dmFsdWU+Jmx0O3Byb2plY3QmZ3Q7Ly5leHRlcm5hbFRvb2xCdWlsZGVycy9CdWlsZCBBbnQgU3VwcG9ydCBKQVIubGF1bmNoPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ5MGVjZi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVGh1IE1heSAyNyAxNDo0Nzo1MCBQRFQgMjAwNA0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotc2VsZmhvc3RpbmcuYmluRXhjbHVkZXM9L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnRfYmluDQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2Fib3V0Lmh0bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNjMGEyNi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5PY3RvYmVyIDgsIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTxoMz5UaGlyZCBQYXJ0eSBDb250ZW50PC9oMz4KLQotPHA+VGhlIENvbnRlbnQgaW5jbHVkZXMgaXRlbXMgdGhhdCBoYXZlIGJlZW4gc291cmNlZCBmcm9tIHRoaXJkIHBhcnRpZXMgYXMgc2V0IG91dCBiZWxvdy4gSWYgeW91IAotZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBmb2xsb3dpbmcgaXMgcHJvdmlkZWQgCi1mb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIHRvIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSBmb3IgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UuPC9wPgotCi08aDQ+QW50IDEuNy4xPC9oND4KLQotPHA+VGhlIGZvbGxvd2luZyBjbGFzc2VzIGluIHRoZSBwbHVnLWluIEpBUiBhcmUgYmFzZWQgb24gQW50IGNvZGUgIGRldmVsb3BlZCBieSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHNoYWxsIGJlIGRlZmluZWQgYXMgdGhlICZxdW90O0FudC1EZXJpdmVkIFdvcmsmcXVvdDs6PC9wPgotCi08dWw+Ci0JPGxpPm9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLmFudC5JbnRlcm5hbEFudFJ1bm5lcjwvbGk+Ci0JPGxpPm9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLmFudC5JbnRlcm5hbFByb2plY3Q8L2xpPgotPC91bD4KLQotPHA+VGhlIGJpbmFyeSBjb2RlIGZvciB0aGUgQW50LURlcml2ZWQgV29yayBpcyBsb2NhdGVkIGluIGxpYi9hbnRzdXBwb3J0bGliLmphciBhbmQgdGhlIHNvdXJjZSBjb2RlIGlzIGxvY2F0ZWQgaW4gbGliL2FudHN1cHBvcnRsaWJzcmMuemlwLjwvcD4KLQotPHA+WW91ciB1c2Ugb2YgdGhlIEFudC1EZXJpdmVkIFdvcmsgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMC4gIEEgY29weSBvZiB0aGUgbGljZW5zZSBpcyBjb250YWluZWQKLWluIHRoZSBmaWxlIDxhIGhyZWY9ImFib3V0X2ZpbGVzL2FzbC12MjAudHh0IiB0YXJnZXQ9Il9ibGFuayI+YWJvdXRfZmlsZXMvYXNsLXYyMC50eHQ8L2E+IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sPC9hPi4KLQotPHA+VGhlIG5hbWVzICZxdW90O0FudCZxdW90OyBhbmQgICZxdW90O0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uJnF1b3Q7IG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIAotc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uICBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCA8YSBocmVmPSJtYWlsdG86YXBhY2hlQGFwYWNoZS5vcmciPmFwYWNoZUBhcGFjaGUub3JnPC9hPi48L3A+Ci0KLTxwPlRoZSBBcGFjaGUgYXR0cmlidXRpb24gPGEgaHJlZj0iYWJvdXRfZmlsZXMvTk9USUNFIiB0YXJnZXQ9Il9ibGFuayI+Tk9USUNFPC9hPiBmaWxlIGlzIGluY2x1ZGVkIHdpdGggdGhlIENvbnRlbnQgaW4gYWNjb3JkYW5jZSB3aXRoIDRkIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2Fib3V0X2ZpbGVzL05PVElDRSBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9hYm91dF9maWxlcy9OT1RJQ0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYjZkZGUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2Fib3V0X2ZpbGVzL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgID09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzZWN0aW9uIDQgZCBvZiAgICAgICAgICAgICAgICAgICAgPT0KLSAgID09ICB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0KLSAgID09ICBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgQW50IGRpc3RyaWJ1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgPT0KLSAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieQotICAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGFsc28gc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IDoKLSAgICAgLSB0aGUgVzNDIGNvbnNvcnRpdW0gKGh0dHA6Ly93d3cudzNjLm9yZykgLAotICAgICAtIHRoZSBTQVggcHJvamVjdCAoaHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZykKLQotICAgUGxlYXNlIHJlYWQgdGhlIGRpZmZlcmVudCBMSUNFTlNFIGZpbGVzIHByZXNlbnQgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mCi0gICB0aGlzIGRpc3RyaWJ1dGlvbi4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9hYm91dF9maWxlcy9hc2wtdjIwLnR4dCBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9hYm91dF9maWxlcy9hc2wtdjIwLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvYWJvdXRfZmlsZXMvYXNsLXYyMC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZjNiMDguLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPXNyYy8KLXNvdXJjZS5saWIvYW50c3VwcG9ydGxpYi5qYXI9c3JjX2FudC8KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLyxcCi0gICAgICAgICAgICAgICBhYm91dF9maWxlcy8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGxpYi8qLmphcixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXRfZmlsZXMvCi1qYXJzLmNvbXBpbGUub3JkZXI9LixsaWIvYW50c3VwcG9ydGxpYi5qYXIKLWphcnMuZXh0cmEuY2xhc3NwYXRoPXBsYXRmb3JtOi9wbHVnaW4vb3JnLmFwYWNoZS5hbnQvbGliL2FudC5qYXIscGxhdGZvcm06L3BsdWdpbi9vcmcuYXBhY2hlLmFudC9saWIvYW50LWxhdW5jaGVyLmphcgotamF2YWRvYy5wYWNrYWdlcz1vcmcuZWNsaXBzZS4qClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2J1aWxkZmlsZXMvZXhwb3J0cGx1Z2luLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9idWlsZGZpbGVzL2V4cG9ydHBsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZGY1YzMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL2J1aWxkZmlsZXMvZXhwb3J0cGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTwhLS0gRXhwb3J0IGEgamFyIG9mIC5jbGFzcyBmaWxlcyBmb3IgdGhlIG9yZy5lY2xpcHNlLmFudC5jb3JlIEVjbGlwc2UgcGx1Zy1pbgotICAgICBhbG9uZyB3aXRoIG90aGVyIGltcG9ydGFudCBwbHVnaW4gZmlsZXMgdG8gdGhlICJwbHVnaW4tZXhwb3J0IiBzdWJkaXJlY3RvcnkKLSAgICAgb2YgdGhlIHRhcmdldCBFY2xpcHNlIGluc3RhbGxhdGlvbiAtLT4KLTxwcm9qZWN0IG5hbWU9IkV4cG9ydCBhbnQuY29yZSIgZGVmYXVsdD0iZXhwb3J0IiBiYXNlZGlyPSIuLiI+Ci0KLQk8IS0tIFNldCB0aGUgdGltZXN0YW1wIGFuZCBpbXBvcnRhbnQgcHJvcGVydGllcyAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8dHN0YW1wLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3RkaXIiIHZhbHVlPSIuLi8uLi9wbHVnaW4tZXhwb3J0IiAvPgotCQk8cHJvcGVydHkgbmFtZT0iZGVzdCIgIHZhbHVlPSIke2Rlc3RkaXJ9L29yZy5lY2xpcHNlLmFudC5jb3JlXzMuMC4wIiAvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBDcmVhdGUgdGhlIGphciBvZiAuY2xhc3MgZmlsZXMsIGFuZCBjb3B5IG90aGVyIGltcG9ydGFudCBmaWxlcyB0byBleHBvcnQgZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0iZXhwb3J0IiBkZXBlbmRzPSJpbml0Ij4KLQkJPG1rZGlyIGRpcj0iJHtkZXN0ZGlyfSIgLz4KLQkJPGRlbGV0ZSBkaXI9IiR7ZGVzdH0iIC8+Ci0JCTxta2RpciBkaXI9IiR7ZGVzdH0iIC8+Ci0JCTxkZWxldGUgZGlyPSIke2Rlc3R9L2xpYiIvPgotCQk8bWtkaXIgZGlyPSIke2Rlc3R9L2xpYiIvPgotCQk8amFyIGRlc3RmaWxlPSIke2Rlc3R9L2FudHN1cHBvcnQuamFyIj4KLQkJCTxmaWxlc2V0IGRpcj0iYmluIj4KLQkJCQk8ZXhjbHVkZSBuYW1lPSJvcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvKiIvPgotCQkJPC9maWxlc2V0PgotCQk8L2phcj4KLQkJPCEtLSBDcmVhdGUgdGhlIHNvdXJjZSB6aXAgLS0+Ci0JCTx6aXAgZGVzdGZpbGU9IiR7ZGVzdH0vYW50c3VwcG9ydHNyYy56aXAiPgotCQkJPGZpbGVzZXQgZGlyPSJzcmMiLz4KLQkJPC96aXA+Ci0JCTxjb3B5IGZpbGU9InBsdWdpbi54bWwiIHRvZGlyPSIke2Rlc3R9Ii8+Ci0JCTxjb3B5IGZpbGU9InBsdWdpbi5wcm9wZXJ0aWVzIiB0b2Rpcj0iJHtkZXN0fSIvPgotCQk8Y29weSBmaWxlPSIuY2xhc3NwYXRoIiB0b2Rpcj0iJHtkZXN0fSIvPgotCQk8Y29weSBmaWxlPSIub3B0aW9ucyIgdG9kaXI9IiR7ZGVzdH0iLz4KLQkJPGFudCBhbnRmaWxlPSJidWlsZGZpbGVzL2J1aWxkRXh0cmFKQVIueG1sIiB0YXJnZXQ9ImJ1aWxkIi8+Ci0JCTxjb3B5IGZpbGU9ImxpYi9hbnRzdXBwb3J0bGliLmphciIgdG9kaXI9IiR7ZGVzdH0vbGliIi8+Ci0JPC90YXJnZXQ+Ci0JCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkM2Q1MjYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IEFudCBCdWlsZCBUb29sIENvcmUKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1jbGFzc3BhdGhOYW1lID0gRXh0cmEgQW50IENsYXNzcGF0aCBFbnRyeSBEZWZpbml0aW9ucwotdGFza3NOYW1lID0gQW50IFRhc2sgRGVmaW5pdGlvbnMKLXR5cGVzTmFtZSA9IEFudCBUeXBlIERlZmluaXRpb25zCi1wcm9wZXJ0aWVzTmFtZSA9IEFudCBQcm9wZXJ0aWVzIERlZmluaXRpb25zCi0KLWFudEJ1aWxkRmlsZUNvbnRlbnRUeXBlLm5hbWU9IEFudCBCdWlsZGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zY2hlbWEvYW50UHJvcGVydGllcy5leHNkIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NjaGVtYS9hbnRQcm9wZXJ0aWVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYTgxMmQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NjaGVtYS9hbnRQcm9wZXJ0aWVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5hbnQuY29yZSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuYW50LmNvcmUiIGlkPSJhbnRQcm9wZXJ0aWVzIiBuYW1lPSJBbnQgUHJvcGVydGllcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBBbGxvd3MgcGx1Zy1pbnMgdG8gZGVmaW5lIEFudCBwcm9wZXJ0aWVzIGZvciB1c2UgaW4gQW50IGJ1aWxkIGZpbGVzLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYW50UHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImFudFByb3BlcnR5Ij4NCi0gICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJuYW1lIi8+DQotICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4gSWYgYSB2YWx1ZSBpcyBwcm92aWRlZCBoZXJlLCB0aGUgJnF1b3Q7Y2xhc3MmcXVvdDsgYXR0cmlidXRlIGlzIGlnbm9yZWQuDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIElmIHRoZXJlIGlzIG5vICZhcG9zO3ZhbHVlJmFwb3M7IGF0dHJpYnV0ZSBwcm92aWRlZCwgdGhpcyBjbGFzcyBpcyBjYWxsZWQgdG8gcmV0dXJuIHRoZSBkeW5hbWljIHZhbHVlIGZvciB0aGUgQW50IHByb3BlcnR5LiAgSWYgJmx0O2NvZGUmZ3Q7bnVsbCZsdDsvY29kZSZndDsgaXMgcmV0dXJuZWQsIHRoZSB2YWx1ZSBpcyBub3Qgc2V0Lg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuYW50LmNvcmUuSUFudFByb3BlcnR5VmFsdWVQcm92aWRlciIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJoZWFkbGVzcyIgdHlwZT0iYm9vbGVhbiI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBwcm9wZXJ0eSBpcyBzdWl0YWJsZSBmb3IgdXNlIGluIGEgJnF1b3Q7aGVhZGxlc3MmcXVvdDsgQW50IGVudmlyb25tZW50LiBJZiBydW5uaW5nIGhlYWRsZXNzIGFuZCB0aGUgYXR0cmlidXRlIGlzICZxdW90O2ZhbHNlJnF1b3Q7LCB0aGUgcHJvcGVydHkgd2lsbCBub3QgYmUgc2V0IGFuZCBhbnkgc3BlY2lmaWVkICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmFudC5jb3JlLklBbnRQcm9wZXJ0eVZhbHVlUHJvdmlkZXImbHQ7L2NvZGUmZ3Q7IHdpbGwgbm90IGJlIGluc3RhbnRpYXRlZC4gVGhlIGltcGxpZWQgdmFsdWUgaXMgJmx0O2NvZGUmZ3Q7dHJ1ZSZsdDsvY29kZSZndDssIHdoZW4gbm90IHNwZWNpZmllZC4NCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZWNsaXBzZVJ1bnRpbWUiIHR5cGU9ImJvb2xlYW4iPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgcHJvcGVydHkgc2hvdWxkIG9ubHkgYmUgY29uc2lkZXJlZCB3aGVuIHJ1biBpbiB0aGUgc2FtZSBWTSBhcyBFY2xpcHNlLiBUaGUgaW1wbGllZCB2YWx1ZSBpcyAmbHQ7Y29kZSZndDt0cnVlJmx0Oy9jb2RlJmd0Oywgd2hlbiBub3Qgc3BlY2lmaWVkLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAzLjANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIEFudCBwcm9wZXJ0aWVzIGV4dGVuc2lvbiBwb2ludDogDQotJmx0O3AmZ3Q7DQotJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmFudC5jb3JlLmFudFByb3BlcnRpZXMmcXVvdDsmZ3Q7DQotICAgICAgJmx0O2FudFByb3BlcnR5IG5hbWU9JnF1b3Q7ZWNsaXBzZS5ob21lJnF1b3Q7DQotICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwuY29yZS5BbnRQcm9wZXJ0eVZhbHVlUHJvdmlkZXImcXVvdDsvJmd0Ow0KLSAgICAgICZsdDthbnRQcm9wZXJ0eSBuYW1lPSZxdW90O2VjbGlwc2UucnVubmluZyZxdW90Ow0KLSAgICAgICAgICAgdmFsdWU9JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7DQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7IA0KLSZsdDsvcHJlJmd0Ow0KLSZsdDsvcCZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgY2xhc3MgbmFtZWQgaW4gdGhlICZsdDtzYW1wJmd0O2NsYXNzJmx0Oy9zYW1wJmd0OyBwcm9wZXJ0eSBtdXN0IGltcGxlbWVudCB0aGUgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuYW50LmNvcmUuSUFudFByb3BlcnR5VmFsdWVQcm92aWRlciZsdDsvc2FtcCZndDsgaW50ZXJmYWNlLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgcGxhdGZvcm0gdXNlcyB0aGlzIG1lY2hhbmlzbSB0byBzZXQgdGhlIEFudCBwcm9wZXJ0eSBlY2xpcHNlLmhvbWUgdG8gdGhlIEVjbGlwc2UgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBhbmQgdG8gc2V0IHRoZSBlY2xpcHNlLnJ1bm5pbmcgcHJvcGVydHkuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIA0KLWFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IA0KLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc2NoZW1hL2FudFR5cGVzLmV4c2QgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc2NoZW1hL2FudFR5cGVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNmQzMWQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NjaGVtYS9hbnRUeXBlcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmFudC5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5hbnQuY29yZSIgaWQ9ImFudFR5cGVzIiBuYW1lPSJBbnQgVHlwZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQWxsb3dzIHBsdWctaW5zIHRvIGRlZmluZSBhcmJpdHJhcnkgQW50IGRhdGF0eXBlcyBmb3IgCi11c2UgYnkgdGhlIEFudCBpbmZyYXN0cnVjdHVyZS4gIFRoZSBzdGFuZGFyZCBBbnQgCi1pbmZyYXN0cnVjdHVyZSBhbGxvd3MgZm9yIHRoZSBhZGRpdGlvbiBvZiBhcmJpdHJhcnkgCi1kYXRhdHlwZXMuICBVbmZvcnR1bmF0ZWx5LCBpdCBpcyB1bmxpa2VseSB0aGF0IHRoZSAKLUFudCBDb3JlIHBsdWctaW4gd291bGQgaGF2ZSB0aGUgY2xhc3NlcyByZXF1aXJlZCAKLWJ5IHRoZXNlIGRhdGF0eXBlcyBvbiBpdHMgY2xhc3NwYXRoIChvciB0aGF0IG9mIGFueSAKLW9mIGl0cyBwcmVyZXF1aXNpdGVzKS4gIFRvIGFkZHJlc3MgdGhpcywgY2xpZW50cyAKLXNob3VsZCBkZWZpbmUgYW4gZXh0ZW5zaW9uIHdoaWNoIHBsdWdzIGludG8gdGhpcyAKLWV4dGVuc2lvbi1wb2ludCBhbmQgbWFwcyBhIGRhdGF0eXBlIG5hbWUgb250byBhIGNsYXNzLiAgCi1UaGUgQW50IHBsdWctaW4gY2FuIHRoZW4gcmVxdWVzdCB0aGF0IHRoZSBkZWNsYXJpbmcgCi1wbHVnLWluIGxvYWQgdGhlIHNwZWNpZmllZCBjbGFzcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYW50VHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImFudFR5cGUiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgbGFiZWxBdHRyaWJ1dGU9Im5hbWUiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBuYW1lIG9mIHRoZSB0eXBlIHRvIGJlIGRlZmluZWQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXJpIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICBUaGUgdXJpIHRoYXQgdGhpcyBkZWZpbml0aW9uIHNob3VsZCBsaXZlIGluLiBPbmx5IHVzZWQgaWYgdXNpbmcgQW50IG5ld2VyIHRoYW4gMS42LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIEphdmEgY2xhc3MgaW1wbGVtZW50aW5nIAotdGhlIGRhdGF0eXBlLiAgR2VuZXJhbGx5IHRoaXMgY2xhc3MgbXVzdCBiZSBhIHN1YmNsYXNzIG9mCi0mbHQ7Y29kZSZndDtvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EYXRhVHlwZSZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EYXRhVHlwZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxpYnJhcnkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluIGluc3RhbGwgbG9jYXRpb24gZm9yIHRoZSBsaWJyYXJ5IGNvbnRhaW5pbmcgdGhlIHR5cGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJyZXNvdXJjZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImhlYWRsZXNzIiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIHR5cGUgaXMgc3VpdGFibGUgZm9yIHVzZSBpbiBhICZxdW90O2hlYWRsZXNzJnF1b3Q7IEFudCBlbnZpcm9ubWVudC4gSWYgcnVubmluZyBoZWFkbGVzcyBhbmQgdGhlIGF0dHJpYnV0ZSBpcyAmbHQ7Y29kZSZndDtmYWxzZSZsdDsvY29kZSZndDssIHRoZSB0eXBlIHdpbGwgbm90IGJlIGxvYWRlZCBvciBkZWZpbmVkLiBBcyB3ZWxsLCB0aGUgcGx1Z2luIGNsYXNzIGxvYWRlciB3aWxsIG5vdCBiZSBhZGRlZCBhcyBhIHBhcmVudCBjbGFzc2xvYWRlciB0byB0aGUgQW50IGNsYXNzbG9hZGVyLiBUaGUgaW1wbGllZCB2YWx1ZSBpcyAmbHQ7Y29kZSZndDt0cnVlJmx0Oy9jb2RlJmd0Oywgd2hlbiBub3Qgc3BlY2lmaWVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImVjbGlwc2VSdW50aW1lIiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIHR5cGUgcmVxdWlyZXMgYW4gRWNsaXBzZSBydW50aW1lIChpLmUuIG11c3QgYmUgcnVuIGluIHRoZSBzYW1lIFZNIGFzIEVjbGlwc2UpLiBUaGUgaW1wbGllZCB2YWx1ZSBpcyAmbHQ7Y29kZSZndDt0cnVlJmx0Oy9jb2RlJmd0Oywgd2hlbiBub3Qgc3BlY2lmaWVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gQW50IHR5cGVzIGV4dGVuc2lvbiBwb2ludDogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmFudC5jb3JlLmFudFR5cGVzJnF1b3Q7Jmd0OwotICAgICAgJmx0O2FudFR5cGUgbmFtZT0mcXVvdDtjb29sVHlwZSZxdW90OyBjbGFzcz0mcXVvdDtjb20uZXhhbXBsZS5Db29sVHlwZSZxdW90OyBsaWJyYXJ5PSZxdW90O2xpYi9hbnRTdXBwb3J0LmphciZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsgCi0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zY2hlbWEvZXh0cmFDbGFzc3BhdGhFbnRyaWVzLmV4c2QgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc2NoZW1hL2V4dHJhQ2xhc3NwYXRoRW50cmllcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTU3OTc3Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zY2hlbWEvZXh0cmFDbGFzc3BhdGhFbnRyaWVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuYW50LmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmFudC5jb3JlIiBpZD0iZXh0cmFDbGFzc3BhdGhFbnRyaWVzIiBuYW1lPSJFeHRyYSBBbnQgQ2xhc3NwYXRoIEVudHJpZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQWxsb3dzIHBsdWctaW5zIHRvIGRlZmluZSBhcmJpdHJhcnkgSkFScyBmb3IgdXNlIGJ5IHRoZSBBbnQgaW5mcmFzdHJ1Y3R1cmUuCi1UaGVzZSBKQVJzIGFyZSBwdXQgaW50byB0aGUgQW50IGNsYXNzcGF0aCBhdCBydW50aW1lLiAgQmVzaWRlcwotdGhlIEpBUiwgdGhlIHBsdWctaW4gY2xhc3Nsb2FkZXIgb2YgdGhlIHBsdWctaW4gcHJvdmlkaW5nIHRoZQotSkFSIGlzIGFsc28gYWRkZWQgdG8gdGhlIGNsYXNzcGF0aC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZXh0cmFDbGFzc3BhdGhFbnRyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dHJhQ2xhc3NwYXRoRW50cnkiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsaWJyYXJ5IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgcGx1Zy1pbiBpbnN0YWxsIGxvY2F0aW9uIGZvciB0aGUgbGlicmFyeS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaGVhZGxlc3MiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgZXh0cmEgY2xhc3NwYXRoIGVudHJ5IGlzIHN1aXRhYmxlIGZvciB1c2UgaW4gYSAmcXVvdDtoZWFkbGVzcyZxdW90OyBBbnQgZW52aXJvbm1lbnQuIElmIHJ1bm5pbmcgaGVhZGxlc3MgYW5kIHRoZSBhdHRyaWJ1dGUgaXMgJmx0O2NvZGUmZ3Q7ZmFsc2UmbHQ7L2NvZGUmZ3Q7LCB0aGlzIGVudHJ5IHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBBbnQgY2xhc3NwYXRoLiBBcyB3ZWxsLCB0aGUgcGx1Z2luIGNsYXNzIGxvYWRlciB3aWxsIG5vdCBiZSBhZGRlZCBhcyBhIHBhcmVudCBjbGFzc2xvYWRlciB0byB0aGUgQW50IGNsYXNzbG9hZGVyLiBUaGUgaW1wbGllZCB2YWx1ZSBpcyAmbHQ7Y29kZSZndDt0cnVlJmx0Oy9jb2RlJmd0Oywgd2hlbiBub3Qgc3BlY2lmaWVkLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImVjbGlwc2VSdW50aW1lIiB0eXBlPSJib29sZWFuIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGV4dHJhIGNsYXNzcGF0aCBlbnRyeSBzaG91bGQgb25seSBiZSBjb25zaWRlcmVkIGZvciBidWlsZHMgcnVuIGluIHRoZSBzYW1lIFZNIGFzIEVjbGlwc2UuIFRoZSBpbXBsaWVkIHZhbHVlIGlzIHRydWUsIHdoZW4gbm90IHNwZWNpZmllZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIGV4dHJhIGNsYXNzcGF0aCBlbnRyaWVzIGV4dGVuc2lvbiBwb2ludDoKLQotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuYW50LmNvcmUuZXh0cmFDbGFzc3BhdGhFbnRyaWVzJnF1b3Q7Jmd0OwotICAmbHQ7ZXh0cmFDbGFzc3BhdGhFbnRyeSBsaWJyYXJ5PSZxdW90O215RXh0cmFMaWJyYXJ5LmphciZxdW90Oy8mZ3Q7Ci0gJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIHBsYXRmb3JtIGl0c2VsZiBzdXBwbGllcyBhbiBBbnQgc3VwcG9ydCBqYXIgKGFudHN1cHBvcnRsaWIuamFyKS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi1hY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvY29yZS9BbnRDb3JlUGx1Z2luLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9jb3JlL0FudENvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YyNjM3Ni4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9jb3JlL0FudENvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmNvcmU7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLkFudENsYXNzTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLkFudENvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBwbHVnLWluIHJ1bnRpbWUgY2xhc3MgZm9yIHRoZSBBbnQgQ29yZSBwbHVnLWluLgotICogQ2xpZW50cyBtYXkgbm90IGluc3RhbnRpYXRlIG9yIHN1YmNsYXNzIHRoaXMgY2xhc3MuCi0gKiBAbm9pbnN0YW50aWF0ZSBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgYnkgY2xpZW50cy4KLSAqIEBub2V4dGVuZCBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8qKgotCSAqIFN0YXR1cyBjb2RlIGluZGljYXRpbmcgYW4gdW5leHBlY3RlZCBpbnRlcm5hbCBlcnJvci4KLQkgKiBAc2luY2UgMi4xCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJOQUxfRVJST1IgPSAxMjA7CQkKLQkKLQkvKioKLQkgKiBUaGUgc2luZ2xlIGluc3RhbmNlIG9mIHRoaXMgcGx1Zy1pbiBydW50aW1lIGNsYXNzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEFudENvcmVQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogVGhlIHByZWZlcmVuY2VzIGNsYXNzIGZvciB0aGlzIHBsdWctaW4uCi0JICovCi0JcHJpdmF0ZSBBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXM7Ci0JCi0JLyoqCi0JICogVW5pcXVlIGlkZW50aWZpZXIgY29uc3RhbnQgKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS5hbnQuY29yZSI8L2NvZGU+KQotCSAqIGZvciB0aGUgQW50IENvcmUgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9BTlRDT1JFID0gIm9yZy5lY2xpcHNlLmFudC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2ltcGxlIGlkZW50aWZpZXIgY29uc3RhbnQgKHZhbHVlIDxjb2RlPiJhbnRUYXNrcyI8L2NvZGU+KQotCSAqIGZvciB0aGUgQW50IHRhc2tzIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVF9UQVNLUyA9ICJhbnRUYXNrcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNpbXBsZSBpZGVudGlmaWVyIGNvbnN0YW50ICh2YWx1ZSA8Y29kZT4iZXh0cmFDbGFzc3BhdGhFbnRyaWVzIjwvY29kZT4pCi0JICogZm9yIHRoZSBleHRyYSBjbGFzc3BhdGggZW50cmllcyBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFRfRVhUUkFfQ0xBU1NQQVRIID0gImV4dHJhQ2xhc3NwYXRoRW50cmllcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNpbXBsZSBpZGVudGlmaWVyIGNvbnN0YW50ICh2YWx1ZSA8Y29kZT4iYW50VHlwZXMiPC9jb2RlPikKLQkgKiBmb3IgdGhlIEFudCB0eXBlcyBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFRfVFlQRVMgPSAiYW50VHlwZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogU2ltcGxlIGlkZW50aWZpZXIgY29uc3RhbnQgKHZhbHVlIDxjb2RlPiJhbnRQcm9wZXJ0aWVzIjwvY29kZT4pCi0JICogZm9yIHRoZSBBbnQgcHJvcGVydGllcyBleHRlbnNpb24gcG9pbnQuCi0JICogCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBUX1BST1BFUlRJRVMgPSAiYW50UHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBTaW1wbGUgaWRlbnRpZmllciBjb25zdGFudCAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmFudC5jb3JlLmFudEJ1aWxkRmlsZSI8L2NvZGU+KQotCSAqIGZvciB0aGUgY29udGVudCB0eXBlIG9mIGFuIEFudCBCdWlsZEZpbGUKLQkgKiAKLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UX0JVSUxERklMRV9DT05URU5UX1RZUEUgPSBQSV9BTlRDT1JFICsgIi5hbnRCdWlsZEZpbGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTaW1wbGUgaWRlbnRpZmllciBjb25zdGFudCAodmFsdWUgPGNvZGU+ImNsYXNzIjwvY29kZT4pCi0JICogb2YgYSB0YWcgdGhhdCBhcHBlYXJzIGluIEFudCBleHRlbnNpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2ltcGxlIGlkZW50aWZpZXIgY29uc3RhbnQgKHZhbHVlIDxjb2RlPiJuYW1lIjwvY29kZT4pCi0JICogb2YgYSB0YWcgdGhhdCBhcHBlYXJzIGluIEFudCBleHRlbnNpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNpbXBsZSBpZGVudGlmaWVyIGNvbnN0YW50ICh2YWx1ZSA8Y29kZT4ibGlicmFyeSI8L2NvZGU+KQotCSAqIG9mIGEgdGFnIHRoYXQgYXBwZWFycyBpbiBBbnQgZXh0ZW5zaW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJSQVJZID0gImxpYnJhcnkiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogU2ltcGxlIGlkZW50aWZpZXIgY29uc3RhbnQgKHZhbHVlIDxjb2RlPiJoZWFkbGVzcyI8L2NvZGU+KSBvZiBhIHRhZwotCSAqIHRoYXQgYXBwZWFycyBpbiBBbnQgZXh0ZW5zaW9ucy4KLQkgKiBAc2luY2UgMi4xCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBRExFU1MgPSAiaGVhZGxlc3MiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogU2ltcGxlIGlkZW50aWZpZXIgY29uc3RhbnQgKHZhbHVlIDxjb2RlPiJlY2xpcHNlUnVudGltZSI8L2NvZGU+KSBvZiBhIHRhZwotCSAqIHRoYXQgYXBwZWFycyBpbiBBbnQgZXh0ZW5zaW9ucy4KLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRV9SVU5USU1FID0gImVjbGlwc2VSdW50aW1lIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFNpbXBsZSBpZGVudGlmaWVyIGNvbnN0YW50ICh2YWx1ZSA8Y29kZT4idXJpIjwvY29kZT4pIG9mIGEgdGFnCi0JICogdGhhdCBhcHBlYXJzIGluIEFudCBleHRlbnNpb25zLgotCSAqIEBzaW5jZSAzLjIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkkgPSAidXJpIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFNpbXBsZSBpZGVudGlmaWVyIGNvbnN0YW50ICh2YWx1ZSA8Y29kZT4idmFsdWUiPC9jb2RlPikgb2YgYSB0YWcKLQkgKiB0aGF0IGFwcGVhcnMgaW4gQW50IGV4dGVuc2lvbnMuCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogS2V5IHRvIGFjY2VzcyB0aGUgPGNvZGU+SVByb2dyZXNzTW9uaXRvcjwvY29kZT4gcmVmZXJlbmNlLiBXaGVuIGEKLQkgKiBwcm9ncmVzcyBtb25pdG9yIGlzIHBhc3NlZCB0byB0aGUgPGNvZGU+QW50UnVubmVyLnJ1bihJUHJvZ3Jlc3NNb25pdG9yKTwvY29kZT4KLQkgKiBtZXRob2QsIHRoZSBvYmplY3QgaXMgYXZhaWxhYmxlIGFzIGEgcmVmZXJlbmNlIGZvciB0aGUgY3VycmVudAotCSAqIEFudCBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VfUFJPR1JFU1NfTU9OSVRPUiA9ICJlY2xpcHNlLnByb2dyZXNzLm1vbml0b3IiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogU3RhdHVzIGNvZGUgaW5kaWNhdGluZyBhbiBlcnJvciBvY2N1cnJlZCBydW5uaW5nIGEgYnVpbGQuCi0JICogQHNpbmNlIDIuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1JVTk5JTkdfQlVJTEQgPSAxOwotCQotCS8qKgotCSAqIFN0YXR1cyBjb2RlIGluZGljYXRpbmcgYW4gZXJyb3Igb2NjdXJyZWQgZHVlIHRvIGEgbWFsZm9ybWVkIFVSTC4KLQkgKiBAc2luY2UgMi4xCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfTUFMRk9STUVEX1VSTCA9IDI7Ci0JCi0JLyoqCi0JICogU3RhdHVzIGNvZGUgaW5kaWNhdGluZyBhbiBlcnJvciBvY2N1cnJlZCBhcyBhIGxpYnJhcnkgd2FzIG5vdCBzcGVjaWZpZWQKLQkgKiBAc2luY2UgMi4xCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfTElCUkFSWV9OT1RfU1BFQ0lGSUVEID0gMzsKLQotCS8qKiAKLQkgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIHRoaXMgcGx1Zy1pbiBydW50aW1lIGNsYXNzLgotCSAqIDxwPgotCSAqIEFuIGluc3RhbmNlIG9mIHRoaXMgcGx1Zy1pbiBydW50aW1lIGNsYXNzIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCAKLQkgKiB3aGVuIHRoZSBmYWNpbGl0aWVzIHByb3ZpZGVkIGJ5IHRoZSBBbnQgQ29yZSBwbHVnLWluIGFyZSByZXF1aXJlZC4KLQkgKiA8Yj5DbGllbnRzIG11c3QgbmV2ZXIgZXhwbGljaXRseSBpbnN0YW50aWF0ZSBhIHBsdWctaW4gcnVudGltZSBjbGFzcy48L2I+Ci0JICogPC9wPgotCSAqIEBzaW5jZSAzLjEKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQW50Q29yZVBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLSAgICAgICAgQW50Q29yZVV0aWwuc2V0QnVuZGxlQ29udGV4dChudWxsKTsKLQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCXNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQl9Ci0JfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICBBbnRDb3JlVXRpbC5zZXRCdW5kbGVDb250ZXh0KGNvbnRleHQpOwotICAgIH0KLQotCS8qKgotCSAqIEdpdmVuIGFuIGV4dGVuc2lvbiBwb2ludCBuYW1lLCBleHRyYWN0IGl0cyBleHRlbnNpb25zIGFuZCByZXR1cm4gdGhlbQotCSAqIGFzIGEgTGlzdC4KLQkgKiBAcGFyYW0gcG9pbnROYW1lIFRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24gcG9pbnQKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIHRoZSBleHRlbnNpb25zCi0JICovCi0JcHJpdmF0ZSBMaXN0IGV4dHJhY3RFeHRlbnNpb25zKFN0cmluZyBwb2ludE5hbWUpIHsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50PSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KEFudENvcmVQbHVnaW4uUElfQU5UQ09SRSwgcG9pbnROYW1lKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QoZXh0ZW5zaW9ucyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgcGx1Zy1pbidzIHByZWZlcmVuY2VzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIEFudCBjb3JlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHByZWZlcmVuY2VzIGZvciB0aGlzIHBsdWctaW4uCi0JICovCi0JcHVibGljIEFudENvcmVQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsKLQkJaWYgKHByZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXByZWZlcmVuY2VzID0gbmV3IEFudENvcmVQcmVmZXJlbmNlcyhleHRyYWN0RXh0ZW5zaW9ucyhQVF9UQVNLUyksIGV4dHJhY3RFeHRlbnNpb25zKFBUX0VYVFJBX0NMQVNTUEFUSCksIGV4dHJhY3RFeHRlbnNpb25zKFBUX1RZUEVTKSwgZXh0cmFjdEV4dGVuc2lvbnMoUFRfUFJPUEVSVElFUyksIGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gcHJlZmVyZW5jZXM7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGlzIHBsdWctaW4ncyBwcmVmZXJlbmNlcyBmb3IgcnVubmluZyBoZWFkbGVzcyBiYXNlZCBvbiB0aGUgCi0JICogaGVhZGxlc3MgcGFyYW1ldGVyLgotCSAqIFRoaXMgbWV0aG9kIGlzIHB1YmxpYyBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LiBJdCBzaG91bGQgbm90Ci0JICogYmUgY2FsbGVkIG91dHNpZGUgb2YgdGhlIEFudCBpbnRlZ3JhdGlvbiBmcmFtZXdvcmsuCi0JICogQHBhcmFtIGhlYWRsZXNzIFdoZXRoZXIgb3Igbm90IHRvIG1hcmsgdGhhdCB0aGUgcGx1Zy1pbiBpcyBydW5uaW5nIGhlYWRsZXNzIG9yIG5vdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJ1bm5pbmdIZWFkbGVzcyhib29sZWFuIGhlYWRsZXNzKSB7Ci0JCXByZWZlcmVuY2VzID0gbmV3IEFudENvcmVQcmVmZXJlbmNlcyhleHRyYWN0RXh0ZW5zaW9ucyhQVF9UQVNLUyksIGV4dHJhY3RFeHRlbnNpb25zKFBUX0VYVFJBX0NMQVNTUEFUSCksIGV4dHJhY3RFeHRlbnNpb25zKFBUX1RZUEVTKSwgZXh0cmFjdEV4dGVuc2lvbnMoUFRfUFJPUEVSVElFUyksIGhlYWRsZXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGlzIHBsdWctaW4gcnVudGltZSBjbGFzcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW50Q29yZVBsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgY2xhc3MgbG9hZGVyIHRvIHVzZSB3aGVuIGV4ZWN1dGluZyBBbnQgYnVpbGRzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5ldyBjbGFzcyBsb2FkZXIKLQkgKi8KLQlwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0TmV3Q2xhc3NMb2FkZXIoKSB7Ci0JICAgIEFudENvcmVQcmVmZXJlbmNlcyBjb3JlUHJlZmVyZW5jZXMgPSBnZXRQcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gZ2V0TmV3Q2xhc3NMb2FkZXIoZmFsc2UsIGNvcmVQcmVmZXJlbmNlcy5nZXRVUkxzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IGNsYXNzIGxvYWRlciB0byB1c2Ugd2hlbiBleGVjdXRpbmcgQW50IGJ1aWxkcy4KLQkgKiBAcGFyYW0gdXJscyB0aGUgVVJMcyB0aGF0IGRlZmluZSB0aGUgY2xhc3NwYXRoIG9mIHRoZSBuZXcgY2xhc3Nsb2FkZXIKLQkgKiBAcmV0dXJuIHRoZSBuZXcgY2xhc3MgbG9hZGVyCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBVUkxDbGFzc0xvYWRlciBnZXROZXdDbGFzc0xvYWRlcihVUkxbXSB1cmxzKSB7Ci0JCXJldHVybiBnZXROZXdDbGFzc0xvYWRlcihmYWxzZSwgdXJscyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgY2xhc3MgbG9hZGVyIHRvIHVzZSB3aGVuIGV4ZWN1dGluZyBBbnQgYnVpbGRzIG9yIAotCSAqIG90aGVyIGFwcGxpY2F0aW9ucyBzdWNoIGFzIHBhcnNpbmcgb3IgY29kZSBwcm9wb3NhbCBkZXRlcm1pbmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBhbGxvd0xvYWRpbmcgd2hldGhlciB0byBhbGxvdyBwbHVnLWluIGNsYXNzbG9hZGVycyBhc3NvY2lhdGVkIAotCSAqIHdpdGggdGhlIG5ldyBjbGFzc2xvYWRlciB0byBsb2FkIEFwYWNoZSBBbnQgY2xhc3NlcyBvciByZXNvdXJjZXMuCi0JICogQHJldHVybiB0aGUgbmV3IGNsYXNzIGxvYWRlcgotCSAqLwotCXB1YmxpYyBDbGFzc0xvYWRlciBnZXROZXdDbGFzc0xvYWRlcihib29sZWFuIGFsbG93TG9hZGluZykgewotCQlBbnRDb3JlUHJlZmVyZW5jZXMgY29yZVByZWZlcmVuY2VzID0gZ2V0UHJlZmVyZW5jZXMoKTsKLQkJVVJMW10gdXJscyA9IGNvcmVQcmVmZXJlbmNlcy5nZXRVUkxzKCk7Ci0JCXJldHVybiBnZXROZXdDbGFzc0xvYWRlcihhbGxvd0xvYWRpbmcsIHVybHMpOwotCX0KLQkJCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBjbGFzcyBsb2FkZXIgdG8gdXNlIHdoZW4gZXhlY3V0aW5nIEFudCBidWlsZHMgb3IgCi0JICogb3RoZXIgYXBwbGljYXRpb25zIHN1Y2ggYXMgcGFyc2luZyBvciBjb2RlIHByb3Bvc2FsIGRldGVybWluYXRpb24uCi0JICogIAotCSAqIEBwYXJhbSBhbGxvd0xvYWRpbmcgd2hldGhlciB0byBhbGxvdyBwbHVnLWluIGNsYXNzbG9hZGVycyBhc3NvY2lhdGVkIAotCSAqIHdpdGggdGhlIG5ldyBjbGFzc2xvYWRlciB0byBsb2FkIEFwYWNoZSBBbnQgY2xhc3NlcyBvciByZXNvdXJjZXMuCi0JICogQHBhcmFtIHVybHMgdGhlIFVSTHMgdGhhdCBkZWZpbmUgdGhlIGNsYXNzcGF0aCBvZiB0aGUgbmV3IGNsYXNzbG9hZGVyCi0JICogQHJldHVybiB0aGUgbmV3IGNsYXNzIGxvYWRlcgotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgVVJMQ2xhc3NMb2FkZXIgZ2V0TmV3Q2xhc3NMb2FkZXIoYm9vbGVhbiBhbGxvd0xvYWRpbmcsIFVSTFtdIHVybHMpIHsKLQkJQW50Q29yZVByZWZlcmVuY2VzIGNvcmVQcmVmZXJlbmNlcyA9IGdldFByZWZlcmVuY2VzKCk7Ci0JCUNsYXNzTG9hZGVyW10gcGx1Z2luTG9hZGVycyA9IGNvcmVQcmVmZXJlbmNlcy5nZXRQbHVnaW5DbGFzc0xvYWRlcnMoKTsKLQkJQW50Q2xhc3NMb2FkZXIgbG9hZGVyPSBuZXcgQW50Q2xhc3NMb2FkZXIodXJscywgcGx1Z2luTG9hZGVycyk7Ci0JCWxvYWRlci5hbGxvd1BsdWdpbkNsYXNzTG9hZGVyc1RvTG9hZEFudChhbGxvd0xvYWRpbmcpOwotCQlyZXR1cm4gbG9hZGVyOwotCX0KLQkKLQkvKioKLQkgKiBMb2dzIHRoZSBzcGVjaWZpZWQgdGhyb3dhYmxlIHdpdGggdGhpcyBwbHVnLWluJ3MgbG9nLgotCSAqIAotCSAqIEBwYXJhbSB0IHRocm93YWJsZSB0byBsb2cgCi0JICogQHNpbmNlIDIuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHQpIHsKLQkJSVN0YXR1cyBzdGF0dXM9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUElfQU5UQ09SRSwgSU5URVJOQUxfRVJST1IsICJFcnJvciBsb2dnZWQgZnJvbSBBbnQgQ29yZTogIiwgdCk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0UGx1Z2luKCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvY29yZS9BbnRTZWN1cml0eUV4Y2VwdGlvbi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvY29yZS9BbnRTZWN1cml0eUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjg2NzQxLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2NvcmUvQW50U2VjdXJpdHlFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmNvcmU7Ci0KLQotLyoqCi0gKiBBIHNlY3VyaXR5IGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biBieSB0aGUgQW50U2VjdXJpdHlNYW5hZ2VyIGlmCi0gKiBhbiBBbnQgdGFzayBpbiBzb21lIHdheSBhdHRlbXB0cyB0byBoYWx0IG9yIGV4aXQgdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lLgotICogCi0gKiBDbGllbnRzIG1heSBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIEBzaW5jZSAyLjEKLSAqIEBub2V4dGVuZCBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRTZWN1cml0eUV4Y2VwdGlvbiBleHRlbmRzIFNlY3VyaXR5RXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9jb3JlL0lBbnRDbGFzc3BhdGhFbnRyeS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvY29yZS9JQW50Q2xhc3NwYXRoRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyMDY2OS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9jb3JlL0lBbnRDbGFzc3BhdGhFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuY29yZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIEFudCBjbGFzc3BhdGggZW50cnkuCi0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBbnRDbGFzc3BhdGhFbnRyeSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYWJlbCBmb3IgdGhpcyBjbGFzc3BhdGggZW50cnkuCi0JICogQHJldHVybiB0aGUgbGFiZWwgZm9yIHRoaXMgZW50cnkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIFVSTCBmb3IgdGhpcyBjbGFzc3BhdGggZW50cnkgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiBpdCBjYW5ub3QgYmUgcmVzb2x2ZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgdXJsIGZvciB0aGlzIGNsYXNzcGF0aCBlbnRyeS4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldEVudHJ5VVJMKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgY2xhc3NwYXRoIGVudHJ5IHJlcXVpcmVzIHRoZSBFY2xpcHNlIHJ1bnRpbWUgdG8gYmUgCi0JICogcmVsZXZhbnQuIERlZmF1bHRzIHZhbHVlIGlzIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgY2xhc3NwYXRoIGVudHJ5IHJlcXVpcmVzIHRoZSBFY2xpcHNlIHJ1bnRpbWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VjbGlwc2VSdW50aW1lUmVxdWlyZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2NvcmUvVGFzay5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvY29yZS9UYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNGVjYTUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvY29yZS9UYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5jb3JlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwuY29yZS5BbnRPYmplY3Q7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBBbnQgdGFzay4KLSAqIENsaWVudHMgbWF5IGluc3RhbnRpYXRlIHRoaXMgY2xhc3M7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkLgotICogQHNpbmNlIDIuMQotICogQG5vZXh0ZW5kIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGNsYXNzIFRhc2sgZXh0ZW5kcyBBbnRPYmplY3QgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdGFzawotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHRhc2sKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhc2tOYW1lKCkgewotCQlyZXR1cm4gZk5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgdGFzawotCSAqIEBwYXJhbSB0YXNrTmFtZSBUaGUgdGFza05hbWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VGFza05hbWUoU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCWZOYW1lPSB0YXNrTmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9jb3JlL1R5cGUuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2NvcmUvVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjllYWNkLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2NvcmUvVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuY29yZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuQW50T2JqZWN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gQW50IHR5cGUuCi0gKiBDbGllbnRzIG1heSBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIEBzaW5jZSAyLjEKLSAqIEBub2V4dGVuZCBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUeXBlIGV4dGVuZHMgQW50T2JqZWN0IHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUgbmFtZQotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBmTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0YXNrTmFtZS4KLQkgKiBAcGFyYW0gdGFza05hbWUgVGhlIHRhc2tOYW1lIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGVOYW1lKFN0cmluZyB0YXNrTmFtZSkgewotCQlmTmFtZSA9IHRhc2tOYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2NvcmUvcGFja2FnZS5odG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvY29yZS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MzEwODkuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvY29yZS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLVByb3ZpZGVzIHN1cHBvcnQgZm9yIHJ1bm5pbmcgdGhlIEFudCBidWlsZCB0b29sIGluIHRoZSBwbGF0Zm9ybS4KLTxoMj4KLVBhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+Ci1UaGlzIHBhY2thZ2UgZGVmaW5lcyBhIG51bWJlciBvZiB0YXNrIGFuZCBkYXRhIHR5cGVzIGFuZCB2YXJpb3VzIGluZnJhc3RydWN0dXJlCi1waWVjZXMgd2hpY2ggbWFrZSBBbnQgaW4gdGhlIHBsYXRmb3JtIGVhc2llciBhbmQgbW9yZSBwb3dlcmZ1bC4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvQWJzdHJhY3RFY2xpcHNlQnVpbGRMb2dnZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvQWJzdHJhY3RFY2xpcHNlQnVpbGRMb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNjMjI5OS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL0Fic3RyYWN0RWNsaXBzZUJ1aWxkTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQbHVnaW47Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVjbGlwc2VCdWlsZExvZ2dlciB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUHJvY2VzcyBpZGVudGlmaWVyIC0gdXNlZCB0byBsaW5rIHRoZSBFY2xpcHNlIEFudCBidWlsZAotICAgICAqIGxvZ2dlcnMgdG8gYSBwcm9jZXNzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVF9QUk9DRVNTX0lEID0gQW50Q29yZVBsdWdpbi5QSV9BTlRDT1JFICsgIi5BTlRfUFJPQ0VTU19JRCI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGZQcm9jZXNzSWQ9IG51bGw7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgY29uZmlndXJlKE1hcCB1c2VyUHJvcGVydGllcykgewotICAgICAgICBmUHJvY2Vzc0lkPSAoU3RyaW5nKSB1c2VyUHJvcGVydGllcy5yZW1vdmUoQU5UX1BST0NFU1NfSUQpOwotICAgIH0gCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9BbnRDbGFzc0xvYWRlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9BbnRDbGFzc0xvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmExZGMyLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvQW50Q2xhc3NMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIFRvbSBUcm9tZXkgKHRyb21leUByZWRoYXQuY29tKSAtIHBhdGNoIGZvciBidWcgNDA5NzIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwuY29yZTsKLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgQW50Q2xhc3NMb2FkZXIgZXh0ZW5kcyBVUkxDbGFzc0xvYWRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UX1BBQ0tBR0VTX1BSRUZJWCA9ICJvcmcuYXBhY2hlLnRvb2xzIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTlRfVVJMX1BSRUZJWCA9ICJvcmcvYXBhY2hlL3Rvb2xzIjsgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gZkFsbG93UGx1Z2luTG9hZGluZyA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIENsYXNzTG9hZGVyW10gZlBsdWdpbkxvYWRlcnM7Ci0KLSAgICBwcml2YXRlIENsYXNzTG9hZGVyIGZDb250ZXh0Q2xhc3Nsb2FkZXIgPSBudWxsOwotICAgIAotICAgIHB1YmxpYyBBbnRDbGFzc0xvYWRlcihVUkxbXSB1cmxzLCBDbGFzc0xvYWRlcltdIHBsdWdpbkxvYWRlcnMpIHsKLSAgICAgICAgc3VwZXIodXJscywgQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKSk7Ci0gICAgICAgIGZQbHVnaW5Mb2FkZXJzID0gcGx1Z2luTG9hZGVyczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIjZmluZENsYXNzKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENsYXNzIGZpbmRDbGFzcyhTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBDbGFzcyByZXN1bHQgPSBudWxsOwotICAgICAgICAvL2NoZWNrIHdoZXRoZXIgdG8gbG9hZCB0aGUgQXBhY2hlIEFudCBjbGFzc2VzIGZyb20gdGhlIHBsdWctaW4gY2xhc3MgbG9hZGVycyAKLSAgICAgICAgLy9vciB0byBvbmx5IGxvYWQgZnJvbSB0aGUgVVJMcyBzcGVjaWZpZWQgZnJvbSB0aGUgQW50IHJ1bnRpbWUgY2xhc3NwYXRoIHByZWZlcmVuY2VzIHNldHRpbmcKLSAgICAgICAgaWYgKGZBbGxvd1BsdWdpbkxvYWRpbmcgfHwgIShuYW1lLnN0YXJ0c1dpdGgoQU5UX1BBQ0tBR0VTX1BSRUZJWCkpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBsb2FkQ2xhc3NQbHVnaW5zKG5hbWUpOwotICAgICAgICB9IAotICAgICAgICAKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc3VwZXIuZmluZENsYXNzKG5hbWUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDbGFzcyBsb2FkQ2xhc3NQbHVnaW5zKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIC8vcmVtb3ZlIHRoaXMgY2xhc3MgbG9hZGVyIGFzIHRoZSBjb250ZXh0IGNsYXNzIGxvYWRlcgotICAgICAgICAvL3doZW4gbG9hZGluZyBjbGFzc2VzIGZyb20gcGx1Zy1pbnMuLi5zZWUgYnVnIDk0NDcxCi0gICAgICAgIENsYXNzTG9hZGVyIG9yaWdpbmFsQ2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgICAgICBpZiAoZkNvbnRleHRDbGFzc2xvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihmQ29udGV4dENsYXNzbG9hZGVyKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChmUGx1Z2luTG9hZGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IChpIDwgZlBsdWdpbkxvYWRlcnMubGVuZ3RoKSAmJiAocmVzdWx0ID09IG51bGwpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZQbHVnaW5Mb2FkZXJzW2ldLmxvYWRDbGFzcyhuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgZXhjZXB0aW9uIG5vdy4gSWYgbmVjZXNzYXJ5IHdlJ2xsIHRocm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaW4gbG9hZENsYXNzKFN0cmluZykKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihvcmlnaW5hbENsYXNzTG9hZGVyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIEBzZWUgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIjZmluZFJlc291cmNlKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIFVSTCBmaW5kUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKLSAgICAJIGlmIChmQWxsb3dQbHVnaW5Mb2FkaW5nIHx8ICEobmFtZS5zdGFydHNXaXRoKEFOVF9VUkxfUFJFRklYKSkpIHsKLSAgICAgICAgICAgICBVUkwgcmVzdWx0ID0gZmluZFJlc291cmNlUGx1Z2lucyhuYW1lKTsKLSAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIAkgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICB9IAotICAgIAkKLSAgICAJcmV0dXJuIHN1cGVyLmZpbmRSZXNvdXJjZShuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBVUkwgZmluZFJlc291cmNlUGx1Z2lucyhTdHJpbmcgbmFtZSkgewotICAgIAkvL3JlbW92ZSB0aGlzIGNsYXNzIGxvYWRlciBhcyB0aGUgY29udGV4dCBjbGFzcyBsb2FkZXIKLSAgICAJLy93aGVuIGxvYWRpbmcgcmVzb3VyY2VzIGZyb20gcGx1Zy1pbnMuLi5zZWUgYnVnIDk0NDcxCi0gICAgCUNsYXNzTG9hZGVyIG9yaWdpbmFsQ2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgIAlpZiAoZkNvbnRleHRDbGFzc2xvYWRlciAhPSBudWxsKSB7Ci0gICAgCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihmQ29udGV4dENsYXNzbG9hZGVyKTsKLSAgICAJfQotICAgIAl0cnkgewotICAgIAkJVVJMIHJlc3VsdCA9IG51bGw7Ci0gICAgCQlpZiAoZlBsdWdpbkxvYWRlcnMgIT0gbnVsbCkgewotICAgIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgZlBsdWdpbkxvYWRlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAJCQkJcmVzdWx0ID0gZlBsdWdpbkxvYWRlcnNbaV0uZ2V0UmVzb3VyY2UobmFtZSk7Ci0gICAgCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgIAkgICAgCQkJcmV0dXJuIHJlc3VsdDsKLSAgICAJICAgIAkJfQotICAgIAkJCX0KLSAgICAJCX0KLSAgICAJfSBmaW5hbGx5IHsKLSAgICAJCVRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKG9yaWdpbmFsQ2xhc3NMb2FkZXIpOwotICAgIAl9Ci0gICAgCXJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIEBzZWUgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIjZmluZFJlc291cmNlcyhqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBmaW5kUmVzb3VyY2VzKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIAlDbGFzc0xvYWRlciBvcmlnaW5hbENsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICAJaWYgKGZDb250ZXh0Q2xhc3Nsb2FkZXIgIT0gbnVsbCkgewotICAgIAkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoZkNvbnRleHRDbGFzc2xvYWRlcik7Ci0gICAgCX0KLSAgICAJTGlzdCBhbGwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCXRyeSB7Ci0gICAgCQlpZiAoZkFsbG93UGx1Z2luTG9hZGluZyB8fCAhKG5hbWUuc3RhcnRzV2l0aChBTlRfVVJMX1BSRUZJWCkgfHwgbmFtZS5zdGFydHNXaXRoKEFOVF9VUkxfUFJFRklYLCAxKSkpIHsKLSAgICAJCQlpZiAoZlBsdWdpbkxvYWRlcnMgIT0gbnVsbCkgewotICAgIAkJCQlFbnVtZXJhdGlvbiByZXN1bHQgPSBudWxsOwotICAgIAkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZQbHVnaW5Mb2FkZXJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgCQkJCQlyZXN1bHQgPSBmUGx1Z2luTG9hZGVyc1tpXS5nZXRSZXNvdXJjZXMobmFtZSk7Ci0gICAgCQkJCQl3aGlsZSAocmVzdWx0Lmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgCQkJCQkJYWxsLmFkZChyZXN1bHQubmV4dEVsZW1lbnQoKSk7Ci0gICAgCQkJCQl9Ci0gICAgCQkJCX0KLSAgICAJCQl9Ci0gICAgCQl9Ci0KLSAgICAJCUVudW1lcmF0aW9uIHN1cGVyUmVzb3VyY2VzID0gc3VwZXIuZmluZFJlc291cmNlcyhuYW1lKTsKLSAgICAJCWlmIChhbGwuaXNFbXB0eSgpKSB7Ci0gICAgCQkJcmV0dXJuIHN1cGVyUmVzb3VyY2VzOwotICAgIAkJfQotCi0gICAgCQl3aGlsZSAoc3VwZXJSZXNvdXJjZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAJCQlhbGwuYWRkKHN1cGVyUmVzb3VyY2VzLm5leHRFbGVtZW50KCkpOwotICAgIAkJfQotICAgIAkJcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKGFsbCk7Ci0gICAgCX0gZmluYWxseSB7Ci0gICAgCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihvcmlnaW5hbENsYXNzTG9hZGVyKTsKLSAgICAJfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdGhpcyBjbGFzcyBsb2FkZXIgd2lsbCBhbGxvdyBBcGFjaGUgQW50IGNsYXNzZXMgb3IgcmVzb3VyY2VzIHRvIGJlIGZvdW5kIG9yCi0gICAgICogbG9hZGVkIGZyb20gaXRzIHNldCBvZiBwbHVnLWluIGNsYXNzIGxvYWRlcnMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFsbG93TG9hZGluZyB3aGV0aGVyIG9yIG5vdCB0byBhbGxvdyB0aGUgcGx1Zy1pbiBjbGFzcyBsb2FkZXJzCi0gICAgICogdG8gbG9hZCB0aGUgQXBhY2hlIEFudCBjbGFzc2VzIG9yIHJlc291cmNlcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFsbG93UGx1Z2luQ2xhc3NMb2FkZXJzVG9Mb2FkQW50KGJvb2xlYW4gYWxsb3dMb2FkaW5nKSB7Ci0gICAgICAgIGZBbGxvd1BsdWdpbkxvYWRpbmcgPSBhbGxvd0xvYWRpbmc7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFBsdWdpbkNvbnRleHRDbGFzc2xvYWRlcihDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotICAgICAgICBmQ29udGV4dENsYXNzbG9hZGVyID0gY2xhc3NMb2FkZXI7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvQW50UHJvcGVydHlWYWx1ZVByb3ZpZGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL0FudFByb3BlcnR5VmFsdWVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDI4MDI1Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvQW50UHJvcGVydHlWYWx1ZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IEJCRE8gRGV0cm9pdCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBUaGllcnJ5IExhY2ggKHRoaWVycnkubGFjaEBiYmRvZGV0cm9pdC5jb20pIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGZvciBidWcgNDA1MDIKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBhZGRlZCBlY2xpcHNlLnJ1bm5pbmcgcHJvcGVydHksIGJ1ZyA2NTY1NQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuSUFudFByb3BlcnR5VmFsdWVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci0KLS8qKgotICogRHluYW1pYyBwcm92aWRlciBmb3IgQW50IHByb3BlcnRpZXMuCi0gKiAKLSAqIFByb3ZpZGVzIHRoZSBkeW5hbWljIHZhbHVlcyBmb3IgdGhlIGZvbGxvd2luZyBBbnQgcHJvcGVydGllczoKLSAqIAotICogPHVsPgotICogPGxpPjxjb2RlPmVjbGlwc2UuaG9tZTwvY29kZT4gLSBzZXQgdG8gdGhlIEVjbGlwc2UgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeTwvbGk+Ci0gKiA8L3VsPgotICogKiA8dWw+Ci0gKiA8bGk+PGNvZGU+ZWNsaXBzZS5ydW5uaW5nPC9jb2RlPiAtIHNldCAodG8gInRydWUiKSB3aGVuIEVjbGlwc2UgaXMgcnVubmluZzwvbGk+Ci0gKiA8L3VsPgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRQcm9wZXJ0eVZhbHVlUHJvdmlkZXIgaW1wbGVtZW50cyBJQW50UHJvcGVydHlWYWx1ZVByb3ZpZGVyIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkeW5hbWljIHByb3BlcnR5IHZhbHVlcyBmb3IgQW50IHByb3BlcnRpZXMuCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcmVzb2x2ZSB0aGUgdmFsdWUgZm9yCi0JICogQHJldHVybiBUaGUgcmVzb2x2ZWQgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmNvcmUuSUFudFByb3BlcnR5VmFsdWVQcm92aWRlciNnZXRBbnRQcm9wZXJ0eVZhbHVlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFudFByb3BlcnR5VmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQlpZiAoImVjbGlwc2UucnVubmluZyIuZXF1YWxzKHByb3BlcnR5TmFtZSkpeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gInRydWUiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoImVjbGlwc2UuaG9tZSIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJdHJ5IHsKLQkJCQl2YWx1ZSA9IG5ldyBGaWxlKEZpbGVMb2NhdG9yLnJlc29sdmUobmV3IFVSTCgicGxhdGZvcm06L2Jhc2UvIikpLmdldFBhdGgoKSkuZ2V0QWJzb2x1dGVQYXRoKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAodmFsdWUuZW5kc1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIHZhbHVlLmxlbmd0aCgpIC0gMSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlBbnRDb3JlUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvQW50U2VjdXJpdHlNYW5hZ2VyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL0FudFNlY3VyaXR5TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDc5ZGRlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvQW50U2VjdXJpdHlNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwuY29yZTsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudFNlY3VyaXR5RXhjZXB0aW9uOwotCi0vKioKLSAqIEEgc2VjdXJpdHkgbWFuYWdlciB0aGF0IGFsd2F5cyB0aHJvd3MgYW4gPGNvZGU+QW50U2VjdXJpdHlFeGNlcHRpb248L2NvZGU+Ci0gKiBpZiB0aGUgY2FsbGluZyB0aHJlYWQgYXR0ZW1wdHMgdG8gY2F1c2UgdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lIHRvIAotICogZXhpdC9oYWx0IG9yIGlmIHRoZSByZXN0cmljdGVkIHRocmVhZCBhdHRlbXB0cyB0byBzZXQgYSBTeXN0ZW0gcHJvcGVydHkuCi0gKiBPdGhlcndpc2UgdGhpcyBtYW5hZ2VyIGp1c3QgZGVsZWdhdGVzIHRvIHRoZSBwcmUtZXhpc3RpbmcgbWFuYWdlcgotICogcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3RvciBvciBtaW1pY3MgdGhlIGRlZmF1bHQgc2VjdXJpdHkgbWFuYWdlciBiZWhhdmlvcgotICovCi1wdWJsaWMgY2xhc3MgQW50U2VjdXJpdHlNYW5hZ2VyIGV4dGVuZHMgU2VjdXJpdHlNYW5hZ2VyIHsKLQotCXByaXZhdGUgU2VjdXJpdHlNYW5hZ2VyIGZTZWN1cml0eU1hbmFnZXI9IG51bGw7Ci0JcHJpdmF0ZSBUaHJlYWQgZlJlc3RyaWN0ZWRUaHJlYWQ9IG51bGw7Ci0JLy9lbnN1cmUgdGhhdCB0aGUgUHJvcGVydHlQZXJtaXNzaW9uIGNsYXNzIGlzIGxvYWRlZCBiZWZvcmUgd2UgCi0JLy9zdGFydCBjaGVja2luZyBwZXJtaXNzaW9uczogYnVnIDg1OTA4Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvcGVydHlQZXJtaXNzaW9uIGZnUHJvcGVydHlQZXJtaXNzaW9uPSBuZXcgUHJvcGVydHlQZXJtaXNzaW9uKCIqIiwgIndyaXRlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQotCXByaXZhdGUgYm9vbGVhbiBmQWxsb3dTZXR0aW5nU3lzdGVtUHJvcGVydGllcz0gdHJ1ZTsKLQkKLQlwdWJsaWMgQW50U2VjdXJpdHlNYW5hZ2VyKFNlY3VyaXR5TWFuYWdlciBzZWN1cml0eU1hbmFnZXIsIFRocmVhZCByZXN0cmljdGVkVGhyZWFkLCBib29sZWFuIGFsbG93U2V0dGluZ1Byb3BlcnRpZXMpIHsKLQkJZlNlY3VyaXR5TWFuYWdlcj0gc2VjdXJpdHlNYW5hZ2VyOwotCQlmUmVzdHJpY3RlZFRocmVhZD0gcmVzdHJpY3RlZFRocmVhZDsKLQkJZkFsbG93U2V0dGluZ1N5c3RlbVByb3BlcnRpZXM9IGFsbG93U2V0dGluZ1Byb3BlcnRpZXM7Ci0JfQotCQotCXB1YmxpYyBBbnRTZWN1cml0eU1hbmFnZXIoU2VjdXJpdHlNYW5hZ2VyIHNlY3VyaXR5TWFuYWdlciwgVGhyZWFkIHJlc3RyaWN0ZWRUaHJlYWQpIHsKLQkJdGhpcyhzZWN1cml0eU1hbmFnZXIsIHJlc3RyaWN0ZWRUaHJlYWQsIHRydWUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrRXhpdChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tFeGl0KGludCBzdGF0dXMpIHsKLQkJLy9ubyBleGl0IGFsbG93ZWQgZnJvbSB0aGUgcmVzdHJpY3RlZCB0aHJlYWQuLi5TeXN0ZW0uZXhpdCBpcyBiZWluZyBjYWxsZWQKLQkJLy9ieSBzb21lIGFudCB0YXNrLi4uZG8gbm90IHdhbnQgRWNsaXBzZSB0byBleGl0IGlmCi0JCS8vaW4gdGhlIHNhbWUgVk0uCi0JCWlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpID09IGZSZXN0cmljdGVkVGhyZWFkKSB7Ci0JCQl0aHJvdyBuZXcgQW50U2VjdXJpdHlFeGNlcHRpb24oKTsKLQkJfQotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrRXhpdChzdGF0dXMpOwotCQl9Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tBY2NlcHQoamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrQWNjZXB0KFN0cmluZyBob3N0LCBpbnQgcG9ydCkgewotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrQWNjZXB0KGhvc3QsIHBvcnQpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0FjY2VzcyhqYXZhLmxhbmcuVGhyZWFkKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrQWNjZXNzKFRocmVhZCB0KSB7Ci0JCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tBY2Nlc3ModCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrQWNjZXNzKGphdmEubGFuZy5UaHJlYWRHcm91cCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja0FjY2VzcyhUaHJlYWRHcm91cCBnKSB7Ci0JCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tBY2Nlc3MoZyk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrQXd0RXZlbnRRdWV1ZUFjY2VzcygpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tBd3RFdmVudFF1ZXVlQWNjZXNzKCkgewotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrQXd0RXZlbnRRdWV1ZUFjY2VzcygpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0Nvbm5lY3QoamF2YS5sYW5nLlN0cmluZywgaW50LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrQ29ubmVjdChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIE9iamVjdCBjb250ZXh0KSB7Ci0JCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tDb25uZWN0KGhvc3QsIHBvcnQsIGNvbnRleHQpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0Nvbm5lY3QoamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrQ29ubmVjdChTdHJpbmcgaG9zdCwgaW50IHBvcnQpIHsKLQkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja0Nvbm5lY3QoaG9zdCwgcG9ydCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrQ3JlYXRlQ2xhc3NMb2FkZXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrQ3JlYXRlQ2xhc3NMb2FkZXIoKSB7Ci0JCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tDcmVhdGVDbGFzc0xvYWRlcigpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0RlbGV0ZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrRGVsZXRlKFN0cmluZyBmaWxlKSB7Ci0JCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tEZWxldGUoZmlsZSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrRXhlYyhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrRXhlYyhTdHJpbmcgY21kKSB7Ci0JCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tFeGVjKGNtZCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrTGluayhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrTGluayhTdHJpbmcgbGliKSB7Ci0JCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tMaW5rKGxpYik7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrTGlzdGVuKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja0xpc3RlbihpbnQgcG9ydCkgewotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrTGlzdGVuKHBvcnQpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja01lbWJlckFjY2VzcyhqYXZhLmxhbmcuQ2xhc3MsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja01lbWJlckFjY2VzcyhDbGFzcyBjbGF6eiwgaW50IHdoaWNoKSB7Ci0JCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tNZW1iZXJBY2Nlc3MoY2xhenosIHdoaWNoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja011bHRpY2FzdChqYXZhLm5ldC5JbmV0QWRkcmVzcywgYnl0ZSkKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrTXVsdGljYXN0KEluZXRBZGRyZXNzIG1hZGRyLCBieXRlIHR0bCkgewotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgaG9zdCA9IG1hZGRyLmdldEhvc3RBZGRyZXNzKCk7Ci0JCQlpZiAoIWhvc3Quc3RhcnRzV2l0aCgiWyIpICYmIGhvc3QuaW5kZXhPZignOicpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKLQkgICAJCQlob3N0ID0gIlsiICsgaG9zdCArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JICAgIAljaGVja1Blcm1pc3Npb24obmV3IFNvY2tldFBlcm1pc3Npb24oaG9zdCwgImFjY2VwdCxjb25uZWN0IikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrTXVsdGljYXN0KGphdmEubmV0LkluZXRBZGRyZXNzKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrTXVsdGljYXN0KEluZXRBZGRyZXNzIG1hZGRyKSB7Ci0JCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tNdWx0aWNhc3QobWFkZHIpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1BhY2thZ2VBY2Nlc3MoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1BhY2thZ2VBY2Nlc3MoU3RyaW5nIHBrZykgewotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrUGFja2FnZUFjY2Vzcyhwa2cpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1BhY2thZ2VEZWZpbml0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tQYWNrYWdlRGVmaW5pdGlvbihTdHJpbmcgcGtnKSB7Ci0JCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tQYWNrYWdlRGVmaW5pdGlvbihwa2cpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1Blcm1pc3Npb24oamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrUGVybWlzc2lvbihQZXJtaXNzaW9uIHBlcm0sIE9iamVjdCBjb250ZXh0KSB7Ci0JCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tQZXJtaXNzaW9uKHBlcm0sIGNvbnRleHQpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1Blcm1pc3Npb24oamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrUGVybWlzc2lvbihQZXJtaXNzaW9uIHBlcm0pIHsKLQkJaWYgKCFmQWxsb3dTZXR0aW5nU3lzdGVtUHJvcGVydGllcyAmJiBmZ1Byb3BlcnR5UGVybWlzc2lvbi5pbXBsaWVzKHBlcm0pICYmIGZSZXN0cmljdGVkVGhyZWFkID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpIHsKLQkJCS8vYXR0ZW1wdGluZyB0byB3cml0ZSBhIHN5c3RlbSBwcm9wZXJ0eQotCQkJdGhyb3cgbmV3IEFudFNlY3VyaXR5RXhjZXB0aW9uKCk7Ci0JCX0KLQkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja1Blcm1pc3Npb24ocGVybSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUHJpbnRKb2JBY2Nlc3MoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrUHJpbnRKb2JBY2Nlc3MoKSB7Ci0JCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tQcmludEpvYkFjY2VzcygpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1Byb3BlcnRpZXNBY2Nlc3MoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrUHJvcGVydGllc0FjY2VzcygpIHsKLQkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja1Byb3BlcnRpZXNBY2Nlc3MoKTsKLQkJfQotCQlzdXBlci5jaGVja1Byb3BlcnRpZXNBY2Nlc3MoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUHJvcGVydHlBY2Nlc3MoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1Byb3BlcnR5QWNjZXNzKFN0cmluZyBrZXkpIHsKLQkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja1Byb3BlcnR5QWNjZXNzKGtleSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUmVhZChqYXZhLmlvLkZpbGVEZXNjcmlwdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrUmVhZChGaWxlRGVzY3JpcHRvciBmZCkgewotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrUmVhZChmZCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUmVhZChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrUmVhZChTdHJpbmcgZmlsZSwgT2JqZWN0IGNvbnRleHQpIHsKLQkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja1JlYWQoZmlsZSwgY29udGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUmVhZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrUmVhZChTdHJpbmcgZmlsZSkgewotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrUmVhZChmaWxlKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tTZWN1cml0eUFjY2VzcyhqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrU2VjdXJpdHlBY2Nlc3MoU3RyaW5nIHRhcmdldCkgewotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrU2VjdXJpdHlBY2Nlc3ModGFyZ2V0KTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tTZXRGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1NldEZhY3RvcnkoKSB7Ci0JCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tTZXRGYWN0b3J5KCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrU3lzdGVtQ2xpcGJvYXJkQWNjZXNzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1N5c3RlbUNsaXBib2FyZEFjY2VzcygpIHsKLQkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja1N5c3RlbUNsaXBib2FyZEFjY2VzcygpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1RvcExldmVsV2luZG93KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2hlY2tUb3BMZXZlbFdpbmRvdyhPYmplY3Qgd2luZG93KSB7Ci0JCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXJldHVybiBmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrVG9wTGV2ZWxXaW5kb3cod2luZG93KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY2hlY2tUb3BMZXZlbFdpbmRvdyh3aW5kb3cpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tXcml0ZShqYXZhLmlvLkZpbGVEZXNjcmlwdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrV3JpdGUoRmlsZURlc2NyaXB0b3IgZmQpIHsKLQkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja1dyaXRlKGZkKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tXcml0ZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrV3JpdGUoU3RyaW5nIGZpbGUpIHsKLQkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja1dyaXRlKGZpbGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2dldEluQ2hlY2soKQotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0SW5DaGVjaygpIHsKLQkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZTZWN1cml0eU1hbmFnZXIuZ2V0SW5DaGVjaygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRJbkNoZWNrKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNnZXRTZWN1cml0eUNvbnRleHQoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U2VjdXJpdHlDb250ZXh0KCkgewotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZlNlY3VyaXR5TWFuYWdlci5nZXRTZWN1cml0eUNvbnRleHQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0U2VjdXJpdHlDb250ZXh0KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNnZXRUaHJlYWRHcm91cCgpCi0JICovCi0JcHVibGljIFRocmVhZEdyb3VwIGdldFRocmVhZEdyb3VwKCkgewotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmU2VjdXJpdHlNYW5hZ2VyLmdldFRocmVhZEdyb3VwKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFRocmVhZEdyb3VwKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9JbnRlcm5hbENvcmVBbnRNZXNzYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9JbnRlcm5hbENvcmVBbnRNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmY2NWU2Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvSW50ZXJuYWxDb3JlQW50TWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBJbnRlcm5hbENvcmVBbnRNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLkludGVybmFsQ29yZUFudE1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRDb3JlUHJlZmVyZW5jZXNfTWFsZm9ybWVkX1VSTF9fMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRDb3JlUHJlZmVyZW5jZXNfTGlicmFyeV9ub3Rfc3BlY2lmaWVkX2Zvcl9fXzBfXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50Q29yZVByZWZlcmVuY2VzX05vX2xpYnJhcnlfZm9yX3Rhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50Q29yZVByZWZlcmVuY2VzX05vX2xpYnJhcnlfZm9yX3R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50Q29yZVByZWZlcmVuY2VzXzg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50Q29yZVByZWZlcmVuY2VzXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50Q29yZVByZWZlcmVuY2VzXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50Q29yZVByZWZlcmVuY2VzXzE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRSdW5uZXJfQ291bGRfbm90X2ZpbmRfb25lX29yX21vcmVfY2xhc3Nlc19fUGxlYXNlX2NoZWNrX3RoZV9BbnRfY2xhc3NwYXRoX18xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFJ1bm5lcl9Db3VsZF9ub3RfZmluZF9vbmVfb3JfbW9yZV9jbGFzc2VzX19QbGVhc2VfY2hlY2tfdGhlX0FudF9jbGFzc3BhdGhfXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50UnVubmVyX0J1aWxkX0ZhaWxlZF9fMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRSdW5uZXJfQWxyZWFkeV9pbl9wcm9nZXNzOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEludGVybmFsQ29yZUFudE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9JbnRlcm5hbENvcmVBbnRNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9JbnRlcm5hbENvcmVBbnRNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2ZmZDkyLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvSW50ZXJuYWxDb3JlQW50TWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQW50Q29yZVByZWZlcmVuY2VzX01hbGZvcm1lZF9VUkxfXzE9TWFsZm9ybWVkIFVSTC4KLUFudENvcmVQcmVmZXJlbmNlc19MaWJyYXJ5X25vdF9zcGVjaWZpZWRfZm9yX19fMF9fND1MaWJyYXJ5IG5vdCBzcGVjaWZpZWQgZm9yOiB7MH0KLUFudENvcmVQcmVmZXJlbmNlc19Ob19saWJyYXJ5X2Zvcl90YXNrPVRoZSBsaWJyYXJ5IFwiezB9XCIgc3BlY2lmaWVkIGZyb20gXCJ7MX1cIiBmb3IgdGhlIGFudFRhc2tzIGV4dGVuc2lvbiBkb2VzIG5vdCBleGlzdAotQW50Q29yZVByZWZlcmVuY2VzX05vX2xpYnJhcnlfZm9yX3R5cGU9VGhlIGxpYnJhcnkgXCJ7MH1cIiBzcGVjaWZpZWQgZnJvbSBcInsxfVwiIGZvciB0aGUgYW50VHlwZXMgZXh0ZW5zaW9uIG9mIGRvZXMgbm90IGV4aXN0Ci1BbnRDb3JlUHJlZmVyZW5jZXNfOD1UaGUgbGlicmFyeSBcInswfVwiIHNwZWNpZmllZCBmcm9tIFwiezF9XCIgZm9yIHRoZSBhbnRUYXNrcyBvciBhbnRUeXBlcyBleHRlbnNpb24gZG9lcyBub3QgZXhpc3QKLUFudENvcmVQcmVmZXJlbmNlc182PVRoZSBsaWJyYXJ5IFwiezB9XCIgc3BlY2lmaWVkIGZyb20gXCJ7MX1cIiBmb3IgdGhlIGV4dHJhQ2xhc3NwYXRoRW50cmllcyBleHRlbnNpb24gZG9lcyBub3QgZXhpc3QKLUFudENvcmVQcmVmZXJlbmNlc18wPUV4Y2VwdGlvbiBwYXJzaW5nIGJ1bmRsZSBtYW5pZmVzdCBmaWxlLgotQW50Q29yZVByZWZlcmVuY2VzXzE9SG9zdCBub3QgZm91bmQgZm9yIHRoZSBmcmFnbWVudDogezB9Ci0KLUFudFJ1bm5lcl9Db3VsZF9ub3RfZmluZF9vbmVfb3JfbW9yZV9jbGFzc2VzX19QbGVhc2VfY2hlY2tfdGhlX0FudF9jbGFzc3BhdGhfXzE9Q291bGQgbm90IGZpbmQgb25lIG9yIG1vcmUgY2xhc3Nlcy4gUGxlYXNlIGNoZWNrIHRoZSBBbnQgY2xhc3NwYXRoLgotQW50UnVubmVyX0NvdWxkX25vdF9maW5kX29uZV9vcl9tb3JlX2NsYXNzZXNfX1BsZWFzZV9jaGVja190aGVfQW50X2NsYXNzcGF0aF9fMj1Db3VsZCBub3QgZmluZCBvbmUgb3IgbW9yZSBjbGFzc2VzOiBcInswfVwiLiBQbGVhc2UgY2hlY2sgdGhlIEFudCBjbGFzc3BhdGguCi1BbnRSdW5uZXJfQnVpbGRfRmFpbGVkX18zPUJVSUxEIEZBSUxFRAotQW50UnVubmVyX0FscmVhZHlfaW5fcHJvZ2Vzcz1BbnQgYnVpbGQgezB9IGFscmVhZHkgaW4gcHJvZ3Jlc3MuIENvbmN1cnJlbnQgQW50IGJ1aWxkcyBhcmUgcG9zc2libGUgaWYgeW91IHNwZWNpZnkgdG8gYnVpbGQgaW4gYSBzZXBhcmF0ZSBKUkUuCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2NvbnRlbnREZXNjcmliZXIvQW50QnVpbGRmaWxlQ29udGVudERlc2NyaWJlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9jb250ZW50RGVzY3JpYmVyL0FudEJ1aWxkZmlsZUNvbnRlbnREZXNjcmliZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlZGY5ZC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2NvbnRlbnREZXNjcmliZXIvQW50QnVpbGRmaWxlQ29udGVudERlc2NyaWJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgUGhpbGlwcGUgT21icmVkYW5uZSAocG9tYnJlZGFubmVAbmV4Yi5jb20pIC0gYnVnIDEyNTM2NwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLmNvbnRlbnREZXNjcmliZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5YTUxDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIGNvbnRlbnQgZGVzY3JpYmVyIGZvciBBbnQgYnVpbGRmaWxlcy4KLSAqIDxwPgotICogSWYgcHJvamVjdCB0b3AgbGV2ZWwgZWxlbWVudCBpcyBmb3VuZCAKLSAqICAgICAgdGhlbiBpZjoKLSAqICAgICAgICAgIHRhcmdldCBzdWItZWxlbWVudHMgYXJlIGZvdW5kIHJldHVybnMgVkFMSUQKLSAqICAgICAgICAgIGRlZmF1bHQgYXR0cmlidXRlIGlzIGZvdW5kIHJldHVybnMgVkFMSUQKLSAqICAgICAgICAgIHNvbWUgb3RoZXIgbGlrZWx5IEFudCBlbGVtZW50IGlzIGZvdW5kIChjbGFzc3BhdGgsIGltcG9ydCwgbWFjcm9kZWYsIHBhdGgsIHByb3BlcnR5LCB0YXNrZGVmLCB0eXBlZGVmKSByZXR1cm5zIFZBTElECi0gKiAgICAgIGVsc2U6Ci0gKiAgICAgICAgICByZXR1cm5zIElOREVURVJNSU5BVEUKLSAqIGVsc2UKLSAqICAgICAgcmV0dXJucyBJTkRFVEVSTUlOQVRFCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFudEJ1aWxkZmlsZUNvbnRlbnREZXNjcmliZXIgZXh0ZW5kcyBYTUxDb250ZW50RGVzY3JpYmVyIGltcGxlbWVudHMgSUV4ZWN1dGFibGVFeHRlbnNpb24gewotCi0JLyogKEludGVudGlvbmFsbHkgbm90IGluY2x1ZGVkIGluIGphdmFkb2MpCi0JICogRGV0ZXJtaW5lcyB0aGUgdmFsaWRhdGlvbiBzdGF0dXMgZm9yIHRoZSBnaXZlbiBjb250ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudHMgdGhlIGNvbnRlbnRzIHRvIGJlIGV2YWx1YXRlZAotCSAqIEByZXR1cm4gb25lIG9mIHRoZSBmb2xsb3dpbmc6PHVsPgotCSAqIDxsaT48Y29kZT5WQUxJRDwvY29kZT48L2xpPiwKLQkgKiA8bGk+PGNvZGU+SU5WQUxJRDwvY29kZT48L2xpPiwKLQkgKiA8bGk+PGNvZGU+SU5ERVRFUk1JTkFURTwvY29kZT48L2xpPgotCSAqIDwvdWw+Ci0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgaW50IGNoZWNrQ3JpdGVyaWEoSW5wdXRTb3VyY2UgY29udGVudHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUFudEhhbmRsZXIgYW50SGFuZGxlciA9IG5ldyBBbnRIYW5kbGVyKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoIWFudEhhbmRsZXIucGFyc2VDb250ZW50cyhjb250ZW50cykpIHsKLQkJCQlyZXR1cm4gSU5ERVRFUk1JTkFURTsKLSAgICAgICAgICAgIH0KLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHdlIG1heSBiZSBoYW5kZWQgYW55IGtpbmQgb2YgY29udGVudHMuLi4gaXQgaXMgbm9ybWFsIHdlIGZhaWwgdG8gcGFyc2UKLQkJCXJldHVybiBJTkRFVEVSTUlOQVRFOwotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNvbWUgYmFkIHRoaW5nIGhhcHBlbmVkIC0gZm9yY2UgdGhpcyBkZXNjcmliZXIgdG8gYmUgZGlzYWJsZWQKLQkJCVN0cmluZyBtZXNzYWdlID0gIkludGVybmFsIEVycm9yOiBYTUwgcGFyc2VyIGNvbmZpZ3VyYXRpb24gZXJyb3IgZHVyaW5nIGNvbnRlbnQgZGVzY3JpcHRpb24gZm9yIEFudCBidWlsZGZpbGVzIjsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSk7Ci0JCX0KLQkJLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIG1hdGNoZWQgb3VyIGNyaXRlcmlhLgotCQlpZiAoYW50SGFuZGxlci5oYXNSb290UHJvamVjdEVsZW1lbnQoKSkgewotCQkJaWYgKGFudEhhbmRsZXIuaGFzUHJvamVjdERlZmF1bHRBdHRyaWJ1dGUoKSB8fCBhbnRIYW5kbGVyLmhhc1RhcmdldEVsZW1lbnQoKSB8fCBhbnRIYW5kbGVyLmhhc0FudEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgIC8vcHJvamVjdCBhbmQgZGVmYXVsdCBhdHRyaWJ1dGUgb3IgcHJvamVjdCBhbmQgdGFyZ2V0IGVsZW1lbnQocykgCi0JCQkJLy9vciBwcm9qZWN0IGFuZCB0b3AgbGV2ZWwgYW50IGVsZW1lbnQocykgKGNsYXNzcGF0aCwgaW1wb3J0LCBtYWNyb2RlZiwgcGF0aCwgcHJvcGVydHksIHRhc2tkZWYsIHR5cGVkZWYpCi0gICAgICAgICAgICAgICAgcmV0dXJuIFZBTElEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9vbmx5IGEgdG9wIGxldmVsIHByb2plY3QgZWxlbWVudC4uLm1heWJlIGFuIEFudCBidWlsZGZpbGUKLSAgICAgICAgICAgIHJldHVybiBJTkRFVEVSTUlOQVRFOwotICAgICAgICB9IAotCQkJCi0JCXJldHVybiBJTkRFVEVSTUlOQVRFOwotCX0KLQotCS8qIChJbnRlbnRpb25hbGx5IG5vdCBpbmNsdWRlZCBpbiBqYXZhZG9jKQotCSAqIEBzZWUgSUNvbnRlbnREZXNjcmliZXIjZGVzY3JpYmUoSW5wdXRTdHJlYW0sIElDb250ZW50RGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGludCBkZXNjcmliZShJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gY2FsbCB0aGUgYmFzaWMgWE1MIGRlc2NyaWJlciB0byBkbyBiYXNpYyByZWNvZ25pdGlvbgotCQlpZiAoc3VwZXIuZGVzY3JpYmUoY29udGVudHMsIGRlc2NyaXB0aW9uKSA9PSBJTlZBTElEKSB7Ci0JCQlyZXR1cm4gSU5WQUxJRDsKLQkJfQotCQkvLyBzdXBlci5kZXNjcmliZSB3aWxsIGhhdmUgY29uc3VtZWQgc29tZSBjaGFycywgbmVlZCB0byByZXdpbmQJCQotCQljb250ZW50cy5yZXNldCgpOwotCQkvLyBDaGVjayB0byBzZWUgaWYgd2UgbWF0Y2hlZCBvdXIgY3JpdGVyaWEuCQkKLQkJcmV0dXJuIGNoZWNrQ3JpdGVyaWEobmV3IElucHV0U291cmNlKGNvbnRlbnRzKSk7Ci0JfQotCi0JLyogKEludGVudGlvbmFsbHkgbm90IGluY2x1ZGVkIGluIGphdmFkb2MpCi0JICogQHNlZSBJQ29udGVudERlc2NyaWJlciNkZXNjcmliZShSZWFkZXIsIElDb250ZW50RGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGludCBkZXNjcmliZShSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGNhbGwgdGhlIGJhc2ljIFhNTCBkZXNjcmliZXIgdG8gZG8gYmFzaWMgcmVjb2duaXRpb24KLQkJaWYgKHN1cGVyLmRlc2NyaWJlKGNvbnRlbnRzLCBkZXNjcmlwdGlvbikgPT0gSU5WQUxJRCkgewotCQkJcmV0dXJuIElOVkFMSUQ7Ci0JCX0KLQkJLy8gc3VwZXIuZGVzY3JpYmUgd2lsbCBoYXZlIGNvbnN1bWVkIHNvbWUgY2hhcnMsIG5lZWQgdG8gcmV3aW5kCi0JCWNvbnRlbnRzLnJlc2V0KCk7Ci0JCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBtYXRjaGVkIG91ciBjcml0ZXJpYS4KLQkJcmV0dXJuIGNoZWNrQ3JpdGVyaWEobmV3IElucHV0U291cmNlKGNvbnRlbnRzKSk7Ci0JfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uI3NldEluaXRpYWxpemF0aW9uRGF0YShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxpemF0aW9uRGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZGF0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudC9NRVRBLUlORi9lY2xpcHNlLmluZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L01FVEEtSU5GL2VjbGlwc2UuaW5mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGRmM2FiLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L01FVEEtSU5GL2VjbGlwc2UuaW5mCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotamFycHJvY2Vzc29yLmV4Y2x1ZGUuc2lnbj10cnVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0RlbXV4SW5wdXRTdHJlYW1TZXR0ZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9EZW11eElucHV0U3RyZWFtU2V0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZTgyNGQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0RlbXV4SW5wdXRTdHJlYW1TZXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuYW50OwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EZW11eElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBleGlzdHMgc28gdGhhdCB0aGUgQW50IGludGVncmF0aW9uIGhhcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQotICogd2l0aCBBbnQgcmVsZWFzZXMgcHJldmlvdXMgdG8gMS42LiBEZW11eElucHV0U3RyZWFtIGlzIGEgbmV3IGNsYXNzIHRvIEFudCAxLjYuCi0gKi8KLWNsYXNzIERlbXV4SW5wdXRTdHJlYW1TZXR0ZXIgewotCi0JcHJvdGVjdGVkIHZvaWQgcmVtYXBTeXN0ZW1JbihQcm9qZWN0IHByb2plY3QpIHsKLQkJU3lzdGVtLnNldEluKG5ldyBEZW11eElucHV0U3RyZWFtKHByb2plY3QpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvRWNsaXBzZUFudE1haW4uamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9FY2xpcHNlQW50TWFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTBiNTkxLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9FY2xpcHNlQW50TWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuYW50OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlQW50TWFpbiBleHRlbmRzIE1haW4gewotCi0JcHJpdmF0ZSBQcm9qZWN0IGZFY2xpcHNlQW50UHJvamVjdDsKLQotCXB1YmxpYyBFY2xpcHNlQW50TWFpbihQcm9qZWN0IGVjbGlwc2VBbnRQcm9qZWN0KSB7Ci0JCXN1cGVyKCk7Ci0JCWZFY2xpcHNlQW50UHJvamVjdCA9IGVjbGlwc2VBbnRQcm9qZWN0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW4oU3RyaW5nW10gYXJncywgUHJvamVjdCBlY2xpcHNlQW50UHJvamVjdCkgewotCQlNYWluIHByb2plY3RIZWxwTWFpbiA9IG5ldyBFY2xpcHNlQW50TWFpbihlY2xpcHNlQW50UHJvamVjdCk7Ci0JCXByb2plY3RIZWxwTWFpbi5zdGFydEFudChhcmdzLCBudWxsLCBudWxsKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50Lk1haW4jZXhpdChpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhpdChpbnQgZXhpdENvZGUpIHsKLQkJLy9kaXNhbGxvdyBzeXN0ZW0gZXhpdAotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuTWFpbiNhZGRCdWlsZExpc3RlbmVycyhvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJ1aWxkTGlzdGVuZXJzKFByb2plY3QgcHJvamVjdCkgewotCQlJdGVyYXRvciBsaXN0ZW5lcnMgPSBmRWNsaXBzZUFudFByb2plY3QuZ2V0QnVpbGRMaXN0ZW5lcnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAobGlzdGVuZXJzLmhhc05leHQoKSkgewotCQkJcHJvamVjdC5hZGRCdWlsZExpc3RlbmVyKChCdWlsZExpc3RlbmVyKSBsaXN0ZW5lcnMubmV4dCgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9FY2xpcHNlRGVmYXVsdEV4ZWN1dG9yLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvRWNsaXBzZURlZmF1bHRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGFhMzVhLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9FY2xpcHNlRGVmYXVsdEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuYW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5oZWxwZXIuRGVmYXVsdEV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZURlZmF1bHRFeGVjdXRvciBleHRlbmRzIERlZmF1bHRFeGVjdXRvciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFY2xpcHNlU2luZ2xlQ2hlY2tFeGVjdXRvciBTVUJfRVhFQ1VUT1IgPSBuZXcgRWNsaXBzZVNpbmdsZUNoZWNrRXhlY3V0b3IoKTsKLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5FeGVjdXRvciNleGVjdXRlVGFyZ2V0cyhvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0LCBqYXZhLmxhbmcuU3RyaW5nW10pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZVRhcmdldHMoUHJvamVjdCBwcm9qZWN0LCBTdHJpbmdbXSB0YXJnZXROYW1lcykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgVmVjdG9yIHY9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgdi5hZGRBbGwoQXJyYXlzLmFzTGlzdCh0YXJnZXROYW1lcykpOwotICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZWNsaXBzZS5hbnQudGFyZ2V0VmVjdG9yIiwgdik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc3VwZXIuZXhlY3V0ZVRhcmdldHMocHJvamVjdCwgdGFyZ2V0TmFtZXMpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5FeGVjdXRvciNnZXRTdWJQcm9qZWN0RXhlY3V0b3IoKQotICAgICAqLwotICAgIHB1YmxpYyBFeGVjdXRvciBnZXRTdWJQcm9qZWN0RXhlY3V0b3IoKSB7Ci0gICAgICAgcmV0dXJuIFNVQl9FWEVDVVRPUjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvRWNsaXBzZU1haW5IZWxwZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9FY2xpcHNlTWFpbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDUyNTAyLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9FY2xpcHNlTWFpbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuYW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VNYWluSGVscGVyIHsKLQotCXByb3RlY3RlZCB2b2lkIHJ1blByb2plY3RIZWxwKFN0cmluZyBidWlsZEZpbGVMb2NhdGlvbiwgUHJvamVjdCBlY2xpcHNlQW50UHJvamVjdCkgewotCQlFY2xpcHNlQW50TWFpbi5ydW4obmV3IFN0cmluZ1tdeyItZiIsIGJ1aWxkRmlsZUxvY2F0aW9uLCAiLXAifSwgZWNsaXBzZUFudFByb2plY3QpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcnVuVXNhZ2UoU3RyaW5nIGJ1aWxkRmlsZUxvY2F0aW9uLCBQcm9qZWN0IGVjbGlwc2VBbnRQcm9qZWN0KSB7Ci0JCUVjbGlwc2VBbnRNYWluLnJ1bihuZXcgU3RyaW5nW117Ii1mIiwgYnVpbGRGaWxlTG9jYXRpb24sICItaCJ9LCBlY2xpcHNlQW50UHJvamVjdCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9FY2xpcHNlU2luZ2xlQ2hlY2tFeGVjdXRvci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0VjbGlwc2VTaW5nbGVDaGVja0V4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NTQ5YjYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0VjbGlwc2VTaW5nbGVDaGVja0V4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuYW50OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5oZWxwZXIuU2luZ2xlQ2hlY2tFeGVjdXRvcjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VTaW5nbGVDaGVja0V4ZWN1dG9yIGV4dGVuZHMgU2luZ2xlQ2hlY2tFeGVjdXRvciB7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5FeGVjdXRvciNleGVjdXRlVGFyZ2V0cyhvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0LCBqYXZhLmxhbmcuU3RyaW5nW10pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZVRhcmdldHMoUHJvamVjdCBwcm9qZWN0LCBTdHJpbmdbXSB0YXJnZXROYW1lcykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgVmVjdG9yIHY9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgdi5hZGRBbGwoQXJyYXlzLmFzTGlzdCh0YXJnZXROYW1lcykpOwotICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZWNsaXBzZS5hbnQudGFyZ2V0VmVjdG9yIiwgdik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc3VwZXIuZXhlY3V0ZVRhcmdldHMocHJvamVjdCwgdGFyZ2V0TmFtZXMpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5FeGVjdXRvciNnZXRTdWJQcm9qZWN0RXhlY3V0b3IoKQotICAgICAqLwotICAgIHB1YmxpYyBFeGVjdXRvciBnZXRTdWJQcm9qZWN0RXhlY3V0b3IoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9FeGVjdXRvclNldHRlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0V4ZWN1dG9yU2V0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNzU5ZjIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0V4ZWN1dG9yU2V0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuYW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGV4aXN0cyBzbyB0aGF0IHRoZSBBbnQgaW50ZWdyYXRpb24gaGFzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ci0gKiB3aXRoIEFudCByZWxlYXNlcyBwcmV2aW91cyB0byAxLjYuMy4gRXhlY3V0b3JzIGFyZSBhIG5ldyBmZWF0dXJlIG9mIEFudCAxLjYuMy4KLSAqLwotcHVibGljIGNsYXNzIEV4ZWN1dG9yU2V0dGVyIHsKLQotICAgIHByb3RlY3RlZCB2b2lkIHNldEV4ZWN1dG9yKFByb2plY3QgcHJvamVjdCkgewotICAgICAgICBFeGVjdXRvciBleGVjdXRvcj0gbmV3IEVjbGlwc2VEZWZhdWx0RXhlY3V0b3IoKTsKLSAgICAgICAgcHJvamVjdC5zZXRFeGVjdXRvcihleGVjdXRvcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0ZhaWxJbnB1dEhhbmRsZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9GYWlsSW5wdXRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMTU1YjMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0ZhaWxJbnB1dEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwuY29yZS5hbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5EZWZhdWx0SW5wdXRIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgRmFpbElucHV0SGFuZGxlciBleHRlbmRzIERlZmF1bHRJbnB1dEhhbmRsZXIgewotCQotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKLQkJLy9lbnN1cmUgYW55IGF0dGVtcHRzIHRvIHJlYWQgaW5wdXQgZmFpbAotCQlyZXR1cm4gbmV3IElucHV0U3RyZWFtKCl7Ci0JCQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9JbnB1dEhhbmRsZXJTZXR0ZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9JbnB1dEhhbmRsZXJTZXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI5NjViOS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvSW5wdXRIYW5kbGVyU2V0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiAgQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLmFudDsKLQotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7IC8vIGNhbid0IHVzZSBJQ1UgaW4gYW50Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LkRlZmF1bHRJbnB1dEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuSW5wdXRIYW5kbGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgZXhpc3RzIHNvIHRoYXQgdGhlIEFudCBpbnRlZ3JhdGlvbiBoYXMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKLSAqIHdpdGggQW50IHJlbGVhc2VzIHByZXZpb3VzIHRvIDEuNS4gSW5wdXRIYW5kbGVycyBhcmUgYSBuZXcgZmVhdHVyZSBvZiBBbnQgMS41LgotICovCi1jbGFzcyBJbnB1dEhhbmRsZXJTZXR0ZXIgewotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW5wdXRIYW5kbGVyKFByb2plY3QgcHJvamVjdCwgU3RyaW5nIGlucHV0SGFuZGxlckNsYXNzbmFtZSkgewotCQlJbnB1dEhhbmRsZXIgaGFuZGxlciA9IG51bGw7Ci0JCWlmIChpbnB1dEhhbmRsZXJDbGFzc25hbWUgPT0gbnVsbCkgewotCQkJaGFuZGxlciA9IG5ldyBEZWZhdWx0SW5wdXRIYW5kbGVyKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCWhhbmRsZXIgPSAoSW5wdXRIYW5kbGVyKShDbGFzcy5mb3JOYW1lKGlucHV0SGFuZGxlckNsYXNzbmFtZSkubmV3SW5zdGFuY2UoKSk7Ci0JCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChJbnRlcm5hbEFudE1lc3NhZ2VzLkludGVybmFsQW50UnVubmVyX2hhbmRsZXJfZG9lc19ub3RfaW1wbGVtZW50X0lucHV0SGFuZGxlcjUsIG5ldyBTdHJpbmdbXXtpbnB1dEhhbmRsZXJDbGFzc25hbWV9KTsKLQkJCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBlKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEludGVybmFsQW50TWVzc2FnZXMuSW50ZXJuYWxBbnRSdW5uZXJfVW5hYmxlX3RvX2luc3RhbnRpYXRlX2lucHV0X2hhbmRsZXJfY2xhc3MsIG5ldyBTdHJpbmdbXXtpbnB1dEhhbmRsZXJDbGFzc25hbWUsIGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCl9KTsKLQkJCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBlKTsKLQkJCX0KLQkJfQotCQlwcm9qZWN0LnNldElucHV0SGFuZGxlcihoYW5kbGVyKTsKLQkJcHJvamVjdC5zZXRQcm9qZWN0UmVmZXJlbmNlKGhhbmRsZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9JbnRlcm5hbFByb2plY3QuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9JbnRlcm5hbFByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEwYWFiMi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmNvcmUvc3JjX2FudC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvY29yZS9hbnQvSW50ZXJuYWxQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBkZXJpdmVkIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwuY29yZS5hbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsgLy8gY2FuJ3QgdXNlIElDVSwgYW50IGJ1aWxkIHNjcmlwdAotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OwotCi0vKioKLSAqIEEgc3ViY2xhc3Mgb2YgUHJvamVjdCB0byBmYWNpbGl0YXRlICJmYXN0ZXIiIHBhcnNpbmcgd2l0aAotICogbGVzcyBnYXJiYWdlIGdlbmVyYXRlZC4gVGhpcyBjbGFzcyBpcyBub3QgdXNlZCBvbiBBbnQgMS42IGFuZCBuZXdlcgotICogZHVlIHRvIHRoZSBpbXByb3ZlbWVudHMgaW4gbGF6eSBsb2FkaW5nIG9mIHRoZXNlIEFudCB2ZXJzaW9ucy4KLSAqIAotICogT25seSB0aHJlZSB0YXNrcyBhcmUgbG9hZGVkIChwcm9wZXJ0eSwgdGFza2RlZiBhbmQgCi0gKiB0eXBlZGVmOiB0aHJlZSB0YXNrcyB0aGF0IGNhbiBiZSBkZWZpbmVkIG91dHNpZGUgb2YgYSB0YXJnZXQgb24gQW50IDEuNS4xIG9yIG9sZGVyKS4KLSAqCi0gKiBEYXRhdHlwZXMgYXJlIGxvYWRlZCBpZiByZXF1ZXN0ZWQuCi0gKiAKLSAqIERlcml2ZWQgZnJvbSB0aGUgb3JpZ2luYWwgQW50IFByb2plY3QgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIEludGVybmFsUHJvamVjdCBleHRlbmRzIFByb2plY3QgewotCi0JcHJpdmF0ZSBIYXNodGFibGUgdHlwZU5hbWVUb0NsYXNzID0gbnVsbDsKLQkKLQlwdWJsaWMgSW50ZXJuYWxQcm9qZWN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QjaW5pdCgpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0JCXNldEphdmFWZXJzaW9uUHJvcGVydHkoKTsKLQotCQl0cnkgewotCQkJQ2xhc3MgdGFza0NsYXNzID0gQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUHJvcGVydHkiKTsgLy8kTk9OLU5MUy0xJAotCQkJYWRkVGFza0RlZmluaXRpb24oInByb3BlcnR5IiwgdGFza0NsYXNzKTsgLy8kTk9OLU5MUy0xJAotCQkJdGFza0NsYXNzID0gQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVHlwZWRlZiIpOyAvLyROT04tTkxTLTEkCi0JCQlhZGRUYXNrRGVmaW5pdGlvbigidHlwZWRlZiIsIHRhc2tDbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQkJCXRhc2tDbGFzcyA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlRhc2tkZWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJYWRkVGFza0RlZmluaXRpb24oInRhc2tkZWYiLCB0YXNrQ2xhc3MpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKLQkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihJbnRlcm5hbEFudE1lc3NhZ2VzLkludGVybmFsQW50UnVubmVyX01pc3NpbmdfQ2xhc3MsIGUpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGMpIHsKLQkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihJbnRlcm5hbEFudE1lc3NhZ2VzLkludGVybmFsQW50UnVubmVyX01pc3NpbmdfQ2xhc3MsIGMpOwotCQl9Ci0KLQkJc2V0U3lzdGVtUHJvcGVydGllcygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QjY3JlYXRlRGF0YVR5cGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZURhdGFUeXBlKFN0cmluZyB0eXBlTmFtZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQkJaWYgKHR5cGVOYW1lVG9DbGFzcyA9PSBudWxsKSB7Ci0JCQlpbml0aWFsaXplVHlwZXMoKTsKLQkJfQotCQlDbGFzcyB0eXBlQ2xhc3MgPSAoQ2xhc3MpIHR5cGVOYW1lVG9DbGFzcy5nZXQodHlwZU5hbWUpOwotCi0JCWlmICh0eXBlQ2xhc3MgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlUaHJvd2FibGUgdGhyb3duID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUNvbnN0cnVjdG9yIGN0b3IgPSBudWxsOwotCQkJYm9vbGVhbiBub0FyZyA9IGZhbHNlOwotCQkJLy8gRGF0YVR5cGUgY2FuIGhhdmUgYSAibm8gYXJnIiBjb25zdHJ1Y3RvciBvciB0YWtlIGEgc2luZ2xlCi0JCQkvLyBQcm9qZWN0IGFyZ3VtZW50LgotCQkJdHJ5IHsKLQkJCQljdG9yID0gdHlwZUNsYXNzLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1swXSk7Ci0JCQkJbm9BcmcgPSB0cnVlOwotCQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zZSkgewotCQkJCWN0b3IgPSB0eXBlQ2xhc3MuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10geyBQcm9qZWN0LmNsYXNzIH0pOwotCQkJCW5vQXJnID0gZmFsc2U7Ci0JCQl9Ci0KLQkJCU9iamVjdCBvID0gbnVsbDsKLQkJCWlmIChub0FyZykgewotCQkJCW8gPSBjdG9yLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbMF0pOwotCQkJfSBlbHNlIHsKLQkJCQlvID0gY3Rvci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10geyB0aGlzIH0pOwotCQkJfQotCQkJaWYgKG8gaW5zdGFuY2VvZiBQcm9qZWN0Q29tcG9uZW50KSB7Ci0JCQkJKChQcm9qZWN0Q29tcG9uZW50KSBvKS5zZXRQcm9qZWN0KHRoaXMpOwotCQkJfQotCQkJcmV0dXJuIG87Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0JCQl0aHJvd24gPSBpdGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvd24gPSBlOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93biA9IGU7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJdGhyb3duID0gZTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zZSkgewotCQkJdGhyb3duID0gbnNlOwotCQl9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBuY2RmZSkgewotCQkJdGhyb3duID0gbmNkZmU7Ci0JCX0KLQkJaWYgKHRocm93biAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZT0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSW50ZXJuYWxBbnRNZXNzYWdlcy5JbnRlcm5hbFByb2plY3RfY291bGRfbm90X2NyZWF0ZV90eXBlLCBuZXcgU3RyaW5nW117dHlwZU5hbWUsIHRocm93bi50b1N0cmluZygpfSk7Ci0JCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSwgdGhyb3duKTsKLQkJfQotCQkvLyB0aGlzIGxpbmUgaXMgYWN0dWFsbHkgdW5yZWFjaGFibGUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgbWFwcGluZyBvZiBkYXRhIHR5cGUgbmFtZSB0byBkYXRhIHR5cGUgY2xhc3NuYW1lCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVUeXBlcygpIHsKLQkJdHlwZU5hbWVUb0NsYXNzID0gbmV3IEhhc2h0YWJsZSgxOCk7Ci0JCVN0cmluZyBkYXRhRGVmcyA9ICIvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvZGVmYXVsdHMucHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBQcm9qZWN0LmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oZGF0YURlZnMpOwotCQkJaWYgKGluID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlwcm9wcy5sb2FkKGluKTsKLQkJCWluLmNsb3NlKCk7Ci0KLQkJCUVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gcHJvcHMucHJvcGVydHlOYW1lcygpOwotCQkJd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJU3RyaW5nIHR5cGVOYW1lID0gKFN0cmluZykgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gcHJvcHMuZ2V0UHJvcGVydHkodHlwZU5hbWUpOwotCQkJCXRyeSB7Ci0JCQkJCUNsYXNzIHR5cGVDbGFzcz0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotCQkJCQl0eXBlTmFtZVRvQ2xhc3MucHV0KHR5cGVOYW1lLCB0eXBlQ2xhc3MpOwotCQkJCX0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKLQkJCQkJLy9pZ25vcmUKLQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGMpIHsKLQkJCQkJLy9pZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdCNnZXREYXRhVHlwZURlZmluaXRpb25zKCkKLQkgKi8KLQlwdWJsaWMgSGFzaHRhYmxlIGdldERhdGFUeXBlRGVmaW5pdGlvbnMoKSB7Ci0JCWlmICh0eXBlTmFtZVRvQ2xhc3MgPT0gbnVsbCkgewotCQkJaW5pdGlhbGl6ZVR5cGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVOYW1lVG9DbGFzczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdCNhZGREYXRhVHlwZURlZmluaXRpb24oamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERhdGFUeXBlRGVmaW5pdGlvbihTdHJpbmcgdHlwZU5hbWUsIENsYXNzIHR5cGVDbGFzcykgewotCQlnZXREYXRhVHlwZURlZmluaXRpb25zKCk7Ci0JCXR5cGVOYW1lVG9DbGFzcy5wdXQodHlwZU5hbWUsIHR5cGVDbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0ludGVybmFsUHJvamVjdDIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9JbnRlcm5hbFByb2plY3QyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YWUxN2YuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0ludGVybmFsUHJvamVjdDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLmFudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudENsYXNzTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLQotcHVibGljIGNsYXNzIEludGVybmFsUHJvamVjdDIgZXh0ZW5kcyBQcm9qZWN0IHsKLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QjY3JlYXRlQ2xhc3NMb2FkZXIob3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCkKLSAgICAgKi8KLSAgICBwdWJsaWMgQW50Q2xhc3NMb2FkZXIgY3JlYXRlQ2xhc3NMb2FkZXIoUGF0aCBwYXRoKSB7Ci0gICAgCUFudENsYXNzTG9hZGVyIGxvYWRlcj0gc3VwZXIuY3JlYXRlQ2xhc3NMb2FkZXIocGF0aCk7Ci0gICAgCWlmIChwYXRoID09IG51bGwpIHsKLSAgICAJCS8vdXNlIHRoZSAiZmFrZSIgRWNsaXBzZSBydW50aW1lIGNsYXNzcGF0aCBmb3IgQW50Ci0gICAgCQlsb2FkZXIuc2V0Q2xhc3NQYXRoKFBhdGguc3lzdGVtQ2xhc3NwYXRoKTsKLSAgICAJfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGxvYWRlcjsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L051bGxJbnB1dEhhbmRsZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQuY29yZS9zcmNfYW50L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9jb3JlL2FudC9OdWxsSW5wdXRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NjA5NjIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L051bGxJbnB1dEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwuY29yZS5hbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5JbnB1dEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuSW5wdXRSZXF1ZXN0OwotCi0vKioKLSAqIEEgaW5wdXQgaGFuZGxlciB0aGF0IGRvZXMgbm90aGluZyB3aXRoIGlucHV0IHJlcXVlc3RzCi0gKiBVc2VkIHRvIGVuc3VyZSB3ZSBkbyBub3QgYmxvY2sgd2hpbGUgcmV0cmlldmluZyB0YXJnZXRzIGZyb20gYW4gQW50IGJ1aWxkZmlsZQotICogdGhhdCBoYXMgYW4gaW5wdXQgdGFzayBpbiB0aGUgdG9wIGxldmVsIGltcGxpY2l0IHRhcmdldAotICovCi1wdWJsaWMgY2xhc3MgTnVsbElucHV0SGFuZGxlciBpbXBsZW1lbnRzIElucHV0SGFuZGxlciB7Ci0KLQlwdWJsaWMgTnVsbElucHV0SGFuZGxlcigpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5JbnB1dEhhbmRsZXIjaGFuZGxlSW5wdXQob3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuSW5wdXRSZXF1ZXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUlucHV0KElucHV0UmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nLy5jbGFzc3BhdGggYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGViMDBlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJsb2dnZXJzX2JpbiIgcGF0aD0ibG9nZ2VycyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iY29tbW9uX2JpbiIgcGF0aD0iY29tbW9uIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJyZW1vdGVfYmluIiBwYXRoPSJyZW1vdGUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0ICJhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nLy5leHRlcm5hbFRvb2xCdWlsZGVycy9idWlsZCBjb21tb24gZGVidWcgXDEzM0J1aWxkZXJcMTM1LmxhdW5jaCIgImIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL2J1aWxkIGNvbW1vbiBkZWJ1ZyBcMTMzQnVpbGRlclwxMzUubGF1bmNoIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxZWM1NS4uMDAwMDAwMAotLS0gImEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL2J1aWxkIGNvbW1vbiBkZWJ1ZyBcMTMzQnVpbGRlclwxMzUubGF1bmNoIgorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5hbnQuQW50QnVpbGRlckxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIj4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuYW50LnVpLkFUVFJfVEFSR0VUU19VUERBVEVEIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5hbnQudWkuREVGQVVMVF9WTV9JTlNUQUxMIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkFUVFJfUkVGUkVTSF9TQ09QRSIgdmFsdWU9IiR7d29ya2luZ19zZXQ6Jmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7VVRGLTgmcXVvdDs/Jmd0OyYjMTM7JiMxMDsmbHQ7bGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQgZWRpdFBhZ2VJZD0mcXVvdDtvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVdvcmtpbmdTZXRQYWdlJnF1b3Q7IGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JraW5nU2V0RmFjdG9yeSZxdW90OyBpZD0mcXVvdDsxMjU0NTM5ODA4MzI4XzExMiZxdW90OyBsYWJlbD0mcXVvdDt3b3JraW5nIHNldCZxdW90OyBuYW1lPSZxdW90O3dvcmtpbmcgc2V0JnF1b3Q7Jmd0OyYjMTM7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvbGliJnF1b3Q7IHR5cGU9JnF1b3Q7MiZxdW90Oy8mZ3Q7JiMxMzsmIzEwOyZsdDsvbGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQmZ3Q7fSIvPgotPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLk1BUFBFRF9SRVNPVVJDRV9QQVRIUyI+Ci08bGlzdEVudHJ5IHZhbHVlPSIvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9idWlsZGZpbGVzL2J1aWxkQ29tbW9uRGVidWcueG1sIi8+Ci08L2xpc3RBdHRyaWJ1dGU+Ci08bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTUFQUEVEX1JFU09VUkNFX1RZUEVTIj4KLTxsaXN0RW50cnkgdmFsdWU9IjEiLz4KLTwvbGlzdEF0dHJpYnV0ZT4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuQVRUUl9MQVVOQ0hfSU5fQkFDS0dST1VORCIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5DTEFTU1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5hbnQudWkuQW50Q2xhc3NwYXRoUHJvdmlkZXIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0pFQ1RfQVRUUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmciLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlNPVVJDRV9QQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LnVpLkFudENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0JVSUxEX1NDT1BFIiB2YWx1ZT0iJHt3b3JraW5nX3NldDombHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDtVVEYtOCZxdW90Oz8mZ3Q7JiMxMzsmIzEwOyZsdDtsYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ1NldCBlZGl0UGFnZUlkPSZxdW90O29yZy5lY2xpcHNlLnVpLnJlc291cmNlV29ya2luZ1NldFBhZ2UmcXVvdDsgZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtpbmdTZXRGYWN0b3J5JnF1b3Q7IGlkPSZxdW90OzEyNTQ1Mzk4MzQ5NTNfMTEzJnF1b3Q7IGxhYmVsPSZxdW90O3dvcmtpbmdTZXQmcXVvdDsgbmFtZT0mcXVvdDt3b3JraW5nU2V0JnF1b3Q7Jmd0OyYjMTM7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvY29tbW9uJnF1b3Q7IHR5cGU9JnF1b3Q7MiZxdW90Oy8mZ3Q7JiMxMzsmIzEwOyZsdDsvbGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQmZ3Q7fSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9MT0NBVElPTiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvYzovb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9idWlsZGZpbGVzL2J1aWxkQ29tbW9uRGVidWcueG1sfSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9SVU5fQlVJTERfS0lORFMiIHZhbHVlPSJmdWxsLGluY3JlbWVudGFsLGF1dG8sIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9UUklHR0VSU19DT05GSUdVUkVEIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InByb2Nlc3NfZmFjdG9yeV9pZCIgdmFsdWU9Im9yZy5lY2xpcHNlLmFudC51aS5yZW1vdGVBbnRQcm9jZXNzRmFjdG9yeSIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0ICJhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nLy5leHRlcm5hbFRvb2xCdWlsZGVycy9idWlsZCBsb2dnZXJzIFwxMzNCdWlsZGVyXDEzNS5sYXVuY2giICJiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nLy5leHRlcm5hbFRvb2xCdWlsZGVycy9idWlsZCBsb2dnZXJzIFwxMzNCdWlsZGVyXDEzNS5sYXVuY2giCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzcxOGQ4Li4wMDAwMDAwCi0tLSAiYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvYnVpbGQgbG9nZ2VycyBcMTMzQnVpbGRlclwxMzUubGF1bmNoIgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5hbnQuQW50QnVpbGRlckxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIj4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuYW50LnVpLkFUVFJfVEFSR0VUU19VUERBVEVEIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5hbnQudWkuREVGQVVMVF9WTV9JTlNUQUxMIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuYW50LnVpU0VUX0lOUFVUSEFORExFUiIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5BVFRSX1JFRlJFU0hfU0NPUEUiIHZhbHVlPSIke3dvcmtpbmdfc2V0OiZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O1VURi04JnF1b3Q7PyZndDsmIzEzOyYjMTA7Jmx0O2xhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nU2V0IGVkaXRQYWdlSWQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkucmVzb3VyY2VXb3JraW5nU2V0UGFnZSZxdW90OyBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2luZ1NldEZhY3RvcnkmcXVvdDsgaWQ9JnF1b3Q7MTI1NDUzOTYwNDk2OF8yOSZxdW90OyBsYWJlbD0mcXVvdDt3b3JraW5nIHNldCZxdW90OyBuYW1lPSZxdW90O3dvcmtpbmcgc2V0JnF1b3Q7Jmd0OyYjMTM7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvbGliJnF1b3Q7IHR5cGU9JnF1b3Q7MiZxdW90Oy8mZ3Q7JiMxMzsmIzEwOyZsdDsvbGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQmZ3Q7fSIvPgotPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLk1BUFBFRF9SRVNPVVJDRV9QQVRIUyI+Ci08bGlzdEVudHJ5IHZhbHVlPSIvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9idWlsZGZpbGVzL2J1aWxkTG9nZ2Vycy54bWwiLz4KLTwvbGlzdEF0dHJpYnV0ZT4KLTxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfVFlQRVMiPgotPGxpc3RFbnRyeSB2YWx1ZT0iMSIvPgotPC9saXN0QXR0cmlidXRlPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BVFRSX0xBVU5DSF9JTl9CQUNLR1JPVU5EIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkNMQVNTUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmFudC51aS5BbnRDbGFzc3BhdGhQcm92aWRlciIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPSkVDVF9BVFRSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZyIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuU09VUkNFX1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5hbnQudWkuQW50Q2xhc3NwYXRoUHJvdmlkZXIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfQlVJTERfU0NPUEUiIHZhbHVlPSIke3dvcmtpbmdfc2V0OiZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O1VURi04JnF1b3Q7PyZndDsmIzEzOyYjMTA7Jmx0O2xhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nU2V0IGVkaXRQYWdlSWQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkucmVzb3VyY2VXb3JraW5nU2V0UGFnZSZxdW90OyBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2luZ1NldEZhY3RvcnkmcXVvdDsgaWQ9JnF1b3Q7MTI1NDUzOTY3MTg3NV81NiZxdW90OyBsYWJlbD0mcXVvdDt3b3JraW5nU2V0JnF1b3Q7IG5hbWU9JnF1b3Q7d29ya2luZ1NldCZxdW90OyZndDsmIzEzOyYjMTA7Jmx0O2l0ZW0gZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLm1vZGVsLlJlc291cmNlRmFjdG9yeSZxdW90OyBwYXRoPSZxdW90Oy9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2xvZ2dlcnMmcXVvdDsgdHlwZT0mcXVvdDsyJnF1b3Q7LyZndDsmIzEzOyYjMTA7Jmx0Oy9sYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ1NldCZndDt9Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0xPQ0FUSU9OIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jOi9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2J1aWxkZmlsZXMvYnVpbGRMb2dnZXJzLnhtbH0iLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfUlVOX0JVSUxEX0tJTkRTIiB2YWx1ZT0iZnVsbCxpbmNyZW1lbnRhbCxhdXRvLCIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfVFJJR0dFUlNfQ09ORklHVVJFRCIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwcm9jZXNzX2ZhY3RvcnlfaWQiIHZhbHVlPSJvcmcuZWNsaXBzZS5hbnQudWkucmVtb3RlQW50UHJvY2Vzc0ZhY3RvcnkiLz4KLTwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCAiYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvYnVpbGQgcmVtb3RlIHN1cHBvcnQgXDEzM0J1aWxkZXJcMTM1LmxhdW5jaCIgImIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL2J1aWxkIHJlbW90ZSBzdXBwb3J0IFwxMzNCdWlsZGVyXDEzNS5sYXVuY2giCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTZlYjk2Li4wMDAwMDAwCi0tLSAiYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvYnVpbGQgcmVtb3RlIHN1cHBvcnQgXDEzM0J1aWxkZXJcMTM1LmxhdW5jaCIKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UuYW50LkFudEJ1aWxkZXJMYXVuY2hDb25maWd1cmF0aW9uVHlwZSI+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmFudC51aS5BVFRSX1RBUkdFVFNfVVBEQVRFRCIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuYW50LnVpLkRFRkFVTFRfVk1fSU5TVEFMTCIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5BVFRSX1JFRlJFU0hfU0NPUEUiIHZhbHVlPSIke3dvcmtpbmdfc2V0OiZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O1VURi04JnF1b3Q7PyZndDsmIzEzOyYjMTA7Jmx0O2xhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nU2V0IGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JraW5nU2V0RmFjdG9yeSZxdW90OyBpZD0mcXVvdDsxMjU0NjE3MTkxNDY4XzQ0JnF1b3Q7IGxhYmVsPSZxdW90O3dvcmtpbmcgc2V0JnF1b3Q7IG5hbWU9JnF1b3Q7d29ya2luZyBzZXQmcXVvdDsmZ3Q7JiMxMzsmIzEwOyZsdDtpdGVtIGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5tb2RlbC5SZXNvdXJjZUZhY3RvcnkmcXVvdDsgcGF0aD0mcXVvdDsvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9saWImcXVvdDsgdHlwZT0mcXVvdDsyJnF1b3Q7LyZndDsmIzEzOyYjMTA7Jmx0Oy9sYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ1NldCZndDt9Ii8+Ci08bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTUFQUEVEX1JFU09VUkNFX1BBVEhTIj4KLTxsaXN0RW50cnkgdmFsdWU9Ii9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2J1aWxkZmlsZXMvYnVpbGRSZW1vdGUueG1sIi8+Ci08L2xpc3RBdHRyaWJ1dGU+Ci08bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTUFQUEVEX1JFU09VUkNFX1RZUEVTIj4KLTxsaXN0RW50cnkgdmFsdWU9IjEiLz4KLTwvbGlzdEF0dHJpYnV0ZT4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuQVRUUl9MQVVOQ0hfSU5fQkFDS0dST1VORCIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5DTEFTU1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5hbnQudWkuQW50Q2xhc3NwYXRoUHJvdmlkZXIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0pFQ1RfQVRUUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmciLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlNPVVJDRV9QQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LnVpLkFudENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0JVSUxEX1NDT1BFIiB2YWx1ZT0iJHt3b3JraW5nX3NldDombHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDtVVEYtOCZxdW90Oz8mZ3Q7JiMxMzsmIzEwOyZsdDtsYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ1NldCBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2luZ1NldEZhY3RvcnkmcXVvdDsgaWQ9JnF1b3Q7MTI1NDYxNzIwNjQ1M180NSZxdW90OyBsYWJlbD0mcXVvdDt3b3JraW5nU2V0JnF1b3Q7IG5hbWU9JnF1b3Q7d29ya2luZ1NldCZxdW90OyZndDsmIzEzOyYjMTA7Jmx0O2l0ZW0gZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLm1vZGVsLlJlc291cmNlRmFjdG9yeSZxdW90OyBwYXRoPSZxdW90Oy9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZSZxdW90OyB0eXBlPSZxdW90OzImcXVvdDsvJmd0OyYjMTM7JiMxMDsmbHQ7L2xhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nU2V0Jmd0O30iLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfTE9DQVRJT04iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2M6L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvYnVpbGRmaWxlcy9idWlsZFJlbW90ZS54bWx9Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1JVTl9CVUlMRF9LSU5EUyIgdmFsdWU9ImZ1bGwsaW5jcmVtZW50YWwsYXV0bywiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1RSSUdHRVJTX0NPTkZJR1VSRUQiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0icHJvY2Vzc19mYWN0b3J5X2lkIiB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LnVpLnJlbW90ZUFudFByb2Nlc3NGYWN0b3J5Ii8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy8ucHJvamVjdCBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjcwNGVmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5hcGlBbmFseXNpc0J1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5FeHRlcm5hbFRvb2xCdWlsZGVyPC9uYW1lPgotCQkJPHRyaWdnZXJzPmF1dG8sZnVsbCxpbmNyZW1lbnRhbCw8L3RyaWdnZXJzPgotCQkJPGFyZ3VtZW50cz4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5MYXVuY2hDb25maWdIYW5kbGU8L2tleT4KLQkJCQkJPHZhbHVlPiZsdDtwcm9qZWN0Jmd0Oy8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvYnVpbGQgbG9nZ2VycyBbQnVpbGRlcl0ubGF1bmNoPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkV4dGVybmFsVG9vbEJ1aWxkZXI8L25hbWU+Ci0JCQk8dHJpZ2dlcnM+YXV0byxmdWxsLGluY3JlbWVudGFsLDwvdHJpZ2dlcnM+Ci0JCQk8YXJndW1lbnRzPgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5PkxhdW5jaENvbmZpZ0hhbmRsZTwva2V5PgotCQkJCQk8dmFsdWU+Jmx0O3Byb2plY3QmZ3Q7Ly5leHRlcm5hbFRvb2xCdWlsZGVycy9idWlsZCBjb21tb24gZGVidWcgW0J1aWxkZXJdLmxhdW5jaDwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5FeHRlcm5hbFRvb2xCdWlsZGVyPC9uYW1lPgotCQkJPHRyaWdnZXJzPmF1dG8sZnVsbCxpbmNyZW1lbnRhbCw8L3RyaWdnZXJzPgotCQkJPGFyZ3VtZW50cz4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5MYXVuY2hDb25maWdIYW5kbGU8L2tleT4KLQkJCQkJPHZhbHVlPiZsdDtwcm9qZWN0Jmd0Oy8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvYnVpbGQgcmVtb3RlIHN1cHBvcnQgW0J1aWxkZXJdLmxhdW5jaDwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5hcGlBbmFseXNpc05hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvYWJvdXQuaHRtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5OTM5MjUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5PY3RvYmVyIDgsIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTxoMz5UaGlyZCBQYXJ0eSBDb250ZW50PC9oMz4KLQotPHA+VGhlIENvbnRlbnQgaW5jbHVkZXMgaXRlbXMgdGhhdCBoYXZlIGJlZW4gc291cmNlZCBmcm9tIHRoaXJkIHBhcnRpZXMgYXMgc2V0IG91dCBiZWxvdy4gSWYgeW91IAotZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBmb2xsb3dpbmcgaXMgcHJvdmlkZWQgCi1mb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIHRvIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSBmb3IgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UuPC9wPgotCi08aDQ+QW50IDEuNy4xPC9oND4KLQotPHA+VGhlIGZvbGxvd2luZyBjbGFzc2VzIGluIHRoZSBwbHVnLWluIEpBUiBhcmUgYmFzZWQgb24gQW50IGNvZGUgZGV2ZWxvcGVkIGJ5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgc2hhbGwgYmUgZGVmaW5lZCBhcyB0aGUgJnF1b3Q7QW50LURlcml2ZWQgV29yayZxdW90Ozo8L3A+Ci0KLTx1bD4KLQk8bGk+b3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5yZW1vdGUuSW50ZXJuYWxBbnRSdW5uZXI8L2xpPgotPC91bD4KLQotPHA+VGhlIG9iamVjdCBjb2RlIGZvciBJbnRlcm5hbEFudFJ1bm5lciBpcyBsb2NhdGVkIGluIGxpYi9yZW1vdGUuamFyIGFuZCB0aGUgc291cmNlIGNvZGUgaXMgbG9jYXRlZCBpbiBsaWIvcmVtb3Rlc3JjLnppcC48L3A+Ci0KLTxwPllvdXIgdXNlIG9mIHRoZSBBbnQtRGVyaXZlZCBXb3JrIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAuICBBIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaXMgY29udGFpbmVkCi1pbiB0aGUgZmlsZSA8YSBocmVmPSJhYm91dF9maWxlcy9hc2wtdjIwLnR4dCIgdGFyZ2V0PSJfYmxhbmsiPmFib3V0X2ZpbGVzL2FzbC12MjAudHh0PC9hPiBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgCi08YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sPC9hPi48L3A+Ci0KLTxwPlRoZSBuYW1lcyAmcXVvdDtBbnQmcXVvdDsgYW5kICAmcXVvdDtBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiZxdW90OyBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyAKLXNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPGEgaHJlZj0ibWFpbHRvOmFwYWNoZUBhcGFjaGUub3JnIj5hcGFjaGVAYXBhY2hlLm9yZzwvYT4uPC9wPgotCi08cD5UaGUgQXBhY2hlIGF0dHJpYnV0aW9uIDxhIGhyZWY9ImFib3V0X2ZpbGVzL05PVElDRSIgdGFyZ2V0PSJfYmxhbmsiPk5PVElDRTwvYT4gZmlsZSBpcyBpbmNsdWRlZCB3aXRoIHRoZSBDb250ZW50IGluIGFjY29yZGFuY2Ugd2l0aCA0ZCBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9idWlsZC5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdhOWQwNS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGxpYi9hbnRkZWJ1Zy5qYXIsXAotICAgICAgICAgICAgICAgbGliL2xvZ2dlcnMuamFyLFwKLSAgICAgICAgICAgICAgIGxpYi9yZW1vdGUuamFyLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLQotamFycy5jb21waWxlLm9yZGVyID0gLixcCi0JCQkJICAgICAgICAgICAgICAgICAgICAgbGliL2FudGRlYnVnLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBsaWIvbG9nZ2Vycy5qYXIsXAotICAgICAgICAgICAgICAgICAgICAgbGliL3JlbW90ZS5qYXIKLXNvdXJjZS5saWIvbG9nZ2Vycy5qYXIgPSBsb2dnZXJzLwotb3V0cHV0LmxpYi9sb2dnZXJzLmphciA9IGxvZ2dlcnNfYmluLwotc291cmNlLmxpYi9hbnRkZWJ1Zy5qYXIgPSBjb21tb24vCi1vdXRwdXQubGliL2FudGRlYnVnLmphciA9IGNvbW1vbl9iaW4vCi1zb3VyY2UubGliL3JlbW90ZS5qYXIgPSByZW1vdGUvCi1vdXRwdXQubGliL3JlbW90ZS5qYXIgPSByZW1vdGVfYmluLwotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvYnVpbGRmaWxlcy9idWlsZENvbW1vbkRlYnVnLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2J1aWxkZmlsZXMvYnVpbGRDb21tb25EZWJ1Zy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4Yjk5ZWIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvYnVpbGRmaWxlcy9idWlsZENvbW1vbkRlYnVnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICAKLSAgICAgQ29udHJpYnV0b3JzOgotICAgICAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gLS0+Ci0KLTxwcm9qZWN0IG5hbWU9IkJ1aWxkIEFudCBjb21tb24gZGVidWcgc3VwcG9ydCBKQVIiIGRlZmF1bHQ9ImJ1aWxkIiBiYXNlZGlyPSIuLiI+Ci0JCi0JPHRhcmdldCBuYW1lPSJidWlsZCIgZGVzY3JpcHRpb249IkNsZWFucywgYnVpbGRzIGFuZCByZWZyZXNoZXMiIGRlcGVuZHM9ImNsZWFuLCBsaWIvYW50ZGVidWdsaWIuamFyIi8+Ci0KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0idGVtcC5mb2xkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9L3RlbXAuZm9sZGVyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5yZXN1bHQuZm9sZGVyIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0ibGliL2FudGRlYnVnbGliLmphciIgZGVzY3JpcHRpb249ICJDcmVhdGVzIHRoZSBhbnRkZWJ1Zy5qYXIiIGRlcGVuZHM9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0iZGVzdGRpciIgdmFsdWU9IiR7dGVtcC5mb2xkZXJ9L2xpYi9hbnRkZWJ1Zy5qYXIuYmluIi8+Ci0JCTxkZWxldGUgZGlyPSIke2Rlc3RkaXJ9Ii8+Ci0JCTxta2RpciBkaXI9IiR7ZGVzdGRpcn0iLz4KLQkJPCEtLSBjb3B5IG5lY2Vzc2FyeSBjbGFzcyBmaWxlcyByZXNvdXJjZXMgLS0+Ci0JCTxjb3B5IHRvZGlyPSIke2Rlc3RkaXJ9Ij4KLQkJCTxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9jb21tb25fYmluIi8+Ci0JCTwvY29weT4KLQkJPG1rZGlyIGRpcj0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9saWIiLz4KLQkJPGphciBkZXN0ZmlsZT0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9saWIvYW50ZGVidWcuamFyIiBiYXNlZGlyPSIke2Rlc3RkaXJ9Ii8+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249IkRlbGV0ZXMgcHJldmlvdXMgYnVpbGQgcmVtbmFudHMiIGRlcGVuZHM9ImluaXQiPgotCQk8ZGVsZXRlIGZpbGU9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0vbGliL2FudGRlYnVnLmphciIvPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2J1aWxkZmlsZXMvYnVpbGRMb2dnZXJzLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2J1aWxkZmlsZXMvYnVpbGRMb2dnZXJzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRiYjA0Yy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9idWlsZGZpbGVzL2J1aWxkTG9nZ2Vycy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgCi0gICAgIENvbnRyaWJ1dG9yczoKLSAgICAgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIC0tPgotCi08cHJvamVjdCBuYW1lPSJCdWlsZCBBbnQgbG9nZ2VycyBzdXBwb3J0IEpBUiIgZGVmYXVsdD0iYnVpbGQiIGJhc2VkaXI9Ii4uIj4KLQkKLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXNjcmlwdGlvbj0iQ2xlYW5zLCBidWlsZHMgYW5kIHJlZnJlc2hlcyIgZGVwZW5kcz0iY2xlYW4sIGxpYi9sb2dnZXJzbGliLmphciIvPgotCi0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9InRlbXAuZm9sZGVyIiB2YWx1ZT0iJHtiYXNlZGlyfS90ZW1wLmZvbGRlciIvPgotCQk8cHJvcGVydHkgbmFtZT0iYnVpbGQucmVzdWx0LmZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0iLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0ibGliL2xvZ2dlcnNsaWIuamFyIiBkZXNjcmlwdGlvbj0gIkNyZWF0ZXMgdGhlIGxvZ2dlcnMuamFyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3RkaXIiIHZhbHVlPSIke3RlbXAuZm9sZGVyfS9saWIvbG9nZ2Vycy5qYXIuYmluIi8+Ci0JCTxkZWxldGUgZGlyPSIke2Rlc3RkaXJ9Ii8+Ci0JCTxta2RpciBkaXI9IiR7ZGVzdGRpcn0iLz4KLQkJPCEtLSBjb3B5IG5lY2Vzc2FyeSBjbGFzcyBmaWxlcyByZXNvdXJjZXMgLS0+Ci0JCTxjb3B5IHRvZGlyPSIke2Rlc3RkaXJ9Ij4KLQkJCTxmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9sb2dnZXJzX2Jpbi8iLz4KLQkJPC9jb3B5PgotCQk8bWtkaXIgZGlyPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L2xpYiIvPgotCQk8amFyIGRlc3RmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L2xpYi9sb2dnZXJzLmphciIgYmFzZWRpcj0iJHtkZXN0ZGlyfSIvPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlc2NyaXB0aW9uPSJEZWxldGVzIHByZXZpb3VzIGJ1aWxkIHJlbW5hbnRzIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGRlbGV0ZSBmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L2xpYi9sb2dnZXJzLmphciIvPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2J1aWxkZmlsZXMvYnVpbGRSZW1vdGUueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvYnVpbGRmaWxlcy9idWlsZFJlbW90ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMjJlNTguLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvYnVpbGRmaWxlcy9idWlsZFJlbW90ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgCi0gICAgIENvbnRyaWJ1dG9yczoKLSAgICAgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIC0tPgotCi08cHJvamVjdCBuYW1lPSJCdWlsZCBBbnQgcmVtb3RlIHN1cHBvcnQgSkFSIiBkZWZhdWx0PSJidWlsZCIgYmFzZWRpcj0iLi4iPgotCQotCTx0YXJnZXQgbmFtZT0iYnVpbGQiIGRlc2NyaXB0aW9uPSJDbGVhbnMsIGJ1aWxkcyBhbmQgcmVmcmVzaGVzIiBkZXBlbmRzPSJjbGVhbiwgbGliL3JlbW90ZWxpYi5qYXIiLz4KLQotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZW1wLmZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0vdGVtcC5mb2xkZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnJlc3VsdC5mb2xkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJsaWIvcmVtb3RlbGliLmphciIgZGVzY3JpcHRpb249ICJDcmVhdGVzIHRoZSByZW1vdGUuamFyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3RkaXIiIHZhbHVlPSIke3RlbXAuZm9sZGVyfS9saWIvcmVtb3RlLmphci5iaW4iLz4KLQkJPGRlbGV0ZSBkaXI9IiR7ZGVzdGRpcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHtkZXN0ZGlyfSIvPgotCQk8IS0tIGNvcHkgbmVjZXNzYXJ5IGNsYXNzIGZpbGVzIHJlc291cmNlcyAtLT4KLQkJPGNvcHkgdG9kaXI9IiR7ZGVzdGRpcn0iPgotCQkJPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9L3JlbW90ZV9iaW4iLz4KLQkJPC9jb3B5PgotCQk8bWtkaXIgZGlyPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L2xpYiIvPgotCQk8amFyIGRlc3RmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L2xpYi9yZW1vdGUuamFyIiBiYXNlZGlyPSIke2Rlc3RkaXJ9Ii8+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249IkRlbGV0ZXMgcHJldmlvdXMgYnVpbGQgcmVtbmFudHMiIGRlcGVuZHM9ImluaXQiPgotCQk8ZGVsZXRlIGZpbGU9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0vbGliL3JlbW90ZS5qYXIiLz4KLQkJPGRlbGV0ZSBkaXI9IiR7dGVtcC5mb2xkZXJ9Ii8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9jb21tb24vTUVUQS1JTkYvZWNsaXBzZS5pbmYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9jb21tb24vTUVUQS1JTkYvZWNsaXBzZS5pbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZGYzYWIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvY29tbW9uL01FVEEtSU5GL2VjbGlwc2UuaW5mCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotamFycHJvY2Vzc29yLmV4Y2x1ZGUuc2lnbj10cnVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvY29tbW9uL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvSURlYnVnQnVpbGRMb2dnZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2NvbW1vbi9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL0lEZWJ1Z0J1aWxkTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYjA2YzUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvY29tbW9uL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvSURlYnVnQnVpbGRMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5kZWJ1ZzsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElEZWJ1Z0J1aWxkTG9nZ2VyIHsKLQotCS8qKgotCSAqIFJlcXVlc3RzIHRvIHN1c3BlbmQgdGhlIGJ1aWxkIGlmIHRoZSBjdXJyZW50IGRlYnVnIHN0YXRlCi0JICogaW5kaWNhdGVzIHRoYXQgc3VzcGVuc2lvbiBpcyByZXF1aXJlZC4KLQkgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3YWl0SWZTdXNwZW5kZWQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9sb2dnZXJzL01FVEEtSU5GL2VjbGlwc2UuaW5mIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvbG9nZ2Vycy9NRVRBLUlORi9lY2xpcHNlLmluZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRkZjNhYi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9sb2dnZXJzL01FVEEtSU5GL2VjbGlwc2UuaW5mCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotamFycHJvY2Vzc29yLmV4Y2x1ZGUuc2lnbj10cnVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvbG9nZ2Vycy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3J1bnRpbWUvbG9nZ2VyL051bGxCdWlsZExvZ2dlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvbG9nZ2Vycy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3J1bnRpbWUvbG9nZ2VyL051bGxCdWlsZExvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDUwMjUwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2xvZ2dlcnMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9ydW50aW1lL2xvZ2dlci9OdWxsQnVpbGRMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5ydW50aW1lLmxvZ2dlcjsKLQotCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudFNlY3VyaXR5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLkFic3RyYWN0RWNsaXBzZUJ1aWxkTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIE51bGxCdWlsZExvZ2dlciBleHRlbmRzIEFic3RyYWN0RWNsaXBzZUJ1aWxkTG9nZ2VyIGltcGxlbWVudHMgQnVpbGRMb2dnZXJ7Ci0KLQlwcm90ZWN0ZWQgaW50IGZNZXNzYWdlT3V0cHV0TGV2ZWwgPSBQcm9qZWN0Lk1TR19JTkZPOwotCXByaXZhdGUgUHJpbnRTdHJlYW0gZkVycj0gbnVsbDsKLQlwcml2YXRlIFByaW50U3RyZWFtIGZPdXQ9IG51bGw7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZkVtYWNzTW9kZT0gZmFsc2U7Ci0JCi0JLyoqCi0JICogQW4gZXhjZXB0aW9uIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBsb2dnZWQuCi0JICovCi0JcHJvdGVjdGVkIFRocm93YWJsZSBmSGFuZGxlZEV4Y2VwdGlvbj0gbnVsbDsKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTG9nZ2VyI3NldE1lc3NhZ2VPdXRwdXRMZXZlbChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZU91dHB1dExldmVsKGludCBsZXZlbCkgewotCQlmTWVzc2FnZU91dHB1dExldmVsPSBsZXZlbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBnZXRNZXNzYWdlT3V0cHV0TGV2ZWwoKSB7Ci0JCXJldHVybiBmTWVzc2FnZU91dHB1dExldmVsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMb2dnZXIjc2V0RW1hY3NNb2RlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW1hY3NNb2RlKGJvb2xlYW4gZW1hY3NNb2RlKSB7Ci0JCWZFbWFjc01vZGU9IGVtYWNzTW9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjYnVpbGRTdGFydGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgYnVpbGRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjYnVpbGRGaW5pc2hlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewotCQlTdHJpbmcgbWVzc2FnZT0gaGFuZGxlRXhjZXB0aW9uKGV2ZW50KTsKLSAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9nTWVzc2FnZShtZXNzYWdlLCBnZXRNZXNzYWdlT3V0cHV0TGV2ZWwoKSk7Ci0gICAgICAgIH0KLQkJZkhhbmRsZWRFeGNlcHRpb249IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI3RhcmdldFN0YXJ0ZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjdGFyZ2V0RmluaXNoZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI3Rhc2tTdGFydGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGFza1N0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXNrRmluaXNoZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjbWVzc2FnZUxvZ2dlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCkgewotCQlsb2dNZXNzYWdlKGV2ZW50LmdldE1lc3NhZ2UoKSwgZXZlbnQuZ2V0UHJpb3JpdHkoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByaW50U3RyZWFtIGdldEVycm9yUHJpbnRTdHJlYW0oKSB7Ci0JCXJldHVybiBmRXJyOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJpbnRTdHJlYW0gZ2V0T3V0cHV0UHJpbnRTdHJlYW0oKSB7Ci0JCXJldHVybiBmT3V0OwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTG9nZ2VyI3NldEVycm9yUHJpbnRTdHJlYW0oamF2YS5pby5QcmludFN0cmVhbSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFcnJvclByaW50U3RyZWFtKFByaW50U3RyZWFtIGVycikgewotCQkvL3RoaXMgYnVpbGQgbG9nZ2VyIGxvZ3MgdG8gIm51bGwiIHVubGVzcwotCQkvL3RoZSB1c2VyIGhhcyBleHBsaWNpdGx5IHNldCBhIGxvZ2ZpbGUgdG8gdXNlCi0JCWlmIChlcnIgPT0gU3lzdGVtLmVycikgewotCQkJZkVycj0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCWZFcnI9IGVycjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMb2dnZXIjc2V0T3V0cHV0UHJpbnRTdHJlYW0oamF2YS5pby5QcmludFN0cmVhbSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdXRwdXRQcmludFN0cmVhbShQcmludFN0cmVhbSBvdXRwdXQpIHsKLQkJLy90aGlzIGJ1aWxkIGxvZ2dlciBsb2dzIHRvICJudWxsIiB1bmxlc3MKLQkJLy90aGUgdXNlciBoYXMgZXhwbGljaXRseSBzZXQgYSBsb2dmaWxlIHRvIHVzZQotCQlpZiAob3V0cHV0ID09IFN5c3RlbS5vdXQpIHsKLQkJCWZPdXQ9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlmT3V0PSBvdXRwdXQ7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbG9nTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IHByaW9yaXR5KSB7Ci0JCWlmIChwcmlvcml0eSA+IGdldE1lc3NhZ2VPdXRwdXRMZXZlbCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChwcmlvcml0eSA9PSBQcm9qZWN0Lk1TR19FUlIpIHsKLQkJCWlmIChnZXRFcnJvclByaW50U3RyZWFtKCkgIT0gbnVsbCAmJiBnZXRFcnJvclByaW50U3RyZWFtKCkgIT0gU3lzdGVtLmVycikgewotCQkJCS8vdXNlciBoYXMgZGVzaWduYXRlZCB0byBsb2cgdG8gYSBsb2dmaWxlCi0JCQkJZ2V0RXJyb3JQcmludFN0cmVhbSgpLnByaW50bG4obWVzc2FnZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0T3V0cHV0UHJpbnRTdHJlYW0oKSAhPSBudWxsICYmIGdldE91dHB1dFByaW50U3RyZWFtKCkgIT0gU3lzdGVtLm91dCkgewotCQkJCS8vdXNlciBoYXMgZGVzaWduYXRlZCB0byBsb2cgdG8gYSBsb2dmaWxlCi0JCQkJZ2V0T3V0cHV0UHJpbnRTdHJlYW0oKS5wcmludGxuKG1lc3NhZ2UpOwotCQkJfSAKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGhhbmRsZUV4Y2VwdGlvbihCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JCVRocm93YWJsZSBleGNlcHRpb24gPSBldmVudC5nZXRFeGNlcHRpb24oKTsKLQkJaWYgKGV4Y2VwdGlvbiA9PSBudWxsIHx8IGV4Y2VwdGlvbiA9PSBmSGFuZGxlZEV4Y2VwdGlvbgotCQl8fCBleGNlcHRpb24gaW5zdGFuY2VvZiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbgotCQl8fCBleGNlcHRpb24gaW5zdGFuY2VvZiBBbnRTZWN1cml0eUV4Y2VwdGlvbikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZkhhbmRsZWRFeGNlcHRpb249IGV4Y2VwdGlvbjsKLSAgICAgICAgU3RyaW5nQnVmZmVyIG1lc3NhZ2U9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApOwotICAgICAgICBtZXNzYWdlLmFwcGVuZChSdW50aW1lTWVzc2FnZXMuTnVsbEJ1aWxkTG9nZ2VyXzEpOwotICAgICAgICBtZXNzYWdlLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7Ci0gICAgICAgIGlmIChQcm9qZWN0Lk1TR19WRVJCT1NFIDw9IGZNZXNzYWdlT3V0cHV0TGV2ZWwgfHwgIShleGNlcHRpb24gaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbikpIHsKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKFN0cmluZ1V0aWxzLmdldFN0YWNrVHJhY2UoZXhjZXB0aW9uKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgQnVpbGRFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChleGNlcHRpb24udG9TdHJpbmcoKSkuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSkuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLQkJcmV0dXJuIG1lc3NhZ2UudG9TdHJpbmcoKTsJCi0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvbG9nZ2Vycy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3J1bnRpbWUvbG9nZ2VyL1J1bnRpbWVNZXNzYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvbG9nZ2Vycy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3J1bnRpbWUvbG9nZ2VyL1J1bnRpbWVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWRiNTU4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2xvZ2dlcnMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9ydW50aW1lL2xvZ2dlci9SdW50aW1lTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcucnVudGltZS5sb2dnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgUnVudGltZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5ydW50aW1lLmxvZ2dlci5SdW50aW1lTWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE51bGxCdWlsZExvZ2dlcl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFByb2Nlc3NCdWlsZExvZ2dlcl9Ub3RhbF90aW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFByb2Nlc3NCdWlsZExvZ2dlcl9fbWludXRlc18yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFByb2Nlc3NCdWlsZExvZ2dlcl9fbWludXRlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50UHJvY2Vzc0J1aWxkTG9nZ2VyX19zZWNvbmRzXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50UHJvY2Vzc0J1aWxkTG9nZ2VyX19zZWNvbmRfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRQcm9jZXNzQnVpbGRMb2dnZXJfX21pbGxpc2Vjb25kc182OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFByb2Nlc3NEZWJ1Z0J1aWxkTG9nZ2VyXzE7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgUnVudGltZU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvbG9nZ2Vycy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3J1bnRpbWUvbG9nZ2VyL1J1bnRpbWVNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvbG9nZ2Vycy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3J1bnRpbWUvbG9nZ2VyL1J1bnRpbWVNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzMxODhhLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL2xvZ2dlcnMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9ydW50aW1lL2xvZ2dlci9SdW50aW1lTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotTnVsbEJ1aWxkTG9nZ2VyXzE9QlVJTEQgRkFJTEVECi1BbnRQcm9jZXNzQnVpbGRMb2dnZXJfVG90YWxfdGltZT1Ub3RhbCB0aW1lOiAKLUFudFByb2Nlc3NCdWlsZExvZ2dlcl9fbWludXRlc18yPVwgbWludXRlcwotQW50UHJvY2Vzc0J1aWxkTG9nZ2VyX19taW51dGVfMz1cIG1pbnV0ZQotQW50UHJvY2Vzc0J1aWxkTG9nZ2VyX19zZWNvbmRzXzQ9XCBzZWNvbmRzCi1BbnRQcm9jZXNzQnVpbGRMb2dnZXJfX3NlY29uZF81PVwgc2Vjb25kCi1BbnRQcm9jZXNzQnVpbGRMb2dnZXJfX21pbGxpc2Vjb25kc182PVwgbWlsbGlzZWNvbmRzCi0KLUFudFByb2Nlc3NEZWJ1Z0J1aWxkTG9nZ2VyXzE9QnVpbGQgY2FuY2VsbGVkLgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvcGx1Z2luLnByb3BlcnRpZXMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwZmI0Zi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1BbnQgTGF1bmNoaW5nIFN1cHBvcnQKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi1BbnRCdWlsZCA9IEFudCBCdWlsZAotQW50TGF1bmNoRGVsZWdhdGUubmFtZT1FY2xpcHNlIEFudCBMYXVuY2hlcgotQW50TGF1bmNoRGVsZWdhdGUuZGVzY3JpcHRpb249VGhlIEVjbGlwc2UgQW50IExhdW5jaGVyIHN1cHBvcnRzIHJ1bm5pbmcgYW5kIGRlYnVnZ2luZyBBbnQgYnVpbGQgZmlsZXMuCi0KLUFudEJ1aWxkZXIubmFtZT1BbnQgQnVpbGRlcgotQW50QnVpbGRlckxhdW5jaERlbGVnYXRlLm5hbWU9IEVjbGlwc2UgQW50IEJ1aWxkZXIgTGF1bmNoZXIKLUFudEJ1aWxkZXJMYXVuY2hEZWxlZ2F0ZS5kZXNjcmlwdGlvbj1UaGUgRWNsaXBzZSBBbnQgQnVpbGRlciBMYXVuY2hlciBzdXBwb3J0cyBydW5uaW5nIEFudCBidWlsZCBmaWxlcy4KLQotYW50QnJlYWtwb2ludEdyb3VwTmFtZT0gQW50IEJyZWFrcG9pbnRzCi1BbnRMaW5lQnJlYWtwb2ludC5uYW1lID0gQW50IExpbmUgQnJlYWtwb2ludApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9NRVRBLUlORi9lY2xpcHNlLmluZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9NRVRBLUlORi9lY2xpcHNlLmluZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRkZjNhYi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUvTUVUQS1JTkYvZWNsaXBzZS5pbmYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1qYXJwcm9jZXNzb3IuZXhjbHVkZS5zaWduPXRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9yZW1vdGUvQW50U2VjdXJpdHlFeGNlcHRpb24uamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9BbnRTZWN1cml0eUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTRiMjQ4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9BbnRTZWN1cml0eUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcucmVtb3RlOwotCi0vKioKLSAqIEEgc2VjdXJpdHkgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIGJ5IHRoZSBBbnRTZWN1cml0eU1hbmFnZXIgaWYKLSAqIGFuIEFudCB0YXNrIGluIHNvbWUgd2F5IGF0dGVtcHRzIHRvIGhhbHQgb3IgZXhpdCB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUuCi0gKiAKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEFudFNlY3VyaXR5RXhjZXB0aW9uIGV4dGVuZHMgU2VjdXJpdHlFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9BbnRTZWN1cml0eU1hbmFnZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9BbnRTZWN1cml0eU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBmN2ViYi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9yZW1vdGUvQW50U2VjdXJpdHlNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcucmVtb3RlOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlNvY2tldFBlcm1pc3Npb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb247Ci0KLS8qKgotICogQSBzZWN1cml0eSBtYW5hZ2VyIHRoYXQgYWx3YXlzIHRocm93cyBhbiA8Y29kZT5BbnRTZWN1cml0eUV4Y2VwdGlvbjwvY29kZT4KLSAqIGlmIHRoZSBjYWxsaW5nIHRocmVhZCBhdHRlbXB0cyB0byBjYXVzZSB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgdG8gCi0gKiBleGl0L2hhbHQgb3IgaWYgdGhlIHJlc3RyaWN0ZWQgdGhyZWFkIGF0dGVtcHRzIHRvIHNldCBhIFN5c3RlbSBwcm9wZXJ0eS4KLSAqIE90aGVyd2lzZSB0aGlzIG1hbmFnZXIganVzdCBkZWxlZ2F0ZXMgdG8gdGhlIHByZS1leGlzdGluZyBtYW5hZ2VyCi0gKiBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIG9yIG1pbWljcyB0aGUgZGVmYXVsdCBzZWN1cml0eSBtYW5hZ2VyIGJlaGF2aW9yCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRTZWN1cml0eU1hbmFnZXIgZXh0ZW5kcyBTZWN1cml0eU1hbmFnZXIgewotCi0JcHJpdmF0ZSBTZWN1cml0eU1hbmFnZXIgZlNlY3VyaXR5TWFuYWdlcj0gbnVsbDsKLQlwcml2YXRlIFRocmVhZCBmUmVzdHJpY3RlZFRocmVhZD0gbnVsbDsKLQkvL2Vuc3VyZSB0aGF0IHRoZSBQcm9wZXJ0eVBlcm1pc3Npb24gY2xhc3MgaXMgbG9hZGVkIGJlZm9yZSB3ZSAKLQkvL3N0YXJ0IGNoZWNraW5nIHBlcm1pc3Npb25zOiBidWcgODU5MDgKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm9wZXJ0eVBlcm1pc3Npb24gZmdQcm9wZXJ0eVBlcm1pc3Npb249IG5ldyBQcm9wZXJ0eVBlcm1pc3Npb24oIioiLCAid3JpdGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCi0JcHJpdmF0ZSBib29sZWFuIGZBbGxvd1NldHRpbmdTeXN0ZW1Qcm9wZXJ0aWVzPSB0cnVlOwotCQotCXB1YmxpYyBBbnRTZWN1cml0eU1hbmFnZXIoU2VjdXJpdHlNYW5hZ2VyIHNlY3VyaXR5TWFuYWdlciwgVGhyZWFkIHJlc3RyaWN0ZWRUaHJlYWQsIGJvb2xlYW4gYWxsb3dTZXR0aW5nUHJvcGVydGllcykgewotCQlmU2VjdXJpdHlNYW5hZ2VyPSBzZWN1cml0eU1hbmFnZXI7Ci0JCWZSZXN0cmljdGVkVGhyZWFkPSByZXN0cmljdGVkVGhyZWFkOwotCQlmQWxsb3dTZXR0aW5nU3lzdGVtUHJvcGVydGllcz0gYWxsb3dTZXR0aW5nUHJvcGVydGllczsKLQl9Ci0JCi0JcHVibGljIEFudFNlY3VyaXR5TWFuYWdlcihTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHlNYW5hZ2VyLCBUaHJlYWQgcmVzdHJpY3RlZFRocmVhZCkgewotCQl0aGlzKHNlY3VyaXR5TWFuYWdlciwgcmVzdHJpY3RlZFRocmVhZCwgdHJ1ZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tFeGl0KGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja0V4aXQoaW50IHN0YXR1cykgewotCQkvL25vIGV4aXQgYWxsb3dlZCBmcm9tIHRoZSByZXN0cmljdGVkIHRocmVhZC4uLlN5c3RlbS5leGl0IGlzIGJlaW5nIGNhbGxlZAotCQkvL2J5IHNvbWUgYW50IHRhc2suLi5kaXNhbGxvdyB0aGUgZXhpdAotCQlpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSA9PSBmUmVzdHJpY3RlZFRocmVhZCkgewotCQkJdGhyb3cgbmV3IEFudFNlY3VyaXR5RXhjZXB0aW9uKCk7Ci0JCX0KLQkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja0V4aXQoc3RhdHVzKTsKLQkJfQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrQWNjZXB0KGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja0FjY2VwdChTdHJpbmcgaG9zdCwgaW50IHBvcnQpIHsKLQkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja0FjY2VwdChob3N0LCBwb3J0KTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tBY2Nlc3MoamF2YS5sYW5nLlRocmVhZCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja0FjY2VzcyhUaHJlYWQgdCkgewotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrQWNjZXNzKHQpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0FjY2VzcyhqYXZhLmxhbmcuVGhyZWFkR3JvdXApCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tBY2Nlc3MoVGhyZWFkR3JvdXAgZykgewotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrQWNjZXNzKGcpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0F3dEV2ZW50UXVldWVBY2Nlc3MoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrQXd0RXZlbnRRdWV1ZUFjY2VzcygpIHsKLQkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja0F3dEV2ZW50UXVldWVBY2Nlc3MoKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tDb25uZWN0KGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja0Nvbm5lY3QoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBPYmplY3QgY29udGV4dCkgewotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrQ29ubmVjdChob3N0LCBwb3J0LCBjb250ZXh0KTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tDb25uZWN0KGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja0Nvbm5lY3QoU3RyaW5nIGhvc3QsIGludCBwb3J0KSB7Ci0JCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tDb25uZWN0KGhvc3QsIHBvcnQpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0NyZWF0ZUNsYXNzTG9hZGVyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja0NyZWF0ZUNsYXNzTG9hZGVyKCkgewotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrQ3JlYXRlQ2xhc3NMb2FkZXIoKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tEZWxldGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja0RlbGV0ZShTdHJpbmcgZmlsZSkgewotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrRGVsZXRlKGZpbGUpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0V4ZWMoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja0V4ZWMoU3RyaW5nIGNtZCkgewotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrRXhlYyhjbWQpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0xpbmsoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja0xpbmsoU3RyaW5nIGxpYikgewotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrTGluayhsaWIpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja0xpc3RlbihpbnQpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tMaXN0ZW4oaW50IHBvcnQpIHsKLQkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja0xpc3Rlbihwb3J0KTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tNZW1iZXJBY2Nlc3MoamF2YS5sYW5nLkNsYXNzLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tNZW1iZXJBY2Nlc3MoQ2xhc3MgY2xhenosIGludCB3aGljaCkgewotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrTWVtYmVyQWNjZXNzKGNsYXp6LCB3aGljaCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tNdWx0aWNhc3QoamF2YS5uZXQuSW5ldEFkZHJlc3MsIGJ5dGUpCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja011bHRpY2FzdChJbmV0QWRkcmVzcyBtYWRkciwgYnl0ZSB0dGwpIHsKLQkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nIGhvc3QgPSBtYWRkci5nZXRIb3N0QWRkcmVzcygpOwotCQkJaWYgKCFob3N0LnN0YXJ0c1dpdGgoIlsiKSAmJiBob3N0LmluZGV4T2YoJzonKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0JICAgCQkJaG9zdCA9ICJbIiArIGhvc3QgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCSAgICAJY2hlY2tQZXJtaXNzaW9uKG5ldyBTb2NrZXRQZXJtaXNzaW9uKGhvc3QsICJhY2NlcHQsY29ubmVjdCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja011bHRpY2FzdChqYXZhLm5ldC5JbmV0QWRkcmVzcykKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja011bHRpY2FzdChJbmV0QWRkcmVzcyBtYWRkcikgewotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrTXVsdGljYXN0KG1hZGRyKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tQYWNrYWdlQWNjZXNzKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tQYWNrYWdlQWNjZXNzKFN0cmluZyBwa2cpIHsKLQkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja1BhY2thZ2VBY2Nlc3MocGtnKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tQYWNrYWdlRGVmaW5pdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrUGFja2FnZURlZmluaXRpb24oU3RyaW5nIHBrZykgewotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrUGFja2FnZURlZmluaXRpb24ocGtnKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tQZXJtaXNzaW9uKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbiwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1Blcm1pc3Npb24oUGVybWlzc2lvbiBwZXJtLCBPYmplY3QgY29udGV4dCkgewotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrUGVybWlzc2lvbihwZXJtLCBjb250ZXh0KTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tQZXJtaXNzaW9uKGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1Blcm1pc3Npb24oUGVybWlzc2lvbiBwZXJtKSB7Ci0JCWlmICghZkFsbG93U2V0dGluZ1N5c3RlbVByb3BlcnRpZXMgJiYgZmdQcm9wZXJ0eVBlcm1pc3Npb24uaW1wbGllcyhwZXJtKSAmJiBmUmVzdHJpY3RlZFRocmVhZCA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7Ci0JCQkvL2F0dGVtcHRpbmcgdG8gd3JpdGUgYSBzeXN0ZW0gcHJvcGVydHkKLQkJCXRocm93IG5ldyBBbnRTZWN1cml0eUV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tQZXJtaXNzaW9uKHBlcm0pOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1ByaW50Sm9iQWNjZXNzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1ByaW50Sm9iQWNjZXNzKCkgewotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrUHJpbnRKb2JBY2Nlc3MoKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tQcm9wZXJ0aWVzQWNjZXNzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1Byb3BlcnRpZXNBY2Nlc3MoKSB7Ci0JCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tQcm9wZXJ0aWVzQWNjZXNzKCk7Ci0JCX0KLQkJc3VwZXIuY2hlY2tQcm9wZXJ0aWVzQWNjZXNzKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1Byb3BlcnR5QWNjZXNzKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tQcm9wZXJ0eUFjY2VzcyhTdHJpbmcga2V5KSB7Ci0JCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tQcm9wZXJ0eUFjY2VzcyhrZXkpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1JlYWQoamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1JlYWQoRmlsZURlc2NyaXB0b3IgZmQpIHsKLQkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja1JlYWQoZmQpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1JlYWQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1JlYWQoU3RyaW5nIGZpbGUsIE9iamVjdCBjb250ZXh0KSB7Ci0JCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tSZWFkKGZpbGUsIGNvbnRleHQpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1JlYWQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1JlYWQoU3RyaW5nIGZpbGUpIHsKLQkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja1JlYWQoZmlsZSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrU2VjdXJpdHlBY2Nlc3MoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1NlY3VyaXR5QWNjZXNzKFN0cmluZyB0YXJnZXQpIHsKLQkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlNlY3VyaXR5TWFuYWdlci5jaGVja1NlY3VyaXR5QWNjZXNzKHRhcmdldCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrU2V0RmFjdG9yeSgpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tTZXRGYWN0b3J5KCkgewotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmU2VjdXJpdHlNYW5hZ2VyLmNoZWNrU2V0RmFjdG9yeSgpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNjaGVja1N5c3RlbUNsaXBib2FyZEFjY2VzcygpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tTeXN0ZW1DbGlwYm9hcmRBY2Nlc3MoKSB7Ci0JCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tTeXN0ZW1DbGlwYm9hcmRBY2Nlc3MoKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjY2hlY2tUb3BMZXZlbFdpbmRvdyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNoZWNrVG9wTGV2ZWxXaW5kb3coT2JqZWN0IHdpbmRvdykgewotCQlpZiAoZlNlY3VyaXR5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZlNlY3VyaXR5TWFuYWdlci5jaGVja1RvcExldmVsV2luZG93KHdpbmRvdyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNoZWNrVG9wTGV2ZWxXaW5kb3cod2luZG93KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrV3JpdGUoamF2YS5pby5GaWxlRGVzY3JpcHRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1dyaXRlKEZpbGVEZXNjcmlwdG9yIGZkKSB7Ci0JCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tXcml0ZShmZCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyI2NoZWNrV3JpdGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1dyaXRlKFN0cmluZyBmaWxlKSB7Ci0JCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZTZWN1cml0eU1hbmFnZXIuY2hlY2tXcml0ZShmaWxlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciNnZXRJbkNoZWNrKCkKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEluQ2hlY2soKSB7Ci0JCWlmIChmU2VjdXJpdHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXJldHVybiBmU2VjdXJpdHlNYW5hZ2VyLmdldEluQ2hlY2soKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0SW5DaGVjaygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjZ2V0U2VjdXJpdHlDb250ZXh0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFNlY3VyaXR5Q29udGV4dCgpIHsKLQkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZTZWN1cml0eU1hbmFnZXIuZ2V0U2VjdXJpdHlDb250ZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFNlY3VyaXR5Q29udGV4dCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5TZWN1cml0eU1hbmFnZXIjZ2V0VGhyZWFkR3JvdXAoKQotCSAqLwotCXB1YmxpYyBUaHJlYWRHcm91cCBnZXRUaHJlYWRHcm91cCgpIHsKLQkJaWYgKGZTZWN1cml0eU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlNlY3VyaXR5TWFuYWdlci5nZXRUaHJlYWRHcm91cCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRUaHJlYWRHcm91cCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9EZW11eElucHV0U3RyZWFtU2V0dGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9yZW1vdGUvRGVtdXhJbnB1dFN0cmVhbVNldHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTExNjExLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9EZW11eElucHV0U3RyZWFtU2V0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5yZW1vdGU7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRlbXV4SW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGV4aXN0cyBzbyB0aGF0IHRoZSBBbnQgaW50ZWdyYXRpb24gaGFzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ci0gKiB3aXRoIEFudCByZWxlYXNlcyBwcmV2aW91cyB0byAxLjYuIERlbXV4SW5wdXRTdHJlYW0gaXMgYSBuZXcgY2xhc3MgdG8gQW50IDEuNi4KLSAqLwotY2xhc3MgRGVtdXhJbnB1dFN0cmVhbVNldHRlciB7Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1hcFN5c3RlbUluKFByb2plY3QgcHJvamVjdCkgewotCQlTeXN0ZW0uc2V0SW4obmV3IERlbXV4SW5wdXRTdHJlYW0ocHJvamVjdCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9FY2xpcHNlRGVmYXVsdEV4ZWN1dG9yLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9yZW1vdGUvRWNsaXBzZURlZmF1bHRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yjg2ZjVkLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9FY2xpcHNlRGVmYXVsdEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5yZW1vdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5FeGVjdXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmhlbHBlci5EZWZhdWx0RXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlRGVmYXVsdEV4ZWN1dG9yIGV4dGVuZHMgRGVmYXVsdEV4ZWN1dG9yIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEVjbGlwc2VTaW5nbGVDaGVja0V4ZWN1dG9yIFNVQl9FWEVDVVRPUiA9IG5ldyBFY2xpcHNlU2luZ2xlQ2hlY2tFeGVjdXRvcigpOwotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkV4ZWN1dG9yI2V4ZWN1dGVUYXJnZXRzKG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QsIGphdmEubGFuZy5TdHJpbmdbXSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlVGFyZ2V0cyhQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIHRhcmdldE5hbWVzKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBWZWN0b3Igdj0gbmV3IFZlY3RvcigpOwotICAgICAgICB2LmFkZEFsbChBcnJheXMuYXNMaXN0KHRhcmdldE5hbWVzKSk7Ci0gICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJlY2xpcHNlLmFudC50YXJnZXRWZWN0b3IiLCB2KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzdXBlci5leGVjdXRlVGFyZ2V0cyhwcm9qZWN0LCB0YXJnZXROYW1lcyk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkV4ZWN1dG9yI2dldFN1YlByb2plY3RFeGVjdXRvcigpCi0gICAgICovCi0gICAgcHVibGljIEV4ZWN1dG9yIGdldFN1YlByb2plY3RFeGVjdXRvcigpIHsKLSAgICAgICByZXR1cm4gU1VCX0VYRUNVVE9SOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9FY2xpcHNlU2luZ2xlQ2hlY2tFeGVjdXRvci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvcmVtb3RlL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVtb3RlL0VjbGlwc2VTaW5nbGVDaGVja0V4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZGRkNGYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvcmVtb3RlL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVtb3RlL0VjbGlwc2VTaW5nbGVDaGVja0V4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5yZW1vdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5FeGVjdXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmhlbHBlci5TaW5nbGVDaGVja0V4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZVNpbmdsZUNoZWNrRXhlY3V0b3IgZXh0ZW5kcyBTaW5nbGVDaGVja0V4ZWN1dG9yIHsKLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkV4ZWN1dG9yI2V4ZWN1dGVUYXJnZXRzKG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QsIGphdmEubGFuZy5TdHJpbmdbXSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlVGFyZ2V0cyhQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIHRhcmdldE5hbWVzKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBWZWN0b3Igdj0gbmV3IFZlY3RvcigpOwotICAgICAgICB2LmFkZEFsbChBcnJheXMuYXNMaXN0KHRhcmdldE5hbWVzKSk7Ci0gICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJlY2xpcHNlLmFudC50YXJnZXRWZWN0b3IiLCB2KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzdXBlci5leGVjdXRlVGFyZ2V0cyhwcm9qZWN0LCB0YXJnZXROYW1lcyk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkV4ZWN1dG9yI2dldFN1YlByb2plY3RFeGVjdXRvcigpCi0gICAgICovCi0gICAgcHVibGljIEV4ZWN1dG9yIGdldFN1YlByb2plY3RFeGVjdXRvcigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvcmVtb3RlL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVtb3RlL0V4ZWN1dG9yU2V0dGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9yZW1vdGUvRXhlY3V0b3JTZXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ5YWJhNS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9yZW1vdGUvRXhlY3V0b3JTZXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLnJlbW90ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkV4ZWN1dG9yOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBleGlzdHMgc28gdGhhdCB0aGUgQW50IGludGVncmF0aW9uIGhhcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQotICogd2l0aCBBbnQgcmVsZWFzZXMgcHJldmlvdXMgdG8gMS42LjMuIEV4ZWN1dG9ycyBhcmUgYSBuZXcgZmVhdHVyZSBvZiBBbnQgMS42LjMuCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGVjdXRvclNldHRlciB7Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRFeGVjdXRvcihQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3I9IG5ldyBFY2xpcHNlRGVmYXVsdEV4ZWN1dG9yKCk7Ci0gICAgICAgIHByb2plY3Quc2V0RXhlY3V0b3IoZXhlY3V0b3IpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9JbnB1dEhhbmRsZXJTZXR0ZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9JbnB1dEhhbmRsZXJTZXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFiZGQxZi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9yZW1vdGUvSW5wdXRIYW5kbGVyU2V0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5yZW1vdGU7Ci0KLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OyAvLyBjYW4ndCB1c2UgSUNVLCB1c2VkIGJ5IGFudAotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5EZWZhdWx0SW5wdXRIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LklucHV0SGFuZGxlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGV4aXN0cyBzbyB0aGF0IHRoZSBBbnQgaW50ZWdyYXRpb24gaGFzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ci0gKiB3aXRoIEFudCByZWxlYXNlcyBwcmV2aW91cyB0byAxLjUuIElucHV0SGFuZGxlcnMgYXJlIGEgbmV3IGZlYXR1cmUgb2YgQW50IDEuNS4KLSAqLwotY2xhc3MgSW5wdXRIYW5kbGVyU2V0dGVyIHsKLQotCXByb3RlY3RlZCB2b2lkIHNldElucHV0SGFuZGxlcihQcm9qZWN0IHByb2plY3QsIFN0cmluZyBpbnB1dEhhbmRsZXJDbGFzc25hbWUpIHsKLQkJSW5wdXRIYW5kbGVyIGhhbmRsZXIgPSBudWxsOwotCQlpZiAoaW5wdXRIYW5kbGVyQ2xhc3NuYW1lID09IG51bGwpIHsKLQkJCWhhbmRsZXIgPSBuZXcgRGVmYXVsdElucHV0SGFuZGxlcigpOwotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQloYW5kbGVyID0gKElucHV0SGFuZGxlcikoQ2xhc3MuZm9yTmFtZShpbnB1dEhhbmRsZXJDbGFzc25hbWUpLm5ld0luc3RhbmNlKCkpOwotCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoUmVtb3RlQW50TWVzc2FnZXMuZ2V0U3RyaW5nKCJJbnRlcm5hbEFudFJ1bm5lci5UaGVfc3BlY2lmaWVkX2lucHV0X2hhbmRsZXJfY2xhc3NfezB9X2RvZXNfbm90X2ltcGxlbWVudF90aGVfb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuSW5wdXRIYW5kbGVyX2ludGVyZmFjZV81IiksIG5ldyBTdHJpbmdbXXtpbnB1dEhhbmRsZXJDbGFzc25hbWV9KTsgLy8kTk9OLU5MUy0xJAotCQkJCXRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGUpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoUmVtb3RlQW50TWVzc2FnZXMuZ2V0U3RyaW5nKCJJbnRlcm5hbEFudFJ1bm5lci5VbmFibGVfdG9faW5zdGFudGlhdGVfc3BlY2lmaWVkX2lucHV0X2hhbmRsZXJfY2xhc3NfezB9X19fezF9XzYiKSwgbmV3IFN0cmluZ1tde2lucHV0SGFuZGxlckNsYXNzbmFtZSwgZS5nZXRDbGFzcygpLmdldE5hbWUoKX0pOyAvLyROT04tTkxTLTEkCi0JCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZSk7Ci0JCQl9Ci0JCX0KLQkJcHJvamVjdC5zZXRJbnB1dEhhbmRsZXIoaGFuZGxlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvcmVtb3RlL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVtb3RlL1JlbW90ZUFudE1lc3NhZ2VzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9yZW1vdGUvUmVtb3RlQW50TWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNiOTI3ZS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9yZW1vdGUvUmVtb3RlQW50TWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLnJlbW90ZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdGVBbnRNZXNzYWdlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5yZW1vdGUuUmVtb3RlQW50TWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBSZW1vdGVBbnRNZXNzYWdlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9yZW1vdGUvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9yZW1vdGUvUmVtb3RlQW50TWVzc2FnZXMucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9SZW1vdGVBbnRNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGM3MzMyLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9SZW1vdGVBbnRNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1JbnRlcm5hbEFudFJ1bm5lci5CdWlsZF9maWxlX197MH1fMT1CdWlsZGZpbGU6IHswfQotSW50ZXJuYWxBbnRSdW5uZXIuQXJndW1lbnRzX197MH1fMj1Bcmd1bWVudHM6IHswfQotSW50ZXJuYWxBbnRSdW5uZXIuRGVmYXVsdF90YXJnZXRfXzM9RGVmYXVsdCB0YXJnZXQ6Ci1JbnRlcm5hbEFudFJ1bm5lci5NYWluX3RhcmdldHNfXzQ9TWFpbiB0YXJnZXRzOgotSW50ZXJuYWxBbnRSdW5uZXIuU3VidGFyZ2V0c19fNT1TdWJ0YXJnZXRzOgotSW50ZXJuYWxBbnRSdW5uZXIuVW5hYmxlX3RvX2luc3RhbnRpYXRlX2xvZ2dlcl9fezB9XzY9VW5hYmxlIHRvIGluc3RhbnRpYXRlIGxvZ2dlcjogezB9Ci1JbnRlcm5hbEFudFJ1bm5lci5Db3VsZF9ub3RfbG9hZF90aGVfdmVyc2lvbl9pbmZvcm1hdGlvbi5fezB9Xzk9Q291bGQgbm90IGxvYWQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24uIHswfQotSW50ZXJuYWxBbnRSdW5uZXIuQ291bGRfbm90X2xvYWRfdGhlX3ZlcnNpb25faW5mb3JtYXRpb24uXzEwPUNvdWxkIG5vdCBsb2FkIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uLgotSW50ZXJuYWxBbnRSdW5uZXIub3B0aW9uc18xMz1vcHRpb25zCi1JbnRlcm5hbEFudFJ1bm5lci50YXJnZXRfMTU9dGFyZ2V0Ci1JbnRlcm5hbEFudFJ1bm5lci5PcHRpb25zX19fMjE9T3B0aW9uczogCi1JbnRlcm5hbEFudFJ1bm5lci5wcmludF90aGlzX21lc3NhZ2VfMjM9cHJpbnQgdGhpcyBtZXNzYWdlCi1JbnRlcm5hbEFudFJ1bm5lci5wcmludF9wcm9qZWN0X2hlbHBfaW5mb3JtYXRpb25fMjU9cHJpbnQgcHJvamVjdCBoZWxwIGluZm9ybWF0aW9uCi1JbnRlcm5hbEFudFJ1bm5lci5wcmludF90aGVfdmVyc2lvbl9pbmZvcm1hdGlvbl9hbmRfZXhpdF8yNz1wcmludCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAotSW50ZXJuYWxBbnRSdW5uZXIuYmVfZXh0cmFfcXVpZXRfMjk9YmUgZXh0cmEgcXVpZXQKLUludGVybmFsQW50UnVubmVyLmJlX2V4dHJhX3ZlcmJvc2VfMzE9YmUgZXh0cmEgdmVyYm9zZQotSW50ZXJuYWxBbnRSdW5uZXIucHJpbnRfZGVidWdnaW5nX2luZm9ybWF0aW9uXzMzPXByaW50IGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotSW50ZXJuYWxBbnRSdW5uZXIucHJvZHVjZV9sb2dnaW5nX2luZm9ybWF0aW9uX3dpdGhvdXRfYWRvcm5tZW50c18zNT1wcm9kdWNlIGxvZ2dpbmcgaW5mb3JtYXRpb24gd2l0aG91dCBhZG9ybm1lbnRzCi1JbnRlcm5hbEFudFJ1bm5lci51c2VfZ2l2ZW5fZmlsZV9mb3JfbG9nXzM3PXVzZSBnaXZlbiBmaWxlIGZvciBsb2cKLUludGVybmFsQW50UnVubmVyLnRoZV9jbGFzc193aGljaF9pc190b19wZXJmb3JtX2xvZ2dpbmdfMzk9dGhlIGNsYXNzIHdoaWNoIGlzIHRvIHBlcmZvcm0gbG9nZ2luZwotSW50ZXJuYWxBbnRSdW5uZXIuYWRkX2FuX2luc3RhbmNlX29mX2NsYXNzX2FzX2FfcHJvamVjdF9saXN0ZW5lcl80MT1hZGQgYW4gaW5zdGFuY2Ugb2YgY2xhc3MgYXMgYSBwcm9qZWN0IGxpc3RlbmVyCi1JbnRlcm5hbEFudFJ1bm5lci51c2VfZ2l2ZW5fYnVpbGRmaWxlXzQzPXVzZSBnaXZlbiBidWlsZGZpbGUKLUludGVybmFsQW50UnVubmVyLnVzZV92YWx1ZV9mb3JfZ2l2ZW5fcHJvcGVydHlfNDU9dXNlIHZhbHVlIGZvciBnaXZlbiBwcm9wZXJ0eQotSW50ZXJuYWxBbnRSdW5uZXIuVXNpbmdfezB9X2ZpbGVfYXNfYnVpbGRfbG9nLl8xPVVzaW5nIHswfSBmaWxlIGFzIGJ1aWxkIGxvZy4KLUludGVybmFsQW50UnVubmVyLkNvdWxkX25vdF93cml0ZV90b190aGVfc3BlY2lmaWVkX2xvZ19maWxlX197MH0uX01ha2Vfc3VyZV90aGVfcGF0aF9leGlzdHNfYW5kX3lvdV9oYXZlX3dyaXRlX3Blcm1pc3Npb25zLl8yPUNhbm5vdCB3cml0ZSBvbiB0aGUgc3BlY2lmaWVkIGxvZyBmaWxlOiB7MH0uIE1ha2Ugc3VyZSB0aGUgcGF0aCBleGlzdHMgYW5kIHlvdSBoYXZlIHdyaXRlIHBlcm1pc3Npb25zLgotSW50ZXJuYWxBbnRSdW5uZXIuQlVJTERfU1VDQ0VTU0ZVTF8xPUJVSUxEIFNVQ0NFU1NGVUwKLUludGVybmFsQW50UnVubmVyLlVua25vd25fYXJndW1lbnRfX3swfV8yPVVua25vd24gYXJndW1lbnQ6IHswfQotSW50ZXJuYWxBbnRSdW5uZXIuQnVpbGRmaWxlX197MH1fZG9lc19ub3RfZXhpc3RfIV8xPUJ1aWxkZmlsZTogezB9IGRvZXMgbm90IGV4aXN0Ci1JbnRlcm5hbEFudFJ1bm5lci57MH1fd2hpY2hfd2FzX3NwZWNpZmllZF90b19iZV9hX2J1aWxkX2xpc3RlbmVyX2lzX25vdF9hbl9pbnN0YW5jZV9vZl9vcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyLl8xPXswfSB3aGljaCB3YXMgc3BlY2lmaWVkIHRvIGJlIGEgYnVpbGQgbGlzdGVuZXIgaXMgbm90IGFuIGluc3RhbmNlIG9mIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIuCi1JbnRlcm5hbEFudFJ1bm5lci57MH1fd2hpY2hfd2FzX3NwZWNpZmllZF90b19wZXJmb3JtX2xvZ2dpbmdfaXNfbm90X2FuX2luc3RhbmNlX29mX29yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTG9nZ2VyLl8yPXswfSB3aGljaCB3YXMgc3BlY2lmaWVkIHRvIHBlcmZvcm0gbG9nZ2luZyBpcyBub3QgYW4gaW5zdGFuY2Ugb2Ygb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMb2dnZXIuCi1JbnRlcm5hbEFudFJ1bm5lci5Zb3VfbXVzdF9zcGVjaWZ5X2FfY2xhc3NuYW1lX3doZW5fdXNpbmdfdGhlXy1saXN0ZW5lcl9hcmd1bWVudF8xPVlvdSBtdXN0IHNwZWNpZnkgYSBjbGFzc25hbWUgd2hlbiB1c2luZyB0aGUgLWxpc3RlbmVyIGFyZ3VtZW50Ci1JbnRlcm5hbEFudFJ1bm5lci5Zb3VfbXVzdF9zcGVjaWZ5X2FfbG9nX2ZpbGVfd2hlbl91c2luZ190aGVfLWxvZ19hcmd1bWVudF8zPVlvdSBtdXN0IHNwZWNpZnkgYSBsb2cgZmlsZSB3aGVuIHVzaW5nIHRoZSAtbG9nIGFyZ3VtZW50Ci1JbnRlcm5hbEFudFJ1bm5lci5Zb3VfbXVzdF9zcGVjaWZ5X2FfYnVpbGRmaWxlX3doZW5fdXNpbmdfdGhlXy1idWlsZGZpbGVfYXJndW1lbnRfND1Zb3UgbXVzdCBzcGVjaWZ5IGEgYnVpbGRmaWxlIHdoZW4gdXNpbmcgdGhlIC1idWlsZGZpbGUgYXJndW1lbnQKLUludGVybmFsQW50UnVubmVyLjEyPXByaW50IGluZm9ybWF0aW9uIHRoYXQgbWlnaHQgYmUgaGVscGZ1bCB0bwotSW50ZXJuYWxBbnRSdW5uZXIuMTM9XHRcdFx0XHRcdFx0XHRkaWFnbm9zZSBvciByZXBvcnQgcHJvYmxlbXMuCi1JbnRlcm5hbEFudFJ1bm5lci4xOT1sb2FkIGFsbCBwcm9wZXJ0aWVzIGZyb20gZmlsZSB3aXRoIC1ECi1JbnRlcm5hbEFudFJ1bm5lci4yMD1cdFx0XHRcdFx0XHRcdHByb3BlcnRpZXMgdGFraW5nIHByZWNlZGVuY2UKLUludGVybmFsQW50UnVubmVyLjIyPXRoZSBjbGFzcyB3aGljaCB3aWxsIGhhbmRsZSBpbnB1dCByZXF1ZXN0cwotSW50ZXJuYWxBbnRSdW5uZXIuMT1cdFx0XHRcdFwnCi1JbnRlcm5hbEFudFJ1bm5lci5Pbmx5X29uZV9sb2dnZXJfY2xhc3NfbWF5X2JlX3NwZWNpZmllZF8xPU9ubHkgb25lIGxvZ2dlciBjbGFzcyBtYXkgYmUgc3BlY2lmaWVkCi1JbnRlcm5hbEFudFJ1bm5lci5Zb3VfbXVzdF9zcGVjaWZ5X2FfY2xhc3NuYW1lX3doZW5fdXNpbmdfdGhlXy1pbnB1dGhhbmRsZXJfYXJndW1lbnRfMT1Zb3UgbXVzdCBzcGVjaWZ5IGEgY2xhc3NuYW1lIHdoZW4gdXNpbmcgdGhlIC1pbnB1dGhhbmRsZXIgYXJndW1lbnQKLUludGVybmFsQW50UnVubmVyLk9ubHlfb25lX2lucHV0X2hhbmRsZXJfY2xhc3NfbWF5X2JlX3NwZWNpZmllZC5fMj1Pbmx5IG9uZSBpbnB1dCBoYW5kbGVyIGNsYXNzIG1heSBiZSBzcGVjaWZpZWQuCi1JbnRlcm5hbEFudFJ1bm5lci5Zb3VfbXVzdF9zcGVjaWZ5X2FfcHJvcGVydHlfZmlsZW5hbWVfd2hlbl91c2luZ190aGVfLXByb3BlcnR5ZmlsZV9hcmd1bWVudF8zPVlvdSBtdXN0IHNwZWNpZnkgYSBwcm9wZXJ0eSBmaWxlbmFtZSB3aGVuIHVzaW5nIHRoZSAtcHJvcGVydHlmaWxlIGFyZ3VtZW50Ci1JbnRlcm5hbEFudFJ1bm5lci5Db3VsZF9ub3RfbG9hZF9wcm9wZXJ0eV9maWxlX3swfV9fezF9XzQ9Q291bGQgbm90IGxvYWQgcHJvcGVydHkgZmlsZSB7MH06IHsxfQotSW50ZXJuYWxBbnRSdW5uZXIuVGhlX3NwZWNpZmllZF9pbnB1dF9oYW5kbGVyX2NsYXNzX3swfV9kb2VzX25vdF9pbXBsZW1lbnRfdGhlX29yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LklucHV0SGFuZGxlcl9pbnRlcmZhY2VfNT1UaGUgc3BlY2lmaWVkIGlucHV0IGhhbmRsZXIgY2xhc3MgezB9IGRvZXMgbm90IGltcGxlbWVudCB0aGUgb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuSW5wdXRIYW5kbGVyIGludGVyZmFjZQotSW50ZXJuYWxBbnRSdW5uZXIuVW5hYmxlX3RvX2luc3RhbnRpYXRlX3NwZWNpZmllZF9pbnB1dF9oYW5kbGVyX2NsYXNzX3swfV9fX3sxfV82PVVuYWJsZSB0byBpbnN0YW50aWF0ZSBzcGVjaWZpZWQgaW5wdXQgaGFuZGxlciBjbGFzcyB7MH0gOiB7MX0KLUludGVybmFsQW50UnVubmVyLlRoZV9kaWFnbm9zaXRpY3Nfb3B0aW9uc19pc19hbl9BbnRfMS41LipfZmVhdHVyZS5fUGxlYXNlX3VwZGF0ZV95b3VyX0FudF9jbGFzc3BhdGhfdG9faW5jbHVkZV9hbl9BbnRfdmVyc2lvbl9ncmVhdGVyX3RoYW5fdGhpcy5fND1UaGUgZGlhZ25vc3RpY3Mgb3B0aW9ucyBpcyBhbiBBbnQgMS41LiogZmVhdHVyZS4gUGxlYXNlIHVwZGF0ZSB5b3VyIEFudCBjbGFzc3BhdGggdG8gaW5jbHVkZSBhbiBBbnQgdmVyc2lvbiBncmVhdGVyIHRoYW4gdGhpcy4KLUludGVybmFsQW50UnVubmVyLlNwZWNpZnlpbmdfcHJvcGVydHlfZmlsZXNfaXNfYV9BbnRfMS41LipfZmVhdHVyZS5fUGxlYXNlX3VwZGF0ZV95b3VyX0FudF9jbGFzc3BhdGguXzY9U3BlY2lmeWluZyBwcm9wZXJ0eSBmaWxlcyBpcyBhIEFudCAxLjUuKiBmZWF0dXJlLiBQbGVhc2UgdXBkYXRlIHlvdXIgQW50IGNsYXNzcGF0aCB0byBpbmNsdWRlIGFuIEFudCB2ZXJzaW9uIGdyZWF0ZXIgdGhhbiB0aGlzLgotSW50ZXJuYWxBbnRSdW5uZXIuQU5UX0hPTUVfbXVzdF9iZV9zZXRfdG9fdXNlX0FudF9kaWFnbm9zdGljc18yPUFOVF9IT01FIG11c3QgYmUgc2V0IHRvIHVzZSBBbnQgZGlhZ25vc3RpY3MKLUludGVybmFsQW50UnVubmVyLkJ1aWxkZmlsZV9fezB9X2lzX25vdF9hX2ZpbGVfMT1CdWlsZGZpbGU6IHswfSBpcyBub3QgYSBmaWxlCi1JbnRlcm5hbEFudFJ1bm5lci4tZmluZF9ub3Rfc3VwcG9ydGVkPS1maW5kIG5vdCBzdXBwb3J0ZWQuXG5DYW4gYmUgZW11bGF0ZWQgdXNpbmcgUnVuIEFzID4gQW50IEJ1aWxkIGxvY2F0ZWRcbmluIHRoZSBSdW4gPiBFeHRlcm5hbCBUb29scyBtZW51Ci1JbnRlcm5hbEFudFJ1bm5lci4xNTc9LWxpYiBub3Qgc3VwcG9ydGVkXG5Db25maWd1cmUgdGhlIEFudCBydW50aW1lIGNsYXNzcGF0aCB1c2luZyBlaXRoZXIgdGhlXG5nbG9iYWwgQW50IHJ1bnRpbWUgY2xhc3NwYXRoIG9yIHRoZSBBbnQgcnVudGltZSBjbGFzc3BhdGhcbiBmb3IgdGhpcyBwYXJ0aWN1bGFyIGJ1aWxkCi1JbnRlcm5hbEFudFJ1bm5lci4xNTg9XHRcdFx0ZG8gbm90IGFsbG93IGludGVyYWN0aXZlIGlucHV0Ci1JbnRlcm5hbEFudFJ1bm5lci4xNTk9XHRcdGV4ZWN1dGUgYWxsIHRhcmdldHMgdGhhdCBkbyBub3QgZGVwZW5kCi1JbnRlcm5hbEFudFJ1bm5lci4xNjA9XHRcdFx0XHRcdFx0b24gZmFpbGVkIHRhcmdldChzKQotSW50ZXJuYWxBbnRSdW5uZXIuMTYxPUNsYXNzIHswfSBub3QgZm91bmQgZm9yIHRhc2sgezF9Ci1JbnRlcm5hbEFudFJ1bm5lci4xNjI9Q2xhc3MgezB9IG5vdCBmb3VuZCBmb3IgdHlwZSB7MX0KLQotUmVtb3RlQW50QnVpbGRMb2dnZXIuMT1CVUlMRCBGQUlMRUQKLVJlbW90ZUFudEJ1aWxkTG9nZ2VyLlRvdGFsX3RpbWU9VG90YWwgdGltZTogCi1SZW1vdGVBbnRCdWlsZExvZ2dlci5fbWludXRlc18yPVwgbWludXRlcwotUmVtb3RlQW50QnVpbGRMb2dnZXIuX21pbnV0ZV8zPVwgbWludXRlCi1SZW1vdGVBbnRCdWlsZExvZ2dlci5fc2Vjb25kc180PVwgc2Vjb25kcwotUmVtb3RlQW50QnVpbGRMb2dnZXIuX3NlY29uZF81PVwgc2Vjb25kCi1SZW1vdGVBbnRCdWlsZExvZ2dlci5fbWlsbGlzZWNvbmRzXzY9XCBtaWxsaXNlY29uZHMKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9pbnB1dGhhbmRsZXIvRmFpbElucHV0SGFuZGxlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvcmVtb3RlL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVtb3RlL2lucHV0aGFuZGxlci9GYWlsSW5wdXRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMzQxZjQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvcmVtb3RlL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVtb3RlL2lucHV0aGFuZGxlci9GYWlsSW5wdXRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLnJlbW90ZS5pbnB1dGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5EZWZhdWx0SW5wdXRIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgRmFpbElucHV0SGFuZGxlciBleHRlbmRzIERlZmF1bHRJbnB1dEhhbmRsZXIgewotCQotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKLQkJLy9lbnN1cmUgYW55IGF0dGVtcHRzIHRvIHJlYWQgaW5wdXQgZmFpbAotCQlyZXR1cm4gbmV3IElucHV0U3RyZWFtKCl7Ci0JCQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9sb2dnZXIvTWVzc2FnZUlkcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvcmVtb3RlL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVtb3RlL2xvZ2dlci9NZXNzYWdlSWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMDc0MWEuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvcmVtb3RlL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVtb3RlL2xvZ2dlci9NZXNzYWdlSWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5yZW1vdGUubG9nZ2VyOwotCi0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlSWRzIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST0NFU1NfSUQ9ICAgInByb2Nlc3NJRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBCVUlMRF9DQU5DRUxMRUQ9ICJjYW5jZWxsZWQiOyAvLyROT04tTkxTLTEkCi0gICAgLy9jb25zdGFudHMgbmVlZCB0byBzdGFydCBncmVhdGVyIHRoYW4gdGhlIFByb2plY3QuTVNHXyogY29uc3RhbnRzCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFTSz0gIjYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFSR0VUPSAiNyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3JlbW90ZS9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL3JlbW90ZS9sb2dnZXIvUmVtb3RlQW50QnJlYWtwb2ludC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvcmVtb3RlL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVtb3RlL2xvZ2dlci9SZW1vdGVBbnRCcmVha3BvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNzE1MTYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvcmVtb3RlL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvcmVtb3RlL2xvZ2dlci9SZW1vdGVBbnRCcmVha3BvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5yZW1vdGUubG9nZ2VyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5kZWJ1Zy5tb2RlbC5EZWJ1Z01lc3NhZ2VJZHM7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdGVBbnRCcmVha3BvaW50IHsKLQkKLSAgICBwcml2YXRlIEZpbGUgZkZpbGU7Ci0JcHJpdmF0ZSBpbnQgZkxpbmVOdW1iZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgZkZpbGVOYW1lOwotCQotCXB1YmxpYyBSZW1vdGVBbnRCcmVha3BvaW50KFN0cmluZyBicmVha3BvaW50UmVwcmVzZW50YXRpb24pIHsKLQkJU3RyaW5nW10gZGF0YT0gYnJlYWtwb2ludFJlcHJlc2VudGF0aW9uLnNwbGl0KERlYnVnTWVzc2FnZUlkcy5NRVNTQUdFX0RFTElNSVRFUik7Ci0JCVN0cmluZyBmaWxlTmFtZT0gZGF0YVsxXTsKLQkJU3RyaW5nIGxpbmVOdW1iZXI9IGRhdGFbMl07Ci0JCWZGaWxlTmFtZT0gZmlsZU5hbWU7Ci0JCWZGaWxlPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCWZMaW5lTnVtYmVyPSBJbnRlZ2VyLnBhcnNlSW50KGxpbmVOdW1iZXIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQXQoU3RyaW5nIGZpbGVOYW1lLCBpbnQgbGluZU51bWJlcikgewotCQlyZXR1cm4gZkxpbmVOdW1iZXIgPT0gbGluZU51bWJlciAmJiBmaWxlTmFtZSAhPSBudWxsICYmIGZGaWxlLmVxdWFscyhuZXcgRmlsZShmaWxlTmFtZSkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvTWFyc2hhbGxTdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXI9IG5ldyBTdHJpbmdCdWZmZXIoRGVidWdNZXNzYWdlSWRzLkJSRUFLUE9JTlQpOwotCQlidWZmZXIuYXBwZW5kKERlYnVnTWVzc2FnZUlkcy5NRVNTQUdFX0RFTElNSVRFUik7Ci0JCWJ1ZmZlci5hcHBlbmQoZkZpbGVOYW1lKTsKLQkJYnVmZmVyLmFwcGVuZChEZWJ1Z01lc3NhZ2VJZHMuTUVTU0FHRV9ERUxJTUlURVIpOwotCQlidWZmZXIuYXBwZW5kKGZMaW5lTnVtYmVyKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICghKG9iaiBpbnN0YW5jZW9mIFJlbW90ZUFudEJyZWFrcG9pbnQpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJUmVtb3RlQW50QnJlYWtwb2ludCBvdGhlcj0gKFJlbW90ZUFudEJyZWFrcG9pbnQpIG9iajsKLQkJcmV0dXJuIG90aGVyLmdldExpbmVOdW1iZXIoKSA9PSBmTGluZU51bWJlciAmJiBvdGhlci5nZXRGaWxlKCkuZXF1YWxzKGZGaWxlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGZGaWxlTmFtZS5oYXNoQ29kZSgpICsgZkxpbmVOdW1iZXI7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKLQkJcmV0dXJuIGZMaW5lTnVtYmVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0JCXJldHVybiBmRmlsZU5hbWU7Ci0JfQotCQotCXB1YmxpYyBGaWxlIGdldEZpbGUoKSB7Ci0JICAgIHJldHVybiBmRmlsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9BbnRDb3JlTW9kZWxNZXNzYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvQW50Q29yZU1vZGVsTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE3OGU3NC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9BbnRDb3JlTW9kZWxNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgQW50Q29yZU1vZGVsTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmxhdW5jaENvbmZpZ3VyYXRpb25zLkFudENvcmVNb2RlbE1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50VXRpbF82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFV0aWxfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRVdGlsXzI7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQW50Q29yZU1vZGVsTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9BbnRDb3JlTW9kZWxNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvQW50Q29yZU1vZGVsTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJhZDU0Zi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9BbnRDb3JlTW9kZWxNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1BbnRVdGlsXzY9SW52YWxpZCBwcm9wZXJ0eSBmaWxlIGVudHJ5OiB7MH0KLUFudFV0aWxfNz1VbmFibGUgdG8gZ2VuZXJhdGUgQW50IGNsYXNzcGF0aAotQW50VXRpbF8yPUVycm9yIHJlYWRpbmcgbGF1bmNoIGNvbmZpZ3VyYXRpb24KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL0FudExhdW5jaC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvQW50TGF1bmNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYzQxNDMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvQW50TGF1bmNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVNvdXJjZUxvY2F0b3I7Ci0KLS8qKgotICogU3RvcmVzIGxpbmsgZGVzY3JpcHRvcnMgZm9yIExhdW5jaCBmb3IgZnVydGhlciB1c2Ugb2YgVGFza0xpbmtNYW5hZ2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRMYXVuY2ggZXh0ZW5kcyBMYXVuY2ggewotCUxpc3QgbGlua0Rlc2NyaXB0b3JzOwotCi0JcHVibGljIEFudExhdW5jaChJTGF1bmNoQ29uZmlndXJhdGlvbiBsYXVuY2hDb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kZSwgSVNvdXJjZUxvY2F0b3IgbG9jYXRvcikgewotCQlzdXBlcihsYXVuY2hDb25maWd1cmF0aW9uLCBtb2RlLCBsb2NhdG9yKTsKLQkJbGlua0Rlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpbmtEZXNjcmlwdG9yKFN0cmluZyBsaW5lLCBTdHJpbmcgZmlsZU5hbWUsIGludCBsaW5lTnVtYmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmIChmaWxlTmFtZSE9IG51bGwgJiYgZmlsZU5hbWUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJc3luY2hyb25pemVkIChsaW5rRGVzY3JpcHRvcnMpIHsKLQkJCQlsaW5rRGVzY3JpcHRvcnMuYWRkKG5ldyBMaW5rRGVzY3JpcHRvcihsaW5lLCBmaWxlTmFtZSwgbGluZU51bWJlciwgb2Zmc2V0LCBsZW5ndGgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpbmtEZXNjcmlwdG9yKExpbmtEZXNjcmlwdG9yIGxkKSB7Ci0JCXN5bmNocm9uaXplZCAobGlua0Rlc2NyaXB0b3JzKSB7Ci0JCQlsaW5rRGVzY3JpcHRvcnMucmVtb3ZlKGxkKTsKLQkJfQotCX0KLQotCXB1YmxpYyBMaXN0IGdldExpbmtEZXNjcmlwdG9ycygpIHsKLQkJc3luY2hyb25pemVkIChsaW5rRGVzY3JpcHRvcnMpIHsKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KGxpbmtEZXNjcmlwdG9ycyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhckxpbmtEZXNjcmlwdG9ycygpIHsKLQkJc3luY2hyb25pemVkIChsaW5rRGVzY3JpcHRvcnMpIHsKLQkJCWxpbmtEZXNjcmlwdG9ycy5jbGVhcigpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9BbnRMYXVuY2hpbmdQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL0FudExhdW5jaGluZ1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGQ1OTY0Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL0FudExhdW5jaGluZ1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci0KLXB1YmxpYyBjbGFzcyBBbnRMYXVuY2hpbmdQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcwotCQlBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQlwdWJsaWMgQW50TGF1bmNoaW5nUHJlZmVyZW5jZUluaXRpYWxpemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWVvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjCi0JICogaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQotCQlJRWNsaXBzZVByZWZlcmVuY2VzIG5vZGUgPSBuZXcgRGVmYXVsdFNjb3BlKCkKLQkJCQkuZ2V0Tm9kZShBbnRMYXVuY2hpbmcuZ2V0VW5pcXVlSWRlbnRpZmllcigpKTsKLQkJbm9kZS5wdXQoSUFudExhdW5jaGluZ1ByZWZlcmVuY2VDb25zdGFudHMuQU5UX0NPTU1VTklDQVRJT05fVElNRU9VVCwKLQkJCQkiMjAwMDAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL0lBbnRMYXVuY2hpbmdQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9JQW50TGF1bmNoaW5nUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWNkNTgxLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL0lBbnRMYXVuY2hpbmdQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmc7Ci0KLS8qKgotICogQ29uc3RhbnRzIHVzZWQgdG8gaWRlbnRpZnkgdXNlciBwcmVmZXJlbmNlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQW50TGF1bmNoaW5nUHJlZmVyZW5jZUNvbnN0YW50cyB7Ci0KLQkgLyoqCi0gICAgICogaW50IHByZWZlcmVuY2UgaWRlbnRpZmllciBjb25zdGFudCB3aGljaCBzcGVjaWZpZXMgdGhlIGxlbmd0aCBvZiB0aW1lIHRvIHdhaXQKLSAgICAgKiB0byBjb25uZWN0IHdpdGggdGhlIHNvY2tldCB0aGF0IGNvbW11bmljYXRlcyB3aXRoIHRoZSBzZXBhcmF0ZSBKUkUgdG8gY2FwdHVyZSB0aGUgb3V0cHV0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UX0NPTU1VTklDQVRJT05fVElNRU9VVD0gInRpbWVvdXQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9MaW5rRGVzY3JpcHRvci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvTGlua0Rlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFiYTIwNi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9MaW5rRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmc7Ci0KLS8qKgotICogU3RvcmVzIGRldGFpbGVkIGRhdGEgb2YgTGluay4gVXNlZCB0byBjcmVhdGUgbGlua2VkIG1lc3NhZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgTGlua0Rlc2NyaXB0b3IgewotCVN0cmluZyBsaW5lOwotCVN0cmluZyBmaWxlTmFtZTsKLQlpbnQgbGluZU51bWJlcjsKLQlpbnQgb2Zmc2V0OwotCWludCBsZW5ndGg7Ci0KLQlwdWJsaWMgTGlua0Rlc2NyaXB0b3IoU3RyaW5nIGxpbmUsIFN0cmluZyBmaWxlTmFtZSwgaW50IGxpbmVOdW1iZXIsCi0JCQlpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGluZSA9IGxpbmU7Ci0JCXRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKLQkJdGhpcy5saW5lTnVtYmVyID0gbGluZU51bWJlcjsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGluZSgpIHsKLQkJcmV0dXJuIGxpbmU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGluZShTdHJpbmcgbGluZSkgewotCQl0aGlzLmxpbmUgPSBsaW5lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0JCXJldHVybiBmaWxlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKLQkJcmV0dXJuIGxpbmVOdW1iZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGluZU51bWJlcihpbnQgbGluZU51bWJlcikgewotCQl0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gb2Zmc2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvQW50RGVidWdNZXNzYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvQW50RGVidWdNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTZjMWM0Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL0FudERlYnVnTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmRlYnVnOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEFudERlYnVnTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmRlYnVnLkFudERlYnVnTWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLSAgICAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRTb3VyY2VDb250YWluZXJfMDsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBBbnREZWJ1Z01lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvQW50RGVidWdNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvQW50RGVidWdNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGMxMWQ5Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL0FudERlYnVnTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQW50U291cmNlQ29udGFpbmVyXzA9QW50IFNvdXJjZSBDb250YWluZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9BbnRTb3VyY2VDb250YWluZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL0FudFNvdXJjZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzliNjZmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL0FudFNvdXJjZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcuZGVidWc7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlQ29udGFpbmVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5jb250YWluZXJzLkFic3RyYWN0U291cmNlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLmNvbnRhaW5lcnMuTG9jYWxGaWxlU3RvcmFnZTsKLQotcHVibGljIGNsYXNzIEFudFNvdXJjZUNvbnRhaW5lciBleHRlbmRzIEFic3RyYWN0U291cmNlQ29udGFpbmVyIHsKLQotCXByaXZhdGUgSVdvcmtzcGFjZVJvb3QgZlJvb3Q7Ci0KLQlwdWJsaWMgQW50U291cmNlQ29udGFpbmVyKCkgewotCQlmUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZUNvbnRhaW5lciNmaW5kU291cmNlRWxlbWVudHMoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZmluZFNvdXJjZUVsZW1lbnRzKFN0cmluZyBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFycmF5TGlzdCBzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlGaWxlIG9zRmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotCQlpZiAob3NGaWxlLmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCUlQYXRoIGNhbm9uaWNhbFBhdGggPSBuZXcgUGF0aChvc0ZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQkJCQlJRmlsZVtdIGZpbGVzID0gZlJvb3QuZmluZEZpbGVzRm9yTG9jYXRpb24oY2Fub25pY2FsUGF0aCk7Ci0JCQkJaWYgKGZpbGVzLmxlbmd0aCA+IDApIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJc291cmNlcy5hZGQoZmlsZXNbaV0pOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc291cmNlcy5hZGQobmV3IExvY2FsRmlsZVN0b3JhZ2Uob3NGaWxlKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiBzb3VyY2VzLnRvQXJyYXkoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlQ29udGFpbmVyI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEFudERlYnVnTWVzc2FnZXMuQW50U291cmNlQ29udGFpbmVyXzA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZUNvbnRhaW5lciNnZXRUeXBlKCkKLSAgICAgKiBOb3QgcGVyc2lzdGVkIHZpYSB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgSVNvdXJjZUNvbnRhaW5lclR5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL0FudFNvdXJjZUxvb2t1cERpcmVjdG9yLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9BbnRTb3VyY2VMb29rdXBEaXJlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGRlM2RkLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL0FudFNvdXJjZUxvb2t1cERpcmVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcuZGVidWc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5BYnN0cmFjdFNvdXJjZUxvb2t1cERpcmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VMb29rdXBQYXJ0aWNpcGFudDsKLQotLyoqCi0gKiBBbnQgc291cmNlIGxvb2t1cCBkaXJlY3Rvci4gRm9yIEFudCBzb3VyY2UgbG9va3VwIHRoZXJlIGlzIG9uZSBzb3VyY2UKLSAqIGxvb2t1cCBwYXJ0aWNpcGFudC4gCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRTb3VyY2VMb29rdXBEaXJlY3RvciBleHRlbmRzIEFic3RyYWN0U291cmNlTG9va3VwRGlyZWN0b3IgewotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VMb29rdXBEaXJlY3RvciNpbml0aWFsaXplUGFydGljaXBhbnRzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFydGljaXBhbnRzKCkgewotCQlhZGRQYXJ0aWNpcGFudHMobmV3IElTb3VyY2VMb29rdXBQYXJ0aWNpcGFudFtde25ldyBBbnRTb3VyY2VMb29rdXBQYXJ0aWNpcGFudCgpfSk7Ci0JfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUGVyc2lzdGFibGVTb3VyY2VMb2NhdG9yI2dldE1lbWVudG8oKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVtZW50bygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL0FudFNvdXJjZUxvb2t1cFBhcnRpY2lwYW50LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9BbnRTb3VyY2VMb29rdXBQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2UwNDA5Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL0FudFNvdXJjZUxvb2t1cFBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcuZGVidWc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmRlYnVnLm1vZGVsLkFudFN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuQWJzdHJhY3RTb3VyY2VMb29rdXBQYXJ0aWNpcGFudDsKLQotLyoqCi0gKiBUaGUgQW50IHNvdXJjZSBsb29rdXAgcGFydGljaXBhbnQga25vd3MgaG93IHRvIHRyYW5zbGF0ZSBhIAotICogQW50IHN0YWNrIGZyYW1lIGludG8gYSBzb3VyY2UgZmlsZSBuYW1lIAotICovCi1wdWJsaWMgY2xhc3MgQW50U291cmNlTG9va3VwUGFydGljaXBhbnQgZXh0ZW5kcyBBYnN0cmFjdFNvdXJjZUxvb2t1cFBhcnRpY2lwYW50IHsKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLnNvdXJjZWxvb2t1cC5JU291cmNlTG9va3VwUGFydGljaXBhbnQjZ2V0U291cmNlTmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZShPYmplY3Qgb2JqZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBbnRTdGFja0ZyYW1lKSB7Ci0JCQlyZXR1cm4gKChBbnRTdGFja0ZyYW1lKW9iamVjdCkuZ2V0RmlsZVBhdGgoKTsKLQkJfQotICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAvLyBhc3N1bWUgaXQncyBhIGZpbGUgbmFtZQotICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpb2JqZWN0OwotICAgICAgICB9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL0FudFNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9BbnRTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2UyMTZmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL0FudFNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcuZGVidWc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5zb3VyY2Vsb29rdXAuSVNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlOwotCi0vKioKLSAqIENvbXB1dGVzIHRoZSBkZWZhdWx0IHNvdXJjZSBsb29rdXAgcGF0aCBmb3IgYW4gQW50IGxhdW5jaCBjb25maWd1cmF0aW9uLgotICogVGhlIGRlZmF1bHQgc291cmNlIGxvb2t1cCBpcyBhIGNvbnRhaW5lciB0aGF0IGtub3dzIGhvdyB0byBtYXAgdGhlIAotICogZnVsbHkgcXVhbGlmaWVkIGZpbGUgc3lzdGVtIHBhdGhzIHRvIGVpdGhlciB0aGUgPGNvZGU+SUZpbGU8L2NvZGU+IHdpdGhpbiB0aGUgd29ya3NwYWNlIG9yCi0gKiBhIDxjb2RlPkxvY2FsRmlsZVN0b3JhZ2U8L2NvZGU+IGZvciBidWlsZGZpbGVzIG5vdCBpbiB0aGUgd29ya3NwYWNlLgotICovCi1wdWJsaWMgY2xhc3MgQW50U291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUgaW1wbGVtZW50cyBJU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUgewotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuc291cmNlbG9va3VwLklTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZSNjb21wdXRlU291cmNlQ29udGFpbmVycyhvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVNvdXJjZUNvbnRhaW5lcltdIGNvbXB1dGVTb3VyY2VDb250YWluZXJzKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IElTb3VyY2VDb250YWluZXJbXSB7bmV3IEFudFNvdXJjZUNvbnRhaW5lcigpfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvSUFudERlYnVnQ29uc3RhbnRzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9JQW50RGVidWdDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUzZTEyMS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9JQW50RGVidWdDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmRlYnVnOwotCi1wdWJsaWMgaW50ZXJmYWNlIElBbnREZWJ1Z0NvbnN0YW50cyB7Ci0JCi0JLyoqCi0JICogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBBbnQgZGVidWcgbW9kZWwgKHZhbHVlIAotCSAqIDxjb2RlPm9yZy5lY2xpcHNlLmFudC51aS5kZWJ1ZzwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FOVF9ERUJVR19NT0RFTCA9ICJvcmcuZWNsaXBzZS5hbnQudWkuZGVidWciOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBBbnQgbGluZSBicmVha3BvaW50IG1hcmtlcnMgCi0JICogKHZhbHVlIDxjb2RlPm9yZy5lY2xpcHNlLmFudC51aS5hbnRMaW5lQnJlYWtwb2ludE1hcmtlcjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FOVF9MSU5FX0JSRUFLUE9JTlRfTUFSS0VSPSAib3JnLmVjbGlwc2UuYW50LnVpLmFudExpbmVCcmVha3BvaW50TWFya2VyIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8qKgotICAgICAqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgQW50IHJ1biB0byBsaW5lIGJyZWFrcG9pbnRzIAotICAgICAqICh2YWx1ZSA8Y29kZT5vcmcuZWNsaXBzZS5hbnQudWkucnVuVG9MaW5lQnJlYWtwb2ludDwvY29kZT4pLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVF9SVU5fVE9fTElORT0gIm9yZy5lY2xpcHNlLmFudC51aS5ydW5Ub0xpbmVCcmVha3BvaW50IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvQW50RGVidWdFbGVtZW50LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9tb2RlbC9BbnREZWJ1Z0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdhOTUyOC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9tb2RlbC9BbnREZWJ1Z0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmRlYnVnLm1vZGVsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLkFudExhdW5jaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmRlYnVnLklBbnREZWJ1Z0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5EZWJ1Z0VsZW1lbnQ7Ci0KLS8qKgotICogQ29tbW9uIGZ1bmN0aW9uIG9mIEFudCBkZWJ1ZyBtb2RlbCBlbGVtZW50cwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW50RGVidWdFbGVtZW50IGV4dGVuZHMgRGVidWdFbGVtZW50IHsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGRlYnVnIGVsZW1lbnQgY29udGFpbmVkIGluIHRoZSBnaXZlbgotCSAqIGRlYnVnIHRhcmdldC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0IGRlYnVnIHRhcmdldAotCSAqLwotCXB1YmxpYyBBbnREZWJ1Z0VsZW1lbnQoQW50RGVidWdUYXJnZXQgdGFyZ2V0KSB7Ci0JCXN1cGVyKHRhcmdldCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnRWxlbWVudCNnZXRNb2RlbElkZW50aWZpZXIoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TW9kZWxJZGVudGlmaWVyKCkgewotCQlyZXR1cm4gSUFudERlYnVnQ29uc3RhbnRzLklEX0FOVF9ERUJVR19NT0RFTDsKLQl9Ci0gICAgCi0JLyoqCi0gICAgICogVGhyb3dzIGEgZGVidWcgZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UsIGVycm9yIGNvZGUsIGFuZCB1bmRlcmx5aW5nCi0gICAgICogZXhjZXB0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHRocm93RGVidWdFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBEZWJ1Z0V4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFudExhdW5jaGluZy5nZXRVbmlxdWVJZGVudGlmaWVyKCksCi0gICAgICAgICAgICBEZWJ1Z0V4Y2VwdGlvbi5UQVJHRVRfUkVRVUVTVF9GQUlMRUQsIG1lc3NhZ2UsIG51bGwpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIEFudERlYnVnVGFyZ2V0IGdldEFudERlYnVnVGFyZ2V0KCkgewotICAgICAgICByZXR1cm4gKEFudERlYnVnVGFyZ2V0KXN1cGVyLmdldERlYnVnVGFyZ2V0KCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvQW50TGluZUJyZWFrcG9pbnQuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL21vZGVsL0FudExpbmVCcmVha3BvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOTZiNWIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvQW50TGluZUJyZWFrcG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5kZWJ1Zy5tb2RlbDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5kZWJ1Zy5JQW50RGVidWdDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuTGluZUJyZWFrcG9pbnQ7Ci0KLS8qKgotICogQW50IGxpbmUgYnJlYWtwb2ludAotICovCi1wdWJsaWMgY2xhc3MgQW50TGluZUJyZWFrcG9pbnQgZXh0ZW5kcyBMaW5lQnJlYWtwb2ludCB7Ci0JCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvciBpcyByZXF1aXJlZCBmb3IgdGhlIGJyZWFrcG9pbnQgbWFuYWdlcgotCSAqIHRvIHJlLWNyZWF0ZSBwZXJzaXN0ZWQgYnJlYWtwb2ludHMuIEFmdGVyIGluc3RhbnRpYXRpbmcgYSBicmVha3BvaW50LAotCSAqIHRoZSA8Y29kZT5zZXRNYXJrZXIoLi4uKTwvY29kZT4gbWV0aG9kIGlzIGNhbGxlZCB0byByZXN0b3JlCi0JICogdGhpcyBicmVha3BvaW50J3MgYXR0cmlidXRlcy4KLQkgKi8KLQlwdWJsaWMgQW50TGluZUJyZWFrcG9pbnQoKSB7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBsaW5lIGJyZWFrcG9pbnQgb24gdGhlIGdpdmVuIHJlc291cmNlIGF0IHRoZSBnaXZlbgotCSAqIGxpbmUgbnVtYmVyLiBUaGUgbGluZSBudW1iZXIgaXMgMS1iYXNlZCAoaS5lLiB0aGUgZmlyc3QgbGluZSBvZiBhCi0JICogZmlsZSBpcyBsaW5lIG51bWJlciAxKS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UgZmlsZSBvbiB3aGljaCB0byBzZXQgdGhlIGJyZWFrcG9pbnQKLQkgKiBAcGFyYW0gbGluZU51bWJlciAxLWJhc2VkIGxpbmUgbnVtYmVyIG9mIHRoZSBicmVha3BvaW50Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBjcmVhdGUgdGhlIGJyZWFrcG9pbnQKLQkgKi8KLQlwdWJsaWMgQW50TGluZUJyZWFrcG9pbnQoSVJlc291cmNlIHJlc291cmNlLCBpbnQgbGluZU51bWJlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCSAgICB0aGlzKHJlc291cmNlLCBsaW5lTnVtYmVyLCBuZXcgSGFzaE1hcCgpLCB0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIGxpbmUgYnJlYWtwb2ludCBvbiB0aGUgZ2l2ZW4gcmVzb3VyY2UgYXQgdGhlIGdpdmVuCi0JICogbGluZSBudW1iZXIuIFRoZSBsaW5lIG51bWJlciBpcyAxLWJhc2VkIChpLmUuIHRoZSBmaXJzdCBsaW5lIG9mIGEKLQkgKiBmaWxlIGlzIGxpbmUgbnVtYmVyIDEpLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZSBmaWxlIG9uIHdoaWNoIHRvIHNldCB0aGUgYnJlYWtwb2ludAotCSAqIEBwYXJhbSBsaW5lTnVtYmVyIDEtYmFzZWQgbGluZSBudW1iZXIgb2YgdGhlIGJyZWFrcG9pbnQKLQkgKiBAcGFyYW0gYXR0cmlidXRlcyB0aGUgbWFya2VyIGF0dHJpYnV0ZXMgdG8gc2V0Ci0JICogQHBhcmFtIHJlZ2lzdGVyIHdoZXRoZXIgdG8gYWRkIHRoaXMgYnJlYWtwb2ludCB0byB0aGUgYnJlYWtwb2ludCBtYW5hZ2VyCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHVuYWJsZSB0byBjcmVhdGUgdGhlIGJyZWFrcG9pbnQKLQkgKi8KLQlwdWJsaWMgQW50TGluZUJyZWFrcG9pbnQoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBpbnQgbGluZU51bWJlciwgZmluYWwgTWFwIGF0dHJpYnV0ZXMsIGZpbmFsIGJvb2xlYW4gcmVnaXN0ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkgICAgSVdvcmtzcGFjZVJ1bm5hYmxlIHdyPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJICAgIElNYXJrZXIgbWFya2VyID0gcmVzb3VyY2UuY3JlYXRlTWFya2VyKElBbnREZWJ1Z0NvbnN0YW50cy5JRF9BTlRfTElORV9CUkVBS1BPSU5UX01BUktFUik7Ci0JCQkgICAgc2V0TWFya2VyKG1hcmtlcik7Ci0JCQkgICAgYXR0cmlidXRlcy5wdXQoSUJyZWFrcG9pbnQuRU5BQkxFRCwgQm9vbGVhbi5UUlVFKTsKLQkJCSAgICBhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkxJTkVfTlVNQkVSLCBuZXcgSW50ZWdlcihsaW5lTnVtYmVyKSk7Ci0JCQkgICAgYXR0cmlidXRlcy5wdXQoSUJyZWFrcG9pbnQuSUQsIElBbnREZWJ1Z0NvbnN0YW50cy5JRF9BTlRfREVCVUdfTU9ERUwpOwotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0KElNYXJrZXIuTUVTU0FHRSwgTWVzc2FnZUZvcm1hdC5mb3JtYXQoRGVidWdNb2RlbE1lc3NhZ2VzLkFudExpbmVCcmVha3BvaW50XzAsIG5ldyBTdHJpbmdbXSB7SW50ZWdlci50b1N0cmluZyhsaW5lTnVtYmVyKX0pKTsKLQkJCSAgICBlbnN1cmVNYXJrZXIoKS5zZXRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJlZ2lzdGVyKHJlZ2lzdGVyKTsKLQkJCX0KLQkgICAgfTsKLQkgICAgcnVuKGdldE1hcmtlclJ1bGUocmVzb3VyY2UpLCB3cik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUJyZWFrcG9pbnQjZ2V0TW9kZWxJZGVudGlmaWVyKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1vZGVsSWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIElBbnREZWJ1Z0NvbnN0YW50cy5JRF9BTlRfREVCVUdfTU9ERUw7Ci0JfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgYnJlYWtwb2ludCBpcyBhIHJ1biB0byBsaW5lIGJyZWFrcG9pbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1J1blRvTGluZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBlbnN1cmVNYXJrZXIoKS5nZXRBdHRyaWJ1dGUoSUFudERlYnVnQ29uc3RhbnRzLkFOVF9SVU5fVE9fTElORSwgZmFsc2UpOwotICAgICAgICB9IGNhdGNoIChEZWJ1Z0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGQgdGhpcyBicmVha3BvaW50IHRvIHRoZSBicmVha3BvaW50IG1hbmFnZXIsCi0gICAgICogb3Igc2V0cyBpdCBhcyB1bnJlZ2lzdGVyZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyKGJvb2xlYW4gcmVnaXN0ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHJlZ2lzdGVyKSB7Ci0gICAgICAgICAgICBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS5hZGRCcmVha3BvaW50KHRoaXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0UmVnaXN0ZXJlZChmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9tb2RlbC9BbnRQcm9wZXJ0aWVzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9tb2RlbC9BbnRQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmOTNmZWMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvQW50UHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5kZWJ1Zy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFyaWFibGU7Ci0KLXB1YmxpYyBjbGFzcyBBbnRQcm9wZXJ0aWVzIGV4dGVuZHMgQW50RGVidWdFbGVtZW50IGltcGxlbWVudHMgSVZhcmlhYmxlIHsKLQkKLQlwcml2YXRlIElWYWx1ZSBmVmFsdWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZk5hbWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGZWYWxpZD0gdHJ1ZTsKLQotCXB1YmxpYyBBbnRQcm9wZXJ0aWVzKEFudERlYnVnVGFyZ2V0IHRhcmdldCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodGFyZ2V0KTsKLQkJZk5hbWU9IG5hbWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFyaWFibGUjZ2V0VmFsdWUoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVZhbHVlIGdldFZhbHVlKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGF0dGVtcHRzPSAwOwotICAgICAgICB3aGlsZSAoIWZWYWxpZCAmJiAhZ2V0RGVidWdUYXJnZXQoKS5pc1Rlcm1pbmF0ZWQoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3YWl0KDUwKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdHRlbXB0cyA9PSAyMCAmJiAhZlZhbGlkICYmICFnZXREZWJ1Z1RhcmdldCgpLmlzVGVybWluYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3dEZWJ1Z0V4Y2VwdGlvbihEZWJ1Z01vZGVsTWVzc2FnZXMuQW50UHJvcGVydGllc18xKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF0dGVtcHRzKys7Ci0gICAgICAgIH0KLSAJCXJldHVybiBmVmFsdWU7Ci0JfQotICAgIAotICAgIHB1YmxpYyBJVmFsdWUgZ2V0TGFzdFZhbHVlKCkgewotICAgICAgICByZXR1cm4gZlZhbHVlOwotICAgIH0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhcmlhYmxlI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZOYW1lOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhcmlhYmxlI2dldFJlZmVyZW5jZVR5cGVOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZVR5cGVOYW1lKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYXJpYWJsZSNoYXNWYWx1ZUNoYW5nZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1ZhbHVlQ2hhbmdlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlTW9kaWZpY2F0aW9uI3NldFZhbHVlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIGV4cHJlc3Npb24pIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYWx1ZU1vZGlmaWNhdGlvbiNzZXRWYWx1ZShvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYWx1ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShJVmFsdWUgdmFsdWUpIHsKLQkJZlZhbHVlPSB2YWx1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYWx1ZU1vZGlmaWNhdGlvbiNzdXBwb3J0c1ZhbHVlTW9kaWZpY2F0aW9uKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1ZhbHVlTW9kaWZpY2F0aW9uKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWVNb2RpZmljYXRpb24jdmVyaWZ5VmFsdWUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2ZXJpZnlWYWx1ZShTdHJpbmcgZXhwcmVzc2lvbikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWVNb2RpZmljYXRpb24jdmVyaWZ5VmFsdWUob3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmVyaWZ5VmFsdWUoSVZhbHVlIHZhbHVlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VmFsaWQoYm9vbGVhbiB2YWxpZCkgewotICAgICAgICBmVmFsaWQ9IHZhbGlkOyAgICAgICAgCi0gICAgICAgIG5vdGlmeUFsbCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL21vZGVsL0FudFByb3BlcnRpZXNWYWx1ZS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvQW50UHJvcGVydGllc1ZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYzMwM2MuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvQW50UHJvcGVydGllc1ZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEJyb2NrIEphbmljemFrIChicm9ja2pAdHBnLmNvbS5hdSkgLSBidWcgMTU0OTA3Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5kZWJ1Zy5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhcmlhYmxlOwotCi1wdWJsaWMgY2xhc3MgQW50UHJvcGVydGllc1ZhbHVlIGV4dGVuZHMgQW50RGVidWdFbGVtZW50IGltcGxlbWVudHMgSVZhbHVlIHsKLQkKLQlwcml2YXRlIExpc3QgZlByb3BlcnRpZXM9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlwdWJsaWMgQW50UHJvcGVydGllc1ZhbHVlKEFudERlYnVnVGFyZ2V0IHRhcmdldCkgewotCQlzdXBlcih0YXJnZXQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYWx1ZSNnZXRSZWZlcmVuY2VUeXBlTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VUeXBlTmFtZSgpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlI2dldFZhbHVlU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlU3RyaW5nKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWUjaXNBbGxvY2F0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWxsb2NhdGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWUjZ2V0VmFyaWFibGVzKCkKLQkgKi8KLQlwdWJsaWMgSVZhcmlhYmxlW10gZ2V0VmFyaWFibGVzKCkgewotCQlDb2xsZWN0aW9ucy5zb3J0KGZQcm9wZXJ0aWVzKTsKLQkJcmV0dXJuIChJVmFyaWFibGVbXSlmUHJvcGVydGllcy50b0FycmF5KG5ldyBJVmFyaWFibGVbZlByb3BlcnRpZXMuc2l6ZSgpXSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlI2hhc1ZhcmlhYmxlcygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzVmFyaWFibGVzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydGllcyhMaXN0IHByb3BlcnRpZXMpIHsKLQkJZlByb3BlcnRpZXMuYWRkQWxsKHByb3BlcnRpZXMpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBmUHJvcGVydGllczsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9tb2RlbC9BbnRQcm9wZXJ0eS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvQW50UHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE2OTlkYS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9tb2RlbC9BbnRQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgQnJvY2sgSmFuaWN6YWsgKGJyb2NrakB0cGcuY29tLmF1KSAtIGJ1ZyAxNTQ5MDcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmRlYnVnLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFyaWFibGU7Ci0KLS8qKgotICogQSBwcm9wZXJ0eSBpbiBhbiBBbnQgYnVpbGQuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRQcm9wZXJ0eSBleHRlbmRzIEFudERlYnVnRWxlbWVudCBpbXBsZW1lbnRzIElWYXJpYWJsZSwgQ29tcGFyYWJsZSB7Ci0KLQlwcml2YXRlIFN0cmluZyBmTmFtZTsKLQlwcml2YXRlIEFudFZhbHVlIGZWYWx1ZTsKLSAgICBwcml2YXRlIFN0cmluZyBmTGFiZWw7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIHZhcmlhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVidWcgdGFyZ2V0Ci0JICogd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHRhcmdldCB0aGUgZGVidWcgdGFyZ2V0Ci0JICogQHBhcmFtIG5hbWUgcHJvcGVydHkgbmFtZQotCSAqIEBwYXJhbSB2YWx1ZSBwcm9wZXJ0eSB2YWx1ZQotCSAqLwotCXB1YmxpYyBBbnRQcm9wZXJ0eShBbnREZWJ1Z1RhcmdldCB0YXJnZXQsIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJc3VwZXIodGFyZ2V0KTsKLQkJZk5hbWUgPSBuYW1lOwotCQlmVmFsdWU9IG5ldyBBbnRWYWx1ZSh0YXJnZXQsIHZhbHVlKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhcmlhYmxlI2dldFZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgSVZhbHVlIGdldFZhbHVlKCkgewotCQlyZXR1cm4gZlZhbHVlOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFyaWFibGUjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZk5hbWU7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYXJpYWJsZSNnZXRSZWZlcmVuY2VUeXBlTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VUeXBlTmFtZSgpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYXJpYWJsZSNoYXNWYWx1ZUNoYW5nZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1ZhbHVlQ2hhbmdlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWVNb2RpZmljYXRpb24jc2V0VmFsdWUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgZXhwcmVzc2lvbikgewotCX0KLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWVNb2RpZmljYXRpb24jc2V0VmFsdWUob3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWUpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoSVZhbHVlIHZhbHVlKSB7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYWx1ZU1vZGlmaWNhdGlvbiNzdXBwb3J0c1ZhbHVlTW9kaWZpY2F0aW9uKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1ZhbHVlTW9kaWZpY2F0aW9uKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklWYWx1ZU1vZGlmaWNhdGlvbiN2ZXJpZnlWYWx1ZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZlcmlmeVZhbHVlKFN0cmluZyBleHByZXNzaW9uKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlTW9kaWZpY2F0aW9uI3ZlcmlmeVZhbHVlKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZlcmlmeVZhbHVlKElWYWx1ZSB2YWx1ZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgdGV4dCB1c2VkIHRvIHJlbmRlciB0aGlzIHByb3BlcnR5Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotICAgICAgICBpZiAoZkxhYmVsID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXI9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIj0gIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZlZhbHVlLmdldFZhbHVlU3RyaW5nKCkpOyAgICAgICAgICAKLSAgICAgICAgICAgIGZMYWJlbD0gIGJ1ZmZlci50b1N0cmluZygpOwotICAgICAgICB9IAotICAgICAgICByZXR1cm4gZkxhYmVsOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIEBzZWUgamF2YS5sYW5nLkNvbXBhcmFibGUjY29tcGFyZVRvKGphdmEubGFuZy5PYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG90aGVyKSB7Ci0gICAgCUFudFByb3BlcnR5IG90aGVyUHJvcGVydHkgPSAoQW50UHJvcGVydHkpIG90aGVyOwotICAgIAlyZXR1cm4gZk5hbWUuY29tcGFyZVRvSWdub3JlQ2FzZShvdGhlclByb3BlcnR5LmdldE5hbWUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvQW50U3RhY2tGcmFtZS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvQW50U3RhY2tGcmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzJhNzEyLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL21vZGVsL0FudFN0YWNrRnJhbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcuZGVidWcubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLkFudExhdW5jaGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklSZWdpc3Rlckdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVGhyZWFkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhcmlhYmxlOwotCi0vKioKLSAqIEFudCBzdGFjayBmcmFtZS4KLSAqLwotcHVibGljIGNsYXNzIEFudFN0YWNrRnJhbWUgZXh0ZW5kcyBBbnREZWJ1Z0VsZW1lbnQgaW1wbGVtZW50cyBJU3RhY2tGcmFtZSB7Ci0JCi0JcHJpdmF0ZSBBbnRUaHJlYWQgZlRocmVhZDsKLQlwcml2YXRlIFN0cmluZyBmTmFtZTsKLQlwcml2YXRlIGludCBmTGluZU51bWJlcjsKLQlwcml2YXRlIFN0cmluZyBmRmlsZVBhdGg7Ci0JcHJpdmF0ZSBpbnQgZklkOwotICAgIHByaXZhdGUgU3RyaW5nIGZGdWxsUGF0aDsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgc3RhY2sgZnJhbWUgaW4gdGhlIGdpdmVuIHRocmVhZCB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKiAKLQkgKiBAcGFyYW0gYW50VGhyZWFkCi0JICogQHBhcmFtIGlkIHN0YWNrIGZyYW1lIGlkICgwIGlzIHRoZSB0b3Agb2YgdGhlIHN0YWNrKQotCSAqLwotCXB1YmxpYyBBbnRTdGFja0ZyYW1lKEFudFRocmVhZCBhbnRUaHJlYWQsIGludCBpZCwgU3RyaW5nIG5hbWUsIFN0cmluZyBmdWxsUGF0aCwgaW50IGxpbmVOdW1iZXIpIHsKLQkJc3VwZXIoKEFudERlYnVnVGFyZ2V0KSBhbnRUaHJlYWQuZ2V0RGVidWdUYXJnZXQoKSk7Ci0JCWZJZCA9IGlkOwotCQlmVGhyZWFkID0gYW50VGhyZWFkOwotCQlmTGluZU51bWJlcj0gbGluZU51bWJlcjsKLQkJZk5hbWU9IG5hbWU7Ci0JCXNldEZpbGVQYXRoKGZ1bGxQYXRoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SWQoaW50IGlkKSB7Ci0JCWZJZD0gaWQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWUjZ2V0VGhyZWFkKCkKLQkgKi8KLQlwdWJsaWMgSVRocmVhZCBnZXRUaHJlYWQoKSB7Ci0JCXJldHVybiBmVGhyZWFkOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGFja0ZyYW1lI2dldFZhcmlhYmxlcygpCi0JICovCi0JcHVibGljIElWYXJpYWJsZVtdIGdldFZhcmlhYmxlcygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JICAgcmV0dXJuIGZUaHJlYWQuZ2V0VmFyaWFibGVzKCk7Ci0JfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZSNoYXNWYXJpYWJsZXMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1ZhcmlhYmxlcygpIHsKLQkJcmV0dXJuIGlzU3VzcGVuZGVkKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWUjZ2V0TGluZU51bWJlcigpCi0JICovCi0JcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotCQlyZXR1cm4gZkxpbmVOdW1iZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExpbmVOdW1iZXIoaW50IGxpbmVOdW1iZXIpIHsKLQkJZkxpbmVOdW1iZXI9IGxpbmVOdW1iZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZpbGVQYXRoKFN0cmluZyBmdWxsUGF0aCkgewotICAgICAgICBmRnVsbFBhdGg9IGZ1bGxQYXRoOwotICAgICAgICBJRmlsZSBmaWxlPSBBbnRMYXVuY2hpbmdVdGlsLmdldEZpbGVGb3JMb2NhdGlvbihmdWxsUGF0aCwgbnVsbCk7Ci0gICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZGaWxlUGF0aD0gZmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZGaWxlUGF0aD0gbmV3IFBhdGgoZnVsbFBhdGgpLmxhc3RTZWdtZW50KCk7Ci0gICAgICAgIH0KLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRGaWxlUGF0aCgpIHsKLQkJcmV0dXJuIGZGdWxsUGF0aDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZSNnZXRDaGFyU3RhcnQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hhclN0YXJ0KCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWUjZ2V0Q2hhckVuZCgpCi0JICovCi0JcHVibGljIGludCBnZXRDaGFyRW5kKCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWUjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZk5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZk5hbWU9IG5hbWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0YWNrRnJhbWUjZ2V0UmVnaXN0ZXJHcm91cHMoKQotCSAqLwotCXB1YmxpYyBJUmVnaXN0ZXJHcm91cFtdIGdldFJlZ2lzdGVyR3JvdXBzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZSNoYXNSZWdpc3Rlckdyb3VwcygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUmVnaXN0ZXJHcm91cHMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RlcCNjYW5TdGVwSW50bygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuU3RlcEludG8oKSB7Ci0JCXJldHVybiBnZXRUaHJlYWQoKS5jYW5TdGVwSW50bygpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGVwI2NhblN0ZXBPdmVyKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5TdGVwT3ZlcigpIHsKLQkJcmV0dXJuIGdldFRocmVhZCgpLmNhblN0ZXBPdmVyKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0ZXAjY2FuU3RlcFJldHVybigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuU3RlcFJldHVybigpIHsKLQkJcmV0dXJuIGdldFRocmVhZCgpLmNhblN0ZXBSZXR1cm4oKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RlcCNpc1N0ZXBwaW5nKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N0ZXBwaW5nKCkgewotCQlyZXR1cm4gZ2V0VGhyZWFkKCkuaXNTdGVwcGluZygpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGVwI3N0ZXBJbnRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGVwSW50bygpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWdldFRocmVhZCgpLnN0ZXBJbnRvKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0ZXAjc3RlcE92ZXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0ZXBPdmVyKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJZ2V0VGhyZWFkKCkuc3RlcE92ZXIoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RlcCNzdGVwUmV0dXJuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGVwUmV0dXJuKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJZ2V0VGhyZWFkKCkuc3RlcFJldHVybigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdXNwZW5kUmVzdW1lI2NhblJlc3VtZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUmVzdW1lKCkgewotCQlyZXR1cm4gZ2V0VGhyZWFkKCkuY2FuUmVzdW1lKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN1c3BlbmRSZXN1bWUjY2FuU3VzcGVuZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuU3VzcGVuZCgpIHsKLQkJcmV0dXJuIGdldFRocmVhZCgpLmNhblN1c3BlbmQoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3VzcGVuZFJlc3VtZSNpc1N1c3BlbmRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdXNwZW5kZWQoKSB7Ci0JCXJldHVybiBnZXRUaHJlYWQoKS5pc1N1c3BlbmRlZCgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdXNwZW5kUmVzdW1lI3Jlc3VtZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzdW1lKCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJZ2V0VGhyZWFkKCkucmVzdW1lKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN1c3BlbmRSZXN1bWUjc3VzcGVuZCgpCi0JICovCi0JcHVibGljIHZvaWQgc3VzcGVuZCgpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0JCWdldFRocmVhZCgpLnN1c3BlbmQoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVGVybWluYXRlI2NhblRlcm1pbmF0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVGVybWluYXRlKCkgewotCQlyZXR1cm4gZ2V0VGhyZWFkKCkuY2FuVGVybWluYXRlKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVRlcm1pbmF0ZSNpc1Rlcm1pbmF0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVGVybWluYXRlZCgpIHsKLQkJcmV0dXJuIGdldFRocmVhZCgpLmlzVGVybWluYXRlZCgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklUZXJtaW5hdGUjdGVybWluYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXJtaW5hdGUoKSB0aHJvd3MgRGVidWdFeGNlcHRpb24gewotCQlnZXRUaHJlYWQoKS50ZXJtaW5hdGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYnVpbGRmaWxlIHRoaXMgc3RhY2sgZnJhbWUgaXMgYXNzb2NpYXRlZAotCSAqIHdpdGguCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgYnVpbGRmaWxlIHRoaXMgc3RhY2sgZnJhbWUgaXMgYXNzb2NpYXRlZAotCSAqIHdpdGgKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNvdXJjZU5hbWUoKSB7Ci0JCXJldHVybiBmRmlsZVBhdGg7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFudFN0YWNrRnJhbWUpIHsKLQkJCUFudFN0YWNrRnJhbWUgc2YgPSAoQW50U3RhY2tGcmFtZSlvYmo7Ci0JCQlpZiAoZ2V0U291cmNlTmFtZSgpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZ2V0U291cmNlTmFtZSgpLmVxdWFscyhzZi5nZXRTb3VyY2VOYW1lKCkpICYmCi0JCQkJCXNmLmdldExpbmVOdW1iZXIoKSA9PSBnZXRMaW5lTnVtYmVyKCkgJiYKLQkJCQkJc2YuZklkID09IGZJZDsKLQkJCX0gCi0JCQlyZXR1cm4gc2YuZklkID09IGZJZDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JICAgIGlmIChnZXRTb3VyY2VOYW1lKCkgPT0gbnVsbCkgewotCSAgICAgICAgcmV0dXJuIGZJZDsKLQkgICAgfQotCSAgICByZXR1cm4gZ2V0U291cmNlTmFtZSgpLmhhc2hDb2RlKCkgKyBmSWQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBzdGFjayBmcmFtZSdzIHVuaXF1ZSBpZGVudGlmaWVyIHdpdGhpbiBpdHMgdGhyZWFkCi0JICogCi0JICogQHJldHVybiB0aGlzIHN0YWNrIGZyYW1lJ3MgdW5pcXVlIGlkZW50aWZpZXIgd2l0aGluIGl0cyB0aHJlYWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldElkZW50aWZpZXIoKSB7Ci0JCXJldHVybiBmSWQ7Ci0JfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHN5c3RlbSwgdXNlciBvciBydW50aW1lIHByb3BlcnR5Ci0gICAgICogbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIHJlc29sdmUgYSBwcm9wZXJ0eSB3aXRoIHRoZSBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gc2VhcmNoIGZvcgotICAgICAqIEByZXR1cm4gYSBwcm9wZXJ0eSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyBBbnRQcm9wZXJ0eSBmaW5kUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVZhcmlhYmxlW10gZ3JvdXBzPSBnZXRWYXJpYWJsZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQW50UHJvcGVydGllcyBwcm9wZXJ0aWVzR3JvdXBpbmcgPSAoQW50UHJvcGVydGllcykgZ3JvdXBzW2ldOwotICAgICAgICAgICAgICAgIEFudFByb3BlcnRpZXNWYWx1ZSB2YWx1ZT0gKEFudFByb3BlcnRpZXNWYWx1ZSkgcHJvcGVydGllc0dyb3VwaW5nLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgSVZhcmlhYmxlW10gcHJvcGVydGllcz0gdmFsdWUuZ2V0VmFyaWFibGVzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFudFByb3BlcnR5IHByb3BlcnR5ID0gKEFudFByb3BlcnR5KSBwcm9wZXJ0aWVzW2pdOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkuZ2V0TmFtZSgpLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGVydHk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKERlYnVnRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9IAotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvQW50VmFsdWUuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL21vZGVsL0FudFZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyODUyNzkuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvQW50VmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5kZWJ1Zy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcuZGVidWcuSUFudERlYnVnQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhcmlhYmxlOwotCi1wdWJsaWMgY2xhc3MgQW50VmFsdWUgZXh0ZW5kcyBBbnREZWJ1Z0VsZW1lbnQgaW1wbGVtZW50cyBJVmFsdWUgIHsKLQotICAgIHByaXZhdGUgU3RyaW5nIGZWYWx1ZVN0cmluZzsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElWYXJpYWJsZVtdIEVNUFRZID0gbmV3IElWYXJpYWJsZVswXTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdGFyZ2V0Ci0gICAgICovCi0gICAgcHVibGljIEFudFZhbHVlKEFudERlYnVnVGFyZ2V0IHRhcmdldCwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIHN1cGVyKHRhcmdldCk7Ci0gICAgICAgIGZWYWx1ZVN0cmluZz0gdmFsdWU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWUjZ2V0UmVmZXJlbmNlVHlwZU5hbWUoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlVHlwZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlI2dldFZhbHVlU3RyaW5nKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZlZhbHVlU3RyaW5nOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVZhbHVlI2lzQWxsb2NhdGVkKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FsbG9jYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWUjZ2V0VmFyaWFibGVzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSVZhcmlhYmxlW10gZ2V0VmFyaWFibGVzKCkgewotICAgICAgICByZXR1cm4gRU1QVFk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JVmFsdWUjaGFzVmFyaWFibGVzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNWYXJpYWJsZXMoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklEZWJ1Z0VsZW1lbnQjZ2V0TW9kZWxJZGVudGlmaWVyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE1vZGVsSWRlbnRpZmllcigpIHsKLSAgICAgICAgcmV0dXJuIElBbnREZWJ1Z0NvbnN0YW50cy5JRF9BTlRfREVCVUdfTU9ERUw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvRGVidWdNZXNzYWdlSWRzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9tb2RlbC9EZWJ1Z01lc3NhZ2VJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNjOGYzZS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9tb2RlbC9EZWJ1Z01lc3NhZ2VJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5kZWJ1Zy5tb2RlbDsKLQotCi1wdWJsaWMgY2xhc3MgRGVidWdNZXNzYWdlSWRzIHsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNRVNTQUdFX0RFTElNSVRFUj0gIiwiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQlVJTERfU1RBUlRFRD0gICAiYnVpbGRfc3RhcnRlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUQVJHRVRfU1RBUlRFRD0gInRhcmdldF9zdGFydGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBUkdFVF9GSU5JU0hFRD0gInRhcmdldF9maW5pc2hlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUQVNLX1NUQVJURUQ9ICJ0YXNrX3N0YXJ0ZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFTS19GSU5JU0hFRD0gInRhc2tfZmluaXNoZWQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RFUD0gInN0ZXAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RFUF9PVkVSPSAic3RlcF9vdmVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNURVBfSU5UTz0gInN0ZXBfaW50byI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBURVJNSU5BVEU9ICJ0ZXJtaW5hdGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEVSTUlOQVRFRD0gInRlcm1pbmF0ZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VTUEVORD0gInN1c3BlbmQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VTUEVOREVEPSAic3VzcGVuZGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFU1VNRT0gInJlc3VtZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVEFDSz0gInN0YWNrIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9CUkVBS1BPSU5UPSAiYWRkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFTU9WRV9CUkVBS1BPSU5UPSAicmVtb3ZlIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENMSUVOVF9SRVFVRVNUPSAiY2xpZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEJSRUFLUE9JTlQ9ICJicmVha3BvaW50IjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BFUlRJRVM9ICJwcm9wIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBST1BFUlRZX1ZBTFVFPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUFJPUEVSVFlfVVNFUj0gMDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBQUk9QRVJUWV9TWVNURU09IDE7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUFJPUEVSVFlfUlVOVElNRT0gMjsKLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL21vZGVsL0RlYnVnTW9kZWxNZXNzYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvRGVidWdNb2RlbE1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYWRhZDYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvZGVidWcvbW9kZWwvRGVidWdNb2RlbE1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5kZWJ1Zy5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBEZWJ1Z01vZGVsTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmRlYnVnLm1vZGVsLkRlYnVnTW9kZWxNZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50RGVidWdUYXJnZXRfMDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudExpbmVCcmVha3BvaW50XzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50VGhyZWFkXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50VGhyZWFkXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50VGhyZWFkXzI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQW50VGhyZWFkXzM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQW50VGhyZWFkXzQ7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQW50UHJvcGVydGllc18xOwotICAgIAotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBEZWJ1Z01vZGVsTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9kZWJ1Zy9tb2RlbC9EZWJ1Z01vZGVsTWVzc2FnZXMucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL21vZGVsL0RlYnVnTW9kZWxNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWNmODQzLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2RlYnVnL21vZGVsL0RlYnVnTW9kZWxNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1BbnREZWJ1Z1RhcmdldF8wPUFudCBCdWlsZAotCi1BbnRMaW5lQnJlYWtwb2ludF8wPUFudCBicmVha3BvaW50IFtsaW5lOiB7MH1dCi1BbnRUaHJlYWRfMD1Vc2VyIFByb3BlcnRpZXMKLUFudFRocmVhZF8xPVN5c3RlbSBQcm9wZXJ0aWVzCi1BbnRUaHJlYWRfMj1SdW50aW1lIFByb3BlcnRpZXMKLUFudFRocmVhZF8zPVJlcXVlc3QgdG8gcmV0cmlldmUgQW50IHN0YWNrIGZyYW1lcyBmYWlsZWQKLUFudFRocmVhZF80PVJlcXVlc3QgdG8gcmV0cmlldmUgQW50IHByb3BlcnRpZXMgZmFpbGVkCi0KLUFudFByb3BlcnRpZXNfMT1SZXF1ZXN0IHRvIEFudCBwcm9wZXJ0aWVzIHZhbHVlIGZhaWxlZApkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50Q2xhc3NwYXRoUHJvdmlkZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudENsYXNzcGF0aFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZjhiMzYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50Q2xhc3NwYXRoUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmxhdW5jaENvbmZpZ3VyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5TdGFuZGFyZENsYXNzcGF0aFByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgQW50Q2xhc3NwYXRoUHJvdmlkZXIgZXh0ZW5kcyBTdGFuZGFyZENsYXNzcGF0aFByb3ZpZGVyIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVJ1bnRpbWVDbGFzc3BhdGhQcm92aWRlciNjb21wdXRlVW5yZXNvbHZlZENsYXNzcGF0aChvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyBJUnVudGltZUNsYXNzcGF0aEVudHJ5W10gY29tcHV0ZVVucmVzb2x2ZWRDbGFzc3BhdGgoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlib29sZWFuIHVzZURlZmF1bHQgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUZBVUxUX0NMQVNTUEFUSCwgdHJ1ZSk7Ci0JCWlmICh1c2VEZWZhdWx0KSB7Ci0JCQlMaXN0IHJ0ZXMgPSBuZXcgQXJyYXlMaXN0KDEwKTsKLQkJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkganJlRW50cnkgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlqcmVFbnRyeSA9IEphdmFSdW50aW1lLmNvbXB1dGVKUkVFbnRyeShjb25maWd1cmF0aW9uKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIG5vdCBhIGphdmEgcHJvamVjdAotCQkJfQotCQkJaWYgKGpyZUVudHJ5ID09IG51bGwpIHsKLQkJCQlqcmVFbnRyeSA9IEphdmFSdW50aW1lLm5ld1J1bnRpbWVDb250YWluZXJDbGFzc3BhdGhFbnRyeSgKLQkJCQkJCUphdmFSdW50aW1lLm5ld0RlZmF1bHRKUkVDb250YWluZXJQYXRoKCksIElSdW50aW1lQ2xhc3NwYXRoRW50cnkuU1RBTkRBUkRfQ0xBU1NFUyk7Ci0JCQl9Ci0JCQlydGVzLmFkZChqcmVFbnRyeSk7Ci0JCQlydGVzLmFkZChuZXcgQW50SG9tZUNsYXNzcGF0aEVudHJ5KCkpOwotCQkJcnRlcy5hZGQobmV3IENvbnRyaWJ1dGVkQ2xhc3NwYXRoRW50cmllc0VudHJ5KCkpOwotCQkJcmV0dXJuIChJUnVudGltZUNsYXNzcGF0aEVudHJ5W10pIHJ0ZXMudG9BcnJheShuZXcgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtydGVzLnNpemUoKV0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5jb21wdXRlVW5yZXNvbHZlZENsYXNzcGF0aChjb25maWd1cmF0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRIb21lQ2xhc3NwYXRoRW50cnkuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudEhvbWVDbGFzc3BhdGhFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYThhOWJmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudEhvbWVDbGFzc3BhdGhFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmxhdW5jaENvbmZpZ3VyYXRpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5JQW50Q2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmxhdW5jaGluZy5BYnN0cmFjdFJ1bnRpbWVDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklSdW50aW1lQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5NZXNzYWdlRm9ybWF0OwotCi0vKioKLSAqIEEgY2xhc3NwYXRoIGVudHJ5IHRoYXQgY29udGFpbnMgYSBzZXQgb2YgYXJjaGl2ZXMgZm9yIGEgcGFydGljdWxhcgotICogQU5UX0hPTUUuCi0gKiAKLSAqIEBzaW5jZSAzLjAgCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRIb21lQ2xhc3NwYXRoRW50cnkgZXh0ZW5kcyBBYnN0cmFjdFJ1bnRpbWVDbGFzc3BhdGhFbnRyeSB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9JRCA9ICJvcmcuZWNsaXBzZS5hbnQudWkuY2xhc3NwYXRoZW50cnkuYW50SG9tZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBMb2NhbCBwYXRoIG9uIGRpc2sgd2hlcmUgQW50IEhvbWUgaXMgbG9jYXRlZCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIHRvIGluZGljYXRlIHRoZSB1c2Ugb2YgdGhlIGRlZmF1bHQgQW50IEhvbWUuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgYW50SG9tZUxvY2F0aW9uID0gbnVsbDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIEFudEhvbWUgZW50cnkgZm9yIHRoZSBkZWZhdWx0IEFudEhvbWUgaW5zdGFsbGF0aW9uLgotCSAqLwotCXB1YmxpYyBBbnRIb21lQ2xhc3NwYXRoRW50cnkoKSB7Ci0JCWFudEhvbWVMb2NhdGlvbiA9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYW4gQW50SG9tZSBlbnRyeSBmb3IgdGhlIEFudCBpbnN0YWxsZWQgYXQgdGhlIHNwZWNpZmllZAotCSAqIHJvb3QgZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBhbnRIb21lIHBhdGggaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIHRvIGFuIEFudCBpbnN0YWxsYXRpb24KLQkgKi8KLQlwdWJsaWMgQW50SG9tZUNsYXNzcGF0aEVudHJ5KFN0cmluZyBhbnRIb21lKSB7Ci0JCWFudEhvbWVMb2NhdGlvbiA9IGFudEhvbWU7Ci0JfQotCQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwubGF1bmNoaW5nLkFic3RyYWN0UnVudGltZUNsYXNzcGF0aEVudHJ5I2J1aWxkTWVtZW50byhvcmcudzNjLmRvbS5Eb2N1bWVudCwgb3JnLnczYy5kb20uRWxlbWVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBidWlsZE1lbWVudG8oRG9jdW1lbnQgZG9jdW1lbnQsIEVsZW1lbnQgbWVtZW50bykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoYW50SG9tZUxvY2F0aW9uID09IG51bGwpIHsKLQkJCW1lbWVudG8uc2V0QXR0cmlidXRlKCJkZWZhdWx0IiwgInRydWUiKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCX0gZWxzZSB7Ci0JCQltZW1lbnRvLnNldEF0dHJpYnV0ZSgiYW50SG9tZSIsIG5ldyBQYXRoKGFudEhvbWVMb2NhdGlvbikudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwubGF1bmNoaW5nLklSdW50aW1lQ2xhc3NwYXRoRW50cnkyI2luaXRpYWxpemVGcm9tKG9yZy53M2MuZG9tLkVsZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oRWxlbWVudCBtZW1lbnRvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBhbnRIb21lID0gbWVtZW50by5nZXRBdHRyaWJ1dGUoImFudEhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoYW50SG9tZSAhPSBudWxsICYmIChhbnRIb21lLmxlbmd0aCgpID4gMCkpIHsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChhbnRIb21lKTsKLQkJCWFudEhvbWVMb2NhdGlvbiA9IHBhdGgudG9PU1N0cmluZygpOwotCQl9IGVsc2UgewotCQkJYW50SG9tZUxvY2F0aW9uID0gbnVsbDsKLQkJfQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklSdW50aW1lQ2xhc3NwYXRoRW50cnkyI2dldFR5cGVJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlSWQoKSB7Ci0JCXJldHVybiBUWVBFX0lEOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklSdW50aW1lQ2xhc3NwYXRoRW50cnkyI2dldFJ1bnRpbWVDbGFzc3BhdGhFbnRyaWVzKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIElSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBnZXRSdW50aW1lQ2xhc3NwYXRoRW50cmllcyhJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUxpc3QgbGlicyA9IG5ldyBBcnJheUxpc3QoNDApOwotCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCk7Ci0JCWlmIChhbnRIb21lTG9jYXRpb24gPT0gbnVsbCkgewotCQkJSUFudENsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IHByZWZlcmVuY2VzLmdldEFudEhvbWVDbGFzc3BhdGhFbnRyaWVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQW50Q2xhc3NwYXRoRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJCWxpYnMuYWRkKEphdmFSdW50aW1lLm5ld1N0cmluZ1ZhcmlhYmxlQ2xhc3NwYXRoRW50cnkoZW50cnkuZ2V0TGFiZWwoKSkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJRmlsZSBsaWI9IHJlc29sdmVBbnRIb21lKCk7Ci0JCQlJUGF0aCBsaWJEaXIgPSBuZXcgUGF0aChhbnRIb21lTG9jYXRpb24pLmFwcGVuZCgibGliIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1tdIGZpbGVOYW1lcyA9IGxpYi5saXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gZmlsZU5hbWVzW2ldOwotCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChuYW1lKTsKLQkJCQlTdHJpbmcgZmlsZUV4dGVuc2lvbiA9IHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOwotCQkJCWlmICgiamFyIi5lcXVhbHNJZ25vcmVDYXNlKGZpbGVFeHRlbnNpb24pKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbGlicy5hZGQoSmF2YVJ1bnRpbWUubmV3QXJjaGl2ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShsaWJEaXIuYXBwZW5kKHBhdGgpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdKSBsaWJzLnRvQXJyYXkobmV3IElSdW50aW1lQ2xhc3NwYXRoRW50cnlbbGlicy5zaXplKCldKTsKLQl9Ci0JCi0JcHVibGljIEZpbGUgcmVzb2x2ZUFudEhvbWUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChhbnRIb21lTG9jYXRpb24gPT0gbnVsbCkgeyAvL3VzaW5nIHRoZSBkZWZhdWx0IGFudCBob21lCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJUGF0aCBsaWJEaXI9IG5ldyBQYXRoKGFudEhvbWVMb2NhdGlvbikuYXBwZW5kKCJsaWIiKTsgLy8kTk9OLU5MUy0xJAotCQlGaWxlIGxpYj0gbGliRGlyLnRvRmlsZSgpOwotCQlGaWxlIHBhcmVudERpcj0gbGliLmdldFBhcmVudEZpbGUoKTsKLQkJaWYgKHBhcmVudERpciA9PSBudWxsIHx8ICFwYXJlbnREaXIuZXhpc3RzKCkpIHsKLQkJCWFib3J0KE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5BbnRIb21lQ2xhc3NwYXRoRW50cnlfMTAsIG5ldyBTdHJpbmdbXSB7YW50SG9tZUxvY2F0aW9ufSksIG51bGwpOwotCQl9Ci0JCWlmICghbGliLmV4aXN0cygpIHx8ICFsaWIuaXNEaXJlY3RvcnkoKSkgewotCQkJYWJvcnQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkFudEhvbWVDbGFzc3BhdGhFbnRyeV8xMSwgbmV3IFN0cmluZ1tdIHthbnRIb21lTG9jYXRpb259KSwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIGxpYjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5MiNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmIChhbnRIb21lTG9jYXRpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5BbnRIb21lQ2xhc3NwYXRoRW50cnlfODsKLQkJfQotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkFudEhvbWVDbGFzc3BhdGhFbnRyeV85LCBuZXcgU3RyaW5nW117YW50SG9tZUxvY2F0aW9ufSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSNnZXRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiBJUnVudGltZUNsYXNzcGF0aEVudHJ5Lk9USEVSOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklSdW50aW1lQ2xhc3NwYXRoRW50cnkyI2lzQ29tcG9zaXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBvc2l0ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEFudEhvbWVDbGFzc3BhdGhFbnRyeSAmJgotCQkgIGVxdWFsc09yTnVsbChhbnRIb21lTG9jYXRpb24sICgoQW50SG9tZUNsYXNzcGF0aEVudHJ5KW9iaikuYW50SG9tZUxvY2F0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgczEgaXMgZXF1aXZhbGVudCB0byBzMi4KLQkgKiAKLQkgKiBAcGFyYW0gczEKLQkgKiBAcGFyYW0gczIKLQkgKiBAcmV0dXJuIHdoZXRoZXIgczEgaXMgZXF1aXZhbGVudCB0byBzMgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBlcXVhbHNPck51bGwoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJaWYgKHMxID09IG51bGwgfHwgczIgPT0gbnVsbCkgewotCQkJcmV0dXJuIHMxID09IHMyOwotCQl9IAotCQlyZXR1cm4gczEuZXF1YWxzSWdub3JlQ2FzZShzMik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGdldENsYXNzKCkuaGFzaENvZGUoKTsKLQl9CQotCQotCS8qKgotCSAqIFNldHMgdGhlIGFudCBob21lIHRvIHVzZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCBwYXRoIHRvIHRvb3Igb2YgYW4gYW50IGhvbWUgaW5zdGFsbGF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0QW50SG9tZShTdHJpbmcgcGF0aCkgewotCQlhbnRIb21lTG9jYXRpb24gPSBwYXRoOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhbnQgaG9tZSBsb2NhdGlvbgotCSAqIAotCSAqIEByZXR1cm4gcGF0aCB0byByb290IGFudCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRBbnRIb21lKCkgewotCQlpZiAoYW50SG9tZUxvY2F0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiBBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCkuZ2V0QW50SG9tZSgpOwotCQl9Ci0JCXJldHVybiBhbnRIb21lTG9jYXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50SmF2YUxhdW5jaERlbGVnYXRlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRKYXZhTGF1bmNoRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMwOGM2NS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRKYXZhTGF1bmNoRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5sYXVuY2hDb25maWd1cmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhTGF1bmNoRGVsZWdhdGU7Ci0KLS8qKgotICogVXNlZCBieSB0aGUgQW50TGF1bmNoRGVsZWdhdGUgZm9yIEFudCBidWlsZHMgaW4gYSBzZXBhcmF0ZSBWTQotICogVGhlIHN1YmNsYXNzaW5nIGlzIG5lZWRlZCB0byBiZSBhYmxlIHRvIGxhdW5jaCBhbiBBbnQgYnVpbGQgZnJvbSBhIG5vbi1KYXZhIHByb2plY3QKLSAqLwotcHVibGljIGNsYXNzIEFudEphdmFMYXVuY2hEZWxlZ2F0ZSBleHRlbmRzIEphdmFMYXVuY2hEZWxlZ2F0ZSB7Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlMiNwcmVMYXVuY2hDaGVjayhvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcmVMYXVuY2hDaGVjayhJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLFN0cmluZyBtb2RlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBzdXBlci5wcmVMYXVuY2hDaGVjayhjb25maWd1cmF0aW9uLCBtb2RlLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy9saWtlbHkgZGVhbGluZyB3aXRoIGEgbm9uLUphdmEgcHJvamVjdAotCQl9Ci0JCS8vbm8gbmVlZCB0byBjaGVjayBmb3IgYnJlYWtwb2ludHMgYXMgYWx3YXlzIGluIHJ1biBtb2RlCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkFic3RyYWN0SmF2YUxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZSNnZXRQcm9ncmFtQXJndW1lbnRzKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9ncmFtQXJndW1lbnRzKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBzdXBlci5nZXRQcm9ncmFtQXJndW1lbnRzKGNvbmZpZ3VyYXRpb24pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCX0KLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0dSQU1fQVJHVU1FTlRTLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGM3ZGYzLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogZGFrc2hpbmFtdXJ0aHkua2FycmFAZ21haWwuY29tIC0gYnVnIDE2NTM3MQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcubGF1bmNoQ29uZmlndXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5sYXVuY2hDb25maWd1cmF0aW9ucy5BbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudExhdW5jaERlbGVnYXRlX0xhdW5jaGluZ19fMF9fMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRMYXVuY2hEZWxlZ2F0ZV9SdW5uaW5nX18wX18yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudExhdW5jaERlbGVnYXRlX0J1aWxkX0luX1Byb2dyZXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudExhdW5jaERlbGVnYXRlX0ZhaWx1cmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TGF1bmNoRGVsZWdhdGVfMjI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TGF1bmNoRGVsZWdhdGVfMjM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TGF1bmNoRGVsZWdhdGVfMjg7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRIb21lQ2xhc3NwYXRoRW50cnlfODsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRIb21lQ2xhc3NwYXRoRW50cnlfOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRIb21lQ2xhc3NwYXRoRW50cnlfMTA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50SG9tZUNsYXNzcGF0aEVudHJ5XzExOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udHJpYnV0ZWRDbGFzc3BhdGhFbnRyaWVzRW50cnlfMTsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjYxNjU1Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgZGFrc2hpbmFtdXJ0aHkua2FycmFAZ21haWwuY29tIC0gYnVnIDE2NTM3MQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1BbnRMYXVuY2hEZWxlZ2F0ZV9MYXVuY2hpbmdfXzBfXzE9TGF1bmNoaW5nIHswfQotQW50TGF1bmNoRGVsZWdhdGVfUnVubmluZ19fMF9fMj1SdW5uaW5nIHswfQotQW50TGF1bmNoRGVsZWdhdGVfQnVpbGRfSW5fUHJvZ3Jlc3M9QW50IGJ1aWxkIHswfSBhbHJlYWR5IGluIHByb2dyZXNzLiBDb25jdXJyZW50IEFudCBidWlsZHMgYXJlIHBvc3NpYmxlIGlmIHlvdSBzcGVjaWZ5IHRvIGJ1aWxkIGluIGEgc2VwYXJhdGUgSlJFLgotQW50TGF1bmNoRGVsZWdhdGVfRmFpbHVyZT1GYWlsdXJlIG9mIEJhY2tncm91bmQgQW50IEJ1aWxkCi1BbnRMYXVuY2hEZWxlZ2F0ZV8yMj0mRG8gbm90IHNob3cgZXJyb3IgZGlhbG9nIHdoZW4gQW50IGJ1aWxkIGZhaWxzCi1BbnRMYXVuY2hEZWxlZ2F0ZV8yMz1BbnQgQnVpbGQgRmFpbGVkCi1BbnRMYXVuY2hEZWxlZ2F0ZV8yOD1XYWl0aW5nIGZvciB2aXJ0dWFsIG1hY2hpbmUgdG8gZXhpdC4uLgotCi1BbnRIb21lQ2xhc3NwYXRoRW50cnlfOD1BbnQgSG9tZSAoRGVmYXVsdCkKLUFudEhvbWVDbGFzc3BhdGhFbnRyeV85PUFudCBIb21lICh7MH0pCi1BbnRIb21lQ2xhc3NwYXRoRW50cnlfMTA9QW50IEhvbWUgezB9IGRvZXMgbm90IGV4aXN0Ci1BbnRIb21lQ2xhc3NwYXRoRW50cnlfMTE9QW50IEhvbWUgezB9IGRvZXMgbm90IGNvbnRhaW4gYSAibGliIiBkaXJlY3RvcnkKLQotQ29udHJpYnV0ZWRDbGFzc3BhdGhFbnRyaWVzRW50cnlfMT1BZGRpdGlvbmFsIFRhc2tzICYgU3VwcG9ydApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudE1pZ3JhdGlvbkRlbGVnYXRlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRNaWdyYXRpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDU2ODMyLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudE1pZ3JhdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcubGF1bmNoQ29uZmlndXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLkFudExhdW5jaGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHRlcm5hbHRvb2xzLmludGVybmFsLklFeHRlcm5hbFRvb2xDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzLklTdHJpbmdWYXJpYWJsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMuVmFyaWFibGVzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbk1pZ3JhdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLQotLyoqCi0gKiBEZWxlZ2F0ZSBmb3IgbWlncmF0aW5nIEFudCBsYXVuY2ggY29uZmlndXJhdGlvbnMuCi0gKiBUaGUgbWlncmF0aW9uIHByb2Nlc3MgaW52b2x2ZXMgYSByZXNvdXJjZSBtYXBwaW5nIGJlaW5nIGNyZWF0ZWQgc3VjaCB0aGF0IGxhdW5jaCBjb25maWd1cmF0aW9ucwotICogY2FuIGJlIGZpbHRlcmVkIGZyb20gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIGRpYWxvZyBiYXNlZCBvbiByZXNvdXJjZSBhdmFpbGFiaWxpdHkuCi0gKiAKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGNsYXNzIEFudE1pZ3JhdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUxhdW5jaENvbmZpZ3VyYXRpb25NaWdyYXRpb25EZWxlZ2F0ZSB7Ci0JCi0JLyoqCi0JICogTWV0aG9kIHRvIGdldCB0aGUgZmlsZSBmb3IgdGhlIHNwZWNpZmllZCBsYXVuY2ggY29uZmlndXJhdGlvbiB0aGF0IHNob3VsZCBiZSBtYXBwZWQgdG8gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uICAKLQkgKiAKLQkgKiBAcGFyYW0gY2FuZGlkYXRlIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiB0aGF0IHRoZSBmaWxlIHdpbGwgYmUgbWFwcGVkIHRvLgotCSAqIEByZXR1cm4gdGhlIGJ1aWxkZmlsZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqLwotCXByb3RlY3RlZCBJRmlsZSBnZXRGaWxlRm9yQ2FuZGlkYXRlKElMYXVuY2hDb25maWd1cmF0aW9uIGNhbmRpZGF0ZSkgewotCQlJRmlsZSBmaWxlPSBudWxsOwotCQlTdHJpbmcgZXhwYW5kZWRMb2NhdGlvbj0gbnVsbDsKLQkJU3RyaW5nIGxvY2F0aW9uPSBudWxsOwotCQlJU3RyaW5nVmFyaWFibGVNYW5hZ2VyIG1hbmFnZXIgPSBWYXJpYWJsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZ1ZhcmlhYmxlTWFuYWdlcigpOwotCQl0cnkgewotCQkJbG9jYXRpb249IGNhbmRpZGF0ZS5nZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX0xPQ0FUSU9OLCAoU3RyaW5nKW51bGwpOwotCQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQlleHBhbmRlZExvY2F0aW9uPSBtYW5hZ2VyLnBlcmZvcm1TdHJpbmdTdWJzdGl0dXRpb24obG9jYXRpb24pOwotCQkJCWlmIChleHBhbmRlZExvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJZmlsZT0gQW50TGF1bmNoaW5nVXRpbC5nZXRGaWxlRm9yTG9jYXRpb24oZXhwYW5kZWRMb2NhdGlvbiwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbk1pZ3JhdGlvbkRlbGVnYXRlI2lzQ2FuZGlkYXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NhbmRpZGF0ZShJTGF1bmNoQ29uZmlndXJhdGlvbiBjYW5kaWRhdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVJlc291cmNlW10gbWFwcGVkUmVzb3VyY2VzID0gY2FuZGlkYXRlLmdldE1hcHBlZFJlc291cmNlcygpOwotCQlpZiAobWFwcGVkUmVzb3VyY2VzICE9IG51bGwgJiYgbWFwcGVkUmVzb3VyY2VzLmxlbmd0aCA+IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZ2V0RmlsZUZvckNhbmRpZGF0ZShjYW5kaWRhdGUpICE9IG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbk1pZ3JhdGlvbkRlbGVnYXRlI21pZ3JhdGUob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBtaWdyYXRlKElMYXVuY2hDb25maWd1cmF0aW9uIGNhbmRpZGF0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRmlsZSBmaWxlID0gZ2V0RmlsZUZvckNhbmRpZGF0ZShjYW5kaWRhdGUpOwotCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdjID0gY2FuZGlkYXRlLmdldFdvcmtpbmdDb3B5KCk7Ci0JCXdjLnNldE1hcHBlZFJlc291cmNlcyhuZXcgSVJlc291cmNlW10ge2ZpbGV9KTsKLQkJd2MuZG9TYXZlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudFN0cmVhbU1vbml0b3IuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudFN0cmVhbU1vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y2MTk5Zi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRTdHJlYW1Nb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcubGF1bmNoQ29uZmlndXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSVN0cmVhbUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUZsdXNoYWJsZVN0cmVhbU1vbml0b3I7Ci0KLS8qKgotICogU3RyZWFtIG1vbml0b3IgaW1wbGVtZW50YXRpb24gZm9yIGFuIEFudCBidWlsZCBwcm9jZXNzLgotICovCi1wdWJsaWMgY2xhc3MgQW50U3RyZWFtTW9uaXRvciBpbXBsZW1lbnRzIElGbHVzaGFibGVTdHJlYW1Nb25pdG9yIHsKLQotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZDb250ZW50cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlwcml2YXRlIExpc3RlbmVyTGlzdCBmTGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgxKTsKLQlwcml2YXRlIGJvb2xlYW4gZkJ1ZmZlcmVkID0gdHJ1ZTsKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0cmVhbU1vbml0b3IjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JU3RyZWFtTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSVN0cmVhbUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0cmVhbU1vbml0b3IjZ2V0Q29udGVudHMoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudHMoKSB7Ci0JCXJldHVybiBmQ29udGVudHMudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0cmVhbU1vbml0b3IjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JU3RyZWFtTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSVN0cmVhbUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmRzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIHRoaXMgc3RyZWFtLCBhbmQgbm90aWZpZXMgbGlzdGVuZXJzLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICovCi0JcHVibGljIHZvaWQgYXBwZW5kKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmIChpc0J1ZmZlcmVkKCkpIHsKLQkJCWZDb250ZW50cy5hcHBlbmQobWVzc2FnZSk7Ci0JCX0KLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gZkxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCUlTdHJlYW1MaXN0ZW5lciBsaXN0ZW5lciA9IChJU3RyZWFtTGlzdGVuZXIpbGlzdGVuZXJzW2ldOwotCQkJbGlzdGVuZXIuc3RyZWFtQXBwZW5kZWQobWVzc2FnZSwgdGhpcyk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklGbHVzaGFibGVTdHJlYW1Nb25pdG9yI2ZsdXNoQ29udGVudHMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGZsdXNoQ29udGVudHMoKSB7Ci0JCWZDb250ZW50cy5zZXRMZW5ndGgoMCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklGbHVzaGFibGVTdHJlYW1Nb25pdG9yI2lzQnVmZmVyZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQnVmZmVyZWQoKSB7Ci0JCXJldHVybiBmQnVmZmVyZWQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklGbHVzaGFibGVTdHJlYW1Nb25pdG9yI3NldEJ1ZmZlcmVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0QnVmZmVyZWQoYm9vbGVhbiBidWZmZXIpIHsKLQkJZkJ1ZmZlcmVkID0gYnVmZmVyOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50U3RyZWFtc1Byb3h5LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRTdHJlYW1zUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZhNWUwOS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRTdHJlYW1zUHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5sYXVuY2hDb25maWd1cmF0aW9uczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5BbnRMYXVuY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RyZWFtTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdHJlYW1zUHJveHk7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRTdHJlYW1zUHJveHkgaW1wbGVtZW50cyBJU3RyZWFtc1Byb3h5IHsKLQkKLQlwcml2YXRlIEFudFN0cmVhbU1vbml0b3IgZkVycm9yTW9uaXRvciA9IG5ldyBBbnRTdHJlYW1Nb25pdG9yKCk7Ci0JcHJpdmF0ZSBBbnRTdHJlYW1Nb25pdG9yIGZPdXRwdXRNb25pdG9yID0gbmV3IEFudFN0cmVhbU1vbml0b3IoKTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTlRfREVCVUdfU1RSRUFNID0gQW50TGF1bmNoaW5nLlBMVUdJTl9JRCArICIuQU5UX0RFQlVHX1NUUkVBTSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTlRfVkVSQk9TRV9TVFJFQU0gPSBBbnRMYXVuY2hpbmcuUExVR0lOX0lEICsgIi5BTlRfVkVSQk9TRV9TVFJFQU0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UX1dBUk5JTkdfU1RSRUFNID0gQW50TGF1bmNoaW5nLlBMVUdJTl9JRCArICIuQU5UX1dBUk5JTkdfU1RSRUFNIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgQW50U3RyZWFtTW9uaXRvciBmRGVidWdNb25pdG9yID0gbmV3IEFudFN0cmVhbU1vbml0b3IoKTsKLQlwcml2YXRlIEFudFN0cmVhbU1vbml0b3IgZlZlcmJvc2VNb25pdG9yID0gbmV3IEFudFN0cmVhbU1vbml0b3IoKTsKLQlwcml2YXRlIEFudFN0cmVhbU1vbml0b3IgZldhcm5pbmdNb25pdG9yID0gbmV3IEFudFN0cmVhbU1vbml0b3IoKTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RyZWFtc1Byb3h5I2dldEVycm9yU3RyZWFtTW9uaXRvcigpCi0JICovCi0JcHVibGljIElTdHJlYW1Nb25pdG9yIGdldEVycm9yU3RyZWFtTW9uaXRvcigpIHsKLQkJcmV0dXJuIGZFcnJvck1vbml0b3I7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdHJlYW1zUHJveHkjZ2V0T3V0cHV0U3RyZWFtTW9uaXRvcigpCi0JICovCi0JcHVibGljIElTdHJlYW1Nb25pdG9yIGdldE91dHB1dFN0cmVhbU1vbml0b3IoKSB7Ci0JCXJldHVybiBmT3V0cHV0TW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0cmVhbXNQcm94eSN3cml0ZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBpbnB1dCkgewotCX0KLQotCXB1YmxpYyBJU3RyZWFtTW9uaXRvciBnZXRXYXJuaW5nU3RyZWFtTW9uaXRvcigpIHsKLQkJcmV0dXJuIGZXYXJuaW5nTW9uaXRvcjsKLQl9Ci0JCi0JcHVibGljIElTdHJlYW1Nb25pdG9yIGdldERlYnVnU3RyZWFtTW9uaXRvcigpIHsKLQkJcmV0dXJuIGZEZWJ1Z01vbml0b3I7Ci0JfQkKLQkKLQlwdWJsaWMgSVN0cmVhbU1vbml0b3IgZ2V0VmVyYm9zZVN0cmVhbU1vbml0b3IoKSB7Ci0JCXJldHVybiBmVmVyYm9zZU1vbml0b3I7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL01lc3NhZ2VJZHMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL01lc3NhZ2VJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5ZTE4YS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9sYXVuY2hDb25maWd1cmF0aW9ucy9NZXNzYWdlSWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5sYXVuY2hDb25maWd1cmF0aW9uczsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VJZHMgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPQ0VTU19JRD0gICAicHJvY2Vzc0lEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEJVSUxEX0NBTkNFTExFRD0gImNhbmNlbGxlZCI7IC8vJE5PTi1OTFMtMSQKLQkvL2NvbnN0YW50cyBuZWVkIHRvIHN0YXJ0IGdyZWF0ZXIgdGhhbiB0aGUgUHJvamVjdC5NU0dfKiBjb25zdGFudHMKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUQVNLPSAiNiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUQVJHRVQ9ICI3IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvbGF1bmNoQ29uZmlndXJhdGlvbnMvUmVtb3RlQW50UHJvY2Vzc0ZhY3RvcnkuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL1JlbW90ZUFudFByb2Nlc3NGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxM2MxM2UuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC9sYXVuY2hpbmcvbGF1bmNoQ29uZmlndXJhdGlvbnMvUmVtb3RlQW50UHJvY2Vzc0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmxhdW5jaENvbmZpZ3VyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcuSUFudExhdW5jaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JUHJvY2Vzc0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUHJvY2VzczsKLQotcHVibGljIGNsYXNzIFJlbW90ZUFudFByb2Nlc3NGYWN0b3J5IGltcGxlbWVudHMgSVByb2Nlc3NGYWN0b3J5IHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSVByb2Nlc3NGYWN0b3J5I25ld1Byb2Nlc3Mob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoLCBqYXZhLmxhbmcuUHJvY2VzcywgamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgSVByb2Nlc3MgbmV3UHJvY2VzcyhJTGF1bmNoIGxhdW5jaCwgUHJvY2VzcyBwcm9jZXNzLCBTdHJpbmcgbGFiZWwsIE1hcCBhdHRyaWJ1dGVzKSB7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpIHsKLQkJCWF0dHJpYnV0ZXM9IG5ldyBIYXNoTWFwKDEpOwotCQl9Ci0JCWF0dHJpYnV0ZXMucHV0KElQcm9jZXNzLkFUVFJfUFJPQ0VTU19UWVBFLCBJQW50TGF1bmNoQ29uc3RhbnRzLklEX0FOVF9QUk9DRVNTX1RZUEUpOwotCQlyZXR1cm4gbmV3IFJlbW90ZUFudFJ1bnRpbWVQcm9jZXNzKGxhdW5jaCwgcHJvY2VzcywgbGFiZWwsIGF0dHJpYnV0ZXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL1JlbW90ZUFudFJ1bnRpbWVQcm9jZXNzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2xhdW5jaGluZy9sYXVuY2hDb25maWd1cmF0aW9ucy9SZW1vdGVBbnRSdW50aW1lUHJvY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTBiYmEyLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nL3NyYy9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvbGF1bmNoaW5nL2xhdW5jaENvbmZpZ3VyYXRpb25zL1JlbW90ZUFudFJ1bnRpbWVQcm9jZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5sYXVuY2hDb25maWd1cmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN0cmVhbXNQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLlJ1bnRpbWVQcm9jZXNzOwotCi1wdWJsaWMgY2xhc3MgUmVtb3RlQW50UnVudGltZVByb2Nlc3MgZXh0ZW5kcyBSdW50aW1lUHJvY2VzcyB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgUnVudGltZVByb2Nlc3Mgb24gdGhlIGdpdmVuIHN5c3RlbSBwcm9jZXNzCi0JICogd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgYWRkaW5nIHRoaXMgcHJvY2VzcyB0byB0aGUgZ2l2ZW4KLQkgKiBsYXVuY2guCi0JICogU2V0cyB0aGUgc3RyZWFtcyBwcm94eSB0byBhbiBBbnRTdHJlYW1zUHJveHkgaWYgb3V0cHV0IGlzIGNhcHR1cmVkLgotCSAqLwotCXB1YmxpYyBSZW1vdGVBbnRSdW50aW1lUHJvY2VzcyhJTGF1bmNoIGxhdW5jaCwgUHJvY2VzcyBwcm9jZXNzLCBTdHJpbmcgbmFtZSwgTWFwIGF0dHJpYnV0ZXMpIHsKLQkJc3VwZXIobGF1bmNoLCBwcm9jZXNzLCBuYW1lLCBhdHRyaWJ1dGVzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5SdW50aW1lUHJvY2VzcyNjcmVhdGVTdHJlYW1zUHJveHkoKQotCSAqLwotCXByb3RlY3RlZCBJU3RyZWFtc1Byb3h5IGNyZWF0ZVN0cmVhbXNQcm94eSgpIHsKLQkJcmV0dXJuIG5ldyBBbnRTdHJlYW1zUHJveHkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2xhdW5jaGluZy9JQW50TGF1bmNoQ29uc3RhbnRzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2xhdW5jaGluZy9JQW50TGF1bmNoQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOGFlMzMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9sYXVuY2hpbmcvSUFudExhdW5jaENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHRlcm5hbHRvb2xzLmludGVybmFsLklFeHRlcm5hbFRvb2xDb25zdGFudHM7Ci0KLS8qKgotICogQ29uc3RhbnQgZGVmaW5pdGlvbnMgZm9yIEFudCBsYXVuY2ggY29uZmlndXJhdGlvbnMuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQW50TGF1bmNoQ29uc3RhbnRzIHsKLQotCS8qKgotCSAqIEFudCBsYXVuY2ggY29uZmlndXJhdGlvbiB0eXBlIGlkZW50aWZpZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQU5UX0xBVU5DSF9DT05GSUdVUkFUSU9OX1RZUEUgPSAib3JnLmVjbGlwc2UuYW50LkFudExhdW5jaENvbmZpZ3VyYXRpb25UeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFJTl9UWVBFX05BTUU9ICJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLnJlbW90ZS5JbnRlcm5hbEFudFJ1bm5lciI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBBbnQgYnVpbGRlciBsYXVuY2ggY29uZmlndXJhdGlvbiB0eXBlIGlkZW50aWZpZXIuIEFudCBwcm9qZWN0IGJ1aWxkZXJzCi0JICogYXJlIG9mIHRoaXMgdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BTlRfQlVJTERFUl9MQVVOQ0hfQ09ORklHVVJBVElPTl9UWVBFID0gIm9yZy5lY2xpcHNlLmFudC5BbnRCdWlsZGVyTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTdHJpbmcgYXR0cmlidXRlIGluZGljYXRpbmcgdGhlIEFudCB0YXJnZXRzIHRvIGV4ZWN1dGUuIERlZmF1bHQgdmFsdWUgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCB0YXJnZXQgaXMgdG8gYmUKLQkgKiBleGVjdXRlZC4gRm9ybWF0IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Rpbmcgb2YgdGFyZ2V0cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FOVF9UQVJHRVRTID0gSUV4dGVybmFsVG9vbENvbnN0YW50cy5VSV9QTFVHSU5fSUQgKyAiLkFUVFJfQU5UX1RBUkdFVFMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTdHJpbmcgYXR0cmlidXRlIGluZGljYXRpbmcgdGhlIEFudCB0YXJnZXRzIHRvIGV4ZWN1dGUgYWZ0ZXIgYSBjbGVhbgotCSAqIChmdWxsIGJ1aWxkKSBmb3IgYW4gQW50IGJ1aWxkZXIuIERlZmF1bHQgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4gd2hpY2gKLQkgKiBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCB0YXJnZXQgaXMgdG8gYmUgZXhlY3V0ZWQuIEZvcm1hdCBpcyBhIGNvbW1hCi0JICogc2VwYXJhdGVkIGxpc3Rpbmcgb2YgdGFyZ2V0cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FOVF9BRlRFUl9DTEVBTl9UQVJHRVRTID0gIm9yZy5lY2xpcHNlLmFudC51aS5BVFRSX0FOVF9BRlRFUl9DTEVBTl9UQVJHRVRTIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU3RyaW5nIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBBbnQgdGFyZ2V0cyB0byBleGVjdXRlIGR1cmluZyBhIG1hbnVhbAotCSAqIGJ1aWxkIGZvciBhbiBBbnQgYnVpbGRlci4gRGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiB3aGljaAotCSAqIGluZGljYXRlcyB0aGF0IHRoZSBkZWZhdWx0IHRhcmdldCBpcyB0byBiZSBleGVjdXRlZC4gRm9ybWF0IGlzIGEgY29tbWEKLQkgKiBzZXBhcmF0ZWQgbGlzdGluZyBvZiB0YXJnZXRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQU5UX01BTlVBTF9UQVJHRVRTID0gIm9yZy5lY2xpcHNlLmFudC51aS5BVFRSX0FOVF9NQU5VQUxfVEFSR0VUUyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFN0cmluZyBhdHRyaWJ1dGUgaW5kaWNhdGluZyB0aGUgQW50IHRhcmdldHMgdG8gZXhlY3V0ZSBkdXJpbmcgYW4gYXV0bwotCSAqIGJ1aWxkIGZvciBhbiBBbnQgYnVpbGRlci4gRGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiB3aGljaAotCSAqIGluZGljYXRlcyB0aGF0IHRoZSBkZWZhdWx0IHRhcmdldCBpcyB0byBiZSBleGVjdXRlZC4gRm9ybWF0IGlzIGEgY29tbWEKLQkgKiBzZXBhcmF0ZWQgbGlzdGluZyBvZiB0YXJnZXRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQU5UX0FVVE9fVEFSR0VUUyA9ICJvcmcuZWNsaXBzZS5hbnQudWkuQVRUUl9BTlRfQVVUT19UQVJHRVRTIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU3RyaW5nIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBBbnQgdGFyZ2V0cyB0byBleGVjdXRlIGR1cmluZyBhIGNsZWFuIGZvcgotCSAqIGFuIEFudCBidWlsZGVyLiBEZWZhdWx0IHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIGluZGljYXRlcyB0aGF0Ci0JICogdGhlIGRlZmF1bHQgdGFyZ2V0IGlzIHRvIGJlIGV4ZWN1dGVkLiBGb3JtYXQgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdGluZwotCSAqIG9mIHRhcmdldHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BTlRfQ0xFQU5fVEFSR0VUUyA9ICJvcmcuZWNsaXBzZS5hbnQudWkuQVRUUl9BTlRfQ0xFQU5fVEFSR0VUUyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEJvb2xlYW4gYXR0cmlidXRlIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGFyZ2V0IHNwZWNpZmljYXRpb24gZm9yIGFuCi0JICogQW50IGJ1aWxkZXIgaGFzIGJlZW4gdXBkYXRlZCBmb3IgMy4xCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9UQVJHRVRTX1VQREFURUQgPSAib3JnLmVjbGlwc2UuYW50LnVpLkFUVFJfVEFSR0VUU19VUERBVEVEIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTWFwIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBBbnQgcHJvcGVydGllcyB0byBiZSBkZWZpbmVkIGR1cmluZyB0aGUKLQkgKiBidWlsZC4gRGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMgbm8gYWRkaXRpb25hbAotCSAqIHByb3BlcnRpZXMgd2lsbCBiZSBkZWZpbmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQU5UX1BST1BFUlRJRVMgPSBJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLlVJX1BMVUdJTl9JRCArICIuQVRUUl9BTlRfUFJPUEVSVElFUyI7IC8vJE5PTi1OTFMtMSQJCQkJCQotCi0JLyoqCi0JICogU3RyaW5nIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBBbnQgdGFyZ2V0cyB0byBleGVjdXRlLiBEZWZhdWx0IHZhbHVlIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4gd2hpY2ggaW5kaWNhdGVzIHRoYXQgbm8gYWRkaXRpb25hbCBwcm9wZXJ0eSBmaWxlcyB3aWxsCi0JICogYmUgZGVmaW5lZC4gRm9ybWF0IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Rpbmcgb2YgcHJvcGVydHkgZmlsZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BTlRfUFJPUEVSVFlfRklMRVMgPSBJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLlVJX1BMVUdJTl9JRCArICIuQVRUUl9BTlRfUFJPUEVSVFlfRklMRVMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBCb29sZWFuIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IGludGVybmFsIHRhcmdldHMgKHRhcmdldHMKLQkgKiB3aXRoIG5vIGRlc2NyaXB0aW9uKSBzaG91bGQgYmUgaGlkZGVuIGZyb20gdGhlIHVzZXIgaW4gdGhlIGxhdW5jaAotCSAqIGNvbmZpZ3VyYXRpb24gZGlhbG9nLiBEZWZhdWx0IHZhbHVlIGlzIDxjb2RlPmZhbHNlPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMKLQkgKiB0aGF0IGFsbCB0YXJnZXRzIHdpbGwgYmUgZGlzcGxheWVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSElERV9JTlRFUk5BTF9UQVJHRVRTID0gSUV4dGVybmFsVG9vbENvbnN0YW50cy5VSV9QTFVHSU5fSUQgKyAiLkFUVFJfSElERV9JTlRFUk5BTF9UQVJHRVRTIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW50ZWdlciBhdHRyaWJ1dGUgaW5kaWNhdGluZyB3aGljaCBjb2x1bW4gdGFyZ2V0cyBzaG91bGQgYmUgc29ydGVkIG9uLiBBCi0JICogdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGFyZ2V0IG5hbWUsIDEgaW5kaWNhdGVzIHRhcmdldCBkZXNjcmlwdGlvbiwgYW5kIC0xCi0JICogaW5kaWNhdGVzIG5vIHNvcnQuIERlZmF1bHQgdmFsdWUgaXMgLTEuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TT1JUX1RBUkdFVFMgPSBJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLlVJX1BMVUdJTl9JRCArICJBVFRSX1NPUlRfVEFSR0VUUyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEJvb2xlYW4gYXR0cmlidXRlIGluZGljYXRpbmcgaWYgdGhlIGRlZmF1bHQgVk0gaW5zdGFsbCBzaG91bGQgYmUgdXNlZCBmb3IKLQkgKiB0aGUgc2VwYXJhdGUgSlJFIGJ1aWxkIERlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBiYWNrd2FyZHMKLQkgKiBjb21wYXRpYmlsaXR5Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9ERUZBVUxUX1ZNX0lOU1RBTEwgPSAib3JnLmVjbGlwc2UuYW50LnVpLkRFRkFVTFRfVk1fSU5TVEFMTCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIElkZW50aWZpZXIgZm9yIEFudCBwcm9jZXNzZXMgKHZhbHVlCi0JICogPGNvZGU+b3JnLmVjbGlwc2UuYW50LnVpLmFudFByb2Nlc3M8L2NvZGU+KS4gVGhpcyBpZGVudGlmaWVyIGlzIHNldCBhcwotCSAqIHRoZSB2YWx1ZSBmb3IgdGhlIDxjb2RlPklQcm9jZXNzLkFUVFJfUFJPQ0VTU19UWVBFPC9jb2RlPiBhdHRyaWJ1dGUgaW4KLQkgKiBwcm9jZXNzZXMgY3JlYXRlZCBieSB0aGUgQW50IGxhdW5jaCBkZWxlZ2F0ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BTlRfUFJPQ0VTU19UWVBFID0gIm9yZy5lY2xpcHNlLmFudC51aS5hbnRQcm9jZXNzIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2xhdW5jaGluZy9wYWNrYWdlLmh0bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy9zcmMvb3JnL2VjbGlwc2UvYW50L2xhdW5jaGluZy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZmQ0ODQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC5sYXVuY2hpbmcvc3JjL29yZy9lY2xpcHNlL2FudC9sYXVuY2hpbmcvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci1Qcm92aWRlcyBzdXBwb3J0IGZvciBBbnQgbGF1bmNoaW5nLgotPGgyPgotUGFja2FnZSBTcGVjaWZpY2F0aW9uPC9oMj4KLVRoaXMgcGFja2FnZSBkZWZpbmVzIGNvbnN0YW50cyBmb3IgQW50IGxhdW5jaCBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZXMuIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5jbGFzc3BhdGggYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVkMWU5Yy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idGVzdCBwbHVnaW4iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ0ZXN0cyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0idGVzdF9zdXBwb3J0X2JpbiIgcGF0aD0idGVzdCBzdXBwb3J0Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0FudCBUZXN0IFN1cHBvcnQgTGliIEJ1aWxkZXIubGF1bmNoIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5leHRlcm5hbFRvb2xCdWlsZGVycy9BbnQgVGVzdCBTdXBwb3J0IExpYiBCdWlsZGVyLmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAxZDRhMC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0FudCBUZXN0IFN1cHBvcnQgTGliIEJ1aWxkZXIubGF1bmNoCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLmFudC5BbnRCdWlsZGVyTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BVFRSX0xBVU5DSF9JTl9CQUNLR1JPVU5EIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5ERUZBVUxUX0NMQVNTUEFUSCIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuYW50LnVpLkRFRkFVTFRfVk1fSU5TVEFMTCIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1JVTl9CVUlMRF9LSU5EUyIgdmFsdWU9ImZ1bGwsaW5jcmVtZW50YWwsYXV0byxjbGVhbiIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5hbnQudWkuQVRUUl9UQVJHRVRTX1VQREFURUQiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9UUklHR0VSU19DT05GSUdVUkVEIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuQ0xBU1NQQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LnVpLkFudENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0JVSUxEX1NDT1BFIiB2YWx1ZT0iJHt3b3JraW5nX3NldDombHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDtVVEYtOCZxdW90Oz8mZ3Q7JiMxMDsmbHQ7bGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQgZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtpbmdTZXRGYWN0b3J5JnF1b3Q7IG5hbWU9JnF1b3Q7d29ya2luZ1NldCZxdW90OyBlZGl0UGFnZUlkPSZxdW90O29yZy5lY2xpcHNlLnVpLnJlc291cmNlV29ya2luZ1NldFBhZ2UmcXVvdDsmZ3Q7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcmcXVvdDsgdHlwZT0mcXVvdDsyJnF1b3Q7LyZndDsmIzEwOyZsdDtpdGVtIGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5tb2RlbC5SZXNvdXJjZUZhY3RvcnkmcXVvdDsgcGF0aD0mcXVvdDsvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvYnVpbGRmaWxlcy9idWlsZEFudFRlc3RzU3VwcG9ydEpBUi54bWwmcXVvdDsgdHlwZT0mcXVvdDsxJnF1b3Q7LyZndDsmIzEwOyZsdDsvbGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQmZ3Q7JiMxMDt9Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuYW50LnVpLkFUVFJfQU5UX0NMRUFOX1RBUkdFVFMiIHZhbHVlPSJjbGVhbiwiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkFUVFJfUkVGUkVTSF9TQ09QRSIgdmFsdWU9IiR7d29ya2luZ19zZXQ6Jmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7VVRGLTgmcXVvdDs/Jmd0OyYjMTA7Jmx0O2xhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nU2V0IGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JraW5nU2V0RmFjdG9yeSZxdW90OyBuYW1lPSZxdW90O3dvcmtpbmdTZXQmcXVvdDsgZWRpdFBhZ2VJZD0mcXVvdDtvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVdvcmtpbmdTZXRQYWdlJnF1b3Q7Jmd0OyYjMTA7Jmx0O2l0ZW0gZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLm1vZGVsLlJlc291cmNlRmFjdG9yeSZxdW90OyBwYXRoPSZxdW90Oy9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZSZxdW90OyB0eXBlPSZxdW90OzQmcXVvdDsvJmd0OyYjMTA7Jmx0Oy9sYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ1NldCZndDsmIzEwO30iLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfTE9DQVRJT04iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2M6L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL2J1aWxkZmlsZXMvYnVpbGRBbnRUZXN0c1N1cHBvcnRKQVIueG1sfSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BVFRSX1JVTl9JTl9CQUNLR1JPVU5EIiB2YWx1ZT0iZmFsc2UiLz4KLTwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS8ucHJvamVjdCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ2NzBjZC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgkJCi0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkV4dGVybmFsVG9vbEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5PkxhdW5jaENvbmZpZ0hhbmRsZTwva2V5PgotCQkJCQk8dmFsdWU+Jmx0O3Byb2plY3QmZ3Q7Ly5leHRlcm5hbFRvb2xCdWlsZGVycy9BbnQgVGVzdCBTdXBwb3J0IExpYiBCdWlsZGVyLmxhdW5jaDwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAxYTM3NC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVGh1IE1heSAyNyAxNDo0ODo0MyBQRFQgMjAwNA0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotc2VsZmhvc3RpbmcuYmluRXhjbHVkZXM9L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Rfc3VwcG9ydF9iaW4NCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzA3NzE1Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotI01vbiBEZWMgMTQgMTE6NDA6NDggQ1NUIDIwMDkNCi1jb21waWxlcnMuZi51bnJlc29sdmVkLWZlYXR1cmVzPTENCi1jb21waWxlcnMuZi51bnJlc29sdmVkLXBsdWdpbnM9MQ0KLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MQ0KLWNvbXBpbGVycy5wLmJ1aWxkPTENCi1jb21waWxlcnMucC5idWlsZC5taXNzaW5nLm91dHB1dD0xDQotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xDQotY29tcGlsZXJzLnAuZGlzY291cmFnZWQtY2xhc3M9MQ0KLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTANCi1jb21waWxlcnMucC5pbnRlcm5hbD0xDQotY29tcGlsZXJzLnAubWlzc2luZy1wYWNrYWdlcz0yDQotY29tcGlsZXJzLnAubWlzc2luZy12ZXJzaW9uLWV4cG9ydC1wYWNrYWdlPTINCi1jb21waWxlcnMucC5taXNzaW5nLXZlcnNpb24taW1wb3J0LXBhY2thZ2U9Mg0KLWNvbXBpbGVycy5wLm1pc3NpbmctdmVyc2lvbi1yZXF1aXJlLWJ1bmRsZT0yDQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTANCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0xDQotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MA0KLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MQ0KLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wDQotY29tcGlsZXJzLnAudW5rbm93bi1pZGVudGlmaWVyPTENCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTENCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wDQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MA0KLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0xDQotY29tcGlsZXJzLnMuY3JlYXRlLWRvY3M9ZmFsc2UNCi1jb21waWxlcnMucy5kb2MtZm9sZGVyPWRvYw0KLWNvbXBpbGVycy5zLm9wZW4tdGFncz0xDQotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9hYm91dC5odG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q0Y2ZmMC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICB0ZXN0YnVpbGRmaWxlcy8sXAotICAgICAgICAgICAgICAgdGVzdHJlc291cmNlcy8sXAotICAgICAgICAgICAgICAgdGVzdGxpYi8sXAotICAgICAgICAgICAgICAgbGliLyxcCi0gICAgICAgICAgICAgICBsaWIvKi5qYXIsXAotICAgICAgICAgICAgICAgKi5qYXIsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi0gICAgICAgICAgICAgICAKLXNvdXJjZS5hbnR0ZXN0c2NvcmUuamFyID0gdGVzdCBwbHVnaW4vLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdHMvCi1zb3VyY2UubGliL2FudFRlc3RzU3VwcG9ydC5qYXIgPSB0ZXN0IHN1cHBvcnQvCi1qYXJzLmNvbXBpbGUub3JkZXI9YW50dGVzdHNjb3JlLmphcixsaWIvYW50VGVzdHNTdXBwb3J0Lmphcgotb3V0cHV0LmxpYi9hbnRUZXN0c1N1cHBvcnQuamFyID0gdGVzdF9zdXBwb3J0X2Jpbi8KLW91dHB1dC5hbnR0ZXN0c2NvcmUuamFyID0gYmluLwpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL2J1aWxkZmlsZXMvYnVpbGRBbnRUZXN0c1N1cHBvcnRKQVIueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL2J1aWxkZmlsZXMvYnVpbGRBbnRUZXN0c1N1cHBvcnRKQVIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjU3YWU3Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9idWlsZGZpbGVzL2J1aWxkQW50VGVzdHNTdXBwb3J0SkFSLnhtbAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFlOWU0Ni4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPUFudCBDb3JlIFRlc3QgUGx1Z2luCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9wbHVnaW4ueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYWRkNGEuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHBsdWdpbi9BbnRGaWxlUnVubmVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHBsdWdpbi9BbnRGaWxlUnVubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzOWU4MDIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RwbHVnaW4vQW50RmlsZVJ1bm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuQWJzdHJhY3RBbnRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIFJlc3BvbnNpYmxlIGZvciBydW5uaW5nIHRlc3QgYW50IGJ1aWxkIGZpbGVzLgotICovCi1wdWJsaWMgY2xhc3MgQW50RmlsZVJ1bm5lciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfRElSX1BSRUZJWCA9ICItRGJhc2VkaXI9IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHZvaWQgcnVuKElGaWxlIGJ1aWxkRmlsZSwgU3RyaW5nW10gdGFyZ2V0cywgU3RyaW5nW10gYXJncywgU3RyaW5nIGJhc2VEaXIsIGJvb2xlYW4gY2FwdHVyZU91dHB1dCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQotCQlBbnRSdW5uZXIgcnVubmVyID0gbmV3IEFudFJ1bm5lcigpOwotCi0JCVN0cmluZ1tdIHJ1bm5lckFyZ3MgPSBhcmdzOwotCi0JCWlmIChiYXNlRGlyLmxlbmd0aCgpID4gMCkgewotCQkJLy8gQW50IHJlcXVpcmVzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byBiZSBzcGVjaWZpZWQKLQkJCS8vIGFzIG9uZSBvZiB0aGUgYXJndW1lbnRzLCBzbyBpdCBuZWVkcyB0byBiZSBhcHBlbmRlZC4KLQkJCWludCBsZW5ndGggPSAxOwotCQkJaWYgKGFyZ3MgIT0gbnVsbCkgewotCQkJCWxlbmd0aCA9IGFyZ3MubGVuZ3RoICsgMTsKLQkJCX0gCi0JCQkKLQkJCXJ1bm5lckFyZ3MgPSBuZXcgU3RyaW5nW2xlbmd0aF07Ci0JCQlpZiAoYXJncyAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShhcmdzLCAwLCBydW5uZXJBcmdzLCAwLCBhcmdzLmxlbmd0aCk7Ci0JCQl9Ci0JCQlydW5uZXJBcmdzW2xlbmd0aCAtIDFdID0gQkFTRV9ESVJfUFJFRklYICsgYmFzZURpcjsKLQkJfQotCQlydW5uZXIuc2V0QXJndW1lbnRzKHJ1bm5lckFyZ3MpOwotCi0JCWlmIChidWlsZEZpbGUgIT0gbnVsbCkgewotCQkJcnVubmVyLnNldEJ1aWxkRmlsZUxvY2F0aW9uKGJ1aWxkRmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWlmICh0YXJnZXRzICE9IG51bGwgJiYgdGFyZ2V0cy5sZW5ndGggPiAwKSB7Ci0JCQlydW5uZXIuc2V0RXhlY3V0aW9uVGFyZ2V0cyh0YXJnZXRzKTsKLQkJfQotCQlpZiAoY2FwdHVyZU91dHB1dCkgewotCQkJcnVubmVyLmFkZEJ1aWxkTG9nZ2VyKEFic3RyYWN0QW50VGVzdC5BTlRfVEVTVF9CVUlMRF9MT0dHRVIpOwotCQl9Ci0KLQkJcnVubmVyLnJ1bihudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKFN0cmluZ1tdIGFyZ3MsIFN0cmluZyBiYXNlRGlyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkKLQkJQW50UnVubmVyIHJ1bm5lciA9IG5ldyBBbnRSdW5uZXIoKTsKLQotCQlTdHJpbmdbXSBydW5uZXJBcmdzID0gYXJnczsKLQotCQlpZiAoYmFzZURpci5sZW5ndGgoKSA+IDApIHsKLQkJCS8vIEFudCByZXF1aXJlcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgdG8gYmUgc3BlY2lmaWVkCi0JCQkvLyBhcyBvbmUgb2YgdGhlIGFyZ3VtZW50cywgc28gaXQgbmVlZHMgdG8gYmUgYXBwZW5kZWQuCi0JCQlydW5uZXJBcmdzID0gbmV3IFN0cmluZ1thcmdzLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShhcmdzLCAwLCBydW5uZXJBcmdzLCAwLCBhcmdzLmxlbmd0aCk7Ci0JCQlydW5uZXJBcmdzW2FyZ3MubGVuZ3RoXSA9IEJBU0VfRElSX1BSRUZJWCArIGJhc2VEaXI7Ci0JCX0KLQkJcnVubmVyLnNldEFyZ3VtZW50cyhydW5uZXJBcmdzKTsKLQotCQlydW5uZXIucnVuKGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL0FudFRlc3RDaGVja2VyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHBsdWdpbi9BbnRUZXN0Q2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjQ0OWU1Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL0FudFRlc3RDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBBbnRUZXN0Q2hlY2tlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQW50VGVzdENoZWNrZXIgZGVmbHQ9IG51bGw7Ci0JCi0JcHJpdmF0ZSBpbnQgdGFza1N0YXJ0ZWRDb3VudDsKLQkKLQlwcml2YXRlIGludCB0YXNrRmluaXNoZWRDb3VudDsKLQkKLQlwcml2YXRlIGludCB0YXJnZXRzU3RhcnRlZENvdW50OwotCQotCXByaXZhdGUgaW50IHRhcmdldHNGaW5pc2hlZENvdW50OwotCQotCXByaXZhdGUgaW50IGJ1aWxkc1N0YXJ0ZWRDb3VudDsKLQkKLQlwcml2YXRlIGludCBidWlsZHNGaW5pc2hlZENvdW50OwotCQotCXByaXZhdGUgTGlzdCBtZXNzYWdlcz0gbmV3IEFycmF5TGlzdCgpOwotCQotCXByaXZhdGUgTGlzdCB0YXJnZXRzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHJpdmF0ZSBMaXN0IHRhc2tzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHJpdmF0ZSBMaXN0IHByb2plY3RzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHJpdmF0ZSBIYXNodGFibGUgdXNlclByb3BlcnRpZXM7Ci0JCi0JcHJpdmF0ZSBMaXN0IG5hbWVPZkxpc3RlbmVycz0gbmV3IEFycmF5TGlzdCgpOwotCQotCXByaXZhdGUgQW50VGVzdENoZWNrZXIoKSAgewotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gQW50VGVzdENoZWNrZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFudFRlc3RDaGVja2VyIGdldERlZmF1bHQoKSB7Ci0JCWlmIChkZWZsdCA9PSBudWxsKSB7Ci0JCQlkZWZsdD0gbmV3IEFudFRlc3RDaGVja2VyKCk7Ci0JCX0KLQkJcmV0dXJuIGRlZmx0OwotCX0KLQkKLQkvKioKLQkgKiBSZXNldHMgdGhlIHNpbmdsZXRvbiBBbnRUZXN0Q2hlY2tlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXNldCgpIHsKLQkJaWYgKGRlZmx0ICE9IG51bGwpIHsKLQkJCWRlZmx0LnJlc2V0U3RhdGUoKTsKLQkJfQotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjYnVpbGRGaW5pc2hlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoKSB7Ci0JCWJ1aWxkc0ZpbmlzaGVkQ291bnQrKzsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0JCWJ1aWxkc1N0YXJ0ZWRDb3VudCsrOwotCQlwcm9qZWN0cy5hZGQocHJvamVjdE5hbWUpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJbWVzc2FnZXMuYWRkKG1lc3NhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXJnZXRGaW5pc2hlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKCkgewotCQl0YXJnZXRzRmluaXNoZWRDb3VudCsrOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXJnZXRTdGFydGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGFyZ2V0U3RhcnRlZChTdHJpbmcgdGFyZ2V0TmFtZSkgewotCQl0YXJnZXRzU3RhcnRlZENvdW50Kys7Ci0JCXRhcmdldHMuYWRkKHRhcmdldE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXNrRmluaXNoZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoKSB7Ci0JCXRhc2tGaW5pc2hlZENvdW50Kys7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI3Rhc2tTdGFydGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGFza1N0YXJ0ZWQoU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCXRhc2tTdGFydGVkQ291bnQrKzsKLQkJdGFza3MuYWRkKHRhc2tOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYnVpbGRzRmluaXNoZWRDb3VudC4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QnVpbGRzRmluaXNoZWRDb3VudCgpIHsKLQkJcmV0dXJuIGJ1aWxkc0ZpbmlzaGVkQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYnVpbGRzU3RhcnRlZENvdW50LgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRCdWlsZHNTdGFydGVkQ291bnQoKSB7Ci0JCXJldHVybiBidWlsZHNTdGFydGVkQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWVzc2FnZXNMb2dnZWRDb3VudC4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWVzc2FnZXNMb2dnZWRDb3VudCgpIHsKLQkJcmV0dXJuIG1lc3NhZ2VzLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YXJnZXRzRmluaXNoZWRDb3VudC4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFyZ2V0c0ZpbmlzaGVkQ291bnQoKSB7Ci0JCXJldHVybiB0YXJnZXRzRmluaXNoZWRDb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YXJnZXRzU3RhcnRlZENvdW50LgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRUYXJnZXRzU3RhcnRlZENvdW50KCkgewotCQlyZXR1cm4gdGFyZ2V0c1N0YXJ0ZWRDb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YXNrRmluaXNoZWRDb3VudC4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFza0ZpbmlzaGVkQ291bnQoKSB7Ci0JCXJldHVybiB0YXNrRmluaXNoZWRDb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YXNrU3RhcnRlZENvdW50LgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRUYXNrU3RhcnRlZENvdW50KCkgewotCQlyZXR1cm4gdGFza1N0YXJ0ZWRDb3VudDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXRTdGF0ZSgpIHsKLQkJdGFza1N0YXJ0ZWRDb3VudD0gMDsKLQkJdGFza0ZpbmlzaGVkQ291bnQ9IDA7Ci0JCXRhcmdldHNTdGFydGVkQ291bnQ9IDA7Ci0JCXRhcmdldHNGaW5pc2hlZENvdW50PSAwOwotCQlidWlsZHNTdGFydGVkQ291bnQ9IDA7Ci0JCWJ1aWxkc0ZpbmlzaGVkQ291bnQ9IDA7Ci0JCW1lc3NhZ2VzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRhc2tzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRhcmdldHM9IG5ldyBBcnJheUxpc3QoKTsKLQkJcHJvamVjdHM9IG5ldyBBcnJheUxpc3QoKTsKLQkJdXNlclByb3BlcnRpZXM9IG51bGw7Ci0JCW5hbWVPZkxpc3RlbmVycz0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQkKLQkvKioKLSAgICAgKiBSZXR1cm4gdGhlIG1lc3NhZ2UgbiBmcm9tIHRoZSBsYXN0OgotICAgICAqIGUuZy4gZ2V0TG9nZ2VkTWVzc2FnZSgwKSByZXR1cm5zIHRoZSBtb3N0IHJlY2VudCBtZXNzYWdlCi0gICAgICogCi0JICogQHBhcmFtIG4gbWVzc2FnZSBpbmRleAotCSAqIEByZXR1cm4gdGhlIG50aCBsYXN0IG1lc3NhZ2UKLQkgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvZ2dlZE1lc3NhZ2UoaW50IG4pIHsKLSAgICAgICAgbiA9IG1lc3NhZ2VzLnNpemUoKSAtIChuICsgMSk7Ci0gICAgICAgIGlmICgobiA8IDApIHx8IChuID49IG1lc3NhZ2VzLnNpemUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBtZXNzYWdlcy5nZXQobik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TWVzc2FnZUxvZ2dlZCgpIHsKLSAgICAgICAgcmV0dXJuIGdldExvZ2dlZE1lc3NhZ2UoMCk7Ci0gICAgfQotCQotCXB1YmxpYyB2b2lkIHNldFVzZXJQcm9wZXJ0aWVzKEhhc2h0YWJsZSB1c2VyUHJvcGVydGllcykgewotCQl0aGlzLnVzZXJQcm9wZXJ0aWVzPSB1c2VyUHJvcGVydGllczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVzZXJQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKFN0cmluZyl1c2VyUHJvcGVydGllcy5nZXQobmFtZSk7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldE1lc3NhZ2VzKCkgewotCQlyZXR1cm4gbWVzc2FnZXM7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldExpc3RlbmVycygpIHsKLQkJcmV0dXJuIG5hbWVPZkxpc3RlbmVyczsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYXN0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiAoU3RyaW5nKW5hbWVPZkxpc3RlbmVycy5nZXQobmFtZU9mTGlzdGVuZXJzLnNpemUoKSAtIDEpOwotCX0KLQotCi0JcHVibGljIHZvaWQgYWRkTmFtZU9mTGlzdGVuZXIoU3RyaW5nIG5hbWVPZkxpc3RlbmVyKSB7Ci0JCXRoaXMubmFtZU9mTGlzdGVuZXJzLmFkZChuYW1lT2ZMaXN0ZW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RwbHVnaW4vQW50VGVzdFBsdWdpbi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RwbHVnaW4vQW50VGVzdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTU4MTAzLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL0FudFRlc3RQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLXB1YmxpYyBjbGFzcyBBbnRUZXN0UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQW50VGVzdFBsdWdpbiBkZWZsdDsKLQkKLQlwdWJsaWMgQW50VGVzdFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJZGVmbHQ9IHRoaXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQW50VGVzdFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gZGVmbHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlbmFibGVBdXRvYnVpbGQoYm9vbGVhbiBlbmFibGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gZGlzYWJsZSBhdXRvIGJ1aWxkCi0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlPSBBbnRUZXN0UGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJV29ya3NwYWNlRGVzY3JpcHRpb24gZGVzYz0gd29ya3NwYWNlLmdldERlc2NyaXB0aW9uKCk7Ci0JCWRlc2Muc2V0QXV0b0J1aWxkaW5nKGVuYWJsZSk7Ci0JCXdvcmtzcGFjZS5zZXREZXNjcmlwdGlvbihkZXNjKTsKLQl9Ci0JCi0JcHVibGljIEZpbGUgZ2V0RmlsZUluUGx1Z2luKElQYXRoIHBhdGgpIHsKLQkJdHJ5IHsKLQkJCUJ1bmRsZSBidW5kbGUgPSBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCk7Ci0JCQlVUkwgaW5zdGFsbFVSTD0gbmV3IFVSTChidW5kbGUuZ2V0RW50cnkoIi8iKSwgcGF0aC50b1N0cmluZygpKTsKLQkJCVVSTCBsb2NhbFVSTD0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKGluc3RhbGxVUkwpOwotCQkJcmV0dXJuIG5ldyBGaWxlKGxvY2FsVVJMLmdldEZpbGUoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RwbHVnaW4vQW50VGVzdFByb3BlcnR5VmFsdWVQcm92aWRlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RwbHVnaW4vQW50VGVzdFByb3BlcnR5VmFsdWVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzg2ZTk2Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL0FudFRlc3RQcm9wZXJ0eVZhbHVlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLklBbnRQcm9wZXJ0eVZhbHVlUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBBbnRUZXN0UHJvcGVydHlWYWx1ZVByb3ZpZGVyIGltcGxlbWVudHMgSUFudFByb3BlcnR5VmFsdWVQcm92aWRlciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuY29yZS5JQW50UHJvcGVydHlWYWx1ZVByb3ZpZGVyI2dldEFudFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFudFByb3BlcnR5VmFsdWUoU3RyaW5nIGFudFByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gIkFudFRlc3RQcm9wZXJ0eVZhbHVlUHJvdmlkZXIiOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RwbHVnaW4vUHJvamVjdEhlbHBlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RwbHVnaW4vUHJvamVjdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mzg5ZWQ3Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL1Byb2plY3RIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RwbHVnaW47Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSU92ZXJ3cml0ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLio7Ci0KLS8qKgotICogSGVscGVyIG1ldGhvZHMgdG8gc2V0IHVwIGFuIElQcm9qZWN0LgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdEhlbHBlciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBURVNUX0JVSUxERklMRVNfRElSPSBuZXcgUGF0aCgidGVzdGJ1aWxkZmlsZXMiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQYXRoIFRFU1RfUkVTT1VSQ0VTX0RJUj0gbmV3IFBhdGgoInRlc3RyZXNvdXJjZXMiKTsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBURVNUX0xJQl9ESVI9IG5ldyBQYXRoKCJ0ZXN0bGliIik7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIElQcm9qZWN0LgotCSAqLwkKLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGNyZWF0ZVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3Q9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlQcm9qZWN0IHByb2plY3Q9IHJvb3QuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCWlmICghcHJvamVjdC5leGlzdHMoKSkgewotCQkJcHJvamVjdC5jcmVhdGUobnVsbCk7Ci0JCX0gZWxzZSB7Ci0JCQlwcm9qZWN0LnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG51bGwpOwotCQl9Ci0JCQotCQlpZiAoIXByb2plY3QuaXNPcGVuKCkpIHsKLQkJCXByb2plY3Qub3BlbihudWxsKTsKLQkJfQotCQkKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgYW4gSVByb2plY3QuCi0JICovCQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcHJvamVjdC5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JfQotCi0KLQkvKioKLQkgKiBBZGRzIGEgZm9sZGVyIHRvIGFuIElQcm9qZWN0LgotCSAqLwkJCi0JcHVibGljIHN0YXRpYyBJRm9sZGVyIGFkZEZvbGRlcihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgY29udGFpbmVyTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJCUlGb2xkZXIgZm9sZGVyPSBwcm9qZWN0LmdldEZvbGRlcihjb250YWluZXJOYW1lKTsKLQkJCWlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJZm9sZGVyLmNyZWF0ZShmYWxzZSwgdHJ1ZSwgbnVsbCk7Ci0JCQl9Ci0JCQotCQlyZXR1cm4gZm9sZGVyOwotCQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGltcG9ydEZpbGVzRnJvbURpcmVjdG9yeShGaWxlIHJvb3REaXIsIElQYXRoIGRlc3RQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CQkKLQkJSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyIHN0cnVjdHVyZVByb3ZpZGVyID0gRmlsZVN5c3RlbVN0cnVjdHVyZVByb3ZpZGVyLklOU1RBTkNFOwotCQlMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgxMDApOwotCQlhZGRGaWxlcyhyb290RGlyLCBmaWxlcyk7Ci0JCXRyeSB7Ci0JCQlJbXBvcnRPcGVyYXRpb24gb3A9IG5ldyBJbXBvcnRPcGVyYXRpb24oZGVzdFBhdGgsIHJvb3REaXIsIHN0cnVjdHVyZVByb3ZpZGVyLCBuZXcgSW1wb3J0T3ZlcndyaXRlUXVlcnkoKSwgZmlsZXMpOwotCQkJb3Auc2V0Q3JlYXRlQ29udGFpbmVyU3RydWN0dXJlKGZhbHNlKTsKLQkJCW9wLnJ1bihtb25pdG9yKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gc2hvdWxkIG5vdCBoYXBwZW4KLQkJfQotCX0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRGaWxlcyhGaWxlIGRpciwgTGlzdCBjb2xsZWN0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7Ci0JCUxpc3Qgc3ViRGlycyA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmaWxlc1tpXS5pc0ZpbGUoKSkgewotCQkJCWNvbGxlY3Rpb24uYWRkKGZpbGVzW2ldKTsKLQkJCX0gZWxzZSBpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCXN1YkRpcnMuYWRkKGZpbGVzW2ldKTsKLQkJCX0KLQkJfQotCQlJdGVyYXRvciBpdGVyID0gc3ViRGlycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUZpbGUgc3ViRGlyID0gKEZpbGUpaXRlci5uZXh0KCk7Ci0JCQlhZGRGaWxlcyhzdWJEaXIsIGNvbGxlY3Rpb24pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEltcG9ydE92ZXJ3cml0ZVF1ZXJ5IGltcGxlbWVudHMgSU92ZXJ3cml0ZVF1ZXJ5IHsKLQkJcHVibGljIFN0cmluZyBxdWVyeU92ZXJ3cml0ZShTdHJpbmcgZmlsZSkgewotCQkJcmV0dXJuIEFMTDsKLQkJfQkKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiQW50VGVzdHMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxERklMRVNfRk9MREVSID0gImJ1aWxkZmlsZXMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFU19GT0xERVIgPSAicmVzb3VyY2VzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJfRk9MREVSID0gImxpYiI7CQkJCi19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvaW5wdXRIYW5kbGVycy9BbnRUZXN0SW5wdXRIYW5kbGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvaW5wdXRIYW5kbGVycy9BbnRUZXN0SW5wdXRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YmU4ZGMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L2lucHV0SGFuZGxlcnMvQW50VGVzdElucHV0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LmlucHV0SGFuZGxlcnM7Ci0KLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LkRlZmF1bHRJbnB1dEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuSW5wdXRSZXF1ZXN0OwotCi0vKioKLSAqIEEgdGVzdCBpbnB1dCBoYW5kbGVyIHdoZW4gdXNpbmcgQW50IHdpdGhpbiBFY2xpcHNlLgotICogVGhpcyBpcyB0aGUgY2xhc3MgdGhhdCB3aWxsIHJlc3BvbmQgdG8gPGlucHV0PiByZXF1ZXN0cyBmcm9tCi0gKiB3aXRoaW4gYW4gQW50IGJ1aWxkIGZpbGUuCi0gKiBJZiB0aGUgYnVpbGQgaXMgb2NjdXJyaW5nIGluIEFudCAxLjYuMCBhbmQgdGhlIC1ub2lucHV0IG9wdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWQKLSAqIHRoaXMgaW5wdXQgaGFuZGxlciB3aWxsIGZhaWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRUZXN0SW5wdXRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdElucHV0SGFuZGxlciB7Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuSW5wdXRIYW5kbGVyI2hhbmRsZUlucHV0KG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LklucHV0UmVxdWVzdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVJbnB1dChJbnB1dFJlcXVlc3QgcmVxdWVzdCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQkJaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiZWNsaXBzZS5hbnQubm9JbnB1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVzcG9uZCB0byBpbnB1dCByZXF1ZXN0IGxpa2VseSBhcyBhIHJlc3VsdCBvZiBzcGVjaWZ5aW5nIHRoZSAtbm9pbnB1dCBjb21tYW5kIik7Ci0JCX0KLQkJcmVxdWVzdC5zZXRJbnB1dCgidGVzdGluZyBoYW5kbGluZyBpbnB1dCByZXF1ZXN0cyIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90YXNrcy9BbnRUZXN0VGFzay5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzcyZjAuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnN1cHBvcnQudGFza3M7Ci0KLQotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FY2hvOwotCi0KLXB1YmxpYyBjbGFzcyBBbnRUZXN0VGFzayBleHRlbmRzIFRhc2sgewotCQotCXB1YmxpYyBBbnRUZXN0VGFzaygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCQlFY2hvIGVjaG89IG5ldyBFY2hvKCk7Ci0JCWVjaG8uc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOwotCQllY2hvLnNldE1lc3NhZ2UoIlRlc3RpbmcgQW50IGluIEVjbGlwc2Ugd2l0aCBhIGN1c3RvbSB0YXNrIik7Ci0JCWVjaG8uZXhlY3V0ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90YXNrcy9BbnRUZXN0VGFzazIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90YXNrcy9BbnRUZXN0VGFzazIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0NGJlMi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGFza3MvQW50VGVzdFRhc2syLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnN1cHBvcnQudGFza3M7Ci0KLQotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FY2hvOwotCi0KLXB1YmxpYyBjbGFzcyBBbnRUZXN0VGFzazIgZXh0ZW5kcyBUYXNrIHsKLQkKLQlwdWJsaWMgQW50VGVzdFRhc2syKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2sjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0JCUVjaG8gZWNobz0gbmV3IEVjaG8oKTsKLQkJZWNoby5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7Ci0JCWVjaG8uc2V0TWVzc2FnZSgiVGVzdGluZyBBbnQgaW4gRWNsaXBzZSB3aXRoIGEgY3VzdG9tIHRhc2siKTsKLQkJZWNoby5leGVjdXRlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3Rlc3Rsb2dnZXJzL1Rlc3RCdWlsZExpc3RlbmVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGVzdGxvZ2dlcnMvVGVzdEJ1aWxkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc0NDg4MC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGVzdGxvZ2dlcnMvVGVzdEJ1aWxkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuc3VwcG9ydC50ZXN0bG9nZ2VyczsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RwbHVnaW4uQW50VGVzdENoZWNrZXI7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RCdWlsZExpc3RlbmVyIGltcGxlbWVudHMgQnVpbGRMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjYnVpbGRGaW5pc2hlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciNidWlsZFN0YXJ0ZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewotCQlBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuYWRkTmFtZU9mTGlzdGVuZXIodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI21lc3NhZ2VMb2dnZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtZXNzYWdlTG9nZ2VkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjdGFyZ2V0RmluaXNoZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI3RhcmdldFN0YXJ0ZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjdGFza0ZpbmlzaGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGFza0ZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjdGFza1N0YXJ0ZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGVzdGxvZ2dlcnMvVGVzdEJ1aWxkTG9nZ2VyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGVzdGxvZ2dlcnMvVGVzdEJ1aWxkTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiOWQ4YWEuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3Rlc3Rsb2dnZXJzL1Rlc3RCdWlsZExvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuc3VwcG9ydC50ZXN0bG9nZ2VyczsKLQotCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMb2dnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRTZWN1cml0eUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLkFudFRlc3RDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFRlc3RCdWlsZExvZ2dlciBpbXBsZW1lbnRzIEJ1aWxkTG9nZ2VyIHsKLQotCXByaXZhdGUgaW50IGZNZXNzYWdlT3V0cHV0TGV2ZWw9IFByb2plY3QuTVNHX0lORk87Ci0JcHJpdmF0ZSBQcmludFN0cmVhbSBmRXJyPSBudWxsOwotCXByaXZhdGUgUHJpbnRTdHJlYW0gZk91dD0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gZlNldFByb3BlcnRpZXM9IHRydWU7Ci0JCi0JLyoqCi0JICogQW4gZXhjZXB0aW9uIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBsb2dnZWQuCi0JICovCi0JcHJpdmF0ZSBUaHJvd2FibGUgZkhhbmRsZWRFeGNlcHRpb249IG51bGw7Ci0JCi0JCi0JcHVibGljIFRlc3RCdWlsZExvZ2dlcigpIHsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExvZ2dlciNzZXRNZXNzYWdlT3V0cHV0TGV2ZWwoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VPdXRwdXRMZXZlbChpbnQgbGV2ZWwpIHsKLQkJZk1lc3NhZ2VPdXRwdXRMZXZlbD0gbGV2ZWw7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgZ2V0TWVzc2FnZU91dHB1dExldmVsKCkgewotCQlyZXR1cm4gZk1lc3NhZ2VPdXRwdXRMZXZlbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTG9nZ2VyI3NldEVtYWNzTW9kZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVtYWNzTW9kZShib29sZWFuIGVtYWNzTW9kZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciNidWlsZFN0YXJ0ZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewotCQlBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuYnVpbGRTdGFydGVkKGV2ZW50LmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciNidWlsZEZpbmlzaGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JCWhhbmRsZUV4Y2VwdGlvbihldmVudCk7Ci0JCWZIYW5kbGVkRXhjZXB0aW9uPSBudWxsOwotCQlBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuYnVpbGRGaW5pc2hlZCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXJnZXRTdGFydGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGFyZ2V0U3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JCUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS50YXJnZXRTdGFydGVkKGV2ZW50LmdldFRhcmdldCgpLmdldE5hbWUoKSk7Ci0gICAgICAgIGlmIChmU2V0UHJvcGVydGllcykgewotICAgICAgICAgICAgZlNldFByb3BlcnRpZXM9IGZhbHNlOwotICAgICAgICAgICAgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLnNldFVzZXJQcm9wZXJ0aWVzKGV2ZW50LmdldFByb2plY3QoKS5nZXRQcm9wZXJ0aWVzKCkpOwotICAgICAgICB9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI3RhcmdldEZpbmlzaGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGFyZ2V0RmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewotCQloYW5kbGVFeGNlcHRpb24oZXZlbnQpOwotCQlBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkudGFyZ2V0RmluaXNoZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjdGFza1N0YXJ0ZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JCUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS50YXNrU3RhcnRlZChldmVudC5nZXRUYXNrKCkuZ2V0VGFza05hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI3Rhc2tGaW5pc2hlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRhc2tGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JCWhhbmRsZUV4Y2VwdGlvbihldmVudCk7Ci0JCUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS50YXJnZXRGaW5pc2hlZCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQnVpbGRMaXN0ZW5lciNtZXNzYWdlTG9nZ2VkKEJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRQcmlvcml0eSgpID4gZ2V0TWVzc2FnZU91dHB1dExldmVsKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlsb2dNZXNzYWdlKGV2ZW50LmdldE1lc3NhZ2UoKSwgZXZlbnQuZ2V0UHJpb3JpdHkoKSk7Ci0JCUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5tZXNzYWdlTG9nZ2VkKGV2ZW50LmdldE1lc3NhZ2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByaW50U3RyZWFtIGdldEVycm9yUHJpbnRTdHJlYW0oKSB7Ci0JCXJldHVybiBmRXJyOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJpbnRTdHJlYW0gZ2V0T3V0cHV0UHJpbnRTdHJlYW0oKSB7Ci0JCXJldHVybiBmT3V0OwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTG9nZ2VyI3NldEVycm9yUHJpbnRTdHJlYW0oamF2YS5pby5QcmludFN0cmVhbSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFcnJvclByaW50U3RyZWFtKFByaW50U3RyZWFtIGVycikgewotCQkvL3RoaXMgYnVpbGQgbG9nZ2VyIGxvZ3MgdG8gIm51bGwiIHVubGVzcwotCQkvL3RoZSB1c2VyIGhhcyBleHBsaWNpdGx5IHNldCBhIGxvZ2ZpbGUgdG8gdXNlCi0JCWlmIChlcnIgPT0gU3lzdGVtLmVycikgewotCQkJZkVycj0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCWZFcnI9IGVycjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMb2dnZXIjc2V0T3V0cHV0UHJpbnRTdHJlYW0oamF2YS5pby5QcmludFN0cmVhbSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdXRwdXRQcmludFN0cmVhbShQcmludFN0cmVhbSBvdXRwdXQpIHsKLQkJLy90aGlzIGJ1aWxkIGxvZ2dlciBsb2dzIHRvICJudWxsIiB1bmxlc3MKLQkJLy90aGUgdXNlciBoYXMgZXhwbGljaXRseSBzZXQgYSBsb2dmaWxlIHRvIHVzZQotCQlpZiAob3V0cHV0ID09IFN5c3RlbS5vdXQpIHsKLQkJCWZPdXQ9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlmT3V0PSBvdXRwdXQ7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbG9nTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IHByaW9yaXR5KSB7Ci0JCWlmIChwcmlvcml0eSA+IGdldE1lc3NhZ2VPdXRwdXRMZXZlbCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChwcmlvcml0eSA9PSBQcm9qZWN0Lk1TR19FUlIpIHsKLQkJCWlmIChnZXRFcnJvclByaW50U3RyZWFtKCkgIT0gbnVsbCAmJiBnZXRFcnJvclByaW50U3RyZWFtKCkgIT0gU3lzdGVtLmVycikgewotCQkJCS8vdXNlciBoYXMgZGVzaWduYXRlZCB0byBsb2cgdG8gYSBsb2dmaWxlCi0JCQkJZ2V0RXJyb3JQcmludFN0cmVhbSgpLnByaW50bG4obWVzc2FnZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0T3V0cHV0UHJpbnRTdHJlYW0oKSAhPSBudWxsICYmIGdldE91dHB1dFByaW50U3RyZWFtKCkgIT0gU3lzdGVtLm91dCkgewotCQkJCS8vdXNlciBoYXMgZGVzaWduYXRlZCB0byBsb2cgdG8gYSBsb2dmaWxlCi0JCQkJZ2V0T3V0cHV0UHJpbnRTdHJlYW0oKS5wcmludGxuKG1lc3NhZ2UpOwotCQkJfSAKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFeGNlcHRpb24oQnVpbGRFdmVudCBldmVudCkgewotCQlUaHJvd2FibGUgZXhjZXB0aW9uID0gZXZlbnQuZ2V0RXhjZXB0aW9uKCk7Ci0JCWlmIChleGNlcHRpb24gPT0gbnVsbCB8fCBleGNlcHRpb24gPT0gZkhhbmRsZWRFeGNlcHRpb24KLQkJfHwgZXhjZXB0aW9uIGluc3RhbmNlb2YgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24KLQkJfHwgZXhjZXB0aW9uIGluc3RhbmNlb2YgQW50U2VjdXJpdHlFeGNlcHRpb24pIHsKLQkJCXJldHVybjsKLQkJfQotCQlmSGFuZGxlZEV4Y2VwdGlvbj0gZXhjZXB0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90eXBlcy9BbnRUZXN0UGF0aC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3R5cGVzL0FudFRlc3RQYXRoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZTliZjIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3R5cGVzL0FudFRlc3RQYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnN1cHBvcnQudHlwZXM7Ci0KLQotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotCi1wdWJsaWMgY2xhc3MgQW50VGVzdFBhdGggZXh0ZW5kcyBQYXRoIHsKLQkKLQlTdHJpbmcgbWVzc2FnZTsKLQkKLQlwdWJsaWMgQW50VGVzdFBhdGgoUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKHByb2plY3QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXRoaXMubWVzc2FnZT0gbWVzc2FnZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQlyZXR1cm4gbWVzc2FnZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNmRhYTUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLSAgPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIGVjbGlwc2UtaG9tZSwgYW5kIGxpYnJhcnktZmlsZSAtLT4KLSAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLSAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn1cLi5cLi4iLz4KLTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiCi0gICAgICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdC9saWJyYXJ5LnhtbCIvPgotIAotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0gIDwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0gIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgIDx0c3RhbXAvPgotICAgIDxkZWxldGU+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZyoueG1sIi8+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0ic3VpdGUiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJqZHQtZm9sZGVyIiAKLSAgICAgICAgICAgICAgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9qZHRfZm9sZGVyIi8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7amR0LWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+Ci0gICAgPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke2pkdC1mb2xkZXJ9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgCi0gICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLkF1dG9tYXRlZFN1aXRlIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotICA8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+Ci0gIDwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotICA8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSBwZXJmb3JtYW5jZSB0ZXN0IHN1aXRlcy4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0icGVyZm9ybWFuY2UiPgotICA8L3RhcmdldD4JCi0JCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQnVnMzI1NTEueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0J1ZzMyNTUxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0Mzk5Ny4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQnVnMzI1NTEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iYnVnIiBkZWZhdWx0PSJhbGwiPgotIDxwYXRoIGlkPSJteWNsYXNzcGF0aCI+Ci0gCTxmaWxlc2V0IGRpcj0iLi5cbGliIj4KLSAgCQk8aW5jbHVkZSBuYW1lPSJhbnRUZXN0c1N1cHBvcnQuamFyIiAvPiAKLSAgCTwvZmlsZXNldD4KLSAgPC9wYXRoPgotICAKLSA8dGFza2RlZiBuYW1lPSJoZWxsbyIgY2xhc3NuYW1lPSJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnRhc2tzLkFudFRlc3RUYXNrIj4KLSAgCTxjbGFzc3BhdGggcmVmaWQ9Im15Y2xhc3NwYXRoIiAvPiAKLSAgPC90YXNrZGVmPgotICAKLSA8dGFyZ2V0IG5hbWU9ImFsbCI+Ci0gIAk8aGVsbG8gLz4gCi0gIDwvdGFyZ2V0PgotICA8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0J1ZzM0NjYzLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9CdWczNDY2My54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NzlmOTAuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0J1ZzM0NjYzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPHByb2plY3QgbmFtZT0iMzQ2NjMueG1sIiBkZWZhdWx0PSJlY2hvUCI+Ci0KLTx0YXNrZGVmIGZpbGU9IiR7Uk9PVERJUn0vdGFza2RlZnMucHJvcGVydGllcyIgLz4KLSAKLSA8dGFyZ2V0IG5hbWU9ImVjaG9QIj4KLSAJPG15RWNob1Byb3BlcnRpZXMvPgotIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9CdWc0MjkyNi54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQnVnNDI5MjYueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmI4NmEyLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9CdWc0MjkyNi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08cHJvamVjdCBkZWZhdWx0PSJhbGwiPgotCTxwYXRoIGlkPSJzb21lY2xhc3NwYXRoIj4KLQkJPGZpbGVzZXQgZGlyPSIke2FudC5ob21lfS9saWIiIGluY2x1ZGVzPSJzb21ldGFzay5qYXIiLz4KLQk8L3BhdGg+Ci0KLQk8dGFza2RlZiBuYW1lPSJzb21ldGFzayIgY2xhc3NuYW1lPSJjb20uZm9vLlNvbWVUYXNrIgotY2xhc3NwYXRocmVmPSJzb21lY2xhc3NwYXRoIi8+Ci0KLQk8dGFyZ2V0IG5hbWU9ImFsbCI+Ci0JCTxlY2hvPkhlbGxvICR7YW50LmhvbWV9PC9lY2hvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9CdWc3MzYwMi54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQnVnNzM2MDIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDVhMmJkLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9CdWc3MzYwMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08cHJvamVjdCBuYW1lPSJtYWluIiBkZWZhdWx0PSJhbGwiPgotICAgIDx0YXNrZGVmIHJlc291cmNlPSJ0YXNrZGVmcy5wcm9wZXJ0aWVzIi8+Ci0gICAgPGhlbGxvLz4KLSAgICA8dGFyZ2V0IG5hbWU9ImFsbCI+Ci0gICAgICAgIDxlY2hvPkhlbGxvPC9lY2hvPgotICAgIDwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iYWxsMyI+Ci0JICAgICAgICA8ZWNobz5IZWxsbzwvZWNobz4KLQkgICAgPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJhbGw0Ij4KLQkgICAgICAgIDxlY2hvPkhlbGxvPC9lY2hvPgotCSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9DbGFzc3BhdGhPcmRlcmluZy54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQ2xhc3NwYXRoT3JkZXJpbmcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTliNjVlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9DbGFzc3BhdGhPcmRlcmluZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IkNsYXNzcGF0aE9yZGVyaW5nIiBkZWZhdWx0PSJvcmRlcmVkIiBiYXNlZGlyPSIuLiI+Ci0KLQk8dGFyZ2V0IG5hbWU9Im9yZGVyZWQiPgotCQk8amF2YSBjbGFzc25hbWU9ICJDbGFzc3BhdGhPcmRlcmluZyIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0N1c3RvbVRhc2sueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0N1c3RvbVRhc2sueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzUyNWM4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9DdXN0b21UYXNrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IkN1c3RvbSBUYXNrIiBkZWZhdWx0PSJDdXN0b20gVGFzayIgYmFzZWRpcj0iLiI+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHRzdGFtcC8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9IkN1c3RvbSBUYXNrIiBkZXNjcmlwdGlvbj0gIlRlc3QgYWRkaW5nIGEgY3VzdG9tIHRhc2siIGRlcGVuZHM9ImluaXQiPgotCQk8QW50VGVzdFRhc2svPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iQ3VzdG9tIFRhc2sgZnJvbSBFbnRyeSIgZGVzY3JpcHRpb249ICJUZXN0IGFkZGluZyBhIGN1c3RvbSB0YXNrIj4KLQkJPEFudFRlc3RUYXNrMi8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQ3VzdG9tVHlwZS54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQ3VzdG9tVHlwZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZTFlZjUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0N1c3RvbVR5cGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iQ3VzdG9tIFR5cGUiIGRlZmF1bHQ9IkN1c3RvbSBUeXBlIiBiYXNlZGlyPSIuIj4KLQotCTxhbnR0ZXN0cGF0aCBpZD0iY29tcGlsZS5jbGFzc3BhdGgiPgotICAgICAgPGZpbGVzZXQgZGlyPSJsaWIiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIvPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvYW50dGVzdHBhdGg+Ci0gICAgCi0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHRzdGFtcC8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9IkN1c3RvbSBUeXBlIiBkZXNjcmlwdGlvbj0gIlRlc3QgYWRkaW5nIGEgY3VzdG9tIHR5cGUiIGRlcGVuZHM9ImluaXQiPgotCQk8ZWNobyBtZXNzYWdlPSJUZXN0IGFkZGluZyBhIGN1c3RvbSB0eXBlIi8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvRXh0ZW5zaW9uUG9pbnRUYXNrLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9FeHRlbnNpb25Qb2ludFRhc2sueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGM2YmI0Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9FeHRlbnNpb25Qb2ludFRhc2sueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPCEtLQotICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgCi0gICAgIENvbnRyaWJ1dG9yczoKLSAgICAgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIC0tPgotPHByb2plY3QgbmFtZT0iRXh0ZW5zaW9uIFBvaW50IFRhc2siIGRlZmF1bHQ9IkV4dGVuc2lvbiBQb2ludCBUYXNrIiBiYXNlZGlyPSIuIj4KLQk8dGFyZ2V0IG5hbWU9IkV4dGVuc2lvbiBQb2ludCBUYXNrIiBkZXNjcmlwdGlvbj0gIkVuc3VyZSB0aGF0IGFuIGV4dGVuc2lvbiBwb2ludCBkZWZpbmVkIHRhc2sgaXMgcHJlc2VudCI+Ci0JCTxjb29sVGFzay8+Ci0JCTxteTpjb29sVGFzayB4bWxuczpteT0idGVzdGluZyIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0V4dGVuc2lvblBvaW50VHlwZS54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvRXh0ZW5zaW9uUG9pbnRUeXBlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJhYWFlYy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvRXh0ZW5zaW9uUG9pbnRUeXBlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IkV4dGVuc2lvbiBQb2ludCBUeXBlIiBkZWZhdWx0PSJFeHRlbnNpb24gUG9pbnQgVHlwZSIgYmFzZWRpcj0iLiI+Ci0KLQk8Y29vbFR5cGUgaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0ibGliIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2Nvb2xUeXBlPgotICAgIAotCTx0YXJnZXQgbmFtZT0iRXh0ZW5zaW9uIFBvaW50IFR5cGUiIGRlc2NyaXB0aW9uPSAiRW5zdXJlIHRoYXQgYW4gZXh0ZW5zaW9uIHBvaW50IGRlZmluZWQgdHlwZSBpcyBwcmVzZW50Ij4KLQkJPGVjaG8gbWVzc2FnZT0iRW5zdXJlIHRoYXQgYW4gZXh0ZW5zaW9uIHBvaW50IGRlZmluZWQgdHlwZSBpcyBwcmVzZW50Ii8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvTm9EZWZhdWx0LnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9Ob0RlZmF1bHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2M5MTRhLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9Ob0RlZmF1bHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08cHJvamVjdCBuYW1lPSAiVGVzdGluZyI+Ci0JPHRhcmdldCBuYW1lPSAidGVzdCI+Ci0JCTxlY2hvIG1lc3NhZ2U9InRlc3RpbmciLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvVGVzdEZvckVjaG8ueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL1Rlc3RGb3JFY2hvLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIxM2U1ZS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvVGVzdEZvckVjaG8ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iRWNobyBUZXN0IiBkZWZhdWx0PSJUZXN0IGZvciBFY2hvIiBiYXNlZGlyPSIuIj4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8dHN0YW1wLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iVGVzdCBmb3IgRWNobyIgZGVzY3JpcHRpb249ICJDYWxscyBvdGhlciBlY2hvcyIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGRmaWxlcy9lY2hvaW5nLnhtbCIgZGlyPSIuLi8uLi9BbnRUZXN0cyIgdGFyZ2V0PSJlY2hvMSIvPgotCQk8YW50IGFudGZpbGU9ImJ1aWxkZmlsZXMvZWNob2luZy54bWwiIGRpcj0iLi4vLi4vQW50VGVzdHMiIHRhcmdldD0iZWNobzIiLz4KLQkJPGFudCBhbnRmaWxlPSJidWlsZGZpbGVzL2VjaG9pbmcueG1sIiBkaXI9Ii4uLy4uL0FudFRlc3RzIiB0YXJnZXQ9ImVjaG8zIi8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvYnVpbGQueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYzOGE1My4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iRWNoaW5nIiBkZWZhdWx0PSJlY2hvMSIgYmFzZWRpcj0iLi4iPgotCi0JPHRhcmdldCBuYW1lPSJlY2hvMSI+Ci0JCTxlY2hvIG1lc3NhZ2U9ImVjaG8xIi8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJlY2hvMiI+Ci0JCTxlY2hvIG1lc3NhZ2U9ImVjaG8yIi8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJlY2hvMyIgZGVzY3JpcHRpb249ICJBbiBlY2hvMyEiPgotCQk8ZWNobyBtZXNzYWdlPSJlY2hvMyIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL2VjaG9pbmcueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL2VjaG9pbmcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2RkNjRkLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9lY2hvaW5nLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IkVjaG9pbmciIGRlZmF1bHQ9ImVjaG8xIiBiYXNlZGlyPSIuLiI+Ci0KLQk8dGFyZ2V0IG5hbWU9ImVjaG8xIj4KLQkJPGVjaG8gbWVzc2FnZT0iZWNobzEiLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImVjaG8yIj4KLQkJPGVjaG8gbWVzc2FnZT0iZWNobzIiLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImVjaG8zIiBkZXNjcmlwdGlvbj0gIkFuIGVjaG8zISI+Ci0JCTxlY2hvIG1lc3NhZ2U9ImVjaG8zIi8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvZmFpbGluZ1RhcmdldC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvZmFpbGluZ1RhcmdldC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NDE4ZTAuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL2ZhaWxpbmdUYXJnZXQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08cHJvamVjdCBkZWZhdWx0PSJhbGwiPgotCTx0YXJnZXQgbmFtZT0iYWxsIiBkZXBlbmRzPSJmYWlscywgZWNob3MiLz4KLQk8dGFyZ2V0IG5hbWU9ImZhaWxzIj4KLQkJPGphciBqYXJmaWxlPSJqYXIxNi5qYXIiIGJhc2VkaXI9ImRvZXNOb3RFeGlzdCIvPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iZWNob3MiPgotCQk8ZWNobz5TdGlsbCBlY2hvIG9uIGZhaWx1cmU8L2VjaG8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL2lucHV0LnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9pbnB1dC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNzBhYjUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL2lucHV0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iaW5wdXQgdGVzdGluZyIgZGVmYXVsdD0gImlucHV0IHRlc3QiPgotCTx0YXJnZXQgbmFtZT0iaW5wdXQgdGVzdCI+Ci0JCTxpbnB1dCBtZXNzYWdlPSJFbnRlciBmb3IgZWNobyIgYWRkcHJvcGVydHk9ICJpbnB1dFRlc3QiPgotCQk8L2lucHV0PgotCQk8ZWNobyBtZXNzYWdlPSIke2lucHV0VGVzdH0iLz4KLQk8L3RhcmdldD4JCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL2phdmFjLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9qYXZhYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZjAyMjUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL2phdmFjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJvcmcuZWNsaXBzZS5hbnQuY29yZSIgZGVmYXVsdD0iYnVpbGQiIGJhc2VkaXI9Ii4uIj4KLQotCQotCTx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0icHJvcGVydGllcyI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4iIHZhbHVlPSJBbnRUZXN0cyIvPgotCQk8cHJvcGVydHkgbmFtZT0idGVtcC5mb2xkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9L3RlbXAuZm9sZGVyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uZGVzdGluYXRpb24iIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5yZXN1bHQuZm9sZGVyIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0icHJvcGVydGllcyIgaWY9InVzZS5lY2xpcHNlLkpEVENvbXBpbGVyIj4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSkRUQ29tcGlsZXJBZGFwdGVyIi8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJidWlsZCIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0ZGlyIiB2YWx1ZT0iJHt0ZW1wLmZvbGRlcn0vamF2YWMuYmluIi8+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfS9qYXZhYy5iaW4iLz4KLQkJPG1rZGlyIGRpcj0iJHt0ZW1wLmZvbGRlcn0vamF2YWMuYmluIi8+Ci0JCTwhLS0gY29tcGlsZSB0aGUgc291cmNlIGNvZGUgLS0+Ci0JCTxqYXZhYyBkZXN0ZGlyPSIke3RlbXAuZm9sZGVyfS9qYXZhYy5iaW4iIGZhaWxvbmVycm9yPSJmYWxzZSIgdmVyYm9zZT0iZmFsc2UiIGRlYnVnPSJvbiIgaW5jbHVkZUFudFJ1bnRpbWU9InllcyI+Ci0JCQk8c3JjIHBhdGg9InJlc291cmNlcyIvPgotCQk8L2phdmFjPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImluaXQiPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icmVmcmVzaCIgZGVwZW5kcz0iaW5pdCIgaWY9ImVjbGlwc2UucnVubmluZyI+Ci0JCTxlY2xpcHNlLnJlZnJlc2hMb2NhbCByZXNvdXJjZT0iJHtwbHVnaW59IiBkZXB0aD0iaW5maW5pdGUiLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0bGliL2NsYXNzcGF0aE9yZGVyaW5nMS5qYXIgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGxpYi9jbGFzc3BhdGhPcmRlcmluZzEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTBjYjdmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0bGliL2NsYXNzcGF0aE9yZGVyaW5nMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGxpYi9jbGFzc3BhdGhPcmRlcmluZzIuamFyIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RsaWIvY2xhc3NwYXRoT3JkZXJpbmcyLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgxNjc0MS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGxpYi9jbGFzc3BhdGhPcmRlcmluZzIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RsaWIvdGFza0ZvbGRlci9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrMi5jbGFzcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0bGliL3Rhc2tGb2xkZXIvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90YXNrcy9BbnRUZXN0VGFzazIuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMzdlYjUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RsaWIvdGFza0ZvbGRlci9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrMi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cmVzb3VyY2VzL0FudFRlc3RUYXNrLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHJlc291cmNlcy9BbnRUZXN0VGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjNmMDljLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cmVzb3VyY2VzL0FudFRlc3RUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FY2hvOwotCi0KLXB1YmxpYyBjbGFzcyBBbnRUZXN0VGFzayBleHRlbmRzIFRhc2sgewotCQotCXB1YmxpYyBBbnRUZXN0VGFzaygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCQlFY2hvIGVjaG89IG5ldyBFY2hvKCk7Ci0JCWVjaG8uc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOwotCQllY2hvLnNldE1lc3NhZ2UoIlRlc3RpbmcgQW50IGluIEVjbGlwc2Ugd2l0aCBhIGN1c3RvbSB0YXNrIik7Ci0JCWVjaG8uZXhlY3V0ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cmVzb3VyY2VzL3Rhc2tkZWZzLnByb3BlcnRpZXMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHJlc291cmNlcy90YXNrZGVmcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2ZkZDNhLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cmVzb3VyY2VzL3Rhc2tkZWZzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotbXlFY2hvUHJvcGVydGllcz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5FY2hvUHJvcGVydGllcwotaGVsbG89b3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuc3VwcG9ydC50YXNrcy5BbnRUZXN0VGFzawpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEwNDNmOC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQW50VGVzdHM9dGVzdGluZyBmcm9tIHByb3BlcnRpZXMgZmlsZQotZWNsaXBzZS5pcy5jb29sPVllcApkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL0Fic3RyYWN0QW50VGVzdC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL0Fic3RyYWN0QW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTVmOWMzLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9BYnN0cmFjdEFudFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuSUFudENsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLlRhcmdldEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RwbHVnaW4uQW50RmlsZVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLkFudFRlc3RDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RwbHVnaW4uQW50VGVzdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLlByb2plY3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLSAKLS8qKgotICogVGVzdHMgZm9yIEFudCBjb3JlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFudFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERfU1VDQ0VTU0ZVTD0gIkJVSUxEIFNVQ0NFU1NGVUwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVF9URVNUX0JVSUxEX0xPR0dFUiA9ICJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnRlc3Rsb2dnZXJzLlRlc3RCdWlsZExvZ2dlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTlRfVEVTVF9CVUlMRF9MSVNURU5FUj0gIm9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnN1cHBvcnQudGVzdGxvZ2dlcnMuVGVzdEJ1aWxkTGlzdGVuZXIiOwotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJYXNzZXJ0UHJvamVjdCgpOwotCX0KLQkKLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIHRlc3QgcHJvamVjdCBoYXMgYmVlbiBjcmVhdGVkIGFuZCBhbGwgdGVzdGluZyByZXNvdXJjZXMgaGF2ZSBiZWVuIAotCSAqIGxvYWRlZCBlYWNoIHRpbWUgdGhlIHtAbGluayAjc2V0VXAoKX0gbWV0aG9kIGlzIGNhbGxlZAotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICogQHNpbmNlIDMuNQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFzc2VydFByb2plY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gZGVsZXRlIGFueSBwcmUtZXhpc3RpbmcgcHJvamVjdAotCQlJUHJvamVjdCBwcm8gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoUHJvamVjdEhlbHBlci5QUk9KRUNUX05BTUUpOwotCQlpZiAoIXByby5leGlzdHMoKSkgewotCQkJLy8gY3JlYXRlIHByb2plY3QgYW5kIGltcG9ydCBidWlsZCBmaWxlcyBhbmQgc3VwcG9ydCBmaWxlcwotCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RIZWxwZXIuY3JlYXRlUHJvamVjdChQcm9qZWN0SGVscGVyLlBST0pFQ1RfTkFNRSk7Ci0JCQlJRm9sZGVyIGZvbGRlciA9IFByb2plY3RIZWxwZXIuYWRkRm9sZGVyKHByb2plY3QsIFByb2plY3RIZWxwZXIuQlVJTERGSUxFU19GT0xERVIpOwotCQkJRmlsZSByb290ID0gQW50VGVzdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RmlsZUluUGx1Z2luKFByb2plY3RIZWxwZXIuVEVTVF9CVUlMREZJTEVTX0RJUik7Ci0JCQlQcm9qZWN0SGVscGVyLmltcG9ydEZpbGVzRnJvbURpcmVjdG9yeShyb290LCBmb2xkZXIuZ2V0RnVsbFBhdGgoKSwgbnVsbCk7Ci0JCQkKLQkJCWZvbGRlciA9IFByb2plY3RIZWxwZXIuYWRkRm9sZGVyKHByb2plY3QsIFByb2plY3RIZWxwZXIuUkVTT1VSQ0VTX0ZPTERFUik7Ci0JCQlyb290ID0gQW50VGVzdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RmlsZUluUGx1Z2luKFByb2plY3RIZWxwZXIuVEVTVF9SRVNPVVJDRVNfRElSKTsKLQkJCVByb2plY3RIZWxwZXIuaW1wb3J0RmlsZXNGcm9tRGlyZWN0b3J5KHJvb3QsIGZvbGRlci5nZXRGdWxsUGF0aCgpLCBudWxsKTsKLQkJCQotCQkJZm9sZGVyID0gUHJvamVjdEhlbHBlci5hZGRGb2xkZXIocHJvamVjdCwgUHJvamVjdEhlbHBlci5MSUJfRk9MREVSKTsKLQkJCXJvb3QgPSBBbnRUZXN0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRGaWxlSW5QbHVnaW4oUHJvamVjdEhlbHBlci5URVNUX0xJQl9ESVIpOwotCQkJUHJvamVjdEhlbHBlci5pbXBvcnRGaWxlc0Zyb21EaXJlY3Rvcnkocm9vdCwgZm9sZGVyLmdldEZ1bGxQYXRoKCksIG51bGwpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlICdBbnRUZXN0cycgcHJvamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZXN0IHByb2plY3QKLQkgKi8KLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChQcm9qZWN0SGVscGVyLlBST0pFQ1RfTkFNRSk7Ci0JfQotCQotCXB1YmxpYyBBYnN0cmFjdEFudFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBJRmlsZSBnZXRCdWlsZEZpbGUoU3RyaW5nIGJ1aWxkRmlsZU5hbWUpIHsKLQkJSUZpbGUgZmlsZSA9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoUHJvamVjdEhlbHBlci5CVUlMREZJTEVTX0ZPTERFUikuZ2V0RmlsZShidWlsZEZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGZpbmQgYnVpbGQgZmlsZSBuYW1lZDogIiArIGJ1aWxkRmlsZU5hbWUsIGZpbGUuZXhpc3RzKCkpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElGb2xkZXIgZ2V0V29ya2luZ0RpcmVjdG9yeShTdHJpbmcgd29ya2luZ0RpcmVjdG9yeU5hbWUpIHsKLQkJSUZvbGRlciBmb2xkZXIgPSBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKHdvcmtpbmdEaXJlY3RvcnlOYW1lKTsKLQkJYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGZpbmQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IG5hbWVkOiAiICsgd29ya2luZ0RpcmVjdG9yeU5hbWUsIGZvbGRlci5leGlzdHMoKSk7Ci0JCXJldHVybiBmb2xkZXI7Ci0JfQotCQotCXByb3RlY3RlZCBJRmlsZSBjaGVja0ZpbGVFeGlzdHMoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWdldFByb2plY3QoKS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLQkJSUZpbGUgZmlsZSA9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoUHJvamVjdEhlbHBlci5CVUlMREZJTEVTX0ZPTERFUikuZ2V0RmlsZShmaWxlTmFtZSk7Ci0JCWFzc2VydFRydWUoIkNvdWxkIG5vdCBmaW5kIGZpbGUgbmFtZWQ6ICIgKyBmaWxlTmFtZSwgZmlsZS5leGlzdHMoKSk7Ci0JCXJldHVybiBmaWxlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oU3RyaW5nIGJ1aWxkRmlsZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKGJ1aWxkRmlsZU5hbWUsIG51bGwsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKFN0cmluZyBidWlsZEZpbGVOYW1lLCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bihidWlsZEZpbGVOYW1lLCBhcmdzLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bihTdHJpbmcgYnVpbGRGaWxlTmFtZSwgU3RyaW5nW10gYXJncywgYm9vbGVhbiByZXRyaWV2ZVRhcmdldHMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKGJ1aWxkRmlsZU5hbWUsIGFyZ3MsIHJldHJpZXZlVGFyZ2V0cywgIiIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oU3RyaW5nIGJ1aWxkRmlsZU5hbWUsIFN0cmluZ1tdIGFyZ3MsIGJvb2xlYW4gcmV0cmlldmVUYXJnZXRzLCBTdHJpbmcgd29ya2luZ0RpcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlBbnRUZXN0Q2hlY2tlci5yZXNldCgpOwotCQlJRmlsZSBidWlsZEZpbGU9IG51bGw7Ci0JCWlmIChidWlsZEZpbGVOYW1lICE9IG51bGwpIHsKLQkJCWJ1aWxkRmlsZT0gZ2V0QnVpbGRGaWxlKGJ1aWxkRmlsZU5hbWUpOwotCQl9Ci0JCUFudEZpbGVSdW5uZXIgcnVubmVyPSBuZXcgQW50RmlsZVJ1bm5lcigpOwotCQlTdHJpbmdbXSB0YXJnZXRzPSBudWxsOwotCQlpZiAocmV0cmlldmVUYXJnZXRzKSB7Ci0JCQl0YXJnZXRzPSBnZXRUYXJnZXROYW1lcyhidWlsZEZpbGVOYW1lKTsKLQkJfQotCQlpZiAod29ya2luZ0Rpci5sZW5ndGgoKSA+IDApIHsKLQkJCXdvcmtpbmdEaXI9IGdldFdvcmtpbmdEaXJlY3Rvcnkod29ya2luZ0RpcikuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJfSAKLQkJcnVubmVyLnJ1bihidWlsZEZpbGUsIHRhcmdldHMsIGFyZ3MsIHdvcmtpbmdEaXIsIHRydWUpOwotCQlhc3NlcnRUcnVlKCJCdWlsZCBzdGFydHMgZGlkIG5vdCBlcXVhbCBidWlsZCBmaW5pc2hlcyIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRCdWlsZHNTdGFydGVkQ291bnQoKSA9PSBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0QnVpbGRzRmluaXNoZWRDb3VudCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRhcmdldEluZm9bXSBnZXRUYXJnZXRzKFN0cmluZyBidWlsZEZpbGVOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGaWxlIGJ1aWxkRmlsZT0gZ2V0QnVpbGRGaWxlKGJ1aWxkRmlsZU5hbWUpOwotCQkKLQkJQW50UnVubmVyIHJ1bm5lciA9IG5ldyBBbnRSdW5uZXIoKTsKLQkJcnVubmVyLnNldEJ1aWxkRmlsZUxvY2F0aW9uKGJ1aWxkRmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpKTsKLQkgCXJldHVybiBydW5uZXIuZ2V0QXZhaWxhYmxlVGFyZ2V0cygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VGFyZ2V0TmFtZXMoU3RyaW5nIGJ1aWxkRmlsZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGFyZ2V0SW5mb1tdIGluZm9zPSBnZXRUYXJnZXRzKGJ1aWxkRmlsZU5hbWUpOwotCQlTdHJpbmdbXSBuYW1lcz0gbmV3IFN0cmluZ1tpbmZvcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZm9zLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYXJnZXRJbmZvIGluZm8gPSBpbmZvc1tpXTsKLQkJCW5hbWVzW2ldPSBpbmZvLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUYXJnZXREZXNjcmlwdGlvbnMoU3RyaW5nIGJ1aWxkRmlsZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGFyZ2V0SW5mb1tdIGluZm9zPSBnZXRUYXJnZXRzKGJ1aWxkRmlsZU5hbWUpOwotCQlTdHJpbmdbXSBkZXNjcmlwdGlvbnM9IG5ldyBTdHJpbmdbaW5mb3MubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvcy5sZW5ndGg7IGkrKykgewotCQkJVGFyZ2V0SW5mbyBpbmZvID0gaW5mb3NbaV07Ci0JCQlkZXNjcmlwdGlvbnNbaV09IGluZm8uZ2V0RGVzY3JpcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRpb25zOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IGNvbnRhaW5pbmcgdGhlIGdpdmVuIHRhcmdldCBpbiB0aGUgZ2l2ZW4gYnVpbGQgZmlsZSBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHByb2plY3QgbmFtZSBjYW4gYmUgZm91bmQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0TmFtZShTdHJpbmcgYnVpbGRGaWxlTmFtZSwgU3RyaW5nIHRhcmdldE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGFyZ2V0SW5mbyBpbmZvPSBnZXRUYXJnZXQoYnVpbGRGaWxlTmFtZSwgdGFyZ2V0TmFtZSk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCXJldHVybiBpbmZvLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlcGVuZGVuY2llcyBvZiB0aGUgdGFyZ2V0IHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gdGhlIGdpdmVuIGJ1aWxkIGZpbGUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiBubyBzdWNoIHRhcmdldCBjYW4gYmUgZm91bmQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldERlcGVuZGVuY2llcyhTdHJpbmcgYnVpbGRGaWxlTmFtZSwgU3RyaW5nIHRhcmdldE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGFyZ2V0SW5mbyBpbmZvPSBnZXRUYXJnZXQoYnVpbGRGaWxlTmFtZSwgdGFyZ2V0TmFtZSk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCXJldHVybiBpbmZvLmdldERlcGVuZGVuY2llcygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YXJnZXQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGUgZ2l2ZW4gYnVpbGQgZmlsZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vIHN1Y2ggdGFyZ2V0IGNhbiBiZSBmb3VuZC4KLQkgKi8KLQlwcm90ZWN0ZWQgVGFyZ2V0SW5mbyBnZXRUYXJnZXQoU3RyaW5nIGJ1aWxkRmlsZU5hbWUsIFN0cmluZyB0YXJnZXROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVRhcmdldEluZm9bXSBpbmZvcz0gZ2V0VGFyZ2V0cyhidWlsZEZpbGVOYW1lKTsKLQkJZm9yIChpbnQgaT0gMCwgbnVtVGFyZ2V0cz0gaW5mb3MubGVuZ3RoOyBpIDwgbnVtVGFyZ2V0czsgaSsrKSB7Ci0JCQlpZiAoaW5mb3NbaV0uZ2V0TmFtZSgpLmVxdWFscyh0YXJnZXROYW1lKSkgewotCQkJCXJldHVybiBpbmZvc1tpXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBsb2cgbWVzc2FnZSBuIGZyb20gdGhlIGxhc3Q6Ci0gICAgICogZS5nLiBnZXRMb2dnZWRNZXNzYWdlKDApIHJldHVybnMgdGhlIG1vc3QgcmVjZW50IG1lc3NhZ2UKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbiBtZXNzYWdlIGluZGV4Ci0gICAgICogQHJldHVybiB0aGUgbnRoIGxhc3QgbWVzc2FnZQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TG9nZ2VkTWVzc2FnZShpbnQgbikgewotICAgICAgICByZXR1cm4gQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldExvZ2dlZE1lc3NhZ2Uobik7Ci0gICAgfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFzdE1lc3NhZ2VMb2dnZWQoKSB7Ci0JCXJldHVybiBnZXRMb2dnZWRNZXNzYWdlKDApOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRTdWNjZXNzZnVsKCkgewotCQlMaXN0IG1lc3NhZ2VzPSBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKTsKLQkJU3RyaW5nIHN1Y2Nlc3M9IChTdHJpbmcpbWVzc2FnZXMuZ2V0KG1lc3NhZ2VzLnNpemUoKSAtIDEpOwotCQlhc3NlcnRFcXVhbHMoIkJ1aWxkIHdhcyBub3QgZmxhZ2dlZCBhcyBzdWNjZXNzZnVsOiAiICsgc3VjY2VzcywgQlVJTERfU1VDQ0VTU0ZVTCwgc3VjY2Vzcyk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvcGVydHlGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIGdldFByb2plY3QoKS5nZXRGb2xkZXIoUHJvamVjdEhlbHBlci5SRVNPVVJDRVNfRk9MREVSKS5nZXRGaWxlKCJ0ZXN0LnByb3BlcnRpZXMiKS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlUHJlZmVyZW5jZURlZmF1bHRzKCkgewotCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnM9IEFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJSUFudENsYXNzcGF0aEVudHJ5IHRvb2xzRW50cnk9IHByZWZzLmdldFRvb2xzSmFyRW50cnkoKTsKLQkJSUFudENsYXNzcGF0aEVudHJ5W10gYWRkaXRpb25hbEVudHJpZXM7Ci0JCWlmICh0b29sc0VudHJ5ID09IG51bGwpIHsKLQkJCWFkZGl0aW9uYWxFbnRyaWVzPSBuZXcgSUFudENsYXNzcGF0aEVudHJ5W117fTsKLQkJfSBlbHNlIHsKLQkJCWFkZGl0aW9uYWxFbnRyaWVzPSBuZXcgSUFudENsYXNzcGF0aEVudHJ5W10ge3Rvb2xzRW50cnl9OwotCQl9Ci0JCXByZWZzLnNldEFkZGl0aW9uYWxDbGFzc3BhdGhFbnRyaWVzKGFkZGl0aW9uYWxFbnRyaWVzKTsKLQkJcHJlZnMuc2V0QW50SG9tZUNsYXNzcGF0aEVudHJpZXMocHJlZnMuZ2V0RGVmYXVsdEFudEhvbWVFbnRyaWVzKCkpOwotCQlwcmVmcy5zZXRDdXN0b21UYXNrcyhuZXcgVGFza1tde30pOwotCQlwcmVmcy5zZXRDdXN0b21UeXBlcyhuZXcgVHlwZVtde30pOwotCQlwcmVmcy5zZXRDdXN0b21Qcm9wZXJ0eUZpbGVzKG5ldyBTdHJpbmdbXXt9KTsKLQkJcHJlZnMuc2V0Q3VzdG9tUHJvcGVydGllcyhuZXcgUHJvcGVydHlbXXt9KTsKLQkJcHJlZnMuc2V0QW50SG9tZShwcmVmcy5nZXREZWZhdWx0QW50SG9tZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbnRIb21lKCkgewotCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnM9IEFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJSUFudENsYXNzcGF0aEVudHJ5W10gZW50cmllcz0gcHJlZnMuZ2V0QW50SG9tZUNsYXNzcGF0aEVudHJpZXMoKTsKLQkJSUFudENsYXNzcGF0aEVudHJ5IGFudGphcj0gZW50cmllc1swXTsKLQkJSVBhdGggYW50SG9tZVBhdGg9IG5ldyBQYXRoKGFudGphci5nZXRFbnRyeVVSTCgpLmdldEZpbGUoKSk7Ci0JCWFudEhvbWVQYXRoPSBhbnRIb21lUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCXJldHVybiBhbnRIb21lUGF0aC50b0ZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9Qcm9qZWN0VGVzdHMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9Qcm9qZWN0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM2OTRmYS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHMvUHJvamVjdFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLkFic3RyYWN0QW50VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLkFudFRlc3RDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0VGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFudFRlc3QgewotCQotCXB1YmxpYyBQcm9qZWN0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHRoYXQgdGhlIHRocmVlIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgYWx3YXlzIGJlIHNldCBhcmUgY29ycmVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RCYXNlUHJvcGVydGllc1NldCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGJ1aWxkRmlsZU5hbWU9IlRlc3RGb3JFY2hvLnhtbCI7IAotCQlydW4oYnVpbGRGaWxlTmFtZSk7Ci0JCUlGaWxlIGJ1aWxkRmlsZT0gZ2V0QnVpbGRGaWxlKGJ1aWxkRmlsZU5hbWUpOwotCQlTdHJpbmcgZnVsbE5hbWU9IGJ1aWxkRmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQlhc3NlcnRFcXVhbHMoImVjbGlwc2UucnVubmluZyBzaG91bGQgaGF2ZSBiZWVuIHNldCBhcyB0cnVlIiwgInRydWUiLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJlY2xpcHNlLnJ1bm5pbmciKSk7Ci0JCWFzc2VydEVxdWFscygiYW50LmZpbGUgc2hvdWxkIGhhdmUgYmVlbiBzZXQgYXMgdGhlIGJ1aWxkIGZpbGUgbmFtZSIsIGZ1bGxOYW1lLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJhbnQuZmlsZSIpKTsKLQkJYXNzZXJ0Tm90TnVsbCgiYW50LmphdmEudmVyc2lvbiBzaG91bGQgaGF2ZSBiZWVuIHNldCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoImFudC5qYXZhLnZlcnNpb24iKSk7Ci0JCWFzc2VydE5vdE51bGwoImFudC52ZXJzaW9uIHNob3VsZCBoYXZlIGJlZW4gc2V0IiwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgiYW50LnZlcnNpb24iKSk7Ci0JCWFzc2VydE5vdE51bGwoImVjbGlwc2UuaG9tZSBzaG91bGQgaGF2ZSBiZWVuIHNldCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoImVjbGlwc2UuaG9tZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBidWlsZEZpbGVOYW1lPSJUZXN0Rm9yRWNoby54bWwiOyAKLQkJcnVuKGJ1aWxkRmlsZU5hbWUpOwotCQlhc3NlcnRFcXVhbHMoInByb3BlcnR5LnRlc3Rpbmcgc2hvdWxkIGhhdmUgYmVlbiBzZXQgYXMgdHJ1ZSIsICJ0cnVlIiwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgicHJvcGVydHkudGVzdGluZyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVXaXRoQ2xhc3MoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlTdHJpbmcgYnVpbGRGaWxlTmFtZT0iVGVzdEZvckVjaG8ueG1sIjsgCi0JCXJ1bihidWlsZEZpbGVOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eS50ZXN0aW5nMiBzaG91bGQgaGF2ZSBiZWVuIHNldCBhcyBoZXkiLCAiaGV5IiwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgicHJvcGVydHkudGVzdGluZzIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgYnVpbGRGaWxlTmFtZT0iVGVzdEZvckVjaG8ueG1sIjsgCi0JCXJ1bihidWlsZEZpbGVOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eS50ZXN0aW5nMyBzaG91bGQgaGF2ZSBiZWVuIHNldCBhcyBBbnRUZXN0UHJvcGVydHlQcm92aWRlciIsICJBbnRUZXN0UHJvcGVydHlWYWx1ZVByb3ZpZGVyIiwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgicHJvcGVydHkudGVzdGluZzMiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RIZWFkbGVzcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuc2V0UnVubmluZ0hlYWRsZXNzKHRydWUpOwotCQkJU3RyaW5nIGJ1aWxkRmlsZU5hbWU9IlRlc3RGb3JFY2hvLnhtbCI7IAotCQkJcnVuKGJ1aWxkRmlsZU5hbWUpOwotCQkJYXNzZXJ0TnVsbCgicHJvcGVydHkuaGVhZGxlc3Mgc2hvdWxkIG5vdCBoYXZlIGJlZW4gc2V0IGFzIEFudFRlc3RQcm9wZXJ0eVByb3ZpZGVyIiwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgicHJvcGVydHkuaGVhZGxlc3MiKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLnNldFJ1bm5pbmdIZWFkbGVzcyhmYWxzZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5vdEhlYWRsZXNzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgYnVpbGRGaWxlTmFtZT0iVGVzdEZvckVjaG8ueG1sIjsgCi0JCXJ1bihidWlsZEZpbGVOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eS5oZWFkbGVzcyBzaG91bGQgaGF2ZSBiZWVuIHNldCBhcyBBbnRUZXN0UHJvcGVydHlQcm92aWRlciIsICJoZWFkbGVzcyIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoInByb3BlcnR5LmhlYWRsZXNzIikpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHMvVGFza1Rlc3RzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHMvVGFza1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YWU4MTIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL1Rhc2tUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5JQW50Q2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwuY29yZS5BbnRDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5BYnN0cmFjdEFudFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHBsdWdpbi5BbnRUZXN0Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLlByb2plY3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBUYXNrVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFudFRlc3QgewotCi0JCi0JcHVibGljIFRhc2tUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdGluZyB0aGUgb2xkIGRlcHJlY2F0ZWQgQVBJCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEFkZFRhc2tTZXR0aW5nTGlicmFyeSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZzID1BbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCk7Ci0JCVVSTFtdIHVybHM9IHByZWZzLmdldEV4dHJhQ2xhc3NwYXRoVVJMcygpOwotCQlUYXNrIG5ld1Rhc2s9IG5ldyBUYXNrKCk7Ci0JCW5ld1Rhc2suc2V0TGlicmFyeSh1cmxzWzBdKTsKLQkJbmV3VGFzay5zZXRUYXNrTmFtZSgiQW50VGVzdFRhc2siKTsKLQkJbmV3VGFzay5zZXRDbGFzc05hbWUoIm9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnN1cHBvcnQudGFza3MuQW50VGVzdFRhc2siKTsKLQkJcHJlZnMuc2V0Q3VzdG9tVGFza3MobmV3IFRhc2tbXXtuZXdUYXNrfSk7Ci0JCQotCQlwcmVmcy51cGRhdGVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkKLQkJcnVuKCJDdXN0b21UYXNrLnhtbCIsIG5ldyBTdHJpbmdbMF0sIGZhbHNlKTsKLQkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMSk7Ci0JCWFzc2VydEVxdWFscygiTWVzc2FnZSBpbmNvcnJlY3Q6ICIgKyBtc2csICJUZXN0aW5nIEFudCBpbiBFY2xpcHNlIHdpdGggYSBjdXN0b20gdGFzayIsIG1zZyk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFRhc2tTZXR0aW5nTGlicmFyeUVudHJ5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnMgPUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJVVJMW10gdXJscz0gcHJlZnMuZ2V0RXh0cmFDbGFzc3BhdGhVUkxzKCk7Ci0JCVRhc2sgbmV3VGFzaz0gbmV3IFRhc2soKTsKLQkJbmV3VGFzay5zZXRMaWJyYXJ5RW50cnkobmV3IEFudENsYXNzcGF0aEVudHJ5KHVybHNbMF0pKTsKLQkJbmV3VGFzay5zZXRUYXNrTmFtZSgiQW50VGVzdFRhc2syIik7Ci0JCW5ld1Rhc2suc2V0Q2xhc3NOYW1lKCJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnRhc2tzLkFudFRlc3RUYXNrIik7Ci0JCXByZWZzLnNldEN1c3RvbVRhc2tzKG5ldyBUYXNrW117bmV3VGFza30pOwotCQkKLQkJcHJlZnMudXBkYXRlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCi0JCXJ1bigiQ3VzdG9tVGFzay54bWwiLCBuZXcgU3RyaW5nW10geyJDdXN0b20gVGFzayBmcm9tIEVudHJ5In0sIGZhbHNlKTsKLQkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMSk7Ci0JCWFzc2VydEVxdWFscygiTWVzc2FnZSBpbmNvcnJlY3Q6ICIgKyBtc2csICJUZXN0aW5nIEFudCBpbiBFY2xpcHNlIHdpdGggYSBjdXN0b20gdGFzayIsIG1zZyk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVRhc2soKSB7Ci0JCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcyA9QW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOwotCQlwcmVmcy5zZXRDdXN0b21UYXNrcyhuZXcgVGFza1tde30pOwotCQl0cnkgewotCQkJcnVuKCJDdXN0b21UYXNrLnhtbCIpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlhc3NlcnRUcnVlKCJFeGNlcHRpb24gZnJvbSB1bmRlZmluZWQgdGFzayBpcyBpbmNvcnJlY3QiLCBjZS5nZXRNZXNzYWdlKCkudHJpbSgpLmVuZHNXaXRoKCJBY3Rpb246IENoZWNrIHRoYXQgYW55IDxwcmVzZXRkZWY+LzxtYWNyb2RlZj4gZGVjbGFyYXRpb25zIGhhdmUgdGFrZW4gcGxhY2UuIikpOwotCQkJcmV0dXJuOwotCQl9IGZpbmFsbHkgewotCQkJcmVzdG9yZVByZWZlcmVuY2VEZWZhdWx0cygpOwkKLQkJfQotCQlhc3NlcnRUcnVlKCJCdWlsZCBzaG91bGQgaGF2ZSBmYWlsZWQgYXMgdGFzayBubyBsb25nZXIgZGVmaW5lZCIsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFRhc2tGcm9tRm9sZGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZzID1BbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCk7Ci0JCQlUYXNrIG5ld1Rhc2s9IG5ldyBUYXNrKCk7Ci0JCQlTdHJpbmcgcGF0aD0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcihQcm9qZWN0SGVscGVyLkxJQl9GT0xERVIpLmdldEZpbGUoInRhc2tGb2xkZXIiKS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQkJSUFudENsYXNzcGF0aEVudHJ5IGVudHJ5PSBuZXcgQW50Q2xhc3NwYXRoRW50cnkocGF0aCArIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCQlJQW50Q2xhc3NwYXRoRW50cnkgZW50cmllc1tdID0gcHJlZnMuZ2V0QWRkaXRpb25hbENsYXNzcGF0aEVudHJpZXMoKTsKLQkJCUlBbnRDbGFzc3BhdGhFbnRyeSBuZXdFbnRyaWVzW10gPSBuZXcgSUFudENsYXNzcGF0aEVudHJ5W2VudHJpZXMubGVuZ3RoICsgMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGVudHJpZXMsIDAsIG5ld0VudHJpZXMsIDAsIGVudHJpZXMubGVuZ3RoKTsKLQkJCW5ld0VudHJpZXNbZW50cmllcy5sZW5ndGhdID0gZW50cnk7Ci0JCQlwcmVmcy5zZXRBZGRpdGlvbmFsQ2xhc3NwYXRoRW50cmllcyhuZXdFbnRyaWVzKTsKLQkJCi0JCQluZXdUYXNrLnNldExpYnJhcnlFbnRyeShlbnRyeSk7Ci0JCQluZXdUYXNrLnNldFRhc2tOYW1lKCJBbnRUZXN0VGFzayIpOwotCQkJbmV3VGFzay5zZXRDbGFzc05hbWUoIm9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnN1cHBvcnQudGFza3MuQW50VGVzdFRhc2syIik7Ci0JCQlwcmVmcy5zZXRDdXN0b21UYXNrcyhuZXcgVGFza1tde25ld1Rhc2t9KTsKLQkJCi0JCQlwcmVmcy51cGRhdGVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkKLQkJCXJ1bigiQ3VzdG9tVGFzay54bWwiLCBuZXcgU3RyaW5nWzBdLCBmYWxzZSk7Ci0JCQlTdHJpbmcgbXNnPSAoU3RyaW5nKUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlcygpLmdldCgxKTsKLQkJCWFzc2VydEVxdWFscygiTWVzc2FnZSBpbmNvcnJlY3Q6ICIgKyBtc2csICJUZXN0aW5nIEFudCBpbiBFY2xpcHNlIHdpdGggYSBjdXN0b20gdGFzayIsIG1zZyk7Ci0JCQlhc3NlcnRTdWNjZXNzZnVsKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZXN0b3JlUHJlZmVyZW5jZURlZmF1bHRzKCk7Ci0JCX0KLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RUYXNrc0RlZmluZWRJblByb3BlcnR5RmlsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcyA9QW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOwotCQkJUHJvcGVydHkgbmV3UHJvcD0gbmV3IFByb3BlcnR5KCJST09URElSIiwgIi4uLy9yZXNvdXJjZXMiKTsKLQkJCXByZWZzLnNldEN1c3RvbVByb3BlcnRpZXMobmV3IFByb3BlcnR5W117bmV3UHJvcH0pOwotCQkJcnVuKCJCdWczNDY2My54bWwiKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlc3RvcmVQcmVmZXJlbmNlRGVmYXVsdHMoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGFza0RlZmluZWRJbkV4dGVuc2lvblBvaW50KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oIkV4dGVuc2lvblBvaW50VGFzay54bWwiKTsKLQkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMSk7Ci0JCWFzc2VydEVxdWFscygiTWVzc2FnZSBpbmNvcnJlY3Q6ICIgKyBtc2csICJUZXN0aW5nIEFudCBpbiBFY2xpcHNlIHdpdGggYSBjdXN0b20gdGFzayIsIG1zZyk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RUYXNrRGVmaW5lZEluRXh0ZW5zaW9uUG9pbnRIZWFkbGVzcygpIHsKLQkJQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5zZXRSdW5uaW5nSGVhZGxlc3ModHJ1ZSk7Ci0JCXRyeSB7Ci0JCQlydW4oIkV4dGVuc2lvblBvaW50VGFzay54bWwiKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJYXNzZXJ0VHJ1ZSgiRXhjZXB0aW9uIGZyb20gdW5kZWZpbmVkIHRhc2sgaXMgaW5jb3JyZWN0IiwgY2UuZ2V0TWVzc2FnZSgpLnRyaW0oKS5lbmRzV2l0aCgiQWN0aW9uOiBDaGVjayB0aGF0IGFueSA8cHJlc2V0ZGVmPi88bWFjcm9kZWY+IGRlY2xhcmF0aW9ucyBoYXZlIHRha2VuIHBsYWNlLiIpKTsKLQkJCXJldHVybjsKLQkJfSBmaW5hbGx5IHsKLQkJCUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuc2V0UnVubmluZ0hlYWRsZXNzKGZhbHNlKTsKLQkJfQotCQlhc3NlcnRUcnVlKCJCdWlsZCBzaG91bGQgaGF2ZSBmYWlsZWQgYXMgdGFzayB3YXMgbm90IGRlZmluZWQgdG8gcnVuIGluIGhlYWRsZXNzIiwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGFza0RlZmluZWRJbkV4dGVuc2lvblBvaW50V2l0aFVSSSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJFeHRlbnNpb25Qb2ludFRhc2sueG1sIik7Ci0JCVN0cmluZyBtc2c9IChTdHJpbmcpQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCkuZ2V0KDIpOwotCQlhc3NlcnRFcXVhbHMoIk1lc3NhZ2UgaW5jb3JyZWN0OiAiICsgbXNnLCAiVGVzdGluZyBBbnQgaW4gRWNsaXBzZSB3aXRoIGEgY3VzdG9tIHRhc2siLCBtc2cpOwotCQlhc3NlcnRTdWNjZXNzZnVsKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9UeXBlVGVzdHMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9UeXBlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUzMGZjYy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHMvVHlwZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RzOwotCi0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLkFudENsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLkFic3RyYWN0QW50VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLkFudFRlc3RDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVHlwZVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RBbnRUZXN0IHsKLQotCXB1YmxpYyBUeXBlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRUeXBlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnMgPUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJVVJMW10gdXJscz0gcHJlZnMuZ2V0RXh0cmFDbGFzc3BhdGhVUkxzKCk7Ci0JCVR5cGUgbmV3VHlwZT0gbmV3IFR5cGUoKTsKLQkJbmV3VHlwZS5zZXRMaWJyYXJ5RW50cnkobmV3IEFudENsYXNzcGF0aEVudHJ5KHVybHNbMF0pKTsKLQkJbmV3VHlwZS5zZXRUeXBlTmFtZSgiYW50dGVzdHBhdGgiKTsKLQkJbmV3VHlwZS5zZXRDbGFzc05hbWUoIm9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnN1cHBvcnQudHlwZXMuQW50VGVzdFBhdGgiKTsKLQkJcHJlZnMuc2V0Q3VzdG9tVHlwZXMobmV3IFR5cGVbXXtuZXdUeXBlfSk7Ci0JCQotCQlydW4oIkN1c3RvbVR5cGUueG1sIik7Ci0JCVN0cmluZyBtc2c9IChTdHJpbmcpQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCkuZ2V0KDEpOwotCQlhc3NlcnRFcXVhbHMoIk1lc3NhZ2UgaW5jb3JyZWN0OiAiICsgbXNnLCAiVGVzdCBhZGRpbmcgYSBjdXN0b20gdHlwZSIsIG1zZyk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVR5cGUoKSB7Ci0JCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcyA9QW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOwotCQlwcmVmcy5zZXRDdXN0b21UeXBlcyhuZXcgVHlwZVtde30pOwotCQl0cnkgewotCQkJcnVuKCJDdXN0b21UeXBlLnhtbCIpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlhc3NlcnRUcnVlKCJFeGNlcHRpb24gZnJvbSB1bmRlZmluZWQgdHlwZSBpcyBpbmNvcnJlY3Q6ICIrIGNlLmdldE1lc3NhZ2UoKSwgY2UuZ2V0TWVzc2FnZSgpLnRyaW0oKS5lbmRzV2l0aCgiQWN0aW9uOiBDaGVjayB0aGF0IGFueSA8cHJlc2V0ZGVmPi88bWFjcm9kZWY+IGRlY2xhcmF0aW9ucyBoYXZlIHRha2VuIHBsYWNlLiIpKTsKLQkJCXJldHVybjsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlc3RvcmVQcmVmZXJlbmNlRGVmYXVsdHMoKTsJCi0JCX0KLQkJYXNzZXJ0VHJ1ZSgiQnVpbGQgc2hvdWxkIGhhdmUgZmFpbGVkIGFzIHR5cGUgbm8gbG9uZ2VyIGRlZmluZWQiLCBmYWxzZSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZURlZmluZWRJbkV4dGVuc2lvblBvaW50KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oIkV4dGVuc2lvblBvaW50VHlwZS54bWwiKTsKLQkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMSk7Ci0JCWFzc2VydEVxdWFscygiTWVzc2FnZSBpbmNvcnJlY3Q6ICIgKyBtc2csICJFbnN1cmUgdGhhdCBhbiBleHRlbnNpb24gcG9pbnQgZGVmaW5lZCB0eXBlIGlzIHByZXNlbnQiLCBtc2cpOwotCQlhc3NlcnRTdWNjZXNzZnVsKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlRGVmaW5lZEluRXh0ZW5zaW9uUG9pbnRIZWFkbGVzcygpIHsKLQkJQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5zZXRSdW5uaW5nSGVhZGxlc3ModHJ1ZSk7Ci0JCXRyeSB7Ci0JCQlydW4oIkV4dGVuc2lvblBvaW50VHlwZS54bWwiKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJYXNzZXJ0VHJ1ZSgiRXhjZXB0aW9uIGZyb20gdW5kZWZpbmVkIHR5cGUgaXMgaW5jb3JyZWN0OiAiICsgY2UuZ2V0TWVzc2FnZSgpLCBjZS5nZXRNZXNzYWdlKCkudHJpbSgpLmVuZHNXaXRoKCJBY3Rpb246IENoZWNrIHRoYXQgYW55IDxwcmVzZXRkZWY+LzxtYWNyb2RlZj4gZGVjbGFyYXRpb25zIGhhdmUgdGFrZW4gcGxhY2UuIikpOwotCQkJcmV0dXJuOwotCQl9IGZpbmFsbHkgewotCQkJQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5zZXRSdW5uaW5nSGVhZGxlc3MoZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoIkJ1aWxkIHNob3VsZCBoYXZlIGZhaWxlZCBhcyB0eXBlIHdhcyBub3QgZGVmaW5lZCB0byBydW4gaW4gaGVhZGxlc3MiLCBmYWxzZSk7Ci0JfQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLy5jbGFzc3BhdGggYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMjY5NGMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iQW50IEVkaXRvciBUZXN0cyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IkFudCBEZWJ1ZyBUZXN0cyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InRlc3QgcGx1Z2luIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iQW50IFRlc3RzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iRXh0ZXJuYWwgVG9vbHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgb3V0cHV0PSJ0ZXN0X3N1cHBvcnRfYmluIiBwYXRoPSJ0ZXN0IHN1cHBvcnQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvQnVpbGQgVGVzdCBTdXBwb3J0IEpBUi5sYXVuY2ggYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLy5leHRlcm5hbFRvb2xCdWlsZGVycy9CdWlsZCBUZXN0IFN1cHBvcnQgSkFSLmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFmZDFmMy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLy5leHRlcm5hbFRvb2xCdWlsZGVycy9CdWlsZCBUZXN0IFN1cHBvcnQgSkFSLmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5hbnQuQW50QnVpbGRlckxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIj4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuQVRUUl9MQVVOQ0hfSU5fQkFDS0dST1VORCIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmFudC51aS5ERUZBVUxUX1ZNX0lOU1RBTEwiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkRFRkFVTFRfQ0xBU1NQQVRIIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmFudC51aS5BVFRSX0FOVF9DTEVBTl9UQVJHRVRTIiB2YWx1ZT0iY2xlYW4sIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0JVSUxEX1NDT1BFIiB2YWx1ZT0iJHt3b3JraW5nX3NldDombHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDtVVEYtOCZxdW90Oz8mZ3Q7JiMxMDsmbHQ7bGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQgZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtpbmdTZXRGYWN0b3J5JnF1b3Q7IG5hbWU9JnF1b3Q7d29ya2luZ1NldCZxdW90OyBlZGl0UGFnZUlkPSZxdW90O29yZy5lY2xpcHNlLnVpLnJlc291cmNlV29ya2luZ1NldFBhZ2UmcXVvdDsmZ3Q7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9idWlsZGZpbGVzL2J1aWxkQW50VGVzdHNTdXBwb3J0SkFSLnhtbCZxdW90OyB0eXBlPSZxdW90OzEmcXVvdDsvJmd0OyYjMTA7Jmx0O2l0ZW0gZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLm1vZGVsLlJlc291cmNlRmFjdG9yeSZxdW90OyBwYXRoPSZxdW90Oy9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBzdXBwb3J0JnF1b3Q7IHR5cGU9JnF1b3Q7MiZxdW90Oy8mZ3Q7JiMxMDsmbHQ7L2xhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nU2V0Jmd0OyYjMTA7fSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9SVU5fQlVJTERfS0lORFMiIHZhbHVlPSJmdWxsLGluY3JlbWVudGFsLGF1dG8sY2xlYW4iLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuYW50LnVpLkFUVFJfVEFSR0VUU19VUERBVEVEIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuQVRUUl9SRUZSRVNIX1NDT1BFIiB2YWx1ZT0iJHt3b3JraW5nX3NldDombHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDtVVEYtOCZxdW90Oz8mZ3Q7JiMxMDsmbHQ7bGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQgZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtpbmdTZXRGYWN0b3J5JnF1b3Q7IG5hbWU9JnF1b3Q7d29ya2luZ1NldCZxdW90OyBlZGl0UGFnZUlkPSZxdW90O29yZy5lY2xpcHNlLnVpLnJlc291cmNlV29ya2luZ1NldFBhZ2UmcXVvdDsmZ3Q7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aSZxdW90OyB0eXBlPSZxdW90OzQmcXVvdDsvJmd0OyYjMTA7Jmx0Oy9sYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ1NldCZndDsmIzEwO30iLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfTE9DQVRJT04iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2M6L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9idWlsZGZpbGVzL2J1aWxkQW50VGVzdHNTdXBwb3J0SkFSLnhtbH0iLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1RSSUdHRVJTX0NPTkZJR1VSRUQiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5DTEFTU1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5hbnQudWkuQW50Q2xhc3NwYXRoUHJvdmlkZXIiLz4KLTwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvLnByb2plY3QgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzc1OWIwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5hbnQudGVzdHMudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4JCQotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5FeHRlcm5hbFRvb2xCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCQk8ZGljdGlvbmFyeT4KLQkJCQkJPGtleT5MYXVuY2hDb25maWdIYW5kbGU8L2tleT4KLQkJCQkJPHZhbHVlPiZsdDtwcm9qZWN0Jmd0Oy8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvQnVpbGQgVGVzdCBTdXBwb3J0IEpBUi5sYXVuY2g8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2NTRjZi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1RodSBNYXkgMjcgMTQ6NDg6MzggUERUIDIwMDQNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLXNlbGZob3N0aW5nLmJpbkV4Y2x1ZGVzPS9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdF9zdXBwb3J0X2Jpbg0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFjZDhkMi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jTW9uIERlYyAxNCAxMTo0MTowMCBDU1QgMjAwOQ0KLWNvbXBpbGVycy5mLnVucmVzb2x2ZWQtZmVhdHVyZXM9MQ0KLWNvbXBpbGVycy5mLnVucmVzb2x2ZWQtcGx1Z2lucz0xDQotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0xDQotY29tcGlsZXJzLnAuYnVpbGQ9MQ0KLWNvbXBpbGVycy5wLmJ1aWxkLm1pc3Npbmcub3V0cHV0PTENCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTENCi1jb21waWxlcnMucC5kaXNjb3VyYWdlZC1jbGFzcz0xDQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MA0KLWNvbXBpbGVycy5wLmludGVybmFsPTENCi1jb21waWxlcnMucC5taXNzaW5nLXBhY2thZ2VzPTINCi1jb21waWxlcnMucC5taXNzaW5nLXZlcnNpb24tZXhwb3J0LXBhY2thZ2U9Mg0KLWNvbXBpbGVycy5wLm1pc3NpbmctdmVyc2lvbi1pbXBvcnQtcGFja2FnZT0yDQotY29tcGlsZXJzLnAubWlzc2luZy12ZXJzaW9uLXJlcXVpcmUtYnVuZGxlPTINCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MA0KLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTENCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wDQotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0xDQotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTANCi1jb21waWxlcnMucC51bmtub3duLWlkZW50aWZpZXI9MQ0KLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MQ0KLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTANCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wDQotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTENCi1jb21waWxlcnMucy5jcmVhdGUtZG9jcz1mYWxzZQ0KLWNvbXBpbGVycy5zLmRvYy1mb2xkZXI9ZG9jDQotY29tcGlsZXJzLnMub3Blbi10YWdzPTENCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQ0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRGVidWcgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2RlYnVnL0JyZWFrcG9pbnRUZXN0cy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRGVidWcgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2RlYnVnL0JyZWFrcG9pbnRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGU1MjE0Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IERlYnVnIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9kZWJ1Zy9CcmVha3BvaW50VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmRlYnVnOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcuZGVidWcubW9kZWwuQW50RGVidWdUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5kZWJ1Zy5tb2RlbC5BbnRUaHJlYWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy5JQW50TGF1bmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklMaW5lQnJlYWtwb2ludDsKLQotLyoqCi0gKiBUZXN0cyBBbnQgYnJlYWtwb2ludHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha3BvaW50VGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFudERlYnVnVGVzdCB7Ci0JCi0JcHVibGljIEJyZWFrcG9pbnRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmZXJyZWRCcmVha3BvaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlkZWZlcnJlZEJyZWFrcG9pbnRzKGZhbHNlKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZlcnJlZEJyZWFrcG9pbnRzU2VwVk0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZGVmZXJyZWRCcmVha3BvaW50cyh0cnVlKTsJCQotCX0KLQotCXByaXZhdGUgdm9pZCBkZWZlcnJlZEJyZWFrcG9pbnRzKGJvb2xlYW4gc2VwVk0pIHRocm93cyBFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIERlYnVnRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gImJyZWFrcG9pbnRzIjsKLQkJSUZpbGUgZmlsZT0gZ2V0SUZpbGUoZmlsZU5hbWUgKyAiLnhtbCIpOwotCQlMaXN0IGJwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYnBzLmFkZChjcmVhdGVMaW5lQnJlYWtwb2ludCg1LCBmaWxlKSk7Ci0JCWJwcy5hZGQoY3JlYXRlTGluZUJyZWFrcG9pbnQoMTQsIGZpbGUpKTsKLQkJQW50VGhyZWFkIHRocmVhZD0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRocmVhZD0gbGF1bmNoVG9CcmVha3BvaW50KGZpbGVOYW1lLCB0cnVlLCBzZXBWTSk7Ci0JCQlhc3NlcnROb3ROdWxsKCJCcmVha3BvaW50IG5vdCBoaXQgd2l0aGluIHRpbWVvdXQgcGVyaW9kIiwgdGhyZWFkKTsKLQkJCXdoaWxlICghYnBzLmlzRW1wdHkoKSkgewotCQkJCUlCcmVha3BvaW50IGhpdCA9IGdldEJyZWFrcG9pbnQodGhyZWFkKTsKLQkJCQlhc3NlcnROb3ROdWxsKCJzdXNwZW5kZWQsIGJ1dCBub3QgYnkgYnJlYWtwb2ludCIsIGhpdCk7Ci0JCQkJYXNzZXJ0VHJ1ZSgiaGl0IHVuLXJlZ2lzdGVyZWQgYnJlYWtwb2ludCIsIGJwcy5jb250YWlucyhoaXQpKTsKLQkJCQlhc3NlcnRUcnVlKCJzdXNwZW5kZWQsIGJ1dCBub3QgYnkgbGluZSBicmVha3BvaW50IiwgaGl0IGluc3RhbmNlb2YgSUxpbmVCcmVha3BvaW50KTsKLQkJCQlJTGluZUJyZWFrcG9pbnQgYnJlYWtwb2ludD0gKElMaW5lQnJlYWtwb2ludCkgaGl0OwotCQkJCWludCBsaW5lTnVtYmVyID0gYnJlYWtwb2ludC5nZXRMaW5lTnVtYmVyKCk7Ci0JCQkJaW50IHN0YWNrTGluZSA9IHRocmVhZC5nZXRUb3BTdGFja0ZyYW1lKCkuZ2V0TGluZU51bWJlcigpOwotCQkJCWFzc2VydEVxdWFscygibGluZSBudW1iZXJzIG9mIGJyZWFrcG9pbnQgYW5kIHN0YWNrIGZyYW1lIGRvIG5vdCBtYXRjaCIsIGxpbmVOdW1iZXIsIHN0YWNrTGluZSk7Ci0JCQkJYnBzLnJlbW92ZShicmVha3BvaW50KTsKLQkJCQlicmVha3BvaW50LmRlbGV0ZSgpOwotCQkJCWlmICghYnBzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VwVk0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRGb3JUYXJnZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCQkJCQl0aHJlYWQgPSByZXN1bWUodGhyZWFkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQl0ZXJtaW5hdGVBbmRSZW1vdmUodGhyZWFkKTsKLQkJCXJlbW92ZUFsbEJyZWFrcG9pbnRzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRCcmVha3BvaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGRpc2FibGVkQnJlYWtwb2ludChmYWxzZSk7CQkJCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJyZWFrcG9pbnRTZXBWTSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBkaXNhYmxlZEJyZWFrcG9pbnQodHJ1ZSk7CQkJCQotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNhYmxlZEJyZWFrcG9pbnQoYm9vbGVhbiBzZXBhcmF0ZVZNKSB0aHJvd3MgRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gImJyZWFrcG9pbnRzIjsKLQkJSUxpbmVCcmVha3BvaW50IGJwID0gY3JlYXRlTGluZUJyZWFrcG9pbnQoNSwgZmlsZU5hbWUgKyAiLnhtbCIpOwotCQlicC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJQW50RGVidWdUYXJnZXQgZGVidWdUYXJnZXQgPSBudWxsOwotCQl0cnkgewotCQkJZGVidWdUYXJnZXQ9IGxhdW5jaEFuZFRlcm1pbmF0ZShmaWxlTmFtZSwgc2VwYXJhdGVWTSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0ZXJtaW5hdGVBbmRSZW1vdmUoZGVidWdUYXJnZXQpOwotCQkJcmVtb3ZlQWxsQnJlYWtwb2ludHMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbmFibGVEaXNhYmxlQnJlYWtwb2ludCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBlbmFibGVEaXNhYmxlQnJlYXBvaW50KGZhbHNlKTsJCQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVuYWJsZURpc2FibGVCcmVha3BvaW50U2VwVk0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZW5hYmxlRGlzYWJsZUJyZWFwb2ludCh0cnVlKTsJCQkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZURpc2FibGVCcmVhcG9pbnQoYm9vbGVhbiBzZXBWTSkgdGhyb3dzIEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlTdHJpbmcgZmlsZU5hbWUgPSAiYnJlYWtwb2ludHMiOwotCQlJTGluZUJyZWFrcG9pbnQgYnAgPSBjcmVhdGVMaW5lQnJlYWtwb2ludCg1LCBmaWxlTmFtZSArICIueG1sIik7Ci0JCWJwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCUFudFRocmVhZCB0aHJlYWQgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKHNlcFZNKSB7Ci0JCQkJZmlsZU5hbWUrPSAiU2VwVk0iOwotCQkJfQotICAgICAgICAgICAgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnPSBnZXRMYXVuY2hDb25maWd1cmF0aW9uKGZpbGVOYW1lKTsKLSAgICAgICAgICAgIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29weT0gY29uZmlnLmdldFdvcmtpbmdDb3B5KCk7Ci0gICAgICAgICAgICBjb3B5LnNldEF0dHJpYnV0ZShJQW50TGF1bmNoQ29uc3RhbnRzLkFUVFJfQU5UX1RBUkdFVFMsICJlbnRyeTEsZW50cnkyIik7Ci0JCQl0aHJlYWQ9IGxhdW5jaFRvTGluZUJyZWFrcG9pbnQoY29weSwgYnApOwotCQkJYnAuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBpZiAoc2VwVk0pIHsKLSAgICAgICAgICAgICAgICB3YWl0Rm9yVGFyZ2V0KCk7Ci0gICAgICAgICAgICB9Ci0JCQlyZXN1bWVBbmRFeGl0KHRocmVhZCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0ZXJtaW5hdGVBbmRSZW1vdmUodGhyZWFkKTsKLQkJCXJlbW92ZUFsbEJyZWFrcG9pbnRzKCk7Ci0JCX0KLQl9Ci0KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHdhaXRGb3JUYXJnZXQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvL3dhaXQgZm9yIHRoZSB0YXJnZXQgdG8gZ2V0IHVwZGF0ZWQgZm9yIHRoZSBuZXcgYnJlYWtwb2ludCBzdGF0ZSAKLSAgICAgICAgICAgIHdhaXQoMTAwMCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNraXBMaW5lQnJlYWtwb2ludCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBza2lwTGluZUJyZWFrcG9pbnQoZmFsc2UpOwkJCSAgICAKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNraXBMaW5lQnJlYWtwb2ludFNlcFZNKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHNraXBMaW5lQnJlYWtwb2ludCh0cnVlKTsJCQkgICAgCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNraXBMaW5lQnJlYWtwb2ludChib29sZWFuIHNlcFZNKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gImJyZWFrcG9pbnRzIjsKLQkJSUZpbGUgZmlsZT0gZ2V0SUZpbGUoZmlsZU5hbWUgKyAiLnhtbCIpOwotCQlJTGluZUJyZWFrcG9pbnQgYnAgPSBjcmVhdGVMaW5lQnJlYWtwb2ludCg1LCBmaWxlKTsKLQkJY3JlYXRlTGluZUJyZWFrcG9pbnQoMTUsIGZpbGUpOwotCQlBbnRUaHJlYWQgdGhyZWFkID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChzZXBWTSkgewotCQkJCWZpbGVOYW1lKz0gIlNlcFZNIjsKLQkJCX0KLQkJICAgIHRocmVhZD0gbGF1bmNoVG9MaW5lQnJlYWtwb2ludChmaWxlTmFtZSwgYnApOwotCQkgICAgZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJICAgIHJlc3VtZUFuZEV4aXQodGhyZWFkKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRlcm1pbmF0ZUFuZFJlbW92ZSh0aHJlYWQpOwotCQkJcmVtb3ZlQWxsQnJlYWtwb2ludHMoKTsKLQkJCWdldEJyZWFrcG9pbnRNYW5hZ2VyKCkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QnJlYWtwb2ludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlicmVha3BvaW50cyhmYWxzZSwgImRlZmF1bHQiLCA1LCAxNSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCcmVha3BvaW50U2VwVk0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnJlYWtwb2ludHModHJ1ZSwgImRlZmF1bHQiLCA1LCAxNSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRhcmdldEJyZWFrcG9pbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnJlYWtwb2ludHMoZmFsc2UsICJlbnRyeTIiLCA0LCAyNCk7Ci0JfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RUYXNrT3V0T2ZUYXJnZXRCcmVha3BvaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJyZWFrcG9pbnRzKGZhbHNlLCAiZW50cnkyIiwgMzYsIDUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGFza091dE9mVGFyZ2V0QnJlYWtwb2ludFNlcFZtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJyZWFrcG9pbnRzKHRydWUsICJlbnRyeTIiLCAzNiwgNSk7Ci0gICAgfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXRCcmVha3BvaW50U2VwVk0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnJlYWtwb2ludHModHJ1ZSwgImVudHJ5MiIsIDQsIDI0KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJyZWFrcG9pbnRzKGJvb2xlYW4gc2VwVk0sIFN0cmluZyBkZWZhdWx0VGFyZ2V0TmFtZSwgaW50IGZpcnN0TGluZU51bWJlciwgaW50IHNlY29uZExpbmVOdW1iZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gImJyZWFrcG9pbnRzIjsKLQkJSUZpbGUgZmlsZT0gZ2V0SUZpbGUoZmlsZU5hbWUgKyAiLnhtbCIpOwotCQlJTGluZUJyZWFrcG9pbnQgYnAgPSBjcmVhdGVMaW5lQnJlYWtwb2ludChmaXJzdExpbmVOdW1iZXIsIGZpbGUpOwotCQlBbnRUaHJlYWQgdGhyZWFkID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChzZXBWTSkgewotCQkJCWZpbGVOYW1lKz0gIlNlcFZNIjsKLQkJCX0KLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZz0gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbihmaWxlTmFtZSk7Ci0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvcHk9IGNvbmZpZy5nZXRXb3JraW5nQ29weSgpOwotCQkJY29weS5zZXRBdHRyaWJ1dGUoSUFudExhdW5jaENvbnN0YW50cy5BVFRSX0FOVF9UQVJHRVRTLCBkZWZhdWx0VGFyZ2V0TmFtZSk7Ci0gICAgICAgICAgICBpZiAoIXNlcFZNKSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDMwMDApOyAvL1RPRE8gYnVnIDEyMTIwNzogd2FpdCBmb3IgcHJldmlvdXMgbGF1bmNoIHRvIGZ1bGx5IHRlcm1pbmF0ZQotICAgICAgICAgICAgfQotCQkgICAgdGhyZWFkPSBsYXVuY2hUb0xpbmVCcmVha3BvaW50KGNvcHksIGJwKTsKLQkJCWJwPSBjcmVhdGVMaW5lQnJlYWtwb2ludChzZWNvbmRMaW5lTnVtYmVyLCBmaWxlKTsKLQkJICAgIHJlc3VtZVRvTGluZUJyZWFrcG9pbnQodGhyZWFkLCBicCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgCi0gICAgICAgIH0gZmluYWxseSB7Ci0JCQl0ZXJtaW5hdGVBbmRSZW1vdmUodGhyZWFkKTsKLQkJCXJlbW92ZUFsbEJyZWFrcG9pbnRzKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBEZWJ1ZyBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZGVidWcvRGVidWdFbGVtZW50RXZlbnRXYWl0ZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IERlYnVnIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9kZWJ1Zy9EZWJ1Z0VsZW1lbnRFdmVudFdhaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjhhODdkLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IERlYnVnIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9kZWJ1Zy9EZWJ1Z0VsZW1lbnRFdmVudFdhaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuZGVidWc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbi5EZWJ1Z0V2ZW50V2FpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFdmVudDsKLQotLyoqCi0gKiBXYWl0cyBmb3IgYW4gZXZlbnQgb24gYSBzcGVjaWZpYyBlbGVtZW50Ci0gKi8KLQotcHVibGljIGNsYXNzIERlYnVnRWxlbWVudEV2ZW50V2FpdGVyIGV4dGVuZHMgRGVidWdFdmVudFdhaXRlciB7Ci0JCi0JcHJvdGVjdGVkIE9iamVjdCBmRWxlbWVudDsKLQkKLQlwdWJsaWMgRGVidWdFbGVtZW50RXZlbnRXYWl0ZXIoaW50IGtpbmQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCXN1cGVyKGtpbmQpOwotCQlmRWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChEZWJ1Z0V2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBzdXBlci5hY2NlcHQoZXZlbnQpICYmIGZFbGVtZW50ID09IGV2ZW50LmdldFNvdXJjZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRGVidWcgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2RlYnVnL0RlYnVnRWxlbWVudEtpbmRFdmVudERldGFpbFdhaXRlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRGVidWcgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2RlYnVnL0RlYnVnRWxlbWVudEtpbmRFdmVudERldGFpbFdhaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2Q5NmFlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IERlYnVnIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9kZWJ1Zy9EZWJ1Z0VsZW1lbnRLaW5kRXZlbnREZXRhaWxXYWl0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmRlYnVnOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uRGVidWdFbGVtZW50S2luZEV2ZW50V2FpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFdmVudDsKLQotLyoqCi0gKiBXYWl0IGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBmcm9tIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIERlYnVnRWxlbWVudEtpbmRFdmVudERldGFpbFdhaXRlciBleHRlbmRzIERlYnVnRWxlbWVudEtpbmRFdmVudFdhaXRlciB7Ci0KLQlwcm90ZWN0ZWQgaW50IGZEZXRhaWw7Ci0KLQlwdWJsaWMgRGVidWdFbGVtZW50S2luZEV2ZW50RGV0YWlsV2FpdGVyKGludCBldmVudEtpbmQsIENsYXNzIGVsZW1lbnRDbGFzcywgaW50IGRldGFpbCkgewotCQlzdXBlcihldmVudEtpbmQsIGVsZW1lbnRDbGFzcyk7Ci0JCWZEZXRhaWwgPSBkZXRhaWw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChEZWJ1Z0V2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBzdXBlci5hY2NlcHQoZXZlbnQpICYmIGZEZXRhaWwgPT0gZXZlbnQuZ2V0RGV0YWlsKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRGVidWcgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2RlYnVnL1N0YWNrVGVzdHMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IERlYnVnIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9kZWJ1Zy9TdGFja1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZjVhNWQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRGVidWcgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2RlYnVnL1N0YWNrVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuZGVidWc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmRlYnVnLm1vZGVsLkFudFRocmVhZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklMaW5lQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklTdGFja0ZyYW1lOwotCi1wdWJsaWMgY2xhc3MgU3RhY2tUZXN0cyBleHRlbmRzIEFic3RyYWN0QW50RGVidWdUZXN0IHsKLQotICAgIHB1YmxpYyBTdGFja1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFja0ZvckFudENhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYW50Q2FsbFN0YWNrKGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdFN0YWNrRm9yQW50Q2FsbFZNKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFudENhbGxTdGFjayh0cnVlKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGFudENhbGxTdGFjayhib29sZWFuIHNlcFZNKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBmaWxlTmFtZSA9ICI4NTc2OSI7Ci0gICAgICAgIElGaWxlIGZpbGU9IGdldElGaWxlKGZpbGVOYW1lICsgIi54bWwiKTsKLSAgICAgICAgSUxpbmVCcmVha3BvaW50IGJwID0gY3JlYXRlTGluZUJyZWFrcG9pbnQoMTgsIGZpbGUpOwotICAgICAgICBBbnRUaHJlYWQgdGhyZWFkID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzZXBWTSkgewotICAgICAgICAgICAgICAgIGZpbGVOYW1lKz0gIlNlcFZNIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocmVhZD0gbGF1bmNoVG9MaW5lQnJlYWtwb2ludChmaWxlTmFtZSwgYnApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIElTdGFja0ZyYW1lW10gZnJhbWVzPSB0aHJlYWQuZ2V0U3RhY2tGcmFtZXMoKTsKLSAgICAgICAgICAgCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZyYW1lcy5sZW5ndGggPT0gMyk7Ci0gICAgICAgICAgICBJU3RhY2tGcmFtZSBmcmFtZSA9IGZyYW1lc1swXTsKLSAgICAgICAgICAgIGZyYW1lLmdldE5hbWUoKS5lcXVhbHMoIiIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdGVybWluYXRlQW5kUmVtb3ZlKHRocmVhZCk7Ci0gICAgICAgICAgICByZW1vdmVBbGxCcmVha3BvaW50cygpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRGVidWcgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2RlYnVnL1N0ZXBwaW5nVGVzdHMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IERlYnVnIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9kZWJ1Zy9TdGVwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NmQxYTUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRGVidWcgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2RlYnVnL1N0ZXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmRlYnVnOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5kZWJ1Zy5tb2RlbC5BbnRTdGFja0ZyYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcuZGVidWcubW9kZWwuQW50VGhyZWFkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JTGluZUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3RhY2tGcmFtZTsKLQotcHVibGljIGNsYXNzIFN0ZXBwaW5nVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFudERlYnVnVGVzdCB7Ci0KLSAgICBwdWJsaWMgU3RlcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogYnVnIDg0NDAwCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFN0ZXBCYWNrRnJvbUFudENhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYW50Q2FsbFN0YWNrKGZhbHNlLCAxMiwgRGVidWdFdmVudC5TVEVQX09WRVIsICJkZWZhdWx0OiBlY2hvIiwgNyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGJ1ZyA4NDQwMAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGVwQmFja0Zyb21BbnRDYWxsU2VwVk0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYW50Q2FsbFN0YWNrKHRydWUsIDEyLCBEZWJ1Z0V2ZW50LlNURVBfT1ZFUiwgImRlZmF1bHQ6IGVjaG8iLCA3KTsKLSAgICB9Ci0JCi0JIC8qKgotICAgICAqIGJ1ZyA4ODIxOCwgODU3NjkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RlcEludG9BbnRDYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFudFRocmVhZCB0aHJlYWQ9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aHJlYWQ9IGFudENhbGxTdGFjayhmYWxzZSwgNSwgRGVidWdFdmVudC5TVEVQX0lOVE8sICJwcmUtY2FsbDogZWNobyIsIDE2LCBmYWxzZSk7Ci0gICAgICAgICAgICBJU3RhY2tGcmFtZVtdIGZyYW1lcz0gdGhyZWFkLmdldFN0YWNrRnJhbWVzKCk7Ci0gICAgICAgICAgICBhc3NlcnRGcmFtZSgiY2FsbCIsIDEwLCAoQW50U3RhY2tGcmFtZSlmcmFtZXNbMV0pOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdGVybWluYXRlQW5kUmVtb3ZlKHRocmVhZCk7Ci0gICAgICAgICAgICByZW1vdmVBbGxCcmVha3BvaW50cygpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGJ1ZyA4ODIxOCwgODU3NjkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RlcEludG9BbnRDYWxsU2VwVk0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQW50VGhyZWFkIHRocmVhZD0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRocmVhZD0gYW50Q2FsbFN0YWNrKHRydWUsIDUsIERlYnVnRXZlbnQuU1RFUF9JTlRPLCAicHJlLWNhbGw6IGVjaG8iLCAxNiwgZmFsc2UpOwotICAgICAgICAgICAgSVN0YWNrRnJhbWVbXSBmcmFtZXM9IHRocmVhZC5nZXRTdGFja0ZyYW1lcygpOwotICAgICAgICAgICAgYXNzZXJ0RnJhbWUoImNhbGwiLCAxMCwgKEFudFN0YWNrRnJhbWUpZnJhbWVzWzFdKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRlcm1pbmF0ZUFuZFJlbW92ZSh0aHJlYWQpOwotICAgICAgICAgICAgcmVtb3ZlQWxsQnJlYWtwb2ludHMoKTsKLSAgICAgICAgfQotICAgIH0KLQkKLQkgcHVibGljIHZvaWQgdGVzdFN0ZXBPdmVyQW50Q2FsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQkgYW50Q2FsbFN0YWNrKGZhbHNlLCA1LCBEZWJ1Z0V2ZW50LlNURVBfT1ZFUiwgImRlZmF1bHQ6IGVjaG8iLCA3KTsKLQkgfQotCSAKLQkgcHVibGljIHZvaWQgdGVzdFN0ZXBPdmVyQW50Q2FsbFNlcFZNKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCSBhbnRDYWxsU3RhY2sodHJ1ZSwgNSwgRGVidWdFdmVudC5TVEVQX09WRVIsICJkZWZhdWx0OiBlY2hvIiwgNyk7Ci0JIH0KLSAgICAgCi0gICAgIC8qKgotICAgICAgKiBidWcgOTYwMjIKLSAgICAgICovCi0gICAgIHB1YmxpYyB2b2lkIHRlc3RTdGVwT3ZlckFudENhbGxQYXN0T3RoZXJBbnRDYWxscygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgZGVidWdTdGFjayhmYWxzZSwgNywgRGVidWdFdmVudC5TVEVQX09WRVIsICJkZWZhdWx0OiBlY2hvIiwgOSwgIjk2MDIyIiwgdHJ1ZSk7Ci0gICAgIH0KLSAgICAgLyoqCi0gICAgICAqIGJ1ZyA5NjAyMgotICAgICAgKi8KLSAgICAgcHVibGljIHZvaWQgdGVzdFN0ZXBPdmVyQW50Q2FsbFBhc3RPdGhlckFudENhbGxzU2VwVm0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZGVidWdTdGFjayh0cnVlLCA3LCBEZWJ1Z0V2ZW50LlNURVBfT1ZFUiwgImRlZmF1bHQ6IGVjaG8iLCA5LCAiOTYwMjIiLCB0cnVlKTsKLSAgICAgfQotCSAKLQkgcHVibGljIHZvaWQgdGVzdFN0ZXBPdmVyQW50Q2FsbEhpdEJyZWFrcG9pbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJIFN0cmluZyBmaWxlTmFtZSA9ICJkZWJ1Z0FudENhbGwiOwotCQkgY3JlYXRlTGluZUJyZWFrcG9pbnQoMTIsIGZpbGVOYW1lICsgIi54bWwiKTsKLQkJIGFudENhbGxTdGFjayhmYWxzZSwgNSwgRGVidWdFdmVudC5CUkVBS1BPSU5ULCAiY2FsbDogc2xlZXAiLCAxMik7Ci0JIH0KLQkgCi0JIHB1YmxpYyB2b2lkIHRlc3RTdGVwT3ZlckFudENhbGxIaXRCcmVha3BvaW50U2VwVk0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJIFN0cmluZyBmaWxlTmFtZSA9ICJkZWJ1Z0FudENhbGwiOwotCQkgY3JlYXRlTGluZUJyZWFrcG9pbnQoMTIsIGZpbGVOYW1lICsgIi54bWwiKTsKLQkJIGFudENhbGxTdGFjayh0cnVlLCA1LCBEZWJ1Z0V2ZW50LkJSRUFLUE9JTlQsICJjYWxsOiBzbGVlcCIsIDEyKTsKLQkgfQotICAgIAotCXByaXZhdGUgQW50VGhyZWFkIGFudENhbGxTdGFjayhib29sZWFuIHNlcFZNLCBpbnQgbGluZU51bWJlciwgaW50IGtpbmQsIFN0cmluZyBmcmFtZU5hbWUsIGludCBmcmFtZUxpbmVOdW1iZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGFudENhbGxTdGFjayhzZXBWTSwgbGluZU51bWJlciwga2luZCwgZnJhbWVOYW1lLCBmcmFtZUxpbmVOdW1iZXIsIHRydWUpOwotCX0KLSAgICAKLQlwcml2YXRlIEFudFRocmVhZCBhbnRDYWxsU3RhY2soYm9vbGVhbiBzZXBWTSwgaW50IGxpbmVOdW1iZXIsIGludCBraW5kLCBTdHJpbmcgZnJhbWVOYW1lLCBpbnQgZnJhbWVMaW5lTnVtYmVyLCBib29sZWFuIHRlcm1pbmF0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSAiZGVidWdBbnRDYWxsIjsKLSAgICAgICAgcmV0dXJuIGRlYnVnU3RhY2soc2VwVk0sIGxpbmVOdW1iZXIsIGtpbmQsIGZyYW1lTmFtZSwgZnJhbWVMaW5lTnVtYmVyLCBmaWxlTmFtZSwgdGVybWluYXRlKTsKLSAgICB9Ci0KLQlwcml2YXRlIEFudFRocmVhZCBkZWJ1Z1N0YWNrKGJvb2xlYW4gc2VwVk0sIGludCBsaW5lTnVtYmVyLCBpbnQga2luZCwgU3RyaW5nIGZyYW1lTmFtZSwgaW50IGZyYW1lTGluZU51bWJlciwgU3RyaW5nIGZpbGVOYW1lLCBib29sZWFuIHRlcm1pbmF0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIERlYnVnRXhjZXB0aW9uIHsKLQkJSUxpbmVCcmVha3BvaW50IGJwID0gY3JlYXRlTGluZUJyZWFrcG9pbnQobGluZU51bWJlciwgZmlsZU5hbWUgKyAiLnhtbCIpOwotCQlBbnRUaHJlYWQgdGhyZWFkPSBudWxsOwotCQl0cnkgewotCQkJaWYgKHNlcFZNKSB7Ci0JCQkJZmlsZU5hbWUrPSJTZXBWTSI7Ci0JCQl9Ci0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWc9IGdldExhdW5jaENvbmZpZ3VyYXRpb24oZmlsZU5hbWUpOwotCQkJdGhyZWFkPSBsYXVuY2hUb0xpbmVCcmVha3BvaW50KGNvbmZpZywgYnApOyAKLQkJCWRlYnVnRnJhbWUoa2luZCwgZnJhbWVOYW1lLCBmcmFtZUxpbmVOdW1iZXIsIHRocmVhZCk7Ci0JCQlyZXR1cm4gdGhyZWFkOwotICAgICAgICB9IGZpbmFsbHkgewotCQkJaWYgKHRlcm1pbmF0ZSkgewotCQkJCXRlcm1pbmF0ZUFuZFJlbW92ZSh0aHJlYWQpOwotCQkJCXJlbW92ZUFsbEJyZWFrcG9pbnRzKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVidWdGcmFtZShpbnQga2luZCwgU3RyaW5nIGZyYW1lTmFtZSwgaW50IGZyYW1lTGluZU51bWJlciwgQW50VGhyZWFkIHRocmVhZCkgdGhyb3dzIERlYnVnRXhjZXB0aW9uIHsKLQkJQW50U3RhY2tGcmFtZSBmcmFtZSA9IChBbnRTdGFja0ZyYW1lKXRocmVhZC5nZXRUb3BTdGFja0ZyYW1lKCk7Ci0JCWFzc2VydE5vdE51bGwoZnJhbWUpOwotCQlzd2l0Y2ggKGtpbmQpIHsKLQkJCWNhc2UgRGVidWdFdmVudC5CUkVBS1BPSU5UOiAKLQkJCQlzdGVwT3ZlclRvSGl0QnJlYWtwb2ludChmcmFtZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERlYnVnRXZlbnQuU1RFUF9PVkVSOgotCQkJCXN0ZXBPdmVyKGZyYW1lKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRGVidWdFdmVudC5TVEVQX0lOVE86Ci0JCQkJc3RlcEludG8oZnJhbWUpOwotCQkJCWJyZWFrOwotCQl9Ci0JCWFzc2VydEZyYW1lKHRocmVhZCwgZnJhbWVOYW1lLCBmcmFtZUxpbmVOdW1iZXIpOwotCX0KLQkKLSAgICBwcml2YXRlIEFudFN0YWNrRnJhbWUgYXNzZXJ0RnJhbWUoQW50VGhyZWFkIHRocmVhZCwgU3RyaW5nIGZyYW1lTmFtZSwgaW50IGxpbmVOdW1iZXIpIHRocm93cyBEZWJ1Z0V4Y2VwdGlvbiB7Ci0gICAgICAgIEFudFN0YWNrRnJhbWUgZnJhbWUgPSAoQW50U3RhY2tGcmFtZSl0aHJlYWQuZ2V0VG9wU3RhY2tGcmFtZSgpOwotICAgICAgICByZXR1cm4gYXNzZXJ0RnJhbWUoZnJhbWVOYW1lLCBsaW5lTnVtYmVyLCBmcmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBbnRTdGFja0ZyYW1lIGFzc2VydEZyYW1lKFN0cmluZyBmcmFtZU5hbWUsIGludCBsaW5lTnVtYmVyLCBBbnRTdGFja0ZyYW1lIGZyYW1lKSB7Ci0gICAgICAgIFN0cmluZyBhY3R1YWxGcmFtZU5hbWU9IGZyYW1lLmdldE5hbWUoKTsKLSAgICAgICAgaW50IGFjdHVhbExpbmVOdW1iZXI9IGZyYW1lLmdldExpbmVOdW1iZXIoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTmFtZSBvZiBzdGFjayBmcmFtZSBpbmNvcnJlY3QuIEV4cGVjdGVkICIgKyBmcmFtZU5hbWUgKyAiIHdhczogIiArIGFjdHVhbEZyYW1lTmFtZSwgZnJhbWVOYW1lLmVxdWFscyhhY3R1YWxGcmFtZU5hbWUpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTGluZSBudW1iZXIgb2Ygc3RhY2sgZnJhbWUgaW5jb3JyZWN0LiBFeHBlY3RlZCAiICsgbGluZU51bWJlciArICIgd2FzOiAiICsgYWN0dWFsTGluZU51bWJlciwgbGluZU51bWJlciA9PSBhY3R1YWxMaW5lTnVtYmVyKTsKLSAgICAgICAgcmV0dXJuIGZyYW1lOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBidWcgODUzMDkKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RlcE91dE9mTWFjcm9kZWYoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgCVN0cmluZyBmaWxlTmFtZSA9ICJtYWNyb2RlZiI7Ci0JCWRlYnVnU3RhY2soZmFsc2UsIDggLCBEZWJ1Z0V2ZW50LlNURVBfT1ZFUiwgInR5cGU6IGVjbGlwc2VNYWNybyIsIDE2LCBmaWxlTmFtZSwgdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGJ1ZyA4NTMwOQotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGVwT3V0T2ZNYWNyb2RlZlNlcFZNKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgIAlTdHJpbmcgZmlsZU5hbWUgPSAibWFjcm9kZWYiOwotCQlkZWJ1Z1N0YWNrKHRydWUsIDggLCBEZWJ1Z0V2ZW50LlNURVBfT1ZFUiwgInR5cGU6IGVjbGlwc2VNYWNybyIsIDE2LCBmaWxlTmFtZSwgdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIGJ1ZyA5NDc2OQotICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGVwSW50b01hY3JvZGVmKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgIAl0ZXN0TWFjcm9EZWYoZmFsc2UpOwotICAgIH0KLSAgICAKLSAvKioKLSAgICAgKiBidWcgOTQ3NjkKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RlcEludG9NYWNyb2RlZlNlcFZNKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgIAl0ZXN0TWFjcm9EZWYodHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RNYWNyb0RlZihib29sZWFuIHNlcFZNKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgRGVidWdFeGNlcHRpb24gewotICAgIAlBbnRUaHJlYWQgdGhyZWFkPSBudWxsOwotICAgIAl0cnkgewotICAgIAkJU3RyaW5nIGZpbGVOYW1lID0gIm1hY3JvZGVmIjsKLSAgICAJCXRocmVhZD0gZGVidWdTdGFjayhzZXBWTSwgMTYgLCBEZWJ1Z0V2ZW50LlNURVBfSU5UTywgInR5cGU6IHNlcXVlbnRpYWwiLCAwLCBmaWxlTmFtZSwgZmFsc2UpOwotICAgIAkJZGVidWdGcmFtZShEZWJ1Z0V2ZW50LlNURVBfSU5UTywgInR5cGU6IGVjaG8iLCA4LCB0aHJlYWQpOwotICAgIAkJZGVidWdGcmFtZShEZWJ1Z0V2ZW50LlNURVBfT1ZFUiwgInR5cGU6IGVjbGlwc2VNYWNybyIsIDE3LCB0aHJlYWQpOwotICAgIAl9IGZpbmFsbHkgewotCQkJdGVybWluYXRlQW5kUmVtb3ZlKHRocmVhZCk7Ci0JCQlyZW1vdmVBbGxCcmVha3BvaW50cygpOwotCQl9Ci0JfQotICAgIAotLy8gICAgcHVibGljIHZvaWQgdGVzdFN0ZXBCYWNrRnJvbUFudCgpIHRocm93cyBFeGNlcHRpb24gewotLy8gICAgICAgIGFudENhbGxTdGFjayhmYWxzZSk7Ci0vLyAgICB9Ci0vLyAgICAKLS8vICAgIHB1YmxpYyB2b2lkIHRlc3RTdGVwQmFja0Zyb21BbnRTZXBWTSgpIHRocm93cyBFeGNlcHRpb24gewotLy8gICAgICAgIGFudENhbGxTdGFjayhmYWxzZSk7Ci0vLyAgICB9Ci0vLwotLy8gICAgCi0vLyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RlcEludG9BbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vICAgICAgICBhbnRDYWxsU3RhY2soZmFsc2UpOwotLy8gICAgfQotLy8gICAgCi0vLyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RlcEludG9BbnRTZXBWTSgpIHRocm93cyBFeGNlcHRpb24gewotLy8gICAgICAgIGFudENhbGxTdGFjayhmYWxzZSk7Ci0vLyAgICB9Ci0vLwotLy8gICAgcHVibGljIHZvaWQgdGVzdFN0ZXBPdmVyQW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLyAgICAgICAgYW50Q2FsbFN0YWNrKGZhbHNlKTsKLS8vICAgIH0KLS8vICAgIAotLy8gICAgcHVibGljIHZvaWQgdGVzdFN0ZXBPdmVyQW50U2VwVk0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vICAgICAgICBhbnRDYWxsU3RhY2soZmFsc2UpOwotLy8gICAgfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9kdGQvZHVtcGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2R0ZC9kdW1wZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZkNmQxNi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2R0ZC9kdW1wZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IE9iamVjdCBGYWN0b3J5IEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT2JqZWN0IEZhY3RvcnkgSW5jLiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5kdGQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklEZm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5QYXJzZUVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuUGFyc2VyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKGhlbmNlIHRoZQotICogdW5jYXBpdGFsaXplZCBjbGFzcyBuYW1lKS4KLSAqIEBhdXRob3IgQm9iIEZvc3RlcgotICovCi1wdWJsaWMgY2xhc3MgZHVtcGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgaW50IG1haW4oU3RyaW5nW10gYXJncykgewotCi0JCWlmIChhcmdzLmxlbmd0aCA8PSAwKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBqYXZhIERURE1lcmdlciBVUkwiKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCVN0cmluZyBkb2N1bWVudCA9IGFyZ3NbMF07Ci0KLQkJUGFyc2VyIHBhcnNlciA9IG5ldyBQYXJzZXIoKTsKLQkJCi0JCUlTY2hlbWEgc2NoZW1hOwotCQl0cnkgewotCQkJc2NoZW1hID0gcGFyc2VyLnBhcnNlKGRvY3VtZW50KTsKLQkJfSBjYXRjaCAoUGFyc2VFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiAxOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJEVEQgc3VjY2Vzc2Z1bGx5IHBhcnNlZCIpOwotCQlkdW1wU2NoZW1hKHNjaGVtYSk7Ci0JCXJldHVybiAwOwotCX0KLQkKLQkvKioKLQkgKiBXcml0ZSBzY2hlbWEgY29udGVudHMgdG8gc3RhbmRhcmQgb3V0cHV0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZHVtcFNjaGVtYShJU2NoZW1hIHNjaGVtYSkgewotCQlJRWxlbWVudFtdIGVsZW1lbnRzID0gc2NoZW1hLmdldEVsZW1lbnRzKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiIitlbGVtZW50cy5sZW5ndGgrIiBlbGVtZW50cyBkZWZpbmVkIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCUlFbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCUlNb2RlbCBtb2RlbCA9IGVsZW1lbnQuZ2V0Q29udGVudE1vZGVsKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVMRU1FTlQgIitlbGVtZW50LmdldE5hbWUoKQotCQkJCSsnIicrbW9kZWwuc3RyaW5nUmVwKCkrJyInKTsKLQkJCWR1bXBEZm0oZWxlbWVudC5nZXREZm0oKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEdW1wIGRmbSBhcyBhIHNlcmllcyBvZiBzdGF0ZXMuCi0JICogPHByZT4KLQkgKiBTMCAgYT0+UzEgYj0+UzIgCi0JICogUzEgIGM9PlMyCi0JICogUzIqIGQ9PlMyCi0JICogPC9wcmU+Ci0JICogV2hlcmUgKiBpbmRpY2F0ZXMgYWNjZXB0aW5nIHN0YXRlLgotCSAqIEBwYXJhbSBkZm0gdG8gZHVtcAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZHVtcERmbShJRGZtIGRmbSkgewotCQlIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWR1bXBEZm0oZGZtLCBtYXAsIDApOwotCQlMaW5rZWRMaXN0IGxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlJdGVyYXRvciBpdCA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCWxpc3QuYWRkKG5ldyBTdGF0ZSgoSURmbSllbnRyeS5nZXRLZXkoKSwgKEludGVnZXIpZW50cnkuZ2V0VmFsdWUoKSkpOwotCQl9Ci0JCVN0YXRlW10gc3RhdGVzID0gKFN0YXRlW10pIGxpc3QudG9BcnJheShuZXcgU3RhdGVbbGlzdC5zaXplKCldKTsKLQkJQXJyYXlzLnNvcnQoc3RhdGVzKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCXByaW50KHN0YXRlc1tpXSwgbWFwKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnQoU3RhdGUgc3RhdGUsIEhhc2hNYXAgbWFwKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnQoIiAgUyIrc3RhdGUubi5pbnRWYWx1ZSgpCi0JCQkrKHN0YXRlLmRmbS5pc0FjY2VwdGluZygpID8gIiogICIgOiAiICAiKSk7Ci0JCVN0cmluZ1tdIGFjY2VwdHMgPSBzdGF0ZS5kZm0uZ2V0QWNjZXB0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFjY2VwdHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBhY2NlcHQgPSBhY2NlcHRzW2ldOwotCQkJSURmbSBuZXh0ID0gc3RhdGUuZGZtLmFkdmFuY2UoYWNjZXB0KTsKLQkJCWludCBuID0gKChJbnRlZ2VyKW1hcC5nZXQobmV4dCkpLmludFZhbHVlKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCIgIithY2NlcHQrIj0+UyIrbik7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGludCBkdW1wRGZtKElEZm0gZGZtLCBIYXNoTWFwIG1hcCwgaW50IG51bSkgewotCQlpZiAoIW1hcC5jb250YWluc0tleShkZm0pKSB7Ci0JCQltYXAucHV0KGRmbSwgbmV3IEludGVnZXIobnVtKyspKTsKLQkJCVN0cmluZ1tdIGFjY2VwdHMgPSBkZm0uZ2V0QWNjZXB0cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY2NlcHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSURmbSBuZXh0ID0gZGZtLmFkdmFuY2UoYWNjZXB0c1tpXSk7Ci0JCQkJbnVtID0gZHVtcERmbShuZXh0LCBtYXAsIG51bSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RhdGUgaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKLQkJcHVibGljIElEZm0gZGZtOwotCQlwdWJsaWMgSW50ZWdlciBuOwotCQlwdWJsaWMgU3RhdGUoSURmbSBkZm0sIEludGVnZXIgbikgewotCQkJdGhpcy5kZm0gPSBkZm07Ci0JCQl0aGlzLm4gPSBuOwotCQl9Ci0JCS8qKgotCQkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlI2NvbXBhcmVUbyhqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKLQkJCVN0YXRlIG90aGVyID0gKFN0YXRlKSBvOwotCQkJcmV0dXJuIG4uaW50VmFsdWUoKSA8IG90aGVyLm4uaW50VmFsdWUoKQotCQkJCT8gLTEgCi0JCQkJOiAobi5pbnRWYWx1ZSgpID09IG90aGVyLm4uaW50VmFsdWUoKSAKLQkJCQkJPyAwIAotCQkJCQk6IDEpOwotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9UYXNrRGVzY3JpcHRpb25Qcm92aWRlclRlc3QuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL1Rhc2tEZXNjcmlwdGlvblByb3ZpZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGMwOTRlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL1Rhc2tEZXNjcmlwdGlvblByb3ZpZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBHRUJJVCBHZXNlbGxzY2hhZnQgZnVlciBFRFYtQmVyYXR1bmcKLSAqIHVuZCBJbmZvcm1hdGlrLVRlY2hub2xvZ2llbiBtYkgsIAotICogQmVybGluLCBEdWVzc2VsZG9yZiwgRnJhbmtmdXJ0IChHZXJtYW55KS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgR0VCSVQgR2VzZWxsc2NoYWZ0IGZ1ZXIgRURWLUJlcmF0dW5nIHVuZCBJbmZvcm1hdGlrLVRlY2hub2xvZ2llbiBtYkggLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuZWRpdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS50ZXN0cGx1Z2luLkFic3RyYWN0QW50VUlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuVGFza0Rlc2NyaXB0aW9uUHJvdmlkZXI7Ci0KLS8qKgotICogVGVzdHMgdGhlIHRhc2tzIGRlc2NyaXB0aW9uIHByb3ZpZGVyLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRpb25Qcm92aWRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFudFVJVGVzdCB7Ci0KLSAgICBwdWJsaWMgVGFza0Rlc2NyaXB0aW9uUHJvdmlkZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIC8qKiAKLSAgICAgKiBUZXN0cyBnZXR0aW5nIHRoZSBkZXNjcmlwdGlvbiBvZiBhIHRhc2suCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEdldHRpbmdUYXNrRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIFRhc2tEZXNjcmlwdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gVGFza0Rlc2NyaXB0aW9uUHJvdmlkZXIuZ2V0RGVmYXVsdCgpOwotICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBwcm92aWRlci5nZXREZXNjcmlwdGlvbkZvclRhc2soImFwcGx5Iik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGVzY3JpcHRpb24pOwotICAgICAgICBhc3NlcnRUcnVlKGRlc2NyaXB0aW9uLmxlbmd0aCgpID4gMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgZ2V0dGluZyB0aGUgZGVzY3JpcHRpb24gb2YgYW4gYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXR0aW5nQXR0cmlidXRlKCkgewotICAgICAgICBUYXNrRGVzY3JpcHRpb25Qcm92aWRlciBwcm92aWRlciA9IFRhc2tEZXNjcmlwdGlvblByb3ZpZGVyLmdldERlZmF1bHQoKTsKLSAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gcHJvdmlkZXIuZ2V0RGVzY3JpcHRpb25Gb3JUYXNrQXR0cmlidXRlKCJhcHBseSIsICJleGVjdXRhYmxlIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGVzY3JpcHRpb24pOwotICAgICAgICBhc3NlcnRUcnVlKGRlc2NyaXB0aW9uLmxlbmd0aCgpID4gMCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIGdldHRpbmcgdGhlIHJlcXVpcmVkIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0dGluZ1JlcXVpcmVkKCkgewotICAgICAgICBUYXNrRGVzY3JpcHRpb25Qcm92aWRlciBwcm92aWRlciA9IFRhc2tEZXNjcmlwdGlvblByb3ZpZGVyLmdldERlZmF1bHQoKTsKLSAgICAgICAgU3RyaW5nIHJlcXVpcmVkID0gcHJvdmlkZXIuZ2V0UmVxdWlyZWRBdHRyaWJ1dGVGb3JUYXNrQXR0cmlidXRlKCJhcHBseSIsICJleGVjdXRhYmxlIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmVxdWlyZWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInllcyIsIHJlcXVpcmVkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFRhc2tEZXNjcmlwdGlvblByb3ZpZGVyVGVzdC5jbGFzcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvZm9ybWF0dGVyL0Zvcm1hdHRpbmdQcmVmZXJlbmNlc1Rlc3QuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL2Zvcm1hdHRlci9Gb3JtYXR0aW5nUHJlZmVyZW5jZXNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NmE2OWIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvZm9ybWF0dGVyL0Zvcm1hdHRpbmdQcmVmZXJlbmNlc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBKb2huLU1hc29uIFAuIFNoYWNrZWxmb3JkIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLmZvcm1hdHRlci5Gb3JtYXR0aW5nUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQWJzdHJhY3RBbnRVSVRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBGb3JtYXR0aW5nUHJlZmVyZW5jZXNUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbnRVSVRlc3QgewotCi0gICAgcHVibGljIEZvcm1hdHRpbmdQcmVmZXJlbmNlc1Rlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldENhbm9uaWNhbEluZGVudCgpIHsKLSAgICAgCi0gICAgICAgIEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBwcmVmczsKLSAgICAgICAgCi0gICAgICAgIC8vIHRlc3Qgc3BhY2VzIAotICAgICAgICBwcmVmcyA9IG5ldyBGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKXsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0VGFiV2lkdGgoKSB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldHVybiAzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdXNlU3BhY2VzSW5zdGVhZE9mVGFicygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsgICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIiAgICIscHJlZnMuZ2V0Q2Fub25pY2FsSW5kZW50KCkpOwotICAgICAgICAKLSAgICAgICAgLy8gZW5zdXJlIHRoZSB2YWx1ZSBpcyBub3QgaGFyZCBjb2RlZAotICAgICAgICBwcmVmcyA9IG5ldyBGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKXsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0VGFiV2lkdGgoKSB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldHVybiA3OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdXNlU3BhY2VzSW5zdGVhZE9mVGFicygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsgICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIiAgICAgICAiLHByZWZzLmdldENhbm9uaWNhbEluZGVudCgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHVzZSB0YWIgY2hhcmFjdGVyCi0gICAgICAgIHByZWZzID0gbmV3IEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpewotICAgICAgICAgICAgcHVibGljIGludCBnZXRUYWJXaWR0aCgpIHsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIDc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB1c2VTcGFjZXNJbnN0ZWFkT2ZUYWJzKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsgICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIlx0IixwcmVmcy5nZXRDYW5vbmljYWxJbmRlbnQoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvZm9ybWF0dGVyL1htbERvY3VtZW50Rm9ybWF0dGVyVGVzdC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvZm9ybWF0dGVyL1htbERvY3VtZW50Rm9ybWF0dGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTAwN2FhLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL2Zvcm1hdHRlci9YbWxEb2N1bWVudEZvcm1hdHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBKb2huLU1hc29uIFAuIFNoYWNrZWxmb3JkIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLmZvcm1hdHRlci5Gb3JtYXR0aW5nUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5mb3JtYXR0ZXIuWG1sRG9jdW1lbnRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQWJzdHJhY3RBbnRVSVRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBYbWxEb2N1bWVudEZvcm1hdHRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFudFVJVGVzdCB7Ci0KLSAgICBwdWJsaWMgWG1sRG9jdW1lbnRGb3JtYXR0ZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYWwgVGVzdCAKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0R2VuZXJhbEZvcm1hdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnMgPSBuZXcgRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCl7Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGdldFRhYldpZHRoKCkgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHVzZVNwYWNlc0luc3RlYWRPZlRhYnMoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHNpbXBsZVRlc3QoImZvcm1hdFRlc3Rfc291cmNlMDEueG1sIiwiZm9ybWF0VGVzdF90YXJnZXQwMS54bWwiLHByZWZzKTsgICAgICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluc3VyZSB0aGF0IHRhYiB3aWR0aCBpcyBub3QgaGFyZCBjb2RlZAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RUYWJXaWR0aCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnMgPSBuZXcgRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCl7Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGdldFRhYldpZHRoKCkgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gNzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHVzZVNwYWNlc0luc3RlYWRPZlRhYnMoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHNpbXBsZVRlc3QoImZvcm1hdFRlc3Rfc291cmNlMDEueG1sIiwiZm9ybWF0VGVzdF90YXJnZXQwMi54bWwiLHByZWZzKTsgICAgICAgIAotICAgIH0KLQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3Qgd2l0aCB0YWIgY2hhcmFjdGVycyBpbnN0ZWFkIG9mIHNwYWNlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0VGFic0luc3RlYWRPZlNwYWNlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnMgPSBuZXcgRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCl7Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGdldFRhYldpZHRoKCkgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHVzZVNwYWNlc0luc3RlYWRPZlRhYnMoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBzaW1wbGVUZXN0KCJmb3JtYXRUZXN0X3NvdXJjZTAxLnhtbCIsImZvcm1hdFRlc3RfdGFyZ2V0MDMueG1sIixwcmVmcyk7ICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHNvdXJjZUZpbGVOYW1lIC0gZmlsZSB0byBmb3JtYXQKLSAgICAgKiBAcGFyYW0gdGFyZ2V0RmlsZU5hbWUgLSB0aGUgc291cmNlIGZpbGUgYWZ0ZXIgYSBwcm9wZXJseSBleGVjdXRlZCBmb3JtYXQKLSAgICAgKiBAcGFyYW0gcHJlZnMgLSBnaXZlbiB0aGUgaW5jbHVkZWQgcHJlZmVyZW5jZSBpbnN0cnVjdGlvbnMKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzaW1wbGVUZXN0KFN0cmluZyBzb3VyY2VGaWxlTmFtZSwgU3RyaW5nIHRhcmdldEZpbGVOYW1lLCBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnMpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAKLSAgICAgICAgWG1sRG9jdW1lbnRGb3JtYXR0ZXIgeG1sRm9ybWF0dGVyID0gbmV3IFhtbERvY3VtZW50Rm9ybWF0dGVyKCk7Ci0gICAgICAgIHhtbEZvcm1hdHRlci5zZXREZWZhdWx0TGluZURlbGltaXRlcihTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpOwotICAgICAgICBTdHJpbmcgcmVzdWx0ID0geG1sRm9ybWF0dGVyLmZvcm1hdChnZXRGaWxlQ29udGVudEFzU3RyaW5nKGdldEJ1aWxkRmlsZShzb3VyY2VGaWxlTmFtZSkpLHByZWZzKTsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkUmVzdWx0ID0gZ2V0RmlsZUNvbnRlbnRBc1N0cmluZyhnZXRCdWlsZEZpbGUodGFyZ2V0RmlsZU5hbWUpKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJlc3VsdCwgcmVzdWx0KTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvZm9ybWF0dGVyL1htbEZvcm1hdHRlclRlc3QuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL2Zvcm1hdHRlci9YbWxGb3JtYXR0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZDhmY2IuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvZm9ybWF0dGVyL1htbEZvcm1hdHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBKb2huLU1hc29uIFAuIFNoYWNrZWxmb3JkIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gYnVnIDg0MzQyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5mb3JtYXR0ZXIuRm9ybWF0dGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuZm9ybWF0dGVyLlhtbEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci0KLXB1YmxpYyBjbGFzcyBYbWxGb3JtYXR0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEZvcm1hdFVzaW5nUHJlZmVyZW5jZVN0b3JlKCkgewotICAgICAgICBQcmVmZXJlbmNlcyBwcmVmcyA9IEFudFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotICAgICAgICBwcmVmcy5zZXRWYWx1ZShBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUk1BVFRFUl9XUkFQX0xPTkcsIHRydWUpOwotICAgICAgICBwcmVmcy5zZXRWYWx1ZShBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUk1BVFRFUl9NQVhfTElORV9MRU5HVEgsIDQwKTsKLSAgICAgICAgcHJlZnMuc2V0VmFsdWUoQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5GT1JNQVRURVJfQUxJR04sIGZhbHNlKTsKLSAgICAgICAgcHJlZnMuc2V0VmFsdWUoQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5GT1JNQVRURVJfVEFCX0NIQVIsIHRydWUpOwotICAgICAgICBwcmVmcy5zZXRWYWx1ZShBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUk1BVFRFUl9UQUJfU0laRSwgNCk7Ci0gICAgICAgIFN0cmluZyBsaW5lU2VwPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0gICAgICAgIFN0cmluZyB4bWxEb2MgPSAiPHByb2plY3QgZGVmYXVsdD1cImdvXCI+PHRhcmdldCBuYW1lPVwiZ29cIiBkZXNjcmlwdGlvbj1cIkRlbW9uc3RyYXRlIHRoZSB3cmFwcGluZyBvZiBsb25nIHRhZ3MuXCI+PGVjaG8+aGk8L2VjaG8+PC90YXJnZXQ+PC9wcm9qZWN0PiI7Ci0gICAgICAgIFN0cmluZyBmb3JtYXR0ZWREb2MgPSBYbWxGb3JtYXR0ZXIuZm9ybWF0KHhtbERvYyk7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZCA9ICI8cHJvamVjdCBkZWZhdWx0PVwiZ29cIj4iICsgbGluZVNlcCArICJcdDx0YXJnZXQgbmFtZT1cImdvXCIiICsgbGluZVNlcCArICJcdCAgICAgICAgZGVzY3JpcHRpb249XCJEZW1vbnN0cmF0ZSB0aGUgd3JhcHBpbmcgb2YgbG9uZyB0YWdzLlwiPiIgKyBsaW5lU2VwICsgIlx0XHQ8ZWNobz5oaTwvZWNobz4iICsgbGluZVNlcCArICJcdDwvdGFyZ2V0PiIgKyBsaW5lU2VwICsgIjwvcHJvamVjdD4iOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGZvcm1hdHRlZERvYyk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEZvcm1hdFdpdGhQcmVmZXJlbmNlUGFyYW1ldGVyKCkgewotICAgICAgICBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnMgPSBuZXcgRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gd3JhcExvbmdUYWdzKCkgeyByZXR1cm4gdHJ1ZTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGdldE1heGltdW1MaW5lV2lkdGgoKSB7IHJldHVybiA0MDt9Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhbGlnbkVsZW1lbnRDbG9zZUNoYXIoKSB7IHJldHVybiBmYWxzZTt9Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB1c2VTcGFjZXNJbnN0ZWFkT2ZUYWJzKCkgeyByZXR1cm4gdHJ1ZTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGdldFRhYldpZHRoKCkgeyByZXR1cm4gNjt9Ci0gICAgICAgIH07Ci0gICAgICAgIFN0cmluZyBsaW5lU2VwPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0gICAgICAgIFN0cmluZyB4bWxEb2MgPSAiPHByb2plY3QgZGVmYXVsdD1cImdvXCI+PHRhcmdldCBuYW1lPVwiZ29cIiBkZXNjcmlwdGlvbj1cIkRlbW9uc3RyYXRlIHRoZSB3cmFwcGluZyBvZiBsb25nIHRhZ3MuXCI+PGVjaG8+aGk8L2VjaG8+PC90YXJnZXQ+PC9wcm9qZWN0PiI7Ci0gICAgICAgIFN0cmluZyBmb3JtYXR0ZWREb2MgPSBYbWxGb3JtYXR0ZXIuZm9ybWF0KHhtbERvYywgcHJlZnMpOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSAiPHByb2plY3QgZGVmYXVsdD1cImdvXCI+IiArIGxpbmVTZXAgKyAiICAgICAgPHRhcmdldCBuYW1lPVwiZ29cIiIgKyBsaW5lU2VwICsgIiAgICAgICAgICAgICAgZGVzY3JpcHRpb249XCJEZW1vbnN0cmF0ZSB0aGUgd3JhcHBpbmcgb2YgbG9uZyB0YWdzLlwiPiIgKyBsaW5lU2VwICsgIiAgICAgICAgICAgIDxlY2hvPmhpPC9lY2hvPiIgKyBsaW5lU2VwICsgIiAgICAgIDwvdGFyZ2V0PiIgKyBsaW5lU2VwICsgIjwvcHJvamVjdD4iOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGZvcm1hdHRlZERvYyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEJ1ZyA4NDM0MgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RGb3JtYXRNYWludGFpbmluZ0xpbmVTZXBhcmF0b3JzKCkgewotICAgICAgICBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnMgPSBuZXcgRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gd3JhcExvbmdUYWdzKCkgeyByZXR1cm4gdHJ1ZTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGdldE1heGltdW1MaW5lV2lkdGgoKSB7IHJldHVybiA0MDt9Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhbGlnbkVsZW1lbnRDbG9zZUNoYXIoKSB7IHJldHVybiBmYWxzZTt9Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB1c2VTcGFjZXNJbnN0ZWFkT2ZUYWJzKCkgeyByZXR1cm4gdHJ1ZTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGdldFRhYldpZHRoKCkgeyByZXR1cm4gNjt9Ci0gICAgICAgIH07Ci0gICAgICAgIFN0cmluZyBsaW5lU2VwPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0gICAgICAgIFN0cmluZyB4bWxEb2MgPSAiPHByb2plY3QgZGVmYXVsdD1cImdvXCI+PHRhcmdldCBuYW1lPVwiZ29cIiBkZXNjcmlwdGlvbj1cIkRlbW9uc3RyYXRlIHRoZSB3cmFwcGluZyBvZiBsb25nIHRhZ3MuXCI+PGVjaG8+aGk8L2VjaG8+PC90YXJnZXQ+IiArIGxpbmVTZXAgKyBsaW5lU2VwICsgIjwvcHJvamVjdD4iOwotICAgICAgICBTdHJpbmcgZm9ybWF0dGVkRG9jID0gWG1sRm9ybWF0dGVyLmZvcm1hdCh4bWxEb2MsIHByZWZzKTsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gIjxwcm9qZWN0IGRlZmF1bHQ9XCJnb1wiPiIgKyBsaW5lU2VwICsgIiAgICAgIDx0YXJnZXQgbmFtZT1cImdvXCIiICsgbGluZVNlcCArICIgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPVwiRGVtb25zdHJhdGUgdGhlIHdyYXBwaW5nIG9mIGxvbmcgdGFncy5cIj4iICsgbGluZVNlcCArICIgICAgICAgICAgICA8ZWNobz5oaTwvZWNobz4iICsgbGluZVNlcCArICIgICAgICA8L3RhcmdldD4iICsgbGluZVNlcCArIGxpbmVTZXAgKyAiPC9wcm9qZWN0PiI7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgZm9ybWF0dGVkRG9jKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL2Zvcm1hdHRlci9YbWxUYWdGb3JtYXR0ZXJUZXN0LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9mb3JtYXR0ZXIvWG1sVGFnRm9ybWF0dGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQzZTI5Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL2Zvcm1hdHRlci9YbWxUYWdGb3JtYXR0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBKb2huLU1hc29uIFAuIFNoYWNrZWxmb3JkIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEpvaG4tTWFzb24gUC4gU2hhY2tlbGZvcmQgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBCdWcgODQzNDIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuZWRpdG9yLmZvcm1hdHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5mb3JtYXR0ZXIuWG1sVGFnRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuZm9ybWF0dGVyLkZvcm1hdHRpbmdQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbi5BYnN0cmFjdEFudFVJVGVzdDsKLQotcHVibGljIGNsYXNzIFhtbFRhZ0Zvcm1hdHRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFudFVJVGVzdCB7Ci0KLSAgICAvLyBUT0RPIFRoaXMgdGVzdCBpcyB0b28gbG93IGxldmVsIGFuZCB0b28gdGlnaHRseSBjb3VwbGVkIHRvIGludGVybmFscy4KLQotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gVGVzdCBGaXh0dXJlIC0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAvLyBJbiBjYXNlIGFueW9uZSB3b25kZXJzIHdoeSBtYW55IHBlb3BsZSByZWNvbW1lbmQgYWdhaW5zdCB0ZXN0aW5nCi0gICAgLy8gcHJpdmF0ZXMsIEkgcHJvZHVjZSB0aGlzIGV4YW1wbGUuLi4KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbm5lckNsYXNzRmFjdG9yeSBleHRlbmRzIFhtbFRhZ0Zvcm1hdHRlciB7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJzZUV4Y2VwdGlvbiBleHRlbmRzIFhtbFRhZ0Zvcm1hdHRlci5QYXJzZUV4Y2VwdGlvbiB7Ci0KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQlwdWJsaWMgUGFyc2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGFnIGV4dGVuZHMgWG1sVGFnRm9ybWF0dGVyLlRhZyB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRhZ0Zvcm1hdHRlciBleHRlbmRzIFhtbFRhZ0Zvcm1hdHRlci5UYWdGb3JtYXR0ZXIgewotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBsaW5lUmVxdWlyZXNXcmFwKFN0cmluZyBsaW5lLCBpbnQgbGluZVdpZHRoLAotICAgICAgICAgICAgICAgICAgICBpbnQgdGFiV2lkdGgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIubGluZVJlcXVpcmVzV3JhcChsaW5lLCBsaW5lV2lkdGgsIHRhYldpZHRoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGludCB0YWJFeHBhbmRlZExpbmVXaWR0aChTdHJpbmcgbGluZSwgaW50IHRhYldpZHRoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnRhYkV4cGFuZGVkTGluZVdpZHRoKGxpbmUsIHRhYldpZHRoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyB3cmFwVGFnKFRhZyB0YWcsIEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBwcmVmcywKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGluZGVudCwgU3RyaW5nIGxpbmVEZWxpbWl0ZXIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIud3JhcFRhZyh0YWcsIHByZWZzLCBpbmRlbnQsIGxpbmVEZWxpbWl0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUYWdQYXJzZXIgZXh0ZW5kcyBYbWxUYWdGb3JtYXR0ZXIuVGFnUGFyc2VyIHsKLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZShTdHJpbmcgdGFnVGV4dCkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFhtbFRhZ0Zvcm1hdHRlci5QYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVsZW1lbnROYW1lKHRhZ1RleHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgTGlzdCBnZXRBdHRpYnV0ZXMoU3RyaW5nIGVsZW1lbnRUZXh0KQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgWG1sVGFnRm9ybWF0dGVyLlBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0QXR0aWJ1dGVzKGVsZW1lbnRUZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgVGFnIGNyZWF0ZVRhZygpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVGFnKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIFRhZ0Zvcm1hdHRlciBjcmVhdGVUYWdGb3JtYXR0ZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFRhZ0Zvcm1hdHRlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBUYWdQYXJzZXIgY3JlYXRlVGFnUGFyc2VyKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWdQYXJzZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUF0dHJpYnV0ZVBhaXIoT2JqZWN0IGF0dHJpYnV0ZVBhaXIsIFN0cmluZyBhdHRyaWJ1dGUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICAgICAgWG1sVGFnRm9ybWF0dGVyLkF0dHJpYnV0ZVBhaXIgcGFpciA9IChYbWxUYWdGb3JtYXR0ZXIuQXR0cmlidXRlUGFpcikgYXR0cmlidXRlUGFpcjsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhhdHRyaWJ1dGUsIHBhaXIuZ2V0QXR0cmlidXRlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCBwYWlyLmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFhtbFRhZ0Zvcm1hdHRlclRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoZmluYWwgYm9vbGVhbiB3cmFwTG9uZ1RhZ3MsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGFsaWduQ2xvc2VDaGFyLCBmaW5hbCBpbnQgbWF4TGluZVdpZHRoKSB7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFsaWduRWxlbWVudENsb3NlQ2hhcigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWxpZ25DbG9zZUNoYXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHdyYXBMb25nVGFncygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gd3JhcExvbmdUYWdzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgaW50IGdldE1heGltdW1MaW5lV2lkdGgoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1heExpbmVXaWR0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2ltcGxlVGVzdChTdHJpbmcgc291cmNlLCBTdHJpbmcgdGFyZ2V0LAotICAgICAgICAgICAgRm9ybWF0dGluZ1ByZWZlcmVuY2VzIHByZWZzLCBTdHJpbmcgaW5kZW50LCBTdHJpbmcgbGluZURlbGltaXRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCQotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gWG1sVGFnRm9ybWF0dGVyLmZvcm1hdChzb3VyY2UsIHByZWZzLCBpbmRlbnQsIGxpbmVEZWxpbWl0ZXIpOwotICAgICAgICBhc3NlcnRFcXVhbHModGFyZ2V0LCByZXN1bHQpOwotICAgIH0KLQotICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gVGVzdCBNZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0gKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZXJHZXRFbGVtZW50TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIElubmVyQ2xhc3NGYWN0b3J5LlRhZ1BhcnNlciB0YWdQYXJzZXIgPSBJbm5lckNsYXNzRmFjdG9yeQotICAgICAgICAgICAgICAgIC5jcmVhdGVUYWdQYXJzZXIoKTsKLQotICAgICAgICBTdHJpbmcgZWxlbWVudEZpeHR1cmUxID0gIjxteUVsZW1lbnQgYXR0cmlidXRlMT1cInZhbHVlMVwiIGF0dHJpYnV0ZTI9XCJ2YWx1ZTJcIiAvPiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJteUVsZW1lbnQiLCB0YWdQYXJzZXIuZ2V0RWxlbWVudE5hbWUoZWxlbWVudEZpeHR1cmUxKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBTdHJpbmcgZWxlbWVudEZpeHR1cmUyID0gIjxteUVsZW1lbnRcdFxuYXR0cmlidXRlMT1cInZhbHVlMVwiIGF0dHJpYnV0ZTI9XCJ2YWx1ZTJcIiAvPiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJteUVsZW1lbnQiLCB0YWdQYXJzZXIuZ2V0RWxlbWVudE5hbWUoZWxlbWVudEZpeHR1cmUyKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIngiLCB0YWdQYXJzZXIuZ2V0RWxlbWVudE5hbWUoIjx4Lz4iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBhc3NlcnRFcXVhbHMoIngiLCB0YWdQYXJzZXIuZ2V0RWxlbWVudE5hbWUoIjx4PiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIGFzc2VydEVxdWFscygieDp5IiwgdGFnUGFyc2VyLmdldEVsZW1lbnROYW1lKCI8eDp5Lz4iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBhc3NlcnRFcXVhbHMoIng6eSIsIHRhZ1BhcnNlci5nZXRFbGVtZW50TmFtZSgiPHg6eSBhYmMvPiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAgICAgRXhjZXB0aW9uIGUxID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRhZ1BhcnNlci5nZXRFbGVtZW50TmFtZSgiPD4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZTEgPSBlOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZTEpOwotICAgICAgICBhc3NlcnRUcnVlKGUxLmdldENsYXNzKCkuaXNBc3NpZ25hYmxlRnJvbSgKLSAgICAgICAgICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS5QYXJzZUV4Y2VwdGlvbi5jbGFzcykpOwotCi0gICAgICAgIEV4Y2VwdGlvbiBlMiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0YWdQYXJzZXIuZ2V0RWxlbWVudE5hbWUoIjw+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUyID0gZTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnROb3ROdWxsKGUyKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlMi5nZXRDbGFzcygpLmlzQXNzaWduYWJsZUZyb20oCi0gICAgICAgICAgICAgICAgSW5uZXJDbGFzc0ZhY3RvcnkuUGFyc2VFeGNlcHRpb24uY2xhc3MpKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZXJHZXRBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElubmVyQ2xhc3NGYWN0b3J5LlRhZ1BhcnNlciB0YWdQYXJzZXIgPSBJbm5lckNsYXNzRmFjdG9yeQotICAgICAgICAgICAgICAgIC5jcmVhdGVUYWdQYXJzZXIoKTsKLQotICAgICAgICBMaXN0IGF0dHJpYnV0ZVBhaXJzOwotCi0gICAgICAgIC8vIHRlc3Qgbm9ybWFsIHNpdHVhdGlvbgotICAgICAgICBhdHRyaWJ1dGVQYWlycyA9IHRhZ1BhcnNlcgotICAgICAgICAgICAgICAgIC5nZXRBdHRpYnV0ZXMoIjxteUVsZW1lbnQgYXR0cmlidXRlMT1cInZhbHVlMVwiIGF0dHJpYnV0ZTI9XCJ2YWx1ZTJcIiAvPiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZVBhaXJzLnNpemUoKSk7Ci0gICAgICAgIElubmVyQ2xhc3NGYWN0b3J5LnZhbGlkYXRlQXR0cmlidXRlUGFpcihhdHRyaWJ1dGVQYWlycy5nZXQoMCksCi0gICAgICAgICAgICAgICAgImF0dHJpYnV0ZTEiLCAidmFsdWUxIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS52YWxpZGF0ZUF0dHJpYnV0ZVBhaXIoYXR0cmlidXRlUGFpcnMuZ2V0KDEpLAotICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUyIiwgInZhbHVlMiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICAgICAKLSAgICAgICAgLy8gdGVzdCB3aXRoIGV4dHJhIHdoaXRlc3BhY2UgYW5kIGZ1bm55IHF1b3RlcwotICAgICAgICBhdHRyaWJ1dGVQYWlycyA9IHRhZ1BhcnNlcgotICAgICAgICAgICAgICAgIC5nZXRBdHRpYnV0ZXMoIjxteUVsZW1lbnQgXG5hdHRyaWJ1dGUxID0gICd2YWx1ZTFcIidcbmF0dHJpYnV0ZTJcdD1cInZhbHVlMidcIiAvPiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZVBhaXJzLnNpemUoKSk7Ci0gICAgICAgIElubmVyQ2xhc3NGYWN0b3J5LnZhbGlkYXRlQXR0cmlidXRlUGFpcihhdHRyaWJ1dGVQYWlycy5nZXQoMCksCi0gICAgICAgICAgICAgICAgImF0dHJpYnV0ZTEiLCAidmFsdWUxXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIElubmVyQ2xhc3NGYWN0b3J5LnZhbGlkYXRlQXR0cmlidXRlUGFpcihhdHRyaWJ1dGVQYWlycy5nZXQoMSksCi0gICAgICAgICAgICAgICAgImF0dHJpYnV0ZTIiLCAidmFsdWUyJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotLy8gVE9ETyBhdHRyaWJ1dGVzIHdoaWNoIGNvbnRhaW4gd2hpdGVzcGFjZSBzaG91bGQgdGhyb3cgYSBwYXJzZSBlcnJvcgotLy8gICAgICAgCi0vLyAgICAgICAgLy8gdGVzdCBwYXJzZSBlcnJvcnMgLSB3aGl0ZXNwYWNlIGluIGF0dHJpYnV0ZSBuYW1lCi0vLyAgICAgICAgRXhjZXB0aW9uIGUxID0gbnVsbDsKLS8vICAgICAgICB0cnkgewotLy8gICAgICAgICAgICBhdHRyaWJ1dGVQYWlycyA9IHRhZ1BhcnNlcgotLy8gICAgICAgICAgICAgICAgICAgIC5nZXRBdHRpYnV0ZXMoIjxteUVsZW1lbnQgYXQgdHJpYnV0ZTEgPSBcInZhbHVlMVwiIGF0dHJpYnV0ZTI9XCJ2YWx1ZTJcIiAvPiIpOwotLy8gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLyAgICAgICAgICAgIGUxID0gZTsKLS8vICAgICAgICB9Ci0vLyAgICAgICAgYXNzZXJ0Tm90TnVsbChlMSk7Ci0vLyAgICAgICAgYXNzZXJ0VHJ1ZShlMS5nZXRDbGFzcygpLmlzQXNzaWduYWJsZUZyb20oCi0vLyAgICAgICAgICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS5QYXJzZUV4Y2VwdGlvbi5jbGFzcykpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vIHRlc3QgcGFyc2UgZXJyb3JzIC0gZXF1YWxzIGluIHRoZSB3cm9uZyBwbGFjZQotICAgICAgICBFeGNlcHRpb24gZTIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXR0cmlidXRlUGFpcnMgPSB0YWdQYXJzZXIKLSAgICAgICAgICAgICAgICAgICAgLmdldEF0dGlidXRlcygiPG15RWxlbWVudCBhdHRyaWJ1dGUxPVwidmFsdWUxXCIgPSBhdHRyaWJ1dGUyPVwidmFsdWUyXCIgLz4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZTIgPSBlOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZTIpOwotICAgICAgICBhc3NlcnRUcnVlKGUyLmdldENsYXNzKCkuaXNBc3NpZ25hYmxlRnJvbSgKLSAgICAgICAgICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS5QYXJzZUV4Y2VwdGlvbi5jbGFzcykpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIC8vIHRlc3QgcGFyc2UgZXJyb3JzIC0gcXVvdGVzIGluIHRoZSB3cm9uZyBwbGFjZQotICAgICAgICBFeGNlcHRpb24gZTMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXR0cmlidXRlUGFpcnMgPSB0YWdQYXJzZXIKLSAgICAgICAgICAgICAgICAgICAgLmdldEF0dGlidXRlcygiPG15RWxlbWVudCBhdHRyaWJ1dGUxPVwiXCJ2YWx1ZTFcIiAgYXR0cmlidXRlMj1cInZhbHVlMlwiIC8+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUzID0gZTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnROb3ROdWxsKGUzKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlMy5nZXRDbGFzcygpLmlzQXNzaWduYWJsZUZyb20oSW5uZXJDbGFzc0ZhY3RvcnkuUGFyc2VFeGNlcHRpb24uY2xhc3MpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0MDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJU3RyaW5nIGxpbmVTZXA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLSAgICAgICAgU3RyaW5nIGluZGVudCA9ICJcdCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nIHNvdXJjZSA9ICI8dGFyZ2V0IG5hbWU9XCJteVRhcmdldE5hbWVcIiBkZXBlbmRzPVwiYSxiLGMsZCxlLGYsZ1wiIGRlc2NyaXB0aW9uPVwiVGhpcyBpcyBhIHZlcnkgbG9uZyBlbGVtZW50IHdoaWNoIG91Z2h0IHRvIGJlIHdyYXBwZWQuXCI+IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgdGFyZ2V0ID0gIjx0YXJnZXQgbmFtZT1cIm15VGFyZ2V0TmFtZVwiIiArIGxpbmVTZXAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICsgaW5kZW50Ci0gICAgICAgICAgICAgICAgKyAiICAgICAgICBkZXBlbmRzPVwiYSxiLGMsZCxlLGYsZ1wiIiArIGxpbmVTZXAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICsgaW5kZW50Ci0gICAgICAgICAgICAgICAgKyAiICAgICAgICBkZXNjcmlwdGlvbj1cIlRoaXMgaXMgYSB2ZXJ5IGxvbmcgZWxlbWVudCB3aGljaCBvdWdodCB0byBiZSB3cmFwcGVkLlwiPiI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBzaW1wbGVUZXN0KHNvdXJjZSwgdGFyZ2V0LCBnZXRQcmVmZXJlbmNlcyh0cnVlLCBmYWxzZSwgNjApLCBpbmRlbnQsIGxpbmVTZXApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtYXQwMigpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlTdHJpbmcgbGluZVNlcD0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotICAgICAgICBTdHJpbmcgaW5kZW50ID0gIlx0IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgc291cmNlID0gIjx0YXJnZXQgbmFtZT1cIm15VGFyZ2V0TmFtZVwiIGRlcGVuZHM9XCJhLGIsYyxkLGUsZixnXCIgZGVzY3JpcHRpb249XCJUaGlzIGlzIGEgdmVyeSBsb25nIGVsZW1lbnQgd2hpY2ggb3VnaHQgdG8gYmUgd3JhcHBlZC5cIj4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyB0YXJnZXQgPSAiPHRhcmdldCBuYW1lPVwibXlUYXJnZXROYW1lXCIiICsgbGluZVNlcCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgKyBpbmRlbnQKLSAgICAgICAgICAgICAgICArICIgICAgICAgIGRlcGVuZHM9XCJhLGIsYyxkLGUsZixnXCIiICsgbGluZVNlcCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgKyBpbmRlbnQKLSAgICAgICAgICAgICAgICArICIgICAgICAgIGRlc2NyaXB0aW9uPVwiVGhpcyBpcyBhIHZlcnkgbG9uZyBlbGVtZW50IHdoaWNoIG91Z2h0IHRvIGJlIHdyYXBwZWQuXCIiICsgbGluZVNlcCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgKyBpbmRlbnQgKyAiPiI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBzaW1wbGVUZXN0KHNvdXJjZSwgdGFyZ2V0LCBnZXRQcmVmZXJlbmNlcyh0cnVlLCB0cnVlLCA2MCksIGluZGVudCwgbGluZVNlcCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RCdWc3MzQxMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlTdHJpbmcgbGluZVNlcD0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotICAgICAgICBTdHJpbmcgaW5kZW50ID0gIlx0IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgc291cmNlID0gIjx0YXJnZXQgbmFtZT0nbXlUYXJnZXROYW1lJyBkZXBlbmRzPVwiYSxiLGMsZCxlLGYsZ1wiIGRlc2NyaXB0aW9uPVwnVGhpcyBpcyBhIHZlcnkgbG9uZyBlbGVtZW50IHdoaWNoIG91Z2h0IHRvIGJlIFwid3JhcHBlZFwiLic+IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgdGFyZ2V0ID0gIjx0YXJnZXQgbmFtZT0nbXlUYXJnZXROYW1lJyIgKyBsaW5lU2VwIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICArIGluZGVudAotICAgICAgICAgICAgICAgICsgIiAgICAgICAgZGVwZW5kcz1cImEsYixjLGQsZSxmLGdcIiIgKyBsaW5lU2VwIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICArIGluZGVudAotICAgICAgICAgICAgICAgICsgIiAgICAgICAgZGVzY3JpcHRpb249J1RoaXMgaXMgYSB2ZXJ5IGxvbmcgZWxlbWVudCB3aGljaCBvdWdodCB0byBiZSBcIndyYXBwZWRcIi4nIiArIGxpbmVTZXAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICsgaW5kZW50ICsgIj4iOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgc2ltcGxlVGVzdChzb3VyY2UsIHRhcmdldCwgZ2V0UHJlZmVyZW5jZXModHJ1ZSwgdHJ1ZSwgNjApLCBpbmRlbnQsIGxpbmVTZXApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RMaW5lUmVxdWlyZXNXcmFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgSW5uZXJDbGFzc0ZhY3RvcnkuVGFnRm9ybWF0dGVyIHRhZ0Zvcm1hdHRlciA9IElubmVyQ2xhc3NGYWN0b3J5LmNyZWF0ZVRhZ0Zvcm1hdHRlcigpOwotCi0gICAgICAgIGJvb2xlYW4gc2hvdWxkV3JhcCA9IHRhZ0Zvcm1hdHRlci5saW5lUmVxdWlyZXNXcmFwKAotICAgICAgICAgICAgICAgICAgICAgICAgIlx0XHQgIDxteUVsZW1lbnQgYXR0cmlidXRlMT1cInZhbHVlMVwiIGF0dHJpYnV0ZTI9XCJ2YWx1ZTJcIiAvPiIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIDcwLCA4KTsKLSAgICAgICAgYm9vbGVhbiBzaG91bGROb3RXcmFwID0gdGFnRm9ybWF0dGVyLmxpbmVSZXF1aXJlc1dyYXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHRcdCA8bXlFbGVtZW50IGF0dHJpYnV0ZTE9XCJ2YWx1ZTFcIiBhdHRyaWJ1dGUyPVwidmFsdWUyXCIgLz4iLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICA3MCwgOCk7Ci0gICAgICAgIGFzc2VydFRydWUoc2hvdWxkV3JhcCk7Ci0gICAgICAgIGFzc2VydFRydWUoIXNob3VsZE5vdFdyYXApOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRhYkV4cGFuZGVkTGluZVdpZHRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgSW5uZXJDbGFzc0ZhY3RvcnkuVGFnRm9ybWF0dGVyIHRhZ0Zvcm1hdHRlciA9IElubmVyQ2xhc3NGYWN0b3J5LmNyZWF0ZVRhZ0Zvcm1hdHRlcigpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygyMCwgdGFnRm9ybWF0dGVyLnRhYkV4cGFuZGVkTGluZVdpZHRoKCJcdCAgMTIzNDU2Nzg5MCIsIDgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIHRhZ0Zvcm1hdHRlci50YWJFeHBhbmRlZExpbmVXaWR0aCgiMTIzNDU2Nzg5MCIsIDgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoMTksIHRhZ0Zvcm1hdHRlci50YWJFeHBhbmRlZExpbmVXaWR0aCgiXHQxXHQyCTM0NTY3ODkwIiwgMykpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRhYlRvU3RyaW5nQW5kTWluaW11bUxlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS5UYWcgdGFnID0gSW5uZXJDbGFzc0ZhY3RvcnkuY3JlYXRlVGFnKCk7Ci0KLSAgICAgICAgdGFnLnNldEVsZW1lbnROYW1lKCJteUVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB0YWcuc2V0Q2xvc2VkKGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8bXlFbGVtZW50PiIsIHRhZy50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHModGFnLnRvU3RyaW5nKCkubGVuZ3RoKCksIHRhZy5taW5pbXVtTGVuZ3RoKCkpOwotCi0gICAgICAgIHRhZy5zZXRDbG9zZWQodHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiPG15RWxlbWVudCAvPiIsIHRhZy50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHModGFnLnRvU3RyaW5nKCkubGVuZ3RoKCksIHRhZy5taW5pbXVtTGVuZ3RoKCkpOwotCi0gICAgICAgIHRhZy5hZGRBdHRyaWJ1dGUoImF0dHJpYnV0ZTEiLCAidmFsdWUxIiwgJyInKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIHRhZy5hZGRBdHRyaWJ1dGUoImF0dHJpYnV0ZTIiLCAidmFsdWUyIiwgJyInKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiPG15RWxlbWVudCBhdHRyaWJ1dGUxPVwidmFsdWUxXCIgYXR0cmlidXRlMj1cInZhbHVlMlwiIC8+IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHRhZy50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRhZy50b1N0cmluZygpLmxlbmd0aCgpLCB0YWcubWluaW11bUxlbmd0aCgpKTsKLQotICAgICAgICB0YWcuc2V0Q2xvc2VkKGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8bXlFbGVtZW50IGF0dHJpYnV0ZTE9XCJ2YWx1ZTFcIiBhdHRyaWJ1dGUyPVwidmFsdWUyXCI+IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHRhZy50b1N0cmluZygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRhZy50b1N0cmluZygpLmxlbmd0aCgpLCB0YWcubWluaW11bUxlbmd0aCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JhcFRhZygpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIElubmVyQ2xhc3NGYWN0b3J5LlRhZyB0YWcgPSBJbm5lckNsYXNzRmFjdG9yeS5jcmVhdGVUYWcoKTsKLQotICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS5UYWdGb3JtYXR0ZXIgdGFnRm9ybWF0dGVyID0gSW5uZXJDbGFzc0ZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlVGFnRm9ybWF0dGVyKCk7Ci0KLSAgICAgICAgRm9ybWF0dGluZ1ByZWZlcmVuY2VzIGRvbnRBbGlnbkNsb3NlQ2hhciA9IG5ldyBGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFsaWduRWxlbWVudENsb3NlQ2hhcigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBkb0FsaWduQ2xvc2VDaGFyID0gbmV3IEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpIHsKLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWxpZ25FbGVtZW50Q2xvc2VDaGFyKCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIHRhZy5zZXRFbGVtZW50TmFtZSgibXlFbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdGFnLmFkZEF0dHJpYnV0ZSgiYXR0cmlidXRlMSIsICJ2YWx1ZTEiLCAnIicpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgdGFnLmFkZEF0dHJpYnV0ZSgiYXR0cmlidXRlMiIsICJ2YWx1ZTIiLCAnIicpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICAgICB0YWcuc2V0Q2xvc2VkKHRydWUpOwotCi0gICAgICAgIFN0cmluZyBsaW5lU2VwPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiPG15RWxlbWVudCBhdHRyaWJ1dGUxPVwidmFsdWUxXCIiICsgbGluZVNlcCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgKyAiXHRcdCAgICAgICAgICAgICBhdHRyaWJ1dGUyPVwidmFsdWUyXCIgLz4iLCB0YWdGb3JtYXR0ZXIgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIC53cmFwVGFnKHRhZywgZG9udEFsaWduQ2xvc2VDaGFyLCAiXHRcdCAgIiwgbGluZVNlcCkpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8bXlFbGVtZW50IGF0dHJpYnV0ZTE9XCJ2YWx1ZTFcIiIgKyBsaW5lU2VwIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICArICJcdFx0ICAgICAgICAgICAgIGF0dHJpYnV0ZTI9XCJ2YWx1ZTJcIiIgKyBsaW5lU2VwICsgIlx0XHQgIC8+IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHRhZ0Zvcm1hdHRlci53cmFwVGFnKHRhZywgZG9BbGlnbkNsb3NlQ2hhciwgIlx0XHQgICIsIGxpbmVTZXApKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHRhZy5zZXRDbG9zZWQoZmFsc2UpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiPG15RWxlbWVudCBhdHRyaWJ1dGUxPVwidmFsdWUxXCIiICsgbGluZVNlcCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgKyAiXHRcdCAgICAgICAgICAgICBhdHRyaWJ1dGUyPVwidmFsdWUyXCI+IiwgdGFnRm9ybWF0dGVyIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAud3JhcFRhZyh0YWcsIGRvbnRBbGlnbkNsb3NlQ2hhciwgIlx0XHQgICIsIGxpbmVTZXApKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGFzc2VydEVxdWFscygiPG15RWxlbWVudCBhdHRyaWJ1dGUxPVwidmFsdWUxXCIiICsgbGluZVNlcCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgKyAiXHRcdCAgICAgICAgICAgICBhdHRyaWJ1dGUyPVwidmFsdWUyXCIiICsgbGluZVNlcCArICJcdFx0ICA+IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHRhZ0Zvcm1hdHRlci53cmFwVGFnKHRhZywgZG9BbGlnbkNsb3NlQ2hhciwgIlx0XHQgICIsIGxpbmVTZXApKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEJ1ZzYzNTU4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQkvLyBPcmRpbmFyaWx5IHRoZSBkb3VibGUgc3BhY2UgYWZ0ZXIgdGhlIGVsZW1lbnQgbmFtZSB3b3VsZCBiZSByZXBhaXJlZAotCQkvLyBidXQgaWYgdGhlIGZvcm1hdHRlciBpcyB3b3JraW5nIGNvcnJlY3RseSB0aGVzZSBleGFtcGxlcyB3aWxsIGJlCi0JCS8vIGNvbnNpZGVyZWQgbWFsZm9ybWVkIGFuZCB3aWxsIGJlIHBhc3NlZCB0aHJvdWdoIHVudG91Y2hlZC4KLSAgICAJIFN0cmluZyBsaW5lU2VwPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0JCVN0cmluZyBzb3VyY2UxID0gIjxlY2hvICBmaWxlPVwiZm9vXCI+IiArIGxpbmVTZXAgKyAiJmx0O2h0bWw+Jmx0O2JvZHk+Jmx0O3ByZT4iIC8vJE5PTi1OTFMtMSQKLQkJCQkrICIke2NvbXBpbGVsb2d9Jmx0Oy9wcmU+Jmx0Oy9ib2R5PiZsdDsvaHRtbD4iOyAvLyROT04tTkxTLTEkCi0JCUZvcm1hdHRpbmdQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFByZWZlcmVuY2VzKHRydWUsIGZhbHNlLCA2MCk7IC8vJE5PTi1OTFMtMSQKLQkJc2ltcGxlVGVzdChzb3VyY2UxLCBzb3VyY2UxLCBwcmVmcywgIlx0IiwgbGluZVNlcCk7Ci0JCi0JCVN0cmluZyBzb3VyY2UyID0gIjxlY2hvICBmaWxlPVwiZm9vXCIvYmFyL2Jhej48L2VjaG8+IjsgLy8kTk9OLU5MUy0xJAkJCi0JCXNpbXBsZVRlc3Qoc291cmNlMiwgc291cmNlMiwgcHJlZnMsICJcdCIsIGxpbmVTZXApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL3BlcmZvcm1hbmNlL0VkaXRvclRlc3RIZWxwZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL3BlcmZvcm1hbmNlL0VkaXRvclRlc3RIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE5NmNkNy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9wZXJmb3JtYW5jZS9FZGl0b3JUZXN0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3IucGVyZm9ybWFuY2U7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0b3JUZXN0SGVscGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgSUVkaXRvclBhcnQgb3BlbkluRWRpdG9yKElGaWxlIGZpbGUsIGJvb2xlYW4gcnVuRXZlbnRMb29wKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlJRWRpdG9yUGFydCBwYXJ0PSBJREUub3BlbkVkaXRvcihnZXRBY3RpdmVQYWdlKCksIGZpbGUpOwotCQlpZiAocnVuRXZlbnRMb29wKQotCQkJcnVuRXZlbnRRdWV1ZShwYXJ0KTsKLQkJcmV0dXJuIHBhcnQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRWRpdG9yUGFydCBvcGVuSW5FZGl0b3IoSUZpbGUgZmlsZSwgU3RyaW5nIGVkaXRvcklkLCBib29sZWFuIHJ1bkV2ZW50TG9vcCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJSUVkaXRvclBhcnQgcGFydD0gSURFLm9wZW5FZGl0b3IoZ2V0QWN0aXZlUGFnZSgpLCBmaWxlLCBlZGl0b3JJZCk7Ci0JCWlmIChydW5FdmVudExvb3ApCi0JCQlydW5FdmVudFF1ZXVlKHBhcnQpOwotCQlyZXR1cm4gcGFydDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElEb2N1bWVudCBnZXREb2N1bWVudChJVGV4dEVkaXRvciBlZGl0b3IpIHsKLQkJSURvY3VtZW50UHJvdmlkZXIgcHJvdmlkZXI9IGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dD0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCXJldHVybiBwcm92aWRlci5nZXREb2N1bWVudChpbnB1dCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJldmVydEVkaXRvcihJVGV4dEVkaXRvciBlZGl0b3IsIGJvb2xlYW4gcnVuRXZlbnRRdWV1ZSkgewotCQllZGl0b3IuZG9SZXZlcnRUb1NhdmVkKCk7Ci0JCWlmIChydW5FdmVudFF1ZXVlKQotCQkJcnVuRXZlbnRRdWV1ZShlZGl0b3IpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VBbGxFZGl0b3JzKCkgewotCQlJV29ya2JlbmNoUGFnZSBwYWdlPSBnZXRBY3RpdmVQYWdlKCk7Ci0JCWlmIChwYWdlICE9IG51bGwpCi0JCQlwYWdlLmNsb3NlQWxsRWRpdG9ycyhmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5FdmVudFF1ZXVlKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdz0gZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkKLQkJCXJ1bkV2ZW50UXVldWUod2luZG93LmdldFNoZWxsKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuRXZlbnRRdWV1ZShJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCXJ1bkV2ZW50UXVldWUocGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5FdmVudFF1ZXVlKFNoZWxsIHNoZWxsKSB7Ci0JCXdoaWxlIChzaGVsbC5nZXREaXNwbGF5KCkucmVhZEFuZERpc3BhdGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuRXZlbnRRdWV1ZShsb25nIG1pblRpbWUpIHsKLQkJbG9uZyBuZXh0Q2hlY2s9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgbWluVGltZTsKLQkJd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDwgbmV4dENoZWNrKSB7Ci0JCQlydW5FdmVudFF1ZXVlKCk7Ci0JCQlzbGVlcCgxKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElXb3JrYmVuY2hXaW5kb3cgZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkgewotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElXb3JrYmVuY2hQYWdlIGdldEFjdGl2ZVBhZ2UoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93PSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJcmV0dXJuIHdpbmRvdyAhPSBudWxsID8gd2luZG93LmdldEFjdGl2ZVBhZ2UoKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldEFjdGl2ZURpc3BsYXkoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93PSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJcmV0dXJuIHdpbmRvdyAhPSBudWxsID8gd2luZG93LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FsbURvd24obG9uZyBtaW5UaW1lLCBsb25nIG1heFRpbWUsIGxvbmcgaW50ZXJ2YWxUaW1lKSB7Ci0JCWxvbmcgc3RhcnRUaW1lPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIG1pblRpbWU7Ci0JCXJ1bkV2ZW50UXVldWUoKTsKLQkJd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIDwgc3RhcnRUaW1lKQotCQkJcnVuRXZlbnRRdWV1ZShpbnRlcnZhbFRpbWUpOwotCQkKLQkJbG9uZyBlbmRUaW1lPSBtYXhUaW1lID4gMCA/IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgbWF4VGltZSA6IExvbmcuTUFYX1ZBTFVFOwotCQlib29sZWFuIGNhbG09IGlzQ2FsbSgpOwotCQl3aGlsZSAoIWNhbG0gJiYgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPCBlbmRUaW1lKSB7Ci0JCQlydW5FdmVudFF1ZXVlKGludGVydmFsVGltZSk7Ci0JCQljYWxtPSBpc0NhbG0oKTsKLQkJfQotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLQkJcmV0dXJuIGNhbG07Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNsZWVwKGludCBpbnRlcnZhbFRpbWUpIHsKLQkJdHJ5IHsKLQkJCVRocmVhZC5zbGVlcChpbnRlcnZhbFRpbWUpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2FsbSgpIHsKLQkJSUpvYk1hbmFnZXIgam9iTWFuYWdlcj0gSm9iLmdldEpvYk1hbmFnZXIoKTsKLQkJSm9iW10gam9icz0gam9iTWFuYWdlci5maW5kKG51bGwpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgam9icy5sZW5ndGg7IGkrKykgewotCQkJSm9iIGpvYj0gam9ic1tpXTsKLQkJCWludCBzdGF0ZT0gam9iLmdldFN0YXRlKCk7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbihqb2IuZ2V0TmFtZSgpICsgIjogIiArIGdldFN0YXRlTmFtZShzdGF0ZSkpOwotCQkJaWYgKHN0YXRlID09IEpvYi5SVU5OSU5HIHx8IHN0YXRlID09IEpvYi5XQUlUSU5HKSB7Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGJyaW5nVG9Ub3AoKSB7Ci0JCWdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkuZm9yY2VBY3RpdmUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9wZXJmb3JtYW5jZS9Ob25Jbml0aWFsVHlwaW5nVGVzdC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvcGVyZm9ybWFuY2UvTm9uSW5pdGlhbFR5cGluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM5Yjk0Ny4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9wZXJmb3JtYW5jZS9Ob25Jbml0aWFsVHlwaW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3IucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbi5BYnN0cmFjdEFudFVJVGVzdDsKLQotLyoqCi0gKiBNZWFzdXJlcyB0aGUgdGltZSB0byB0eXBlIGluIG9uZSBzaW5nbGUgdGFyZ2V0IGludG8gYSBsYXJnZSBidWlsZGZpbGUKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIE5vbkluaXRpYWxUeXBpbmdUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbnRVSVRlc3QgewotCQotCXB1YmxpYyBOb25Jbml0aWFsVHlwaW5nVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLS8vCXByaXZhdGUgSVRleHRFZGl0b3IgZkVkaXRvcjsKLS8vCQotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIFRBUkdFVD0gKCI8dGFyZ2V0IG5hbWU9XCJuZXdUYXJnZXRcIiA+XHIiICsKLS8vCQkJIjxlY2hvPlwiTmV3IFRhcmdldFwiPC9lY2hvPlxyIiArCi0vLwkJCSI8L3RhcmdldD5cciIpLnRvQ2hhckFycmF5KCk7Ci0vLwotLy8JcHJpdmF0ZSBQZXJmb3JtYW5jZU1ldGVyIGZNZXRlcjsKLS8vCi0vLwlwcml2YXRlIEtleWJvYXJkUHJvYmUgZktleWJvYXJkUHJvYmU7Ci0vLwotLy8JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLS8vCQlFZGl0b3JUZXN0SGVscGVyLnJ1bkV2ZW50UXVldWUoKTsKLS8vCQlJRmlsZSBmaWxlPSBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJidWlsZGZpbGVzIikuZ2V0Rm9sZGVyKCJwZXJmb3JtYW5jZSIpLmdldEZpbGUoImJ1aWxkLnhtbCIpOwkKLS8vCQlmRWRpdG9yPSAoSVRleHRFZGl0b3IpIEVkaXRvclRlc3RIZWxwZXIub3BlbkluRWRpdG9yKGZpbGUsIHRydWUpOwotLy8JCS8vIGRpcnR5IGVkaXRvciB0byBhdm9pZCBpbml0aWFsIGRpcnR5aW5nIC8gdmFsaWRhdGUgZWRpdCBjb3N0cwotLy8JCWRpcnR5RWRpdG9yKCk7Ci0vLwkJUGVyZm9ybWFuY2UgcGVyZm9ybWFuY2U9IFBlcmZvcm1hbmNlLmdldERlZmF1bHQoKTsKLS8vCQlmTWV0ZXI9IHBlcmZvcm1hbmNlLmNyZWF0ZVBlcmZvcm1hbmNlTWV0ZXIocGVyZm9ybWFuY2UuZ2V0RGVmYXVsdFNjZW5hcmlvSWQodGhpcykpOwotLy8JCWZLZXlib2FyZFByb2JlPSBuZXcgS2V5Ym9hcmRQcm9iZSgpOwotLy8KLS8vCQlpbnQgb2Zmc2V0PSBnZXRJbnNlcnRQb3NpdGlvbigpOwotLy8JCWZFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5zZXRTZWxlY3Rpb24obmV3IFRleHRTZWxlY3Rpb24ob2Zmc2V0LCAwKSk7Ci0vLwkJRWRpdG9yVGVzdEhlbHBlci5ydW5FdmVudFF1ZXVlKCk7Ci0vLwkJc2xlZXAoMTAwMCk7Ci0vLwl9Ci0vLwkKLS8vCXByaXZhdGUgdm9pZCBkaXJ0eUVkaXRvcigpIHsKLS8vCQlmRWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuc2V0U2VsZWN0aW9uKG5ldyBUZXh0U2VsZWN0aW9uKDAsIDApKTsKLS8vCQlFZGl0b3JUZXN0SGVscGVyLnJ1bkV2ZW50UXVldWUoKTsKLS8vCQlzbGVlcCgxMDAwKTsKLS8vCQkKLS8vCQlEaXNwbGF5IGRpc3BsYXk9IEVkaXRvclRlc3RIZWxwZXIuZ2V0QWN0aXZlRGlzcGxheSgpOwotLy8JCWZLZXlib2FyZFByb2JlLnByZXNzQ2hhcigneycsIGRpc3BsYXkpOwotLy8JCVNXVEV2ZW50SGVscGVyLnByZXNzS2V5Q29kZShkaXNwbGF5LCBTV1QuQlMpOwotLy8JCXNsZWVwKDEwMDApOwotLy8JfQotLy8KLS8vCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJc2xlZXAoMTAwMCk7Ci0vLwkJRWRpdG9yVGVzdEhlbHBlci5yZXZlcnRFZGl0b3IoZkVkaXRvciwgdHJ1ZSk7Ci0vLwkJRWRpdG9yVGVzdEhlbHBlci5jbG9zZUFsbEVkaXRvcnMoKTsKLS8vCQkKLS8vCQlmTWV0ZXIuY29tbWl0KCk7Ci0vLwl9Ci0vLwotLy8JcHVibGljIHZvaWQgdGVzdFR5cGVBTWV0aG9kKCkgewotLy8JCURpc3BsYXkgZGlzcGxheT0gRWRpdG9yVGVzdEhlbHBlci5nZXRBY3RpdmVEaXNwbGF5KCk7Ci0vLwkJCi0vLwkJZk1ldGVyLnN0YXJ0KCk7Ci0vLwkJZm9yIChpbnQgaT0gMDsgaSA8IFRBUkdFVC5sZW5ndGg7IGkrKykgewotLy8JCQlmS2V5Ym9hcmRQcm9iZS5wcmVzc0NoYXIoVEFSR0VUW2ldLCBkaXNwbGF5KTsKLS8vCQl9Ci0vLwkJZk1ldGVyLnN0b3AoKTsKLS8vCX0KLS8vCi0vLwlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHNsZWVwKGludCB0aW1lKSB7Ci0vLwkJdHJ5IHsKLS8vCQkJd2FpdCh0aW1lKTsKLS8vCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0vLwkJfQotLy8JfQotLy8JCi0vLwlwcml2YXRlIGludCBnZXRJbnNlcnRQb3NpdGlvbigpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0vLwkJSURvY3VtZW50IGRvY3VtZW50PSBFZGl0b3JUZXN0SGVscGVyLmdldERvY3VtZW50KGZFZGl0b3IpOwotLy8JCWludCBsaW5lcz0gZG9jdW1lbnQuZ2V0TnVtYmVyT2ZMaW5lcygpOwotLy8JCWludCBvZmZzZXQ9IGRvY3VtZW50LmdldExpbmVPZmZzZXQobGluZXMgLSAyKTsKLS8vCQlyZXR1cm4gb2Zmc2V0OwotLy8JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3Ivc3VwcG9ydC9UZXN0TG9jYXRpb25Qcm92aWRlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3Ivc3VwcG9ydC9UZXN0TG9jYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjdjNjA4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL3N1cHBvcnQvVGVzdExvY2F0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuZWRpdG9yLnN1cHBvcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuTG9jYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RMb2NhdGlvblByb3ZpZGVyIGV4dGVuZHMgTG9jYXRpb25Qcm92aWRlciB7Ci0KLQlwcml2YXRlIEZpbGUgYnVpbGRGaWxlOwotCQotCXB1YmxpYyBUZXN0TG9jYXRpb25Qcm92aWRlcihGaWxlIGJ1aWxkRmlsZSkgewotCQlzdXBlcihudWxsKTsKLQkJdGhpcy5idWlsZEZpbGU9IGJ1aWxkRmlsZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLklMb2NhdGlvblByb3ZpZGVyI2dldExvY2F0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgUGF0aChidWlsZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL3N1cHBvcnQvVGVzdFByb2JsZW1SZXF1ZXN0b3IuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL3N1cHBvcnQvVGVzdFByb2JsZW1SZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI2NzhkYS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9zdXBwb3J0L1Rlc3RQcm9ibGVtUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5zdXBwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLklQcm9ibGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5JUHJvYmxlbVJlcXVlc3RvcjsKLQotcHVibGljIGNsYXNzIFRlc3RQcm9ibGVtUmVxdWVzdG9yIGltcGxlbWVudHMgSVByb2JsZW1SZXF1ZXN0b3IgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLklQcm9ibGVtUmVxdWVzdG9yI2FjY2VwdFByb2JsZW0ob3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLklQcm9ibGVtKQotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2VwdFByb2JsZW0oSVByb2JsZW0gcHJvYmxlbSkgewotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLklQcm9ibGVtUmVxdWVzdG9yI2JlZ2luUmVwb3J0aW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBiZWdpblJlcG9ydGluZygpIHsKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3Iub3V0bGluZS5JUHJvYmxlbVJlcXVlc3RvciNlbmRSZXBvcnRpbmcoKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFJlcG9ydGluZygpIHsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL3N1cHBvcnQvVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9zdXBwb3J0L1Rlc3RUZXh0Q29tcGxldGlvblByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjYxMWFkLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL3N1cHBvcnQvVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3Iuc3VwcG9ydDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuQW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnRFeHRlbnNpb24yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvciBleHRlbmRzIEFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVEVTVF9QUk9QT1NBTF9NT0RFX05PTkUgPSBBbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yLlBST1BPU0FMX01PREVfTk9ORTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBURVNUX1BST1BPU0FMX01PREVfQlVJTERGSUxFID0gQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci5QUk9QT1NBTF9NT0RFX0JVSUxERklMRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBURVNUX1BST1BPU0FMX01PREVfVEFTS19QUk9QT1NBTCA9IEFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IuUFJPUE9TQUxfTU9ERV9UQVNLX1BST1BPU0FMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRFU1RfUFJPUE9TQUxfTU9ERV9QUk9QRVJUWV9QUk9QT1NBTCA9IEFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IuUFJPUE9TQUxfTU9ERV9QUk9QRVJUWV9QUk9QT1NBTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBURVNUX1BST1BPU0FMX01PREVfQVRUUklCVVRFX1BST1BPU0FMID0gQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci5QUk9QT1NBTF9NT0RFX0FUVFJJQlVURV9QUk9QT1NBTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBURVNUX1BST1BPU0FMX01PREVfVEFTS19QUk9QT1NBTF9DTE9TSU5HID0gQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci5QUk9QT1NBTF9NT0RFX1RBU0tfUFJPUE9TQUxfQ0xPU0lORzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBURVNUX1BST1BPU0FMX01PREVfQVRUUklCVVRFX1ZBTFVFX1BST1BPU0FMID0gQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci5QUk9QT1NBTF9NT0RFX0FUVFJJQlVURV9WQUxVRV9QUk9QT1NBTDsKLQkKLQlwcml2YXRlIEZpbGUgZkVkaXRlZEZpbGU7Ci0JcHJpdmF0ZSBJU291cmNlVmlld2VyIGZWaWV3ZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGZOZWVkc1RvRGlzcG9zZT0gdHJ1ZTsKLSAgICAKLSAgICAKLQotCXB1YmxpYyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoQW50TW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotICAgICAgICBmQ29udGVudEFzc2lzdGFudD0gbmV3IElDb250ZW50QXNzaXN0YW50RXh0ZW5zaW9uMigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEVtcHR5TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1c01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXNMaW5lVmlzaWJsZShib29sZWFuIHNob3cpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRTaG93RW1wdHlMaXN0KGJvb2xlYW4gc2hvd0VtcHR5KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0UmVwZWF0ZWRJbnZvY2F0aW9uTW9kZShib29sZWFuIGN5Y2xpbmcpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVDb21wbGV0aW9uTGlzdGVuZXIoSUNvbXBsZXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZENvbXBsZXRpb25MaXN0ZW5lcihJQ29tcGxldGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIAotICAgICAgICAgICAgfSAgICAgICAgCi0gICAgICAgIH07Ci0JfQotCQotCXB1YmxpYyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoQW50RWRpdG9yIGVkaXRvcikgewotCQl0aGlzKGVkaXRvci5nZXRBbnRNb2RlbCgpKTsKLQkJZlZpZXdlcj0gZWRpdG9yLmdldFZpZXdlcigpOwotICAgICAgICBmTmVlZHNUb0Rpc3Bvc2U9IGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQl0aGlzKChBbnRNb2RlbCludWxsKTsKLQl9Ci0JCi0gICAgcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRBdHRyaWJ1dGVQcm9wb3NhbHMoU3RyaW5nIHRhc2tOYW1lLCBTdHJpbmcgcHJlZml4KSB7Ci0gICAgCWlmIChjdXJzb3JQb3NpdGlvbiA9PSAtMSkgewotICAgIAkJY3Vyc29yUG9zaXRpb249IHRhc2tOYW1lLmxlbmd0aCgpOwotICAgIAl9Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGVQcm9wb3NhbHModGFza05hbWUsIHByZWZpeCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVsZW1lbnQgZmluZENoaWxkRWxlbWVudE5hbWVkT2YoRWxlbWVudCBhbkVsZW1lbnQsIFN0cmluZyBjaGlsZEVsZW1lbnROYW1lKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5maW5kQ2hpbGRFbGVtZW50TmFtZWRPZihhbkVsZW1lbnQsIGNoaWxkRWxlbWVudE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0VGFza1Byb3Bvc2FscyhTdHJpbmcgdGV4dCwgU3RyaW5nIHBhcmVudE5hbWUsIFN0cmluZyBwcmVmaXgpIHsKLSAgICAJY3Vyc29yUG9zaXRpb249IE1hdGgubWF4KDAsIHRleHQubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFRhc2tQcm9wb3NhbHMobmV3IERvY3VtZW50KHRleHQpLCBwYXJlbnROYW1lLCBwcmVmaXgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFRhc2tQcm9wb3NhbHMoSURvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgcGFyZW50TmFtZSwgU3RyaW5nIGFQcmVmaXgpIHsKLSAgICAJY3Vyc29yUG9zaXRpb249IE1hdGgubWF4KDAsIGRvY3VtZW50LmdldExlbmd0aCgpIC0gMSk7Ci0gICAgCXJldHVybiBzdXBlci5nZXRUYXNrUHJvcG9zYWxzKGRvY3VtZW50LCBwYXJlbnROYW1lLCBhUHJlZml4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGRldGVybWluZVByb3Bvc2FsTW9kZShTdHJpbmcgdGV4dCwgaW50IHRoZUN1cnNvclBvc2l0aW9uLCBTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUobmV3IERvY3VtZW50KHRleHQpLCB0aGVDdXJzb3JQb3NpdGlvbiwgcHJlZml4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudE5hbWUoU3RyaW5nIHRleHQsIGludCBhTGluZU51bWJlciwgaW50IGFDb2x1bW5OdW1iZXIpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFBhcmVudE5hbWUobmV3IERvY3VtZW50KHRleHQpLCBhTGluZU51bWJlciwgYUNvbHVtbk51bWJlcik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50TmFtZShJRG9jdW1lbnQgZG9jLCBpbnQgYUxpbmVOdW1iZXIsIGludCBhQ29sdW1uTnVtYmVyKSB7Ci0gICAgCXJldHVybiBzdXBlci5nZXRQYXJlbnROYW1lKGRvYywgYUxpbmVOdW1iZXIsIGFDb2x1bW5OdW1iZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4RnJvbURvY3VtZW50KFN0cmluZyBhRG9jdW1lbnRUZXh0LCBpbnQgYW5PZmZzZXQpIHsKLSAgICAgICAgU3RyaW5nIHByZWZpeD0gc3VwZXIuZ2V0UHJlZml4RnJvbURvY3VtZW50KGFEb2N1bWVudFRleHQsIGFuT2Zmc2V0KTsKLSAgICAgICAgY3VycmVudFByZWZpeD0gbnVsbDsKLSAgICAgICAgcmV0dXJuIHByZWZpeDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFByb3BlcnR5UHJvcG9zYWxzKElEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIHByZWZpeCwgaW50IGN1cnNvclBvcykgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlQcm9wb3NhbHMoZG9jdW1lbnQsIHByZWZpeCwgY3Vyc29yUG9zKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlZGl0ZWQgRmlsZSB0aGF0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3NvciBzZXRzIG9yIGEgdGVtcG9yYXJ5IAotICAgICAqIGZpbGUsIHdoaWNoIG9ubHkgc2VydmVzIGFzIGEgZHVtbXkuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLkFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IjZ2V0RWRpdGVkRmlsZSgpCi0gICAgICovCi0JcHVibGljIEZpbGUgZ2V0RWRpdGVkRmlsZSgpIHsKLQkJaWYgKGZFZGl0ZWRGaWxlICE9IG51bGwpewotCQkJcmV0dXJuIGZFZGl0ZWRGaWxlOwotCQl9Ci0JCUZpbGUgdGVtcEZpbGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGVtcEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0ZXN0IiwgbnVsbCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFzc2VydC5mYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0ZW1wRmlsZS5kZWxldGVPbkV4aXQoKTsKLSAgICAgICAgcmV0dXJuIHRlbXBGaWxlOwotICAgIH0KLQotCXB1YmxpYyB2b2lkIHNldExpbmVOdW1iZXIoaW50IGFMaW5lTnVtYmVyKSB7Ci0gICAgCWxpbmVOdW1iZXIgPSBhTGluZU51bWJlcjsKLSAgICB9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW5OdW1iZXIoaW50IGFDb2x1bW5OdW1iZXIpIHsKLSAgICAJY29sdW1uTnVtYmVyID0gYUNvbHVtbk51bWJlcjsKLSAgICB9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q3Vyc29yUG9zaXRpb24oaW50IGN1cnNvclBvc2l0aW9uKSB7Ci0JCXRoaXMuY3Vyc29yUG9zaXRpb24gPSBjdXJzb3JQb3NpdGlvbjsKLQl9Ci0gICAgCi0JcHVibGljIHZvaWQgc2V0RWRpdGVkRmlsZShGaWxlIGFGaWxlKSB7Ci0JCWZFZGl0ZWRGaWxlPSBhRmlsZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5BbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yI2dldFRhcmdldEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0VGFyZ2V0QXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoSURvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgdGV4dFRvU2VhcmNoLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlyZXR1cm4gc3VwZXIuZ2V0VGFyZ2V0QXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoZG9jdW1lbnQsIHRleHRUb1NlYXJjaCwgcHJlZml4LCBhdHRyaWJ1dGVOYW1lKTsKLQl9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5BbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yI2dldEFudENhbGxBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldEFudENhbGxBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhJRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRBbnRDYWxsQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoZG9jdW1lbnQsIHByZWZpeCwgYXR0cmlidXRlTmFtZSk7Ci0gICAgfQotCS8qKgotCSAqIFNpbmNlIHRoZSB0ZXN0aW5nIG9jY3VycyB3aXRob3V0IG5lY2Vzc2FyaWx5IGhhdmluZyBhbiBhc3NvY2lhdGVkIHZpZXdlciwgcmV0dXJuCi0JICogYSBkdW1teSB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgY2hhciBnZXRQcmV2aW91c0NoYXIoKSB7Ci0JCXJldHVybiAnPyc7Ci0JfQotCQotCSAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB0YXNrIG5hbWUgaXMga25vd24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNLbm93bkVsZW1lbnQoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0gICAgCWlmIChhbnRNb2RlbCAhPSBudWxsKSB7Ci0gICAgCQlyZXR1cm4gc3VwZXIuaXNLbm93bkVsZW1lbnQoZWxlbWVudE5hbWUpOwotICAgIAl9IAotICAgIAlyZXR1cm4gZ2V0RHRkKCkuZ2V0RWxlbWVudChlbGVtZW50TmFtZSkgIT0gbnVsbCA7Ci0gICAgfQotICAgIAotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3NvciNnZXRQcm9wb3NhbHNGcm9tRG9jdW1lbnQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRQcm9wb3NhbHNGcm9tRG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgcHJlZml4KSB7Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wb3NhbHNGcm9tRG9jdW1lbnQoZG9jdW1lbnQsIHByZWZpeCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3NvciNnZXRCdWlsZEZpbGVQcm9wb3NhbHMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRCdWlsZEZpbGVQcm9wb3NhbHMoU3RyaW5nIHRleHQsIFN0cmluZyBwcmVmaXgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEJ1aWxkRmlsZVByb3Bvc2FscyhuZXcgRG9jdW1lbnQodGV4dCksIHByZWZpeCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3NvciNkZXRlcm1pbmVUZW1wbGF0ZVByb3Bvc2FscyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLCBpbnQpCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBkZXRlcm1pbmVUZW1wbGF0ZVByb3Bvc2FscygpIHsKLQkJcmV0dXJuIHN1cGVyLmRldGVybWluZVRlbXBsYXRlUHJvcG9zYWxzKGZWaWV3ZXIsIGN1cnNvclBvc2l0aW9uKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2NvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsIGludCkKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGludCBkb2N1bWVudE9mZnNldCkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoZlZpZXdlciwgZG9jdW1lbnRPZmZzZXQpOwotCX0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBpZiAoZk5lZWRzVG9EaXNwb3NlICYmIGFudE1vZGVsICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vbm90IHdvcmtpbmcgd2l0aCBhbiBlZGl0b3IKLSAgICAgICAgICAgIGFudE1vZGVsLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9BYnN0cmFjdEFudFVJQnVpbGRQZXJmb3JtYW5jZVRlc3QuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9BYnN0cmFjdEFudFVJQnVpbGRQZXJmb3JtYW5jZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc0NzkyMC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvQWJzdHJhY3RBbnRVSUJ1aWxkUGVyZm9ybWFuY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZU1ldGVyOwotCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RBbnRVSUJ1aWxkUGVyZm9ybWFuY2VUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbnRVSUJ1aWxkVGVzdCB7Ci0KLQlwcm90ZWN0ZWQgUGVyZm9ybWFuY2VNZXRlciBmUGVyZm9ybWFuY2VNZXRlcjsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBwZXJmb3JtYW5jZSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcGVyZm9ybWFuY2UgdGVzdCBjYXNlCi0JICovCi0JcHVibGljIEFic3RyYWN0QW50VUlCdWlsZFBlcmZvcm1hbmNlVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGRlbiB0byBjcmVhdGUgYSBkZWZhdWx0IHBlcmZvcm1hbmNlIG1ldGVyIGZvciB0aGlzIHRlc3QgY2FzZS4KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVBlcmZvcm1hbmNlIHBlcmZvcm1hbmNlPSBQZXJmb3JtYW5jZS5nZXREZWZhdWx0KCk7Ci0JCWZQZXJmb3JtYW5jZU1ldGVyPSBwZXJmb3JtYW5jZS5jcmVhdGVQZXJmb3JtYW5jZU1ldGVyKHBlcmZvcm1hbmNlLmdldERlZmF1bHRTY2VuYXJpb0lkKHRoaXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZGVuIHRvIGRpc3Bvc2Ugb2YgdGhlIHBlcmZvcm1hbmNlIG1ldGVyLgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZlBlcmZvcm1hbmNlTWV0ZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIE1hcmsgdGhlIHNjZW5hcmlvIG9mIHRoaXMgdGVzdCBjYXNlCi0JICogdG8gYmUgaW5jbHVkZWQgaW50byB0aGUgZ2xvYmFsIHBlcmZvcm1hbmNlIHN1bW1hcnkuIFRoZSBzdW1tYXJ5IHNob3dzCi0JICogdGhlIGdpdmVuIGRpbWVuc2lvbiBvZiB0aGUgc2NlbmFyaW8gYW5kIGxhYmVscyB0aGUgc2NlbmFyaW8gd2l0aCB0aGUgc2hvcnQgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2hvcnROYW1lIGEgc2hvcnQgKHNob3J0ZXIgdGhhbiA0MCBjaGFyYWN0ZXJzKSBkZXNjcml0aXZlIG5hbWUgb2YgdGhlIHNjZW5hcmlvCi0JICogQHBhcmFtIGRpbWVuc2lvbiB0aGUgZGltZW5zaW9uIHRvIHNob3cgaW4gdGhlIHN1bW1hcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0YWdBc0dsb2JhbFN1bW1hcnkoU3RyaW5nIHNob3J0TmFtZSwgRGltZW5zaW9uIGRpbWVuc2lvbikgewotCQlQZXJmb3JtYW5jZSBwZXJmb3JtYW5jZT0gUGVyZm9ybWFuY2UuZ2V0RGVmYXVsdCgpOwotCQlwZXJmb3JtYW5jZS50YWdBc0dsb2JhbFN1bW1hcnkoZlBlcmZvcm1hbmNlTWV0ZXIsIHNob3J0TmFtZSwgbmV3IERpbWVuc2lvbltdIHsgZGltZW5zaW9uIH0gKTsKLQl9Ci0JCi0JLyoqCi0JICogTWFyayB0aGUgc2NlbmFyaW8gb2YgdGhpcyB0ZXN0IGNhc2UKLQkgKiB0byBiZSBpbmNsdWRlZCBpbnRvIHRoZSBwZXJmb3JtYW5jZSBzdW1tYXJ5LiBUaGUgc3VtbWFyeSBzaG93cwotCSAqIHRoZSBnaXZlbiBkaW1lbnNpb24gb2YgdGhlIHNjZW5hcmlvIGFuZCBsYWJlbHMgdGhlIHNjZW5hcmlvIHdpdGggdGhlIHNob3J0IG5hbWUuCi0JICogCi0JICogQHBhcmFtIHNob3J0TmFtZSBhIHNob3J0IChzaG9ydGVyIHRoYW4gNDAgY2hhcmFjdGVycykgZGVzY3JpcHRpdmUgbmFtZSBvZiB0aGUgc2NlbmFyaW8KLQkgKiBAcGFyYW0gZGltZW5zaW9uIHRoZSBkaW1lbnNpb24gdG8gc2hvdyBpbiB0aGUgc3VtbWFyeQotCSAqLwotCXB1YmxpYyB2b2lkIHRhZ0FzU3VtbWFyeShTdHJpbmcgc2hvcnROYW1lLCBEaW1lbnNpb24gZGltZW5zaW9uKSB7Ci0JCVBlcmZvcm1hbmNlIHBlcmZvcm1hbmNlPSBQZXJmb3JtYW5jZS5nZXREZWZhdWx0KCk7Ci0JCXBlcmZvcm1hbmNlLnRhZ0FzU3VtbWFyeShmUGVyZm9ybWFuY2VNZXRlciwgc2hvcnROYW1lLCBuZXcgRGltZW5zaW9uW10geyBkaW1lbnNpb24gfSApOwotCX0KLQotCS8qKgotCSAqIE1hcmsgdGhlIHNjZW5hcmlvIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBQZXJmb3JtYW5jZU1ldGVyCi0JICogdG8gYmUgaW5jbHVkZWQgaW50byB0aGUgZ2xvYmFsIHBlcmZvcm1hbmNlIHN1bW1hcnkuIFRoZSBzdW1tYXJ5IHNob3dzCi0JICogdGhlIGdpdmVuIGRpbWVuc2lvbnMgb2YgdGhlIHNjZW5hcmlvIGFuZCBsYWJlbHMgdGhlIHNjZW5hcmlvIHdpdGggdGhlIHNob3J0IG5hbWUuCi0JICogCi0JICogQHBhcmFtIHNob3J0TmFtZSBhIHNob3J0IChzaG9ydGVyIHRoYW4gNDAgY2hhcmFjdGVycykgZGVzY3JpcHRpdmUgbmFtZSBvZiB0aGUgc2NlbmFyaW8KLQkgKiBAcGFyYW0gZGltZW5zaW9ucyBhbiBhcnJheSBvZiBkaW1lbnNpb25zIHRvIHNob3cgaW4gdGhlIHN1bW1hcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0YWdBc0dsb2JhbFN1bW1hcnkoU3RyaW5nIHNob3J0TmFtZSwgRGltZW5zaW9uW10gZGltZW5zaW9ucykgewotCQlQZXJmb3JtYW5jZSBwZXJmb3JtYW5jZT0gUGVyZm9ybWFuY2UuZ2V0RGVmYXVsdCgpOwotCQlwZXJmb3JtYW5jZS50YWdBc0dsb2JhbFN1bW1hcnkoZlBlcmZvcm1hbmNlTWV0ZXIsIHNob3J0TmFtZSwgZGltZW5zaW9ucyApOwotCX0KLQkKLQkvKioKLQkgKiBDYWxsZWQgZnJvbSB3aXRoaW4gYSB0ZXN0IGNhc2UgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBjb2RlIHRvIG1lYXN1cmUgaXMgcnVuLgotCSAqIEl0IHN0YXJ0cyBjYXB0dXJpbmcgb2YgcGVyZm9ybWFuY2UgZGF0YS4KLQkgKiBNdXN0IGJlIGZvbGxvd2VkIGJ5IGEgY2FsbCB0byB7QGxpbmsgUGVyZm9ybWFuY2VUZXN0Q2FzZSNzdG9wTWVhc3VyaW5nKCl9IGJlZm9yZSBzdWJzZXF1ZW50IGNhbGxzCi0JICogdG8gdGhpcyBtZXRob2Qgb3Ige0BsaW5rIFBlcmZvcm1hbmNlVGVzdENhc2UjY29tbWl0TWVhc3VyZW1lbnRzKCl9LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0YXJ0TWVhc3VyaW5nKCkgewotCQlmUGVyZm9ybWFuY2VNZXRlci5zdGFydCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzdG9wTWVhc3VyaW5nKCkgewotCQlmUGVyZm9ybWFuY2VNZXRlci5zdG9wKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNvbW1pdE1lYXN1cmVtZW50cygpIHsKLQkJZlBlcmZvcm1hbmNlTWV0ZXIuY29tbWl0KCk7IAotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgZGVmYXVsdCBwcm9wZXJ0aWVzIG9mIHRoZSBtZWFzdXJlbWVudHMgY2FwdHVyZWQgZm9yIHRoaXMgdGVzdCBjYXNlLgotCSAqIAotCSAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiBpZiB0aGUgcHJvcGVydGllcyBkbyBub3QgaG9sZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFzc2VydFBlcmZvcm1hbmNlKCkgewotCQlQZXJmb3JtYW5jZS5nZXREZWZhdWx0KCkuYXNzZXJ0UGVyZm9ybWFuY2UoZlBlcmZvcm1hbmNlTWV0ZXIpOwotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgbWVhc3VyZW1lbnQgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBkaW1lbnNpb24KLQkgKiBpcyB3aXRoaW4gYSBjZXJ0YWluIHJhbmdlIHdpdGggcmVzcGVjdCB0byBzb21lIHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiBJZiB0aGUgc3BlY2lmaWVkIGRpbWVuc2lvbiBpc24ndCBhdmFpbGFibGUsIHRoZSBjYWxsIGhhcyBubyBlZmZlY3QuCi0JICogCi0JICogQHBhcmFtIGRpbSB0aGUgRGltZW5zaW9uIHRvIGNoZWNrCi0JICogQHBhcmFtIGxvd2VyUGVyY2VudGFnZSBhIG5lZ2F0aXZlIG51bWJlciBpbmRpY2F0aW5nIHRoZSBwZXJjZW50YWdlIHRoZSBtZWFzdXJlZCB2YWx1ZSBpcyBhbGxvd2VkIHRvIGJlIHNtYWxsZXIgdGhhbiBzb21lIHJlZmVyZW5jZSB2YWx1ZQotCSAqIEBwYXJhbSB1cHBlclBlcmNlbnRhZ2UgYSBwb3NpdGl2ZSBudW1iZXIgaW5kaWNhdGluZyB0aGUgcGVyY2VudGFnZSB0aGUgbWVhc3VyZWQgdmFsdWUgaXMgYWxsb3dlZCB0byBiZSBncmVhdGVyIHRoYW4gc29tZSByZWZlcmVuY2UgdmFsdWUKLQkgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gaWYgdGhlIHByb3BlcnRpZXMgZG8gbm90IGhvbGQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRQZXJmb3JtYW5jZUluUmVsYXRpdmVCYW5kKERpbWVuc2lvbiBkaW0sIGludCBsb3dlclBlcmNlbnRhZ2UsIGludCB1cHBlclBlcmNlbnRhZ2UpIHsKLQkJUGVyZm9ybWFuY2UuZ2V0RGVmYXVsdCgpLmFzc2VydFBlcmZvcm1hbmNlSW5SZWxhdGl2ZUJhbmQoZlBlcmZvcm1hbmNlTWV0ZXIsIGRpbSwgbG93ZXJQZXJjZW50YWdlLCB1cHBlclBlcmNlbnRhZ2UpOwotCX0KLQkKLQkvKioKLQkgKiBMYXVuY2hlcyB0aGUgQW50IGJ1aWxkIGZvciB0aGlzIGNvbmZpZy4KLQkgKiBXYWl0cyBmb3IgYWxsIG9mIHRoZSBsaW5lcyB0byBiZSBhcHBlbmRlZCB0byB0aGUgY29uc29sZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiB0byBleGVjdXRlCi0JICogQHBhcmFtIGkgdGhlIG51bWJlciBvZiB0aW1lcyB0byBwZXJmb3JtIHRoZSBsYXVuY2gKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsYXVuY2goSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnLCBpbnQgaSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdGFydE1lYXN1cmluZygpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykgewotCQkgICAgc3VwZXIubGF1bmNoKGNvbmZpZyk7ICAgIAotICAgICAgICB9Ci0JCXN0b3BNZWFzdXJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvQWJzdHJhY3RBbnRVSUJ1aWxkVGVzdC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL0Fic3RyYWN0QW50VUlCdWlsZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU0ZWNhNy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvQWJzdHJhY3RBbnRVSUJ1aWxkVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS50ZXN0cGx1Z2luLkFic3RyYWN0QW50VUlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb25zb2xlLklIeXBlcmxpbms7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QW50VUlCdWlsZFRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFudFVJVGVzdCB7Ci0KLQkvKioKLQkgKiBGbGFnIHRoYXQgaW5kaWNhdGVzIHRlc3QgYXJlIGluIHByb2dyZXNzCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdGVzdGluZyA9IHRydWU7Ci0JCQotCXB1YmxpYyBBYnN0cmFjdEFudFVJQnVpbGRUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBSdW5zIHRoZSB0ZXN0IGFuZCBjb2xsZWN0cyB0aGUgcmVzdWx0IGluIGEgVGVzdFJlc3VsdCB3aXRob3V0IGJsb2NraW5nCi0JICogdGhlIFVJIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oZmluYWwgVGVzdFJlc3VsdCByZXN1bHQpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCVRocmVhZCB0aHJlYWQgPSBudWxsOwotCQl0cnkgewotCQkJUnVubmFibGUgciA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCUFic3RyYWN0QW50VUlCdWlsZFRlc3Quc3VwZXIucnVuKHJlc3VsdCk7CQkKLQkJCQkJdGVzdGluZyA9IGZhbHNlOwotCQkJCQlkaXNwbGF5Lndha2UoKTsKLQkJCQl9Ci0JCQl9OwotCQkJdGhyZWFkID0gbmV3IFRocmVhZChyKTsKLQkJCXRocmVhZC5zdGFydCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQkJd2hpbGUgKHRlc3RpbmcpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9CQkJCi0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBMYXVuY2hlcyB0aGUgQW50IGJ1aWxkIHdpdGggdGhlIGJ1aWxkZmlsZSBuYW1lIChubyBleHRlbnNpb24pLgotCSAqIFdhaXRzIGZvciBhbGwgb2YgdGhlIGxpbmVzIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBjb25zb2xlLgotCSAqIAotCSAqIEBwYXJhbSBidWlsZEZpbGVOYW1lIHRoZSBidWlsZGZpbGUgdG8gZXhlY3V0ZQotCSAqIEByZXR1cm4gdGhyZWFkIGluIHdoaWNoIHRoZSBmaXJzdCBzdXNwZW5kIGV2ZW50IG9jY3VycmVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGF1bmNoKFN0cmluZyBidWlsZEZpbGVOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmxhdW5jaChidWlsZEZpbGVOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogTGF1bmNoZXMgdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uCi0JICogV2FpdHMgZm9yIGFsbCBvZiB0aGUgbGluZXMgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIGNvbnNvbGUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZyB0aGUgY29uZmlnIHRvIGV4ZWN1dGUKLQkgKiBAcmV0dXJuIHRocmVhZCBpbiB3aGljaCB0aGUgZmlyc3Qgc3VzcGVuZCBldmVudCBvY2N1cnJlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxhdW5jaChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkgICAgbGF1bmNoQW5kVGVybWluYXRlKGNvbmZpZywgMjAwMDApOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZUxpbmsoZmluYWwgSUh5cGVybGluayBsaW5rKSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJbGluay5saW5rQWN0aXZhdGVkKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbi5BYnN0cmFjdEFudFVJVGVzdCNsYXVuY2goamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsYXVuY2goU3RyaW5nIGJ1aWxkRmlsZU5hbWUsIFN0cmluZyBhcmd1bWVudHMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3VwZXIubGF1bmNoKGJ1aWxkRmlsZU5hbWUsIGFyZ3VtZW50cyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL0FudFV0aWxUZXN0cy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL0FudFV0aWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjg5MzNjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9BbnRVdGlsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudFRhcmdldE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy5JQW50TGF1bmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS50ZXN0cGx1Z2luLkFic3RyYWN0QW50VUlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5JRXh0ZXJuYWxUb29sQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotCi1wdWJsaWMgY2xhc3MgQW50VXRpbFRlc3RzIGV4dGVuZHMgQWJzdHJhY3RBbnRVSVRlc3QgewotCi0gICAgcHVibGljIEFudFV0aWxUZXN0cyhTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFRhcmdldHNMYXVuY2hDb25maWd1cmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgIFN0cmluZyBidWlsZEZpbGVOYW1lPSAiZWNob2luZyI7Ci0gICAgICAgRmlsZSBidWlsZEZpbGU9IGdldEJ1aWxkRmlsZShidWlsZEZpbGVOYW1lICsgIi54bWwiKTsKLSAgICAgICBTdHJpbmcgYXJndW1lbnRzPSBudWxsOwotICAgICAgIE1hcCBwcm9wZXJ0aWVzPSBudWxsOwotICAgICAgIFN0cmluZyBwcm9wZXJ0eUZpbGVzPSBudWxsOwotICAgICAgIEFudFRhcmdldE5vZGVbXSB0YXJnZXRzPSBBbnRVdGlsLmdldFRhcmdldHMoYnVpbGRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBnZXRMYXVuY2hDb25maWd1cmF0aW9uKGJ1aWxkRmlsZU5hbWUsIGFyZ3VtZW50cywgcHJvcGVydGllcywgcHJvcGVydHlGaWxlcykpOwotICAgICAgIGFzc2VydFRydWUodGFyZ2V0cyAhPSBudWxsKTsKLSAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbnVtYmVyIG9mIHRhcmdldHMgcmV0cmlldmVkOyBzaG91bGQgYmUgNCB3YXM6ICIgKyB0YXJnZXRzLmxlbmd0aCwgdGFyZ2V0cy5sZW5ndGggPT0gNCk7Ci0gICAgICAgYXNzZXJ0Q29udGFpbnMoImVjaG8zIiwgdGFyZ2V0cyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRUYXJnZXRzTGF1bmNoQ29uZmlndXJhdGlvbk1pbnVzRCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGJ1aWxkRmlsZU5hbWU9ICJpbXBvcnRSZXF1aXJpbmdVc2VyUHJvcCI7Ci0gICAgICAgIEZpbGUgYnVpbGRGaWxlPSBnZXRCdWlsZEZpbGUoYnVpbGRGaWxlTmFtZSArICIueG1sIik7Ci0gICAgICAgIFN0cmluZyBhcmd1bWVudHM9ICItRGltcG9ydEZpbGVOYW1lPXRvQmVJbXBvcnRlZC54bWwiOwotICAgICAgICBNYXAgcHJvcGVydGllcz0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHByb3BlcnR5RmlsZXM9IG51bGw7Ci0gICAgICAgIEFudFRhcmdldE5vZGVbXSB0YXJnZXRzPSBBbnRVdGlsLmdldFRhcmdldHMoYnVpbGRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBnZXRMYXVuY2hDb25maWd1cmF0aW9uKGJ1aWxkRmlsZU5hbWUsIGFyZ3VtZW50cywgcHJvcGVydGllcywgcHJvcGVydHlGaWxlcykpOwotICAgICAgICBhc3NlcnRUcnVlKHRhcmdldHMgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkluY29ycmVjdCBudW1iZXIgb2YgdGFyZ2V0cyByZXRyaWV2ZWQ7IHNob3VsZCBiZSAzIHdhczogIiArIHRhcmdldHMubGVuZ3RoLCB0YXJnZXRzLmxlbmd0aCA9PSAzKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoImltcG9ydC1kZWZhdWx0IiwgdGFyZ2V0cyk7Ci0gICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VGFyZ2V0c0xhdW5jaENvbmZpZ3VyYXRpb25NaW51c0RBbmRQcm9wZXJ0eSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGJ1aWxkRmlsZU5hbWU9ICJpbXBvcnRSZXF1aXJpbmdVc2VyUHJvcCI7Ci0gICAgICAgIEZpbGUgYnVpbGRGaWxlPSBnZXRCdWlsZEZpbGUoYnVpbGRGaWxlTmFtZSArICIueG1sIik7Ci0gICAgICAgIFN0cmluZyBhcmd1bWVudHM9ICItRGltcG9ydEZpbGVOYW1lPXRvQmVJbXBvcnRlZC54bWwiOwotICAgICAgICAvL2FyZ3VtZW50cyBzaG91bGQgd2luCi0gICAgICAgIE1hcCBwcm9wZXJ0aWVzPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBwcm9wZXJ0aWVzLnB1dCgiaW1wb3J0RmlsZU5hbWUiLCAibm90VG9CZUltcG9ydGVkLnhtbCIpOwotICAgICAgICBTdHJpbmcgcHJvcGVydHlGaWxlcz0gbnVsbDsKLSAgICAgICAgQW50VGFyZ2V0Tm9kZVtdIHRhcmdldHM9IEFudFV0aWwuZ2V0VGFyZ2V0cyhidWlsZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGdldExhdW5jaENvbmZpZ3VyYXRpb24oYnVpbGRGaWxlTmFtZSwgYXJndW1lbnRzLCBwcm9wZXJ0aWVzLCBwcm9wZXJ0eUZpbGVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUodGFyZ2V0cyAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IG51bWJlciBvZiB0YXJnZXRzIHJldHJpZXZlZDsgc2hvdWxkIGJlIDMgd2FzOiAiICsgdGFyZ2V0cy5sZW5ndGgsIHRhcmdldHMubGVuZ3RoID09IDMpOwotICAgICAgICBhc3NlcnRDb250YWlucygiaW1wb3J0LWRlZmF1bHQiLCB0YXJnZXRzKTsKLSAgICAgfQotICAgIAotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRUYXJnZXRzTGF1bmNoQ29uZmlndXJhdGlvblByb3BlcnR5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgYnVpbGRGaWxlTmFtZT0gImltcG9ydFJlcXVpcmluZ1VzZXJQcm9wIjsKLSAgICAgICAgRmlsZSBidWlsZEZpbGU9IGdldEJ1aWxkRmlsZShidWlsZEZpbGVOYW1lICsgIi54bWwiKTsKLSAgICAgICAgU3RyaW5nIGFyZ3VtZW50cz0gbnVsbDsKLSAgICAgICAgTWFwIHByb3BlcnRpZXM9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KCJpbXBvcnRGaWxlTmFtZSIsICJ0b0JlSW1wb3J0ZWQueG1sIik7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eUZpbGVzPSBudWxsOwotICAgICAgICBBbnRUYXJnZXROb2RlW10gdGFyZ2V0cz0gQW50VXRpbC5nZXRUYXJnZXRzKGJ1aWxkRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbihidWlsZEZpbGVOYW1lLCBhcmd1bWVudHMsIHByb3BlcnRpZXMsIHByb3BlcnR5RmlsZXMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh0YXJnZXRzICE9IG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbnVtYmVyIG9mIHRhcmdldHMgcmV0cmlldmVkOyBzaG91bGQgYmUgMyB3YXM6ICIgKyB0YXJnZXRzLmxlbmd0aCwgdGFyZ2V0cy5sZW5ndGggPT0gMyk7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJpbXBvcnQtZGVmYXVsdCIsIHRhcmdldHMpOwotICAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFRhcmdldHNMYXVuY2hDb25maWd1cmF0aW9uUHJvcGVydHlGaWxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgYnVpbGRGaWxlTmFtZT0gImltcG9ydFJlcXVpcmluZ1VzZXJQcm9wIjsKLSAgICAgICAgRmlsZSBidWlsZEZpbGU9IGdldEJ1aWxkRmlsZShidWlsZEZpbGVOYW1lICsgIi54bWwiKTsKLSAgICAgICAgU3RyaW5nIGFyZ3VtZW50cz0gbnVsbDsKLSAgICAgICAgTWFwIHByb3BlcnRpZXM9IG51bGw7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eUZpbGVzPSAiYnVpbGR0ZXN0MS5wcm9wZXJ0aWVzIjsKLSAgICAgICAgQW50VGFyZ2V0Tm9kZVtdIHRhcmdldHM9IEFudFV0aWwuZ2V0VGFyZ2V0cyhidWlsZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGdldExhdW5jaENvbmZpZ3VyYXRpb24oYnVpbGRGaWxlTmFtZSwgYXJndW1lbnRzLCBwcm9wZXJ0aWVzLCBwcm9wZXJ0eUZpbGVzKSk7Ci0gICAgICAgIGFzc2VydFRydWUodGFyZ2V0cyAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IG51bWJlciBvZiB0YXJnZXRzIHJldHJpZXZlZDsgc2hvdWxkIGJlIDMgd2FzOiAiICsgdGFyZ2V0cy5sZW5ndGgsIHRhcmdldHMubGVuZ3RoID09IDMpOwotICAgICAgICBhc3NlcnRDb250YWlucygiaW1wb3J0LWRlZmF1bHQiLCB0YXJnZXRzKTsKLSAgICAgfQotICAgIAotICAgIHByb3RlY3RlZCBJTGF1bmNoQ29uZmlndXJhdGlvbiBnZXRMYXVuY2hDb25maWd1cmF0aW9uKFN0cmluZyBidWlsZEZpbGVOYW1lLCBTdHJpbmcgYXJndW1lbnRzLCBNYXAgcHJvcGVydGllcywgU3RyaW5nIHByb3BlcnR5RmlsZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbihidWlsZEZpbGVOYW1lKTsKLQkJYXNzZXJ0Tm90TnVsbCgiQ291bGQgbm90IGxvY2F0ZSBsYXVuY2ggY29uZmlndXJhdGlvbiBmb3IgIiArIGJ1aWxkRmlsZU5hbWUsIGNvbmZpZyk7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29weT0gY29uZmlnLmdldFdvcmtpbmdDb3B5KCk7Ci0JCWlmIChhcmd1bWVudHMgIT0gbnVsbCkgewotCQkgICAgY29weS5zZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX1RPT0xfQVJHVU1FTlRTLCBhcmd1bWVudHMpOwotCQl9Ci0JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJICAgIGNvcHkuc2V0QXR0cmlidXRlKElBbnRMYXVuY2hDb25zdGFudHMuQVRUUl9BTlRfUFJPUEVSVElFUywgcHJvcGVydGllcyk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5RmlsZXMgIT0gbnVsbCkgewotCQkgICAgY29weS5zZXRBdHRyaWJ1dGUoSUFudExhdW5jaENvbnN0YW50cy5BVFRSX0FOVF9QUk9QRVJUWV9GSUxFUywgcHJvcGVydHlGaWxlcyk7Ci0JCX0KLQkJcmV0dXJuIGNvcHk7Ci0gICAgfQotCi0gICAgLyoqCi0gCSAqIEFzc2VydHMgdGhhdCA8Y29kZT5kaXNwbGF5U3RyaW5nPC9jb2RlPiBpcyBpbiBvbmUgb2YgdGhlIAotIAkgKiBjb21wbGV0aW9uIHByb3Bvc2Fscy4KLSAJICovCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydENvbnRhaW5zKFN0cmluZyB0YXJnZXROYW1lLCBBbnRUYXJnZXROb2RlW10gdGFyZ2V0cykgewotICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFyZ2V0cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgQW50VGFyZ2V0Tm9kZSB0YXJnZXQgPSB0YXJnZXRzW2ldOwotICAgICAgICAgICAgU3RyaW5nIGZvdW5kTmFtZSA9IHRhcmdldC5nZXRUYXJnZXROYW1lKCk7Ci0gICAgICAgICAgICBpZih0YXJnZXROYW1lLmVxdWFscyhmb3VuZE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygiRGlkIG5vdCBmaW5kIHRhcmdldDogIiArIHRhcmdldE5hbWUsIHRydWUsIGZvdW5kKTsKLSAgICB9ICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9wZXJmb3JtYW5jZS9BYnN0cmFjdEFudFBlcmZvcm1hbmNlVGVzdC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3BlcmZvcm1hbmNlL0Fic3RyYWN0QW50UGVyZm9ybWFuY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZmNkNmUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3BlcmZvcm1hbmNlL0Fic3RyYWN0QW50UGVyZm9ybWFuY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiAgQ29udHJpYnV0b3JzOgotICogICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbi5BYnN0cmFjdEFudFVJVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlVGVzdENhc2U7Ci0KLS8qKgotICogQWJzdHJhY3QgY2xhc3MgZm9yIGFudCBwZXJmb3JtYW5jZSB0ZXN0cywgZW5zdXJlcyB0aGUgdGVzdCBwcm9qZWN0IGlzIGNyZWF0ZWQgCi0gKiBhbmQgcmVhZHkgaW4gdGhlIHRlc3Qgd29ya3NwYWNlLgotICogCi0gKiBAc2luY2UgMy41Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFudFBlcmZvcm1hbmNlVGVzdCBleHRlbmRzIFBlcmZvcm1hbmNlVGVzdENhc2UgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVRlc3RDYXNlI3NldFVwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlBYnN0cmFjdEFudFVJVGVzdC5hc3NlcnRQcm9qZWN0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3BlcmZvcm1hbmNlL09wZW5MYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nVGVzdHMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9wZXJmb3JtYW5jZS9PcGVuTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNjc4MTMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3BlcmZvcm1hbmNlL09wZW5MYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuZWRpdG9yLnBlcmZvcm1hbmNlLkVkaXRvclRlc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQWJzdHJhY3RBbnRVSVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmludGVybmFsLnVpLkRlYnVnVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuaW50ZXJuYWwudWkuSUludGVybmFsRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5pbnRlcm5hbC51aS5sYXVuY2hDb25maWd1cmF0aW9ucy5MYXVuY2hDb25maWd1cmF0aW9uc0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwubW9kZWwuSUV4dGVybmFsVG9vbENvbnN0YW50czsKLQotcHVibGljIGNsYXNzIE9wZW5MYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nVGVzdHMgZXh0ZW5kcyBQZXJmb3JtYW5jZVRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZnSWRlbnRpZmllcj0gSUV4dGVybmFsVG9vbENvbnN0YW50cy5JRF9FWFRFUk5BTF9UT09MU19MQVVOQ0hfR1JPVVA7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5BbnRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nMSgpIHsKLSAgICAgICAgLy9jb2xkIHJ1bgotICAgICAgICBJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uPSBnZXRMYXVuY2hDb25maWd1cmF0aW9uKCJiaWciKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjb25maWd1cmF0aW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCSAgICBvcGVuTENEKHNlbGVjdGlvbiwgZmdJZGVudGlmaWVyLCAyMCk7IAotICAgICAgICB9Ci0JCQotCQljb21taXRNZWFzdXJlbWVudHMoKTsKLQkJYXNzZXJ0UGVyZm9ybWFuY2UoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5BbnRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nMigpIHsKLSAgICAgICAgLy93YXJtIHJ1bgotICAgICAgICBJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uPSBnZXRMYXVuY2hDb25maWd1cmF0aW9uKCJiaWciKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjb25maWd1cmF0aW9uKTsKLQkJdGFnQXNTdW1tYXJ5KCJPcGVuIExDRCBvbiBUYXJnZXRzIHRhYiIsIERpbWVuc2lvbi5FTEFQU0VEX1BST0NFU1MpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJICAgIG9wZW5MQ0Qoc2VsZWN0aW9uLCBmZ0lkZW50aWZpZXIsIDIwKTsgCi0gICAgICAgIH0KLQkJCi0JCWNvbW1pdE1lYXN1cmVtZW50cygpOwotCQlhc3NlcnRQZXJmb3JtYW5jZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgSUxhdW5jaENvbmZpZ3VyYXRpb24gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbihTdHJpbmcgYnVpbGRGaWxlTmFtZSkgewotICAgICAgICBJRmlsZSBmaWxlID0gQWJzdHJhY3RBbnRVSVRlc3QuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJsYXVuY2hDb25maWd1cmF0aW9ucyIpLmdldEZpbGUoYnVpbGRGaWxlTmFtZSArICIubGF1bmNoIik7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IEFic3RyYWN0QW50VUlUZXN0LmdldExhdW5jaE1hbmFnZXIoKS5nZXRMYXVuY2hDb25maWd1cmF0aW9uKGZpbGUpOwotCQlhc3NlcnRUcnVlKCJDb3VsZCBub3QgZmluZCBsYXVuY2ggY29uZmlndXJhdGlvbiBmb3IgIiArIGJ1aWxkRmlsZU5hbWUsIGNvbmZpZy5leGlzdHMoKSk7Ci0JCXJldHVybiBjb25maWc7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG9wZW5MQ0QoZmluYWwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBmaW5hbCBTdHJpbmcgZ3JvdXBJZGVudGlmaWVyLCBpbnQgbnVtYmVyT2ZPcGVucykgewotICAgICAgICBzdGFydE1lYXN1cmluZygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mT3BlbnM7IGkrKykgewotCSAgICAgICAgLy9zZXQgYSBzdGF0dXMgdG8gZ28gdG8gdGhlIHRhcmdldHMgdGFiCi0JCSAgICBJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBJQW50VUlDb25zdGFudHMuUExVR0lOX0lELCBJQW50VUlDb25zdGFudHMuU1RBVFVTX0lOSVRfUlVOX0FOVCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQlMYXVuY2hDb25maWd1cmF0aW9uc0RpYWxvZyBkaWFsb2c9IG5ldyBMYXVuY2hDb25maWd1cmF0aW9uc0RpYWxvZyhEZWJ1Z1VJUGx1Z2luLmdldFNoZWxsKCksIERlYnVnVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkuZ2V0TGF1bmNoR3JvdXAoZ3JvdXBJZGVudGlmaWVyKSk7Ci0JCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4oZmFsc2UpOwotCQkJZGlhbG9nLnNldE9wZW5Nb2RlKExhdW5jaENvbmZpZ3VyYXRpb25zRGlhbG9nLkxBVU5DSF9DT05GSUdVUkFUSU9OX0RJQUxPR19PUEVOX09OX1NFTEVDVElPTik7Ci0JCQlkaWFsb2cuc2V0SW5pdGlhbFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJZGlhbG9nLnNldEluaXRpYWxTdGF0dXMoc3RhdHVzKTsKLQkJCQotCQkJZGlhbG9nLm9wZW4oKTsKLSAgICAgICAgICAgIEVkaXRvclRlc3RIZWxwZXIucnVuRXZlbnRRdWV1ZShkaWFsb2cuZ2V0U2hlbGwoKSk7Ci0JCQlkaWFsb2cuY2xvc2UoKTsKLSAgICAgICAgfQotCQlzdG9wTWVhc3VyaW5nKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVRlc3RDYXNlI3NldFVwKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgSVByZWZlcmVuY2VTdG9yZSBkZWJ1Z1ByZWZlcmVuY2VTdG9yZSA9IERlYnVnVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotICAgICAgIGRlYnVnUHJlZmVyZW5jZVN0b3JlLnNldFZhbHVlKElJbnRlcm5hbERlYnVnVUlDb25zdGFudHMuUFJFRl9GSUxURVJfTEFVTkNIX0NMT1NFRCwgZmFsc2UpOwotICAgICAgIGRlYnVnUHJlZmVyZW5jZVN0b3JlLnNldFZhbHVlKElJbnRlcm5hbERlYnVnVUlDb25zdGFudHMuUFJFRl9GSUxURVJfTEFVTkNIX0RFTEVURUQsIGZhbHNlKTsKLSAgICAgICBkZWJ1Z1ByZWZlcmVuY2VTdG9yZS5zZXRWYWx1ZShJSW50ZXJuYWxEZWJ1Z1VJQ29uc3RhbnRzLlBSRUZfRklMVEVSX0xBVU5DSF9UWVBFUywgZmFsc2UpOyAgICAgICAKLSAgICAgICBkZWJ1Z1ByZWZlcmVuY2VTdG9yZS5zZXRWYWx1ZShJSW50ZXJuYWxEZWJ1Z1VJQ29uc3RhbnRzLlBSRUZfRklMVEVSX1dPUktJTkdfU0VUUywgZmFsc2UpOwotICAgICAgIEVkaXRvclRlc3RIZWxwZXIucnVuRXZlbnRRdWV1ZSgpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlVGVzdENhc2UjdGVhckRvd24oKQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgZGVidWdQcmVmZXJlbmNlU3RvcmUgPSBEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLSAgICAgICAgZGVidWdQcmVmZXJlbmNlU3RvcmUuc2V0VG9EZWZhdWx0KElJbnRlcm5hbERlYnVnVUlDb25zdGFudHMuUFJFRl9GSUxURVJfTEFVTkNIX0NMT1NFRCk7Ci0gICAgICAgIGRlYnVnUHJlZmVyZW5jZVN0b3JlLnNldFRvRGVmYXVsdChJSW50ZXJuYWxEZWJ1Z1VJQ29uc3RhbnRzLlBSRUZfRklMVEVSX0xBVU5DSF9ERUxFVEVEKTsKLSAgICAgICAgZGVidWdQcmVmZXJlbmNlU3RvcmUuc2V0VG9EZWZhdWx0KElJbnRlcm5hbERlYnVnVUlDb25zdGFudHMuUFJFRl9GSUxURVJfTEFVTkNIX1RZUEVTKTsgICAgICAgCi0gICAgICAgIGRlYnVnUHJlZmVyZW5jZVN0b3JlLnNldFRvRGVmYXVsdChJSW50ZXJuYWxEZWJ1Z1VJQ29uc3RhbnRzLlBSRUZfRklMVEVSX1dPUktJTkdfU0VUUyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3BlcmZvcm1hbmNlL1NlcGFyYXRlVk1UZXN0cy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3BlcmZvcm1hbmNlL1NlcGFyYXRlVk1UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmFmNzFjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9wZXJmb3JtYW5jZS9TZXBhcmF0ZVZNVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5BYnN0cmFjdEFudFVJQnVpbGRQZXJmb3JtYW5jZVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHRlcm5hbHRvb2xzLmludGVybmFsLklFeHRlcm5hbFRvb2xDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JRGVidWdVSUNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFNlcGFyYXRlVk1UZXN0cyBleHRlbmRzIEFic3RyYWN0QW50VUlCdWlsZFBlcmZvcm1hbmNlVGVzdCB7Ci0JCQotICAgIHB1YmxpYyBTZXBhcmF0ZVZNVGVzdHMoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIAotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoU2VwYXJhdGVWTVRlc3RzLmNsYXNzKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtYW5jZSB0ZXN0IGZvciBsYXVuY2hpbmcgQW50IGluIGEgc2VwYXJhdGUgdm0uCi0gICAgICovCi0JcHVibGljIHZvaWQgdGVzdEJ1aWxkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgIAkvL3RhZ0FzU3VtbWFyeSgiU2VwYXJhdGUgSlJFIEJ1aWxkIiwgRGltZW5zaW9uLkVMQVBTRURfUFJPQ0VTUyk7Ci0gICAgCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZz0gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigiZWNob2luZ1NlcFZNIik7Ci0gICAgCS8vcG9zc2libGUgZmlyc3QgdGltZSBoaXQgb2YgdGhlIFNXVCBwaWVjZXMgZ2V0dGluZyB3cml0dGVuIGZyb20gdGhlIEpBUiB0byB0aGUgCi0gICAgCS8vbWV0YWRhdGEgYXJlYQotICAgIAlsYXVuY2hBbmRUZXJtaW5hdGUoY29uZmlnLCAyMDAwMCk7Ci0gICAgCWZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotICAgIAkJbGF1bmNoKGNvbmZpZywgMTApOwotCQl9Ci0gICAgCWNvbW1pdE1lYXN1cmVtZW50cygpOwotCQlhc3NlcnRQZXJmb3JtYW5jZSgpOyAJCi0gICAgfQotCQotCSAvKioKLSAgICAgKiBQZXJmb3JtYW5jZSB0ZXN0IGZvciBsYXVuY2hpbmcgQW50IGluIGEgc2VwYXJhdGUgdm0gd2l0aCBubyBjb25zb2xlIG91dHB1dC4KLSAgICAgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QnVpbGROb0NvbnNvbGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgCS8vdGFnQXNTdW1tYXJ5KCJTZXBhcmF0ZSBKUkUgQnVpbGQ7IGNhcHR1cmUgb3V0cHV0IG9mZiIsIERpbWVuc2lvbi5FTEFQU0VEX1BST0NFU1MpOwotICAgIAlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRMYXVuY2hDb25maWd1cmF0aW9uKCJlY2hvaW5nU2VwVk0iKTsKLQkJYXNzZXJ0Tm90TnVsbCgiQ291bGQgbm90IGxvY2F0ZSBsYXVuY2ggY29uZmlndXJhdGlvbiBmb3IgIiArICJlY2hvaW5nU2VwVk0iLCBjb25maWcpOwotCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvcHk9IGNvbmZpZy5nZXRXb3JraW5nQ29weSgpOwotCQljb3B5LnNldEF0dHJpYnV0ZShJRGVidWdVSUNvbnN0YW50cy5BVFRSX0NBUFRVUkVfSU5fQ09OU09MRSwgZmFsc2UpOwotCQljb3B5LnNldEF0dHJpYnV0ZShEZWJ1Z1BsdWdpbi5BVFRSX0NBUFRVUkVfT1VUUFVULCBmYWxzZSk7Ci0JCS8vcG9zc2libGUgZmlyc3QgdGltZSBoaXQgb2YgdGhlIFNXVCBwaWVjZXMgZ2V0dGluZyB3cml0dGVuIGZyb20gdGhlIEpBUiB0byB0aGUgCi0gICAgCS8vbWV0YWRhdGEgYXJlYQotCQlsYXVuY2hBbmRUZXJtaW5hdGUoY29weSwgMjAwMDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLSAgICAJCWxhdW5jaChjb3B5LCAxMCk7Ci0gICAgICAgIH0KLSAgICAJY29tbWl0TWVhc3VyZW1lbnRzKCk7Ci0JCWFzc2VydFBlcmZvcm1hbmNlKCk7IAkKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUGVyZm9ybWFuY2UgdGVzdCBmb3IgbGF1bmNoaW5nIEFudCBpbiBhIHNlcGFyYXRlIHZtIHdpdGggZGVidWcgaW5mb3JtYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkTWludXNEZWJ1ZygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAJLy90YWdBc1N1bW1hcnkoIlNlcGFyYXRlIEpSRSBCdWlsZDsgLWRlYnVnIiwgRGltZW5zaW9uLkVMQVBTRURfUFJPQ0VTUyk7Ci0gICAgCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldExhdW5jaENvbmZpZ3VyYXRpb24oImVjaG9pbmdTZXBWTSIpOwotCQlhc3NlcnROb3ROdWxsKCJDb3VsZCBub3QgbG9jYXRlIGxhdW5jaCBjb25maWd1cmF0aW9uIGZvciAiICsgImVjaG9pbmdTZXBWTSIsIGNvbmZpZyk7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29weT0gY29uZmlnLmdldFdvcmtpbmdDb3B5KCk7Ci0JCWNvcHkuc2V0QXR0cmlidXRlKElFeHRlcm5hbFRvb2xDb25zdGFudHMuQVRUUl9UT09MX0FSR1VNRU5UUywgIi1kZWJ1ZyIpOwotCQkvL3Bvc3NpYmxlIGZpcnN0IHRpbWUgaGl0IG9mIHRoZSBTV1QgcGllY2VzIGdldHRpbmcgd3JpdHRlbiBmcm9tIHRoZSBKQVIgdG8gdGhlIAotICAgIAkvL21ldGFkYXRhIGFyZWEKLQkJbGF1bmNoQW5kVGVybWluYXRlKGNvcHksIDIwMDAwKTsKLSAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0gICAgCQlsYXVuY2goY29weSwgMTApOwotICAgICAgICB9Ci0gICAgCWNvbW1pdE1lYXN1cmVtZW50cygpOwotCQlhc3NlcnRQZXJmb3JtYW5jZSgpOwotCX0gIAkKLSAgICAKLSAgICAgLyoqCi0gICAgICogUGVyZm9ybWFuY2UgdGVzdCBmb3IgbGF1bmNoaW5nIEFudCBpbiBhIHNlcGFyYXRlIHZtIHdpdGggbG90cyBvZiBsaW5rcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZFdpdGhMb3RzT2ZMaW5rcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgLy90YWdBc1N1bW1hcnkoIlNlcGFyYXRlIEpSRSBCdWlsZDsgbGlua3MiLCBEaW1lbnNpb24uRUxBUFNFRF9QUk9DRVNTKTsKLSAgICAgICAgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigiZWNob1Byb3BlcnRpZXNTZXBWTSIpOwotICAgICAgICAvL3Bvc3NpYmxlIGZpcnN0IHRpbWUgaGl0IG9mIHRoZSBTV1QgcGllY2VzIGdldHRpbmcgd3JpdHRlbiBmcm9tIHRoZSBKQVIgdG8gdGhlIAotICAgICAgICAvL21ldGFkYXRhIGFyZWEKLSAgICAgICAgbGF1bmNoQW5kVGVybWluYXRlKGNvbmZpZywgMjAwMDApOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLSAgICAgICAgICAgIGxhdW5jaChjb25maWcsIDEwKTsKLSAgICAgICAgfQotICAgICAgICBjb21taXRNZWFzdXJlbWVudHMoKTsKLSAgICAgICAgYXNzZXJ0UGVyZm9ybWFuY2UoKTsKLSAgICB9ICAgCi19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL2Fib3V0Lmh0bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvYnVpbGQucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNlMDQyZC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgdGVzdGJ1aWxkZmlsZXMvLFwKLSAgICAgICAgICAgICAgIGxpYi8sXAotICAgICAgICAgICAgICAgbGliLyouamFyLFwKLSAgICAgICAgICAgICAgICouamFyLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotICAgICAgICAgICAgICAgCi1zb3VyY2UuYW50dGVzdHN1aS5qYXIgPSB0ZXN0IHBsdWdpbi8sXAotICAgICAgICAgICAgICAgICAgICAgICAgQW50IEVkaXRvciBUZXN0cy8sXAotICAgICAgICAgICAgICAgICAgICAgICAgQW50IERlYnVnIFRlc3RzLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCBUb29scy8sXAotICAgICAgICAgICAgICAgICAgICAgICAgQW50IFRlc3RzLwotCQkJCQkJCi1zb3VyY2UubGliL2FudFVJVGVzdHNTdXBwb3J0LmphciA9IHRlc3Qgc3VwcG9ydC8KLWphcnMuY29tcGlsZS5vcmRlcj1hbnR0ZXN0c3VpLmphcixsaWIvYW50VUlUZXN0c1N1cHBvcnQuamFyCi1vdXRwdXQubGliL2FudFVJVGVzdHNTdXBwb3J0LmphciA9IHRlc3Rfc3VwcG9ydF9iaW4vCi1vdXRwdXQuYW50dGVzdHN1aS5qYXIgPSBiaW4vCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL2J1aWxkZmlsZXMvYnVpbGRBbnRUZXN0c1N1cHBvcnRKQVIueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9idWlsZGZpbGVzL2J1aWxkQW50VGVzdHNTdXBwb3J0SkFSLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRlNTEyNy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL2J1aWxkZmlsZXMvYnVpbGRBbnRUZXN0c1N1cHBvcnRKQVIueG1sCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9pY29ucy9hbnQuZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9pY29ucy9hbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGEzNjVjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvaWNvbnMvYW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTA4ZTA3Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPUFudCBVSSBUZXN0IFBsdWdpbgotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3BsdWdpbi54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MTk2MWYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9BYnN0cmFjdEFudFVJVGVzdC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9BYnN0cmFjdEFudFVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmNjODM5Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vQWJzdHJhY3RBbnRVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwMywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiAgQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS50ZXN0cGx1Z2luOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5zdXBwb3J0LlRlc3RMb2NhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3Iuc3VwcG9ydC5UZXN0UHJvYmxlbVJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwuSUV4dGVybmFsVG9vbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNvbnNvbGUuQ29uc29sZUh5cGVybGlua1Bvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNvbnNvbGUuSU9Db25zb2xlUGFydGl0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIEFic3RyYWN0IEFudCBVSSB0ZXN0IGNsYXNzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFudFVJVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBTlRfRURJVE9SX0lEPSAib3JnLmVjbGlwc2UuYW50LnVpLmludGVybmFsLmVkaXRvci5BbnRFZGl0b3IiOwotICAgIAotICAgIHByaXZhdGUgSURvY3VtZW50IGN1cnJlbnREb2N1bWVudDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgQWJzdHJhY3RBbnRVSVRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgICAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSUZpbGV9IGZvciB0aGUgZ2l2ZW4gYnVpbGQgZmlsZSBuYW1lCi0gICAgICogQHBhcmFtIGJ1aWxkRmlsZU5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSBhc3NvY2lhdGVkIHtAbGluayBJRmlsZX0gZm9yIHRoZSBnaXZlbiBidWlsZCBmaWxlIG5hbWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgSUZpbGUgZ2V0SUZpbGUoU3RyaW5nIGJ1aWxkRmlsZU5hbWUpIHsKLSAgICAgICAgcmV0dXJuIGdldFByb2plY3QoKS5nZXRGb2xkZXIoImJ1aWxkZmlsZXMiKS5nZXRGaWxlKGJ1aWxkRmlsZU5hbWUpOyAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIEZpbGV9IGZvciB0aGUgZ2l2ZW4gYnVpbGQgZmlsZSBuYW1lCi0gICAgICogQHBhcmFtIGJ1aWxkRmlsZU5hbWUKLSAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgRmlsZX0gZm9yIHRoZSBnaXZlbiBidWlsZCBmaWxlIG5hbWUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRmlsZSBnZXRCdWlsZEZpbGUoU3RyaW5nIGJ1aWxkRmlsZU5hbWUpIHsKLSAgICAgICAgSUZpbGUgZmlsZSA9IGdldElGaWxlKGJ1aWxkRmlsZU5hbWUpOwotICAgICAgICBhc3NlcnRUcnVlKCJDb3VsZCBub3QgZmluZCBidWlsZCBmaWxlIG5hbWVkOiAiICsgYnVpbGRGaWxlTmFtZSwgZmlsZS5leGlzdHMoKSk7Ci0gICAgICAgIHJldHVybiBmaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCk7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJc3VwZXIuc2V0VXAoKTsKLSAgICAJYXNzZXJ0UHJvamVjdCgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRlc3RpbmcgcHJvamVjdCBoYXMgYmVlbiBzZXR1cCBpbiB0aGUgdGVzdCB3b3Jrc3BhY2UKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0UHJvamVjdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm8gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoUHJvamVjdEhlbHBlci5QUk9KRUNUX05BTUUpOwotCQlpZiAoIXByby5leGlzdHMoKSkgewotCQkJLy8gY3JlYXRlIHByb2plY3QgYW5kIGltcG9ydCBidWlsZCBmaWxlcyBhbmQgc3VwcG9ydCBmaWxlcwotCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RIZWxwZXIuY3JlYXRlUHJvamVjdChQcm9qZWN0SGVscGVyLlBST0pFQ1RfTkFNRSk7Ci0JCQlJRm9sZGVyIGZvbGRlciA9IFByb2plY3RIZWxwZXIuYWRkRm9sZGVyKHByb2plY3QsICJidWlsZGZpbGVzIik7Ci0JCQlQcm9qZWN0SGVscGVyLmFkZEZvbGRlcihwcm9qZWN0LCAibGF1bmNoQ29uZmlndXJhdGlvbnMiKTsKLQkJCUZpbGUgcm9vdCA9IEFudFVJVGVzdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RmlsZUluUGx1Z2luKFByb2plY3RIZWxwZXIuVEVTVF9CVUlMREZJTEVTX0RJUik7Ci0JCQlQcm9qZWN0SGVscGVyLmltcG9ydEZpbGVzRnJvbURpcmVjdG9yeShyb290LCBmb2xkZXIuZ2V0RnVsbFBhdGgoKSwgbnVsbCk7Ci0JCQkKLQkJCVByb2plY3RIZWxwZXIuY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbkZvckJvdGgoImVjaG9pbmciKTsKLQkJCVByb2plY3RIZWxwZXIuY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbkZvckJvdGgoIjEwMjI4MiIpOwotCQkJUHJvamVjdEhlbHBlci5jcmVhdGVMYXVuY2hDb25maWd1cmF0aW9uRm9yQm90aCgiNzQ4NDAiKTsKLSAgICAgICAgICAgIFByb2plY3RIZWxwZXIuY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbkZvckJvdGgoImZhaWxpbmdUYXJnZXQiKTsKLQkJCVByb2plY3RIZWxwZXIuY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbigiYnVpbGQiKTsKLQkJCVByb2plY3RIZWxwZXIuY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbigiYmFkIik7Ci0JCQlQcm9qZWN0SGVscGVyLmNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb24oImltcG9ydFJlcXVpcmluZ1VzZXJQcm9wIik7Ci0gICAgICAgICAgICBQcm9qZWN0SGVscGVyLmNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb25Gb3JTZXBhcmF0ZVZNKCJlY2hvUHJvcGVydGllc1NlcFZNIiwgImVjaG9Qcm9wZXJ0aWVzIik7Ci0JCQlQcm9qZWN0SGVscGVyLmNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb25Gb3JTZXBhcmF0ZVZNKCJleHRlbnNpb25Qb2ludFNlcFZNIiwgbnVsbCk7Ci0JCQlQcm9qZWN0SGVscGVyLmNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb25Gb3JTZXBhcmF0ZVZNKCJleHRlbnNpb25Qb2ludFRhc2tTZXBWTSIsIG51bGwpOwotCQkJUHJvamVjdEhlbHBlci5jcmVhdGVMYXVuY2hDb25maWd1cmF0aW9uRm9yU2VwYXJhdGVWTSgiZXh0ZW5zaW9uUG9pbnRUeXBlU2VwVk0iLCBudWxsKTsKLQkJCVByb2plY3RIZWxwZXIuY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbkZvclNlcGFyYXRlVk0oImlucHV0IiwgbnVsbCk7Ci0JCQlQcm9qZWN0SGVscGVyLmNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb25Gb3JTZXBhcmF0ZVZNKCJlbnZpcm9ubWVudFZhciIsIG51bGwpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBQcm9qZWN0SGVscGVyLmNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb25Gb3JCb3RoKCJicmVha3BvaW50cyIpOwotICAgICAgICAgICAgUHJvamVjdEhlbHBlci5jcmVhdGVMYXVuY2hDb25maWd1cmF0aW9uRm9yQm90aCgiZGVidWdBbnRDYWxsIik7Ci0gICAgICAgICAgICBQcm9qZWN0SGVscGVyLmNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb25Gb3JCb3RoKCI5NjAyMiIpOwotICAgICAgICAgICAgUHJvamVjdEhlbHBlci5jcmVhdGVMYXVuY2hDb25maWd1cmF0aW9uRm9yQm90aCgibWFjcm9kZWYiKTsKLSAgICAgICAgICAgIFByb2plY3RIZWxwZXIuY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbkZvckJvdGgoIjg1NzY5Iik7Ci0JCQkKLQkJCVByb2plY3RIZWxwZXIuY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbigiYmlnIiwgUHJvamVjdEhlbHBlci5QUk9KRUNUX05BTUUgKyAiL2J1aWxkZmlsZXMvcGVyZm9ybWFuY2UvYnVpbGQueG1sIik7Ci0JCQkKLQkJCS8vZG8gbm90IHNob3cgdGhlIEFudCBidWlsZCBmYWlsZWQgZXJyb3IgZGlhbG9nCi0JCQlBbnRVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSUFudFVJUHJlZmVyZW5jZUNvbnN0YW50cy5BTlRfRVJST1JfRElBTE9HLCBmYWxzZSk7Ci0JCX0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSAnQW50VUlUZXN0cycgcHJvamVjdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0ZXN0IHByb2plY3QKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoUHJvamVjdEhlbHBlci5QUk9KRUNUX05BTUUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHtAbGluayBJRG9jdW1lbnR9IGZvciB0aGUgZ2l2ZW4gZmlsZSBuYW1lCi0gICAgICogQHBhcmFtIGZpbGVOYW1lCi0gICAgICogQHJldHVybiB0aGUgdW5kZXJseWluZyB7QGxpbmsgSURvY3VtZW50fSBmb3IgdGhlIGdpdmVuIGZpbGUgbmFtZQotICAgICAqLwotICAgIHByb3RlY3RlZCBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoU3RyaW5nIGZpbGVOYW1lKSB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IGdldEJ1aWxkRmlsZShmaWxlTmFtZSk7Ci0gICAgICAgIElucHV0U3RyZWFtIGluOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGluaXRpYWxDb250ZW50PSBnZXRTdHJlYW1Db250ZW50QXNTdHJpbmcoaW4pOwotICAgICAgICByZXR1cm4gbmV3IERvY3VtZW50KGluaXRpYWxDb250ZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4ge0BsaW5rIElucHV0U3RyZWFtfSBhcyBhIHtAbGluayBTdHJpbmd9Ci0gICAgICogQHBhcmFtIGlucHV0U3RyZWFtCi0gICAgICogQHJldHVybiB0aGUge0BsaW5rIElucHV0U3RyZWFtfSBhcyBhIHtAbGluayBTdHJpbmd9Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJlYW1Db250ZW50QXNTdHJpbmcoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLSAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgcmVhZGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtLCBSZXNvdXJjZXNQbHVnaW4uZ2V0RW5jb2RpbmcoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQW50VUlQbHVnaW4ubG9nKGUpOwotICAgICAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgdGVtcEJ1ZmZlcmVkUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHJlYWRlcik7Ci0KLSAgICAgICAgcmV0dXJuIGdldFJlYWRlckNvbnRlbnRBc1N0cmluZyh0ZW1wQnVmZmVyZWRSZWFkZXIpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4ge0BsaW5rIEJ1ZmZlcmVkUmVhZGVyfSBhcyBhIHtAbGluayBTdHJpbmd9Ci0gICAgICogQHBhcmFtIGJ1ZmZlcmVkUmVhZGVyCi0gICAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIHtAbGluayBCdWZmZXJlZFJlYWRlcn0gYXMgYSB7QGxpbmsgU3RyaW5nfQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVhZGVyQ29udGVudEFzU3RyaW5nTmV3KEJ1ZmZlcmVkUmVhZGVyIGJ1ZmZlcmVkUmVhZGVyKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjaGFyW10gcmVhZEJ1ZmZlcj0gbmV3IGNoYXJbMjA0OF07Ci0gICAgICAgICAgICBpbnQgbj0gYnVmZmVyZWRSZWFkZXIucmVhZChyZWFkQnVmZmVyKTsKLSAgICAgICAgICAgIHdoaWxlIChuID4gMCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocmVhZEJ1ZmZlciwgMCwgbik7Ci0gICAgICAgICAgICAgICAgbj0gYnVmZmVyZWRSZWFkZXIucmVhZChyZWFkQnVmZmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQW50VUlQbHVnaW4ubG9nKGUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiB7QGxpbmsgQnVmZmVyZWRSZWFkZXJ9IGFzIGEge0BsaW5rIFN0cmluZ30KLSAgICAgKiBAcGFyYW0gYnVmZmVyZWRSZWFkZXIKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4ge0BsaW5rIEJ1ZmZlcmVkUmVhZGVyfSBhcyBhIHtAbGluayBTdHJpbmd9Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZWFkZXJDb250ZW50QXNTdHJpbmcoQnVmZmVyZWRSZWFkZXIgYnVmZmVyZWRSZWFkZXIpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBsaW5lPSBidWZmZXJlZFJlYWRlci5yZWFkTGluZSgpOwotCi0gICAgICAgICAgICB3aGlsZShsaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZihyZXN1bHQubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChsaW5lKTsKLSAgICAgICAgICAgICAgICBsaW5lID0gYnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQW50VUlQbHVnaW4ubG9nKGUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotICAgICAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQW50TW9kZWx9IGZvciB0aGUgZ2l2ZW4gZmlsZSBuYW1lCi0gICAgICogQHBhcmFtIGZpbGVOYW1lCi0gICAgICogQHJldHVybiB0aGUge0BsaW5rIEFudE1vZGVsfSBmb3IgdGhlIGdpdmVuIGZpbGUgbmFtZQotICAgICAqLwotICAgIHByb3RlY3RlZCBBbnRNb2RlbCBnZXRBbnRNb2RlbChTdHJpbmcgZmlsZU5hbWUpIHsKLSAgICAgICAgY3VycmVudERvY3VtZW50PSBnZXREb2N1bWVudChmaWxlTmFtZSk7Ci0gICAgICAgIEFudE1vZGVsIG1vZGVsPSBuZXcgQW50TW9kZWwoY3VycmVudERvY3VtZW50LCBuZXcgVGVzdFByb2JsZW1SZXF1ZXN0b3IoKSwgbmV3IFRlc3RMb2NhdGlvblByb3ZpZGVyKGdldEJ1aWxkRmlsZShmaWxlTmFtZSkpKTsKLSAgICAgICAgbW9kZWwucmVjb25jaWxlKCk7Ci0gICAgICAgIHJldHVybiBtb2RlbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudCB7QGxpbmsgSURvY3VtZW50fSBjb250ZXh0Ci0gICAgICovCi0gICAgcHVibGljIElEb2N1bWVudCBnZXRDdXJyZW50RG9jdW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50RG9jdW1lbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWxsb3dzIHRoZSBjdXJyZW50IHtAbGluayBJRG9jdW1lbnR9IGNvbnRleHQgdG8gYmUgc2V0LiBUaGlzIG1ldGhvZCBhY2NlcHRzIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICogQHBhcmFtIGN1cnJlbnREb2N1bWVudAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnREb2N1bWVudChJRG9jdW1lbnQgY3VycmVudERvY3VtZW50KSB7Ci0gICAgICAgIHRoaXMuY3VycmVudERvY3VtZW50ID0gY3VycmVudERvY3VtZW50OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBMYXVuY2hlcyB0aGUgQW50IGJ1aWxkIHdpdGggdGhlIGJ1aWxkIGZpbGUgbmFtZSAobm8gZXh0ZW5zaW9uKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnVpbGRGaWxlTmFtZSB0aGUgYW50IGJ1aWxkIGZpbGUgbmFtZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGxhdW5jaChTdHJpbmcgYnVpbGRGaWxlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRMYXVuY2hDb25maWd1cmF0aW9uKGJ1aWxkRmlsZU5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKCJDb3VsZCBub3QgbG9jYXRlIGxhdW5jaCBjb25maWd1cmF0aW9uIGZvciAiICsgYnVpbGRGaWxlTmFtZSwgY29uZmlnKTsKLSAgICAgICAgbGF1bmNoQW5kVGVybWluYXRlKGNvbmZpZywgMjAwMDApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBMYXVuY2hlcyB0aGUgQW50IGJ1aWxkIHdpdGggdGhlIGJ1aWxkIGZpbGUgbmFtZSAobm8gZXh0ZW5zaW9uKS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnVpbGRGaWxlTmFtZSB0aGUgYnVpbGQgZmlsZQotICAgICAqIEBwYXJhbSBhcmd1bWVudHMgdGhlIGFudCBhcmd1bWVudHMKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsYXVuY2goU3RyaW5nIGJ1aWxkRmlsZU5hbWUsIFN0cmluZyBhcmd1bWVudHMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbihidWlsZEZpbGVOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ291bGQgbm90IGxvY2F0ZSBsYXVuY2ggY29uZmlndXJhdGlvbiBmb3IgIiArIGJ1aWxkRmlsZU5hbWUsIGNvbmZpZyk7Ci0gICAgICAgIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29weT0gY29uZmlnLmdldFdvcmtpbmdDb3B5KCk7Ci0gICAgICAgIGNvcHkuc2V0QXR0cmlidXRlKElFeHRlcm5hbFRvb2xDb25zdGFudHMuQVRUUl9UT09MX0FSR1VNRU5UUywgYXJndW1lbnRzKTsKLSAgICAgICAgbGF1bmNoQW5kVGVybWluYXRlKGNvcHksIDIwMDAwKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgKiBMYXVuY2hlcyB0aGUgQW50IGJ1aWxkIGluIGRlYnVnIG91dHB1dCBtb2RlIHdpdGggdGhlIGJ1aWxkIGZpbGUgbmFtZSAobm8gZXh0ZW5zaW9uKS4KLSAgICAqIAotICAgICogQHBhcmFtIG1haW5UeXBlTmFtZSB0aGUgcHJvZ3JhbSB0byBsYXVuY2gKLSAgICAqIEByZXR1cm4gdGhyZWFkIGluIHdoaWNoIHRoZSBmaXJzdCBzdXNwZW5kIGV2ZW50IG9jY3VycmVkCi0gICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsYXVuY2hXaXRoRGVidWcoU3RyaW5nIGJ1aWxkRmlsZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbihidWlsZEZpbGVOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ291bGQgbm90IGxvY2F0ZSBsYXVuY2ggY29uZmlndXJhdGlvbiBmb3IgIiArIGJ1aWxkRmlsZU5hbWUsIGNvbmZpZyk7Ci0gICAgICAgIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29weT0gY29uZmlnLmdldFdvcmtpbmdDb3B5KCk7Ci0gICAgICAgIGNvcHkuc2V0QXR0cmlidXRlKElFeHRlcm5hbFRvb2xDb25zdGFudHMuQVRUUl9UT09MX0FSR1VNRU5UUywgIi1kZWJ1ZyIpOwotICAgICAgICBsYXVuY2hBbmRUZXJtaW5hdGUoY29weSwgMTAwMDApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBmb3IgdGhlIGdpdmVuIGJ1aWxkIGZpbGUKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYnVpbGRGaWxlTmFtZSBidWlsZCBmaWxlIHRvIGxhdW5jaAotICAgICAqIEBzZWUgUHJvamVjdENyZWF0aW9uRGVjb3JhdG9yCi0gICAgICovCi0gICAgcHJvdGVjdGVkIElMYXVuY2hDb25maWd1cmF0aW9uIGdldExhdW5jaENvbmZpZ3VyYXRpb24oU3RyaW5nIGJ1aWxkRmlsZU5hbWUpIHsKLSAgICAgICAgSUZpbGUgZmlsZSA9IGdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldEZvbGRlcigibGF1bmNoQ29uZmlndXJhdGlvbnMiKS5nZXRGaWxlKGJ1aWxkRmlsZU5hbWUgKyAiLmxhdW5jaCIpOwotICAgICAgICBJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRMYXVuY2hNYW5hZ2VyKCkuZ2V0TGF1bmNoQ29uZmlndXJhdGlvbihmaWxlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ291bGQgbm90IGZpbmQgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZm9yICIgKyBidWlsZEZpbGVOYW1lLCBjb25maWcuZXhpc3RzKCkpOwotICAgICAgICByZXR1cm4gY29uZmlnOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgb2YgdGhlIHNwZWNpZmllZCBmaWxlIGFzIDxjb2RlPlN0cmluZzwvY29kZT4uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlQ29udGVudEFzU3RyaW5nKEZpbGUgYUZpbGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGFGaWxlKTsKLSAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHN0cmVhbSk7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJ1ZmZlcmVkUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHJlYWRlcik7Ci0gICAgCi0gICAgICAgIHJldHVybiBnZXRSZWFkZXJDb250ZW50QXNTdHJpbmcoYnVmZmVyZWRSZWFkZXIpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIGEgbmV3IFNBWCBwYXJzZXIgaW5zdHJhbmNlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFNBWFBhcnNlciBnZXRTQVhQYXJzZXIoKSB7Ci0gICAgICAgIFNBWFBhcnNlciBwYXJzZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGFyc2VyID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1NBWFBhcnNlcigpOwotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFudFVJUGx1Z2luLmxvZyhlKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFudFVJUGx1Z2luLmxvZyhlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFyc2VyOwotICAgIH0KLQotICAgIAotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtIHdpdGggdGhlIGdpdmVuIHBhcnNlciB1c2luZyB0aGUgZ2l2ZW4gaGFuZGxlcgotICAgICAqIEBwYXJhbSBzdHJlYW0KLSAgICAgKiBAcGFyYW0gcGFyc2VyCi0gICAgICogQHBhcmFtIGhhbmRsZXIKLSAgICAgKiBAcGFyYW0gZWRpdGVkRmlsZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlKElucHV0U3RyZWFtIHN0cmVhbSwgU0FYUGFyc2VyIHBhcnNlciwgRGVmYXVsdEhhbmRsZXIgaGFuZGxlciwgRmlsZSBlZGl0ZWRGaWxlKSB7Ci0gICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlPSBuZXcgSW5wdXRTb3VyY2Uoc3RyZWFtKTsKLSAgICAgICAgaWYgKGVkaXRlZEZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgLy9uZWVkZWQgZm9yIHJlc29sdmluZyByZWxhdGl2ZSBleHRlcm5hbCBlbnRpdGllcwotICAgICAgICAgICAgaW5wdXRTb3VyY2Uuc2V0U3lzdGVtSWQoZWRpdGVkRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGFyc2VyLnBhcnNlKGlucHV0U291cmNlLCBoYW5kbGVyKTsKLSAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxhdW5jaCBtYW5hZ2VyCi0gICAgICogCi0gICAgICogQHJldHVybiBsYXVuY2ggbWFuYWdlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUxhdW5jaE1hbmFnZXIgZ2V0TGF1bmNoTWFuYWdlcigpIHsKLSAgICAgICAgcmV0dXJuIERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXVuY2hNYW5hZ2VyKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlICdBbnRVSVRlc3RzJyBwcm9qZWN0LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHRlc3QgcHJvamVjdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gSmF2YUNvcmUuY3JlYXRlKCBnZXRQcm9qZWN0KCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBMYXVuY2hlcyB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBhbmQgd2FpdHMgZm9yIHRoZSB0ZXJtaW5hdGVkIGV2ZW50IG9yIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuIHRpbWVvdXQsIAotICAgICAqIHdoaWNoZXZlciBjb21lcyBmaXJzdCAKLSAgICAgKiBAcGFyYW0gY29uZmlnCi0gICAgICogQHBhcmFtIHRpbWVvdXQKLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBsYXVuY2hBbmRUZXJtaW5hdGUoSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnLCBpbnQgdGltZW91dCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBEZWJ1Z0V2ZW50V2FpdGVyIHdhaXRlcj0gbmV3IERlYnVnRWxlbWVudEtpbmRFdmVudFdhaXRlcihEZWJ1Z0V2ZW50LlRFUk1JTkFURSwgSVByb2Nlc3MuY2xhc3MpOwotICAgICAgICB3YWl0ZXIuc2V0VGltZW91dCh0aW1lb3V0KTsKLQotICAgICAgICBPYmplY3QgdGVybWluYXRlZSA9IGxhdW5jaEFuZFdhaXQoY29uZmlnLCB3YWl0ZXIpOyAgICAgIAotICAgICAgICBhc3NlcnROb3ROdWxsKCJQcm9ncmFtIGRpZCBub3QgdGVybWluYXRlLiIsIHRlcm1pbmF0ZWUpOwotICAgICAgICBhc3NlcnRUcnVlKCJ0ZXJtaW5hdGVlIGlzIG5vdCBhbiBJUHJvY2VzcyIsIHRlcm1pbmF0ZWUgaW5zdGFuY2VvZiBJUHJvY2Vzcyk7Ci0gICAgICAgIElQcm9jZXNzIHByb2Nlc3MgPSAoSVByb2Nlc3MpIHRlcm1pbmF0ZWU7Ci0gICAgICAgIGJvb2xlYW4gdGVybWluYXRlZCA9IHByb2Nlc3MuaXNUZXJtaW5hdGVkKCk7Ci0gICAgICAgIGFzc2VydFRydWUoInByb2Nlc3MgaXMgbm90IHRlcm1pbmF0ZWQiLCB0ZXJtaW5hdGVkKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogTGF1bmNoZXMgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gYW5kIHdhaXRzIGZvciBhbiBldmVudC4gUmV0dXJucyB0aGUKLSAgICAgKiBzb3VyY2Ugb2YgdGhlIGV2ZW50LiBJZiB0aGUgZXZlbnQgaXMgbm90IHJlY2VpdmVkLCB0aGUgbGF1bmNoIGlzCi0gICAgICogdGVybWluYXRlZCBhbmQgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiB0aGUgY29uZmlndXJhdGlvbiB0byBsYXVuY2gKLSAgICAgKiBAcGFyYW0gd2FpdGVyIHRoZSBldmVudCB3YWl0ZXIgdG8gdXNlCi0gICAgICogQHJldHVybiBPYmplY3QgdGhlIHNvdXJjZSBvZiB0aGUgZXZlbnQKLSAgICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiB0aGUgZXZlbnQgaXMgbmV2ZXIgcmVjZWl2ZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBsYXVuY2hBbmRXYWl0KElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIERlYnVnRXZlbnRXYWl0ZXIgd2FpdGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElMYXVuY2ggbGF1bmNoID0gY29uZmlndXJhdGlvbi5sYXVuY2goSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG51bGwpOwotICAgICAgICBPYmplY3Qgc3VzcGVuZGVlPSB3YWl0ZXIud2FpdEZvckV2ZW50KCk7Ci0gICAgICAgIGlmIChzdXNwZW5kZWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBsYXVuY2gudGVybWluYXRlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIGZhaWwoIlByb2dyYW0gZGlkIG5vdCBzdXNwZW5kLCBhbmQgdW5hYmxlIHRvIHRlcm1pbmF0ZSBsYXVuY2guIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiUHJvZ3JhbSBkaWQgbm90IHN1c3BlbmQsIGxhdW5jaCB0ZXJtaW5hdGVkLiIsIHN1c3BlbmRlZSk7Ci0gICAgICAgIGJvb2xlYW4gdGVybWluYXRlZCA9IGxhdW5jaC5pc1Rlcm1pbmF0ZWQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgibGF1bmNoIGRpZCBub3QgdGVybWluYXRlIiwgdGVybWluYXRlZCk7Ci0gICAgICAgIGlmICh0ZXJtaW5hdGVkICYmICFDb25zb2xlTGluZVRyYWNrZXIuaXNDbG9zZWQoKSkgewotICAgICAgICAgICAgQ29uc29sZUxpbmVUcmFja2VyLndhaXRGb3JDb25zb2xlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ29uc29sZSBpcyBub3QgY2xvc2VkIiwgQ29uc29sZUxpbmVUcmFja2VyLmlzQ2xvc2VkKCkpOyAKLSAgICAgICAgcmV0dXJuIHN1c3BlbmRlZTsgICAgICAgCi0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBJSHlwZXJsaW5rfSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IG9uIHRoZSBnaXZlbiBkb2N1bWVudCwKLSAgICAgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyB7QGxpbmsgSUh5cGVybGlua30gYXQgdGhhdCBvZmZzZXQgb24gdGhlIGRvY3VtZW50LgotICAgICAqIEBwYXJhbSBvZmZzZXQKLSAgICAgKiBAcGFyYW0gZG9jCi0gICAgICogQHJldHVybiB0aGUge0BsaW5rIElIeXBlcmxpbmt9IGF0IHRoZSBnaXZlbiBvZmZzZXQgb24gdGhlIGdpdmVuIGRvY3VtZW50IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIElIeXBlcmxpbmsgZ2V0SHlwZXJsaW5rKGludCBvZmZzZXQsIElEb2N1bWVudCBkb2MpIHsKLSAgICAgICAgaWYgKG9mZnNldCA+PSAwICYmIGRvYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBQb3NpdGlvbltdIHBvc2l0aW9ucyA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHBvc2l0aW9ucyA9IGRvYy5nZXRQb3NpdGlvbnMoQ29uc29sZUh5cGVybGlua1Bvc2l0aW9uLkhZUEVSX0xJTktfQ0FURUdPUlkpOwotICAgICAgICAgICAgfSBjYXRjaCAoQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIC8vIG5vIGxpbmtzIGhhdmUgYmVlbiBhZGRlZAotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQb3NpdGlvbiBwb3NpdGlvbiA9IHBvc2l0aW9uc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IHBvc2l0aW9uLmdldE9mZnNldCgpICYmIG9mZnNldCA8PSAocG9zaXRpb24uZ2V0T2Zmc2V0KCkgKyBwb3NpdGlvbi5nZXRMZW5ndGgoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQ29uc29sZUh5cGVybGlua1Bvc2l0aW9uKXBvc2l0aW9uKS5nZXRIeXBlckxpbmsoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBDb2xvcn0gYXQgdGhlIGdpdmVuIG9mZnNldCBvbiB0aGUgZ2l2ZW4gZG9jdW1lbnQsCi0gICAgICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8ge0BsaW5rIENvbG9yfSBhdCB0aGF0IG9mZnNldCBvbiB0aGUgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIG9mZnNldAotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgQ29sb3J9IGF0IHRoZSBnaXZlbiBvZmZzZXQgb24gdGhlIGdpdmVuIGRvY3VtZW50IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0gICAgICovCi0gICAgcHJvdGVjdGVkIENvbG9yIGdldENvbG9yQXRPZmZzZXQoaW50IG9mZnNldCwgSURvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgSURvY3VtZW50UGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSBkb2N1bWVudC5nZXREb2N1bWVudFBhcnRpdGlvbmVyKCk7Ci0gICAgICAgICAgICBpZiAocGFydGl0aW9uZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElUeXBlZFJlZ2lvbltdIHJlZ2lvbnM9IHBhcnRpdGlvbmVyLmNvbXB1dGVQYXJ0aXRpb25pbmcob2Zmc2V0LCBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChvZmZzZXQpLmdldExlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICBpZiAocmVnaW9ucy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIElPQ29uc29sZVBhcnRpdGlvbiBwYXJ0aXRpb24gPSAoSU9Db25zb2xlUGFydGl0aW9uKXJlZ2lvbnNbMF07Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0aXRpb24uZ2V0Q29sb3IoKTsKLSAgICAgICAgICAgICAgICB9ICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vQW50VUlQZXJmb3JtYW5jZVRlc3RzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL0FudFVJUGVyZm9ybWFuY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTlkYTY0Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vQW50VUlQZXJmb3JtYW5jZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiAgQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW47Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5wZXJmb3JtYW5jZS5PcGVuQW50RWRpdG9yVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkucGVyZm9ybWFuY2UuU2VwYXJhdGVWTVRlc3RzOwotCi0vKioKLSAqIFBlcmZvcm1hbmNlIFRlc3Qgc3VpdGUgZm9yIHRoZSBBbnQgVUkuCi0gKiBBbGwgb2YgdGhlIHRlc3RzIGluIHRoaXMgc3VpdGUgcmVseSBvbiB0aGUgc2V0dXAgdGhhdCBvY2N1cnMgaW4gdGhlIAotICogUHJvamVjdENyZWF0aW9uRGVjb3JhdG9yIHN1aXRlLiBJdCBtdXN0IGFsd2F5cyBydW4gYmVmb3JlIGFueSBvZiB0aGUgb3RoZXIKLSAqIHRlc3Qgc3VpdGVzLgotICovCi1wdWJsaWMgY2xhc3MgQW50VUlQZXJmb3JtYW5jZVRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgQW50VUlQZXJmb3JtYW5jZVRlc3RzKCk7Ci0gICAgICAgIHN1aXRlLnNldE5hbWUoIkFudCBVSSBQZXJmb3JtYW5jZSBVbml0IFRlc3RzIik7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShPcGVuQW50RWRpdG9yVGVzdC5jbGFzcykpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoU2VwYXJhdGVWTVRlc3RzLmNsYXNzKSk7Ci0JCS8vc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKE5vbkluaXRpYWxUeXBpbmdUZXN0LmNsYXNzKSk7Ci0JCS8vc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKE9wZW5MYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nVGVzdHMuY2xhc3MpKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vQW50VUlUZXN0UGx1Z2luLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL0FudFVJVGVzdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQyOTc1Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vQW50VUlUZXN0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW47Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotcHVibGljIGNsYXNzIEFudFVJVGVzdFBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCQotCXByaXZhdGUgc3RhdGljIEFudFVJVGVzdFBsdWdpbiBkZWZsdDsKLQkKLQlwdWJsaWMgQW50VUlUZXN0UGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlkZWZsdD0gdGhpczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBBbnRVSVRlc3RQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIGRlZmx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZW5hYmxlQXV0b2J1aWxkKGJvb2xlYW4gZW5hYmxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRpc2FibGUgYXV0byBidWlsZAotCQlJV29ya3NwYWNlIHdvcmtzcGFjZT0gQW50VUlUZXN0UGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJV29ya3NwYWNlRGVzY3JpcHRpb24gZGVzYz0gd29ya3NwYWNlLmdldERlc2NyaXB0aW9uKCk7Ci0JCWRlc2Muc2V0QXV0b0J1aWxkaW5nKGVuYWJsZSk7Ci0JCXdvcmtzcGFjZS5zZXREZXNjcmlwdGlvbihkZXNjKTsKLQl9Ci0JCi0JcHVibGljIEZpbGUgZ2V0RmlsZUluUGx1Z2luKElQYXRoIHBhdGgpIHsKLQkJdHJ5IHsKLQkJCUJ1bmRsZSBidW5kbGUgPSBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCk7Ci0JCQlVUkwgaW5zdGFsbFVSTD0gbmV3IFVSTChidW5kbGUuZ2V0RW50cnkoIi8iKSwgcGF0aC50b1N0cmluZygpKTsKLQkJCVVSTCBsb2NhbFVSTD0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKGluc3RhbGxVUkwpOwotCQkJcmV0dXJuIG5ldyBGaWxlKGxvY2FsVVJMLmdldEZpbGUoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9Db25zb2xlTGluZVRyYWNrZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vQ29uc29sZUxpbmVUcmFja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMWNmYzQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9Db25zb2xlTGluZVRyYWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS50ZXN0cGx1Z2luOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZUxpbmVUcmFja2VyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotCi0vKioKLSAqIFNpbXBsZSBjb25zb2xlIGxpbmUgdHJhY2tlciBleHRlbnNpb24gcG9pbnQgdGhhdCBjb2xsZWN0cyB0aGUgbGluZXMKLSAqIGFwcGVuZGVkIHRvIHRoZSBjb25zb2xlLiAKLSAqLwotcHVibGljIGNsYXNzIENvbnNvbGVMaW5lVHJhY2tlciBpbXBsZW1lbnRzIElDb25zb2xlTGluZVRyYWNrZXJFeHRlbnNpb24gewotCQotCXByaXZhdGUgc3RhdGljIElDb25zb2xlIGNvbnNvbGU7Ci0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBsaW5lcz0gbmV3IEFycmF5TGlzdCgpOyAKLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnNvbGVDbG9zZWQ9IHRydWU7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGVMaW5lVHJhY2tlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZUxpbmVUcmFja2VyI2luaXQob3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElDb25zb2xlIGMpIHsKLQkgICAgc3luY2hyb25pemVkKGxpbmVzKSB7Ci0JICAgICAgICBDb25zb2xlTGluZVRyYWNrZXIuY29uc29sZT0gYzsKLQkgICAgICAgIGxpbmVzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICAgICAgICBjb25zb2xlQ2xvc2VkPSBmYWxzZTsKLQkgICAgfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZUxpbmVUcmFja2VyI2xpbmVBcHBlbmRlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0JcHVibGljIHZvaWQgbGluZUFwcGVuZGVkKElSZWdpb24gbGluZSkgewotCQlsaW5lcy5hZGQobGluZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgaW50IGdldE51bWJlck9mTWVzc2FnZXMoKSB7Ci0JCXJldHVybiBsaW5lcy5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IGxpbmVzLnNpemUoKSl7Ci0JCQlJUmVnaW9uIGxpbmVSZWdpb249IChJUmVnaW9uKWxpbmVzLmdldChpbmRleCk7Ci0JCQl0cnkgewotCQkJCXJldHVybiBjb25zb2xlLmdldERvY3VtZW50KCkuZ2V0KGxpbmVSZWdpb24uZ2V0T2Zmc2V0KCksIGxpbmVSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsTWVzc2FnZXMoKSB7Ci0JCUxpc3QgYWxsPSBuZXcgQXJyYXlMaXN0KGxpbmVzLnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGluZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUlSZWdpb24gbGluZVJlZ2lvbj0gKElSZWdpb24pbGluZXMuZ2V0KGkpOwotCQkJdHJ5IHsKLQkJCQlhbGwuYWRkKGNvbnNvbGUuZ2V0RG9jdW1lbnQoKS5nZXQobGluZVJlZ2lvbi5nZXRPZmZzZXQoKSwgbGluZVJlZ2lvbi5nZXRMZW5ndGgoKSkpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBhbGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gY29uc29sZS5nZXREb2N1bWVudCgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvckNvbnNvbGUoKSB7Ci0JCXN5bmNocm9uaXplZCAobGluZXMpIHsKLQkJCWlmIChjb25zb2xlQ2xvc2VkKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlsaW5lcy53YWl0KDIwMDAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb25zb2xlLklDb25zb2xlTGluZVRyYWNrZXJFeHRlbnNpb24jY29uc29sZUNsb3NlZCgpCi0JICovCi0JcHVibGljIHZvaWQgY29uc29sZUNsb3NlZCgpIHsKLQkJc3luY2hyb25pemVkIChsaW5lcykgewotCQkJY29uc29sZUNsb3NlZD0gdHJ1ZTsKLQkJCWxpbmVzLm5vdGlmeUFsbCgpOwotCQl9Ci0JfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChsaW5lcykgewotICAgICAgICAgICAgcmV0dXJuIGNvbnNvbGVDbG9zZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL0RlYnVnRWxlbWVudEtpbmRFdmVudFdhaXRlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9EZWJ1Z0VsZW1lbnRLaW5kRXZlbnRXYWl0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk0YTMyZi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL0RlYnVnRWxlbWVudEtpbmRFdmVudFdhaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFdmVudDsKLQotLyoqCi0gKiBXYWl0cyBmb3IgYSB0eXBlIG9mIGV2ZW50IG9uIGEga2luZCBvZiBlbGVtZW50LiAgQ29tcGFyZSB0aGlzIHRvIFNwZWNpZmljRGVidWdFbGVtZW50RXZlbnRXYWl0ZXIgd2hpY2ggaXMKLSAqIHVzZWQgdG8gd2FpdCBmb3IgYSB0eXBlIG9mIGV2ZW50IG9uIGEgc3BlY2lmaWMgZGVidWcgZWxlbWVudCBvYmplY3QuCi0gKi8KLQotcHVibGljIGNsYXNzIERlYnVnRWxlbWVudEtpbmRFdmVudFdhaXRlciBleHRlbmRzIERlYnVnRXZlbnRXYWl0ZXIgewotCQotCXByb3RlY3RlZCBDbGFzcyBmRWxlbWVudENsYXNzOwotCQotCXB1YmxpYyBEZWJ1Z0VsZW1lbnRLaW5kRXZlbnRXYWl0ZXIoaW50IGV2ZW50S2luZCwgQ2xhc3MgZWxlbWVudENsYXNzKSB7Ci0JCXN1cGVyKGV2ZW50S2luZCk7Ci0JCWZFbGVtZW50Q2xhc3MgPSBlbGVtZW50Q2xhc3M7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChEZWJ1Z0V2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdCBvID0gZXZlbnQuZ2V0U291cmNlKCk7Ci0JCXJldHVybiBzdXBlci5hY2NlcHQoZXZlbnQpICYmIGZFbGVtZW50Q2xhc3MuaXNJbnN0YW5jZShvKTsKLQl9Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL0RlYnVnRXZlbnRXYWl0ZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vRGVidWdFdmVudFdhaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2QyYTY4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vRGVidWdFdmVudFdhaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklEZWJ1Z0V2ZW50U2V0TGlzdGVuZXI7Ci0KLS8qKgotICogVGhlIDxjb2RlPkRlYnVnRXZlbnRXYWl0ZXI8L2NvZGU+IGlzCi0gKiB0byB3YWl0IGZvciBhIHNwZWNpZmljIGtpbmQgb2YgZGVidWcgZXZlbnQuCi0gKiA8cD4KLSAqIFdoZW4gYSA8Y29kZT5EZWJ1Z0V2ZW50V2FpdGVyPC9jb2RlPiBpcyBjcmVhdGVkLCBpdAotICogcmVnaXN0ZXJzIGl0c2VsZiB3aXRoIHRoZSA8Y29kZT5EZWJ1Z1BsdWdpbjwvY29kZT4gYXMKLSAqIGFuIDxjb2RlPklEZWJ1Z0V2ZW50U2V0TGlzdGVuZXI8L2NvZGU+LgotICogPHA+Ci0gKiBOT1RFOiA8Y29kZT5EZWJ1Z0V2ZW50V2FpdGVyPC9jb2RlPiBvYmplY3RzIGFyZSBpbnRlbmRlZCBmb3IKLSAqIG9uZSB0aW1lIHVzZSBvbmx5IQotICovCi1wdWJsaWMgY2xhc3MgRGVidWdFdmVudFdhaXRlciBpbXBsZW1lbnRzIElEZWJ1Z0V2ZW50U2V0TGlzdGVuZXIgewotCS8qKgotCSAqIFRoZSBraW5kIG9mIGV2ZW50IHRoZSB3YWl0ZXIgaXMgd2FpdGluZyBmb3IKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGZFdmVudFR5cGU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGUgd2FpdGVyIHdpbGwgd2FpdCBiZWZvcmUgdGltaW5nIG91dC4KLQkgKi8KLQlwcm90ZWN0ZWQgbG9uZyBmVGltZW91dDsKLQotCS8qKgotCSAqIFRoZSA8Y29kZT5JRGVidWdNb2RlbE1hbmFnZXI8L2NvZGU+IHRoaXMgd2FpdGVyIGlzIGxpc3RlbmluZyB0by4KLQkgKi8KLQlwcm90ZWN0ZWQgRGVidWdQbHVnaW4gZkRlYnVnUGx1Z2luOwotCi0JLyoqCi0JICogVGhlIDxjb2RlPkRlYnVnRXZlbnQ8L2NvZGU+IHJlY2VpdmVkLgotCSAqLwotCXByb3RlY3RlZCBEZWJ1Z0V2ZW50IGZFdmVudDsKLQkKLQkvKioKLQkgKiBUaGUgZXZlbnQgc2V0IHRoYXQgd2FzIGFjY2VwdGVkCi0JICovCi0JcHJvdGVjdGVkIERlYnVnRXZlbnRbXSBmRXZlbnRTZXQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB0aW1lb3V0IHZhbHVlIGlmIG5vbmUgaXMgZ2l2ZW4gKDUwMDApLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX1RJTUVPVVQ9IDUwMDA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRlYnVnRXZlbnRXYWl0ZXI8L2NvZGU+IHdoaWNoCi0JICogd2FpdHMgZm9yIGV2ZW50cyBvZiBhIGtpbmQgPGNvZGU+ZXZlbnRUeXBlPC9jb2RlPi4KLQkgKiBUaGUgd2FpdCBtZXRob2Qgd2lsbCB3YWl0IHRoZSBkZWZhdWx0IHRpbWVvdXQgdmFsdWUuCi0JICovCi0JcHVibGljIERlYnVnRXZlbnRXYWl0ZXIoaW50IGV2ZW50VHlwZSkgewotCQlmRGVidWdQbHVnaW49IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJZkV2ZW50VHlwZT0gZXZlbnRUeXBlOwotCQlmVGltZW91dD0gREVGQVVMVF9USU1FT1VUOwotCi0JCWZEZWJ1Z1BsdWdpbi5hZGREZWJ1Z0V2ZW50TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VycyB0cnVlIGlmIHRoZSA8Y29kZT5EZWJ1Z0V2ZW50PC9jb2RlPiBpcyBhY2NlcHRhYmxlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdChEZWJ1Z0V2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBldmVudC5nZXRLaW5kKCkgPT0gZkV2ZW50VHlwZSAmJiBldmVudC5nZXREZXRhaWwoKSAhPSBEZWJ1Z0V2ZW50LkVWQUxVQVRJT05fSU1QTElDSVQ7Ci0JfQotCS8qKgotCSAqIEFuc3dlcnMgdGhlIGV2ZW50IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmbGFnLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXZlbnROYW1lKGludCBmbGFnKSB7Ci0JCXN3aXRjaCAoZmxhZykgewotCQkJY2FzZSBEZWJ1Z0V2ZW50LkNSRUFURSA6Ci0JCQkJcmV0dXJuICJDcmVhdGUiOwotCQkJY2FzZSBEZWJ1Z0V2ZW50LlRFUk1JTkFURSA6Ci0JCQkJcmV0dXJuICJUZXJtaW5hdGUiOwotCQkJY2FzZSBEZWJ1Z0V2ZW50LlJFU1VNRSA6Ci0JCQkJcmV0dXJuICJSZXN1bWUiOwotCQkJY2FzZSBEZWJ1Z0V2ZW50LlNVU1BFTkQgOgotCQkJCXJldHVybiAiU3VzcGVuZCI7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gIlVOS05PV04iOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBkZWJ1ZyBldmVudHMuCi0JICoKLQkgKiBAc2VlIElEZWJ1Z0V2ZW50TGlzdGVuZXIKLQkgKiBAc2VlICNhY2NlcHQoRGVidWdFdmVudCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaGFuZGxlRGVidWdFdmVudHMoRGVidWdFdmVudFtdIGV2ZW50cykgewotCQkvL3ByaW50UmVjZWl2ZWQoZXZlbnRzKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChhY2NlcHQoZXZlbnRzW2ldKSkgewotCQkJCWZFdmVudD0gZXZlbnRzW2ldOwotCQkJCWZFdmVudFNldCA9IGV2ZW50czsKLQkJCQl1bnJlZ2lzdGVyKCk7Ci0JCQkJbm90aWZ5QWxsKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIGEgbWVzc2FnZSBpbmRpY2F0aW5nIHdoaWNoIGV2ZW50IHdhcyByZWNlaXZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmludFJlY2VpdmVkKERlYnVnRXZlbnRbXSBldmVudHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzICsiIGdvdCAiICsgZXZlbnRzW2ldKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgdGhpcyBjYWxsYmFjawotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQobG9uZyBtaWxsaXNlY29uZHMpIHsKLQkJZlRpbWVvdXQ9IG1pbGxpc2Vjb25kczsKLQl9Ci0KLQkvKioKLQkgKiBVbnJlZ2lzdGVycyB0aGlzIHdhaXRlciBhcyBhIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgdW5yZWdpc3RlcigpIHsKLQkJZkRlYnVnUGx1Z2luLnJlbW92ZURlYnVnRXZlbnRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzb3VyY2Ugb2YgdGhlIGFjY2VwdGVkIGV2ZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vIGV2ZW50IHdhcyBhY2NlcHRlZC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCB3YWl0Rm9yRXZlbnQoKSB7Ci0JCWlmIChmRXZlbnQgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl3YWl0KGZUaW1lb3V0KTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJJbnRlcnJ1cHRlZCB3YWl0aW5nIGZvciBldmVudCIpOwotCQkJfQotCQl9Ci0JCXVucmVnaXN0ZXIoKTsKLQkJaWYgKGZFdmVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBmRXZlbnQuZ2V0U291cmNlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWNjZXB0ZWQgZXZlbnQsIGlmIGFueS4KLQkgKi8KLQlwdWJsaWMgRGVidWdFdmVudCBnZXRFdmVudCgpIHsKLQkJcmV0dXJuIGZFdmVudDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWNjZXB0ZWQgZXZlbnQgc2V0LCBpZiBhbnkuCi0JICovCi0JcHVibGljIERlYnVnRXZlbnRbXSBnZXRFdmVudFNldCgpIHsKLQkJcmV0dXJuIGZFdmVudFNldDsKLQl9CQotfQotCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL1Byb2plY3RDcmVhdGlvbkRlY29yYXRvci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9Qcm9qZWN0Q3JlYXRpb25EZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M0YTI5MS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL1Byb2plY3RDcmVhdGlvbkRlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS50ZXN0cGx1Z2luOwotCi0KLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0Q3JlYXRpb25EZWNvcmF0b3IgewotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZmdJc0oyU0UxNUNvbXBhdGlibGUgPSBmYWxzZSA7Ci0JCi0Jc3RhdGljIHsKLQkJU3RyaW5nIHZlcnNpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuc3BlY2lmaWNhdGlvbi52ZXJzaW9uIik7Ci0JCWlmICh2ZXJzaW9uICE9IG51bGwpIHsKLQkJCVN0cmluZ1tdIG51bXMgPSB2ZXJzaW9uLnNwbGl0KCJcXC4iKTsKLQkJCWlmIChudW1zLmxlbmd0aCA9PSAyKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW50IG1ham9yID0gSW50ZWdlci5wYXJzZUludChudW1zWzBdKTsKLQkJCQkJaW50IG1pbm9yID0gSW50ZWdlci5wYXJzZUludChudW1zWzFdKTsKLQkJCQkJaWYgKG1ham9yID49IDEpIHsKLQkJCQkJCWlmIChtaW5vciA+PSA1KSB7Ci0JCQkJCQkJZmdJc0oyU0UxNUNvbXBhdGlibGUgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCQotCS8qKgotCSAqIEByZXR1cm4gaWYgdGhlIHN5c3RlbSBwcm9wZXJ0eSAiamF2YS5zcGVjaWZpY2F0aW9uLnZlcnNpb24iIGlzIDEuNSBvciBncmVhdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSjJTRTE1Q29tcGF0aWJsZSgpIHsKLQkJcmV0dXJuIGZnSXNKMlNFMTVDb21wYXRpYmxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vUHJvamVjdEhlbHBlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9Qcm9qZWN0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMGM3YmEuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9Qcm9qZWN0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbjsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy5JQW50TGF1bmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5JRXh0ZXJuYWxUb29sQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklEZWJ1Z1VJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSU92ZXJ3cml0ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLkZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5JSW1wb3J0U3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuSW1wb3J0T3BlcmF0aW9uOwotCi0vKioKLSAqIEhlbHBlciBtZXRob2RzIHRvIHNldCB1cCBhbiBJUHJvamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RIZWxwZXIgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggVEVTVF9CVUlMREZJTEVTX0RJUj0gbmV3IFBhdGgoInRlc3RidWlsZGZpbGVzIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBURVNUX1JFU09VUkNFU19ESVI9IG5ldyBQYXRoKCJ0ZXN0cmVzb3VyY2VzIik7CQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggVEVTVF9MSUJfRElSPSBuZXcgUGF0aCgidGVzdGxpYiIpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRT0gIkFudCBVSSBUZXN0cyI7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIElQcm9qZWN0LgotCSAqLwkKLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGNyZWF0ZVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3Q9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlQcm9qZWN0IHByb2plY3Q9IHJvb3QuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCWlmICghcHJvamVjdC5leGlzdHMoKSkgewotCQkJcHJvamVjdC5jcmVhdGUobnVsbCk7Ci0JCX0gZWxzZSB7Ci0JCQlwcm9qZWN0LnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG51bGwpOwotCQl9Ci0JCQotCQlpZiAoIXByb2plY3QuaXNPcGVuKCkpIHsKLQkJCXByb2plY3Qub3BlbihudWxsKTsKLQkJfQotCQkKLQkJaWYgKCFwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKSB7Ci0JCQlhZGROYXR1cmVUb1Byb2plY3QocHJvamVjdCwgSmF2YUNvcmUuTkFUVVJFX0lELCBudWxsKTsKLQkJfQotCQkKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkTmF0dXJlVG9Qcm9qZWN0KElQcm9qZWN0IHByb2osIFN0cmluZyBuYXR1cmVJZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qLmdldERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZ1tdIHByZXZOYXR1cmVzPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQkJU3RyaW5nW10gbmV3TmF0dXJlcz0gbmV3IFN0cmluZ1twcmV2TmF0dXJlcy5sZW5ndGggKyAxXTsKLQkJU3lzdGVtLmFycmF5Y29weShwcmV2TmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMCwgcHJldk5hdHVyZXMubGVuZ3RoKTsKLQkJbmV3TmF0dXJlc1twcmV2TmF0dXJlcy5sZW5ndGhdPSBuYXR1cmVJZDsKLQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOwotCQlwcm9qLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBtb25pdG9yKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyBhbiBJUHJvamVjdC4KLQkgKi8JCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGUoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlwcm9qZWN0LmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQl9Ci0KLQotCS8qKgotCSAqIEFkZHMgYSBmb2xkZXIgdG8gYW4gSVByb2plY3QuCi0JICovCQkKLQlwdWJsaWMgc3RhdGljIElGb2xkZXIgYWRkRm9sZGVyKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBjb250YWluZXJOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQkJSUZvbGRlciBmb2xkZXI9IHByb2plY3QuZ2V0Rm9sZGVyKGNvbnRhaW5lck5hbWUpOwotCQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCQlmb2xkZXIuY3JlYXRlKGZhbHNlLCB0cnVlLCBudWxsKTsKLQkJCX0KLQkJCi0JCXJldHVybiBmb2xkZXI7Ci0JCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgaW1wb3J0RmlsZXNGcm9tRGlyZWN0b3J5KEZpbGUgcm9vdERpciwgSVBhdGggZGVzdFBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsJCQotCQlJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIgc3RydWN0dXJlUHJvdmlkZXIgPSBGaWxlU3lzdGVtU3RydWN0dXJlUHJvdmlkZXIuSU5TVEFOQ0U7Ci0JCUxpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KDEwMCk7Ci0JCWFkZEZpbGVzKHJvb3REaXIsIGZpbGVzKTsKLQkJdHJ5IHsKLQkJCUltcG9ydE9wZXJhdGlvbiBvcD0gbmV3IEltcG9ydE9wZXJhdGlvbihkZXN0UGF0aCwgcm9vdERpciwgc3RydWN0dXJlUHJvdmlkZXIsIG5ldyBJbXBvcnRPdmVyd3JpdGVRdWVyeSgpLCBmaWxlcyk7Ci0JCQlvcC5zZXRDcmVhdGVDb250YWluZXJTdHJ1Y3R1cmUoZmFsc2UpOwotCQkJb3AucnVuKG1vbml0b3IpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaG91bGQgbm90IGhhcHBlbgotCQl9Ci0JfQkKLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEZpbGVzKEZpbGUgZGlyLCBMaXN0IGNvbGxlY3Rpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMoKTsKLQkJTGlzdCBzdWJEaXJzID0gbmV3IEFycmF5TGlzdCgyKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZpbGVzW2ldLmlzRmlsZSgpKSB7Ci0JCQkJY29sbGVjdGlvbi5hZGQoZmlsZXNbaV0pOwotCQkJfSBlbHNlIGlmIChmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJc3ViRGlycy5hZGQoZmlsZXNbaV0pOwotCQkJfQotCQl9Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBzdWJEaXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJRmlsZSBzdWJEaXIgPSAoRmlsZSlpdGVyLm5leHQoKTsKLQkJCWFkZEZpbGVzKHN1YkRpciwgY29sbGVjdGlvbik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW1wb3J0T3ZlcndyaXRlUXVlcnkgaW1wbGVtZW50cyBJT3ZlcndyaXRlUXVlcnkgewotCQlwdWJsaWMgU3RyaW5nIHF1ZXJ5T3ZlcndyaXRlKFN0cmluZyBmaWxlKSB7Ci0JCQlyZXR1cm4gQUxMOwotCQl9CQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdHdvIGxhdW5jaCBjb25maWd1cmF0aW9ucyBvbmUgc3RhbmRhcmQgb25lIGFuZCBvbmUgZm9yIGEgc2VwYXJhdGUgVk0KLQkgKiBAcGFyYW0gbGF1bmNoQ29uZmlnTmFtZQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDMuNQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVMYXVuY2hDb25maWd1cmF0aW9uRm9yQm90aChTdHJpbmcgbGF1bmNoQ29uZmlnTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVByb2plY3RIZWxwZXIuY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbihsYXVuY2hDb25maWdOYW1lKTsKLQkJUHJvamVjdEhlbHBlci5jcmVhdGVMYXVuY2hDb25maWd1cmF0aW9uRm9yU2VwYXJhdGVWTShsYXVuY2hDb25maWdOYW1lICsgIlNlcFZNIiwgbGF1bmNoQ29uZmlnTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNoYXJlZCBsYXVuY2ggY29uZmlndXJhdGlvbiBmb3IgbGF1bmNoaW5nIEFudCBpbiBhIHNlcGFyYXRlIFZNIHdpdGggdGhlIGdpdmVuCi0JICogbmFtZS4KLQkgKiAKLQkgKiBAc2luY2UgMy41Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb25Gb3JTZXBhcmF0ZVZNKFN0cmluZyBsYXVuY2hDb25maWdOYW1lLCBTdHJpbmcgYnVpbGRGaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBiZiA9IGJ1aWxkRmlsZU5hbWU7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uVHlwZSB0eXBlID0gQWJzdHJhY3RBbnRVSVRlc3QuZ2V0TGF1bmNoTWFuYWdlcigpLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKElBbnRMYXVuY2hDb25zdGFudHMuSURfQU5UX0xBVU5DSF9DT05GSUdVUkFUSU9OX1RZUEUpOwotCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZyA9IHR5cGUubmV3SW5zdGFuY2UoQWJzdHJhY3RBbnRVSVRlc3QuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJsYXVuY2hDb25maWd1cmF0aW9ucyIpLCBsYXVuY2hDb25maWdOYW1lKTsKLQkJCi0JCWNvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfTUFJTl9UWVBFX05BTUUsICJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLnJlbW90ZS5JbnRlcm5hbEFudFJ1bm5lciIpOyAvLyROT04tTkxTLTEkCi0JCWNvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQ0xBU1NQQVRIX1BST1ZJREVSLCAib3JnLmVjbGlwc2UuYW50LnVpLkFudENsYXNzcGF0aFByb3ZpZGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJY29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9KRUNUX05BTUUsIEFic3RyYWN0QW50VUlUZXN0LmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCWlmIChiZiA9PSBudWxsKSB7Ci0JCQliZj0gbGF1bmNoQ29uZmlnTmFtZTsKLQkJfSAKLQkJY29uZmlnLnNldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfTE9DQVRJT04sICIke3dvcmtzcGFjZV9sb2M6LyIgKyBQUk9KRUNUX05BTUUgKyAiL2J1aWxkZmlsZXMvIiArIGJmICsgIi54bWx9Iik7Ci0JCQotCQljb25maWcuc2V0QXR0cmlidXRlKElEZWJ1Z1VJQ29uc3RhbnRzLkFUVFJfTEFVTkNIX0lOX0JBQ0tHUk9VTkQsIHRydWUpOwotCQljb25maWcuc2V0QXR0cmlidXRlKERlYnVnUGx1Z2luLkFUVFJfUFJPQ0VTU19GQUNUT1JZX0lELCBJQW50VUlDb25zdGFudHMuUkVNT1RFX0FOVF9QUk9DRVNTX0ZBQ1RPUllfSUQpOwotCQkgCi0JCVByb2plY3RIZWxwZXIuc2V0Vk0oY29uZmlnKTsKLQkJCQkKLQkJY29uZmlnLmRvU2F2ZSgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHdvcmtzcGFjZSBkZWZhdWx0IFZNIG9uIHRoZSBnaXZlbiB3b3JraW5nIGNvcHkKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogCi0JICogQHNpbmNlIDMuNQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWTShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZykgewotCQlJVk1JbnN0YWxsIHZtID0gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdFZNSW5zdGFsbCgpOwotCQlTdHJpbmcgdm1OYW1lPSB2bS5nZXROYW1lKCk7Ci0JCVN0cmluZyB2bVR5cGVJRD0gdm0uZ2V0Vk1JbnN0YWxsVHlwZSgpLmdldElkKCk7CQkJCi0JCWNvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVk1fSU5TVEFMTF9OQU1FLCB2bU5hbWUpOwotCQljb25maWcuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0lOU1RBTExfVFlQRSwgdm1UeXBlSUQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzaGFyZWQgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZm9yIGxhdW5jaGluZyBBbnQgaW4gYSBzZXBhcmF0ZSBWTSB3aXRoIHRoZSBnaXZlbgotCSAqIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb24oU3RyaW5nIGxhdW5jaENvbmZpZ05hbWUpIHRocm93cyBFeGNlcHRpb24gewotCSAgICBQcm9qZWN0SGVscGVyLmNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb24obGF1bmNoQ29uZmlnTmFtZSwgUFJPSkVDVF9OQU1FICsgIi9idWlsZGZpbGVzLyIgKyBsYXVuY2hDb25maWdOYW1lICsgIi54bWwiKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGF1bmNoIGNvbmZpZ3VyYXRpb24gd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGUgZ2l2ZW4gbG9jYXRpb24KLQkgKiBAcGFyYW0gbGF1bmNoQ29uZmlnTmFtZQotCSAqIEBwYXJhbSBwYXRoCi0JICogQHJldHVybiB0aGUgaGFuZGxlIHRvIHRoZSBuZXcgbGF1bmNoIGNvbmZpZ3VyYXRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElMYXVuY2hDb25maWd1cmF0aW9uIGNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb24oU3RyaW5nIGxhdW5jaENvbmZpZ05hbWUsIFN0cmluZyBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JICAgIElMYXVuY2hDb25maWd1cmF0aW9uVHlwZSB0eXBlID0gQWJzdHJhY3RBbnRVSVRlc3QuZ2V0TGF1bmNoTWFuYWdlcigpLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKElBbnRMYXVuY2hDb25zdGFudHMuSURfQU5UX0xBVU5DSF9DT05GSUdVUkFUSU9OX1RZUEUpOwotCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZyA9IHR5cGUubmV3SW5zdGFuY2UoQWJzdHJhY3RBbnRVSVRlc3QuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJsYXVuY2hDb25maWd1cmF0aW9ucyIpLCBsYXVuY2hDb25maWdOYW1lKTsKLQkKLQkJY29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9KRUNUX05BTUUsIEFic3RyYWN0QW50VUlUZXN0LmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCWNvbmZpZy5zZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX0xPQ0FUSU9OLCAiJHt3b3Jrc3BhY2VfbG9jOi8iICsgcGF0aCArICJ9Iik7Ci0JCWNvbmZpZy5zZXRBdHRyaWJ1dGUoSURlYnVnVUlDb25zdGFudHMuQVRUUl9MQVVOQ0hfSU5fQkFDS0dST1VORCwgdHJ1ZSk7Ci0JCQkKLQkJY29uZmlnLmRvU2F2ZSgpOwotCQlyZXR1cm4gY29uZmlnOwotCX0JCQkKLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9zdXBwb3J0L2lucHV0SGFuZGxlcnMvVGVzdFNXVElucHV0SGFuZGxlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3N1cHBvcnQvaW5wdXRIYW5kbGVycy9UZXN0U1dUSW5wdXRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMzg4YzQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3N1cHBvcnQvaW5wdXRIYW5kbGVycy9UZXN0U1dUSW5wdXRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnN1cHBvcnQuaW5wdXRIYW5kbGVyczsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdFNXVElucHV0SGFuZGxlciB7Ly9leHRlbmRzIFNXVElucHV0SGFuZGxlciB7Ci0JCi0gICAKLS8vICAgIC8qIChub24tSmF2YWRvYykKLS8vICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmFudHN1cHBvcnQuaW5wdXRoYW5kbGVyLlNXVElucHV0SGFuZGxlciNvcGVuKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW5bXSkKLS8vICAgICAqLwotLy8gICAgcHJvdGVjdGVkIHZvaWQgb3BlbihTdHJpbmcgdGl0bGUsIFN0cmluZyBwcm9tcHQsIGJvb2xlYW5bXSByZXN1bHQpIHsKLS8vICAgICAgICBmUmVxdWVzdC5zZXRJbnB1dCgiVGVzdFNXVElucHV0SGFuZGxlciIpOwotLy8gICAgICAgIHJlc3VsdFswXT0gdHJ1ZTsKLS8vICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvc3VwcG9ydC90YXNrcy9BbnRUZXN0VGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NThiMGRjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5zdXBwb3J0LnRhc2tzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FY2hvOwotCi0KLXB1YmxpYyBjbGFzcyBBbnRUZXN0VGFzayBleHRlbmRzIFRhc2sgewotCQotCXB1YmxpYyBBbnRUZXN0VGFzaygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCQlFY2hvIGVjaG89IG5ldyBFY2hvKCk7Ci0JCWVjaG8uc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOwotCQllY2hvLnNldE1lc3NhZ2UoIlRlc3RpbmcgQW50IGluIEVjbGlwc2Ugd2l0aCBhIGN1c3RvbSB0YXNrIik7Ci0JCWVjaG8uZXhlY3V0ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrMi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3N1cHBvcnQvdGFza3MvQW50VGVzdFRhc2syLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyODYxYzEuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3N1cHBvcnQvdGFza3MvQW50VGVzdFRhc2syLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5zdXBwb3J0LnRhc2tzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FY2hvOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlOwotCi0KLXB1YmxpYyBjbGFzcyBBbnRUZXN0VGFzazIgZXh0ZW5kcyBUYXNrIHsKLQkKLQlTdHJpbmcgZk1lc3NhZ2U9ICJEZWZhdWx0IjsKLQlSZWZlcmVuY2UgZlJlZj0gbnVsbDsKLQkKLQlwdWJsaWMgQW50VGVzdFRhc2syKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2sjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0JCUVjaG8gZWNobz0gbmV3IEVjaG8oKTsKLQkJZWNoby5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7Ci0JCWVjaG8uc2V0TWVzc2FnZSgiVGVzdGluZyBBbnQgaW4gRWNsaXBzZSB3aXRoIGEgY3VzdG9tIHRhc2syOiAiICsgZk1lc3NhZ2UpOwotCQllY2hvLmV4ZWN1dGUoKTsKLQl9Ci0JCi0gICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShDb29sIGF0dHIpIHsKLSAgICAgICAgZk1lc3NhZ2UgPSBhdHRyLmdldFZhbHVlKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZShSZWZlcmVuY2UgcmVmKSB7Ci0gICAgICAgIGZSZWY9IHJlZjsKLSAgICB9Ci0JCi0JLyoqCi0gICAgICogRW51bWVyYXRlZCBhdHRyaWJ1dGUgd2l0aCB0aGUgdmFsdWVzICJjb29sIiwgImNoaWxsaW4iIGFuZCAiYXdlc29tZSIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb29sIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsiY29vbCIsICJjaGlsbGluIiwgImF3ZXNvbWUifTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9zdXBwb3J0L3Rhc2tzL05lc3RFbGVtZW50VGFzay5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3N1cHBvcnQvdGFza3MvTmVzdEVsZW1lbnRUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YTcxMTkuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3N1cHBvcnQvdGFza3MvTmVzdEVsZW1lbnRUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnN1cHBvcnQudGFza3M7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG87Ci0KLXB1YmxpYyBjbGFzcyBOZXN0RWxlbWVudFRhc2sgZXh0ZW5kcyBUYXNrIHsgIAotCQotCVN0cmluZyBtZXNzYWdlPSAiYmFyIjsKLQlOZXN0ZWRFbGVtZW50IGU7Ci0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBOZXN0ZWRFbGVtZW50ewotICAgIAlCb29sZWFuIHdvcmtzPSBCb29sZWFuLkZBTFNFOwotICAgIAlwdWJsaWMgTmVzdGVkRWxlbWVudCgpIHsJCi0gICAgCX0KLSAgICAJCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFdvcmtzKEJvb2xlYW4gYm9vbGVhblZhbHVlKSB7Ci0gICAgICAgIAl3b3Jrcz0gYm9vbGVhblZhbHVlOwotICAgICAgICB9Ci0KLQkJcHVibGljIGJvb2xlYW4gd29ya3MoKSB7Ci0JCQlyZXR1cm4gd29ya3MuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLSAgICB9Ci0gICAgcHVibGljIHZvaWQgYWRkTmVzdGVkRWxlbWVudChOZXN0ZWRFbGVtZW50IG5lc3RlZEVsZW1lbnQpIHsKLSAgICAJZT0gbmVzdGVkRWxlbWVudDsKLSAgICB9Ci0gICAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCQlFY2hvIGVjaG89IG5ldyBFY2hvKCk7Ci0JCWVjaG8uc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOwotCQlpZiAoZS53b3JrcygpKSB7Ci0JCQllY2hvLnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0gZWxzZSB7Ci0JCQllY2hvLnNldE1lc3NhZ2UoImFjayIpOwotCQl9Ci0JCWVjaG8uZXhlY3V0ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9zdXBwb3J0L3R5cGVzL0FudFRlc3RQYXRoLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvc3VwcG9ydC90eXBlcy9BbnRUZXN0UGF0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2Q0MjhjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9zdXBwb3J0L3R5cGVzL0FudFRlc3RQYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5zdXBwb3J0LnR5cGVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotCi1wdWJsaWMgY2xhc3MgQW50VGVzdFBhdGggZXh0ZW5kcyBQYXRoIHsKLQkKLQlTdHJpbmcgbWVzc2FnZTsKLQkKLQlwdWJsaWMgQW50VGVzdFBhdGgoUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKHByb2plY3QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXRoaXMubWVzc2FnZT0gbWVzc2FnZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQlyZXR1cm4gbWVzc2FnZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZmMTU2My4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLSAgPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIGVjbGlwc2UtaG9tZSwgYW5kIGxpYnJhcnktZmlsZSAtLT4KLSAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLSAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn1cLi5cLi4iLz4KLTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmFudC50ZXN0cy51aSIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIgotICAgICAgICAgICAgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3QvbGlicmFyeS54bWwiLz4KLSAKLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotICA8dGFyZ2V0IG5hbWU9InN1aXRlIj4KLSAgICA8cHJvcGVydHkgbmFtZT0iamR0LWZvbGRlciIgCi0gICAgICAgICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vamR0X2ZvbGRlciIvPgotICAgIDxkZWxldGUgZGlyPSIke2pkdC1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgotICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7amR0LWZvbGRlcn0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiAKLSAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQW50VUlUZXN0cyIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQkKLSA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHBlcmZvcm1hbmNlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotCSAgPHRhcmdldCBuYW1lPSJwZXJmc3VpdGUiPgotCSAgICA8cHJvcGVydHkgbmFtZT0iamR0LWZvbGRlciIgCi0JICAgICAgICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L2pkdF9mb2xkZXIiLz4KLQkgICAgPGRlbGV0ZSBkaXI9IiR7amR0LWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+Ci0JICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLQkgICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke2pkdC1mb2xkZXJ9Ii8+Ci0JICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLQkgICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiAKLQkgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS50ZXN0cGx1Z2luLkFudFVJUGVyZm9ybWFuY2VUZXN0cyIvPgotCSAgICA8L2FudD4KLQkgIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotICA8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+Ci0gIDwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotICA8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLVRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHBlcmZvcm1hbmNlIHRlc3Qgc3VpdGVzIGFuZCBjb2xsZWN0cyByZXN1bHRzLi0tPgotICA8dGFyZ2V0IG5hbWU9InBlcmZvcm1hbmNlIiBkZXBlbmRzPSJpbml0LCBwZXJmc3VpdGUsIGNsZWFudXAiPgotICAJPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotCQk8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KLQk8L2FudD4KLSAgPC90YXJnZXQ+Ci0JCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzLzEwMjI4Mi54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzLzEwMjI4Mi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZTEzZWUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy8xMDIyODIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPCEtLQotICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgCi0gICAgIENvbnRyaWJ1dG9yczoKLSAgICAgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIC0tPgotPHByb2plY3QgbmFtZT0icHJvamVjdCIgZGVmYXVsdD0iZGVmYXVsdCI+Ci0gICAgPHRhcmdldCBuYW1lPSJkZWZhdWx0IiA+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iYW50Q2FsbGVkIj48L2FudGNhbGw+Ci0gICAgPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJhbnRDYWxsZWQiPgotCQk8amF2YWMgc3JjZGlyPSJzcmMiCi0JICAgICAgICAgZGVzdGRpcj0iZHN0IgotCSAgICAgICAgIGNsYXNzcGF0aD0iamFyZmlsZSIKLQkgICAgICAgICBkZWJ1Zz0ib24iCi0JCS8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+Ci0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvNzQ4NDAueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy83NDg0MC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MTQ0M2YuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy83NDg0MC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9InByb2plY3QiIGRlZmF1bHQ9ImRlZmF1bHQiPgotCTx0YXJnZXQgbmFtZT0iZGVmYXVsdCI+Ci0JCTxlY2hvPiR7cGxhdGZvcm0ubG9jYXRpb259PC9lY2hvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy84NTc2OS54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzLzg1NzY5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI2MjIyNi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzLzg1NzY5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJkZWJ1Z0FudENhbGwiCi0gICAgICAgICBkZWZhdWx0PSJkZWZhdWx0Ij4KLQkKLQk8dGFyZ2V0IG5hbWU9ImRlZmF1bHQiPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImNhbGwiPgotCQk8L2FudGNhbGw+Ci0JCTxlY2hvPmRlZmF1bHQ8L2VjaG8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNhbGwiIGRlcGVuZHM9InByZS1jYWxsIj4KLQkJPGVjaG8+Y2FsbDE8L2VjaG8+Ci0JCTxzbGVlcCBtaWxsaXNlY29uZHM9IjE1MDAiIC8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJwcmUtY2FsbCI+Ci0JCTxlY2hvPnByZS1jYWxsMTwvZWNobz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzLzg5MTE1LnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvODkxMTUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDE2NDhjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvODkxMTUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08cHJvamVjdCBuYW1lPSAiZGVmYXVsdCIgZGVmYXVsdD0iZGVmYXVsdCI+Ci0gICAgPHRhcmdldCBkZXNjcmlwdGlvbj0iZGVwZW5kcyIgbmFtZT0iZGVmYXVsdCIgZGVwZW5kcz0iZGVwZW5kcyI+Ci0gICAgICAgIAotICAgIDwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJkZXBlbmRzIj4KLSAgICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvODk5MDEueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy84OTkwMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMzQ2N2MuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy84OTkwMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08cHJvamVjdCBuYW1lPSJwcm9qZWN0IiBkZWZhdWx0PSJkZWZhdWx0Ij4KLQkKLSAgICA8dGFyZ2V0IG5hbWU9ImRlZmF1bHQiIGRlcGVuZHM9InRlc3QiIGRlc2NyaXB0aW9uPSItLT4gZGVzY3JpcHRpb24iPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGVzdCIgdmFsdWU9InlvIi8+Ci0gICAgPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InRlc3QiPgotCQk8ZWNobz4ke3Rlc3R9PC9lY2hvPgotICAgIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+Ci0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvOTYwMjIueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy85NjAyMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNDRhYTguLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy85NjAyMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08cHJvamVjdCBuYW1lPSJkZWJ1Z0FudENhbGwiCi0gICAgICAgICBkZWZhdWx0PSJkZWZhdWx0Ij4KLQkKLQk8cHJvcGVydHkgbmFtZT0iaGV5IiB2YWx1ZT0idGhlcmUiLz4KLSAKLQk8dGFyZ2V0IG5hbWU9ImRlZmF1bHQiPgotCQk8YW50Y2FsbCB0YXJnZXQ9IjEiPgotCQk8L2FudGNhbGw+Ci0JCTxlY2hvPmRlZmF1bHQ8L2VjaG8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9IjEiIGRlcGVuZHM9IjIiPgotCQk8ZWNobz4xPC9lY2hvPgotCQk8c2xlZXAgbWlsbGlzZWNvbmRzPSI1IiAvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iMiI+Ci0JCTxhbnRjYWxsIHRhcmdldD0iMyI+Ci0JCQkJPC9hbnRjYWxsPgotCQk8ZWNobz4yPC9lY2hvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iMyIgZGVwZW5kcz0iNCI+Ci0JCTxlY2hvPjM8L2VjaG8+Ci0JCTxzbGVlcCBtaWxsaXNlY29uZHM9IjUiIC8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSI0Ij4KLQkJPGVjaG8+NDwvZWNobz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzLzk4ODUzLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvOTg4NTMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWM4ZmJkLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvOTg4NTMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPHByb2plY3QgbmFtZT0idGVzdCIKLSAgICAgICAgIGRlZmF1bHQ9InJ1bi1tYWNybyIKLSAgICAgICAgIHhtbG5zOnh5ej0iaHR0cDovL3h5eiI+Ci0KLQk8bWFjcm9kZWYgbmFtZT0iZWNoby1tYWNybyIKLQkgICAgICAgICAgdXJpPSJodHRwOi8veHl6Ij4KLQkJPGF0dHJpYnV0ZSBuYW1lPSJzdHIiIC8+Ci0JCTxlbGVtZW50IG5hbWU9InNvbWUtdGFza3MiIC8+Ci0JCTxzZXF1ZW50aWFsPgotCQkJPGVjaG8+QHtzdHJ9PC9lY2hvPgotCQkJPHNvbWUtdGFza3MvPgotCQk8L3NlcXVlbnRpYWw+Ci0JPC9tYWNyb2RlZj4KLQotCTx0YXJnZXQgbmFtZT0icnVuLW1hY3JvIj4KLQkJCi0JCTx4eXo6ZWNoby1tYWNybyBzdHI9InMiPgotCQkJCi0JCTwveHl6OmVjaG8tbWFjcm8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHByZXNldGRlZiBuYW1lPSJteS1qYXZhYyIgdXJpPSJodHRwOi8veHl6Ij4KLQkJPGphdmFjIGZvcms9InllcyI+PC9qYXZhYz4KLQk8L3ByZXNldGRlZj4KLQkKLQkKLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2FudFVJVGVzdHNTdXBwb3J0LmphciBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYW50VUlUZXN0c1N1cHBvcnQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTRlZWM4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYW50VUlUZXN0c1N1cHBvcnQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9iYWQueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9iYWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWM0ZDUxLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYmFkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IkVjaG9pbmciIGRlZmF1bHQ9ImVjaG8xIiBiYXNlZGlyPSIuLiI+Ci0KLQk8dGFyZ2V0IG5hbWU9ImVjaG8xIj4KLQkJPGVjaG8gbWVzc2dlPSJlY2hvMSIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZWNobzIiPgotCQk8ZWNobyBtZXNzYWdlPSJlY2hvMiIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZWNobzMiIGRlc2NyaXB0aW9uPSAiQW4gZWNobzMhIj4KLQkJPGVjaG8gbWVzc2FnZT0iZWNobzMiLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYmFkcHJvamVjdC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2JhZHByb2plY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGE3OWE4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYmFkcHJvamVjdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTxwcm9qZWN0IG5kZWZhdWx0PSJtYWtlIj4KLQk8dGFyZ2V0IG5hbWU9Im1ha2UiPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnJlYWtwb2ludHMueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9icmVha3BvaW50cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNmMzODIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9icmVha3BvaW50cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0iZGVidWdFY2hvIiBkZWZhdWx0PSJkZWZhdWx0Ij4KLQk8dGFyZ2V0IG5hbWU9ImRlZmF1bHQiPgotCQk8ZWNobz4xPC9lY2hvPgotCQk8ZWNobz4yPC9lY2hvPgotCQk8cHJvcGVydHkgbmFtZT0iWlpaIiB2YWx1ZT0iWlpaIiAvPgotCQk8c2xlZXAgbWlsbGlzZWNvbmRzPSI1IiAvPgotCQk8ZWNobz4zPC9lY2hvPgotCQk8ZWNobz40PC9lY2hvPgotCQk8ZWNobz41PC9lY2hvPgotCQk8ZWNobz42PC9lY2hvPgotCQk8ZWNobz43PC9lY2hvPgotCQk8ZWNobz44PC9lY2hvPgotCQk8ZWNobz45PC9lY2hvPgotCQk8IS0tPHNsZWVwIG1pbGxpc2Vjb25kcz0iMjAwIiAvPi0tPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJlbnRyeTEiIGRlcGVuZHM9ImRlZmF1bHQiPgotCQk8ZWNobz4xPC9lY2hvPgotCQk8ZWNobz4yPC9lY2hvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJlbnRyeTIiIGRlcGVuZHM9ImRlZmF1bHQiPgotCQk8ZWNobz4xPC9lY2hvPgotCQk8ZWNobz4yPC9lY2hvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0icHJvcGVydGllcyI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJBQUEiIHZhbHVlPSJhYWEiIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJCQkIiIHZhbHVlPSJiYmIiIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJDQ0MiIHZhbHVlPSJjY2MiIC8+Ci0JCTxlY2hvPmFsbCBkb25lPC9lY2hvPgotCTwvdGFyZ2V0PgotCQotCTxwcm9wZXJ0eSBuYW1lPSJuYW1lIiB2YWx1ZT0idmFsdWUiLz4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkLkNwMTI1MS54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkLkNwMTI1MS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZjk1MzkuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZC5DcDEyNTEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0id2luZG93cy0xMjUxIj8+Ci08cHJvamVjdCBuYW1lPSJ0ZXN0IiBkZWZhdWx0PSJpbml0IiBiYXNlZGlyPSIuIj4KLQotICAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICAgIDwhLS0gZGlzcGxheXMgSGVsbG8gaW4gUnVzc2lhbiAtLT4KLSAgICAgICAgICA8ZWNobyBtZXNzYWdlPSLH5PDg4vHy4vPp8uUiLz4KLSAgICAgPC90YXJnZXQ+Ci0KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZC5VVEY4LnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGQuVVRGOC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTQ3MzMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZC5VVEY4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9InRlc3QiIGRlZmF1bHQ9ImluaXQiIGJhc2VkaXI9Ii4iPgotCi0gICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICAgICAgPCEtLSBkaXNwbGF5cyBIZWxsbyBpbiBSdXNzaWFuIC0tPgotICAgICAgICAgIDxlY2hvIG1lc3NhZ2U9ItCX0LTRgNCw0LLRP9GC0LLRg9C50YLQtSIvPgotICAgICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNkZDY0ZC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IkVjaG9pbmciIGRlZmF1bHQ9ImVjaG8xIiBiYXNlZGlyPSIuLiI+Ci0KLQk8dGFyZ2V0IG5hbWU9ImVjaG8xIj4KLQkJPGVjaG8gbWVzc2FnZT0iZWNobzEiLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImVjaG8yIj4KLQkJPGVjaG8gbWVzc2FnZT0iZWNobzIiLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImVjaG8zIiBkZXNjcmlwdGlvbj0gIkFuIGVjaG8zISI+Ci0JCTxlY2hvIG1lc3NhZ2U9ImVjaG8zIi8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkdGVzdDEucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGR0ZXN0MS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2MzZWYxLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGR0ZXN0MS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3AxPXZhbDEKLXByb3AyID0gdmFsMgotaW1wb3J0RmlsZU5hbWU9IHRvQmVJbXBvcnRlZC54bWwKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGR0ZXN0MS54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkdGVzdDEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTA0MmZmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGR0ZXN0MS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0idGVzdHByb2plY3QiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9Im1haW4iPgotCTxwcm9wZXJ0eSBuYW1lPSJwcm9wRCIgdmFsdWU9InZhbEQiIC8+Ci0gICAgPHByb3BlcnR5IGZpbGU9ImJ1aWxkdGVzdDEucHJvcGVydGllcyIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0icHJvcFYiIHZhbHVlPSJ2YWxWIiAvPgotICAgIDx0YXJnZXQgbmFtZT0ibWFpbiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9wZXJ0eV9pbl90YXJnZXQiIHZhbHVlPSJ2YWwiLz4KLSAgICAgICAgPGVjaG8+JHs8L2VjaG8+Ci0gICAgPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJwcmV0ZXN0Ij48L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InRlc3QiIGRlcGVuZHM9IiI+Ci0JCTxlY2hvPmRlcGVuZHM8L2VjaG8+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJ0ZXN0MiI+PC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJ0ZXN0MyI+PC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJ0ZXN0SWYiIGlmPSIiPjwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0idGVzdFVubGVzcyIgdW5sZXNzPSJwcm9wIj48L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InRlc3RNb3JlRGVwZW5kcyIgZGVwZW5kcz0icHJldGVzdCwgIj4KLQkJPGVjaG8gbWVzc2FnZT0iJCI+PC9lY2hvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGR0ZXN0Mi54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkdGVzdDIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWUzMWMyLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGR0ZXN0Mi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJ0ZXN0cHJvamVjdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0ibWFpbiI+Ci0JPHByb3BlcnR5IG5hbWU9InByb3BEIiB2YWx1ZT0idmFsRCIgLz4KLQk8cHJvcGVydHkgZmlsZT0iYnVpbGR0ZXN0MS5wcm9wZXJ0aWVzIiAvPgotCTx0YXJnZXQgbmFtZT0ibWFpbiIgZGVwZW5kcz0icHJvcGVydGllcyI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZHRlc3QzLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGR0ZXN0My54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NzlkYzQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZHRlc3QzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJ0ZXN0cHJvamVjdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0ibWFpbiI+Ci0JPHRhcmdldCBuYW1lPSJtYWluIiAvPgotCTx0YXJnZXQgbmFtZT0icHJldGVzdCIgZGVzY3JpcHRpb249ImRlc2NyaXB0aW9uIj4KLQk8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlcGVuZHM9IiI+Ci0JCTxlY2hvPmRlcGVuZHM8L2VjaG8+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJ0ZXN0MiIgLz4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkdGVzdDQueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZHRlc3Q0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUzYjlmMS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkdGVzdDQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgZGVmYXVsdD0idGFzazMiPgotICAgIDx0YXJnZXQgbmFtZT0idGFzayIgZGVzY3JpcHRpb249IiIvPgotICAgIDx0YXJnZXQgbmFtZT0idGFzazIiPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9IiI+PC9hbnRjYWxsPgotCTwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0idGFzazMiIGRlcGVuZHM9IiIvPgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvY3VzdG9tQm9vbGVhbi54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2N1c3RvbUJvb2xlYW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGQzN2EwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvY3VzdG9tQm9vbGVhbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxwcm9qZWN0IGRlZmF1bHQ9ImRlZmF1bHRUYXJnZXROYW1lIj4KLQk8dGFyZ2V0IG5hbWU9ImRlZmF1bHRUYXJnZXROYW1lIj4KLQkJPGVjbGlwc2UuYnVpbGRTY3JpcHQgcmVjdXJzaXZlZ2VuZXJhdGlvbj0iIi8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2RlYnVnQW50Q2FsbC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2RlYnVnQW50Q2FsbC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2OGE0ODYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9kZWJ1Z0FudENhbGwueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPHByb2plY3QgbmFtZT0iZGVidWdBbnRDYWxsIgotICAgICAgICAgZGVmYXVsdD0iZGVmYXVsdCI+Ci0JCi0JPHRhcmdldCBuYW1lPSJkZWZhdWx0Ij4KLQkJPGFudGNhbGwgdGFyZ2V0PSJjYWxsIj4KLQkJPC9hbnRjYWxsPgotCQk8ZWNobz5kZWZhdWx0PC9lY2hvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjYWxsIiBkZXBlbmRzPSJwcmUtY2FsbCI+Ci0JCTxlY2hvPmNhbGwxPC9lY2hvPgotCQk8c2xlZXAgbWlsbGlzZWNvbmRzPSIzMCIgLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InByZS1jYWxsIj4KLQkJPGVjaG8+cHJlLWNhbGwxPC9lY2hvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZGVwZW5kZW5jeXRlc3QueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9kZXBlbmRlbmN5dGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNmJhNTcuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9kZXBlbmRlbmN5dGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08IS0tIEVpbiB0ZXN0IGNhc2Ugc29sbHRlIGRpZSBwcm9wZXJ0eSBwcm9wb3NhbHMgaW4gbWFpbiAgICAgICAtLT4KLTwhLS0gVWViZXJwcnVlZmVuLCB1bmQgb2IgZGllIGRpdmVyc2VuIHByb3BlcnRpZXMgZW50c3ByZWNoZW5kIC0tPgotPCEtLSBkZXIgZGVwZW5kZW5jaWVzIGdlc2V0enQgc2luZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0KLTxwcm9qZWN0IGRlZmF1bHQ9Im1haW4iPgotCi0JPHByb3BlcnR5IG5hbWU9ImRvX2luaXQiIHZhbHVlPSJ2YWwiPjwvcHJvcGVydHk+Ci0JCi0JPHRhcmdldCBuYW1lPSJwcm9wZXJ0aWVzIj4KLQkJPHByb3BlcnR5IG5hbWU9InByb3BfcHJvcCIgdmFsdWU9InZhbCI+PC9wcm9wZXJ0eT4KLQkJPHByb3BlcnR5IG5hbWU9ImRvX25vdF9jb21waWxlIiB2YWx1ZT0idmFsIj48L3Byb3BlcnR5PgotCQk8ZWNobyBtZXNzYWdlPSJleGVjdXRpbmcgcHJvcGVydGllcyI+PC9lY2hvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBzaG91bGQgbmV2ZXIgYmUgZXhlY3V0ZWQgc2luY2UgcHJvcGVydHkgaXMgbm90IHNldCAgICAgIC0tPiAKLQk8dGFyZ2V0IG5hbWU9ImFkZGl0aW9uYWxfcHJvcGVydGllcyIgaWY9ImRvX2FkZGl0X3Byb3BzIj4KLQkJPHByb3BlcnR5IG5hbWU9ImFkaXRfcHJvcCIgdmFsdWU9InZhbCIgLz4KLQkJPGVjaG8gbWVzc2FnZT0iZXhlY3V0aW5nIGFkZGl0aW9uYWxfcHJvcGVydGllcyI+PC9lY2hvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iaW5pdCIgaWY9ImRvaW5pdCIgZGVwZW5kcz0icHJvcGVydGllcyxhZGRpdGlvbmFsX3Byb3BlcnRpZXMiPgotCQk8cHJvcGVydHkgbmFtZT0iaW5pdF9wcm9wIiB2YWx1ZT0idmFsIj48L3Byb3BlcnR5PgotCQk8ZWNobyBtZXNzYWdlPSJleGVjdXRpbmcgaW5pdCI+PC9lY2hvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gc2hvdWxkIG5ldmVyIGJlIGV4ZWN1dGVkIHNpbmNlIHByb3BlcnR5IHNob3VsZCBiZSBzZXQgICAtLT4KLQk8IS0tIGJ5IHByb3BlcnRpZXMgYmVjYXVzZSBvZiBkZXBlbmRlbmNpZXMgYmVmb3JlICAgICAgICAgICAgLS0+IAotCTx0YXJnZXQgbmFtZT0iY29tcGlsZSIgdW5sZXNzPSJkb19ub3RfY29tcGlsZSI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjb21waWxlX3Byb3AiIHZhbHVlPSJ2YWwiPjwvcHJvcGVydHk+Ci0JCTxlY2hvIG1lc3NhZ2U9ImV4ZWN1dGluZyBjb21waWxlIj48L2VjaG8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9ImluaXQsIGNvbXBpbGUiPgotCQk8cHJvcGVydHkgbmFtZT0ibWFpbl9wcm9wIiB2YWx1ZT0idmFsIj48L3Byb3BlcnR5PgotCQk8ZWNobyBtZXNzYWdlPSJleGVjdXRpbmcgbWFpbiAke3dlbGx9Ij48L2VjaG8+Ci0JPC90YXJnZXQ+Ci0JCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9lY2hvUHJvcGVydGllcy54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2VjaG9Qcm9wZXJ0aWVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ3M2M2NS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2VjaG9Qcm9wZXJ0aWVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iRWNob2luZyBwcm9wZXJ0aWVzIiBkZWZhdWx0PSJlY2hvMSIgYmFzZWRpcj0iLi4iPgotCTx0YXJnZXQgbmFtZT0iZWNobzEiPgotCQk8ZWNobyBtZXNzYWdlPSJhYm91dCB0byBlY2hvIHByb3BlcnRpZXMiLz4KLQkJPGVjaG9wcm9wZXJ0aWVzLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZWNob2luZy54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2VjaG9pbmcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2I0OTg0Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZWNob2luZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08cHJvamVjdCBuYW1lPSJFY2hvaW5nIiBkZWZhdWx0PSJlY2hvMSIgYmFzZWRpcj0iLi4iPgotCi0JPHRhcmdldCBuYW1lPSJlY2hvMSI+Ci0JCTxlY2hvIG1lc3NhZ2U9ImVjaG8xIi8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJlY2hvMiI+Ci0JCTxlY2hvIG1lc3NhZ2U9ImVjaG8yIi8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJlY2hvMyIgZGVzY3JpcHRpb249ICJBbiBlY2hvMyEiPgotCQk8ZWNobyBtZXNzYWdlPSJlY2hvMyIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iQnVnNDI5ODQiPgotCQk8ZWNobyBtZXNzYWdlPSJ1c2VyLmRpcjogJHt1c2VyLmRpcn0iLz4KLQk8L3RhcmdldD4KLQkKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZW1wdHkueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9lbXB0eS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9lbXB0eS54bWwKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9lbnZpcm9ubWVudFZhci54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2Vudmlyb25tZW50VmFyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg4NDQzMi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2Vudmlyb25tZW50VmFyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPHByb2plY3Q+Ci0JPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KLQk8ZWNobz4ke2Vudi5BTlRfSE9NRX08L2VjaG8+Ci0JPGVjaG8+JHthbnQuaG9tZX08L2VjaG8+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9leHRlbnNpb25Qb2ludFNlcFZNLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZXh0ZW5zaW9uUG9pbnRTZXBWTS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MzVlZDAuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9leHRlbnNpb25Qb2ludFNlcFZNLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IkV4dGVuc2lvbiBwb2ludCB0ZXN0aW5nIGluIHNlcGFyYXRlIFZNIgotICAgICAgICAgZGVmYXVsdD0iRXh0ZW5zaW9uIFBvaW50cyIKLSAgICAgICAgIGJhc2VkaXI9Ii4iCi0gPgotICAgIDx0YXNrZGVmIG5hbWU9InNlcGFyYXRlVk1UYXNrIiBjbGFzc25hbWU9Im9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5zdXBwb3J0LnRhc2tzLkFudFRlc3RUYXNrIj4KLSAgICA8L3Rhc2tkZWY+Ci0gICAgPHRhcmdldCBuYW1lPSJFeHRlbnNpb24gUG9pbnRzIgotICAgICAgICAgICAgZGVzY3JpcHRpb249ICJFbnN1cmUgdGhhdCBhbiBleHRyYSBjbGFzc3BhdGggZW50cnkgZGVzaWduYXRlZCBhcyBub3QgcmVxdWlyaW5nIHRoZSBFY2xpcHNlIHJ1bnRpbWUgc2hvd3MgdXAgaW4gYSBzZXBhcmF0ZSBWTSBidWlsZCIKLSAgICAgPgotICAgICAgICA8c2VwYXJhdGVWTVRhc2svPgotICAgICAgICAgPGVjaG8+JHtwcm9wZXJ0eS51aS50ZXN0aW5nfTwvZWNobz4KLSAgICAgICAgPGVjaG8+JHtwcm9wZXJ0eS51aS50ZXN0aW5nMn08L2VjaG8+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2V4dGVuc2lvblBvaW50VGFza1NlcFZNLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZXh0ZW5zaW9uUG9pbnRUYXNrU2VwVk0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzZjNmFhLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZXh0ZW5zaW9uUG9pbnRUYXNrU2VwVk0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08cHJvamVjdCBuYW1lPSJFeHRlbnNpb24gUG9pbnQgVGFzayIgZGVmYXVsdD0iRXh0ZW5zaW9uIFBvaW50IFRhc2siIGJhc2VkaXI9Ii4iPgotCTx0YXJnZXQgbmFtZT0iRXh0ZW5zaW9uIFBvaW50IFRhc2siIGRlc2NyaXB0aW9uPSAiRW5zdXJlIHRoYXQgYW4gZXh0ZW5zaW9uIHBvaW50IGRlZmluZWQgdGFzayBpcyBwcmVzZW50Ij4KLQkJPGNvb2xVSVRhc2sgbWVzc2FnZT0iY29vbCIgcmVmZXJlbmNlPSIiLz4KLQkJPG15OmNvb2xVSVRhc2sgeG1sbnM6bXk9InRlc3RpbmciLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2V4dGVuc2lvblBvaW50VHlwZVNlcFZNLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZXh0ZW5zaW9uUG9pbnRUeXBlU2VwVk0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmE5NTVlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZXh0ZW5zaW9uUG9pbnRUeXBlU2VwVk0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iRXh0ZW5zaW9uIFBvaW50IFR5cGUiIGRlZmF1bHQ9IkV4dGVuc2lvbiBQb2ludCBUeXBlIiBiYXNlZGlyPSIuIj4KLQotCTxjb29sVUlUeXBlIGlkPSJjb21waWxlLmNsYXNzcGF0aCI+Ci0gICAgICA8ZmlsZXNldCBkaXI9ImxpYiI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamFyIi8+Ci0gICAgICA8L2ZpbGVzZXQ+Ci0gICAgPC9jb29sVUlUeXBlPgotICAgIAotCTx0YXJnZXQgbmFtZT0iRXh0ZW5zaW9uIFBvaW50IFR5cGUiIGRlc2NyaXB0aW9uPSAiRW5zdXJlIHRoYXQgYW4gZXh0ZW5zaW9uIHBvaW50IGRlZmluZWQgdHlwZSBpcyBwcmVzZW50Ij4KLQkJPGVjaG8gbWVzc2FnZT0iRW5zdXJlIHRoYXQgYW4gZXh0ZW5zaW9uIHBvaW50IGRlZmluZWQgdHlwZSBpcyBwcmVzZW50Ii8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2ZhaWxpbmdUYXJnZXQueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9mYWlsaW5nVGFyZ2V0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ0MThlMC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2ZhaWxpbmdUYXJnZXQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08cHJvamVjdCBkZWZhdWx0PSJhbGwiPgotCTx0YXJnZXQgbmFtZT0iYWxsIiBkZXBlbmRzPSJmYWlscywgZWNob3MiLz4KLQk8dGFyZ2V0IG5hbWU9ImZhaWxzIj4KLQkJPGphciBqYXJmaWxlPSJqYXIxNi5qYXIiIGJhc2VkaXI9ImRvZXNOb3RFeGlzdCIvPgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0iZWNob3MiPgotCQk8ZWNobz5TdGlsbCBlY2hvIG9uIGZhaWx1cmU8L2VjaG8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9mb3JtYXRUZXN0X3NvdXJjZTAxLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZm9ybWF0VGVzdF9zb3VyY2UwMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MzJhNDkuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9mb3JtYXRUZXN0X3NvdXJjZTAxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTwhLS0KLSAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIAotICAgICBDb250cmlidXRvcnM6Ci0gICAgICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAtLT4KLTxwcm9qZWN0IGRlZmF1bHQ9ImZvcm1hdFRlc3QiPgotCi08IS0tID0gPSA9ID0gPSA9IC0tPjwhLS0gZm9ybWF0VGVzdCAgLS0+PCEtLSA9ID0gPSA9ID0gPSAtLT48dGFyZ2V0IG5hbWU9ImZvcm1hdFRlc3QiIGRlcGVuZHM9ImluaXQiIGRlc2NyaXB0aW9uPSItLT4gdGVzdCB0YXJnZXQgb25lIj48IS0tIGhlbGxvIHdvcmxkIC0tPjxncmVldGluZyAvPjwvdGFyZ2V0PgotCi08IS0tIC0gLSAtIC0gLSAtIC0tPgotPCEtLSBpbml0ICAgICAgICAtLT4KLTwhLS0gLSAtIC0gLSAtIC0gLS0+Ci08dGFyZ2V0IG5hbWU9ImluaXQiPgotICA8cHJvcGVydHkgbmFtZT0iZ3JlZXRpbmciIHZhbHVlPSJoaSIgLz4KLSAgPHByZXNldGRlZiBuYW1lPSJncmVldGluZyI+PGVjaG8+JHtncmVldGluZ308L2VjaG8+Ci08L3ByZXNldGRlZj4KLSAgIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9mb3JtYXRUZXN0X3RhcmdldDAxLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZm9ybWF0VGVzdF90YXJnZXQwMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ODVlODUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9mb3JtYXRUZXN0X3RhcmdldDAxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhLS0KLSAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIAotICAgICBDb250cmlidXRvcnM6Ci0gICAgICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAtLT4KLTxwcm9qZWN0IGRlZmF1bHQ9ImZvcm1hdFRlc3QiPgotCi0gICA8IS0tID0gPSA9ID0gPSA9IC0tPgotICAgPCEtLSBmb3JtYXRUZXN0ICAtLT4KLSAgIDwhLS0gPSA9ID0gPSA9ID0gLS0+Ci0gICA8dGFyZ2V0IG5hbWU9ImZvcm1hdFRlc3QiIGRlcGVuZHM9ImluaXQiIGRlc2NyaXB0aW9uPSItLT4gdGVzdCB0YXJnZXQgb25lIj4KLSAgICAgIDwhLS0gaGVsbG8gd29ybGQgLS0+Ci0gICAgICA8Z3JlZXRpbmcgLz4KLSAgIDwvdGFyZ2V0PgotCi0gICA8IS0tIC0gLSAtIC0gLSAtIC0tPgotICAgPCEtLSBpbml0ICAgICAgICAtLT4KLSAgIDwhLS0gLSAtIC0gLSAtIC0gLS0+Ci0gICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImdyZWV0aW5nIiB2YWx1ZT0iaGkiIC8+Ci0gICAgICA8cHJlc2V0ZGVmIG5hbWU9ImdyZWV0aW5nIj4KLSAgICAgICAgIDxlY2hvPiR7Z3JlZXRpbmd9PC9lY2hvPgotICAgICAgPC9wcmVzZXRkZWY+Ci0gICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZm9ybWF0VGVzdF90YXJnZXQwMi54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2Zvcm1hdFRlc3RfdGFyZ2V0MDIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzk4Mjc1Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZm9ybWF0VGVzdF90YXJnZXQwMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08IS0tCi0gICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICAKLSAgICAgQ29udHJpYnV0b3JzOgotICAgICAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJmb3JtYXRUZXN0Ij4KLQotICAgICAgIDwhLS0gPSA9ID0gPSA9ID0gLS0+Ci0gICAgICAgPCEtLSBmb3JtYXRUZXN0ICAtLT4KLSAgICAgICA8IS0tID0gPSA9ID0gPSA9IC0tPgotICAgICAgIDx0YXJnZXQgbmFtZT0iZm9ybWF0VGVzdCIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249Ii0tPiB0ZXN0IHRhcmdldCBvbmUiPgotICAgICAgICAgICAgICA8IS0tIGhlbGxvIHdvcmxkIC0tPgotICAgICAgICAgICAgICA8Z3JlZXRpbmcgLz4KLSAgICAgICA8L3RhcmdldD4KLQotICAgICAgIDwhLS0gLSAtIC0gLSAtIC0gLS0+Ci0gICAgICAgPCEtLSBpbml0ICAgICAgICAtLT4KLSAgICAgICA8IS0tIC0gLSAtIC0gLSAtIC0tPgotICAgICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJncmVldGluZyIgdmFsdWU9ImhpIiAvPgotICAgICAgICAgICAgICA8cHJlc2V0ZGVmIG5hbWU9ImdyZWV0aW5nIj4KLSAgICAgICAgICAgICAgICAgICAgIDxlY2hvPiR7Z3JlZXRpbmd9PC9lY2hvPgotICAgICAgICAgICAgICA8L3ByZXNldGRlZj4KLSAgICAgICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZm9ybWF0VGVzdF90YXJnZXQwMy54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2Zvcm1hdFRlc3RfdGFyZ2V0MDMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWQ1MWI5Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZm9ybWF0VGVzdF90YXJnZXQwMy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08IS0tCi0gICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICAKLSAgICAgQ29udHJpYnV0b3JzOgotICAgICAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gLS0+Ci08cHJvamVjdCBkZWZhdWx0PSJmb3JtYXRUZXN0Ij4KLQotCTwhLS0gPSA9ID0gPSA9ID0gLS0+Ci0JPCEtLSBmb3JtYXRUZXN0ICAtLT4KLQk8IS0tID0gPSA9ID0gPSA9IC0tPgotCTx0YXJnZXQgbmFtZT0iZm9ybWF0VGVzdCIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249Ii0tPiB0ZXN0IHRhcmdldCBvbmUiPgotCQk8IS0tIGhlbGxvIHdvcmxkIC0tPgotCQk8Z3JlZXRpbmcgLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gLSAtIC0gLSAtIC0gLS0+Ci0JPCEtLSBpbml0ICAgICAgICAtLT4KLQk8IS0tIC0gLSAtIC0gLSAtIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJncmVldGluZyIgdmFsdWU9ImhpIiAvPgotCQk8cHJlc2V0ZGVmIG5hbWU9ImdyZWV0aW5nIj4KLQkJCTxlY2hvPiR7Z3JlZXRpbmd9PC9lY2hvPgotCQk8L3ByZXNldGRlZj4KLQk8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvaW1wb3J0LnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvaW1wb3J0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ3NWE4MS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2ltcG9ydC54bWwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2ltcG9ydFJlcXVpcmluZ1VzZXJQcm9wLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvaW1wb3J0UmVxdWlyaW5nVXNlclByb3AueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGExMjcxLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvaW1wb3J0UmVxdWlyaW5nVXNlclByb3AueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08cHJvamVjdCBuYW1lPSJpbXBvcnRSZXF1aXJpbmdVc2VyUHJvcGVydGllcyIgZGVmYXVsdD0iaW1wb3J0LWRlZmF1bHQiPgotCTxkZXNjcmlwdGlvbj4ke2ltcG9ydEZpbGVOYW1lIHRvIGJlIGRlZmluZWQgYXMgYW4gYXJndW1lbnQsIGNvbmZpZyBwcm9wZXJ0eSBvciBpbiBhIGNvbmZpZyBwcm9wZXJ0eSBmaWxlPC9kZXNjcmlwdGlvbj4KLQk8aW1wb3J0IGZpbGU9IiR7aW1wb3J0RmlsZU5hbWV9IiAvPgotCTx0YXJnZXQgbmFtZT0ib25lIiBkZXBlbmRzPSJpbXBvcnQtZGVmYXVsdCI+Ci0JCTxlY2hvPm9uZTwvZWNobz4KLQk8L3RhcmdldD4KLQotPC9wcm9qZWN0PgotCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2ltcG9ydFdpdGhCeXRlT3JkZXJNYXJrLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvaW1wb3J0V2l0aEJ5dGVPcmRlck1hcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjg2MmFlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvaW1wb3J0V2l0aEJ5dGVPcmRlck1hcmsueG1sCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9pbnB1dC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2lucHV0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ3MGFiNS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2lucHV0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iaW5wdXQgdGVzdGluZyIgZGVmYXVsdD0gImlucHV0IHRlc3QiPgotCTx0YXJnZXQgbmFtZT0iaW5wdXQgdGVzdCI+Ci0JCTxpbnB1dCBtZXNzYWdlPSJFbnRlciBmb3IgZWNobyIgYWRkcHJvcGVydHk9ICJpbnB1dFRlc3QiPgotCQk8L2lucHV0PgotCQk8ZWNobyBtZXNzYWdlPSIke2lucHV0VGVzdH0iLz4KLQk8L3RhcmdldD4JCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9pbnRlcm5hbFRhcmdldHMueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9pbnRlcm5hbFRhcmdldHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDExMjUzLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvaW50ZXJuYWxUYXJnZXRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJwcm9qZWN0IiBkZWZhdWx0PSItZGVmYXVsdCI+Ci0JPHRhcmdldCBuYW1lPSJpbnRlcm5hbDEiPgotCQk8IS0tIGludGVybmFsIGJlY2F1c2UgZG9lcyBpdCBkb2VzIG5vdCBoYXZlIGRlc2NyaXB0aW9uIGF0dHJpYnV0ZSAtLT4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9Ii1pbnRlcm5hbDIiIGRlc2NyaXB0aW9uPSJzb21ldGhpbmciPgotCQk8IS0tIGludGVybmFsIGJlY2F1c2UgaXQgaGFzIG5hbWUgc3RhcnRpbmcgd2l0aCAnLScgLS0+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9Im5vbi1pbnRlcm5hbCIgZGVzY3JpcHRpb249InNvbWV0aGluZyI+Ci0JCTwhLS0gbm9uIGludGVybmFsIGJlY2F1c2UgaXQgaGFzIGRlc2NyaXB0aW9uIGF0dHJpYnV0ZSAtLT4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iLWRlZmF1bHQiIGRlcGVuZHM9ImludGVybmFsMSwtaW50ZXJuYWwyLG5vbi1pbnRlcm5hbCI+Ci0JCTwhLS0gbm9uLWludGVybmFsIHRhcmdldCBiZWNhdXNlIGl0IGlzIGRlZmF1bHQgdGFyZ2V0IC0tPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9qYXZhYy54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2phdmFjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlMDBjMi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2phdmFjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPHByb2plY3QgZGVmYXVsdD0iamF2YWNJdCI+Ci0JPHRhcmdldCBuYW1lPSJqYXZhY0l0Ij4KLQkJPGphdmFjIGluY2x1ZGVqYXZhcnVudGltZT0iIgotCQkJZm9sbG93c3ltbGlua3M9IiIKLQkJCWluY2x1ZGVhbnRydW50aW1lPSIiLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL21hY3JvZGVmLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvbWFjcm9kZWYueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmUzNzMzLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvbWFjcm9kZWYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPHByb2plY3QgZGVmYXVsdD0idHlwZSI+Ci0KLQk8bWFjcm9kZWYgbmFtZT0iZWNsaXBzZU1hY3JvIj4KLQkJPGF0dHJpYnV0ZSBuYW1lPSJ2IiBkZWZhdWx0PSJOT1QgU0VUIiAvPgotCQk8YXR0cmlidXRlIG5hbWU9ImVjbGlwc2UiIGRlZmF1bHQ9InllcyIgZGVzY3JpcHRpb249IlRlc3RpbmcgRWNsaXBzZSIvPgotCQk8ZWxlbWVudCBuYW1lPSJzb21lLXRhc2tzIiBvcHRpb25hbD0ieWVzIiAvPgotCQk8c2VxdWVudGlhbD4KLQkJCTxlY2hvPkVjbGlwc2UhOiBAe3Z9PC9lY2hvPgotCQk8L3NlcXVlbnRpYWw+Ci0JPC9tYWNyb2RlZj4KLQotCTx0YXJnZXQgbmFtZT0idHlwZSI+Ci0JCTxlY2xpcHNlTWFjcm8gdj0iVGhpcyBpcyB2Ij4KLQkJCQotCQk8L2VjbGlwc2VNYWNybz4KLQkJPGVjbGlwc2VNYWNybyB2PSJUaGlzIGlzIHYyIi8+Ci0JCTxlY2xpcHNlTWFjcm8gdj0iVGhpcyBpcyB2MyIvPgotCQk8ZWNsaXBzZU1hY3JvIHY9IlRoaXMgaXMgdjQiLz4KLQkJPGVjbGlwc2VNYWNyby8+Ci0JPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL21peGVkLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvbWl4ZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjhlZGJiLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvbWl4ZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPHByb2plY3Q+PHRhcmdldD48c3FsIGRyaXZlcj0iIiBwYXNzd29yZD0iIiB1cmw9IiIgdXNlcmlkPSIiPjwvc3FsPjxjb25jYXQ+PC9jb25jYXQ+PC90YXJnZXQ+PC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvbmVzdGVkRWxlbWVudEF0dHJpYnV0ZXMueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9uZXN0ZWRFbGVtZW50QXR0cmlidXRlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMGQ5MTkuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9uZXN0ZWRFbGVtZW50QXR0cmlidXRlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTxwcm9qZWN0IGRlZmF1bHQ9ImdvIj4KLQk8dGFza2RlZiBuYW1lPSJuZXN0ZWRUZXN0IiBjbGFzc25hbWU9Im9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5zdXBwb3J0LnRhc2tzLk5lc3RFbGVtZW50VGFzayIgLz4KLQk8dGFyZ2V0IG5hbWU9ImdvIj4KLQkJPG5lc3RlZFRlc3Q+Ci0JCQk8bmVzdGVkZWxlbWVudCB3b3Jrcz0iIiAvPgotCQk8L25lc3RlZFRlc3Q+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9vY2N1cnJlbmNlc1Rlc3QueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9vY2N1cnJlbmNlc1Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzg3OTNiLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvb2NjdXJyZW5jZXNUZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9ImRlZmF1bHQiIGRlZmF1bHQ9ImRlZmF1bHQiPgotCTxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIGRlZmF1bHQKLSAgICA8L2Rlc2NyaXB0aW9uPgotCTxwcm9wZXJ0eSBuYW1lPSJkZXN0QmFzZSIgbG9jYXRpb249ImM6XHRlbXBcZXhhbXBsZSIgLz4KLQk8cHJvcGVydHkgbmFtZT0id29ya3NwYWNlIiBsb2NhdGlvbj0iYzpcZWNsaXBzZTMuMVxkZXYiIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImNvcmVTb3VyY2UiIGxvY2F0aW9uPSIke3dvcmtzcGFjZX0ke2Rlc3RCYXNlfQotXGV4YW1wbGUuZGVidWcuY29yZSIgLz4KLQk8cHJvcGVydHkgbmFtZT0idWlTb3VyY2UiIGxvY2F0aW9uPSIke3dvcmtzcGFjZX1cZXhhbXBsZS5kZWJ1Zy51aSIgLz4KLQotCTx0YXJnZXQgbmFtZT0iZGVmYXVsdCIgZGVzY3JpcHRpb249ImRlZmF1bHQiPgotCQkKLSAgICA8bWFjcm9kZWYgbmFtZT0icHJvY2VzcyI+Ci0gICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdGRpciIvPgotICAgIAk8YXR0cmlidXRlIG5hbWU9InN5bWJvbHMiLz4KLSAgICAgICAgPHNlcXVlbnRpYWw+Ci0gICAgICAgICAgICA8ZGVsZXRlIGRpcj0iQHtkZXN0ZGlyfSIvPgotICAgICAgICAJPG1rZGlyIGRpcj0iQHtkZXN0ZGlyfVxleGFtcGxlLmRlYnVnLmNvcmUiLz4KLSAgICAgICAgCTxta2RpciBkaXI9IkB7ZGVzdGRpcn1cZXhhbXBsZS5kZWJ1Zy51aSIvPgotICAgICAgICAJPHByZXByb2Nlc3MgZGVzdGRpcj0iQHtkZXN0ZGlyfVxleGFtcGxlLmRlYnVnLmNvcmUiIHN5bWJvbHM9IkAKLXtzeW1ib2xzfSI+Ci0gICAgICAgIAkJPGZpbGVzZXQgZGlyPSIke2NvcmVTb3VyY2V9Ij4KLSAgICAgICAgCQkJPGV4Y2x1ZGUgbmFtZT0iKiovKi5jbGFzcyIvPgotICAgICAgICAJCTwvZmlsZXNldD4KLSAgICAgICAgCTwvcHJlcHJvY2Vzcz4KLSAgICAgICAgCTxwcmVwcm9jZXNzIGRlc3RkaXI9IkB7ZGVzdGRpcn1cZXhhbXBsZS5kZWJ1Zy51aSIgc3ltYm9scz0iQAote3N5bWJvbHN9Ij4KLSAgICAgICAgCQk8ZmlsZXNldCBkaXI9IiR7dWlTb3VyY2V9Ij4KLSAgICAgICAgCQkJPGV4Y2x1ZGUgbmFtZT0iKiovKi5jbGFzcyIvPgotICAgICAgICAJCTwvZmlsZXNldD4KLSAgICAgICAgCTwvcHJlcHJvY2Vzcz4KLSAgICAgICAgPC9zZXF1ZW50aWFsPgotICAgIDwvbWFjcm9kZWY+Ci0KLQk8cHJvY2VzcyBkZXN0ZGlyPSIke2Rlc3RCYXNlfVxleGVyY2lzZTEuMSIgc3ltYm9scz0iZXgxIi8+Ci0JPHByb2Nlc3MgZGVzdGRpcj0iJHtkZXN0QmFzZX1cZXhlcmNpc2UyLjEiIHN5bWJvbHM9ImV4MiIvPgkJCi0JCQotCQk8cHJvcGVydHkgbmFtZT0ic2FtZU5hbWVBc1Byb3AiIHZhbHVlPSJoYXJkVG9EaXN0aW5ndWlzaCIvPgotCQkKLTxwcm9wZXJ0eSBuYW1lPSJleHRlbmRzRGVzdEJhc2UiIHZhbHVlPSIke2Rlc3RCYXNlfS9leHRlbnNpb24iLz4KLQkJPGVjaG8+JHtleHRlbmRzRGVzdEJhc2V9PC9lY2hvPgotCQkKLQkJPGFudCB0YXJnZXQ9ImRlZmF1bHQiPjwvYW50PgotCQk8YW50Y2FsbCB0YXJnZXQ9ImRlZmF1bHQiPjwvYW50Y2FsbD4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InNhbWVOYW1lQXNQcm9wIiB1bmxlc3M9ImV4dGVuZHNEZXN0QmFzZSIgaWY9ImRlc3RCYXNlIj48L3RhcmdldD4KLQk8ZmFpbCB1bmxlc3M9ImRlc3RCYXNlIiBtZXNzYWdlPSJQcm9wZXJ0eSBub3Qgc2V0LiIvPgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvb3V0bGluZV9zZWxlY3RfdGVzdF9idWlsZC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL291dGxpbmVfc2VsZWN0X3Rlc3RfYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGYwZjVlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvb3V0bGluZV9zZWxlY3RfdGVzdF9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5hbnQuZWRpdG9yIiBkZWZhdWx0PSJ6aXAucGx1Z2luIiBiYXNlZGlyPSIuIj4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9InByb3BlcnRpZXMiPgotCSAgICA8cHJvcGVydHkgZmlsZT0iYnVpbGQucHJvcGVydGllcyIgLz4KLQkJPHByb3BlcnR5IG5hbWU9InZlcnNpb24uc3VmZml4IiB2YWx1ZT0iXzAuNC41IiAvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luc19kaXIiIHZhbHVlPSIke2VjbGlwc2VfZGlyfS9wbHVnaW5zIiAvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luIiB2YWx1ZT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5hbnQuZWRpdG9yIiAvPgotCQk8cHJvcGVydHkgbmFtZT0iZnVsbC5uYW1lIiB2YWx1ZT0iJHtwbHVnaW59JHt2ZXJzaW9uLnN1ZmZpeH0iIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZW1wLmZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0vdGVtcC5mb2xkZXIiIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uZGVzdGluYXRpb24iIHZhbHVlPSIke2Jhc2VkaXJ9IiAvPgotCQk8cHJvcGVydHkgbmFtZT0iYnVpbGQucmVzdWx0LmZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0iIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzb3VyY2UuYW50RWRpdG9yLmphciIgdmFsdWU9InNyYy8iIC8+Ci0JCTxlY2hvIG1lc3NhZ2U9IlZhbHVlIGlzICR7cGx1Z2luc19kaXJ9IiAvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJwcm9wZXJ0aWVzIiBpZj0iZWNsaXBzZS5ydW5uaW5nIj4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSkRUQ29tcGlsZXJBZGFwdGVyIi8+Ci0JPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvcGVyZm9ybWFuY2UvYnVpbGQueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9wZXJmb3JtYW5jZS9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMzQ5MDMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9wZXJmb3JtYW5jZS9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDE5OTMtMjAwMyBTRUFHVUxMIC0tPgotPD94bS13ZWxsX2Zvcm1lZCBwYXRoID0gIiI/PgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUJ1aWxkIGZpbGUgZm9yIHRoZSBUcmFuc2lkaW9tIEphdmEgY29tcG9uZW50czogQUlTLCBJRFQsIElGVCwgZXRjLgotCi1Ob3RlczoKLQotICAgLSBUaGlzIGlzIGEgYnVpbGQgZmlsZSBmb3IgdXNlIHdpdGggdGhlIEpha2FydGEgQW50IGJ1aWxkIHRvb2wuCi0gICAtIG5hbWluZyBndWlkZWxpbmVzOgotICAgICAtIEZvciBwcm9wZXJ0aWVzLCB0aGUgbmFtZXMgYXJlIGdlbmVyYWxseSBtb2R1bGVOYW1lLnByb3BlcnR5VHlwZSwgZS5nLiBhaXMuZmlsZXMuCi0gICAgIC0gRm9yIHRhcmdldHMsIHRoZSBuYW1lcyBhcmUgZ2VuZXJhbGx5IGFjdGlvbi5tb2R1bGVOYW1lLCBlLmcuIGNvbXBpbGUuYWlzLgotCi1QcmVyZXF1aXNpdGVzOgotCi0gICBqYWthcnRhLWFudCBmcm9tIGh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcKLSAgIEEgSkFYUC1jb21wbGlhbnQgWFNMVCB0cmFuc2Zvcm1lci4KLSAgICAgLSBYYWxhbiwgZnJvbSBodHRwOi8veG1sLmFwYWNoZS5vcmcuCi0gICBBIEpBWFAtY29tcGxpYW50IERPTSBwYXJzZXIuCi0gICAgIC0gWGVyY2VzLCBmcm9tIGh0dHA6Ly94bWwuYXBhY2hlLm9yZy4KLQotTWFpbiB0YXJnZXRzOgotCi0gY2xlYW4gICAgICAgICAgUmVtb3ZlcyBhbGwgdGhlIGdlbmVyYXRlZCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMKLSBjbGVhbi5jbGFzc2VzICBSZW1vdmVzIGFsbCAuY2xhc3MgZmlsZXMKLSBjb21waWxlICAgICAgICBDb21waWxlcyBhbGwgdGhlIHNvdXJjZXMgaW50byAke2J1aWxkLmNsYXNzZXN9Ci0gZGlzdCAgICAgICAgICAgQ3JlYXRlcyB0aGUgZGlzdHJpYnV0aW9uIGluICR7YnVpbGQuZGlzdH0KLSBqYXJzICAgICAgICAgICBDcmVhdGVzIHRoZSBqYXIgZmlsZXMgaW4gJHtidWlsZC5saWJ9Ci0gbmlnaHRseS1idWlsZCAgQ3JlYXRlcyBhIG5pZ2h0bHkgYnVpbGQgKGRvZXMgaXQgYWxsKQotIHRlc3QgICAgICAgICAgIFJ1bnMgdGhlIHRlc3RzLgotIHRlc3QuY29tcGlsZSAgIENvbXBpbGVzIHRoZSB1bml0IHRlc3RzIHdpdGhvdXQgdHJpZ2dlcmluZyBhbnkgZGVwZW5kZW5jaWVzLgotIHZlcmlmeSAgICAgICAgIFZlcmlmaWVzIHRoZSBidWlsZCBieSBwZXJmb3JtaW5nIGEgbG9hZCB0ZXN0cyBvbiBqYXIgZmlsZXMgKGRvZXMgbm90IHRyaWdnZXIgdGhlIGphciBkZXBlbmRlbmNpZXMuKQotIHppcCAgICAgICAgICAgIENyZWF0ZXMgdGhlIGZpbmFsICR7emlwLWZpbGV9IChkb2VzIGl0IGFsbCkKLQotVE9ETzoKLSAgICBEaXN0aW5ndWlzaCBiZXR3ZWVuIGNvbXBpbGUgYW5kIHJ1bnRpbWUgY2xhc3NwYXRoOgotICAgIC0gY29tcG9uZW50LmNsYXNzcGF0aC5jb21waWxlCi0gICAgLSBjb21wb25lbnQuY2xhc3NwYXRoLnJ0Ci0KLUF1dGhvcnM6Ci0KLSAgTGVlIEJyZWlzYWNoZXI6IGxicmVpc2FjaGVyQHNlYWd1bGxzdy5jb20KLSAgR2FyeSBHcmVnb3J5OiBnZ3JlZ29yeUBzZWFndWxsc3cuY29tCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHByb2plY3QgZGVmYXVsdD0iemlwIiBiYXNlZGlyPSIuIiBuYW1lPSJ0cmFuc2lkaW9tIj4KLSAgICA8IS0tIEdlbmVyYWwgcHJvcGVydGllcyAtLT4KLSAgICA8cHJvcGVydHkgZmlsZT0ibG9jYWwtYnVpbGQucHJvcGVydGllcyIvPgotICAgIDxwcm9wZXJ0eSBmaWxlPSJidWlsZC5wcm9wZXJ0aWVzIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9IkNPTVBBTlkud29yZCIgdmFsdWU9IlNFQUdVTEwiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0icHJvZHVjdC5uYW1lIiB2YWx1ZT0iQXBwbGljYXRpb24gSW50ZXJmYWNlIFNlcnZlciIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJOYW1lIiB2YWx1ZT0iQXBwbGljYXRpb24gSW50ZXJmYWNlIFNlcnZlciIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMucm9vdC5kaXIiIHZhbHVlPSIuLiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJiaW5hcnkucm9vdC5kaXIiIHZhbHVlPSIke3NyYy5yb290LmRpcn0vLi4vLi4vQmluRSIvPgotICAgIDwhLS0gVUdMWSEhIFRoaXMgY3JlYXRlcyBhIGRlcGVuZGVuY3kgdG8gdGhlICdFJyB0cmVlLiBOb3Qgc3VyZSBob3cgdG8gc29sdmUgaXQsIHRob3VnaCAtLT4KLSAgICA8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgdmFsdWU9IiR7c3JjLnJvb3QuZGlyfS9Tb3VyY2UiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iamF2YS5yZXNvdXJjZS5kaXIiIHZhbHVlPSIke3NyYy5yb290LmRpcn0vUmVzb3VyY2VzIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InhzbHQucmVzb3VyY2UuZGlyIiB2YWx1ZT0iLi4vLi4vUmVzb3VyY2VzL1hTTFQiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iZmRlZi5kaXJuYW1lIiB2YWx1ZT0iY29uZmlnL2Z1bmN0aW9ucyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJyb290LmRpciIgdmFsdWU9IiR7c3JjLnJvb3QuZGlyfS9Sb290Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InJvb3QuZGlyLnN5cyIgdmFsdWU9IiR7cm9vdC5kaXJ9L1N5c3RlbSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJyb290LmRpci5zeXNkZWYiIHZhbHVlPSIke3Jvb3QuZGlyLnN5c30vRGVmYXVsdHMiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0icm9vdC5kaXIuc2VydmVyIiB2YWx1ZT0iJHtyb290LmRpcn0vc2VydmVyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InJvb3QuZGlyLnNlcnZlci1jb25maWciIHZhbHVlPSIke3Jvb3QuZGlyLnNlcnZlcn0vY29uZmlnIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InJvb3QuZGlyLnRvb2xzLWNvbmZpZyIgdmFsdWU9IiR7cm9vdC5kaXJ9L3Rvb2xzL2NvbmZpZyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJyb290LmRpci5tcSIgdmFsdWU9IiR7cm9vdC5kaXJ9L21xIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InJvb3QuZGlyLnNlcnZlci1sb2ciIHZhbHVlPSIke3Jvb3QuZGlyLnNlcnZlci1jb25maWd9L2xvZyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJyb290LmRpci5zZXJ2ZXItdHJhbnNmb3JtIiB2YWx1ZT0iJHtyb290LmRpci5zZXJ2ZXItY29uZmlnfS90cmFuc2Zvcm0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0icm9vdC5kaXIudG9vbHMtbG9nIiB2YWx1ZT0iJHtyb290LmRpci50b29scy1jb25maWd9L2xvZyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJkb2MuZGlyIiB2YWx1ZT0iJHtzcmMucm9vdC5kaXJ9L0RvYy9EZWxpdmVyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRlc3QuZGlyIiB2YWx1ZT0iJHtzcmMucm9vdC5kaXJ9L1Rlc3QiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ic3JjLnRlc3QuZGlyIiB2YWx1ZT0iJHt0ZXN0LmRpcn0vU291cmNlIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0vLi4vYnVpbGRvdXRwdXQiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY2xhc3NlcyIgdmFsdWU9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmV0YyIgdmFsdWU9IiR7YnVpbGQuZGlyfS9ldGMiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQubGliIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L2xpYiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jaGVja3N1bSIgbG9jYXRpb249IiR7YnVpbGQubGlifS9jaGVja3N1bSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGwtamFycy54bWwiIGxvY2F0aW9uPSIke2J1aWxkLmNoZWNrc3VtfS9hbGwtamFycy54bWwiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlzdCIgdmFsdWU9IiR7YnVpbGQuZGlyfS9kaXN0Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InppcEZpbGVCYXNlTmFtZSIgdmFsdWU9IkFwcEludGVyZmFjZSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aGlyZHBhcnR5LmRpciIgdmFsdWU9Ii4uLy4uLy4uLy4uL1RoaXJkUGFydHkiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ibW9kaWZpZWR0aGlyZHBhcnR5LmRpciIgdmFsdWU9Ii4uLy4uL01vZGlmaWVkVGhpcmRQYXJ0eSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJzb3VyY2VzYWZlbWlycm9yLmRpciIgdmFsdWU9Ii4uLy4uL1NvdXJjZVNhZmVNaXJyb3IiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ic3JjLnNvdXJjZXNhZmVtaXJyb3IuZGlyIiB2YWx1ZT0iJHtzb3VyY2VzYWZlbWlycm9yLmRpcn0vSmF2YS9Tb3VyY2UiLz4KLSAgICA8IS0tIDNyZCBwYXJ0eSBqYXIgcmVmZXJlbmNlcyAtLT4KLSAgICA8cHJvcGVydHkgbmFtZT0iYXBhY2hlLmRpciIgdmFsdWU9IiR7dGhpcmRwYXJ0eS5kaXJ9L2FwYWNoZS5vcmciLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ieGFsYW4uZGlyIiB2YWx1ZT0iJHthcGFjaGUuZGlyfS94YWxhbi1qLzIuNS4xL2JpbiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJhbnQuamFybmFtZSIgdmFsdWU9ImFudC5qYXIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYW50LmphciIgdmFsdWU9IiR7YXBhY2hlLmRpcn0vamFrYXJ0YS1hbnQvMS41LjIvJHthbnQuamFybmFtZX0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ieGVyY2VzLmphcm5hbWUiIHZhbHVlPSJ4ZXJjZXNJbXBsLmphciIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ4ZXJjZXMuamFyIiB2YWx1ZT0iJHt4YWxhbi5kaXJ9LyR7eGVyY2VzLmphcm5hbWV9Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InhhbGFuLmphcm5hbWUiIHZhbHVlPSJ4YWxhbi5qYXIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ieGFsYW4uamFyIiB2YWx1ZT0iJHt4YWxhbi5kaXJ9LyR7eGFsYW4uamFybmFtZX0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ieHNsdGMuamFybmFtZSIgdmFsdWU9InhzbHRjLmphciIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ4c2x0Yy5qYXIiIHZhbHVlPSIke3hhbGFuLmRpcn0vJHt4c2x0Yy5qYXJuYW1lfSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ4bWwtYXBpcy5qYXJuYW1lIiB2YWx1ZT0ieG1sLWFwaXMuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InhtbC1hcGlzLmphciIgdmFsdWU9IiR7eGFsYW4uZGlyfS8ke3htbC1hcGlzLmphcm5hbWV9Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNvYXAuamFybmFtZSIgdmFsdWU9InNvYXAuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNvYXAuamFyIiB2YWx1ZT0iJHttb2RpZmllZHRoaXJkcGFydHkuZGlyfS9Tb2FwLzIuMi9qYXZhL2J1aWxkL2xpYi8ke3NvYXAuamFybmFtZX0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ibWFpbC5qYXJuYW1lIiB2YWx1ZT0ibWFpbGFwaS5qYXIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ibWFpbC5qYXIiIHZhbHVlPSIke3RoaXJkcGFydHkuZGlyfS9zdW4vSmF2YU1haWwvMS4zL2xpYi8ke21haWwuamFybmFtZX0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYWN0aXZhdGlvbi5qYXJuYW1lIiB2YWx1ZT0iYWN0aXZhdGlvbi5qYXIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYWN0aXZhdGlvbi5qYXIiIHZhbHVlPSIke3RoaXJkcGFydHkuZGlyfS9zdW4vamFmLzEuMC4yLyR7YWN0aXZhdGlvbi5qYXJuYW1lfSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2bGV0Lmphcm5hbWUiIHZhbHVlPSJzZXJ2bGV0LmphciIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJzZXJ2bGV0LmRpciIgdmFsdWU9IiR7YXBhY2hlLmRpcn0vamFrYXJ0YS10b21jYXQvMy4yLjEvU2VydmxldEFQSS9saWIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ic2VydmxldC5qYXIiIHZhbHVlPSIke3NlcnZsZXQuZGlyfS8ke3NlcnZsZXQuamFybmFtZX0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iY29tbW9ucy1odHRwY2xpZW50Lmphcm5hbWUiIHZhbHVlPSJjb21tb25zLWh0dHBjbGllbnQtMi4wLXJjMi5qYXIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iY29tbW9ucy1odHRwY2xpZW50LmRpciIgdmFsdWU9IiR7YXBhY2hlLmRpcn0vY29tbW9ucy1odHRwY2xpZW50LzIuMC1yYzIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iY29tbW9ucy1odHRwY2xpZW50LmphciIgdmFsdWU9IiR7Y29tbW9ucy1odHRwY2xpZW50LmRpcn0vJHtjb21tb25zLWh0dHBjbGllbnQuamFybmFtZX0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iY29tbW9ucy1sb2dnaW5nLmphcm5hbWUiIHZhbHVlPSJjb21tb25zLWxvZ2dpbmcuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvbW1vbnMtbG9nZ2luZy5kaXIiIHZhbHVlPSIke2FwYWNoZS5kaXJ9L2NvbW1vbnMtbG9nZ2luZy8xLjAuMyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tb25zLWxvZ2dpbmcuamFyIiB2YWx1ZT0iJHtjb21tb25zLWxvZ2dpbmcuZGlyfS8ke2NvbW1vbnMtbG9nZ2luZy5qYXJuYW1lfSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJpYm0ubXEuamFybmFtZSIgdmFsdWU9ImNvbS5pYm0ubXEuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImlibS5tcS5qYXIiIHZhbHVlPSIke3RoaXJkcGFydHkuZGlyfS9JQk0vTVFTZXJpZXMvNS4yLjIvJHtpYm0ubXEuamFybmFtZX0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iaWJtLm1xYmluZC5qYXIiIHZhbHVlPSIke3RoaXJkcGFydHkuZGlyfS9JQk0vTVFTZXJpZXMvNS4yLjIvY29tLmlibS5tcWJpbmQuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImlibS5tcWptcy5qYXIiIHZhbHVlPSIke3RoaXJkcGFydHkuZGlyfS9JQk0vTVFTZXJpZXMvNS4yLjIvY29tLmlibS5tcWptcy5qYXIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iaWJtLm1xLmNvbm5lY3Rvci5qYXIiIHZhbHVlPSIke3RoaXJkcGFydHkuZGlyfS9JQk0vTVFTZXJpZXMvNS4yLjIvY29ubmVjdG9yLmphciIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJpYm0ubXEuanRhLmphciIgdmFsdWU9IiR7dGhpcmRwYXJ0eS5kaXJ9L0lCTS9NUVNlcmllcy81LjIuMi9qdGEuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Im1pY3Jvc29mdHNlY3VyaXR5Y2xhc3Nlcy56aXAiIHZhbHVlPSIke3RoaXJkcGFydHkuZGlyfS9NaWNyb3NvZnQvc2VjdXJpdHkvNS4wMC4yOTIyLjAvTWljcm9zb2Z0U2VjdXJpdHlDbGFzc2VzLnppcCIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tb25zLWNvZGVjLmphcm5hbWUiIHZhbHVlPSJjb21tb25zLWNvZGVjLTEuMS4xLWRldi5qYXIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iY29tbW9ucy1jb2RlYy5qYXIiIHZhbHVlPSIke2FwYWNoZS5kaXJ9L2NvbW1vbnMtY29kZWMvMjAwMzA1MTYvJHtjb21tb25zLWNvZGVjLmphcm5hbWV9Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvbW1vbnMtY29sbGVjdGlvbnMuamFybmFtZSIgdmFsdWU9ImNvbW1vbnMtY29sbGVjdGlvbnMtMl8xLmphciIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tb25zLWNvbGxlY3Rpb25zLmphciIgdmFsdWU9IiR7YXBhY2hlLmRpcn0vY29tbW9ucy1jb2xsZWN0aW9ucy8yLjEvJHtjb21tb25zLWNvbGxlY3Rpb25zLmphcm5hbWV9Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvbW1vbnMtY2xpLmphcm5hbWUiIHZhbHVlPSJjb21tb25zLWNsaS0xXzAuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvbW1vbnMtY2xpLmphciIgdmFsdWU9IiR7YXBhY2hlLmRpcn0vY29tbW9ucy1jbGkvMS4wLyR7Y29tbW9ucy1jbGkuamFybmFtZX0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iY29tbW9ucy1sYW5nLmphcm5hbWUiIHZhbHVlPSJjb21tb25zLWxhbmctMi4wLmphciIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tb25zLWxhbmcuamFyIiB2YWx1ZT0iJHthcGFjaGUuZGlyfS9jb21tb25zLWxhbmcvMi4wLyR7Y29tbW9ucy1sYW5nLmphcm5hbWV9Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvbW1vbnMtcG9vbC5qYXJuYW1lIiB2YWx1ZT0iY29tbW9ucy1wb29sLmphciIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tb25zLXBvb2wuamFyIiB2YWx1ZT0iJHthcGFjaGUuZGlyfS9jb21tb25zLXBvb2wvMjAwMzA0MjkvJHtjb21tb25zLXBvb2wuamFybmFtZX0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iY3RnY2xpZW50Lmphcm5hbWUiIHZhbHVlPSJjdGdjbGllbnQuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImN0Z2NsaWVudC5kaXIiIHZhbHVlPSIke3RoaXJkcGFydHkuZGlyfS9JQk0vQ0lDUyBUcmFuc2FjdGlvbiBHYXRld2F5LzUuMCIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjdGdjbGllbnQuamFyIiB2YWx1ZT0iJHtjdGdjbGllbnQuZGlyfS8ke2N0Z2NsaWVudC5qYXJuYW1lfSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJqYWthcnRhLW9yby5qYXJuYW1lIiB2YWx1ZT0iamFrYXJ0YS1vcm8tMi4wLjcuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Impha2FydGEtb3JvLmphciIgdmFsdWU9IiR7YXBhY2hlLmRpcn0vamFrYXJ0YS1vcm8vMi4wLjcvJHtqYWthcnRhLW9yby5qYXJuYW1lfSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJsb2c0ai5qYXJuYW1lIiB2YWx1ZT0ibG9nNGotMV8yXzcuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImxvZzRqLmphciIgdmFsdWU9IiR7YXBhY2hlLmRpcn0vamFrYXJ0YS1sb2c0ai8xLjIuNy8ke2xvZzRqLmphcm5hbWV9Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImdvWE1MRW5naW5lLmphciIgdmFsdWU9IiR7dGhpcmRwYXJ0eS5kaXJ9L1hNTEdsb2JhbC9Hb1hNTFRyYW5zZm9ybS8zXzBfMC9saWIvZW5naW5lLmphciIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJnb1hNTFJlc291cmNlLnppcCIgdmFsdWU9IiR7dGhpcmRwYXJ0eS5kaXJ9L1hNTEdsb2JhbC9Hb1hNTFRyYW5zZm9ybS8zXzBfMC9saWIvcmVzb3VyY2UuemlwIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImdvWE1MY29uZmlnLmRpciIgdmFsdWU9IiR7dGhpcmRwYXJ0eS5kaXJ9L1hNTEdsb2JhbC9Hb1hNTFRyYW5zZm9ybS8zXzBfMC9jb25maWciLz4KLSAgICA8IS0tIEpEb20gYmV0YSA4IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggR29YTUxUcmFuc2Zvcm0gMy4wLjAsIHVzZSBiZXRhIDcgZnJvbSBHb1hNTFRyYW5zZm9ybSAzLjAuMCAtLT4KLSAgICA8cHJvcGVydHkgbmFtZT0iamRvbS5qYXJuYW1lIiB2YWx1ZT0iamRvbS5qYXIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iamRvbS5qYXIiIHZhbHVlPSIke3RoaXJkcGFydHkuZGlyfS9YTUxHbG9iYWwvR29YTUxUcmFuc2Zvcm0vM18wXzAvbGliLyR7amRvbS5qYXJuYW1lfSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXhiMS5qYXJuYW1lIiB2YWx1ZT0iamF4Yi1hcGkuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpheGIyLmphcm5hbWUiIHZhbHVlPSJqYXhiLWltcGwuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpheGIzLmphcm5hbWUiIHZhbHVlPSJqYXhiLWxpYnMuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpheGI0Lmphcm5hbWUiIHZhbHVlPSJqYXgtcW5hbWUuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpheGI1Lmphcm5hbWUiIHZhbHVlPSJuYW1lc3BhY2UuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpheGI2Lmphcm5hbWUiIHZhbHVlPSJ4c2RsaWIuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpheGI3Lmphcm5hbWUiIHZhbHVlPSJyZWxheG5nRGF0YXR5cGUuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpheGIuamFybmFtZXMiIHZhbHVlPSIke2pheGIxLmphcm5hbWV9ICR7amF4YjIuamFybmFtZX0gJHtqYXhiMy5qYXJuYW1lfSAke2pheGI0Lmphcm5hbWV9ICR7amF4YjUuamFybmFtZX0gJHtqYXhiNi5qYXJuYW1lfSAke2pheGI3Lmphcm5hbWV9ICIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJqd3NkcC5kaXIiIHZhbHVlPSIke3RoaXJkcGFydHkuZGlyfS9zdW4vandzZHAvMS4yIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpheGIuZGlyIiB2YWx1ZT0iJHtqd3NkcC5kaXJ9L2pheGIvbGliIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpheGIuc2hhcmVkLmRpciIgdmFsdWU9IiR7andzZHAuZGlyfS9qd3NkcC1zaGFyZWQvbGliIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpheGIxLmphciIgdmFsdWU9IiR7amF4Yi5kaXJ9LyR7amF4YjEuamFybmFtZX0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iamF4YjIuamFyIiB2YWx1ZT0iJHtqYXhiLmRpcn0vJHtqYXhiMi5qYXJuYW1lfSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXhiMy5qYXIiIHZhbHVlPSIke2pheGIuZGlyfS8ke2pheGIzLmphcm5hbWV9Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpheGI0LmphciIgdmFsdWU9IiR7amF4Yi5zaGFyZWQuZGlyfS8ke2pheGI0Lmphcm5hbWV9Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpheGI1LmphciIgdmFsdWU9IiR7amF4Yi5zaGFyZWQuZGlyfS8ke2pheGI1Lmphcm5hbWV9Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpheGI2LmphciIgdmFsdWU9IiR7amF4Yi5zaGFyZWQuZGlyfS8ke2pheGI2Lmphcm5hbWV9Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpheGI3LmphciIgdmFsdWU9IiR7amF4Yi5zaGFyZWQuZGlyfS8ke2pheGI3Lmphcm5hbWV9Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Imptcy5qYXJuYW1lIiB2YWx1ZT0iam1zLTFfMF8yX2IuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Imptcy5qYXIiIHZhbHVlPSIke3RoaXJkcGFydHkuZGlyfS9zdW4vam1zLzEuMC4yYi8ke2ptcy5qYXJuYW1lfSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJqY2UuamFybmFtZSIgdmFsdWU9ImpjZTFfMl8yLmphciIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJqY2UuamFyIiB2YWx1ZT0iJHt0aGlyZHBhcnR5LmRpcn0vc3VuL2pjZS8xLjIuMi9saWIvJHtqY2UuamFybmFtZX0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iamNlX3Byb3ZpZGVyLmphcm5hbWUiIHZhbHVlPSJzdW5qY2VfcHJvdmlkZXIuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpjZV9wcm92aWRlci5qYXIiIHZhbHVlPSIke3RoaXJkcGFydHkuZGlyfS9zdW4vamNlLzEuMi4yL2xpYi8ke2pjZV9wcm92aWRlci5qYXJuYW1lfSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJqY2VydC5qYXJuYW1lIiB2YWx1ZT0iamNlcnQuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpuZXQuamFybmFtZSIgdmFsdWU9ImpuZXQuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Impzc2UuamFybmFtZSIgdmFsdWU9Impzc2UuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Impzc2UuZGlyIiB2YWx1ZT0iJHt0aGlyZHBhcnR5LmRpcn0vc3VuL2pzc2UvMS4wLjNfMDItZ2wvbGliIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpjZXJ0LmphciIgdmFsdWU9IiR7anNzZS5kaXJ9LyR7amNlcnQuamFybmFtZX0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iam5ldC5qYXIiIHZhbHVlPSIke2pzc2UuZGlyfS8ke2puZXQuamFybmFtZX0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ianNzZS5qYXIiIHZhbHVlPSIke2pzc2UuZGlyfS8ke2pzc2UuamFybmFtZX0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iamFhcy5qYXJuYW1lIiB2YWx1ZT0iamFhcy0xXzAuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImphYXMuamFyIiB2YWx1ZT0iJHt0aGlyZHBhcnR5LmRpcn0vc3VuL2phYXMvMS4wL2xpYi8ke2phYXMuamFybmFtZX0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ianRhLmphcm5hbWUiIHZhbHVlPSJqdGEtMV8wXzFCLWNsYXNzZXMuemlwIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Imp0YS5qYXIiIHZhbHVlPSIke3RoaXJkcGFydHkuZGlyfS9zdW4vanRhL2p0YS0xXzBfMWIvJHtqdGEuamFybmFtZX0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iY29uY3VycmVudC5qYXJuYW1lIiB2YWx1ZT0iY29uY3VycmVudC0xXzNfMi5qYXIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iY29uY3VycmVudC5qYXIiIHZhbHVlPSIke3RoaXJkcGFydHkuZGlyfS9vc3dlZ28uZWR1L3V0aWwuY29uY3VycmVudC8xLjMuMi8ke2NvbmN1cnJlbnQuamFybmFtZX0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ieG1sc2VjLmphciIgdmFsdWU9IiR7YXBhY2hlLmRpcn0veG1sLXNlY3VyaXR5L3htbC1zZWN1cml0eS0xXzBfNC9idWlsZC94bWxzZWMtMV8wXzQuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Imltc2ljby5qYXJuYW1lIiB2YWx1ZT0iaW1zaWNvLTFfMl81LmphciIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJpbXNpY28uamFyIiB2YWx1ZT0iJHt0aGlyZHBhcnR5LmRpcn0vSUJNL0lNU0lDTy8xLjIuNS8ke2ltc2ljby5qYXJuYW1lfSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJpbXNpY28tY29ubmVjdG9yLmphcm5hbWUiIHZhbHVlPSJpbXNpY28tY29ubmVjdG9yLTFfMl81LmphciIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJpbXNpY28tY29ubmVjdG9yLmphciIgdmFsdWU9IiR7dGhpcmRwYXJ0eS5kaXJ9L0lCTS9JTVNJQ08vMS4yLjUvJHtpbXNpY28tY29ubmVjdG9yLmphcm5hbWV9Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Imp1bml0LmphciIgdmFsdWU9IiR7dGhpcmRwYXJ0eS5kaXJ9L2p1bml0LzMuOC4xL2p1bml0LmphciIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJtdGp1bml0LmphciIgdmFsdWU9IiR7dGhpcmRwYXJ0eS5kaXJ9L01USlVuaXQvMS4wL01USlVuaXQtMS5qYXIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0icmV0cm9ndWFyZC5qYXIiIHZhbHVlPSIke3RoaXJkcGFydHkuZGlyfS9SZXRyb2d1YXJkLzEuMS4xMy9yZXRyb2d1YXJkLmphciIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJqMnNlLnRvb2xzLmphcm5hbWUiIHZhbHVlPSJ0b29scy5qYXIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iajJzZS50b29scy5qYXIiIHZhbHVlPSIke3RoaXJkcGFydHkuZGlyfS9zdW4vajJzZS8xLjMuMV8wOC9saWIvJHtqMnNlLnRvb2xzLmphcm5hbWV9Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Im9iZnVzY2F0ZS5zY3JpcHQiIHZhbHVlPSIke3NyYy5yb290LmRpcn0vQnVpbGQvb2JmdXNjYXRlX2hzYy5yZ3MiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ib2JmdXNjYXRlLmxvZyIgdmFsdWU9IiR7YnVpbGQubGlifS9vYmZ1c2NhdGVfaHNjLmxvZyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJleHRlbnNpb24uZGlyLm5hbWUiIHZhbHVlPSJleHQiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iY29tcGlsZS5kZWJ1ZyIgdmFsdWU9Im9uIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNvbXBpbGUub3B0aW1pemUiIHZhbHVlPSJvZmYiLz4KLSAgICA8IS0tIFRoZXNlIHR3byB3aWxsIG5vcm1hbGx5IGJlIHNldCBvdXRzaWRlIHRoaXMgZmlsZSBpbiB0aGUgYnVpbGQucHJvcGVydGllcyBmaWxlLiAtLT4KLSAgICA8cHJvcGVydHkgbmFtZT0idmVyc2lvbiIgdmFsdWU9IjIuMy5YLldJUCIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5pZCIgdmFsdWU9IjAiLz4KLSAgICA8IS0tIEphciBNYW5pZmVzdCBzdGFuZGFyZCBwcm9wZXJ0aWVzIC0tPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJtYW5pZmVzdC5rZXkubWFpbi1jbGFzcyIgdmFsdWU9Ik1haW4tQ2xhc3MiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ibWFuaWZlc3Qua2V5LmNsYXNzLXBhdGgiIHZhbHVlPSJDbGFzcy1QYXRoIi8+Ci0gICAgPCEtLSBKYXIgTWFuaWZlc3QgU2VhZ3VsbCBwcm9wZXJ0aWVzIC0tPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJtYW5pZmVzdC5rZXkucHJvZHVjdCIgdmFsdWU9IiR7Q09NUEFOWS53b3JkfS1Qcm9kdWN0Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Im1hbmlmZXN0LmtleS5jb21wb25lbnQiIHZhbHVlPSIke0NPTVBBTlkud29yZH0tQ29tcG9uZW50Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Im1hbmlmZXN0LmtleS52ZXJzaW9uIiB2YWx1ZT0iJHtDT01QQU5ZLndvcmR9LVZlcnNpb24iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ibWFuaWZlc3Qua2V5LmJ1aWxkIiB2YWx1ZT0iJHtDT01QQU5ZLndvcmR9LUJ1aWxkIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Im1hbmlmZXN0LmtleS5idWlsZC10cyIgdmFsdWU9IiR7Q09NUEFOWS53b3JkfS1CdWlsZC1UaW1lc3RhbXAiLz4KLSAgICA8IS0tIEphdmFkb2MgLS0+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImphdmFkb2MuajJzZS5saW5rIiB2YWx1ZT0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2FwaS8iLz4KLSAgICA8IS0tIENoZWNrc3VtIC0tPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjaGVja3N1bS5hbGdvcml0aG0ubWQ1IiB2YWx1ZT0iTUQ1Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNoZWNrc3VtLmFsZ29yaXRobS5zaGEiIHZhbHVlPSJTSEEiLz4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBTb3VyY2UgZmlsZXMgYW5kIGNsYXNzIHBhdGhzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIEFJUyAtLT4KLSAgICA8cGF0dGVybnNldCBpZD0iYWlzLmZpbGVzIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2Uvc2VydmVyLyoqIi8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvcGVyZnRlc3QvIi8+Ci0gICAgICAgIDxleGNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3NlcnZlci9iYWNrZW5kL2NpY3MvIi8+Ci0gICAgICAgIDxleGNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3NlcnZlci9iYWNrZW5kL2NvYm9sLyIvPgotICAgICAgICA8ZXhjbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9zZXJ2ZXIvYmFja2VuZC9pbXMvIi8+Ci0gICAgICAgIDxleGNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3NlcnZlci9iYWNrZW5kL2hvc3Rjb25uZWN0b3IvIi8+Ci0gICAgICAgIDxleGNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3NlcnZlci9iYWNrZW5kL2hvc3Rjb25uZWN0b3IyLyIvPgotICAgICAgICA8ZXhjbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9zZXJ2ZXIvYmFja2VuZC9oYzUyNTAvIi8+Ci0gICAgICAgIDxleGNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3NlcnZlci9iYWNrZW5kL2hjMzI3MC8iLz4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2Uvc2VydmVyL2FkbWluLyIvPgotICAgICAgICA8ZXhjbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9zZXJ2ZXIvSW52b2NhdGlvblVuaXRUZXN0cy4qIi8+Ci0gICAgPC9wYXR0ZXJuc2V0PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXMtY29yZS5qYXJuYW1lIiB2YWx1ZT0iYWlzLWNvcmUuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImFpcy1jb3JlLmphciIgdmFsdWU9IiR7YnVpbGQubGlifS8ke2Fpcy1jb3JlLmphcm5hbWV9Ii8+Ci0gICAgPHBhdGggaWQ9ImpheGIuY2xhc3NwYXRoIj4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pheGIxLmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pheGIyLmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pheGIzLmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pheGI0Lmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pheGI1Lmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pheGI2Lmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pheGI3Lmphcn0iLz4KLSAgICA8L3BhdGg+Ci0gICAgPHBhdGggaWQ9Impzc2UuY2xhc3NwYXRoIj4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pjZXJ0Lmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2puZXQuamFyfSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7anNzZS5qYXJ9Ii8+Ci0gICAgPC9wYXRoPgotICAgIDxwYXRoIGlkPSJqY2UuY2xhc3NwYXRoLnJ0Ij4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pjZS5qYXJ9Ii8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqY2VfcHJvdmlkZXIuamFyfSIvPgotICAgIDwvcGF0aD4KLSAgICA8cGF0aCBpZD0iYWlzLmNsYXNzcGF0aCI+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtpYm0ubXEuamFyfSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7aWJtLm1xYmluZC5qYXJ9Ii8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtpYm0ubXFqbXMuamFyfSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7eGVyY2VzLmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3htbC1hcGlzLmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3hhbGFuLmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3NvYXAuamFyfSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7bWFpbC5qYXJ9Ii8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWNvZGVjLmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtY29sbGVjdGlvbnMuamFyfSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1odHRwY2xpZW50Lmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbGFuZy5qYXJ9Ii8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLXBvb2wuamFyfSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1jbGkuamFyfSIvPgotICAgICAgICA8cGF0aCByZWZpZD0iamF4Yi5jbGFzc3BhdGgiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2ptcy5qYXJ9Ii8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb25jdXJyZW50Lmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pjZS5qYXJ9Ii8+Ci0gICAgPC9wYXRoPgotICAgIDxwYXRoIGlkPSJ4bWwuY2xhc3NwYXRoLmNvbXBpbGUiPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7eG1sLWFwaXMuamFyfSIvPgotICAgIDwvcGF0aD4KLSAgICA8cGF0aCBpZD0ieG1sLmNsYXNzcGF0aC5ydCI+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4bWwtYXBpcy5qYXJ9Ii8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4ZXJjZXMuamFyfSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7eGFsYW4uamFyfSIvPgotICAgIDwvcGF0aD4KLSAgICA8cGF0aCBpZD0idHJhbnNmb3Jtcy5jbGFzc3BhdGgiPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amFrYXJ0YS1vcm8uamFyfSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7eG1sLWFwaXMuamFyfSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7eGVyY2VzLmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3hhbGFuLmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2dvWE1MRW5naW5lLmphcn0iLz4KLSAgICAgICAgPHBhdGggcmVmaWQ9ImpheGIuY2xhc3NwYXRoIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWxhbmcuamFyfSIvPgotICAgIDwvcGF0aD4KLSAgICA8cGF0aCBpZD0iYWlzLmNsaWVudC5jbGFzc3BhdGgiPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7aWJtLm1xLmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2libS5tcWJpbmQuamFyfSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7aWJtLm1xam1zLmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3htbC1hcGlzLmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtY29sbGVjdGlvbnMuamFyfSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sYW5nLmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtcG9vbC5qYXJ9Ii8+Ci0gICAgICAgIDxwYXRoIHJlZmlkPSJqYXhiLmNsYXNzcGF0aCIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7am1zLmphcn0iLz4KLSAgICA8L3BhdGg+Ci0gICAgPCEtLSBBcHBJbnRlcmZhY2UgQ29tbXVuaWNhdGlvbnMgLS0+Ci0gICAgPHBhdHRlcm5zZXQgaWQ9ImFwcGludGVyZmFjZWNvbW0uZmlsZXMiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9jb21tLyIvPgotICAgICAgICA8ZXhjbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9jb21tL3NlcnZsZXQvKiIvPgotICAgIDwvcGF0dGVybnNldD4KLSAgICA8IS0tIE1UYWxrIENvbW11bmljYXRpb25zIC0tPgotICAgIDxwYXR0ZXJuc2V0IGlkPSJtdGFsa2NvbW0uZmlsZXMiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L25ldC9jbGllbnQvbXRhbGsvIi8+Ci0gICAgPC9wYXR0ZXJuc2V0PgotICAgIDwhLS0gQXBwSW50ZXJmYWNlIFNldHRpbmcgLS0+Ci0gICAgPHBhdHRlcm5zZXQgaWQ9ImFwcGludGVyZmFjZXNldHRpbmdzLmZpbGVzIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2Uvc2V0dGluZ3MvKiIvPgotICAgIDwvcGF0dGVybnNldD4KLSAgICA8cGF0aCBpZD0iYXBwaW50ZXJmYWNlc2V0dGluZ3MuY2xhc3NwYXRoIj4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3htbC1hcGlzLmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbGFuZy5qYXJ9Ii8+Ci0gICAgPC9wYXRoPgotICAgIDwhLS0gQXBwSW50ZXJmYWNlIFNlcnZlciBTZXR0aW5ncyAtLT4KLSAgICA8cGF0dGVybnNldCBpZD0iYXBwaW50ZXJmYWNlc2VydmVyc2V0dGluZ3MuZmlsZXMiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9zZXJ2ZXIvc2V0dGluZ3MvIi8+Ci0gICAgPC9wYXR0ZXJuc2V0PgotICAgIDwhLS0gQXBwSW50ZXJmYWNlIENsaWVudCAtLT4KLSAgICA8cGF0dGVybnNldCBpZD0iYWlzLmNsaWVudC5maWxlcyI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL2NsaWVudC8iLz4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy90b29sYm94L2NvbmZpZy8iLz4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy90b29sYm94L3htbC8iLz4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy90b29sYm94L2xvZy8iLz4KLSAgICA8L3BhdHRlcm5zZXQ+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImFpcy5jbGllbnQuamFybmFtZSIgdmFsdWU9ImFpcy1jbGllbnQuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImFpcy5jbGllbnQuamFyIiB2YWx1ZT0iJHtidWlsZC5saWJ9LyR7YWlzLmNsaWVudC5qYXJuYW1lfSIvPgotICAgIDwhLS0gQXBwSW50ZXJmYWNlIEFkbWluIENsaWVudC0tPgotICAgIDxwYXR0ZXJuc2V0IGlkPSJhaXMuYWRtaW5jbGllbnQuZmlsZXMiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9zZXJ2ZXIvYWRtaW4vKiIvPgotICAgIDwvcGF0dGVybnNldD4KLSAgICA8cGF0aCBpZD0iYWlzLmFkbWluY2xpZW50LmNsYXNzcGF0aCI+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWxhbmcuamFyfSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1jbGkuamFyfSIvPgotICAgIDwvcGF0aD4KLSAgICA8cHJvcGVydHkgbmFtZT0iYWlzLWFkbWluY2xpZW50Lmphcm5hbWUiIHZhbHVlPSJhaXMtYWRtaW4tY2xpZW50LmphciIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXMtYWRtaW5jbGllbnQuamFyIiB2YWx1ZT0iJHtidWlsZC5saWJ9LyR7YWlzLWFkbWluY2xpZW50Lmphcm5hbWV9Ii8+Ci0gICAgPCEtLSBBcHBJbnRlcmZhY2UgTW9kZWxzIC0tPgotICAgIDxwYXR0ZXJuc2V0IGlkPSJhcHBpbnRlcmZhY2Vtb2RlbHMuZmlsZXMiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9tb2RlbC8iLz4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvbW9kZWwvY2ljcy8iLz4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvbW9kZWwvY29ib2wvIi8+Ci0gICAgICAgIDxleGNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL21vZGVsL2ltcy8iLz4KLSAgICA8L3BhdHRlcm5zZXQ+Ci0gICAgPCEtLSBKYXZhIEV4dGVuc2lvbnMgLS0+Ci0gICAgPHBhdHRlcm5zZXQgaWQ9ImphdmFleHRlbnNpb25zLmZpbGVzIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9kZWJ1Zy8qIi8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvamF2YXgvIi8+Ci0gICAgICAgIDxleGNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvamF2YXgvc3dpbmcvIi8+Ci0gICAgPC9wYXR0ZXJuc2V0PgotICAgIDxwYXRoIGlkPSJqYXZhZXh0ZW5zaW9ucy5jbGFzc3BhdGgiPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sYW5nLmphcn0iLz4KLSAgICA8L3BhdGg+Ci0gICAgPCEtLSBVSUZhY2lsaXRpZXMgLS0+Ci0gICAgPHBhdHRlcm5zZXQgaWQ9InVpZmFjaWxpdGllcy5maWxlcyI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9wYXJjcGxhY2UvcGphdmEvRnJhbWVyLyIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2phdmF4L3N3aW5nL1N3aW5nVXRpbGl0aWVzWC4qIi8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvamF2YXgvc3dpbmcvSlRleHRQYW5lWC4qIi8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvamF2YXgvc3dpbmcvYm9yZGVyLyIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L3VpLyIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2RlYnVnL3VpLyIvPgotICAgIDwvcGF0dGVybnNldD4KLSAgICA8cGF0aCBpZD0idWlmYWNpbGl0aWVzLmNsYXNzcGF0aCI+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWxhbmcuamFyfSIvPgotICAgIDwvcGF0aD4KLSAgICA8IS0tIFhNTCBTZXJ2aWNlcyAtLT4KLSAgICA8cGF0dGVybnNldCBpZD0ieG1sc2VydmljZXMuZmlsZXMiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2lvL3htbC8iLz4KLSAgICA8L3BhdHRlcm5zZXQ+Ci0gICAgPHBhdGggaWQ9InhtbHNlcnZpY2VzLmNsYXNzcGF0aCI+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4bWwtYXBpcy5qYXJ9Ii8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4ZXJjZXMuamFyfSIvPgotICAgIDwvcGF0aD4KLSAgICA8IS0tIFRyYW5zZm9ybXMgLS0+Ci0gICAgPHBhdHRlcm5zZXQgaWQ9InRyYW5zZm9ybXMuZmlsZXMiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS90cmFuc2Zvcm1zLyIvPgotICAgIDwvcGF0dGVybnNldD4KLSAgICA8IS0tIFNlYWd1bGwgVG9vbGJveCAtLT4KLSAgICA8cGF0dGVybnNldCBpZD0ic2VhZ3VsbHRvb2xib3guZmlsZXMiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L3Rvb2xib3gvIi8+Ci0gICAgPC9wYXR0ZXJuc2V0PgotICAgIDxwYXRoIGlkPSJzZWFndWxsdG9vbGJveC5jbGFzc3BhdGgiPgotICAgICAgICA8cGF0aCByZWZpZD0ieG1sLmNsYXNzcGF0aC5ydCIvPgotICAgICAgICA8cGF0aCByZWZpZD0iamF4Yi5jbGFzc3BhdGgiLz4KLSAgICAgICAgPHBhdGggcmVmaWQ9Impzc2UuY2xhc3NwYXRoIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWh0dHBjbGllbnQuamFyfSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sYW5nLmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtY2xpLmphcn0iLz4KLSAgICA8L3BhdGg+Ci0gICAgPCEtLSBXaW4zMiBJbnRlcmZhY2UgLS0+Ci0gICAgPHBhdHRlcm5zZXQgaWQ9IndpbjMyaW50ZXJmYWNlLmZpbGVzIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2Uvd2luMzIvIi8+Ci0gICAgPC9wYXR0ZXJuc2V0PgotICAgIDwhLS0gUHJveHkgU2VydmxldCAtLT4KLSAgICA8cGF0dGVybnNldCBpZD0icHJveHlzZXJ2bGV0LmZpbGVzIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvY29tbS9zZXJ2bGV0LyIvPgotICAgIDwvcGF0dGVybnNldD4KLSAgICA8cHJvcGVydHkgbmFtZT0icHJveHlzZXJ2bGV0Lmphcm5hbWUiIHZhbHVlPSJhaXMtc2VydmxldC1wcm94eS5qYXIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0icHJveHlzZXJ2bGV0LmphciIgdmFsdWU9IiR7YnVpbGQubGlifS8ke3Byb3h5c2VydmxldC5qYXJuYW1lfSIvPgotICAgIDxwYXRoIGlkPSJwcm94eXNlcnZsZXQuY2xhc3NwYXRoIj4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3NlcnZsZXQuamFyfSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7eGVyY2VzLmphcn0iLz4KLSAgICA8L3BhdGg+Ci0gICAgPCEtLSBBZG1pbiBDb25zb2xlIC0tPgotICAgIDxwYXR0ZXJuc2V0IGlkPSJhZG1pbmNvbnNvbGUuZmlsZXMiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9zZXJ2ZXIvYWRtaW4vY2xpZW50LyIvPgotICAgIDwvcGF0dGVybnNldD4KLSAgICA8cHJvcGVydHkgbmFtZT0iYWRtaW5jb25zb2xlLmphcm5hbWUiIHZhbHVlPSJhaXMtYWRtaW4uamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImFkbWluY29uc29sZS5qYXIiIHZhbHVlPSIke2J1aWxkLmxpYn0vJHthZG1pbmNvbnNvbGUuamFybmFtZX0iLz4KLSAgICA8IS0tIEphdmEgQ29ubmVjdG9yIEdlbmVyYXRvciAtLT4KLSAgICA8cGF0dGVybnNldCBpZD0iamF2YWNvbm5lY3RvcmdlbmVyYXRvci5maWxlcyI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3Rvb2xzL2phdmFjb25uZWN0b3JnZW5lcmF0b3IvIi8+Ci0gICAgPC9wYXR0ZXJuc2V0PgotICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhY29ubmVjdG9yZ2VuZXJhdG9yLmphcm5hbWUiIHZhbHVlPSJKYXZhQ29ubmVjdG9yR2VuZXJhdG9yLmphciIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhY29ubmVjdG9yZ2VuZXJhdG9yLmphciIgdmFsdWU9IiR7YnVpbGQubGlifS8ke2phdmFjb25uZWN0b3JnZW5lcmF0b3IuamFybmFtZX0iLz4KLSAgICA8IS0tIFNlY3VyaXR5IFRvb2xraXQgLS0+Ci0gICAgPHBhdHRlcm5zZXQgaWQ9InNlY3VyaXR5dG9vbGtpdC5maWxlcyI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3Rvb2xzL3NlY3VyaXR5LyIvPgotICAgIDwvcGF0dGVybnNldD4KLSAgICA8cHJvcGVydHkgbmFtZT0ic2VjdXJpdHl0b29sa2l0Lmphcm5hbWUiIHZhbHVlPSJTZWN1cml0eVRvb2xraXQuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNlY3VyaXR5dG9vbGtpdC5qYXIiIHZhbHVlPSIke2J1aWxkLmxpYn0vJHtzZWN1cml0eXRvb2xraXQuamFybmFtZX0iLz4KLSAgICA8IS0tIFRvb2xzIEZyYW1ld29yayAtLT4KLSAgICA8cGF0dGVybnNldCBpZD0iZGV2dG9vbHMuZnJhbWV3b3JrLmZpbGVzIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvdG9vbHMvZnJhbWV3b3JrLyIvPgotICAgIDwvcGF0dGVybnNldD4KLSAgICA8cGF0aCBpZD0iZGV2dG9vbHMuZnJhbWV3b3JrLmNsYXNzcGF0aCI+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWxhbmcuamFyfSIvPgotICAgIDwvcGF0aD4KLSAgICA8IS0tIERldiBUb29scyAtLT4KLSAgICA8cGF0dGVybnNldCBpZD0iZGV2dG9vbHMuZmlsZXMiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS90b29scy8iLz4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvdG9vbHMvc2VjdXJpdHkvIi8+Ci0gICAgPC9wYXR0ZXJuc2V0PgotICAgIDxwYXRoIGlkPSJkZXZ0b29scy5jbGFzc3BhdGgiPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7eG1sLWFwaXMuamFyfSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7c29hcC5qYXJ9Ii8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWxhbmcuamFyfSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amNlLmphcn0iLz4KLSAgICA8L3BhdGg+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImFpcy10b29scy5qYXJuYW1lIiB2YWx1ZT0iYWlzLXRvb2xzLmphciIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXMtdG9vbHMuamFyIiB2YWx1ZT0iJHtidWlsZC5saWJ9LyR7YWlzLXRvb2xzLmphcm5hbWV9Ii8+Ci0gICAgPCEtLSBKYXZhVG9vbHMgKGUuZy4gaW52b2tpbmcgdGhlIEphdmEgY29tcGlsZXIpIC0tPgotICAgIDxwYXR0ZXJuc2V0IGlkPSJqYXZhdG9vbHMuZmlsZXMiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2phdmF0b29scy8iLz4KLSAgICA8L3BhdHRlcm5zZXQ+Ci0gICAgPHBhdGggaWQ9ImphdmF0b29scy5jbGFzc3BhdGgiPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7ajJzZS50b29scy5qYXJ9Ii8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqY2UuamFyfSIvPgotICAgICAgICA8cGF0aCByZWZpZD0iamF4Yi5jbGFzc3BhdGgiLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbGFuZy5qYXJ9Ii8+Ci0gICAgPC9wYXRoPgotICAgIDwhLS0gQmFja2VuZHMgLS0+Ci0gICAgPHBhdHRlcm5zZXQgaWQ9ImhjYmFja2VuZC5maWxlcyI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlLyoqLypob3N0Y29ubmVjdG9yKi8iLz4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2Uvc2VydmVyL2JhY2tlbmQvaHNjLyoqIi8+Ci0gICAgPC9wYXR0ZXJuc2V0PgotICAgIDxwYXR0ZXJuc2V0IGlkPSJjb2JvbC5maWxlcyI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3NlcnZlci9iYWNrZW5kL2NvYm9sLyIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9tb2RlbC9jb2JvbC8iLz4KLSAgICA8L3BhdHRlcm5zZXQ+Ci0gICAgPHBhdGggaWQ9ImNvYm9sLmNsYXNzcGF0aCI+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4bWwtYXBpcy5qYXJ9Ii8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWxhbmcuamFyfSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1odHRwY2xpZW50Lmphcn0iLz4KLSAgICA8L3BhdGg+Ci0gICAgPHBhdHRlcm5zZXQgaWQ9ImNpY3MuZmlsZXMiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9zZXJ2ZXIvYmFja2VuZC9jaWNzLyIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9tb2RlbC9jaWNzLyIvPgotICAgIDwvcGF0dGVybnNldD4KLSAgICA8cGF0dGVybnNldCBpZD0iaW1zLmJhY2tlbmQuZmlsZXMiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9zZXJ2ZXIvYmFja2VuZC9pbXMvIi8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL21vZGVsL2ltcy8iLz4KLSAgICA8L3BhdHRlcm5zZXQ+Ci0gICAgPHBhdGggaWQ9ImNpY3MuYmFja2VuZC5jbGFzc3BhdGgiPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y3RnY2xpZW50Lmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3htbC1hcGlzLmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3hlcmNlcy5qYXJ9Ii8+Ci0gICAgICAgIDxwYXRoIHJlZmlkPSJqYXhiLmNsYXNzcGF0aCIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amNlLmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtY29kZWMuamFyfSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sYW5nLmphcn0iLz4KLSAgICA8L3BhdGg+Ci0gICAgPHBhdGggaWQ9Imltcy5iYWNrZW5kLmNsYXNzcGF0aCI+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4bWwtYXBpcy5qYXJ9Ii8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqYWFzLmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2ltc2ljby5qYXJ9Ii8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtpbXNpY28tY29ubmVjdG9yLmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pjZS5qYXJ9Ii8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqdGEuamFyfSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1odHRwY2xpZW50Lmphcn0iLz4KLSAgICAgICAgPHBhdGggcmVmaWQ9ImpheGIuY2xhc3NwYXRoIi8+Ci0gICAgPC9wYXRoPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXMtNTI1MC5qYXJuYW1lIiB2YWx1ZT0iYWlzLTUyNTAuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImFpcy01MjUwLmphciIgdmFsdWU9IiR7YnVpbGQubGlifS8ke2Fpcy01MjUwLmphcm5hbWV9Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImFpcy0zMjcwLmphcm5hbWUiIHZhbHVlPSJhaXMtMzI3MC5qYXIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYWlzLTMyNzAuamFyIiB2YWx1ZT0iJHtidWlsZC5saWJ9LyR7YWlzLTMyNzAuamFybmFtZX0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYWlzLWNvYm9sLmphcm5hbWUiIHZhbHVlPSJhaXMtY29ib2wuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImFpcy1jb2JvbC5qYXIiIHZhbHVlPSIke2J1aWxkLmxpYn0vJHthaXMtY29ib2wuamFybmFtZX0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYWlzLWNpY3MuamFybmFtZSIgdmFsdWU9ImFpcy1jaWNzLmphciIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXMtY2ljcy5qYXIiIHZhbHVlPSIke2J1aWxkLmxpYn0vJHthaXMtY2ljcy5qYXJuYW1lfSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXMtaW1zLmphcm5hbWUiIHZhbHVlPSJhaXMtaW1zLmphciIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXMtaW1zLmphciIgdmFsdWU9IiR7YnVpbGQubGlifS8ke2Fpcy1pbXMuamFybmFtZX0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iaHNjLmphcm5hbWUiIHZhbHVlPSJnd2hzYy5qYXIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iaHNjLmphciIgdmFsdWU9IiR7YnVpbGQubGlifS8ke2hzYy5qYXJuYW1lfSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJoc2N1Lmphcm5hbWUiIHZhbHVlPSJnd2hzY3UuamFyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImhzY3UuamFyIiB2YWx1ZT0iJHtidWlsZC5saWJ9LyR7aHNjdS5qYXJuYW1lfSIvPgotICAgIDwhLS0gSFNDIC0tPgotICAgIDxwYXR0ZXJuc2V0IGlkPSJoc2MuZmlsZXMiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2dhdGV3YXkvIi8+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvbmV0LyIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L3NlY3VyaXR5LyIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L3N5c3RlbS8iLz4KLSAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9uZXQvY2xpZW50L210YWxrLyIvPgotICAgIDwvcGF0dGVybnNldD4KLSAgICA8IS0tIEFsbCB0aGUgWFNMVCBmaWxlcyAtLT4KLSAgICA8ZmlsZXNldCBpZD0ieHNsdC5maWxlcyIgZGlyPSIke3hzbHQucmVzb3VyY2UuZGlyfSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioueHNsIi8+Ci0gICAgPC9maWxlc2V0PgotICAgIDwhLS0gQWxsIHRoZSBBcHBJbnRlcmZhY2UgImJhc2UiIGNsYXNzZXMgLS0+Ci0gICAgPGZpbGVzZXQgaWQ9ImFwcGludGVyZmFjZS5iYXNlLmZpbGVzIiBkaXI9IiR7YnVpbGQuY2xhc3Nlc30iPgotICAgICAgICA8cGF0dGVybnNldCByZWZpZD0iYXBwaW50ZXJmYWNlY29tbS5maWxlcyIvPgotICAgICAgICA8cGF0dGVybnNldCByZWZpZD0iYXBwaW50ZXJmYWNlbW9kZWxzLmZpbGVzIi8+Ci0gICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJqYXZhZXh0ZW5zaW9ucy5maWxlcyIvPgotICAgICAgICA8cGF0dGVybnNldCByZWZpZD0ieG1sc2VydmljZXMuZmlsZXMiLz4KLSAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9Im10YWxrY29tbS5maWxlcyIvPgotICAgIDwvZmlsZXNldD4KLSAgICA8IS0tIEFsbCB0aGUgQXBwSW50ZXJmYWNlICJiYXNlIiBjbGFzc2VzIC0tPgotICAgIDxmaWxlc2V0IGlkPSJhcHBpbnRlcmZhY2UuYmFzZXBsdXMuZmlsZXMiIGRpcj0iJHtidWlsZC5jbGFzc2VzfSI+Ci0gICAgICAgIDwhLS0gV2hhdCBJIHJlYWxseSB3YW50IHRvIGRvIGhlcmUgaXMgcmVmZXIgdG8gdGhlIC5iYXNlLmZpbGVzCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlc2V0LCBidXQgYW50IGRvZXNuJ3QgYWxsb3cgbmVzdGVkIGZpbGVzZXRzLiBTaWdoLgotICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgcmVmaWQ9ImFwcGludGVyZmFjZS5iYXNlLmZpbGVzIi8+IC0tPgotICAgICAgICA8cGF0dGVybnNldCByZWZpZD0iYXBwaW50ZXJmYWNlY29tbS5maWxlcyIvPgotICAgICAgICA8cGF0dGVybnNldCByZWZpZD0iYXBwaW50ZXJmYWNlbW9kZWxzLmZpbGVzIi8+Ci0gICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJqYXZhZXh0ZW5zaW9ucy5maWxlcyIvPgotICAgICAgICA8cGF0dGVybnNldCByZWZpZD0ieG1sc2VydmljZXMuZmlsZXMiLz4KLSAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9ImFwcGludGVyZmFjZXNldHRpbmdzLmZpbGVzIi8+Ci0gICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJ1aWZhY2lsaXRpZXMuZmlsZXMiLz4KLSAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9InNlYWd1bGx0b29sYm94LmZpbGVzIi8+Ci0gICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJtdGFsa2NvbW0uZmlsZXMiLz4KLSAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9InRyYW5zZm9ybXMuZmlsZXMiLz4KLSAgICA8L2ZpbGVzZXQ+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gU2V0IGZpbGUgY29weSBmaWx0ZXJzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cHJvcGVydHkgbmFtZT0idGV4dC5jb3B5cmlnaHQuMSIgdmFsdWU9IihjKSAxOTkzIC0gMjAwMyBTZWFndWxsIEJ1c2luZXNzIFNvZnR3YXJlIElyZWxhbmQgTHRkLiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0LmNvcHlyaWdodC4yIiB2YWx1ZT0iQWxsIFJpZ2h0cyBSZXNlcnZlZC4iLz4KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQuZmlsdGVycyI+Ci0gICAgICAgIDxmaWx0ZXIgdG9rZW49IlBST0RVQ1QiIHZhbHVlPSIke3Byb2R1Y3QubmFtZX0iLz4KLSAgICAgICAgPGZpbHRlciB0b2tlbj0iVkVSU0lPTiIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KLSAgICAgICAgPGZpbHRlciB0b2tlbj0iQlVJTERJRCIgdmFsdWU9IiR7YnVpbGQuaWR9Ii8+Ci0gICAgICAgIDxmaWx0ZXIgdG9rZW49IkJVSUxEVElNRVNUQU1QIiB2YWx1ZT0iJHtCdWlsZFRpbWVTdGFtcH0iLz4KLSAgICAgICAgPGZpbHRlciB0b2tlbj0iQ09QWVJJR0hULTEiIHZhbHVlPSIke3RleHQuY29weXJpZ2h0LjF9Ii8+Ci0gICAgICAgIDxmaWx0ZXIgdG9rZW49IkNPUFlSSUdIVC0yIiB2YWx1ZT0iJHt0ZXh0LmNvcHlyaWdodC4yfSIvPgotICAgIDwvdGFyZ2V0PgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIENvbXBpbGVzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9ImNvbXBpbGUuYWlzLCBjb21waWxlLmFpcy5jbGllbnQsIGNvbXBpbGUuYWlzLmFkbWluY2xpZW50LCBjb21waWxlLmRldnRvb2xzLCBjb21waWxlLnByb3h5c2VydmxldCwgY29tcGlsZS5hZG1pbmNvbnNvbGUsIGNvbXBpbGUuamF2YWNvbm5lY3RvcmdlbmVyYXRvciwgY29tcGlsZS5zZWN1cml0eXRvb2xraXQsIGNvbXBpbGUuaGNiYWNrZW5kLCBjb21waWxlLmNvYm9sLCBjb21waWxlLmNpY3MsIGNvbXBpbGUuSU1TYmFja2VuZCIgZGVzY3JpcHRpb249IkNvbXBpbGVzIGFsbCB0aGUgc291cmNlcyBpbnRvICR7YnVpbGQuY2xhc3Nlc30iLz4KLSAgICA8IS0tIGRvQUNvbXBpbGUgLSBhIGNvbXBpbGUgInN1YnJvdXRpbmUiIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iZG9BQ29tcGlsZSI+Ci0gICAgICAgIDxqYXZhYyBzcmNkaXI9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlc30iIGRlYnVnPSIke2NvbXBpbGUuZGVidWd9IiBvcHRpbWl6ZT0iJHtjb21waWxlLm9wdGltaXplfSIgZmFpbG9uZXJyb3I9InRydWUiIGluY2x1ZGVBbnRSdW50aW1lPSJmYWxzZSI+Ci0gICAgICAgICAgICA8cGF0dGVybnNldCByZWZpZD0iJHtkb0FDb21waWxlLmZpbGVzfSIvPgotICAgICAgICA8L2phdmFjPgotICAgIDwvdGFyZ2V0PgotICAgIDwhLS0gZG9BQ29tcGlsZVdpdGhDbGFzc3BhdGggLSBhIGNvbXBpbGUgInN1YnJvdXRpbmUiIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iZG9BQ29tcGlsZVdpdGhDbGFzc3BhdGgiPgotICAgICAgICA8amF2YWMgc3JjZGlyPSIke3NyYy5kaXJ9IiBkZXN0ZGlyPSIke2J1aWxkLmNsYXNzZXN9IiBkZWJ1Zz0iJHtjb21waWxlLmRlYnVnfSIgb3B0aW1pemU9IiR7Y29tcGlsZS5vcHRpbWl6ZX0iIGZhaWxvbmVycm9yPSJ0cnVlIiBpbmNsdWRlQW50UnVudGltZT0iZmFsc2UiPgotICAgICAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9IiR7ZG9BQ29tcGlsZS5maWxlc30iLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9IiR7ZG9BQ29tcGlsZS5jbGFzc3BhdGh9Ii8+Ci0gICAgICAgIDwvamF2YWM+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPCEtLSBBSVMgLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJjb21waWxlLmFpcyIgZGVwZW5kcz0iY29tcGlsZS50b29sYm94LCBjb21waWxlLnhtbHNlcnZpY2VzLCBjb21waWxlLnRyYW5zZm9ybXMsIGNvbXBpbGUudWlmYWNpbGl0aWVzLCBjb21waWxlLmFwcGludGVyZmFjZXNldHRpbmdzLCBjb21waWxlLmFwcGludGVyZmFjZW1vZGVscywgY29tcGlsZS5hcHBpbnRlcmZhY2Vjb21tLCBjb21waWxlLmhzYywgY29tcGlsZS5tdGFsa2NvbW0iPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImRvQUNvbXBpbGVXaXRoQ2xhc3NwYXRoIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmZpbGVzIiB2YWx1ZT0iYWlzLmZpbGVzIi8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5jbGFzc3BhdGgiIHZhbHVlPSJhaXMuY2xhc3NwYXRoIi8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tIEFwcEludGVyZmFjZSBNb2RlbHMgLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJjb21waWxlLmFwcGludGVyZmFjZW1vZGVscyIgZGVwZW5kcz0icHJlcGFyZSwgY29tcGlsZS54bWxzZXJ2aWNlcyI+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZG9BQ29tcGlsZVdpdGhDbGFzc3BhdGgiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuZmlsZXMiIHZhbHVlPSJhcHBpbnRlcmZhY2Vtb2RlbHMuZmlsZXMiLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmNsYXNzcGF0aCIgdmFsdWU9ImFpcy5jbGFzc3BhdGgiLz4KLSAgICAgICAgPC9hbnRjYWxsPgotICAgIDwvdGFyZ2V0PgotICAgIDwhLS0gQXBwSW50ZXJmYWNlIENvbW11bmljYXRpb25zIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS5hcHBpbnRlcmZhY2Vjb21tIiBkZXBlbmRzPSJwcmVwYXJlIj4KLSAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJkb0FDb21waWxlV2l0aENsYXNzcGF0aCI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5maWxlcyIgdmFsdWU9ImFwcGludGVyZmFjZWNvbW0uZmlsZXMiLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmNsYXNzcGF0aCIgdmFsdWU9ImFpcy5jbGFzc3BhdGgiLz4KLSAgICAgICAgPC9hbnRjYWxsPgotICAgIDwvdGFyZ2V0PgotICAgIDwhLS0gTVRhbGsgQ29tbXVuaWNhdGlvbiAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUubXRhbGtjb21tIiBkZXBlbmRzPSJwcmVwYXJlIj4KLSAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJkb0FDb21waWxlIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmZpbGVzIiB2YWx1ZT0ibXRhbGtjb21tLmZpbGVzIi8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tIEFwcEludGVyZmFjZSBTZXR0aW5nIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS5hcHBpbnRlcmZhY2VzZXR0aW5ncyIgZGVwZW5kcz0icHJlcGFyZSI+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZG9BQ29tcGlsZVdpdGhDbGFzc3BhdGgiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuZmlsZXMiIHZhbHVlPSJhcHBpbnRlcmZhY2VzZXR0aW5ncy5maWxlcyIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuY2xhc3NwYXRoIiB2YWx1ZT0iYXBwaW50ZXJmYWNlc2V0dGluZ3MuY2xhc3NwYXRoIi8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tIFVJIEZhY2lsaXRpZXMgLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJjb21waWxlLnVpZmFjaWxpdGllcyIgZGVwZW5kcz0icHJlcGFyZSI+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZG9BQ29tcGlsZVdpdGhDbGFzc3BhdGgiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuZmlsZXMiIHZhbHVlPSJ1aWZhY2lsaXRpZXMuZmlsZXMiLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmNsYXNzcGF0aCIgdmFsdWU9InVpZmFjaWxpdGllcy5jbGFzc3BhdGgiLz4KLSAgICAgICAgPC9hbnRjYWxsPgotICAgIDwvdGFyZ2V0PgotICAgIDwhLS0gSmF2YSBFeHRlbnNpb25zIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS5qYXZhZXh0ZW5zaW9ucyIgZGVwZW5kcz0icHJlcGFyZSI+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZG9BQ29tcGlsZVdpdGhDbGFzc3BhdGgiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuZmlsZXMiIHZhbHVlPSJqYXZhZXh0ZW5zaW9ucy5maWxlcyIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuY2xhc3NwYXRoIiB2YWx1ZT0iamF2YWV4dGVuc2lvbnMuY2xhc3NwYXRoIi8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tIFhNTCBTZXJ2aWNlcyAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUueG1sc2VydmljZXMiIGRlcGVuZHM9ImNvbXBpbGUuamF2YWV4dGVuc2lvbnMiPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImRvQUNvbXBpbGVXaXRoQ2xhc3NwYXRoIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmZpbGVzIiB2YWx1ZT0ieG1sc2VydmljZXMuZmlsZXMiLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmNsYXNzcGF0aCIgdmFsdWU9InhtbHNlcnZpY2VzLmNsYXNzcGF0aCIvPgotICAgICAgICA8L2FudGNhbGw+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPCEtLSBUcmFuc2Zvcm1zIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS50cmFuc2Zvcm1zIiBkZXBlbmRzPSJjb21waWxlLmphdmFleHRlbnNpb25zIj4KLSAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJkb0FDb21waWxlV2l0aENsYXNzcGF0aCI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5maWxlcyIgdmFsdWU9InRyYW5zZm9ybXMuZmlsZXMiLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmNsYXNzcGF0aCIgdmFsdWU9InRyYW5zZm9ybXMuY2xhc3NwYXRoIi8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tIFNlYWd1bGwgVG9vbGJveCAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUudG9vbGJveCIgZGVwZW5kcz0iY29tcGlsZS5qYXZhZXh0ZW5zaW9ucyI+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZG9BQ29tcGlsZVdpdGhDbGFzc3BhdGgiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuZmlsZXMiIHZhbHVlPSJzZWFndWxsdG9vbGJveC5maWxlcyIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuY2xhc3NwYXRoIiB2YWx1ZT0ic2VhZ3VsbHRvb2xib3guY2xhc3NwYXRoIi8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tIFdpbjMyIEludGVyZmFjZSAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUud2luMzJpbnRlcmZhY2UiIGRlcGVuZHM9InByZXBhcmUiPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImRvQUNvbXBpbGUiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuZmlsZXMiIHZhbHVlPSJ3aW4zMmludGVyZmFjZS5maWxlcyIvPgotICAgICAgICA8L2FudGNhbGw+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPCEtLSBBcHBJbnRlcmZhY2UgQ2xpZW50IC0tPgotICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS5haXMuY2xpZW50IiBkZXBlbmRzPSJwcmVwYXJlLCBjb21waWxlLnhtbHNlcnZpY2VzLCBjb21waWxlLmFwcGludGVyZmFjZWNvbW0sIGNvbXBpbGUuYXBwaW50ZXJmYWNlbW9kZWxzIj4KLSAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJkb0FDb21waWxlV2l0aENsYXNzcGF0aCI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5maWxlcyIgdmFsdWU9ImFpcy5jbGllbnQuZmlsZXMiLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmNsYXNzcGF0aCIgdmFsdWU9ImFpcy5jbGllbnQuY2xhc3NwYXRoIi8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tIEFwcEludGVyZmFjZSBBZG1pbiBDbGllbnQgLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJjb21waWxlLmFpcy5hZG1pbmNsaWVudCIgZGVwZW5kcz0icHJlcGFyZSwgY29tcGlsZS54bWxzZXJ2aWNlcywgY29tcGlsZS5hcHBpbnRlcmZhY2Vjb21tLCBjb21waWxlLmFwcGludGVyZmFjZW1vZGVscywgY29tcGlsZS5haXMuY2xpZW50Ij4KLSAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJkb0FDb21waWxlV2l0aENsYXNzcGF0aCI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5maWxlcyIgdmFsdWU9ImFpcy5hZG1pbmNsaWVudC5maWxlcyIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuY2xhc3NwYXRoIiB2YWx1ZT0iYWlzLmNsYXNzcGF0aCIvPgotICAgICAgICA8L2FudGNhbGw+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPCEtLSBQcm94eSBTZXJ2bGV0IC0tPgotICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS5wcm94eXNlcnZsZXQiIGRlcGVuZHM9InByZXBhcmUiPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImRvQUNvbXBpbGVXaXRoQ2xhc3NwYXRoIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmZpbGVzIiB2YWx1ZT0icHJveHlzZXJ2bGV0LmZpbGVzIi8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5jbGFzc3BhdGgiIHZhbHVlPSJwcm94eXNlcnZsZXQuY2xhc3NwYXRoIi8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tIEFkbWluIENvbnNvbGUgLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJjb21waWxlLmFkbWluY29uc29sZSIgZGVwZW5kcz0icHJlcGFyZSwgY29tcGlsZS5kZXZ0b29scy5mcmFtZXdvcmsiPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImRvQUNvbXBpbGVXaXRoQ2xhc3NwYXRoIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmZpbGVzIiB2YWx1ZT0iYWRtaW5jb25zb2xlLmZpbGVzIi8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5jbGFzc3BhdGgiIHZhbHVlPSJhaXMuYWRtaW5jbGllbnQuY2xhc3NwYXRoIi8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tIEphdmEgQ29ubmVjdG9yIEdlbmVyYXRvciAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUuamF2YWNvbm5lY3RvcmdlbmVyYXRvciIgZGVwZW5kcz0icHJlcGFyZSwgY29tcGlsZS5kZXZ0b29scy5mcmFtZXdvcmssIGNvbXBpbGUuYXBwaW50ZXJmYWNlbW9kZWxzLCBjb21waWxlLmphdmF0b29scyI+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZG9BQ29tcGlsZSI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5maWxlcyIgdmFsdWU9ImphdmFjb25uZWN0b3JnZW5lcmF0b3IuZmlsZXMiLz4KLSAgICAgICAgPC9hbnRjYWxsPgotICAgIDwvdGFyZ2V0PgotICAgIDwhLS0gU2VjdXJpdHkgVG9vbGtpdCAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUuc2VjdXJpdHl0b29sa2l0IiBkZXBlbmRzPSJwcmVwYXJlLCBjb21waWxlLmRldnRvb2xzLmZyYW1ld29yaywgY29tcGlsZS5hcHBpbnRlcmZhY2Vtb2RlbHMsIGNvbXBpbGUuamF2YXRvb2xzIj4KLSAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJkb0FDb21waWxlV2l0aENsYXNzcGF0aCI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5maWxlcyIgdmFsdWU9InNlY3VyaXR5dG9vbGtpdC5maWxlcyIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuY2xhc3NwYXRoIiB2YWx1ZT0iZGV2dG9vbHMuY2xhc3NwYXRoIi8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tIFRvb2xzIEZyYW1ld29yayAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUuZGV2dG9vbHMuZnJhbWV3b3JrIiBkZXBlbmRzPSJwcmVwYXJlLCBjb21waWxlLnRvb2xib3gsIGNvbXBpbGUueG1sc2VydmljZXMsIGNvbXBpbGUudWlmYWNpbGl0aWVzLCBjb21waWxlLmFwcGludGVyZmFjZXNldHRpbmdzIj4KLSAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJkb0FDb21waWxlV2l0aENsYXNzcGF0aCI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5maWxlcyIgdmFsdWU9ImRldnRvb2xzLmZyYW1ld29yay5maWxlcyIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuY2xhc3NwYXRoIiB2YWx1ZT0iZGV2dG9vbHMuZnJhbWV3b3JrLmNsYXNzcGF0aCIvPgotICAgICAgICA8L2FudGNhbGw+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPCEtLSBEZXZUb29scyAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUuZGV2dG9vbHMiIGRlcGVuZHM9InByZXBhcmUsIGNvbXBpbGUuZGV2dG9vbHMuZnJhbWV3b3JrLCBjb21waWxlLmFpcy5jbGllbnQsIGNvbXBpbGUuYXBwaW50ZXJmYWNlbW9kZWxzLCBjb21waWxlLmphdmF0b29scyI+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZG9BQ29tcGlsZVdpdGhDbGFzc3BhdGgiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuZmlsZXMiIHZhbHVlPSJkZXZ0b29scy5maWxlcyIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuY2xhc3NwYXRoIiB2YWx1ZT0iZGV2dG9vbHMuY2xhc3NwYXRoIi8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tIEphdmFUb29scyAoZS5nLiBpbnZva2luZyB0aGUgSmF2YSBjb21waWxlcikgLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJjb21waWxlLmphdmF0b29scyIgZGVwZW5kcz0icHJlcGFyZSI+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZG9BQ29tcGlsZVdpdGhDbGFzc3BhdGgiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuZmlsZXMiIHZhbHVlPSJqYXZhdG9vbHMuZmlsZXMiLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmNsYXNzcGF0aCIgdmFsdWU9ImphdmF0b29scy5jbGFzc3BhdGgiLz4KLSAgICAgICAgPC9hbnRjYWxsPgotICAgIDwvdGFyZ2V0PgotICAgIDwhLS0gQmFja2VuZHMgLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJjb21waWxlLmhjYmFja2VuZCIgZGVwZW5kcz0icHJlcGFyZSwgY29tcGlsZS5haXMiPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImRvQUNvbXBpbGVXaXRoQ2xhc3NwYXRoIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmZpbGVzIiB2YWx1ZT0iaGNiYWNrZW5kLmZpbGVzIi8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5jbGFzc3BhdGgiIHZhbHVlPSJhaXMuY2xhc3NwYXRoIi8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUuY29ib2wiIGRlcGVuZHM9InByZXBhcmUsIGNvbXBpbGUuYWlzIj4KLSAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJkb0FDb21waWxlV2l0aENsYXNzcGF0aCI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5maWxlcyIgdmFsdWU9ImNvYm9sLmZpbGVzIi8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5jbGFzc3BhdGgiIHZhbHVlPSJjb2JvbC5jbGFzc3BhdGgiLz4KLSAgICAgICAgPC9hbnRjYWxsPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS5jaWNzIiBkZXBlbmRzPSJwcmVwYXJlLCBjb21waWxlLmFpcyI+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iZG9BQ29tcGlsZVdpdGhDbGFzc3BhdGgiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImRvQUNvbXBpbGUuZmlsZXMiIHZhbHVlPSJjaWNzLmZpbGVzIi8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZG9BQ29tcGlsZS5jbGFzc3BhdGgiIHZhbHVlPSJjaWNzLmJhY2tlbmQuY2xhc3NwYXRoIi8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUuSU1TYmFja2VuZCIgZGVwZW5kcz0icHJlcGFyZSwgY29tcGlsZS5haXMiPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImRvQUNvbXBpbGVXaXRoQ2xhc3NwYXRoIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmZpbGVzIiB2YWx1ZT0iaW1zLmJhY2tlbmQuZmlsZXMiLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJkb0FDb21waWxlLmNsYXNzcGF0aCIgdmFsdWU9Imltcy5iYWNrZW5kLmNsYXNzcGF0aCIvPgotICAgICAgICA8L2FudGNhbGw+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPCEtLSBIU0MgLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJjb21waWxlLmhzYyIgZGVwZW5kcz0icHJlcGFyZSI+Ci0gICAgICAgIDxqYXZhYyBzcmNkaXI9IiR7c3JjLnNvdXJjZXNhZmVtaXJyb3IuZGlyfSIgY2xhc3NwYXRoPSIke21pY3Jvc29mdHNlY3VyaXR5Y2xhc3Nlcy56aXB9IiBkZXN0ZGlyPSIke2J1aWxkLmNsYXNzZXN9IiBkZWJ1Zz0iJHtjb21waWxlLmRlYnVnfSIgaW5jbHVkZUFudFJ1bnRpbWU9ImZhbHNlIj4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvIi8+Ci0gICAgICAgIDwvamF2YWM+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPCEtLSBKYXZhRG9jIGRvY2xldCAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUuZG9jbGV0Ij4KLSAgICAgICAgPGphdmFjIHNyY2Rpcj0iJHtzcmMuZGlyfSIgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzfSIgZGVidWc9IiR7Y29tcGlsZS5kZWJ1Z30iIGluY2x1ZGVBbnRSdW50aW1lPSJ0cnVlIj4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvaW50ZXJuYWxkZXYvdG9vbHMvYXBpZG9jbGV0Ly8iLz4KLSAgICAgICAgPC9qYXZhYz4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBDcmVhdGUgamFyIGZpbGVzIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImNvbXB1dGUtY2hlY2tzdW0iPgotICAgICAgICA8Y2hlY2tzdW0gZmlsZT0iJHtmaWxlfSIgYWxnb3JpdGhtPSIke2NoZWNrc3VtLmFsZ29yaXRobS5tZDV9IiBwcm9wZXJ0eT0iY3NfdmFsdWUiLz4KLSAgICAgICAgPGVjaG8gbGV2ZWw9ImluZm8iIG1lc3NhZ2U9IiR7Y2hlY2tzdW0uYWxnb3JpdGhtLm1kNX0gLT4gJHtjc192YWx1ZX0iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5jaGVja3N1bX0iLz4KLSAgICAgICAgPCEtLSBDcmVhdGUgYSB0ZXh0IGZpbGUgd2l0aCB0aGUgY2hlY2tzdW0gdmFsdWUuIC0tPgotICAgICAgICA8Y29uY2F0IGRlc3RmaWxlPSIke2J1aWxkLmNoZWNrc3VtfS8ke2ZpbGVuYW1lfS4ke2NoZWNrc3VtLmFsZ29yaXRobS5tZDV9LnR4dCI+JHtjc192YWx1ZX08L2NvbmNhdD4KLSAgICAgICAgPCEtLSBDcmVhdGUgYW4gWE1MIGZpbGUgd2l0aCB0aGUgY2hlY2tzdW0gdmFsdWUuIC0tPgotICAgICAgICA8Y29uY2F0IGRlc3RmaWxlPSIke2J1aWxkLmNoZWNrc3VtfS8ke2ZpbGVuYW1lfS4ke2NoZWNrc3VtLmFsZ29yaXRobS5tZDV9LnhtbCI+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8+Ci0mbHQ7IS0tIEJ1aWxkIGF1dG8tZ2VuZXJhdGVkIC0tPgotJmx0O2NoZWNrc3VtIGZpbGU9IiR7ZmlsZW5hbWV9IiBhbGdvcml0aG09IiR7Y2hlY2tzdW0uYWxnb3JpdGhtLm1kNX0iPiR7Y3NfdmFsdWV9Jmx0Oy9jaGVja3N1bT48L2NvbmNhdD4KLSAgICAgICAgPHhtbHZhbGlkYXRlIGZpbGU9IiR7YnVpbGQuY2hlY2tzdW19LyR7ZmlsZW5hbWV9LiR7Y2hlY2tzdW0uYWxnb3JpdGhtLm1kNX0ueG1sIiBsZW5pZW50PSJ0cnVlIi8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPCEtLSBDcmVhdGUgYWxsLWphcnMueG1sIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iY3JlYXRlLWFsbC1qYXJzLnhtbCI+Ci0gICAgICAgIDwhLS0gQ3JlYXRlIGFuIFhNTCBmaWxlIHdpdGggdGhlIGphciBmaWxlIG5hbWVzIGNyZWF0ZWQuIC0tPgotICAgICAgICA8Y29uY2F0IGRlc3RmaWxlPSIke2FsbC1qYXJzLnhtbH0iPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/PgotJmx0OyEtLSBCdWlsZCBhdXRvLWdlbmVyYXRlZCAtLT4KLSZsdDtqYXJzPgotICAgICZsdDtqYXI+JHthaXMtY29yZS5qYXJuYW1lfSZsdDsvamFyPgotICAgICZsdDtqYXI+JHthaXMuY2xpZW50Lmphcm5hbWV9Jmx0Oy9qYXI+Ci0gICAgJmx0O2phcj4ke2Fpcy1hZG1pbmNsaWVudC5qYXJuYW1lfSZsdDsvamFyPgotICAgICZsdDtqYXI+JHtwcm94eXNlcnZsZXQuamFybmFtZX0mbHQ7L2phcj4KLSAgICAmbHQ7amFyPiR7YWRtaW5jb25zb2xlLmphcm5hbWV9Jmx0Oy9qYXI+Ci0gICAgJmx0O2phcj4ke2phdmFjb25uZWN0b3JnZW5lcmF0b3IuamFybmFtZX0mbHQ7L2phcj4KLSAgICAmbHQ7amFyPiR7c2VjdXJpdHl0b29sa2l0Lmphcm5hbWV9Jmx0Oy9qYXI+Ci0gICAgJmx0O2phcj4ke2Fpcy10b29scy5qYXJuYW1lfSZsdDsvamFyPgotICAgICZsdDtqYXI+JHthaXMtNTI1MC5qYXJuYW1lfSZsdDsvamFyPgotICAgICZsdDtqYXI+JHthaXMtMzI3MC5qYXJuYW1lfSZsdDsvamFyPgotICAgICZsdDtqYXI+JHthaXMtY29ib2wuamFybmFtZX0mbHQ7L2phcj4KLSAgICAmbHQ7amFyPiR7YWlzLWNpY3MuamFybmFtZX0mbHQ7L2phcj4KLSAgICAmbHQ7amFyPiR7YWlzLWltcy5qYXJuYW1lfSZsdDsvamFyPgotICAgICZsdDtqYXI+JHtoc2MuamFybmFtZX0mbHQ7L2phcj4KLSAgICAmbHQ7amFyPiR7aHNjdS5qYXJuYW1lfSZsdDsvamFyPgotJmx0Oy9qYXJzPgotICAgICAgICA8L2NvbmNhdD4KLSAgICAgICAgPGVjaG8gbGV2ZWw9ImluZm8iIG1lc3NhZ2U9IkNyZWF0ZWQgJHthbGwtamFycy54bWx9Ii8+Ci0gICAgICAgIDx4bWx2YWxpZGF0ZSBmaWxlPSIke2FsbC1qYXJzLnhtbH0iIGxlbmllbnQ9InRydWUiLz4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tIENvcHkgY2hlY2tzdW0gZmlsZXMgdG8gcmVwb3J0IGRpciAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImNvcHktY2hlY2tzdW1zIj4KLSAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJjcmVhdGUtYWxsLWphcnMueG1sIi8+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSIke3JlcG9ydHMuY2hlY2tzdW19Ij4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5jaGVja3N1bX0iLz4KLSAgICAgICAgPC9jb3B5PgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0iamFycyIgZGVwZW5kcz0iamFyLmFpcy1jb3JlLCBqYXIuYWlzLmNsaWVudCwgamFyLmFpcy5hZG1pbmNsaWVudCwgamFyLnByb3h5c2VydmxldCwgamFyLmFkbWluY29uc29sZSwgamFyLmphdmFjb25uZWN0b3JnZW5lcmF0b3IsIGphci5zZWN1cml0eXRvb2xraXQsIGphci5haXMtdG9vbHMsIGphci5haXMtNTI1MCwgamFyLmFpcy0zMjcwLCBqYXIuYWlzLWNvYm9sLCBqYXIuYWlzLWNpY3MsIGphci5haXMtaW1zLCBqYXIuaHNjIiBkZXNjcmlwdGlvbj0iQ3JlYXRlcyB0aGUgamFyIGZpbGVzIGluICR7YnVpbGQubGlifSI+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iY29weS1jaGVja3N1bXMiLz4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9Imphci5haXMtY29yZSIgZGVwZW5kcz0iaW5pdCwgY29tcGlsZS5haXMsIGNyZWF0ZVNwbGFzaC5haXMuc3BsYXNoc2NyZWVucyI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGlifSIvPgotICAgICAgICA8amFyIGphcmZpbGU9IiR7YWlzLWNvcmUuamFyfSIgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSI+Ci0gICAgICAgICAgICA8cGF0dGVybnNldCByZWZpZD0iYWlzLmZpbGVzIi8+Ci0gICAgICAgICAgICA8ZmlsZXNldCByZWZpZD0iYXBwaW50ZXJmYWNlLmJhc2VwbHVzLmZpbGVzIi8+Ci0gICAgICAgICAgICA8cGF0dGVybnNldD4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2phdmF4L3N3aW5nLyIvPgotICAgICAgICAgICAgICAgIDwhLS0gTm90IHN1cmUgd2h5IHRoaXMgaXNuJ3QgZ2V0dGluZyBpbmNsdWRlZCBhcyBwYXJ0IG9mIHVpZmFjaWxpdGllcy5maWxlcyB2aWEgYXBwaW50ZXJmYWNlLmJhc2VwbHVzLmZpbGVzLiAtLT4KLSAgICAgICAgICAgIDwvcGF0dGVybnNldD4KLSAgICAgICAgICAgIDxmaWxlc2V0IHJlZmlkPSJ4c2x0LmZpbGVzIi8+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7amF2YS5yZXNvdXJjZS5kaXJ9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9zZXJ2ZXIvKioiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9jb21tLyoqIi8+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2Uvc2VydmVyL2FkbWluLyoqIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvKiovamF4Yi5wcm9wZXJ0aWVzIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy8qKi9iZ20uc2VyIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdWlsdC1CeSIgdmFsdWU9IiR7dXNlci5uYW1lfSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkubWFpbi1jbGFzc30iIHZhbHVlPSJjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS5zZXJ2ZXIuQXBwSW50ZXJmYWNlU2VydmVyIi8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5jbGFzcy1wYXRofSIgdmFsdWU9IiR7YWlzLTUyNTAuamFybmFtZX0gJHthaXMtMzI3MC5qYXJuYW1lfSAke2Fpcy1jb2JvbC5qYXJuYW1lfSAke2Fpcy1jaWNzLmphcm5hbWV9ICR7YWlzLWltcy5qYXJuYW1lfSAke3hhbGFuLmphcm5hbWV9ICR7c29hcC5qYXJuYW1lfSAke2FjdGl2YXRpb24uamFybmFtZX0gJHttYWlsLmphcm5hbWV9ICR7Y29tbW9ucy1jb2xsZWN0aW9ucy5qYXJuYW1lfSAke2NvbW1vbnMtcG9vbC5qYXJuYW1lfSAke3hlcmNlcy5qYXJuYW1lfSAke3htbC1hcGlzLmphcm5hbWV9ICR7Y29tbW9ucy1sYW5nLmphcm5hbWV9ICR7Y29tbW9ucy1jbGkuamFybmFtZX0gJHtqYXhiLmphcm5hbWVzfSAke2pha2FydGEtb3JvLmphcm5hbWV9ICR7Y29uY3VycmVudC5qYXJuYW1lfSAke2NvbW1vbnMtaHR0cGNsaWVudC5qYXJuYW1lfSAke2ptcy5qYXJuYW1lfSAke2V4dGVuc2lvbi5kaXIubmFtZX0vZW5naW5lLmphciAke2V4dGVuc2lvbi5kaXIubmFtZX0vcmVzb3VyY2UuemlwICR7ZXh0ZW5zaW9uLmRpci5uYW1lfS9qZG9tLmphciAgLi4vJHtmZGVmLmRpcm5hbWV9LyAuLi9KYXZhQ29ubmVjdG9ycy9DbGFzc2VzLyIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkucHJvZHVjdH0iIHZhbHVlPSIke3Byb2R1Y3QubmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmNvbXBvbmVudH0iIHZhbHVlPSJBSVMgQ29yZSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkudmVyc2lvbn0iIHZhbHVlPSIke3ZlcnNpb259Ii8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5idWlsZH0iIHZhbHVlPSIke2J1aWxkLmlkfSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuYnVpbGQtdHN9IiB2YWx1ZT0iJHtCdWlsZFRpbWVTdGFtcH0iLz4KLSAgICAgICAgICAgIDwvbWFuaWZlc3Q+Ci0gICAgICAgIDwvamFyPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImNvbXB1dGUtY2hlY2tzdW0iPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZpbGUiIHZhbHVlPSIke2Fpcy1jb3JlLmphcn0iLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWxlbmFtZSIgdmFsdWU9IiR7YWlzLWNvcmUuamFybmFtZX0iLz4KLSAgICAgICAgPC9hbnRjYWxsPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0iamFyLmFpcy5jbGllbnQiIGRlcGVuZHM9ImluaXQsIGNvbXBpbGUuYWlzLmNsaWVudCI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGlifSIvPgotICAgICAgICA8amFyIGphcmZpbGU9IiR7YWlzLmNsaWVudC5qYXJ9IiBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9Ij4KLSAgICAgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJhaXMuY2xpZW50LmZpbGVzIi8+Ci0gICAgICAgICAgICA8ZmlsZXNldCByZWZpZD0iYXBwaW50ZXJmYWNlLmJhc2UuZmlsZXMiLz4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy90b29sYm94L2NvbmZpZy8qKi9qYXhiLnByb3BlcnRpZXMiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L3Rvb2xib3gvY29uZmlnLyoqL2JnbS5zZXIiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgICAgIDxtYW5pZmVzdD4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1aWx0LUJ5IiB2YWx1ZT0iJHt1c2VyLm5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5jbGFzcy1wYXRofSIgdmFsdWU9IiR7eGVyY2VzLmphcm5hbWV9ICR7eG1sLWFwaXMuamFybmFtZX0gJHtjb21tb25zLWxhbmcuamFybmFtZX0gJHtqYXhiLmphcm5hbWVzfSAke2libS5tcS5qYXJuYW1lfSAke2ptcy5qYXJuYW1lfSAke21haWwuamFybmFtZX0gJHtzb2FwLmphcm5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5wcm9kdWN0fSIgdmFsdWU9IiR7cHJvZHVjdC5uYW1lfSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuY29tcG9uZW50fSIgdmFsdWU9IkphdmEgQ2xpZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS52ZXJzaW9ufSIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmJ1aWxkfSIgdmFsdWU9IiR7YnVpbGQuaWR9Ii8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5idWlsZC10c30iIHZhbHVlPSIke0J1aWxkVGltZVN0YW1wfSIvPgotICAgICAgICAgICAgPC9tYW5pZmVzdD4KLSAgICAgICAgPC9qYXI+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iY29tcHV0ZS1jaGVja3N1bSI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsZSIgdmFsdWU9IiR7YWlzLmNsaWVudC5qYXJ9Ii8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsZW5hbWUiIHZhbHVlPSIke2Fpcy5jbGllbnQuamFybmFtZX0iLz4KLSAgICAgICAgPC9hbnRjYWxsPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0iamFyLmFpcy5hZG1pbmNsaWVudCIgZGVwZW5kcz0iaW5pdCwgY29tcGlsZS5haXMuYWRtaW5jbGllbnQiPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmxpYn0iLz4KLSAgICAgICAgPGphciBqYXJmaWxlPSIke2Fpcy1hZG1pbmNsaWVudC5qYXJ9IiBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9Ij4KLSAgICAgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJhaXMuYWRtaW5jbGllbnQuZmlsZXMiLz4KLSAgICAgICAgICAgIDxtYW5pZmVzdD4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1aWx0LUJ5IiB2YWx1ZT0iJHt1c2VyLm5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5jbGFzcy1wYXRofSIgdmFsdWU9IiR7YWlzLmNsaWVudC5qYXJuYW1lfSAke3hlcmNlcy5qYXJuYW1lfSAke3htbC1hcGlzLmphcm5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5wcm9kdWN0fSIgdmFsdWU9IiR7cHJvZHVjdC5uYW1lfSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuY29tcG9uZW50fSIgdmFsdWU9IkphdmEgQWRtaW4gQ2xpZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS52ZXJzaW9ufSIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmJ1aWxkfSIgdmFsdWU9IiR7YnVpbGQuaWR9Ii8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5idWlsZC10c30iIHZhbHVlPSIke0J1aWxkVGltZVN0YW1wfSIvPgotICAgICAgICAgICAgPC9tYW5pZmVzdD4KLSAgICAgICAgPC9qYXI+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iY29tcHV0ZS1jaGVja3N1bSI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsZSIgdmFsdWU9IiR7YWlzLWFkbWluY2xpZW50Lmphcn0iLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWxlbmFtZSIgdmFsdWU9IiR7YWlzLWFkbWluY2xpZW50Lmphcm5hbWV9Ii8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9Imphci5wcm94eXNlcnZsZXQiIGRlcGVuZHM9ImluaXQsIGNvbXBpbGUucHJveHlzZXJ2bGV0Ij4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5saWJ9Ii8+Ci0gICAgICAgIDxqYXIgamFyZmlsZT0iJHtwcm94eXNlcnZsZXQuamFyfSIgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSI+Ci0gICAgICAgICAgICA8cGF0dGVybnNldCByZWZpZD0icHJveHlzZXJ2bGV0LmZpbGVzIi8+Ci0gICAgICAgICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdWlsdC1CeSIgdmFsdWU9IiR7dXNlci5uYW1lfSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuY2xhc3MtcGF0aH0iIHZhbHVlPSIke2Fpcy5jbGllbnQuamFybmFtZX0gJHtzZXJ2bGV0Lmphcm5hbWV9ICR7eGVyY2VzLmphcm5hbWV9ICR7eG1sLWFwaXMuamFybmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LnByb2R1Y3R9IiB2YWx1ZT0iJHtwcm9kdWN0Lm5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5jb21wb25lbnR9IiB2YWx1ZT0iU2VydmxldCBQcm94eSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkudmVyc2lvbn0iIHZhbHVlPSIke3ZlcnNpb259Ii8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5idWlsZH0iIHZhbHVlPSIke2J1aWxkLmlkfSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuYnVpbGQtdHN9IiB2YWx1ZT0iJHtCdWlsZFRpbWVTdGFtcH0iLz4KLSAgICAgICAgICAgIDwvbWFuaWZlc3Q+Ci0gICAgICAgIDwvamFyPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImNvbXB1dGUtY2hlY2tzdW0iPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZpbGUiIHZhbHVlPSIke3Byb3h5c2VydmxldC5qYXJ9Ii8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsZW5hbWUiIHZhbHVlPSIke3Byb3h5c2VydmxldC5qYXJuYW1lfSIvPgotICAgICAgICA8L2FudGNhbGw+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJqYXIuYWRtaW5jb25zb2xlIiBkZXBlbmRzPSJpbml0LCBjb21waWxlLmFkbWluY29uc29sZSwgY3JlYXRlU3BsYXNoLmFpcy5zcGxhc2hzY3JlZW5zIj4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5saWJ9Ii8+Ci0gICAgICAgIDwhLS0gQ29weSAicmVzb3VyY2UiIGZpbGVzIHRoYXQgZ28gaW4gdGhlIGphciBmaWxlLiAtLT4KLSAgICAgICAgPGNvcHkgdG9EaXI9IiR7YnVpbGQuY2xhc3Nlc30iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtqYXZhLnJlc291cmNlLmRpcn0iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3NlcnZlci9hZG1pbi9jbGllbnQvIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2Uvc2VydmVyLyouanBnIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgPGphciBqYXJmaWxlPSIke2FkbWluY29uc29sZS5qYXJ9IiBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9Ij4KLSAgICAgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJhZG1pbmNvbnNvbGUuZmlsZXMiLz4KLSAgICAgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJkZXZ0b29scy5mcmFtZXdvcmsuZmlsZXMiLz4KLSAgICAgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJhaXMuY2xpZW50LmZpbGVzIi8+Ci0gICAgICAgICAgICA8cGF0dGVybnNldCByZWZpZD0iYXBwaW50ZXJmYWNlc2VydmVyc2V0dGluZ3MuZmlsZXMiLz4KLSAgICAgICAgICAgIDxmaWxlc2V0IHJlZmlkPSJhcHBpbnRlcmZhY2UuYmFzZXBsdXMuZmlsZXMiLz4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3NlcnZlci8qLmpwZyIvPgotICAgICAgICAgICAgPG1hbmlmZXN0PgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iQnVpbHQtQnkiIHZhbHVlPSIke3VzZXIubmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5Lm1haW4tY2xhc3N9IiB2YWx1ZT0iY29tLnNlYWd1bGxzdy5hcHBpbnRlcmZhY2Uuc2VydmVyLmFkbWluLmNsaWVudC5BcHBJbnRlcmZhY2VTZXJ2ZXJBZG1pblVJQ2xpZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5jbGFzcy1wYXRofSIgdmFsdWU9IiR7YWlzLWNvcmUuamFybmFtZX0gJHt4ZXJjZXMuamFybmFtZX0gJHt4bWwtYXBpcy5qYXJuYW1lfSAke3hhbGFuLmphcm5hbWV9ICR7c29hcC5qYXJuYW1lfSAke2FjdGl2YXRpb24uamFybmFtZX0gJHttYWlsLmphcm5hbWV9ICR7Y29tbW9ucy1jbGkuamFybmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LnByb2R1Y3R9IiB2YWx1ZT0iJHtwcm9kdWN0Lm5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5jb21wb25lbnR9IiB2YWx1ZT0iQWRtaW5pc3RyYXRpdmUgQ29uc29sZSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkudmVyc2lvbn0iIHZhbHVlPSIke3ZlcnNpb259Ii8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5idWlsZH0iIHZhbHVlPSIke2J1aWxkLmlkfSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuYnVpbGQtdHN9IiB2YWx1ZT0iJHtCdWlsZFRpbWVTdGFtcH0iLz4KLSAgICAgICAgICAgIDwvbWFuaWZlc3Q+Ci0gICAgICAgIDwvamFyPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImNvbXB1dGUtY2hlY2tzdW0iPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZpbGUiIHZhbHVlPSIke2FkbWluY29uc29sZS5qYXJ9Ii8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsZW5hbWUiIHZhbHVlPSIke2FkbWluY29uc29sZS5qYXJuYW1lfSIvPgotICAgICAgICA8L2FudGNhbGw+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJqYXIuamF2YWNvbm5lY3RvcmdlbmVyYXRvciIgZGVwZW5kcz0iaW5pdCwgY29tcGlsZS5qYXZhY29ubmVjdG9yZ2VuZXJhdG9yIj4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5saWJ9Ii8+Ci0gICAgICAgIDwhLS0gQ29weSAicmVzb3VyY2UiIGZpbGVzIHRoYXQgZ28gaW4gdGhlIGphciBmaWxlLiAtLT4KLSAgICAgICAgPGNvcHkgdG9EaXI9IiR7YnVpbGQuY2xhc3Nlc30iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIiBmaWx0ZXJpbmc9InRydWUiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2phdmEucmVzb3VyY2UuZGlyfSI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvdG9vbHMvamF2YWNvbm5lY3RvcmdlbmVyYXRvci8iLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9jb3B5PgotICAgICAgICA8amFyIGphcmZpbGU9IiR7amF2YWNvbm5lY3RvcmdlbmVyYXRvci5qYXJ9IiBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9Ij4KLSAgICAgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJqYXZhY29ubmVjdG9yZ2VuZXJhdG9yLmZpbGVzIi8+Ci0gICAgICAgICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdWlsdC1CeSIgdmFsdWU9IiR7dXNlci5uYW1lfSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkubWFpbi1jbGFzc30iIHZhbHVlPSJjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS50b29scy5qYXZhY29ubmVjdG9yZ2VuZXJhdG9yLkphdmFDb25uZWN0b3JHZW5lcmF0b3IiLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmNsYXNzLXBhdGh9IiB2YWx1ZT0iJHthaXMtdG9vbHMuamFybmFtZX0gJHt4bWwtYXBpcy5qYXJuYW1lfSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkucHJvZHVjdH0iIHZhbHVlPSIke3Byb2R1Y3QubmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmNvbXBvbmVudH0iIHZhbHVlPSJKYXZhIENvbm5lY3RvciBHZW5lcmF0b3IiLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LnZlcnNpb259IiB2YWx1ZT0iJHt2ZXJzaW9ufSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuYnVpbGR9IiB2YWx1ZT0iJHtidWlsZC5pZH0iLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmJ1aWxkLXRzfSIgdmFsdWU9IiR7QnVpbGRUaW1lU3RhbXB9Ii8+Ci0gICAgICAgICAgICA8L21hbmlmZXN0PgotICAgICAgICA8L2phcj4KLSAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJjb21wdXRlLWNoZWNrc3VtIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWxlIiB2YWx1ZT0iJHtqYXZhY29ubmVjdG9yZ2VuZXJhdG9yLmphcn0iLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWxlbmFtZSIgdmFsdWU9IiR7amF2YWNvbm5lY3RvcmdlbmVyYXRvci5qYXJuYW1lfSIvPgotICAgICAgICA8L2FudGNhbGw+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJqYXIuc2VjdXJpdHl0b29sa2l0IiBkZXBlbmRzPSJpbml0LCBjb21waWxlLnNlY3VyaXR5dG9vbGtpdCI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGlifSIvPgotICAgICAgICA8IS0tIENvcHkgInJlc291cmNlIiBmaWxlcyB0aGF0IGdvIGluIHRoZSBqYXIgZmlsZS4gLS0+Ci0gICAgICAgIDxjb3B5IHRvRGlyPSIke2J1aWxkLmNsYXNzZXN9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIgZmlsdGVyaW5nPSJ0cnVlIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtqYXZhLnJlc291cmNlLmRpcn0iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3Rvb2xzL3NlY3VyaXR5LyIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDxqYXIgamFyZmlsZT0iJHtzZWN1cml0eXRvb2xraXQuamFyfSIgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSI+Ci0gICAgICAgICAgICA8cGF0dGVybnNldCByZWZpZD0ic2VjdXJpdHl0b29sa2l0LmZpbGVzIi8+Ci0gICAgICAgICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdWlsdC1CeSIgdmFsdWU9IiR7dXNlci5uYW1lfSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkubWFpbi1jbGFzc30iIHZhbHVlPSJjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS50b29scy5zZWN1cml0eS5TZWN1cml0eVRvb2xraXQiLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmNsYXNzLXBhdGh9IiB2YWx1ZT0iJHthaXMtY29yZS5qYXJuYW1lfSAke2Fpcy10b29scy5qYXJuYW1lfSAke3htbC1hcGlzLmphcm5hbWV9ICR7Y29tbW9ucy1sYW5nLmphcm5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5wcm9kdWN0fSIgdmFsdWU9IiR7cHJvZHVjdC5uYW1lfSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuY29tcG9uZW50fSIgdmFsdWU9IlNlY3VyaXR5IFRvb2xraXQiLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LnZlcnNpb259IiB2YWx1ZT0iJHt2ZXJzaW9ufSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuYnVpbGR9IiB2YWx1ZT0iJHtidWlsZC5pZH0iLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmJ1aWxkLXRzfSIgdmFsdWU9IiR7QnVpbGRUaW1lU3RhbXB9Ii8+Ci0gICAgICAgICAgICA8L21hbmlmZXN0PgotICAgICAgICA8L2phcj4KLSAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJjb21wdXRlLWNoZWNrc3VtIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWxlIiB2YWx1ZT0iJHtzZWN1cml0eXRvb2xraXQuamFyfSIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZpbGVuYW1lIiB2YWx1ZT0iJHtzZWN1cml0eXRvb2xraXQuamFybmFtZX0iLz4KLSAgICAgICAgPC9hbnRjYWxsPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0iamFyLmFpcy10b29scyIgZGVwZW5kcz0iaW5pdCwgY29tcGlsZS5kZXZ0b29scywgY3JlYXRlU3BsYXNoLnRvb2xzLnNwbGFzaHNjcmVlbnMsIGNvbXBpbGUud2luMzJpbnRlcmZhY2UsIGNvbXBpbGUuamF2YXRvb2xzIj4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5saWJ9Ii8+Ci0gICAgICAgIDwhLS0gQ29weSAicmVzb3VyY2UiIGZpbGVzIHRoYXQgZ28gaW4gdGhlIGphciBmaWxlLiAtLT4KLSAgICAgICAgPGNvcHkgdG9EaXI9IiR7YnVpbGQuY2xhc3Nlc30iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtqYXZhLnJlc291cmNlLmRpcn0iPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlLyoqLyouZ2lmIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgPGphciBqYXJmaWxlPSIke2Fpcy10b29scy5qYXJ9IiBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9Ij4KLSAgICAgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJkZXZ0b29scy5maWxlcyIvPgotICAgICAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9ImFkbWluY29uc29sZS5maWxlcyIvPgotICAgICAgICAgICAgPGZpbGVzZXQgcmVmaWQ9ImFwcGludGVyZmFjZS5iYXNlcGx1cy5maWxlcyIvPgotICAgICAgICAgICAgPHBhdHRlcm5zZXQ+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvKiovKnNldHRpbmdzKi8iLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2phdmF4L3N3aW5nLyIvPgotICAgICAgICAgICAgICAgIDwhLS0gTm90IHN1cmUgd2h5IHRoaXMgaXNuJ3QgZ2V0dGluZyBpbmNsdWRlZCBhcyBwYXJ0IG9mIHVpZmFjaWxpdGllcy5maWxlcyB2aWEgYXBwaW50ZXJmYWNlLmJhc2VwbHVzLmZpbGVzLiAtLT4KLSAgICAgICAgICAgIDwvcGF0dGVybnNldD4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3Rvb2xzL2ltYWdlcy8qLmpwZyIvPgotICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvKiovKi5naWYiLz4KLSAgICAgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJqYXZhdG9vbHMuZmlsZXMiLz4KLSAgICAgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJ3aW4zMmludGVyZmFjZS5maWxlcyIvPgotICAgICAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9ImFpcy5jbGllbnQuZmlsZXMiLz4KLSAgICAgICAgICAgIDxmaWxlc2V0IHJlZmlkPSJ4c2x0LmZpbGVzIi8+Ci0gICAgICAgICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdWlsdC1CeSIgdmFsdWU9IiR7dXNlci5uYW1lfSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkubWFpbi1jbGFzc30iIHZhbHVlPSJjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS50b29scy5zZXJ2ZXJkZWYuRGVmaW5pdGlvblRvb2wiLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmNsYXNzLXBhdGh9IiB2YWx1ZT0iJHthaXMtY29ib2wuamFybmFtZX0gJHthaXMtY2ljcy5qYXJuYW1lfSAke2Fpcy1pbXMuamFybmFtZX0gJHt4ZXJjZXMuamFybmFtZX0gJHt4bWwtYXBpcy5qYXJuYW1lfSAke3hhbGFuLmphcm5hbWV9ICR7c29hcC5qYXJuYW1lfSAke2FjdGl2YXRpb24uamFybmFtZX0gJHttYWlsLmphcm5hbWV9ICR7amF4Yi5qYXJuYW1lc30gJHtjb21tb25zLWxhbmcuamFybmFtZX0gJHtleHRlbnNpb24uZGlyLm5hbWV9LyR7ajJzZS50b29scy5qYXJuYW1lfSAke2Fpcy10b29scy5qYXJuYW1lfSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkucHJvZHVjdH0iIHZhbHVlPSIke3Byb2R1Y3QubmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmNvbXBvbmVudH0iIHZhbHVlPSJUb29scyIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkudmVyc2lvbn0iIHZhbHVlPSIke3ZlcnNpb259Ii8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5idWlsZH0iIHZhbHVlPSIke2J1aWxkLmlkfSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuYnVpbGQtdHN9IiB2YWx1ZT0iJHtCdWlsZFRpbWVTdGFtcH0iLz4KLSAgICAgICAgICAgIDwvbWFuaWZlc3Q+Ci0gICAgICAgIDwvamFyPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImNvbXB1dGUtY2hlY2tzdW0iPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZpbGUiIHZhbHVlPSIke2Fpcy10b29scy5qYXJ9Ii8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsZW5hbWUiIHZhbHVlPSIke2Fpcy10b29scy5qYXJuYW1lfSIvPgotICAgICAgICA8L2FudGNhbGw+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJqYXIuYWlzLTUyNTAiIGRlcGVuZHM9ImluaXQsIGNvbXBpbGUuaGNiYWNrZW5kIj4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5saWJ9Ii8+Ci0gICAgICAgIDxqYXIgamFyZmlsZT0iJHthaXMtNTI1MC5qYXJ9IiBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9Ij4KLSAgICAgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJoY2JhY2tlbmQuZmlsZXMiLz4KLSAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3Rvb2xzLyIvPgotICAgICAgICAgICAgPG1hbmlmZXN0PgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iQnVpbHQtQnkiIHZhbHVlPSIke3VzZXIubmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmNsYXNzLXBhdGh9IiB2YWx1ZT0iJHthaXMtY29yZS5qYXJuYW1lfSAke2hzYy5qYXJuYW1lfSAke2hzY3UuamFybmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LnByb2R1Y3R9IiB2YWx1ZT0iJHtwcm9kdWN0Lm5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5jb21wb25lbnR9IiB2YWx1ZT0iNTI1MCBDb25uZWN0b3IiLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LnZlcnNpb259IiB2YWx1ZT0iJHt2ZXJzaW9ufSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuYnVpbGR9IiB2YWx1ZT0iJHtidWlsZC5pZH0iLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmJ1aWxkLXRzfSIgdmFsdWU9IiR7QnVpbGRUaW1lU3RhbXB9Ii8+Ci0gICAgICAgICAgICA8L21hbmlmZXN0PgotICAgICAgICA8L2phcj4KLSAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJjb21wdXRlLWNoZWNrc3VtIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWxlIiB2YWx1ZT0iJHthaXMtNTI1MC5qYXJ9Ii8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsZW5hbWUiIHZhbHVlPSIke2Fpcy01MjUwLmphcm5hbWV9Ii8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9Imphci5haXMtMzI3MCIgZGVwZW5kcz0iaW5pdCwgY29tcGlsZS5oY2JhY2tlbmQiPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmxpYn0iLz4KLSAgICAgICAgPGphciBqYXJmaWxlPSIke2Fpcy0zMjcwLmphcn0iIGJhc2VkaXI9IiR7YnVpbGQuY2xhc3Nlc30iPgotICAgICAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9ImhjYmFja2VuZC5maWxlcyIvPgotICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvdG9vbHMvIi8+Ci0gICAgICAgICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdWlsdC1CeSIgdmFsdWU9IiR7dXNlci5uYW1lfSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuY2xhc3MtcGF0aH0iIHZhbHVlPSIke2Fpcy1jb3JlLmphcm5hbWV9ICR7aHNjLmphcm5hbWV9ICR7aHNjdS5qYXJuYW1lfSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkucHJvZHVjdH0iIHZhbHVlPSIke3Byb2R1Y3QubmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmNvbXBvbmVudH0iIHZhbHVlPSIzMjcwIENvbm5lY3RvciIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkudmVyc2lvbn0iIHZhbHVlPSIke3ZlcnNpb259Ii8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5idWlsZH0iIHZhbHVlPSIke2J1aWxkLmlkfSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuYnVpbGQtdHN9IiB2YWx1ZT0iJHtCdWlsZFRpbWVTdGFtcH0iLz4KLSAgICAgICAgICAgIDwvbWFuaWZlc3Q+Ci0gICAgICAgIDwvamFyPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImNvbXB1dGUtY2hlY2tzdW0iPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZpbGUiIHZhbHVlPSIke2Fpcy0zMjcwLmphcn0iLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWxlbmFtZSIgdmFsdWU9IiR7YWlzLTMyNzAuamFybmFtZX0iLz4KLSAgICAgICAgPC9hbnRjYWxsPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0iamFyLmFpcy1jb2JvbCIgZGVwZW5kcz0iaW5pdCwgY29tcGlsZS5jb2JvbCI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGlifSIvPgotICAgICAgICA8amFyIGphcmZpbGU9IiR7YWlzLWNvYm9sLmphcn0iIGJhc2VkaXI9IiR7YnVpbGQuY2xhc3Nlc30iPgotICAgICAgICAgICAgPHBhdHRlcm5zZXQgcmVmaWQ9ImNvYm9sLmZpbGVzIi8+Ci0gICAgICAgICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdWlsdC1CeSIgdmFsdWU9IiR7dXNlci5uYW1lfSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuY2xhc3MtcGF0aH0iIHZhbHVlPSIke2Fpcy1jb3JlLmphcm5hbWV9ICR7YWlzLWNpY3MuamFybmFtZX0gJHthaXMtaW1zLmphcm5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5wcm9kdWN0fSIgdmFsdWU9IiR7cHJvZHVjdC5uYW1lfSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuY29tcG9uZW50fSIgdmFsdWU9IkNvYm9sIENvbm5lY3RvciIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkudmVyc2lvbn0iIHZhbHVlPSIke3ZlcnNpb259Ii8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5idWlsZH0iIHZhbHVlPSIke2J1aWxkLmlkfSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuYnVpbGQtdHN9IiB2YWx1ZT0iJHtCdWlsZFRpbWVTdGFtcH0iLz4KLSAgICAgICAgICAgIDwvbWFuaWZlc3Q+Ci0gICAgICAgIDwvamFyPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImNvbXB1dGUtY2hlY2tzdW0iPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZpbGUiIHZhbHVlPSIke2Fpcy1jb2JvbC5qYXJ9Ii8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsZW5hbWUiIHZhbHVlPSIke2Fpcy1jb2JvbC5qYXJuYW1lfSIvPgotICAgICAgICA8L2FudGNhbGw+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJqYXIuYWlzLWNpY3MiIGRlcGVuZHM9ImluaXQsIGNvbXBpbGUuY2ljcyI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGlifSIvPgotICAgICAgICA8Y29weSB0b0Rpcj0iJHtidWlsZC5jbGFzc2VzfSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3LyoqL2pheGIucHJvcGVydGllcyIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvKiovYmdtLnNlciIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDxqYXIgamFyZmlsZT0iJHthaXMtY2ljcy5qYXJ9IiBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9Ij4KLSAgICAgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJjaWNzLmZpbGVzIi8+Ci0gICAgICAgICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdWlsdC1CeSIgdmFsdWU9IiR7dXNlci5uYW1lfSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuY2xhc3MtcGF0aH0iIHZhbHVlPSIke2Fpcy1jb3JlLmphcm5hbWV9ICR7YWlzLWNvYm9sLmphcm5hbWV9ICR7ZXh0ZW5zaW9uLmRpci5uYW1lfS8ke2N0Z2NsaWVudC5qYXJuYW1lfSAke2NvbW1vbnMtY29kZWMuamFybmFtZX0gJHtjb21tb25zLWxvZ2dpbmcuamFybmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LnByb2R1Y3R9IiB2YWx1ZT0iJHtwcm9kdWN0Lm5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5jb21wb25lbnR9IiB2YWx1ZT0iQ0lDUyBDb25uZWN0b3IiLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LnZlcnNpb259IiB2YWx1ZT0iJHt2ZXJzaW9ufSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkuYnVpbGR9IiB2YWx1ZT0iJHtidWlsZC5pZH0iLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmJ1aWxkLXRzfSIgdmFsdWU9IiR7QnVpbGRUaW1lU3RhbXB9Ii8+Ci0gICAgICAgICAgICA8L21hbmlmZXN0PgotICAgICAgICA8L2phcj4KLSAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJjb21wdXRlLWNoZWNrc3VtIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWxlIiB2YWx1ZT0iJHthaXMtY2ljcy5qYXJ9Ii8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsZW5hbWUiIHZhbHVlPSIke2Fpcy1jaWNzLmphcm5hbWV9Ii8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9Imphci5haXMtaW1zIiBkZXBlbmRzPSJpbml0LCBjb21waWxlLklNU2JhY2tlbmQiPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmxpYn0iLz4KLSAgICAgICAgPGphciBqYXJmaWxlPSIke2Fpcy1pbXMuamFyfSIgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSI+Ci0gICAgICAgICAgICA8cGF0dGVybnNldCByZWZpZD0iaW1zLmJhY2tlbmQuZmlsZXMiLz4KLSAgICAgICAgICAgIDxtYW5pZmVzdD4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1aWx0LUJ5IiB2YWx1ZT0iJHt1c2VyLm5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5jbGFzcy1wYXRofSIgdmFsdWU9IiR7YWlzLWNvcmUuamFybmFtZX0gJHthaXMtY29ib2wuamFybmFtZX0gJHtpbXNpY28uamFybmFtZX0gJHtpbXNpY28tY29ubmVjdG9yLmphcm5hbWV9ICR7amFhcy5qYXJuYW1lfSAke2p0YS5qYXJuYW1lfSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkucHJvZHVjdH0iIHZhbHVlPSIke3Byb2R1Y3QubmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmNvbXBvbmVudH0iIHZhbHVlPSJJTVMgQ29ubmVjdG9yIi8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS52ZXJzaW9ufSIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmJ1aWxkfSIgdmFsdWU9IiR7YnVpbGQuaWR9Ii8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5idWlsZC10c30iIHZhbHVlPSIke0J1aWxkVGltZVN0YW1wfSIvPgotICAgICAgICAgICAgPC9tYW5pZmVzdD4KLSAgICAgICAgPC9qYXI+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iY29tcHV0ZS1jaGVja3N1bSI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsZSIgdmFsdWU9IiR7YWlzLWltcy5qYXJ9Ii8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsZW5hbWUiIHZhbHVlPSIke2Fpcy1pbXMuamFybmFtZX0iLz4KLSAgICAgICAgPC9hbnRjYWxsPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0iamFyLmhzYyIgZGVwZW5kcz0iaW5pdCwgY29tcGlsZS5oc2MiPgotICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmxpYn0iLz4KLSAgICAgICAgPGphciBqYXJmaWxlPSIke2hzY3UuamFyfSIgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSI+Ci0gICAgICAgICAgICA8cGF0dGVybnNldCByZWZpZD0iaHNjLmZpbGVzIi8+Ci0gICAgICAgICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdWlsdC1CeSIgdmFsdWU9IiR7dXNlci5uYW1lfSIvPgotICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHttYW5pZmVzdC5rZXkucHJvZHVjdH0iIHZhbHVlPSIke3Byb2R1Y3QubmFtZX0iLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmNvbXBvbmVudH0iIHZhbHVlPSJIb3N0IFNlc3Npb24gQ29ubmVjdG9yIi8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS52ZXJzaW9ufSIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KLSAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IiR7bWFuaWZlc3Qua2V5LmJ1aWxkfSIgdmFsdWU9IiR7YnVpbGQuaWR9Ii8+Ci0gICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSIke21hbmlmZXN0LmtleS5idWlsZC10c30iIHZhbHVlPSIke0J1aWxkVGltZVN0YW1wfSIvPgotICAgICAgICAgICAgPC9tYW5pZmVzdD4KLSAgICAgICAgPC9qYXI+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iY29tcHV0ZS1jaGVja3N1bSI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsZSIgdmFsdWU9IiR7aHNjdS5qYXJ9Ii8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iZmlsZW5hbWUiIHZhbHVlPSIke2hzY3UuamFybmFtZX0iLz4KLSAgICAgICAgPC9hbnRjYWxsPgotICAgICAgICA8ZWNobyBsZXZlbD0iaW5mbyIgbWVzc2FnZT0iUnVubmluZyBSZXRyb0d1YXJkLi4uIi8+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iUmV0cm9HdWFyZCIgZm9yaz0ieWVzIj4KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9IiR7aHNjdS5qYXJ9Ii8+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSIke2hzYy5qYXJ9Ii8+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSIke29iZnVzY2F0ZS5zY3JpcHR9Ii8+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSIke29iZnVzY2F0ZS5sb2d9Ii8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke3JldHJvZ3VhcmQuamFyfSIvPgotICAgICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgIDwvamF2YT4KLSAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJjb21wdXRlLWNoZWNrc3VtIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJmaWxlIiB2YWx1ZT0iJHtoc2MuamFyfSIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImZpbGVuYW1lIiB2YWx1ZT0iJHtoc2MuamFybmFtZX0iLz4KLSAgICAgICAgPC9hbnRjYWxsPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0iamFyLnRlc3RiYWNrZW5kIiBkZXBlbmRzPSJ0ZXN0LmNvbXBpbGUiPgotICAgICAgICA8amFyIGphcmZpbGU9IiR7YnVpbGQubGlifS9haXMtdGVzdGJhY2tlbmQuamFyIiBiYXNlZGlyPSIke3Rlc3QuYmlufSI+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9zZXJ2ZXIvYmFja2VuZC9haXN0ZXN0LyoqIi8+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLnRlc3QuZGlyfSI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2Uvc2VydmVyL2JhY2tlbmQvYWlzdGVzdC8qKi9qYXhiLnByb3BlcnRpZXMiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9zZXJ2ZXIvYmFja2VuZC9haXN0ZXN0LyoqL2JnbS5zZXIiLz4KLSAgICAgICAgICAgIDwvZmlsZXNldD4KLSAgICAgICAgPC9qYXI+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gUHJlcGFyZXMgdGhlIGJ1aWxkIGRpcmVjdG9yeSAtLT4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJwcmVwYXJlIiBkZXBlbmRzPSJpbml0Ij4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuY2xhc3Nlc30iLz4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBDbGVhbnMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlc2NyaXB0aW9uPSJSZW1vdmVzIGFsbCB0aGUgZ2VuZXJhdGVkIGZpbGVzIGFuZCBkaXJlY3RvcmllcyI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0iLz4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuLmphcnMiPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5saWJ9Ii8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJjbGVhbi5jbGFzc2VzIiBkZXNjcmlwdGlvbj0iUmVtb3ZlcyBhbGwgLmNsYXNzIGZpbGVzIj4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuY2xhc3Nlc30iLz4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBJbml0IC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9ImJhbm5lciI+Ci0gICAgICAgIDx0c3RhbXA+Ci0gICAgICAgICAgICA8IS0tIFRoZSBkYXRlL3RpbWUgcGF0dGVybnMgYXJlIGFzIGRlZmluZWQgaW4gdGhlIEphdmEgU2ltcGxlRGF0ZUZvcm1hdCBjbGFzcy4gLS0+Ci0gICAgICAgICAgICA8Zm9ybWF0IHByb3BlcnR5PSJCdWlsZFRpbWVTdGFtcCIgcGF0dGVybj0ieXl5eS1NTU1NTS1kZCBISDptbSB6Ii8+Ci0gICAgICAgIDwvdHN0YW1wPgotICAgICAgICA8ZmlsdGVyIHRva2VuPSJQUk9EVUNUIiB2YWx1ZT0iJHtwcm9kdWN0Lm5hbWV9Ii8+Ci0gICAgICAgIDxmaWx0ZXIgdG9rZW49IlZFUlNJT04iIHZhbHVlPSIke3ZlcnNpb259Ii8+Ci0gICAgICAgIDxmaWx0ZXIgdG9rZW49IkJVSUxESUQiIHZhbHVlPSIke2J1aWxkLmlkfSIvPgotICAgICAgICA8ZmlsdGVyIHRva2VuPSJCVUlMRFRJTUVTVEFNUCIgdmFsdWU9IiR7QnVpbGRUaW1lU3RhbXB9Ii8+Ci0gICAgICAgIDxmaWx0ZXIgdG9rZW49IkNPUFlSSUdIVC0xIiB2YWx1ZT0iJHt0ZXh0LmNvcHlyaWdodC4xfSIvPgotICAgICAgICA8ZmlsdGVyIHRva2VuPSJDT1BZUklHSFQtMiIgdmFsdWU9IiR7dGV4dC5jb3B5cmlnaHQuMn0iLz4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9ImJhbm5lciIgdW5sZXNzPSJiYW5uZXItc2V0Ij4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxvZ3hzbC1wcm9wLXNlcCIgdmFsdWU9Ii0+Ii8+Ci0gICAgICAgIDxlY2hvIGxldmVsPSJpbmZvIiBtZXNzYWdlPSJhbnQuZmlsZSAke2xvZ3hzbC1wcm9wLXNlcH0gJHthbnQuZmlsZX0iLz4KLSAgICAgICAgPGVjaG8gbGV2ZWw9ImluZm8iIG1lc3NhZ2U9ImFudC52ZXJzaW9uICR7bG9neHNsLXByb3Atc2VwfSAke2FudC52ZXJzaW9ufSIvPgotICAgICAgICA8ZWNobyBsZXZlbD0iaW5mbyIgbWVzc2FnZT0iamF2YS52bS52ZXJzaW9uICR7bG9neHNsLXByb3Atc2VwfSAke2FudC5qYXZhLnZlcnNpb259Ii8+Ci0gICAgICAgIDxlY2hvIGxldmVsPSJpbmZvIiBtZXNzYWdlPSJqYXZhLnZlcnNpb24gJHtsb2d4c2wtcHJvcC1zZXB9ICR7amF2YS52ZXJzaW9ufSIvPgotICAgICAgICA8ZWNobyBsZXZlbD0iaW5mbyIgbWVzc2FnZT0ib3MubmFtZSAke2xvZ3hzbC1wcm9wLXNlcH0gJHtvcy5uYW1lfSIvPgotICAgICAgICA8ZWNobyBsZXZlbD0iaW5mbyIgbWVzc2FnZT0iQnVpbGQgSUQ6ICR7YnVpbGQuaWR9Ii8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJiYW5uZXItc2V0IiB2YWx1ZT0idHJ1ZSIvPgotICAgIDwvdGFyZ2V0PgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8IS0tIFNwbGFzaCBTY3JlZW5zIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8cHJvcGVydHkgbmFtZT0iaW50ZXJuYWxkZXYuY2xhc3NlcyIgdmFsdWU9IiR7YnVpbGQuZGlyfS9pbnRlcm5hbGRldiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJzcGxhc2guc3JjIiB2YWx1ZT0iJHtzcmMucm9vdC5kaXJ9L0J1aWxkL3NwbGFzaHNjcmVlbiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJzcGxhc2guZGVzdCIgdmFsdWU9IiR7YnVpbGQuZGlyfS9zcGxhc2hzY3JlZW5zIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InNlcnZlci5zcGxhc2hzY3JlZW4ubGluZS0xIiB2YWx1ZT0iQXBwbGljYXRpb24gSW50ZXJmYWNlIFNlcnZlciIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29scy5zcGxhc2hzY3JlZW4ubGluZS0xIiB2YWx1ZT0iVHJhbnNpZGlvbSBEZXZlbG9wZXIiLz4KLSAgICA8IS0tIFRhc2sgY29tcGlsZS5zcGxhc2hTY3JlZW5DcmVhdG9yIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS5zcGxhc2hTY3JlZW5DcmVhdG9yIj4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtpbnRlcm5hbGRldi5jbGFzc2VzfSIvPgotICAgICAgICA8amF2YWMgc3JjZGlyPSIke3NyYy50ZXN0LmRpcn0iIGRlc3RkaXI9IiR7aW50ZXJuYWxkZXYuY2xhc3Nlc30iIGRlYnVnPSIke2NvbXBpbGUuZGVidWd9Ij4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvaW50ZXJuYWxkZXYvYnVpbGQvU3BsYXNoc2NyZWVuQ3JlYXRvci5qYXZhIi8+Ci0gICAgICAgIDwvamF2YWM+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPCEtLQotICAgICAgICAgICAgIFJ1biBTcGxhc2hzY3JlZW5DcmVhdG9yIHByb2dyYW0gd2hpY2ggdGFrZXMgYSAidmFuaWxsYSIganBnIHBsdXMKLSAgICAgICAgICAgICBzb21lIHRleHQgYW5kIGNyZWF0ZXMgYSBuZXcgIm1lcmdlZCIganBnLgotICAgICAgICAgICAgIFRoaXMgaXMgdXNlZCBieSB0aGUgY3JlYXRlU3BsYXNoLnh4eC5zcGxhc2hzY3JlZW4gdGFyZ2V0cy4KLSAgICAgICAgLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJjcmVhdGVTcGxhc2giIGRlcGVuZHM9ImNvbXBpbGUuc3BsYXNoU2NyZWVuQ3JlYXRvciI+Ci0gICAgICAgIDwhLS0gIGphdmEgdGFzazogZmFpbG9uZXJyb3Igd29ya3Mgb25seSBpZiBmb3JrIGlzIHRydWUgLS0+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iY29tLnNlYWd1bGxzdy5pbnRlcm5hbGRldi5idWlsZC5TcGxhc2hzY3JlZW5DcmVhdG9yIiBmYWlsb25lcnJvcj0idHJ1ZSIgZm9yaz0idHJ1ZSI+Ci0gICAgICAgICAgICA8IS0tIDxzeXNwcm9wZXJ0eSBrZXk9ImNvbS5zZWFndWxsc3cuZGVidWciIHZhbHVlPSJ0cnVlIi8+ICAtLT4KLSAgICAgICAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImNvbS5zZWFndWxsc3cucXVpZXQiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICAgICAgPHN5c3Byb3BlcnR5IGtleT0iY29tLnNlYWd1bGxzdy54IiB2YWx1ZT0iOCIvPgotICAgICAgICAgICAgPHN5c3Byb3BlcnR5IGtleT0iY29tLnNlYWd1bGxzdy55IiB2YWx1ZT0iMTk2Ii8+Ci0gICAgICAgICAgICA8c3lzcHJvcGVydHkga2V5PSJjb20uc2VhZ3VsbHN3LmZvbnRzaXplIiB2YWx1ZT0iMTEiLz4KLSAgICAgICAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImNvbS5zZWFndWxsc3cuc291cmNlU2NyZWVuRmlsZSIgdmFsdWU9IiR7Y3JlYXRlU3BsYXNoLnNvdXJjZVNjcmVlbkZpbGV9Ii8+Ci0gICAgICAgICAgICA8c3lzcHJvcGVydHkga2V5PSJjb20uc2VhZ3VsbHN3LnRhcmdldFNjcmVlbkZpbGUiIHZhbHVlPSIke2NyZWF0ZVNwbGFzaC50YXJnZXRTY3JlZW5GaWxlfSIvPgotICAgICAgICAgICAgPHN5c3Byb3BlcnR5IGtleT0iY29tLnNlYWd1bGxzdy5zY3JlZW5UZXh0RmlsZSIgdmFsdWU9IiR7Y3JlYXRlU3BsYXNoLnNjcmVlblRleHRGaWxlfSIvPgotICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7aW50ZXJuYWxkZXYuY2xhc3Nlc30iLz4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICA8L2phdmE+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPCEtLSBDcmVhdGUgQUlTIHNwbGFzaHNjcmVlbnMgLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJjcmVhdGVTcGxhc2guYWlzLnNwbGFzaHNjcmVlbnMiIGRlcGVuZHM9ImluaXQiPgotICAgICAgICA8ZmlsdGVyIHRva2VuPSJTRVJWRVIuU1BMQVNIU0NSRUVOLkxJTkUtMSIgdmFsdWU9IiR7c2VydmVyLnNwbGFzaHNjcmVlbi5saW5lLTF9Ii8+Ci0gICAgICAgIDwhLS0gTGluZSAyIGlzIGluIHRoZSB0ZW1wbGF0ZSBhbmQgdXNlcyB0aGUgVmVyc2lvbiwgQnVpbGQgYW5kIEJ1aWxkIGRhdGUgdG9rZW5zLiAtLT4KLSAgICAgICAgPGZpbHRlciB0b2tlbj0iU0VSVkVSLlNQTEFTSFNDUkVFTi5MSU5FLTMiIHZhbHVlPSIke3RleHQuY29weXJpZ2h0LjF9Ii8+Ci0gICAgICAgIDxmaWx0ZXIgdG9rZW49IlNFUlZFUi5TUExBU0hTQ1JFRU4uTElORS00IiB2YWx1ZT0iJHt0ZXh0LmNvcHlyaWdodC4yfSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke3NwbGFzaC5kZXN0fSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3NwbGFzaC5zcmN9L3NwbGFzaHNjcmVlbi10ZW1wbGF0ZS1zZXJ2ZXIudHh0IiB0b2ZpbGU9IiR7c3BsYXNoLmRlc3R9L3NwbGFzaHNjcmVlbi1zZXJ2ZXIudHh0IiBvdmVyd3JpdGU9InRydWUiIGZpbHRlcmluZz0idHJ1ZSIvPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImNyZWF0ZVNwbGFzaCI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iY3JlYXRlU3BsYXNoLnNvdXJjZVNjcmVlbkZpbGUiIHZhbHVlPSIke3NwbGFzaC5zcmN9L0Jhc2ljU3BsYXNoU2NyZWVuLmpwZyIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNyZWF0ZVNwbGFzaC5zY3JlZW5UZXh0RmlsZSIgdmFsdWU9IiR7c3BsYXNoLmRlc3R9L3NwbGFzaHNjcmVlbi1zZXJ2ZXIudHh0Ii8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iY3JlYXRlU3BsYXNoLnRhcmdldFNjcmVlbkZpbGUiIHZhbHVlPSIke3NwbGFzaC5kZXN0fS9TZXJ2ZXJTcGxhc2hTY3JlZW4uanBnIi8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLSAgICAgICAgPCEtLSBDb3B5IHRoZSBzcGxhc2ggdG8gdGhlIEFJUyBhbmQgU0FDIGNsYXNzIHBhdGggLS0+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7c3BsYXNoLmRlc3R9L1NlcnZlclNwbGFzaFNjcmVlbi5qcGciIHRvZmlsZT0iJHtidWlsZC5jbGFzc2VzfS9jb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9zZXJ2ZXIvU2VydmVyU2Vzc2lvblNwbGFzaFNjcmVlbi5qcGciIG92ZXJ3cml0ZT0ieWVzIi8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPCEtLSBDcmVhdGUgVG9vbHMgc3BsYXNoc2NyZWVucyAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImNyZWF0ZVNwbGFzaC50b29scy5zcGxhc2hzY3JlZW5zIiBkZXBlbmRzPSJpbml0Ij4KLSAgICAgICAgPGZpbHRlciB0b2tlbj0iVE9PTFMuU1BMQVNIU0NSRUVOLkxJTkUtMSIgdmFsdWU9IiR7dG9vbHMuc3BsYXNoc2NyZWVuLmxpbmUtMX0iLz4KLSAgICAgICAgPCEtLSBMaW5lIDIgaXMgaW4gdGhlIHRlbXBsYXRlIGFuZCB1c2VzIHRoZSBWZXJzaW9uLCBCdWlsZCBhbmQgQnVpbGQgZGF0ZSB0b2tlbnMuIC0tPgotICAgICAgICA8ZmlsdGVyIHRva2VuPSJUT09MUy5TUExBU0hTQ1JFRU4uTElORS0zIiB2YWx1ZT0iJHt0ZXh0LmNvcHlyaWdodC4xfSIvPgotICAgICAgICA8ZmlsdGVyIHRva2VuPSJUT09MUy5TUExBU0hTQ1JFRU4uTElORS00IiB2YWx1ZT0iJHt0ZXh0LmNvcHlyaWdodC4yfSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke3NwbGFzaC5kZXN0fSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3NwbGFzaC5zcmN9L3NwbGFzaHNjcmVlbi10ZW1wbGF0ZS1kZXZlbG9wZXIudHh0IiB0b2ZpbGU9IiR7c3BsYXNoLmRlc3R9L3NwbGFzaHNjcmVlbi1kZXZlbG9wZXIudHh0IiBvdmVyd3JpdGU9InRydWUiIGZpbHRlcmluZz0idHJ1ZSIvPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImNyZWF0ZVNwbGFzaCI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iY3JlYXRlU3BsYXNoLnNvdXJjZVNjcmVlbkZpbGUiIHZhbHVlPSIke3NwbGFzaC5zcmN9L0Jhc2ljU3BsYXNoU2NyZWVuLmpwZyIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNyZWF0ZVNwbGFzaC5zY3JlZW5UZXh0RmlsZSIgdmFsdWU9IiR7c3BsYXNoLmRlc3R9L3NwbGFzaHNjcmVlbi1kZXZlbG9wZXIudHh0Ii8+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iY3JlYXRlU3BsYXNoLnRhcmdldFNjcmVlbkZpbGUiIHZhbHVlPSIke3NwbGFzaC5kZXN0fS9Ub29sU2Vzc2lvblNwbGFzaFNjcmVlbi5qcGciLz4KLSAgICAgICAgPC9hbnRjYWxsPgotICAgICAgICA8IS0tIENvcHkgdGhlIHNwbGFzaCB0byB0aGUgVG9vbHMgY2xhc3MgcGF0aCAtLT4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtzcGxhc2guZGVzdH0vVG9vbFNlc3Npb25TcGxhc2hTY3JlZW4uanBnIiB0b2ZpbGU9IiR7YnVpbGQuY2xhc3Nlc30vY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvdG9vbHMvaW1hZ2VzL1Rvb2xTZXNzaW9uU3BsYXNoU2NyZWVuLmpwZyIgb3ZlcndyaXRlPSJ5ZXMiLz4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICAgPCEtLSBKYXZhZG9jIGZvciBjbGllbnQgQVBJIC0tPgotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImphdmFkb2NfY2hlY2suYWlzLmNsaWVudCI+Ci0gICAgICAgIDx1cHRvZGF0ZSBwcm9wZXJ0eT0iYWlzLmNsaWVudC5qYXZhZG9jLm5vdHJlcXVpcmVkIiB0YXJnZXRmaWxlPSIke2Fpcy5jbGllbnQuZGlzdC5qYXZhZG9jfS9wYWNrYWdlcy5odG1sIj4KLSAgICAgICAgICAgIDxzcmNmaWxlcyBkaXI9IiR7c3JjLmRpcn0iPgotICAgICAgICAgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJhaXMuY2xpZW50LmZpbGVzIi8+Ci0gICAgICAgICAgICA8L3NyY2ZpbGVzPgotICAgICAgICA8L3VwdG9kYXRlPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0iamF2YWRvYy5haXMuY2xpZW50IiBkZXBlbmRzPSJwcmVwYXJlLCBqYXZhZG9jX2NoZWNrLmFpcy5jbGllbnQiIHVubGVzcz0iYWlzLmNsaWVudC5qYXZhZG9jLm5vdHJlcXVpcmVkIj4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7YWlzLmNsaWVudC5kaXN0LmphdmFkb2N9IiBpbmNsdWRlRW1wdHlEaXJzPSJ0cnVlIiBxdWlldD0idHJ1ZSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2Fpcy5jbGllbnQuZGlzdC5qYXZhZG9jfSIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmFzaWMtaGVhZGVyIiB2YWx1ZT0iJHtOYW1lfSYjeDIxMjI7LCBBSVMgQ2xpZW50Ii8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkZXIrdmVyc2lvbiIgdmFsdWU9IiR7YmFzaWMtaGVhZGVyfSwgdiR7dmVyc2lvbn0iLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9Indpbi10aXRsZSIgdmFsdWU9IiR7aGVhZGVyK3ZlcnNpb259IEFQSSBTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkb2MtdGl0bGUiIHZhbHVlPSIke2hlYWRlcit2ZXJzaW9ufSZsdDtici8mZ3Q7QVBJIFNwZWNpZmljYXRpb24iLz4KLSAgICAgICAgPGphdmFkb2MgcGFja2FnZW5hbWVzPSJjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS5jbGllbnQsIGNvbS5zZWFndWxsc3cuYXBwaW50ZXJmYWNlLmNsaWVudC5qYXZhLCBjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS5jbGllbnQuaWJtbXEsIGNvbS5zZWFndWxsc3cuYXBwaW50ZXJmYWNlLmNvbW0uaWJtbXEiIHNvdXJjZXBhdGg9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7YWlzLmNsaWVudC5kaXN0LmphdmFkb2N9IiB3aW5kb3d0aXRsZT0iJHt3aW4tdGl0bGV9IiBkb2N0aXRsZT0iJHtkb2MtdGl0bGV9IiBoZWFkZXI9IiR7YmFzaWMtaGVhZGVyfSIgYm90dG9tPSImbHQ7Zm9udCBzaXplPSZxdW90Oy0xJnF1b3Q7Jmd0OyR7TmFtZX0gaXMgYSB0cmFkZW1hcmsgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFNlYWd1bGwgSG9sZGluZyBOViBpbiB0aGUgVVMgYW5kIG90aGVyIGNvdW50cmllcy4mbHQ7YnIvJmd0O0NvcHlyaWdodCAmIzE2OTsgMTk5MyAtIDIwMDMgU2VhZ3VsbCBCdXNpbmVzcyBTb2Z0d2FyZSBJcmVsYW5kIEx0ZC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4mbHQ7L2ZvbnQmZ3Q7IiBhdXRob3I9ImZhbHNlIiB2ZXJzaW9uPSJ0cnVlIiB1c2U9InRydWUiPgotICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iYWlzLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgICAgICA8IS0tIFRoZSBmb2xsb3dpbmcgZ3JvdXAgZWxlbWVudHMgZG8gbm90IHNlZW0gdG8gd29yay4gLS0+Ci0gICAgICAgICAgICA8Z3JvdXAgdGl0bGU9IkNsaWVudCIgcGFja2FnZXM9ImNvbS5zZWFndWxsc3cuYXBwaW50ZXJmYWNlLmNsaWVudCwgY29tLnNlYWd1bGxzdy5hcHBpbnRlcmZhY2UuY2xpZW50LmphdmEiLz4KLSAgICAgICAgICAgIDxncm91cCB0aXRsZT0iSUJNIE1RIFNlcmllcyBDbGllbnQiIHBhY2thZ2VzPSJjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS5jbGllbnQuaWJtbXEsIGNvbS5zZWFndWxsc3cuYXBwaW50ZXJmYWNlLmNvbW0uaWJtbXEiLz4KLSAgICAgICAgICAgIDxsaW5rIGhyZWY9IiR7amF2YWRvYy5qMnNlLmxpbmt9Ii8+Ci0gICAgICAgIDwvamF2YWRvYz4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9ImphdmFkb2NfY2hlY2suYWlzLmFkbWluY2xpZW50Ij4KLSAgICAgICAgPHVwdG9kYXRlIHByb3BlcnR5PSJhaXMuYWRtaW5jbGllbnQuamF2YWRvYy5ub3RyZXF1aXJlZCIgdGFyZ2V0ZmlsZT0iJHthaXMuYWRtaW5jbGllbnQuZGlzdC5qYXZhZG9jfS9wYWNrYWdlcy5odG1sIj4KLSAgICAgICAgICAgIDxzcmNmaWxlcyBkaXI9IiR7c3JjLmRpcn0iPgotICAgICAgICAgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJhaXMuYWRtaW5jbGllbnQuZmlsZXMiLz4KLSAgICAgICAgICAgIDwvc3JjZmlsZXM+Ci0gICAgICAgIDwvdXB0b2RhdGU+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJqYXZhZG9jLmFpcy5hZG1pbmNsaWVudCIgZGVwZW5kcz0icHJlcGFyZSwgamF2YWRvY19jaGVjay5haXMuYWRtaW5jbGllbnQiIHVubGVzcz0iYWlzLmFkbWluY2xpZW50LmphdmFkb2Mubm90cmVxdWlyZWQiPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHthaXMuYWRtaW5jbGllbnQuZGlzdC5qYXZhZG9jfSIgaW5jbHVkZUVtcHR5RGlycz0idHJ1ZSIgcXVpZXQ9InRydWUiLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHthaXMuYWRtaW5jbGllbnQuZGlzdC5qYXZhZG9jfSIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmFzaWMtaGVhZGVyIiB2YWx1ZT0iJHtOYW1lfSYjeDIxMjI7LCBBSVMgQWRtaW4gQ2xpZW50Ii8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkZXIrdmVyc2lvbiIgdmFsdWU9IiR7YmFzaWMtaGVhZGVyfSwgdiR7dmVyc2lvbn0iLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9Indpbi10aXRsZSIgdmFsdWU9IiR7aGVhZGVyK3ZlcnNpb259IEFQSSBTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkb2MtdGl0bGUiIHZhbHVlPSIke2hlYWRlcit2ZXJzaW9ufSZsdDtici8mZ3Q7QVBJIFNwZWNpZmljYXRpb24iLz4KLSAgICAgICAgPGphdmFkb2MgcGFja2FnZW5hbWVzPSJjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS5zZXJ2ZXIuYWRtaW4iIHNvdXJjZXBhdGg9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7YWlzLmFkbWluY2xpZW50LmRpc3QuamF2YWRvY30iIHdpbmRvd3RpdGxlPSIke3dpbi10aXRsZX0iIGRvY3RpdGxlPSIke2RvYy10aXRsZX0iIGhlYWRlcj0iJHtiYXNpYy1oZWFkZXJ9IiBib3R0b209IiZsdDtmb250IHNpemU9JnF1b3Q7LTEmcXVvdDsmZ3Q7JHtOYW1lfSBpcyBhIHRyYWRlbWFyayBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU2VhZ3VsbCBIb2xkaW5nIE5WIGluIHRoZSBVUyBhbmQgb3RoZXIgY291bnRyaWVzLiZsdDtici8mZ3Q7Q29weXJpZ2h0ICYjMTY5OyAxOTkzIC0gMjAwMyBTZWFndWxsIEJ1c2luZXNzIFNvZnR3YXJlIElyZWxhbmQgTHRkLiBBbGwgUmlnaHRzIFJlc2VydmVkLiZsdDsvZm9udCZndDsiIGF1dGhvcj0iZmFsc2UiIHZlcnNpb249InRydWUiIHVzZT0idHJ1ZSI+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJhaXMuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICAgICAgICAgIDwhLS0gVGhlIGZvbGxvd2luZyBncm91cCBlbGVtZW50cyBkbyBub3Qgc2VlbSB0byB3b3JrLiAtLT4KLSAgICAgICAgICAgIDxncm91cCB0aXRsZT0iQ2xpZW50IiBwYWNrYWdlcz0iY29tLnNlYWd1bGxzdy5hcHBpbnRlcmZhY2Uuc2VydmVyLmFkbWluIi8+Ci0gICAgICAgICAgICA8bGluayBocmVmPSIke2phdmFkb2MuajJzZS5saW5rfSIvPgotICAgICAgICA8L2phdmFkb2M+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gRGlzdHJpYnV0aW9uIHRhcmdldHMgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDx0YXJnZXQgbmFtZT0iZGlzdCIgZGVwZW5kcz0iZGlzdC5haXMuY29yZSwgZGlzdC5haXMuY2xpZW50LCBkaXN0LmFpc1VOSVgsIGRpc3QucHJveHlzZXJ2bGV0LCBkaXN0LnRyYW5zaWRpb21jZW50cmFsLCBkaXN0LmRldnRvb2xzLCBkaXN0LmRvY3MiIGRlc2NyaXB0aW9uPSJDcmVhdGVzIHRoZSBkaXN0cmlidXRpb24gaW4gJHtidWlsZC5kaXN0fSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXMuZGlzdCIgdmFsdWU9IiR7YnVpbGQuZGlzdH0vc2VydmVyIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImFpc1VOSVguZGlzdCIgdmFsdWU9IiR7YnVpbGQuZGlzdH0vc2VydmVyLVVOSVgiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYWlzLmNsaWVudC5kaXN0IiB2YWx1ZT0iJHtidWlsZC5kaXN0fS9jbGllbnQvamF2YSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm94eXNlcnZsZXQuZGlzdCIgdmFsdWU9IiR7YnVpbGQuZGlzdH0vc2VydmVyL3NlcnZsZXQiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iZGV2dG9vbHMuZGlzdCIgdmFsdWU9IiR7YnVpbGQuZGlzdH0vdG9vbHMiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0idHJhbnNpZGlvbWNlbnRyYWwuZGlzdCIgdmFsdWU9IiR7YnVpbGQuZGlzdH0vVHJhbnNpZGlvbUNlbnRyYWwiLz4KLSAgICA8IS0tIGNvcHkgM3JkIHBhcnR5IGphciBmaWxlcyAtIGEgZGlzdCAic3Vicm91dGluZSIuIC0tPgotICAgIDwhLS0gQ29tbW9uIGZpbGVzIHRvIHRoZSBBSVMgYW5kIFRvb2xzPyBHYXJ5RyAyMDAzLTA0LTAzIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iY29weTNyZFBhcnR5SmFycyI+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7eGVyY2VzLmphcn0iIHRvZGlyPSIke2NvcHkzcmRQYXJ0eUphcnMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3htbC1hcGlzLmphcn0iIHRvZGlyPSIke2NvcHkzcmRQYXJ0eUphcnMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3hhbGFuLmphcn0iIHRvZGlyPSIke2NvcHkzcmRQYXJ0eUphcnMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3NvYXAuamFyfSIgdG9kaXI9IiR7Y29weTNyZFBhcnR5SmFycy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7YWN0aXZhdGlvbi5qYXJ9IiB0b2Rpcj0iJHtjb3B5M3JkUGFydHlKYXJzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHttYWlsLmphcn0iIHRvZGlyPSIke2NvcHkzcmRQYXJ0eUphcnMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke2NvbW1vbnMtY29sbGVjdGlvbnMuamFyfSIgdG9kaXI9IiR7Y29weTNyZFBhcnR5SmFycy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7Y29tbW9ucy1sYW5nLmphcn0iIHRvZGlyPSIke2NvcHkzcmRQYXJ0eUphcnMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke2NvbW1vbnMtY29kZWMuamFyfSIgdG9kaXI9IiR7Y29weTNyZFBhcnR5SmFycy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7Y29tbW9ucy1sb2dnaW5nLmphcn0iIHRvZGlyPSIke2NvcHkzcmRQYXJ0eUphcnMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke2NvbW1vbnMtaHR0cGNsaWVudC5qYXJ9IiB0b2Rpcj0iJHtjb3B5M3JkUGFydHlKYXJzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtjb21tb25zLXBvb2wuamFyfSIgdG9kaXI9IiR7Y29weTNyZFBhcnR5SmFycy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7Y29tbW9ucy1jbGkuamFyfSIgdG9kaXI9IiR7Y29weTNyZFBhcnR5SmFycy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7amFrYXJ0YS1vcm8uamFyfSIgdG9kaXI9IiR7Y29weTNyZFBhcnR5SmFycy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7amF4YjEuamFyfSIgdG9kaXI9IiR7Y29weTNyZFBhcnR5SmFycy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7amF4YjIuamFyfSIgdG9kaXI9IiR7Y29weTNyZFBhcnR5SmFycy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7amF4YjMuamFyfSIgdG9kaXI9IiR7Y29weTNyZFBhcnR5SmFycy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7amF4YjQuamFyfSIgdG9kaXI9IiR7Y29weTNyZFBhcnR5SmFycy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7amF4YjUuamFyfSIgdG9kaXI9IiR7Y29weTNyZFBhcnR5SmFycy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7amF4YjYuamFyfSIgdG9kaXI9IiR7Y29weTNyZFBhcnR5SmFycy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7amF4YjcuamFyfSIgdG9kaXI9IiR7Y29weTNyZFBhcnR5SmFycy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7am1zLmphcn0iIHRvZGlyPSIke2NvcHkzcmRQYXJ0eUphcnMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke2NvbmN1cnJlbnQuamFyfSIgdG9kaXI9IiR7Y29weTNyZFBhcnR5SmFycy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7amFhcy5qYXJ9IiB0b2Rpcj0iJHtjb3B5M3JkUGFydHlKYXJzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtpbXNpY28uamFyfSIgdG9kaXI9IiR7Y29weTNyZFBhcnR5SmFycy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7aW1zaWNvLWNvbm5lY3Rvci5qYXJ9IiB0b2Rpcj0iJHtjb3B5M3JkUGFydHlKYXJzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtqdGEuamFyfSIgdG9kaXI9IiR7Y29weTNyZFBhcnR5SmFycy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPCEtLSBKYXZhIENsaWVudCAtLT4KLSAgICA8cHJvcGVydHkgbmFtZT0iYWlzLmNsaWVudC5kaXN0LmphdmFkb2MiIHZhbHVlPSIke2Fpcy5jbGllbnQuZGlzdH0vZG9jcy9hcGkiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYWlzLmNsaWVudC5kaXN0LmxpYiIgdmFsdWU9IiR7YWlzLmNsaWVudC5kaXN0fS9saWIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYWlzLmNsaWVudC5kaXN0Lm1xIiB2YWx1ZT0iJHthaXMuY2xpZW50LmRpc3R9L21xIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImFpcy5hZG1pbmNsaWVudC5kaXN0LmphdmFkb2MiIHZhbHVlPSIke2Fpcy5jbGllbnQuZGlzdH0vYWRtaW4vZG9jcy9hcGkiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYWlzLmFkbWluY2xpZW50LmRpc3Quc2ZkIiB2YWx1ZT0iJHthaXMuY2xpZW50LmRpc3R9L2FkbWluL3NmZCIvPgotICAgIDwhLS0gZGlzdC5haXMuY2xpZW50IC0tPgotICAgIDx0YXJnZXQgbmFtZT0iZGlzdC5haXMuY2xpZW50IiBkZXBlbmRzPSJqYXIuYWlzLmNsaWVudCwgamFyLmFpcy5hZG1pbmNsaWVudCwgamF2YWRvYy5haXMuY2xpZW50LCBqYXZhZG9jLmFpcy5hZG1pbmNsaWVudCI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YWlzLmNsaWVudC5kaXN0fSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2Fpcy5jbGllbnQuZGlzdC5qYXZhZG9jfSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2Fpcy5jbGllbnQuZGlzdC5saWJ9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YWlzLmNsaWVudC5kaXN0Lm1xfSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2Fpcy5hZG1pbmNsaWVudC5kaXN0LmphdmFkb2N9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YWlzLmFkbWluY2xpZW50LmRpc3Quc2ZkfSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy5jbGllbnQuamFyfSIgdG9kaXI9IiR7YWlzLmNsaWVudC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7YWlzLWFkbWluY2xpZW50Lmphcn0iIHRvZGlyPSIke2Fpcy5jbGllbnQuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3hlcmNlcy5qYXJ9IiB0b2Rpcj0iJHthaXMuY2xpZW50LmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHt4bWwtYXBpcy5qYXJ9IiB0b2Rpcj0iJHthaXMuY2xpZW50LmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtjb21tb25zLWxhbmcuamFyfSIgdG9kaXI9IiR7YWlzLmNsaWVudC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7amF4YjEuamFyfSIgdG9kaXI9IiR7YWlzLmNsaWVudC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7amF4YjIuamFyfSIgdG9kaXI9IiR7YWlzLmNsaWVudC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7amF4YjMuamFyfSIgdG9kaXI9IiR7YWlzLmNsaWVudC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7amF4YjQuamFyfSIgdG9kaXI9IiR7YWlzLmNsaWVudC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7amF4YjUuamFyfSIgdG9kaXI9IiR7YWlzLmNsaWVudC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7amF4YjYuamFyfSIgdG9kaXI9IiR7YWlzLmNsaWVudC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7amF4YjcuamFyfSIgdG9kaXI9IiR7YWlzLmNsaWVudC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXJ9L21xL01RQ2xpZW50Q29ubmVjdGlvbi5wcm9wZXJ0aWVzIiB0b2Rpcj0iJHthaXMuY2xpZW50LmRpc3QubXF9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSB0b2Rpcj0iJHthaXMuYWRtaW5jbGllbnQuZGlzdC5zZmR9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLnJvb3QuZGlyfS9TZXJ2ZXJBZG1pbkZ1bmN0aW9ucy9JbnRlcmZhY2VTY2hlbWFzIi8+Ci0gICAgICAgIDwvY29weT4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tIEFJUyAtLT4KLSAgICA8cHJvcGVydHkgbmFtZT0iYWlzLmRpc3QuY29uZmlnIiB2YWx1ZT0iJHthaXMuZGlzdH0vY29uZmlnIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImFpcy5kaXN0LmNvbmZpZy5jb3B5IiB2YWx1ZT0iJHthaXMuZGlzdH0vY29uZmlnLWRlZmF1bHQiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYWlzLmRpc3QubG9nIiB2YWx1ZT0iJHthaXMuZGlzdC5jb25maWd9L2xvZyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXMuZGlzdC50cmFuc2Zvcm0iIHZhbHVlPSIke2Fpcy5kaXN0LmNvbmZpZ30vdHJhbnNmb3JtIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImFpcy5kaXN0LmxpYiIgdmFsdWU9IiR7YWlzLmRpc3R9L2xpYiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXMuZGlzdC5saWIuZXh0IiB2YWx1ZT0iJHthaXMuZGlzdC5saWJ9LyR7ZXh0ZW5zaW9uLmRpci5uYW1lfSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXMuZGlzdC5tcSIgdmFsdWU9IiR7YWlzLmRpc3R9L21xIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImFpcy5kaXN0LnN5cyIgdmFsdWU9IiR7YWlzLmRpc3R9L3N5c3RlbSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXMuZGlzdC5zeXNkZWYiIHZhbHVlPSIke2Fpcy5kaXN0LnN5c30vZGVmYXVsdHMiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0icm9vdC5zZXJ2ZXJTZXR0aW5ncyIgdmFsdWU9IiR7cm9vdC5kaXJ9L0FsdGVybmF0aXZlU2VydmVyU2V0dGluZ3MiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0icm9vdC50b29sU2V0dGluZ3MiIHZhbHVlPSIke3Jvb3QuZGlyfS9BbHRlcm5hdGl2ZVRvb2xTZXR0aW5ncyIvPgotICAgIDwhLS0gZGlzdC5haXMuY29yZSAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImRpc3QuYWlzLmNvcmUiIGRlcGVuZHM9ImluaXQsIGphci5haXMtY29yZSwgamFyLmFpcy10b29scywgamFyLmFpcy01MjUwLCBqYXIuYWlzLTMyNzAsIGphci5haXMtY29ib2wsIGphci5haXMtY2ljcywgamFyLmFpcy1pbXMsIGphci5oc2MsIGphci5hZG1pbmNvbnNvbGUsIGphdmFkb2Mub3BlbmJhY2tlbmQiPgotICAgICAgICA8bWtkaXIgZGlyPSIke2Fpcy5kaXN0fSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2Fpcy5kaXN0LmxpYn0iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHthaXMuZGlzdC5saWIuZXh0fSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2Fpcy5kaXN0LnN5c30iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHthaXMuZGlzdC5tcX0iLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHthaXMtY29yZS5qYXJ9IiB0b2Rpcj0iJHthaXMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy01MjUwLmphcn0iIHRvZGlyPSIke2Fpcy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7YWlzLTMyNzAuamFyfSIgdG9kaXI9IiR7YWlzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHthaXMtY29ib2wuamFyfSIgdG9kaXI9IiR7YWlzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHthaXMtY2ljcy5qYXJ9IiB0b2Rpcj0iJHthaXMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy1pbXMuamFyfSIgdG9kaXI9IiR7YWlzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtoc2MuamFyfSIgdG9kaXI9IiR7YWlzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHthZG1pbmNvbnNvbGUuamFyfSIgdG9kaXI9IiR7YWlzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGFudGNhbGwgdGFyZ2V0PSJjb3B5M3JkUGFydHlKYXJzIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJjb3B5M3JkUGFydHlKYXJzLmRpc3QubGliIiB2YWx1ZT0iJHthaXMuZGlzdC5saWJ9Ii8+Ci0gICAgICAgIDwvYW50Y2FsbD4KLSAgICAgICAgPCEtLSBGb3IgU0NUIC0tPgotICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy10b29scy5qYXJ9IiB0b2Rpcj0iJHthaXMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyfS9Ub29sVXNlclNldHRpbmdzLmNmZyIgdG9kaXI9IiR7YWlzLmRpc3R9IiBmaWx0ZXJpbmc9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpcn0vc3RhcnQtYWlzLmJhdCIgdG9kaXI9IiR7YWlzLmRpc3R9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyfS9zdGFydC1haXMtbXEuYmF0IiB0b2Rpcj0iJHthaXMuZGlzdH0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXJ9L3N0b3AtYWlzLmJhdCIgdG9kaXI9IiR7YWlzLmRpc3R9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyLnNlcnZlcn0vU2VydmVyU2V0dGluZ3MuY2ZnIiB0b2Rpcj0iJHthaXMuZGlzdH0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXJ9L1NlcnZlckJhY2tFbmRTZXR0aW5ncy5jZmciIHRvZGlyPSIke2Fpcy5kaXN0fSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LnNlcnZlclNldHRpbmdzfS9TZXJ2ZXJEZWJ1Z1NldHRpbmdzLmNmZyIgdG9kaXI9IiR7YWlzLmRpc3Quc3lzfSIgZmlsdGVyaW5nPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5zZXJ2ZXJTZXR0aW5nc30vU2VydmVyRGV2ZWxvcGVyU2V0dGluZ3MuY2ZnIiB0b2Rpcj0iJHthaXMuZGlzdC5zeXN9IiBmaWx0ZXJpbmc9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LnNlcnZlclNldHRpbmdzfS9TZXJ2ZXJJbnN0YWxsYXRpb25TZXR0aW5ncy5jZmciIHRvZGlyPSIke2Fpcy5kaXN0LnN5c30iIGZpbHRlcmluZz0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyLnN5c30vVG9vbERlYnVnU2V0dGluZ3MuY2ZnIiB0b2Rpcj0iJHthaXMuZGlzdC5zeXN9IiBmaWx0ZXJpbmc9InRydWUiLz4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7YWlzLmRpc3Quc3lzfS9BZG1pbkZ1bmN0aW9uRGVmaW5pdGlvbnMiIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMucm9vdC5kaXJ9L1NlcnZlckFkbWluRnVuY3Rpb25zL01hcHBpbmdTY2hlbWFzIi8+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7YWlzLmRpc3QudHJhbnNmb3JtfSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3Jvb3QuZGlyLnNlcnZlci10cmFuc2Zvcm19Ii8+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7YWlzLmRpc3QuY29uZmlnfS9jb21tIiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7cm9vdC5kaXIuc2VydmVyLWNvbmZpZ30vY29tbSIvPgotICAgICAgICA8L2NvcHk+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSIke2Fpcy5kaXN0LmNvbmZpZy5jb3B5fSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Fpcy5kaXN0LmNvbmZpZ30iLz4KLSAgICAgICAgPC9jb3B5PgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyLnNlcnZlci1sb2d9L2xvZy1jYXRlZ29yeS5wcm9wZXJ0aWVzIiB0b2Rpcj0iJHthaXMuZGlzdC5sb2d9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyLnNlcnZlci1sb2d9L2xvZy1zdHlsZS5wcm9wZXJ0aWVzIiB0b2Rpcj0iJHthaXMuZGlzdC5sb2d9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8IS0tIFRvb2xzIGZpbGVzIC0tPgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QudG9vbFNldHRpbmdzfS9Ub29sSW5zdGFsbGF0aW9uU2V0dGluZ3MtQWxsLmNmZyIgdG9maWxlPSIke2Fpcy5kaXN0LnN5c30vVG9vbEluc3RhbGxhdGlvblNldHRpbmdzLmNmZyIgZmlsdGVyaW5nPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC50b29sU2V0dGluZ3N9L1NDVFRvb2xJbnN0YWxsYXRpb25TZXR0aW5ncy1IQy5jZmciIHRvZGlyPSIke2Fpcy5kaXN0LnN5c30iIGZpbHRlcmluZz0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QudG9vbFNldHRpbmdzfS9TQ1RUb29sSW5zdGFsbGF0aW9uU2V0dGluZ3MtSEMzMjcwT25seS5jZmciIHRvZGlyPSIke2Fpcy5kaXN0LnN5c30iIGZpbHRlcmluZz0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QudG9vbFNldHRpbmdzfS9TQ1RUb29sSW5zdGFsbGF0aW9uU2V0dGluZ3MtSEM1MjUwT25seS5jZmciIHRvZGlyPSIke2Fpcy5kaXN0LnN5c30iIGZpbHRlcmluZz0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QudG9vbFNldHRpbmdzfS9TQ1RUb29sSW5zdGFsbGF0aW9uU2V0dGluZ3MtQ0lDU09ubHkuY2ZnIiB0b2Rpcj0iJHthaXMuZGlzdC5zeXN9IiBmaWx0ZXJpbmc9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpci5zeXNkZWZ9L0FwcEludGVyZmFjZVRlc3Rlci1EZWZhdWx0U2V0dGluZ3MuY2ZnIiB0b2Rpcj0iJHthaXMuZGlzdC5zeXNkZWZ9IiBmaWx0ZXJpbmc9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpci5zeXNkZWZ9L0NsaWVudENvbnRyb2xsZWQzMjcwU2VydmVyU2V0dGluZ3MtRGVmYXVsdFNldHRpbmdzLmNmZyIgdG9kaXI9IiR7YWlzLmRpc3Quc3lzZGVmfSIgZmlsdGVyaW5nPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXIuc3lzZGVmfS9DbGllbnRDb250cm9sbGVkNTI1MFNlcnZlclNldHRpbmdzLURlZmF1bHRTZXR0aW5ncy5jZmciIHRvZGlyPSIke2Fpcy5kaXN0LnN5c2RlZn0iIGZpbHRlcmluZz0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyLnN5c2RlZn0vRGVmaW5pdGlvblRvb2wtRGVmYXVsdFNldHRpbmdzLmNmZyIgdG9kaXI9IiR7YWlzLmRpc3Quc3lzZGVmfSIgZmlsdGVyaW5nPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXIuc3lzZGVmfS9TRUFHVUxMUHJvamVjdC5kaXIiIHRvZGlyPSIke2Fpcy5kaXN0LnN5c2RlZn0iLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpci5zeXNkZWZ9L1NlcnZlckNvbnRyb2xsZWQzMjcwU2VydmVyU2V0dGluZ3MtRGVmYXVsdFNldHRpbmdzLmNmZyIgdG9kaXI9IiR7YWlzLmRpc3Quc3lzZGVmfSIgZmlsdGVyaW5nPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXIuc3lzZGVmfS9TZXJ2ZXJDb250cm9sbGVkNTI1MFNlcnZlclNldHRpbmdzLURlZmF1bHRTZXR0aW5ncy5jZmciIHRvZGlyPSIke2Fpcy5kaXN0LnN5c2RlZn0iIGZpbHRlcmluZz0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyLnN5c2RlZn0vU2VydmVyT3B0aW9ucy1EZWZhdWx0U2V0dGluZ3MuY2ZnIiB0b2Rpcj0iJHthaXMuZGlzdC5zeXNkZWZ9IiBmaWx0ZXJpbmc9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpci5zeXNkZWZ9L1NlcnZlclNldHRpbmdzLVNrZWxldG9uLmNmZyIgdG9kaXI9IiR7YWlzLmRpc3Quc3lzZGVmfSIgZmlsdGVyaW5nPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXIuc3lzZGVmfS9Xb3JraW5nU2V0U2V0dGluZ3MuY2ZnIiB0b2Rpcj0iJHthaXMuZGlzdC5zeXNkZWZ9IiBmaWx0ZXJpbmc9InRydWUiLz4KLSAgICAgICAgPCEtLSBKYXZhIENvbm5lY3RvcnMgLS0+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YWlzLmRpc3R9L0phdmFDb25uZWN0b3JzL0NsYXNzZXMiLz4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tIEFJUyBVTklYLXNwZWNpZmljIC0tPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXNVTklYLmRpc3QuY29uZmlnIiB2YWx1ZT0iJHthaXNVTklYLmRpc3R9L2NvbmZpZyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXNVTklYLmRpc3QubG9nIiB2YWx1ZT0iJHthaXNVTklYLmRpc3QuY29uZmlnfS9sb2ciLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYWlzVU5JWC5kaXN0LmxpYiIgdmFsdWU9IiR7YWlzVU5JWC5kaXN0fS9saWIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYWlzVU5JWC5kaXN0Lm1xIiB2YWx1ZT0iJHthaXNVTklYLmRpc3R9L21xIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImFpc1VOSVguZGlzdC5zeXMiIHZhbHVlPSIke2Fpc1VOSVguZGlzdH0vc3lzdGVtIi8+Ci0gICAgPHRhcmdldCBuYW1lPSJkaXN0LmFpc1VOSVgiIGRlcGVuZHM9ImluaXQsIGRpc3QuYWlzLmNvcmUsIGphci5hZG1pbmNvbnNvbGUiPgotICAgICAgICA8bWtkaXIgZGlyPSIke2Fpc1VOSVguZGlzdH0iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHthaXNVTklYLmRpc3QubGlifSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2Fpc1VOSVguZGlzdC5zeXN9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7YWlzVU5JWC5kaXN0Lm1xfSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy1jb3JlLmphcn0iIHRvZGlyPSIke2Fpc1VOSVguZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy01MjUwLmphcn0iIHRvZGlyPSIke2Fpc1VOSVguZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy0zMjcwLmphcn0iIHRvZGlyPSIke2Fpc1VOSVguZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy1jb2JvbC5qYXJ9IiB0b2Rpcj0iJHthaXNVTklYLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHthaXMtY2ljcy5qYXJ9IiB0b2Rpcj0iJHthaXNVTklYLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHthaXMtaW1zLmphcn0iIHRvZGlyPSIke2Fpc1VOSVguZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke2FkbWluY29uc29sZS5qYXJ9IiB0b2Rpcj0iJHthaXNVTklYLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtoc2MuamFyfSIgdG9kaXI9IiR7YWlzVU5JWC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxhbnRjYWxsIHRhcmdldD0iY29weTNyZFBhcnR5SmFycyI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0iY29weTNyZFBhcnR5SmFycy5kaXN0LmxpYiIgdmFsdWU9IiR7YWlzVU5JWC5kaXN0LmxpYn0iLz4KLSAgICAgICAgPC9hbnRjYWxsPgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyfS9VTklYU2VydmVyRmlsZXMvc3RhcnQtYWlzLnNoIiB0b2Rpcj0iJHthaXNVTklYLmRpc3R9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyfS9VTklYU2VydmVyRmlsZXMvc3RhcnQtYWlzLW1xLnNoIiB0b2Rpcj0iJHthaXNVTklYLmRpc3R9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyfS9VTklYU2VydmVyRmlsZXMvc3RvcC1haXMuc2giIHRvZGlyPSIke2Fpc1VOSVguZGlzdH0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXIuc2VydmVyfS9TZXJ2ZXJTZXR0aW5ncy5jZmciIHRvZGlyPSIke2Fpc1VOSVguZGlzdH0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXJ9L1NlcnZlckJhY2tFbmRTZXR0aW5ncy5jZmciIHRvZGlyPSIke2Fpc1VOSVguZGlzdH0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5zZXJ2ZXJTZXR0aW5nc30vU2VydmVyRGVidWdTZXR0aW5ncy5jZmciIHRvZGlyPSIke2Fpc1VOSVguZGlzdC5zeXN9IiBmaWx0ZXJpbmc9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpcn0vVU5JWFNlcnZlckZpbGVzL1NlcnZlckluc3RhbGxhdGlvblNldHRpbmdzLmNmZyIgdG9kaXI9IiR7YWlzVU5JWC5kaXN0LnN5c30iIGZpbHRlcmluZz0idHJ1ZSIvPgotICAgICAgICA8Y29weSB0b2Rpcj0iJHthaXNVTklYLmRpc3Quc3lzfS9BZG1pbkZ1bmN0aW9uRGVmaW5pdGlvbnMiIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMucm9vdC5kaXJ9L1NlcnZlckFkbWluRnVuY3Rpb25zL01hcHBpbmdTY2hlbWFzIi8+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7YWlzVU5JWC5kaXN0fS9jb25maWcvdHJhbnNmb3JtIiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7cm9vdC5kaXJ9L3NlcnZlci9jb25maWcvdHJhbnNmb3JtIi8+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpci5zZXJ2ZXItbG9nfS9sb2ctY2F0ZWdvcnkucHJvcGVydGllcyIgdG9kaXI9IiR7YWlzVU5JWC5kaXN0LmxvZ30iLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpci5zZXJ2ZXItbG9nfS9sb2ctc3R5bGUucHJvcGVydGllcyIgdG9kaXI9IiR7YWlzVU5JWC5kaXN0LmxvZ30iLz4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tIFByb3h5IFNlcnZsZXQgLS0+Ci0gICAgPHByb3BlcnR5IG5hbWU9InByb3h5c2VydmxldC5kaXN0LmxpYiIgdmFsdWU9IiR7cHJveHlzZXJ2bGV0LmRpc3R9L2xpYiIvPgotICAgIDx0YXJnZXQgbmFtZT0iZGlzdC5wcm94eXNlcnZsZXQiIGRlcGVuZHM9Imphci5wcm94eXNlcnZsZXQsIGphci5haXMuY2xpZW50Ij4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtwcm94eXNlcnZsZXQuamFyfSIgdG9kaXI9IiR7cHJveHlzZXJ2bGV0LmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHthaXMuY2xpZW50Lmphcn0iIHRvZGlyPSIke3Byb3h5c2VydmxldC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7eGVyY2VzLmphcn0iIHRvZGlyPSIke3Byb3h5c2VydmxldC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7eG1sLWFwaXMuamFyfSIgdG9kaXI9IiR7cHJveHlzZXJ2bGV0LmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpcn0vU2VydmxldENvbmZpZ0ZpbGVzL0FJU1Byb3h5U2VydmxldFJlYWRtZS50eHQiIHRvZGlyPSIke3Byb3h5c2VydmxldC5kaXN0fSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpcn0vU2VydmxldENvbmZpZ0ZpbGVzL3dlYi54bWwiIHRvZGlyPSIke3Byb3h5c2VydmxldC5kaXN0fSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtkb2MuZGlyfS9UcmFuc2lkaW9tIEhUVFBTIFN1cHBvcnQuZG9jIiB0b2Rpcj0iJHtwcm94eXNlcnZsZXQuZGlzdH0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7ZG9jLmRpcn0vVHJhbnNpZGlvbSBIVFRQIFJlcXVlc3RzIFJlZGlyZWN0aW9uIG9uIElJUy5kb2MiIHRvZGlyPSIke3Byb3h5c2VydmxldC5kaXN0fSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tIERldlRvb2xzIC0tPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXZ0b29scy5kaXN0LmNvbmZpZyIgdmFsdWU9IiR7ZGV2dG9vbHMuZGlzdH0vY29uZmlnIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImRldnRvb2xzLmRpc3QubG9nIiB2YWx1ZT0iJHtkZXZ0b29scy5kaXN0LmNvbmZpZ30vbG9nIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImRldnRvb2xzLmRpc3QubGliIiB2YWx1ZT0iJHtkZXZ0b29scy5kaXN0fS9saWIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iZGV2dG9vbHMuZGlzdC5zeXMiIHZhbHVlPSIke2RldnRvb2xzLmRpc3R9L3N5c3RlbSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXZ0b29scy5kaXN0LnN5c2RlZiIgdmFsdWU9IiR7ZGV2dG9vbHMuZGlzdC5zeXN9L2RlZmF1bHRzIi8+Ci0gICAgPHRhcmdldCBuYW1lPSJkaXN0LmRldnRvb2xzIiBkZXBlbmRzPSJpbml0LCBqYXIuYWlzLWNvcmUsIGphci5haXMtdG9vbHMiPgotICAgICAgICA8bWtkaXIgZGlyPSIke2RldnRvb2xzLmRpc3R9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7ZGV2dG9vbHMuZGlzdC5saWJ9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7ZGV2dG9vbHMuZGlzdC5zeXN9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7ZGV2dG9vbHMuZGlzdC5zeXNkZWZ9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7ZGV2dG9vbHMuZGlzdC5sb2d9Ii8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7YWlzLXRvb2xzLmphcn0iIHRvZGlyPSIke2RldnRvb2xzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHthaXMtY29yZS5qYXJ9IiB0b2Rpcj0iJHtkZXZ0b29scy5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7YWlzLTUyNTAuamFyfSIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy0zMjcwLmphcn0iIHRvZGlyPSIke2RldnRvb2xzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHthaXMtY29ib2wuamFyfSIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy1jaWNzLmphcn0iIHRvZGlyPSIke2RldnRvb2xzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHthaXMtaW1zLmphcn0iIHRvZGlyPSIke2RldnRvb2xzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHthaXMuY2xpZW50Lmphcn0iIHRvZGlyPSIke2RldnRvb2xzLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHthaXMtYWRtaW5jbGllbnQuamFyfSIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImNvcHkzcmRQYXJ0eUphcnMiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9ImNvcHkzcmRQYXJ0eUphcnMuZGlzdC5saWIiIHZhbHVlPSIke2RldnRvb2xzLmRpc3QubGlifSIvPgotICAgICAgICA8L2FudGNhbGw+Ci0gICAgICAgIDwhLS0gUm9vdCAtLT4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpcn0vRGlyZWN0IFB1Ymxpc2guYmF0IiB0b2Rpcj0iJHtkZXZ0b29scy5kaXN0fSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyfS9EaXJlY3RQdWJsaXNoLmFyZ3MiIHRvZGlyPSIke2RldnRvb2xzLmRpc3R9Ii8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXJ9L0ludGVyZmFjZSBEZWZpbml0aW9uIFRvb2wuYmF0IiB0b2Rpcj0iJHtkZXZ0b29scy5kaXN0fSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyfS9DSUNTIENvbm5lY3RvciBCdWlsZGVyLmJhdCIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdH0iLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpcn0vSU1TIENvbm5lY3RvciBCdWlsZGVyLmJhdCIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdH0iLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpcn0vSW50ZXJmYWNlIEZ1bmN0aW9uIFRlc3Rlci5iYXQiIHRvZGlyPSIke2RldnRvb2xzLmRpc3R9Ii8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXJ9L1Rvb2xVc2VyU2V0dGluZ3MuY2ZnIiB0b2Rpcj0iJHtkZXZ0b29scy5kaXN0fSIgZmlsdGVyaW5nPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7YmluYXJ5LnJvb3QuZGlyfS9KYXZhL1dpbjMyL0Jpbi9XaW4zMlJlZ2lzdHJ5SW50ZXJmYWNlLmRsbCIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdH0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDwhLS0gc3lzdGVtIChmaWxlcyBhcmUgaW4gYWxwaGEgb3JkZXIgaGVyZSkgLS0+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC50b29sU2V0dGluZ3N9L0RGUFRvb2xJbnN0YWxsYXRpb25TZXR0aW5ncy1IQy5jZmciIHRvZmlsZT0iJHtkZXZ0b29scy5kaXN0LnN5c30vREZQVG9vbEluc3RhbGxhdGlvblNldHRpbmdzLmNmZyIgZmlsdGVyaW5nPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC50b29sU2V0dGluZ3N9L1NDVFRvb2xJbnN0YWxsYXRpb25TZXR0aW5ncy1IQy5jZmciIHRvZGlyPSIke2RldnRvb2xzLmRpc3Quc3lzfSIgZmlsdGVyaW5nPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC50b29sU2V0dGluZ3N9L1NDVFRvb2xJbnN0YWxsYXRpb25TZXR0aW5ncy1IQzMyNzBPbmx5LmNmZyIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdC5zeXN9IiBmaWx0ZXJpbmc9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LnRvb2xTZXR0aW5nc30vU0NUVG9vbEluc3RhbGxhdGlvblNldHRpbmdzLUhDNTI1ME9ubHkuY2ZnIiB0b2Rpcj0iJHtkZXZ0b29scy5kaXN0LnN5c30iIGZpbHRlcmluZz0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QudG9vbFNldHRpbmdzfS9TQ1RUb29sSW5zdGFsbGF0aW9uU2V0dGluZ3MtQ0lDU09ubHkuY2ZnIiB0b2Rpcj0iJHtkZXZ0b29scy5kaXN0LnN5c30iIGZpbHRlcmluZz0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyLnN5c30vVG9vbERlYnVnU2V0dGluZ3MuY2ZnIiB0b2Rpcj0iJHtkZXZ0b29scy5kaXN0LnN5c30iIGZpbHRlcmluZz0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QudG9vbFNldHRpbmdzfS9Ub29sSW5zdGFsbGF0aW9uU2V0dGluZ3MtQWxsLmNmZyIgdG9maWxlPSIke2RldnRvb2xzLmRpc3Quc3lzfS9Ub29sSW5zdGFsbGF0aW9uU2V0dGluZ3MuY2ZnIiBmaWx0ZXJpbmc9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LnRvb2xTZXR0aW5nc30vVG9vbEluc3RhbGxhdGlvblNldHRpbmdzLURlZlRvb2xIQy5jZmciIHRvZGlyPSIke2RldnRvb2xzLmRpc3Quc3lzfSIgZmlsdGVyaW5nPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC50b29sU2V0dGluZ3N9L1Rvb2xJbnN0YWxsYXRpb25TZXR0aW5ncy1EZWZUb29sSEMzMjcwT25seS5jZmciIHRvZGlyPSIke2RldnRvb2xzLmRpc3Quc3lzfSIgZmlsdGVyaW5nPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC50b29sU2V0dGluZ3N9L1Rvb2xJbnN0YWxsYXRpb25TZXR0aW5ncy1EZWZUb29sSEM1MjUwT25seS5jZmciIHRvZGlyPSIke2RldnRvb2xzLmRpc3Quc3lzfSIgZmlsdGVyaW5nPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC50b29sU2V0dGluZ3N9L1Rvb2xJbnN0YWxsYXRpb25TZXR0aW5ncy1EZWZUb29sQ0lDU09ubHkuY2ZnIiB0b2Rpcj0iJHtkZXZ0b29scy5kaXN0LnN5c30iIGZpbHRlcmluZz0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QudG9vbFNldHRpbmdzfS9Ub29sSW5zdGFsbGF0aW9uU2V0dGluZ3MtRGVmVG9vbElNU09ubHkuY2ZnIiB0b2Rpcj0iJHtkZXZ0b29scy5kaXN0LnN5c30iIGZpbHRlcmluZz0idHJ1ZSIvPgotICAgICAgICA8IS0tIHN5c3RlbSBkZWZhdWx0cyAtLT4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpci5zeXNkZWZ9L0FwcEludGVyZmFjZVRlc3Rlci1EZWZhdWx0U2V0dGluZ3MuY2ZnIiB0b2Rpcj0iJHtkZXZ0b29scy5kaXN0LnN5c2RlZn0iIGZpbHRlcmluZz0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyLnN5c2RlZn0vQ2xpZW50Q29udHJvbGxlZDMyNzBTZXJ2ZXJTZXR0aW5ncy1EZWZhdWx0U2V0dGluZ3MuY2ZnIiB0b2Rpcj0iJHtkZXZ0b29scy5kaXN0LnN5c2RlZn0iIGZpbHRlcmluZz0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyLnN5c2RlZn0vQ2xpZW50Q29udHJvbGxlZDUyNTBTZXJ2ZXJTZXR0aW5ncy1EZWZhdWx0U2V0dGluZ3MuY2ZnIiB0b2Rpcj0iJHtkZXZ0b29scy5kaXN0LnN5c2RlZn0iIGZpbHRlcmluZz0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyLnN5c2RlZn0vRGVmaW5pdGlvblRvb2wtRGVmYXVsdFNldHRpbmdzLmNmZyIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdC5zeXNkZWZ9IiBmaWx0ZXJpbmc9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpci5zeXNkZWZ9L1NFQUdVTExQcm9qZWN0LmRpciIgdG9kaXI9IiR7ZGV2dG9vbHMuZGlzdC5zeXNkZWZ9Ii8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXIuc3lzZGVmfS9TZXJ2ZXJDb250cm9sbGVkMzI3MFNlcnZlclNldHRpbmdzLURlZmF1bHRTZXR0aW5ncy5jZmciIHRvZGlyPSIke2RldnRvb2xzLmRpc3Quc3lzZGVmfSIgZmlsdGVyaW5nPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXIuc3lzZGVmfS9TZXJ2ZXJDb250cm9sbGVkNTI1MFNlcnZlclNldHRpbmdzLURlZmF1bHRTZXR0aW5ncy5jZmciIHRvZGlyPSIke2RldnRvb2xzLmRpc3Quc3lzZGVmfSIgZmlsdGVyaW5nPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXIuc3lzZGVmfS9TZXJ2ZXJPcHRpb25zLURlZmF1bHRTZXR0aW5ncy5jZmciIHRvZGlyPSIke2RldnRvb2xzLmRpc3Quc3lzZGVmfSIgZmlsdGVyaW5nPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXIuc3lzZGVmfS9TZXJ2ZXJTZXR0aW5ncy1Ta2VsZXRvbi5jZmciIHRvZGlyPSIke2RldnRvb2xzLmRpc3Quc3lzZGVmfSIgZmlsdGVyaW5nPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7cm9vdC5kaXIuc3lzZGVmfS9Xb3JraW5nU2V0U2V0dGluZ3MuY2ZnIiB0b2Rpcj0iJHtkZXZ0b29scy5kaXN0LnN5c2RlZn0iIGZpbHRlcmluZz0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3Jvb3QuZGlyLnRvb2xzLWxvZ30vbG9nLWNhdGVnb3J5LnByb3BlcnRpZXMiIHRvZGlyPSIke2RldnRvb2xzLmRpc3QubG9nfSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtyb290LmRpci50b29scy1sb2d9L2xvZy1zdHlsZS5wcm9wZXJ0aWVzIiB0b2Rpcj0iJHtkZXZ0b29scy5kaXN0LmxvZ30iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPCEtLSBBSVMgQ2VudHJhbCAtLT4KLSAgICA8cHJvcGVydHkgbmFtZT0idHJhbnNpZGlvbWNlbnRyYWwuZGlzdC5saWIiIHZhbHVlPSIke3RyYW5zaWRpb21jZW50cmFsLmRpc3R9L2xpYiIvPgotICAgIDx0YXJnZXQgbmFtZT0iZGlzdC50cmFuc2lkaW9tY2VudHJhbCIgZGVwZW5kcz0iaW5pdCwgamFyLmFpcy1jb3JlLCBqYXIuYWlzLXRvb2xzLCBqYXIuamF2YWNvbm5lY3RvcmdlbmVyYXRvciwgamFyLnNlY3VyaXR5dG9vbGtpdCI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7dHJhbnNpZGlvbWNlbnRyYWwuZGlzdH0iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHt0cmFuc2lkaW9tY2VudHJhbC5kaXN0LmxpYn0iLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHthaXMtY29yZS5qYXJ9IiB0b2Rpcj0iJHt0cmFuc2lkaW9tY2VudHJhbC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7YWlzLTUyNTAuamFyfSIgdG9kaXI9IiR7dHJhbnNpZGlvbWNlbnRyYWwuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy0zMjcwLmphcn0iIHRvZGlyPSIke3RyYW5zaWRpb21jZW50cmFsLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHthaXMtY29ib2wuamFyfSIgdG9kaXI9IiR7dHJhbnNpZGlvbWNlbnRyYWwuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy1jaWNzLmphcn0iIHRvZGlyPSIke3RyYW5zaWRpb21jZW50cmFsLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHthaXMtaW1zLmphcn0iIHRvZGlyPSIke3RyYW5zaWRpb21jZW50cmFsLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHthaXMtdG9vbHMuamFyfSIgdG9kaXI9IiR7dHJhbnNpZGlvbWNlbnRyYWwuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke2Fpcy5jbGllbnQuamFyfSIgdG9kaXI9IiR7dHJhbnNpZGlvbWNlbnRyYWwuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3NlY3VyaXR5dG9vbGtpdC5qYXJ9IiB0b2Rpcj0iJHt0cmFuc2lkaW9tY2VudHJhbC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7amF2YWNvbm5lY3RvcmdlbmVyYXRvci5qYXJ9IiB0b2Rpcj0iJHt0cmFuc2lkaW9tY2VudHJhbC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7Y29tbW9ucy1jb2RlYy5qYXJ9IiB0b2Rpcj0iJHt0cmFuc2lkaW9tY2VudHJhbC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7Y29tbW9ucy1sYW5nLmphcn0iIHRvZGlyPSIke3RyYW5zaWRpb21jZW50cmFsLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHt4ZXJjZXMuamFyfSIgdG9kaXI9IiR7dHJhbnNpZGlvbWNlbnRyYWwuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke3hhbGFuLmphcn0iIHRvZGlyPSIke3RyYW5zaWRpb21jZW50cmFsLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHt4bWwtYXBpcy5qYXJ9IiB0b2Rpcj0iJHt0cmFuc2lkaW9tY2VudHJhbC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7amF4YjEuamFyfSIgdG9kaXI9IiR7dHJhbnNpZGlvbWNlbnRyYWwuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke2pheGIyLmphcn0iIHRvZGlyPSIke3RyYW5zaWRpb21jZW50cmFsLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtqYXhiMy5qYXJ9IiB0b2Rpcj0iJHt0cmFuc2lkaW9tY2VudHJhbC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7amF4YjQuamFyfSIgdG9kaXI9IiR7dHJhbnNpZGlvbWNlbnRyYWwuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke2pheGI1Lmphcn0iIHRvZGlyPSIke3RyYW5zaWRpb21jZW50cmFsLmRpc3QubGlifSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtqYXhiNi5qYXJ9IiB0b2Rpcj0iJHt0cmFuc2lkaW9tY2VudHJhbC5kaXN0LmxpYn0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7amF4YjcuamFyfSIgdG9kaXI9IiR7dHJhbnNpZGlvbWNlbnRyYWwuZGlzdC5saWJ9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgIDwvdGFyZ2V0PgotICAgIDwhLS0gVXNlciBEb2NzIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iZGlzdC5kb2NzIj4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXN0fS9kb2NzIi8+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLmRpc3R9L2RvY3MiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2RvYy5kaXJ9Ij4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJUcmFuc2lkaW9tIEhUVFAqLmRvYyIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDwhLS0gSmF2YWRvYyBmb3Igb3BlbiBiYWNrLWVuZCBBUEkgLS0+Ci0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJhaXMuZGlzdC5qYXZhZG9jIiB2YWx1ZT0iJHthaXMuZGlzdH0vSmF2YUNvbm5lY3RvcnMvRG9jdW1lbnRhdGlvbi9KYXZhRG9jIi8+Ci0gICAgPHRhcmdldCBuYW1lPSJqYXZhZG9jLm9wZW5iYWNrZW5kIiBkZXBlbmRzPSJjb21waWxlLmRvY2xldCI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke2Fpcy5kaXN0LmphdmFkb2N9IiBpbmNsdWRlRW1wdHlEaXJzPSJ0cnVlIiBxdWlldD0idHJ1ZSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke2Fpcy5kaXN0LmphdmFkb2N9Ii8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJiYXNpYy1oZWFkZXIiIHZhbHVlPSIke05hbWV9JiN4MjEyMjssIEFJUyBKYXZhIENvbm5lY3RvciIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGVhZGVyK3ZlcnNpb24iIHZhbHVlPSIke2Jhc2ljLWhlYWRlcn0sIHYke3ZlcnNpb259Ii8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ3aW4tdGl0bGUiIHZhbHVlPSIke2hlYWRlcit2ZXJzaW9ufSBBUEkgU3BlY2lmaWNhdGlvbiIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iZG9jLXRpdGxlIiB2YWx1ZT0iJHtoZWFkZXIrdmVyc2lvbn0mbHQ7YnIvJmd0O0FQSSBTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICAgIDxqYXZhZG9jIHNvdXJjZXBhdGg9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7YWlzLmRpc3QuamF2YWRvY30iIHdpbmRvd3RpdGxlPSIke3dpbi10aXRsZX0iIGRvY3RpdGxlPSIke2RvYy10aXRsZX0iIGhlYWRlcj0iJHtiYXNpYy1oZWFkZXJ9IiBib3R0b209IiZsdDtmb250IHNpemU9JnF1b3Q7LTEmcXVvdDsmZ3Q7JHtOYW1lfSBpcyBhIHRyYWRlbWFyayBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU2VhZ3VsbCBIb2xkaW5nIE5WIGluIHRoZSBVUyBhbmQgb3RoZXIgY291bnRyaWVzLiZsdDtici8mZ3Q7Q29weXJpZ2h0ICYjMTY5OyAxOTkzIC0gMjAwMyBTZWFndWxsIEJ1c2luZXNzIFNvZnR3YXJlIElyZWxhbmQgTHRkLiBBbGwgUmlnaHRzIFJlc2VydmVkLiZsdDsvZm9udCZndDsiIGF1dGhvcj0iZmFsc2UiIHZlcnNpb249InRydWUiIHVzZT0idHJ1ZSIgZG9jbGV0PSJjb20uc2VhZ3VsbHN3LmludGVybmFsZGV2LnRvb2xzLmFwaWRvY2xldC5zdGFuZGFyZC5TdGFuZGFyZCIgZG9jbGV0cGF0aD0iJHtidWlsZC5jbGFzc2VzfTske2phdmEucmVzb3VyY2UuZGlyfSI+Ci0gICAgICAgICAgICA8IS0tIEkgZG9uJ3QgdW5kZXJzdGFuZCBpdCwgYnV0IGlmIEkgbGVhdmUgb2ZmIHRoZSAke3NyYy5kaXJ9IGJlbG93LCBpdCBkb2Vzbid0IHdvcmsuIC0tPgotICAgICAgICAgICAgPHNvdXJjZSBmaWxlPSIke3NyYy5kaXJ9L2NvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3NlcnZlci9iYWNrZW5kL0JhY2tFbmQuamF2YSIvPgotICAgICAgICAgICAgPHNvdXJjZSBmaWxlPSIke3NyYy5kaXJ9L2NvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL3NlcnZlci9iYWNrZW5kL0JhY2tFbmRJbmZvLmphdmEiLz4KLSAgICAgICAgICAgIDxzb3VyY2UgZmlsZT0iJHtzcmMuZGlyfS9jb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9zZXJ2ZXIvYmFja2VuZC9CYWNrRW5kSGFuZGxlci5qYXZhIi8+Ci0gICAgICAgICAgICA8c291cmNlIGZpbGU9IiR7c3JjLmRpcn0vY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2Uvc2VydmVyL2JhY2tlbmQvQmFja0VuZFNldHRpbmdzLmphdmEiLz4KLSAgICAgICAgICAgIDxzb3VyY2UgZmlsZT0iJHtzcmMuZGlyfS9jb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9zZXJ2ZXIvYmFja2VuZC9DYWxsYmFjay5qYXZhIi8+Ci0gICAgICAgICAgICA8c291cmNlIGZpbGU9IiR7c3JjLmRpcn0vY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2Uvc2VydmVyL2JhY2tlbmQvQ2xpZW50U2Vzc2lvbi5qYXZhIi8+Ci0gICAgICAgICAgICA8c291cmNlIGZpbGU9IiR7c3JjLmRpcn0vY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2Uvc2VydmVyL2JhY2tlbmQvSW52b2NhdGlvbkNvbnRleHQuamF2YSIvPgotICAgICAgICAgICAgPHNvdXJjZSBmaWxlPSIke3NyYy5kaXJ9L2NvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL21vZGVsL0FnZ3JlZ2F0ZU1vZGVsLmphdmEiLz4KLSAgICAgICAgICAgIDxzb3VyY2UgZmlsZT0iJHtzcmMuZGlyfS9jb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9tb2RlbC9BcHBJbnRlcmZhY2VSdW50aW1lRXhjZXB0aW9uLmphdmEiLz4KLSAgICAgICAgICAgIDxzb3VyY2UgZmlsZT0iJHtzcmMuZGlyfS9jb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9tb2RlbC9EYXRhRWxlbWVudE1vZGVsLmphdmEiLz4KLSAgICAgICAgICAgIDxzb3VyY2UgZmlsZT0iJHtzcmMuZGlyfS9jb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9tb2RlbC9GaWVsZE1vZGVsLmphdmEiLz4KLSAgICAgICAgICAgIDxzb3VyY2UgZmlsZT0iJHtzcmMuZGlyfS9jb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9tb2RlbC9JbGxlZ2FsRWxlbWVudEV4Y2VwdGlvbi5qYXZhIi8+Ci0gICAgICAgICAgICA8c291cmNlIGZpbGU9IiR7c3JjLmRpcn0vY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvbW9kZWwvSWxsZWdhbFBhdGhFeGNlcHRpb24uamF2YSIvPgotICAgICAgICAgICAgPHNvdXJjZSBmaWxlPSIke3NyYy5kaXJ9L2NvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL21vZGVsL01vZGVsRWxlbWVudC5qYXZhIi8+Ci0gICAgICAgICAgICA8c291cmNlIGZpbGU9IiR7c3JjLmRpcn0vY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvbW9kZWwvU2VxdWVuY2VNb2RlbC5qYXZhIi8+Ci0gICAgICAgICAgICA8c291cmNlIGZpbGU9IiR7c3JjLmRpcn0vY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvbW9kZWwvU3RydWN0dXJlTW9kZWwuamF2YSIvPgotICAgICAgICAgICAgPHNvdXJjZSBmaWxlPSIke3NyYy5kaXJ9L2NvbS9zZWFndWxsc3cvYXBwaW50ZXJmYWNlL21vZGVsL2RhdGEvQWdncmVnYXRlLmphdmEiLz4KLSAgICAgICAgICAgIDxzb3VyY2UgZmlsZT0iJHtzcmMuZGlyfS9jb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9tb2RlbC9kYXRhL0RhdGFFbGVtZW50LmphdmEiLz4KLSAgICAgICAgICAgIDxzb3VyY2UgZmlsZT0iJHtzcmMuZGlyfS9jb20vc2VhZ3VsbHN3L2FwcGludGVyZmFjZS9tb2RlbC9kYXRhL0RhdGFFbGVtZW50TGlzdC5qYXZhIi8+Ci0gICAgICAgICAgICA8c291cmNlIGZpbGU9IiR7c3JjLmRpcn0vY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvbW9kZWwvZGF0YS9GaWVsZC5qYXZhIi8+Ci0gICAgICAgICAgICA8c291cmNlIGZpbGU9IiR7c3JjLmRpcn0vY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvbW9kZWwvZGF0YS9TZXF1ZW5jZS5qYXZhIi8+Ci0gICAgICAgICAgICA8c291cmNlIGZpbGU9IiR7c3JjLmRpcn0vY29tL3NlYWd1bGxzdy9hcHBpbnRlcmZhY2UvbW9kZWwvZGF0YS9TdHJ1Y3R1cmUuamF2YSIvPgotICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iYWlzLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgICAgICA8bGluayBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkay8xLjMuMS9kb2NzL2FwaS8iLz4KLSAgICAgICAgPC9qYXZhZG9jPgotICAgIDwvdGFyZ2V0PgotICAgIDwhLS0gVkVSSUZZIC0tPgotICAgIDxwYXRoIGlkPSJwYXRoLkFudFRhc2tzIj4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2p1bml0Lmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtY2xpLmphcn0iLz4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtaHR0cGNsaWVudC5qYXJ9Ii8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC5jbGFzc2VzfSIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7aW50ZXJuYWxkZXYuY2xhc3Nlc30iLz4KLSAgICA8L3BhdGg+Ci0gICAgPHRhcmdldCBuYW1lPSJidWlsZC5BbnRUYXNrcyI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7aW50ZXJuYWxkZXYuY2xhc3Nlc30iLz4KLSAgICAgICAgPGphdmFjIHNyY2Rpcj0iJHtzcmMudGVzdC5kaXJ9IiBkZXN0ZGlyPSIke2ludGVybmFsZGV2LmNsYXNzZXN9IiBkZWJ1Zz0iJHtjb21waWxlLmRlYnVnfSIgY2xhc3NwYXRocmVmPSJwYXRoLkFudFRhc2tzIj4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvaW50ZXJuYWxkZXYvYnVpbGQvSmFyRmlsZVZlcmlmaWVyLmphdmEiLz4KLSAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImNvbS9zZWFndWxsc3cvaW50ZXJuYWxkZXYvYnVpbGQvSmFyRmlsZVZlcmlmaWVyVGFzay5qYXZhIi8+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2ludGVybmFsZGV2L2J1aWxkL0lzVXJsT3Blbi5qYXZhIi8+Ci0gICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJjb20vc2VhZ3VsbHN3L2ludGVybmFsZGV2L2J1aWxkL0lzVXJsT3BlblRhc2suamF2YSIvPgotICAgICAgICA8L2phdmFjPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0iZGVjbGFyZS5BbnRUYXNrcyIgZGVwZW5kcz0iYnVpbGQuQW50VGFza3MiPgotICAgICAgICA8dGFza2RlZiBuYW1lPSJ2ZXJpZnlqYXIiIGNsYXNzbmFtZT0iY29tLnNlYWd1bGxzdy5pbnRlcm5hbGRldi5idWlsZC5KYXJGaWxlVmVyaWZpZXJUYXNrIiBjbGFzc3BhdGhyZWY9InBhdGguQW50VGFza3MiLz4KLSAgICAgICAgPHRhc2tkZWYgbmFtZT0iaXNVcmxPcGVuIiBjbGFzc25hbWU9ImNvbS5zZWFndWxsc3cuaW50ZXJuYWxkZXYuYnVpbGQuSXNVcmxPcGVuVGFzayIgY2xhc3NwYXRocmVmPSJwYXRoLkFudFRhc2tzIi8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJwcmVwYXJlLnRlc3QuZXh0Ij4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHt0ZXN0LmxpYn0iLz4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7dGVzdC5saWIuZXh0fSIvPgotICAgICAgICA8bWtkaXIgZGlyPSIke3Rlc3QubGliLmV4dH0iLz4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9InZlcmlmeS5haXMuamFyIiBkZXBlbmRzPSJkZWNsYXJlLkFudFRhc2tzLCBwcmVwYXJlLnRlc3QuZXh0Ij4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHt0ZXN0LmZkZWZ9Ii8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7Z29YTUxFbmdpbmUuamFyfSIgdG9kaXI9IiR7dGVzdC5saWIuZXh0fSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtnb1hNTFJlc291cmNlLnppcH0iIHRvZGlyPSIke3Rlc3QubGliLmV4dH0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7amRvbS5qYXJ9IiB0b2Rpcj0iJHt0ZXN0LmxpYi5leHR9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke2libS5tcS5qYXJ9IiB0b2Rpcj0iJHt0ZXN0LmxpYi5leHR9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke2libS5tcS5jb25uZWN0b3IuamFyfSIgdG9kaXI9IiR7dGVzdC5saWIuZXh0fSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtpYm0ubXEuanRhLmphcn0iIHRvZGlyPSIke3Rlc3QubGliLmV4dH0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDx2ZXJpZnlqYXIgZmlsZT0iJHthaXMtY29yZS5qYXJ9IiB2ZXJib3NlPSJmYWxzZSIgZGVidWc9ImZhbHNlIj4KLSAgICAgICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy5kaXN0LmxpYn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLmRpc3QubGliLmV4dH0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5saWJ9Ii8+Ci0gICAgICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICAgICAgPC92ZXJpZnlqYXI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke3Rlc3QubGliLmV4dH0iLz4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7dGVzdC5mZGVmfSIvPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0idmVyaWZ5LmNsaWVudC5qYXIiIGRlcGVuZHM9ImRlY2xhcmUuQW50VGFza3MsIHByZXBhcmUudGVzdC5leHQiPgotICAgICAgICA8Y29weSBmaWxlPSIke2libS5tcS5qYXJ9IiB0b2Rpcj0iJHt0ZXN0LmxpYi5leHR9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke2ptcy5qYXJ9IiB0b2Rpcj0iJHt0ZXN0LmxpYi5leHR9IiBwcmVzZXJ2ZWxhc3Rtb2RpZmllZD0idHJ1ZSIvPgotICAgICAgICA8Y29weSBmaWxlPSIke21haWwuamFyfSIgdG9kaXI9IiR7dGVzdC5saWIuZXh0fSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtzb2FwLmphcn0iIHRvZGlyPSIke3Rlc3QubGliLmV4dH0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDx2ZXJpZnlqYXIgZmlsZT0iJHthaXMuY2xpZW50Lmphcn0iIHZlcmJvc2U9ImZhbHNlIiBkZWJ1Zz0iZmFsc2UiPgotICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLmNsaWVudC5kaXN0LmxpYn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5saWIuZXh0fSIvPgotICAgICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgIDwvdmVyaWZ5amFyPgotICAgICAgICA8ZGVsZXRlIGRpcj0iJHt0ZXN0LmxpYi5leHR9Ii8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJ2ZXJpZnkuNTI1MC5qYXIiIGRlcGVuZHM9ImRlY2xhcmUuQW50VGFza3MiPgotICAgICAgICA8dmVyaWZ5amFyIGZpbGU9IiR7YWlzLTUyNTAuamFyfSIgaWdub3JlVW5yZXNvbHZlZD0idHJ1ZSIgdmVyYm9zZT0iZmFsc2UiIGRlYnVnPSJmYWxzZSI+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2Fpcy5kaXN0LmxpYn0iLz4KLSAgICAgICAgPC92ZXJpZnlqYXI+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJ2ZXJpZnkuMzI3MC5qYXIiIGRlcGVuZHM9ImRlY2xhcmUuQW50VGFza3MiPgotICAgICAgICA8dmVyaWZ5amFyIGZpbGU9IiR7YWlzLTMyNzAuamFyfSIgaWdub3JlVW5yZXNvbHZlZD0idHJ1ZSIgdmVyYm9zZT0iZmFsc2UiIGRlYnVnPSJmYWxzZSI+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2Fpcy5kaXN0LmxpYn0iLz4KLSAgICAgICAgPC92ZXJpZnlqYXI+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJ2ZXJpZnkuY29ib2wuamFyIiBkZXBlbmRzPSJkZWNsYXJlLkFudFRhc2tzIj4KLSAgICAgICAgPHZlcmlmeWphciBmaWxlPSIke2Fpcy1jb2JvbC5qYXJ9IiB2ZXJib3NlPSJmYWxzZSIgZGVidWc9ImZhbHNlIj4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7YWlzLmRpc3QubGlifSIvPgotICAgICAgICA8L3ZlcmlmeWphcj4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9InZlcmlmeS5jaWNzLmphciIgZGVwZW5kcz0iZGVjbGFyZS5BbnRUYXNrcywgcHJlcGFyZS50ZXN0LmV4dCI+Ci0gICAgICAgIDxjb3B5IGZpbGU9IiR7Y3RnY2xpZW50Lmphcn0iIHRvZGlyPSIke3Rlc3QubGliLmV4dH0iIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIi8+Ci0gICAgICAgIDx2ZXJpZnlqYXIgZmlsZT0iJHthaXMtY2ljcy5qYXJ9IiB2ZXJib3NlPSJmYWxzZSIgZGVidWc9ImZhbHNlIj4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7YWlzLmRpc3QubGlifSIvPgotICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHt0ZXN0LmxpYn0iLz4KLSAgICAgICAgPC92ZXJpZnlqYXI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke3Rlc3QubGliLmV4dH0iLz4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9InZlcmlmeS5pbXMuamFyIiBkZXBlbmRzPSJkZWNsYXJlLkFudFRhc2tzIj4KLSAgICAgICAgPHZlcmlmeWphciBmaWxlPSIke2Fpcy1pbXMuamFyfSIgdmVyYm9zZT0iZmFsc2UiIGRlYnVnPSJmYWxzZSI+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2Fpcy5kaXN0LmxpYn0iLz4KLSAgICAgICAgPC92ZXJpZnlqYXI+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJ2ZXJpZnkuYWRtaW5jbGllbnQuamFyIiBkZXBlbmRzPSJkZWNsYXJlLkFudFRhc2tzIj4KLSAgICAgICAgPHZlcmlmeWphciBmaWxlPSIke2Fpcy1hZG1pbmNsaWVudC5qYXJ9IiB2ZXJib3NlPSJmYWxzZSIgZGVidWc9ImZhbHNlIj4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7ZGV2dG9vbHMuZGlzdC5saWJ9Ii8+Ci0gICAgICAgIDwvdmVyaWZ5amFyPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0idmVyaWZ5LnByb3h5c2VydmxldC5qYXIiIGRlcGVuZHM9ImRlY2xhcmUuQW50VGFza3MiPgotICAgICAgICA8dmVyaWZ5amFyIGZpbGU9IiR7cHJveHlzZXJ2bGV0Lmphcn0iIHZlcmJvc2U9ImZhbHNlIiBkZWJ1Zz0iZmFsc2UiPgotICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7cHJveHlzZXJ2bGV0LmRpc3QubGlifSIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtzZXJ2bGV0LmRpcn0iLz4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICA8L3ZlcmlmeWphcj4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9InZlcmlmeS5hZG1pbmNvbnNvbGUuamFyIiBkZXBlbmRzPSJkZWNsYXJlLkFudFRhc2tzIj4KLSAgICAgICAgPHZlcmlmeWphciBmaWxlPSIke2FkbWluY29uc29sZS5qYXJ9IiB2ZXJib3NlPSJmYWxzZSIgZGVidWc9ImZhbHNlIj4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7YWlzLmRpc3QubGlifSIvPgotICAgICAgICA8L3ZlcmlmeWphcj4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9InZlcmlmeS5qYXZhY29ubmVjdG9yZ2VuZXJhdG9yLmphciIgZGVwZW5kcz0iZGVjbGFyZS5BbnRUYXNrcyI+Ci0gICAgICAgIDx2ZXJpZnlqYXIgZmlsZT0iJHtqYXZhY29ubmVjdG9yZ2VuZXJhdG9yLmphcn0iIHZlcmJvc2U9ImZhbHNlIiBkZWJ1Zz0iZmFsc2UiPgotICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtkZXZ0b29scy5kaXN0LmxpYn0iLz4KLSAgICAgICAgPC92ZXJpZnlqYXI+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJ2ZXJpZnkuc2VjdXJpdHl0b29sa2l0LmphciIgZGVwZW5kcz0iZGVjbGFyZS5BbnRUYXNrcyI+Ci0gICAgICAgIDx2ZXJpZnlqYXIgZmlsZT0iJHtzZWN1cml0eXRvb2xraXQuamFyfSIgdmVyYm9zZT0iZmFsc2UiIGRlYnVnPSJmYWxzZSI+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2RldnRvb2xzLmRpc3QubGlifSIvPgotICAgICAgICA8L3ZlcmlmeWphcj4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9InZlcmlmeS50b29scy5qYXIiIGRlcGVuZHM9ImRlY2xhcmUuQW50VGFza3MsIHByZXBhcmUudGVzdC5leHQiPgotICAgICAgICA8Y29weSBmaWxlPSIke2oyc2UudG9vbHMuamFyfSIgdG9kaXI9IiR7dGVzdC5saWIuZXh0fSIgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiLz4KLSAgICAgICAgPHZlcmlmeWphciBmaWxlPSIke2Fpcy10b29scy5qYXJ9IiB2ZXJib3NlPSJmYWxzZSIgZGVidWc9ImZhbHNlIj4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7ZGV2dG9vbHMuZGlzdC5saWJ9Ii8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke3Rlc3QubGlifSIvPgotICAgICAgICA8L3ZlcmlmeWphcj4KLSAgICAgICAgPGRlbGV0ZSBkaXI9IiR7dGVzdC5saWIuZXh0fSIvPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0idmVyaWZ5Lmd3aHNjLmphciIgZGVwZW5kcz0iZGVjbGFyZS5BbnRUYXNrcyI+Ci0gICAgICAgIDx2ZXJpZnlqYXIgZmlsZT0iJHtoc2MuamFyfSIgdmVyYm9zZT0iZmFsc2UiIGRlYnVnPSJmYWxzZSIvPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0idmVyaWZ5Lmd3aHNjdS5qYXIiIGRlcGVuZHM9ImRlY2xhcmUuQW50VGFza3MiPgotICAgICAgICA8dmVyaWZ5amFyIGZpbGU9IiR7aHNjdS5qYXJ9IiB2ZXJib3NlPSJmYWxzZSIgZGVidWc9ImZhbHNlIi8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJ2ZXJpZnkueG1sIiBkZXBlbmRzPSJiYW5uZXIiPgotICAgICAgICA8IS0tIE9ubHkgY2hlY2sgZm9yIHdlbGwtZm9ybWVkIFhNTCBoZXJlLiAtLT4KLSAgICAgICAgPHhtbHZhbGlkYXRlIGxlbmllbnQ9InllcyIgd2Fybj0ieWVzIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5kaXN0fSIgaW5jbHVkZXM9IioqLyoueG1sIi8+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuZGlzdH0iIGluY2x1ZGVzPSIqKi8qLmNmZyIvPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmRpc3R9IiBpbmNsdWRlcz0iKiovKi5zZmQiLz4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5kaXN0fSIgaW5jbHVkZXM9IioqLyouc2pjZCIvPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmRpc3R9IiBpbmNsdWRlcz0iKiovKi5zZm1kIi8+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuZGlzdH0iIGluY2x1ZGVzPSIqKi8qLnhzZCIvPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmRpc3R9IiBpbmNsdWRlcz0iKiovKi54c2wiLz4KLSAgICAgICAgPC94bWx2YWxpZGF0ZT4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9InZlcmlmeSIgZGVzY3JpcHRpb249IlZlcmlmaWVzIHRoZSBidWlsZCBieSBwZXJmb3JtaW5nIGEgbG9hZCB0ZXN0cyBvbiBqYXIgZmlsZXMgKGRvZXMgbm90IHRyaWdnZXIgdGhlIGphciBkZXBlbmRlbmNpZXMuKSIgZGVwZW5kcz0iYmFubmVyLCB2ZXJpZnkuYWlzLmphciwgdmVyaWZ5LmNsaWVudC5qYXIsIHZlcmlmeS41MjUwLmphciwgdmVyaWZ5LjMyNzAuamFyLCB2ZXJpZnkuY29ib2wuamFyLCB2ZXJpZnkuY2ljcy5qYXIsIHZlcmlmeS5pbXMuamFyLCB2ZXJpZnkuYWRtaW5jbGllbnQuamFyLCB2ZXJpZnkucHJveHlzZXJ2bGV0LmphciwgdmVyaWZ5LmFkbWluY29uc29sZS5qYXIsIHZlcmlmeS5qYXZhY29ubmVjdG9yZ2VuZXJhdG9yLmphciwgdmVyaWZ5LnNlY3VyaXR5dG9vbGtpdC5qYXIsIHZlcmlmeS50b29scy5qYXIsIHZlcmlmeS5nd2hzYy5qYXIsIHZlcmlmeS5nd2hzY3UuamFyLCB2ZXJpZnkueG1sIi8+Ci0gICAgPCEtLSBFbmQgVkVSSUZZIHRhcmdldHMgLS0+Ci0gICAgPCEtLSBURVNUIFRBUkdFVFMgLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJqdW5pdF9jaGVjayI+Ci0gICAgICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJqdW5pdC5mcmFtZXdvcmsuVGVzdCIgcHJvcGVydHk9Imp1bml0LnByZXNlbnQiLz4KLSAgICAgICAgPGZhaWwgbWVzc2FnZT0iSlVuaXQgY2Fubm90IGJlIGZvdW5kLiIgdW5sZXNzPSJqdW5pdC5wcmVzZW50Ii8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRlc3QiIHZhbHVlPSIke2J1aWxkLmRpcn0vdGVzdCIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LmJpbiIgdmFsdWU9IiR7dGVzdH0vYmluIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRlc3QucmVzb3VyY2VzIiB2YWx1ZT0iJHt0ZXN0LmRpcn0vcmVzb3VyY2VzIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRlc3QuZmRlZiIgdmFsdWU9IiR7dGVzdH0vJHtmZGVmLmRpcm5hbWV9Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRlc3QubGliIiB2YWx1ZT0iJHt0ZXN0fS9saWIiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0idGVzdC5saWIuZXh0IiB2YWx1ZT0iJHt0ZXN0LmxpYn0vZXh0Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydHMuZGlyIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L3JlcG9ydHMiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0cy5jaGVja3N1bSIgdmFsdWU9IiR7cmVwb3J0cy5kaXJ9L2NoZWNrc3VtIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Imp1bml0LnJlcG9ydHMuc3JjZGlyIiBsb2NhdGlvbj0icmVwb3J0cyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJqdW5pdC5yZXBvcnRzIiBsb2NhdGlvbj0iJHtyZXBvcnRzLmRpcn0vanVuaXQiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ianVuaXQuZm9ybWF0dGVyIiB2YWx1ZT0ieG1sIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Imp1bml0LmZvcmsiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Imp1bml0LnByaW50c3VtbWFyeSIgdmFsdWU9InRydWUiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0ianVuaXQuaW5jbHVkZWFudHJ1bnRpbWUiIHZhbHVlPSJmYWxzZSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJqdW5pdC5kaXIiIHZhbHVlPSIuLi8uLiIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJqdW5pdC5yZXBvcnRzLnhtbCIgbG9jYXRpb249IiR7anVuaXQucmVwb3J0c30vJHtqdW5pdC5mb3JtYXR0ZXJ9Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Imp1bml0LnJlcG9ydC5leHQiIHZhbHVlPSItanVuaXQueG1sIi8+Ci0gICAgPHRhcmdldCBuYW1lPSJ0ZXN0LmNvbXBpbGUiIGRlc2NyaXB0aW9uPSJDb21waWxlcyB0aGUgdW5pdCB0ZXN0cyB3aXRob3V0IHRyaWdnZXJpbmcgYW55IGRlcGVuZGVuY2llcy4iPgotICAgICAgICA8bWtkaXIgZGlyPSIke3Rlc3QuYmlufSIvPgotICAgICAgICA8amF2YWMgZGVzdGRpcj0iJHt0ZXN0LmJpbn0iIGRlYnVnPSIke2NvbXBpbGUuZGVidWd9IiBpbmNsdWRlQW50UnVudGltZT0iZmFsc2UiPgotICAgICAgICAgICAgPHNyYyBwYXRoPSIke3NyYy50ZXN0LmRpcn0iLz4KLSAgICAgICAgICAgIDxzcmMgcGF0aD0iJHtzcmMuZGlyfS9jb20vc2VhZ3VsbHN3L2ludGVybmFsZGV2L2FwcGludGVyZmFjZS9tb2RlbCIvPgotICAgICAgICAgICAgPCEtLSBUZXN0aW5nIGZyYW1ld29yayAtLT4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7anVuaXQuamFyfSIvPgotICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHttdGp1bml0Lmphcn0iLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7eG1sc2VjLmphcn0iLz4KLSAgICAgICAgICAgIDwhLS0gSmFycyB0byB0ZXN0LCB3aGljaCB0aGUgdGVzdCBjYXNlcyByZWZlciB0by4gLS0+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2Fpcy1jb3JlLmphcn0iLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7cHJveHlzZXJ2bGV0Lmphcn0iLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7YWlzLmNsaWVudC5qYXJ9Ii8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2phdmFjb25uZWN0b3JnZW5lcmF0b3IuamFyfSIvPgotICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtzZWN1cml0eXRvb2xraXQuamFyfSIvPgotICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHthaXMtdG9vbHMuamFyfSIvPgotICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHthaXMtNTI1MC5qYXJ9Ii8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2Fpcy0zMjcwLmphcn0iLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7YWlzLWNvYm9sLmphcn0iLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7YWlzLWNpY3MuamFyfSIvPgotICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHthaXMtaW1zLmphcn0iLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7YWlzLWFkbWluY2xpZW50Lmphcn0iLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggbG9jYXRpb249IiR7aHNjLmphcn0iLz4KLSAgICAgICAgICAgIDwhLS0gZGVwZW5kZW5jaWVzIC0tPgotICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHthbnQuamFyfSIvPgotICAgICAgICAgICAgPGNsYXNzcGF0aCBsb2NhdGlvbj0iJHtjb21tb25zLWNsaS5qYXJ9Ii8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoIGxvY2F0aW9uPSIke2NvbW1vbnMtaHR0cGNsaWVudC5qYXJ9Ii8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJhaXMuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJwcm94eXNlcnZsZXQuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJjb2JvbC5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImNpY3MuYmFja2VuZC5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Imltcy5iYWNrZW5kLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0idHJhbnNmb3Jtcy5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Impzc2UuY2xhc3NwYXRoIi8+Ci0gICAgICAgIDwvamF2YWM+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJ0ZXN0Lm1rZGlyIiBkZXBlbmRzPSJpbml0Ij4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9Ii8+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7dGVzdH0iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHt0ZXN0LmJpbn0iLz4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9ImVjaG8ueGFsYW4udmVyc2lvbiI+Ci0gICAgICAgIDxlY2hvIGxldmVsPSJpbmZvIiBtZXNzYWdlPSJUZXN0aW5nIHdpdGggJHtUcmFuc2Zvcm1lckZhY3Rvcnl9Ii8+Ci0gICAgICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS54YWxhbi5WZXJzaW9uIi8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJyZXBvcnQuaW5pdCIgZGVwZW5kcz0iaW5pdCwgdGVzdC5jb21waWxlIj4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KLSAgICAgICAgPGVjaG8gbGV2ZWw9ImluZm8iIG1lc3NhZ2U9IlJlcG9ydGluZyB0byAke2p1bml0LnJlcG9ydHMueG1sfSIvPgotICAgIDwvdGFyZ2V0PgotICAgIDxwYXRoIGlkPSJqdW5pdC5jbGFzc3BhdGgiPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YW50LmhvbWV9L2xpYi9hbnQuamFyIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthbnQuaG9tZX0vbGliL29wdGlvbmFsLmphciIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YW50LmhvbWV9L2xpYi9qdW5pdC5qYXIiLz4KLSAgICA8L3BhdGg+Ci0gICAgPCEtLSBVbml0IFRlc3RzOiBmcm9tIGxvdy1sZXZlbCB0byBoaWdoLWxldmVsIC0tPgotICAgIDwhLS0gVW5pdCBUZXN0czogamF2YXgubGFuZyAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9Imp1bml0LmphdmF4LmxhbmciIGRlcGVuZHM9InJlcG9ydC5pbml0Ij4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KLSAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0iJHtqdW5pdC5wcmludHN1bW1hcnl9IiBmb3JrPSIke2p1bml0LmZvcmt9IiBkaXI9IiR7anVuaXQuZGlyfSIgaW5jbHVkZWFudHJ1bnRpbWU9IiR7anVuaXQuaW5jbHVkZWFudHJ1bnRpbWV9Ij4KLSAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHtqdW5pdC5mb3JtYXR0ZXJ9IiBleHRlbnNpb249IiR7anVuaXQucmVwb3J0LmV4dH0iLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1jb3JlLmphcn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLXRvb2xzLmphcn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7ajJzZS50b29scy5qYXJ9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbGFuZy5qYXJ9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QuYmlufSIvPgotICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJqdW5pdC5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICAgICAgPHRlc3QgbmFtZT0iY29tLnNlYWd1bGxzdy51bml0dGVzdC5qYXZheC5sYW5nLkFsbFRlc3RzIiB0b2Rpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KLSAgICAgICAgPC9qdW5pdD4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tIFVuaXQgVGVzdHM6IGphdmF4LmlvIC0tPgotICAgIDx0YXJnZXQgbmFtZT0ianVuaXQuamF2YXguaW8iIGRlcGVuZHM9InJlcG9ydC5pbml0Ij4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KLSAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0iJHtqdW5pdC5wcmludHN1bW1hcnl9IiBmb3JrPSIke2p1bml0LmZvcmt9IiBkaXI9IiR7anVuaXQuZGlyfSIgaW5jbHVkZWFudHJ1bnRpbWU9IiR7anVuaXQuaW5jbHVkZWFudHJ1bnRpbWV9Ij4KLSAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHtqdW5pdC5mb3JtYXR0ZXJ9IiBleHRlbnNpb249IiR7anVuaXQucmVwb3J0LmV4dH0iLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1jb3JlLmphcn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sYW5nLmphcn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5iaW59Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QucmVzb3VyY2VzfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJqdW5pdC5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICAgICAgPHRlc3QgbmFtZT0iY29tLnNlYWd1bGxzdy5qYXZheC5pby5BbGxUZXN0cyIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+Ci0gICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LnVuaXR0ZXN0LmphdmF4LmlvLkFsbFRlc3RzIiB0b2Rpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KLSAgICAgICAgPC9qdW5pdD4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tIFVuaXQgVGVzdHM6IGphdmF4LnV0aWwgLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJqdW5pdC5qYXZheC51dGlsIiBkZXBlbmRzPSJyZXBvcnQuaW5pdCI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+Ci0gICAgICAgIDxqdW5pdCBwcmludHN1bW1hcnk9IiR7anVuaXQucHJpbnRzdW1tYXJ5fSIgZm9yaz0iJHtqdW5pdC5mb3JrfSIgZGlyPSIke2p1bml0LmRpcn0iIGluY2x1ZGVhbnRydW50aW1lPSIke2p1bml0LmluY2x1ZGVhbnRydW50aW1lfSI+Ci0gICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9IiR7anVuaXQuZm9ybWF0dGVyfSIgZXh0ZW5zaW9uPSIke2p1bml0LnJlcG9ydC5leHR9Ii8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthaXMtY29yZS5qYXJ9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QuYmlufSIvPgotICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJqdW5pdC5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICAgICAgPHRlc3QgbmFtZT0iY29tLnNlYWd1bGxzdy51bml0dGVzdC5qYXZheC51dGlsLkFsbFRlc3RzIiB0b2Rpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KLSAgICAgICAgPC9qdW5pdD4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tIFVuaXQgVGVzdHM6IFRvb2xib3ggWE1MICAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9Imp1bml0LnRvb2xib3gueG1sIiBkZXBlbmRzPSJyZXBvcnQuaW5pdCI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+Ci0gICAgICAgIDxqdW5pdCBwcmludHN1bW1hcnk9IiR7anVuaXQucHJpbnRzdW1tYXJ5fSIgZm9yaz0iJHtqdW5pdC5mb3JrfSIgZGlyPSIke2p1bml0LmRpcn0iIGluY2x1ZGVhbnRydW50aW1lPSIke2p1bml0LmluY2x1ZGVhbnRydW50aW1lfSI+Ci0gICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9IiR7anVuaXQuZm9ybWF0dGVyfSIgZXh0ZW5zaW9uPSIke2p1bml0LnJlcG9ydC5leHR9Ii8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke3N1bi5ib290LmNsYXNzLnBhdGh9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1jb3JlLmphcn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0ieG1sLmNsYXNzcGF0aC5ydCIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWxhbmcuamFyfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt4bWxzZWMuamFyfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqY2UuamFyfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtsb2c0ai5qYXJ9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QuYmlufSIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LnJlc291cmNlc30iLz4KLSAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0ianVuaXQuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICAgICAgICAgIDx0ZXN0IG5hbWU9ImNvbS5zZWFndWxsc3cudW5pdHRlc3QudG9vbGJveC54bWwuU3RyaW5nUHJveHlUZXN0U3VpdGUiIHRvZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgotICAgICAgICAgICAgPHRlc3QgbmFtZT0iY29tLnNlYWd1bGxzdy51bml0dGVzdC50b29sYm94LnhtbC5Eb2N1bWVudFByb3h5VGVzdFN1aXRlIiB0b2Rpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KLSAgICAgICAgICAgIDx0ZXN0IG5hbWU9ImNvbS5zZWFndWxsc3cudW5pdHRlc3QudG9vbGJveC54bWwuUmVhZERvY3VtZW50V2l0aEVuY29kaW5nVGVzdFN1aXRlIiB0b2Rpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KLSAgICAgICAgPC9qdW5pdD4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tIFVuaXQgVGVzdHM6IFRvb2xib3ggY29uZmlnICAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9Imp1bml0LnRvb2xib3guY29uZmlnIiBkZXBlbmRzPSJyZXBvcnQuaW5pdCI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+Ci0gICAgICAgIDxqdW5pdCBwcmludHN1bW1hcnk9IiR7anVuaXQucHJpbnRzdW1tYXJ5fSIgZm9yaz0iJHtqdW5pdC5mb3JrfSIgZGlyPSIke2p1bml0LmRpcn0iIGluY2x1ZGVhbnRydW50aW1lPSIke2p1bml0LmluY2x1ZGVhbnRydW50aW1lfSI+Ci0gICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9IiR7anVuaXQuZm9ybWF0dGVyfSIgZXh0ZW5zaW9uPSIke2p1bml0LnJlcG9ydC5leHR9Ii8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LmJpbn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5yZXNvdXJjZXN9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7c3VuLmJvb3QuY2xhc3MucGF0aH0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLWNvcmUuamFyfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWxhbmcuamFyfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWNsaS5qYXJ9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Imp1bml0LmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LnRvb2xib3guY29uZmlnLkNvbmZpZ3VyYXRpb25EaXJlY3RvcnlUZXN0Q2FzZSIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+Ci0gICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LnRvb2xib3guY29uZmlnLkNvbmZpZ1ZhbGlkYXRvclRlc3QiIHRvZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgotICAgICAgICA8L2p1bml0PgotICAgIDwvdGFyZ2V0PgotICAgIDwhLS0gVW5pdCBUZXN0czogVG9vbGJveCBsb2dnaW5nICAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9Imp1bml0LnRvb2xib3gubG9nIiBkZXBlbmRzPSJyZXBvcnQuaW5pdCI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+Ci0gICAgICAgIDxqdW5pdCBwcmludHN1bW1hcnk9IiR7anVuaXQucHJpbnRzdW1tYXJ5fSIgZm9yaz0iJHtqdW5pdC5mb3JrfSIgZGlyPSIke2p1bml0LmRpcn0iIGluY2x1ZGVhbnRydW50aW1lPSIke2p1bml0LmluY2x1ZGVhbnRydW50aW1lfSI+Ci0gICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9IiR7anVuaXQuZm9ybWF0dGVyfSIgZXh0ZW5zaW9uPSIke2p1bml0LnJlcG9ydC5leHR9Ii8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LmJpbn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLWNvcmUuamFyfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWxhbmcuamFyfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJqdW5pdC5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICAgICAgPHRlc3QgbmFtZT0iY29tLnNlYWd1bGxzdy50b29sYm94LmxvZy5Mb2dVbml0VGVzdHMiIHRvZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgotICAgICAgICA8L2p1bml0PgotICAgIDwvdGFyZ2V0PgotICAgIDwhLS0gVW5pdCBUZXN0czogY29uZmlnL2xvZyAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9Imp1bml0LnNlcnZlci5jb25maWcubG9nIiBkZXBlbmRzPSJyZXBvcnQuaW5pdCI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+Ci0gICAgICAgIDxqdW5pdCBwcmludHN1bW1hcnk9IiR7anVuaXQucHJpbnRzdW1tYXJ5fSIgZm9yaz0iJHtqdW5pdC5mb3JrfSIgZGlyPSIke2p1bml0LmRpcn0iIGluY2x1ZGVhbnRydW50aW1lPSIke2p1bml0LmluY2x1ZGVhbnRydW50aW1lfSI+Ci0gICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9IiR7anVuaXQuZm9ybWF0dGVyfSIgZXh0ZW5zaW9uPSIke2p1bml0LnJlcG9ydC5leHR9Ii8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthaXMtY29yZS5qYXJ9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImFpcy5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5iaW59Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QucmVzb3VyY2VzfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJqdW5pdC5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICAgICAgPHRlc3QgbmFtZT0iY29tLnNlYWd1bGxzdy5hcHBpbnRlcmZhY2Uuc2VydmVyLmNvbmZpZy5iaW5kLmxvZy5BbGxUZXN0cyIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+Ci0gICAgICAgIDwvanVuaXQ+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPCEtLSBVbml0IFRlc3RzOiBjb25maWcvYmluZC90aHJlYWRwb29sIC0tPgotICAgIDx0YXJnZXQgbmFtZT0ianVuaXQuc2VydmVyLmNvbmZpZy50aHJlYWRwb29sIiBkZXBlbmRzPSJyZXBvcnQuaW5pdCI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+Ci0gICAgICAgIDxqdW5pdCBwcmludHN1bW1hcnk9IiR7anVuaXQucHJpbnRzdW1tYXJ5fSIgZm9yaz0iJHtqdW5pdC5mb3JrfSIgZGlyPSIke2p1bml0LmRpcn0iIGluY2x1ZGVhbnRydW50aW1lPSIke2p1bml0LmluY2x1ZGVhbnRydW50aW1lfSI+Ci0gICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9IiR7anVuaXQuZm9ybWF0dGVyfSIgZXh0ZW5zaW9uPSIke2p1bml0LnJlcG9ydC5leHR9Ii8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthaXMtY29yZS5qYXJ9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImFpcy5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5iaW59Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QucmVzb3VyY2VzfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJqdW5pdC5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICAgICAgPHRlc3QgbmFtZT0iY29tLnNlYWd1bGxzdy5hcHBpbnRlcmZhY2Uuc2VydmVyLmNvbmZpZy5iaW5kLnRocmVhZHBvb2wuQWxsVGVzdHMiIHRvZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgotICAgICAgICA8L2p1bml0PgotICAgIDwvdGFyZ2V0PgotICAgIDwhLS0gVW5pdCBUZXN0czogY29uZmlnL2JpbmQvdHJhbnNmb3JtIC0tPgotICAgIDx0YXJnZXQgbmFtZT0ianVuaXQuc2VydmVyLmNvbmZpZy50cmFuc2Zvcm0iIGRlcGVuZHM9InJlcG9ydC5pbml0Ij4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KLSAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0iJHtqdW5pdC5wcmludHN1bW1hcnl9IiBmb3JrPSIke2p1bml0LmZvcmt9IiBkaXI9IiR7anVuaXQuZGlyfSIgaW5jbHVkZWFudHJ1bnRpbWU9IiR7anVuaXQuaW5jbHVkZWFudHJ1bnRpbWV9Ij4KLSAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHtqdW5pdC5mb3JtYXR0ZXJ9IiBleHRlbnNpb249IiR7anVuaXQucmVwb3J0LmV4dH0iLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1jb3JlLmphcn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iYWlzLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJ0cmFuc2Zvcm1zLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LmJpbn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5yZXNvdXJjZXN9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Imp1bml0LmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS5zZXJ2ZXIuY29uZmlnLmJpbmQudHJhbnNmb3JtLkFsbFRlc3RzIiB0b2Rpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KLSAgICAgICAgPC9qdW5pdD4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tIFVuaXQgVGVzdHM6IGNvbmZpZy9iaW5kL2NvcmUgLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJqdW5pdC5zZXJ2ZXIuY29uZmlnLmNvcmUiIGRlcGVuZHM9InJlcG9ydC5pbml0Ij4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KLSAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0iJHtqdW5pdC5wcmludHN1bW1hcnl9IiBmb3JrPSIke2p1bml0LmZvcmt9IiBkaXI9IiR7anVuaXQuZGlyfSIgaW5jbHVkZWFudHJ1bnRpbWU9IiR7anVuaXQuaW5jbHVkZWFudHJ1bnRpbWV9Ij4KLSAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHtqdW5pdC5mb3JtYXR0ZXJ9IiBleHRlbnNpb249IiR7anVuaXQucmVwb3J0LmV4dH0iLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1jb3JlLmphcn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iYWlzLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LmJpbn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5yZXNvdXJjZXN9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Imp1bml0LmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS5zZXJ2ZXIuY29uZmlnLmJpbmQuY29yZS5BbGxUZXN0cyIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+Ci0gICAgICAgIDwvanVuaXQ+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPCEtLSBVbml0IFRlc3RzOiBjb25maWcvYmluZC9tYW5hZ2VtZW50IC0tPgotICAgIDx0YXJnZXQgbmFtZT0ianVuaXQuc2VydmVyLmNvbmZpZy5tYW5hZ2VtZW50IiBkZXBlbmRzPSJyZXBvcnQuaW5pdCI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+Ci0gICAgICAgIDxqdW5pdCBwcmludHN1bW1hcnk9IiR7anVuaXQucHJpbnRzdW1tYXJ5fSIgZm9yaz0iJHtqdW5pdC5mb3JrfSIgZGlyPSIke2p1bml0LmRpcn0iIGluY2x1ZGVhbnRydW50aW1lPSIke2p1bml0LmluY2x1ZGVhbnRydW50aW1lfSI+Ci0gICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9IiR7anVuaXQuZm9ybWF0dGVyfSIgZXh0ZW5zaW9uPSIke2p1bml0LnJlcG9ydC5leHR9Ii8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthaXMtY29yZS5qYXJ9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImFpcy5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5iaW59Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QucmVzb3VyY2VzfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJqdW5pdC5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICAgICAgPHRlc3QgbmFtZT0iY29tLnNlYWd1bGxzdy5hcHBpbnRlcmZhY2Uuc2VydmVyLmNvbmZpZy5iaW5kLm1hbmFnZW1lbnQuSmF4YlVubWFyc2hhbFRlc3RDYXNlIiB0b2Rpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KLSAgICAgICAgICAgIDx0ZXN0IG5hbWU9ImNvbS5zZWFndWxsc3cuYXBwaW50ZXJmYWNlLnNlcnZlci5jb25maWcuYmluZC5tYW5hZ2VtZW50LkNvbmZpZ3VyYXRpb25EaXJlY3RvcnlVbm1hcnNoYWxUZXN0Q2FzZSIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+Ci0gICAgICAgIDwvanVuaXQ+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPCEtLSBVbml0IFRlc3RzOiBDaGFtZWxlb24gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJqdW5pdC5haXMtY29yZS50cmFuc2Zvcm1zIiBkZXBlbmRzPSJyZXBvcnQuaW5pdCI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+Ci0gICAgICAgIDxqdW5pdCBwcmludHN1bW1hcnk9IiR7anVuaXQucHJpbnRzdW1tYXJ5fSIgZm9yaz0iJHtqdW5pdC5mb3JrfSIgZGlyPSIke2p1bml0LmRpcn0iIGluY2x1ZGVhbnRydW50aW1lPSIke2p1bml0LmluY2x1ZGVhbnRydW50aW1lfSI+Ci0gICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9IiR7anVuaXQuZm9ybWF0dGVyfSIgZXh0ZW5zaW9uPSIke2p1bml0LnJlcG9ydC5leHR9Ii8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke3N1bi5ib290LmNsYXNzLnBhdGh9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1jb3JlLmphcn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0idHJhbnNmb3Jtcy5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7eG1sc2VjLmphcn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amNlLmphcn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7bG9nNGouamFyfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtnb1hNTFJlc291cmNlLnppcH0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Z29YTUxjb25maWcuZGlyfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqZG9tLmphcn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5iaW59Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QucmVzb3VyY2VzfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJqdW5pdC5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICAgICAgPHRlc3QgbmFtZT0iY29tLnNlYWd1bGxzdy51bml0dGVzdC5hcHBpbnRlcmZhY2UudHJhbnNmb3Jtcy5BcGFjaGVYUGF0aE5hbWVzcGFjZVRlc3RTdWl0ZSIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+Ci0gICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LnVuaXR0ZXN0LmFwcGludGVyZmFjZS50cmFuc2Zvcm1zLlNpbXBsZUF3a1Rlc3RTdWl0ZSIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+Ci0gICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LnVuaXR0ZXN0LmFwcGludGVyZmFjZS50cmFuc2Zvcm1zLlRyYW5zZm9ybWF0aW9uTWFuYWdlckJpbmRpbmdUZXN0U3VpdGUiIHRvZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgotICAgICAgICAgICAgPHRlc3QgbmFtZT0iY29tLnNlYWd1bGxzdy51bml0dGVzdC5hcHBpbnRlcmZhY2UudHJhbnNmb3Jtcy5UcmFuc2Zvcm1hdGlvbk1hbmFnZXJUZXN0U3VpdGUiIHRvZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgotICAgICAgICAgICAgPHRlc3QgbmFtZT0iY29tLnNlYWd1bGxzdy51bml0dGVzdC5hcHBpbnRlcmZhY2UudHJhbnNmb3Jtcy5Hb1hNTFRyYW5zZm9ybWF0aW9uTWFuYWdlclRlc3RTdWl0ZSIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+Ci0gICAgICAgIDwvanVuaXQ+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPCEtLSBVbml0IFRlc3RzOiBjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS5zZXJ2ZXIuc2VjdXJpdHkuYXV0aCAgLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJqdW5pdC5zZWN1cml0eS5hdXRoIiBkZXBlbmRzPSJyZXBvcnQuaW5pdCI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+Ci0gICAgICAgIDxqdW5pdCBwcmludHN1bW1hcnk9IiR7anVuaXQucHJpbnRzdW1tYXJ5fSIgZm9yaz0iJHtqdW5pdC5mb3JrfSIgZGlyPSIke2p1bml0LmRpcn0iIGluY2x1ZGVhbnRydW50aW1lPSIke2p1bml0LmluY2x1ZGVhbnRydW50aW1lfSI+Ci0gICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9IiR7anVuaXQuZm9ybWF0dGVyfSIgZXh0ZW5zaW9uPSIke2p1bml0LnJlcG9ydC5leHR9Ii8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthaXMtY29yZS5qYXJ9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImFpcy5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iamNlLmNsYXNzcGF0aC5ydCIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LmJpbn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5yZXNvdXJjZXN9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Imp1bml0LmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS5zZXJ2ZXIuc2VjdXJpdHkuYXV0aC5BbGxUZXN0cyIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+Ci0gICAgICAgIDwvanVuaXQ+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPCEtLSBVbml0IFRlc3RzOiBjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS5zZXJ2ZXIuY3J5cHRvICAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9Imp1bml0LmNyeXB0byIgZGVwZW5kcz0icmVwb3J0LmluaXQiPgotICAgICAgICA8bWtkaXIgZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgotICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSIke2p1bml0LnByaW50c3VtbWFyeX0iIGZvcms9IiR7anVuaXQuZm9ya30iIGRpcj0iJHtqdW5pdC5kaXJ9IiBpbmNsdWRlYW50cnVudGltZT0iJHtqdW5pdC5pbmNsdWRlYW50cnVudGltZX0iPgotICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSIke2p1bml0LmZvcm1hdHRlcn0iIGV4dGVuc2lvbj0iJHtqdW5pdC5yZXBvcnQuZXh0fSIvPgotICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLWNvcmUuamFyfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJhaXMuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImpjZS5jbGFzc3BhdGgucnQiLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5iaW59Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QucmVzb3VyY2VzfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJqdW5pdC5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICAgICAgPHRlc3QgbmFtZT0iY29tLnNlYWd1bGxzdy5hcHBpbnRlcmZhY2Uuc2VydmVyLmNyeXB0by5BbGxUZXN0cyIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+Ci0gICAgICAgIDwvanVuaXQ+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPCEtLSBVbml0IFRlc3RzOiBjb20uc2VhZ3VsbHN3LnRvb2xib3gubmV0ICAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9Imp1bml0LnRvb2xib3gubmV0IiBkZXBlbmRzPSJyZXBvcnQuaW5pdCI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+Ci0gICAgICAgIDxqdW5pdCBwcmludHN1bW1hcnk9IiR7anVuaXQucHJpbnRzdW1tYXJ5fSIgZm9yaz0iJHtqdW5pdC5mb3JrfSIgZGlyPSIke2p1bml0LmRpcn0iIGluY2x1ZGVhbnRydW50aW1lPSIke2p1bml0LmluY2x1ZGVhbnRydW50aW1lfSI+Ci0gICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9IiR7anVuaXQuZm9ybWF0dGVyfSIgZXh0ZW5zaW9uPSIke2p1bml0LnJlcG9ydC5leHR9Ii8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthaXMtY29yZS5qYXJ9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtY29kZWMuamFyfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWh0dHBjbGllbnQuamFyfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWxvZ2dpbmcuamFyfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJqY2UuY2xhc3NwYXRoLnJ0Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Impzc2UuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QuYmlufSIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LnJlc291cmNlc30iLz4KLSAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0ianVuaXQuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICAgICAgICAgIDx0ZXN0IG5hbWU9ImNvbS5zZWFndWxsc3cudG9vbGJveC5uZXQuQWxsVGVzdHMiIHRvZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgotICAgICAgICA8L2p1bml0PgotICAgIDwvdGFyZ2V0PgotICAgIDwhLS0gVW5pdCBUZXN0czogY29tLnNlYWd1bGxzdy51bml0dGVzdC5hcHBpbnRlcmZhY2UubW9kZWwgIC0tPgotICAgIDx0YXJnZXQgbmFtZT0ianVuaXQubW9kZWwiIGRlcGVuZHM9InJlcG9ydC5pbml0Ij4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KLSAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0iJHtqdW5pdC5wcmludHN1bW1hcnl9IiBmb3JrPSIke2p1bml0LmZvcmt9IiBkaXI9IiR7anVuaXQuZGlyfSIgaW5jbHVkZWFudHJ1bnRpbWU9IiR7anVuaXQuaW5jbHVkZWFudHJ1bnRpbWV9Ij4KLSAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHtqdW5pdC5mb3JtYXR0ZXJ9IiBleHRlbnNpb249IiR7anVuaXQucmVwb3J0LmV4dH0iLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1jb3JlLmphcn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iYWlzLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJ0cmFuc2Zvcm1zLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LmJpbn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5yZXNvdXJjZXN9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Imp1bml0LmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LnVuaXR0ZXN0LmFwcGludGVyZmFjZS5tb2RlbC5BbGxUZXN0cyIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+Ci0gICAgICAgIDwvanVuaXQ+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJqdW5pdC5zZXJ2ZXIiIGRlcGVuZHM9InJlcG9ydC5pbml0Ij4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KLSAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0iJHtqdW5pdC5wcmludHN1bW1hcnl9IiBmb3JrPSIke2p1bml0LmZvcmt9IiBkaXI9IiR7anVuaXQuZGlyfSIgaW5jbHVkZWFudHJ1bnRpbWU9IiR7anVuaXQuaW5jbHVkZWFudHJ1bnRpbWV9Ij4KLSAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHtqdW5pdC5mb3JtYXR0ZXJ9IiBleHRlbnNpb249IiR7anVuaXQucmVwb3J0LmV4dH0iLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1jb3JlLmphcn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iYWlzLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJpbXMuYmFja2VuZC5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iY2ljcy5iYWNrZW5kLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LmJpbn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5yZXNvdXJjZXN9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Imp1bml0LmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS5zZXJ2ZXIuTG9hZEZ1bmN0aW9uc1Rlc3QiIHRvZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgotICAgICAgICA8L2p1bml0PgotICAgIDwvdGFyZ2V0PgotICAgIDwhLS0gVW5pdCBUZXN0czogY29tLnNlYWd1bGxzdy51bml0dGVzdC5hcHBpbnRlcmZhY2Uuc2VydmVyLmJhY2tlbmQuaG9zdGNvbm5lY3RvcjIgIC0tPgotICAgIDx0YXJnZXQgbmFtZT0ianVuaXQuaG9zdGNvbm5lY3RvcjIiIGRlcGVuZHM9InJlcG9ydC5pbml0Ij4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KLSAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0iJHtqdW5pdC5wcmludHN1bW1hcnl9IiBmb3JrPSIke2p1bml0LmZvcmt9IiBkaXI9IiR7anVuaXQuZGlyfSIgaW5jbHVkZWFudHJ1bnRpbWU9IiR7anVuaXQuaW5jbHVkZWFudHJ1bnRpbWV9Ij4KLSAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHtqdW5pdC5mb3JtYXR0ZXJ9IiBleHRlbnNpb249IiR7anVuaXQucmVwb3J0LmV4dH0iLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1jb3JlLmphcn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iYWlzLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LmJpbn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLTUyNTAuamFyfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJqdW5pdC5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICAgICAgPHRlc3QgbmFtZT0iY29tLnNlYWd1bGxzdy51bml0dGVzdC5hcHBpbnRlcmZhY2Uuc2VydmVyLmJhY2tlbmQuaG9zdGNvbm5lY3RvcjIuQWxsVGVzdHMiIHRvZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgotICAgICAgICA8L2p1bml0PgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0ianVuaXQuYmFja2VuZC5oc2MiIGRlcGVuZHM9InJlcG9ydC5pbml0Ij4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KLSAgICAgICAgPCEtLSBUaGUgdGltZW91dCBpcyBleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzLiAtLT4KLSAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0iJHtqdW5pdC5wcmludHN1bW1hcnl9IiBmb3JrPSIke2p1bml0LmZvcmt9IiBkaXI9IiR7anVuaXQuZGlyfSIgaW5jbHVkZWFudHJ1bnRpbWU9IiR7anVuaXQuaW5jbHVkZWFudHJ1bnRpbWV9Ij4KLSAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHtqdW5pdC5mb3JtYXR0ZXJ9IiBleHRlbnNpb249IiR7anVuaXQucmVwb3J0LmV4dH0iLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1jb3JlLmphcn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iYWlzLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJqY2UuY2xhc3NwYXRoLnJ0Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy01MjUwLmphcn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLTMyNzAuamFyfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWh0dHBjbGllbnQuamFyfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LmJpbn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5yZXNvdXJjZXN9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Imp1bml0LmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS5zZXJ2ZXIuY29uZmlnLmJpbmQuY29ubmVjdG9ycy5oc2MuQWxsVGVzdHMiIHRvZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgotICAgICAgICA8L2p1bml0PgotICAgIDwvdGFyZ2V0PgotICAgIDwhLS0gVW5pdCBUZXN0czogSU1TIGJhY2stZW5kIC0tPgotICAgIDx0YXJnZXQgbmFtZT0ianVuaXQuYmFja2VuZC5pbXMiIGRlcGVuZHM9InJlcG9ydC5pbml0Ij4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KLSAgICAgICAgPCEtLSBUaGUgdGltZW91dCBpcyBleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzLiAtLT4KLSAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0iJHtqdW5pdC5wcmludHN1bW1hcnl9IiBmb3JrPSIke2p1bml0LmZvcmt9IiBkaXI9IiR7anVuaXQuZGlyfSIgaW5jbHVkZWFudHJ1bnRpbWU9IiR7anVuaXQuaW5jbHVkZWFudHJ1bnRpbWV9Ij4KLSAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHtqdW5pdC5mb3JtYXR0ZXJ9IiBleHRlbnNpb249IiR7anVuaXQucmVwb3J0LmV4dH0iLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1jb3JlLmphcn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iYWlzLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJpbXMuYmFja2VuZC5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iamNlLmNsYXNzcGF0aC5ydCIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthaXMtaW1zLmphcn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5iaW59Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QucmVzb3VyY2VzfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJqdW5pdC5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICAgICAgPHRlc3QgbmFtZT0iY29tLnNlYWd1bGxzdy5hcHBpbnRlcmZhY2Uuc2VydmVyLmNvbmZpZy5iaW5kLmNvbm5lY3RvcnMuaW1zLkFsbFRlc3RzIiB0b2Rpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KLSAgICAgICAgPC9qdW5pdD4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9Imp1bml0LmJhY2tlbmQuaW1zLmxpdmUiIGRlcGVuZHM9InJlcG9ydC5pbml0Ij4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KLSAgICAgICAgPCEtLSBUaGUgdGltZW91dCBpcyBleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzLiAtLT4KLSAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0iJHtqdW5pdC5wcmludHN1bW1hcnl9IiBmb3JrPSJ0cnVlIiB0aW1lb3V0PSI0NTAwMCIgZGlyPSIke2p1bml0LmRpcn0iIGluY2x1ZGVhbnRydW50aW1lPSIke2p1bml0LmluY2x1ZGVhbnRydW50aW1lfSI+Ci0gICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9IiR7anVuaXQuZm9ybWF0dGVyfSIgZXh0ZW5zaW9uPSIke2p1bml0LnJlcG9ydC5leHR9Ii8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthaXMtY29yZS5qYXJ9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImFpcy5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iaW1zLmJhY2tlbmQuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImpjZS5jbGFzc3BhdGgucnQiLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLWltcy5qYXJ9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QuYmlufSIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LnJlc291cmNlc30iLz4KLSAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0ianVuaXQuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICAgICAgICAgIDx0ZXN0IG5hbWU9ImNvbS5zZWFndWxsc3cuYXBwaW50ZXJmYWNlLnNlcnZlci5iYWNrZW5kLmltcy5BbGxMaXZlSW1zSWNvVGVzdHMiIHRvZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgotICAgICAgICA8L2p1bml0PgotICAgIDwvdGFyZ2V0PgotICAgIDwhLS0gVW5pdCBUZXN0czogQ0lDUyBiYWNrLWVuZCAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9Imp1bml0LmJhY2tlbmQuY2ljcyIgZGVwZW5kcz0ianVuaXQuYmFja2VuZC5jaWNzLmNvbW1vbiwganVuaXQuYmFja2VuZC5jaWNzLmN0Zy5saXZlLCBqdW5pdC5iYWNrZW5kLmNpY3MuaGIsIGp1bml0LmJhY2tlbmQuY2ljcy5oYi5saXZlIi8+Ci0gICAgPHRhcmdldCBuYW1lPSJqdW5pdC5iYWNrZW5kLmNpY3MuY29tbW9uIiBkZXBlbmRzPSJyZXBvcnQuaW5pdCI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+Ci0gICAgICAgIDxqdW5pdCBwcmludHN1bW1hcnk9IiR7anVuaXQucHJpbnRzdW1tYXJ5fSIgZm9yaz0iJHtqdW5pdC5mb3JrfSIgZGlyPSIke2p1bml0LmRpcn0iIGluY2x1ZGVhbnRydW50aW1lPSIke2p1bml0LmluY2x1ZGVhbnRydW50aW1lfSI+Ci0gICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9IiR7anVuaXQuZm9ybWF0dGVyfSIgZXh0ZW5zaW9uPSIke2p1bml0LnJlcG9ydC5leHR9Ii8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthaXMtY29yZS5qYXJ9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImFpcy5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iamNlLmNsYXNzcGF0aC5ydCIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthaXMtY2ljcy5qYXJ9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2N0Z2NsaWVudC5qYXJ9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtaHR0cGNsaWVudC5qYXJ9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtbG9nZ2luZy5qYXJ9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QuYmlufSIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LnJlc291cmNlc30iLz4KLSAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0ianVuaXQuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICAgICAgICAgIDx0ZXN0IG5hbWU9ImNvbS5zZWFndWxsc3cuYXBwaW50ZXJmYWNlLnNlcnZlci5jb25maWcuYmluZC5jb25uZWN0b3JzLmNpY3MuQWxsVGVzdHMiIHRvZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgotICAgICAgICA8L2p1bml0PgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0ianVuaXQuYmFja2VuZC5jaWNzLmN0Zy5saXZlIiBkZXBlbmRzPSJyZXBvcnQuaW5pdCI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+Ci0gICAgICAgIDwhLS0gVGhlIHRpbWVvdXQgaXMgZXhwcmVzc2VkIGluIG1pbGxpc2Vjb25kcy4gLS0+Ci0gICAgICAgIDxqdW5pdCBwcmludHN1bW1hcnk9IiR7anVuaXQucHJpbnRzdW1tYXJ5fSIgZm9yaz0idHJ1ZSIgdGltZW91dD0iNjAwMDAwIiBkaXI9IiR7anVuaXQuZGlyfSIgaW5jbHVkZWFudHJ1bnRpbWU9IiR7anVuaXQuaW5jbHVkZWFudHJ1bnRpbWV9Ij4KLSAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHtqdW5pdC5mb3JtYXR0ZXJ9IiBleHRlbnNpb249IiR7anVuaXQucmVwb3J0LmV4dH0iLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1jb3JlLmphcn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iYWlzLmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthaXMtY2ljcy5qYXJ9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2N0Z2NsaWVudC5qYXJ9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1vbnMtaHR0cGNsaWVudC5qYXJ9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QuYmlufSIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LnJlc291cmNlc30iLz4KLSAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0ianVuaXQuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICA8L2NsYXNzcGF0aD4KLSAgICAgICAgICAgIDx0ZXN0IG5hbWU9ImNvbS5zZWFndWxsc3cuYXBwaW50ZXJmYWNlLnNlcnZlci5iYWNrZW5kLmNpY3MuQWxsTGl2ZUlibUN0Z1Rlc3RzIiB0b2Rpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KLSAgICAgICAgPC9qdW5pdD4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9Imp1bml0LmJhY2tlbmQuY2ljcy5oYiIgZGVwZW5kcz0icmVwb3J0LmluaXQiPgotICAgICAgICA8bWtkaXIgZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgotICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSIke2p1bml0LnByaW50c3VtbWFyeX0iIGZvcms9IiR7anVuaXQuZm9ya30iIGRpcj0iJHtqdW5pdC5kaXJ9IiBpbmNsdWRlYW50cnVudGltZT0iJHtqdW5pdC5pbmNsdWRlYW50cnVudGltZX0iPgotICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSIke2p1bml0LmZvcm1hdHRlcn0iIGV4dGVuc2lvbj0iJHtqdW5pdC5yZXBvcnQuZXh0fSIvPgotICAgICAgICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLWNvcmUuamFyfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJhaXMuY2xhc3NwYXRoIi8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2Fpcy1jaWNzLmphcn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1odHRwY2xpZW50Lmphcn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7Y29tbW9ucy1sb2dnaW5nLmphcn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5iaW59Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QucmVzb3VyY2VzfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJqdW5pdC5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgIDwvY2xhc3NwYXRoPgotICAgICAgICAgICAgPHRlc3QgbmFtZT0iY29tLnNlYWd1bGxzdy5hcHBpbnRlcmZhY2Uuc2VydmVyLmJhY2tlbmQuY2ljcy5Ib3N0QnJpZGdlQnl0ZUJ1ZmZlclN0cmF0ZWd5VGVzdCIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ii8+Ci0gICAgICAgIDwvanVuaXQ+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJqdW5pdC5iYWNrZW5kLmNpY3MuaGIubGl2ZSIgZGVwZW5kcz0icmVwb3J0LmluaXQiPgotICAgICAgICA8bWtkaXIgZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgotICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSIke2p1bml0LnByaW50c3VtbWFyeX0iIGZvcms9InRydWUiIHRpbWVvdXQ9IjYwMDAwMCIgZGlyPSIke2p1bml0LmRpcn0iIGluY2x1ZGVhbnRydW50aW1lPSIke2p1bml0LmluY2x1ZGVhbnRydW50aW1lfSI+Ci0gICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9IiR7anVuaXQuZm9ybWF0dGVyfSIgZXh0ZW5zaW9uPSIke2p1bml0LnJlcG9ydC5leHR9Ii8+Ci0gICAgICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthaXMtY29yZS5qYXJ9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImFpcy5jbGFzc3BhdGgiLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YWlzLWNpY3MuamFyfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWh0dHBjbGllbnQuamFyfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb21tb25zLWxvZ2dpbmcuamFyfSIvPgotICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0LmJpbn0iLz4KLSAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdC5yZXNvdXJjZXN9Ii8+Ci0gICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Imp1bml0LmNsYXNzcGF0aCIvPgotICAgICAgICAgICAgPC9jbGFzc3BhdGg+Ci0gICAgICAgICAgICA8dGVzdCBuYW1lPSJjb20uc2VhZ3VsbHN3LmFwcGludGVyZmFjZS5zZXJ2ZXIuYmFja2VuZC5jaWNzLkFsbExpdmVIb3N0QnJpZGdlVGVzdHMiIHRvZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSIvPgotICAgICAgICA8L2p1bml0PgotICAgIDwvdGFyZ2V0PgotICAgIDwhLS0gQ2xlYW4gcmVwb3J0cyAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9Imp1bml0LnJlcG9ydC5jbGVhbiI+Ci0gICAgICAgIDxkZWxldGUgZGlyPSIke2p1bml0LnJlcG9ydHN9Ii8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPCEtLSBDcmVhdGUgdGhlIHVuaXQgdGVzdHMgcmVwb3J0IC0tPgotICAgIDx0YXJnZXQgbmFtZT0ianVuaXQucmVwb3J0IiBkZXBlbmRzPSJpbml0Ij4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzfSIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0ianVuaXQucmVwb3J0cy5mcmFtZXMiIGxvY2F0aW9uPSIke2p1bml0LnJlcG9ydHN9L2ZyYW1lcyIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0ianVuaXQucmVwb3J0cy5ub2ZyYW1lcyIgbG9jYXRpb249IiR7anVuaXQucmVwb3J0c30vbm9mcmFtZXMiLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLmZyYW1lc30iLz4KLSAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5yZXBvcnRzLm5vZnJhbWVzfSIvPgotICAgICAgICA8ZWNobyBsZXZlbD0iaW5mbyIgbWVzc2FnZT0iQ29tcGlsaW5nIGFsbCByZXBvcnRzIHRvICR7anVuaXQucmVwb3J0c30uLi4iLz4KLSAgICAgICAgPGp1bml0cmVwb3J0IHRvZGlyPSIke2p1bml0LnJlcG9ydHMueG1sfSI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7anVuaXQucmVwb3J0cy54bWx9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qJHtqdW5pdC5yZXBvcnQuZXh0fSIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgPHJlcG9ydCBmb3JtYXQ9Im5vZnJhbWVzIiB0b2Rpcj0iJHtqdW5pdC5yZXBvcnRzLm5vZnJhbWVzfSIvPgotICAgICAgICAgICAgPHJlcG9ydCBmb3JtYXQ9ImZyYW1lcyIgdG9kaXI9IiR7anVuaXQucmVwb3J0cy5mcmFtZXN9Ii8+Ci0gICAgICAgIDwvanVuaXRyZXBvcnQ+Ci0gICAgICAgIDxlY2hvIGxldmVsPSJpbmZvIiBtZXNzYWdlPSJUaGUgWE1MIHJlcG9ydCBpcyBpbjogJHtqdW5pdC5yZXBvcnRzLnhtbH0iLz4KLSAgICAgICAgPGVjaG8gbGV2ZWw9ImluZm8iIG1lc3NhZ2U9IlRoZSBIVE1MIHJlcG9ydCAod2l0aCBmcmFtZXMpIGlzIGluOiAke2p1bml0LnJlcG9ydHMuZnJhbWVzfSIvPgotICAgICAgICA8ZWNobyBsZXZlbD0iaW5mbyIgbWVzc2FnZT0iVGhlIEhUTUwgcmVwb3J0IChubyBmcmFtZXMpIGlzIGluOiAke2p1bml0LnJlcG9ydHMubm9mcmFtZXN9Ii8+Ci0gICAgICAgIDwhLS0gUmVuYW1lIGZpbGUgdG8gaW5kZXguaHRtbCAtLT4KLSAgICAgICAgPG1vdmUgZmlsZT0iJHtqdW5pdC5yZXBvcnRzLm5vZnJhbWVzfS9qdW5pdC1ub2ZyYW1lcy5odG1sIiB0b2ZpbGU9IiR7anVuaXQucmVwb3J0cy5ub2ZyYW1lc30vaW5kZXguaHRtbCIvPgotICAgICAgICA8IS0tIENvcHkgdGVzdCByZXBvcnRzIGhvbWUgcGFnZSAtLT4KLSAgICAgICAgPGNvcHkgZmlsZT0iJHtqdW5pdC5yZXBvcnRzLnNyY2Rpcn0vaW5kZXguaHRtbCIgdG9kaXI9IiR7cmVwb3J0cy5kaXJ9IiBvdmVyd3JpdGU9InRydWUiIGZpbHRlcmluZz0idHJ1ZSIvPgotICAgICAgICA8Y29weSB0b2Rpcj0iJHtyZXBvcnRzLmRpcn0vaW1hZ2VzIiBvdmVyd3JpdGU9InRydWUiPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2p1bml0LnJlcG9ydHMuc3JjZGlyfS9pbWFnZXMiLz4KLSAgICAgICAgPC9jb3B5PgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9InJlcG9ydC5jaGVja3N1bXMiLz4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9InJlcG9ydC5jaGVja3N1bXMiPgotICAgICAgICA8YW50Y2FsbCB0YXJnZXQ9ImNvcHktY2hlY2tzdW1zIi8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZW1wLmluZGV4IiB2YWx1ZT0iJHtyZXBvcnRzLmRpcn0vaW5kZXgtdGVtcC5odG1sIi8+Ci0gICAgICAgIDx4c2x0IGluPSIke3JlcG9ydHMuZGlyfS9pbmRleC5odG1sIiBvdXQ9IiR7dGVtcC5pbmRleH0iIGZvcmNlPSJ0cnVlIiBzdHlsZT0iJHtqdW5pdC5yZXBvcnRzLnNyY2Rpcn0vYXBwbHktZGF0YS54c2x0Ij4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJyZXBvcnREaXIiIGV4cHJlc3Npb249IiR7cmVwb3J0cy5kaXJ9Ii8+Ci0gICAgICAgIDwveHNsdD4KLSAgICAgICAgPGRlbGV0ZSBmaWxlPSIke3JlcG9ydHMuZGlyfS9pbmRleC5odG1sIi8+Ci0gICAgICAgIDxtb3ZlIGZpbGU9IiR7dGVtcC5pbmRleH0iIHRvZmlsZT0iJHtyZXBvcnRzLmRpcn0vaW5kZXguaHRtbCIvPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0ianVuaXQuamF2YXgiIGRlcGVuZHM9Imp1bml0LmphdmF4LmlvLCBqdW5pdC5qYXZheC51dGlsLCBqdW5pdC5qYXZheC5sYW5nIi8+Ci0gICAgPHRhcmdldCBuYW1lPSJqdW5pdC5zZXJ2ZXIuY29uZmlnIiBkZXBlbmRzPSJqdW5pdC5zZXJ2ZXIuY29uZmlnLmxvZywganVuaXQuc2VydmVyLmNvbmZpZy50aHJlYWRwb29sLCBqdW5pdC5zZXJ2ZXIuY29uZmlnLnRyYW5zZm9ybSwganVuaXQuc2VydmVyLmNvbmZpZy5jb3JlLCBqdW5pdC5zZXJ2ZXIuY29uZmlnLm1hbmFnZW1lbnQiLz4KLSAgICA8dGFyZ2V0IG5hbWU9Imp1bml0LnRvb2xib3giIGRlcGVuZHM9Imp1bml0LnRvb2xib3guY29uZmlnLCBqdW5pdC50b29sYm94LnhtbCwganVuaXQudG9vbGJveC5uZXQsIGp1bml0LnRvb2xib3gubG9nIi8+Ci0gICAgPHRhcmdldCBuYW1lPSJqdW5pdC5haXMtY29yZSIgZGVwZW5kcz0ianVuaXQuamF2YXgsIGp1bml0LnRvb2xib3gsIGp1bml0LnNlcnZlci5jb25maWcsIGp1bml0LmFpcy1jb3JlLnRyYW5zZm9ybXMsIGp1bml0LnNlY3VyaXR5LmF1dGgsIGp1bml0LmNyeXB0bywganVuaXQubW9kZWwsIGp1bml0LnNlcnZlciIvPgotICAgIDx0YXJnZXQgbmFtZT0ianVuaXQuYmFja2VuZCIgZGVwZW5kcz0ianVuaXQuYmFja2VuZC5oc2MsIGp1bml0LmJhY2tlbmQuaW1zLCBqdW5pdC5iYWNrZW5kLmltcy5saXZlLCBqdW5pdC5iYWNrZW5kLmNpY3MsIGp1bml0Lmhvc3Rjb25uZWN0b3IyIi8+Ci0gICAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0iUnVucyB0aGUgdGVzdHMuIiBkZXBlbmRzPSJpbml0LCB0ZXN0LmNvbXBpbGUsIGp1bml0LnJlcG9ydC5jbGVhbiwganVuaXQuYWlzLWNvcmUsIGp1bml0LmJhY2tlbmQsIGp1bml0LnJlcG9ydCIvPgotICAgIDwhLS0gQnVpbGQgYW5kIFppcCAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9InppcCIgZGVwZW5kcz0iZGlzdCIgZGVzY3JpcHRpb249IkNyZWF0ZXMgdGhlIGZpbmFsICR7emlwLWZpbGV9IChkb2VzIGl0IGFsbCkiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iemlwLWZpbGUiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vJHt6aXBGaWxlQmFzZU5hbWV9LWJ1aWxkJHtidWlsZC5pZH0uemlwIi8+Ci0gICAgICAgIDxkZWxldGUgZmlsZT0iJHt6aXAtZmlsZX0iIHF1aWV0PSJ0cnVlIi8+Ci0gICAgICAgIDx6aXAgemlwZmlsZT0iJHt6aXAtZmlsZX0iIGJhc2VkaXI9IiR7YnVpbGQuZGlzdH0iLz4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9Im5pZ2h0bHktYnVpbGQiIGRlcGVuZHM9ImluaXQsIGNsZWFuLCBkaXN0LCB2ZXJpZnksIHRlc3QiIGRlc2NyaXB0aW9uPSJDcmVhdGVzIGEgbmlnaHRseSBidWlsZCAoZG9lcyBpdCBhbGwpIj4KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Byb2plY3RPbmx5LnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvcHJvamVjdE9ubHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWVjZTViLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvcHJvamVjdE9ubHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0KLQotCi08cHJvamVjdCA+PC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvcmVmaWQueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9yZWZpZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZjRhZTEuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9yZWZpZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08cHJvamVjdCBkZWZhdWx0PSIxIj4KLQk8cGF0aCBpZD0icHJvamVjdC5jbGFzcy5wYXRoIj4KLQkJPHBhdGhlbGVtZW50IGxvY2F0aW9uPSJsaWIvIiAvPgotCQk8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9LyIgLz4KLQkJPHBhdGhlbGVtZW50IHBhdGg9IiR7YWRkaXRpb25hbC5wYXRofSIgLz4KLQk8L3BhdGg+Ci0KLQk8dGFyZ2V0IG5hbWU9IjEiPgotCQk8cGF0aCBpZD0icHJvamVjdC5jbGFzcy5wYXRoMiI+Ci0JCQk8cGF0aCByZWZpZD0icHJvamVjdC5jbGFzcy5wYXRoIiAvPgotCQk8L3BhdGg+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJjb21waWxlIj4KLQkJCTxqYXZhYyBzcmNkaXI9InNyYyIKLQkJCSAgICAgICBkZXN0ZGlyPSJkc3QiCi0JCQkgICAgICAgY2xhc3NwYXRocmVmPSIiCi0JCQkgICAgICAgc291cmNlcGF0aHJlZj0iIgotCQkJICAgICAgIGJvb3RjbGFzc3BhdGhyZWY9IiIKLQkJCSAgICAgICBkZWJ1Zz0ib24iIC8+Ci0JCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0gImRlcGVuZHMiIGRlcGVuZHM9IiBjb21waWxlICAsIDEgIj4KLQk8L3RhcmdldD4KLQkKLQk8cHJvcGVydHkgbmFtZT0ibmFtZSB3aXRoIHNwYWNlcyIgdmFsdWU9InZhbHVlIHdpdGggc3BhY2VzIi8+Ci0KLQkKLQk8ZmlsZXNldCBkaXI9ImRpciIgaWQ9ImZpbGVzZXRUZXN0Ij4KLQkgICAgPGluY2x1ZGUgbmFtZT0iaW5jbHVkZSIvPgotCSAgICA8ZXhjbHVkZSBuYW1lPSJleGNsdWRlIi8+Ci0JPC9maWxlc2V0PgotCQotCTxwYXR0ZXJuc2V0IGlkPSJwYXR0ZXJuU2V0VGVzdCI+Ci0JCQk8aW5jbHVkZSBuYW1lPSIqLnhtbCIvPgotCQkJPGV4Y2x1ZGUgbmFtZT0iKiovKlRlc3QqIi8+Ci0JPC9wYXR0ZXJuc2V0PgotCQotCTxwYXR0ZXJuc2V0IGlkPSJwYXR0ZXJuU2V0VGVzdEJhZCI+Ci0JCTxpbmNsdWRlc2ZpbGUgbmFtZT0ibm90aGVyZSIvPgotCTwvcGF0dGVybnNldD4KLQotCTxlY2hvPiR7bmFtZSB3aXRoIHNwYWNlc308L2VjaG8+Ci0JCi0JPGZpbGVzZXQgcmVmaWQ9ImZpbGVzZXRUZXN0Ij4KLQkJPHBhdHRlcm5zZXQgcmVmaWQ9InBhdHRlcm5TZXRUZXN0Ij48L3BhdHRlcm5zZXQ+Ci0JCTxwYXR0ZXJuc2V0IHJlZmlkPSJwYXR0ZXJuU2V0VGVzdEJhZCI+PC9wYXR0ZXJuc2V0PgotCTwvZmlsZXNldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3J1c3NpYW5idWlsZC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3J1c3NpYW5idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NTM1NjYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9ydXNzaWFuYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ3aW5kb3dzLTEyNTEiPz4KLTxwcm9qZWN0IG5hbWU9InRlc3QiIGRlZmF1bHQ9ImluaXQiIGJhc2VkaXI9Ii4iPgotCi0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPCEtLSBkaXNwbGF5cyBIZWxsbyBpbiBSdXNzaWFuIC0tPgotCQk8ZWNobyBtZXNzYWdlPSLDh8Okw7DDoMOiw7HDssOiw7PDqcOyw6UiLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rhc2tkZWYueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90YXNrZGVmLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxMmI3MS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rhc2tkZWYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPHByb2plY3QgZGVmYXVsdD0idHlwZSI+Ci0KLQk8dGFza2RlZiBuYW1lPSJtaW5lIiBjbGFzc25hbWU9Im9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5zdXBwb3J0LnRhc2tzLkFudFRlc3RUYXNrIiBjbGFzc3BhdGg9ImFudFVJVGVzdHNTdXBwb3J0LmphciI+Ci0JPC90YXNrZGVmPgotCi0JPHRhcmdldCBuYW1lPSJ0eXBlIj4KLQotCTwvdGFyZ2V0PgotCi0JPG1pbmU+PC9taW5lPgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvdGVzdDEueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90ZXN0MS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNjBhMzIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90ZXN0MS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0KLTxibGE+Ci0gIDxibHViPjwvYmx1Yj4KLSAgPGtsaWNrPgotICAgIDxndXJnZWw+PC9ndXJnZWw+Ci0gICAgPGhhbAotICAgIDxrbGFjay8+Ci0gICAgPGh1bXBmLz4KLSAgPC9rbGljaz4KLTwvYmxhPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvdGVzdDIueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90ZXN0Mi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYTg3NjUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90ZXN0Mi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxibGE+Ci0gIDxibHViPjwvYmx1Yj4KLSAgPGtsaWNrPgotICAgIDxndXJnZWw+PC9ndXJnZWw+Ci0gICAgPGhhbD48L2hhbD4KLSAgICA8a2xhY2svPgotICAgIDxodW1wZi8+Ci0gIDwva2xpY2s+Ci08L2JsYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rlc3QzLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvdGVzdDMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQwODhlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvdGVzdDMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08YmxhPgotICA8Ymx1Yj4KLSAgPC9ibHViPgotPC8KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvdGVzdDQueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90ZXN0NC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNjBmNzkuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90ZXN0NC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08dGFyZ2V0IG5hbWU9Im1haW4iPjxtawpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvdGVzdDUueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90ZXN0NS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOTdkOTUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90ZXN0NS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9Im1haW4iPgotCTx0YXJnZXQgbmFtZT0iYmxhIiAvPgotCTxwcm9wZXJ0eSBuYW1lPSJwcm9wMSIgdmFsdWU9InZhbDEiLz4KLQk8cHJvcGVydHkgbmFtZT0icHJvcDIiIHZhbHVlPSJ2YWwyIi8+Ci0JPHByb3BlcnR5IG5hbWU9InByb3AzIiB2YWx1ZT0idmFsMyIvPgotPGcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3RvQmVJbXBvcnRlZC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3RvQmVJbXBvcnRlZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMDNmODAuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90b0JlSW1wb3J0ZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08cHJvamVjdCBuYW1lPSJ0b0JlSW1wb3J0ZWQiIGRlZmF1bHQ9ImltcG9ydC1kZWZhdWx0Ij4KLQotCTx0YXJnZXQgbmFtZT0iaW1wb3J0LWRlZmF1bHQiIGRlcGVuZHM9ImRlcGVuZHMiPgotCQk8ZWNobz5pbXBvcnQtZGVmYXVsdDwvZWNobz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iZGVwZW5kcyI+Ci0JCTxlY2hvPmRlcGVuZHM8L2VjaG8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+Ci0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvdG9CZUltcG9ydGVkV2l0aEJ5dGVPcmRlck1hcmsueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90b0JlSW1wb3J0ZWRXaXRoQnl0ZU9yZGVyTWFyay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMGE4YmEuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90b0JlSW1wb3J0ZWRXaXRoQnl0ZU9yZGVyTWFyay54bWwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RyZXNvdXJjZXMvVGVzdDIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdHJlc291cmNlcy9UZXN0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDdjNDY4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdHJlc291cmNlcy9UZXN0Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDIxLCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0MiB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oInByZVJ1bnRlc3QiKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpLy5jbGFzc3BhdGggYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMWFmM2IuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iQW50IFRvb2xzIFN1cHBvcnQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9ImFudF9ydW5uZXJfc3VwcG9ydF9iaW4iIHBhdGg9IkFudCBSdW5uZXIgU3VwcG9ydCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IkFudCBFZGl0b3IiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBvdXRwdXQ9InJlbW90ZV9zdXBwb3J0X2JpbiIgcGF0aD0iUmVtb3RlIEFudCBTdXBwb3J0Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpLy5leHRlcm5hbFRvb2xCdWlsZGVycy9CdWlsZCBBbnQgUnVubmVyIFN1cHBvcnQgSkFSLmxhdW5jaCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0J1aWxkIEFudCBSdW5uZXIgU3VwcG9ydCBKQVIubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzY3NzlkLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0J1aWxkIEFudCBSdW5uZXIgU3VwcG9ydCBKQVIubGF1bmNoCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLmFudC5BbnRCdWlsZGVyTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BVFRSX0xBVU5DSF9JTl9CQUNLR1JPVU5EIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5ERUZBVUxUX0NMQVNTUEFUSCIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuYW50LnVpLkRFRkFVTFRfVk1fSU5TVEFMTCIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1JVTl9CVUlMRF9LSU5EUyIgdmFsdWU9ImZ1bGwsaW5jcmVtZW50YWwsYXV0byxjbGVhbiIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5hbnQudWkuQVRUUl9UQVJHRVRTX1VQREFURUQiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9UUklHR0VSU19DT05GSUdVUkVEIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuQ0xBU1NQQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LnVpLkFudENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkudGFyZ2V0X3J1bl9wZXJzcGVjdGl2ZSIgdmFsdWU9InBlcnNwZWN0aXZlX25vbmUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5hbnQudWkuQVRUUl9BTlRfQ0xFQU5fVEFSR0VUUyIgdmFsdWU9ImNsZWFuLCIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9CVUlMRF9TQ09QRSIgdmFsdWU9IiR7d29ya2luZ19zZXQ6Jmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7VVRGLTgmcXVvdDs/Jmd0OyYjMTA7Jmx0O2xhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nU2V0IGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JraW5nU2V0RmFjdG9yeSZxdW90OyBuYW1lPSZxdW90O3dvcmtpbmdTZXQmcXVvdDsgZWRpdFBhZ2VJZD0mcXVvdDtvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVdvcmtpbmdTZXRQYWdlJnF1b3Q7Jmd0OyYjMTA7Jmx0O2l0ZW0gZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLm1vZGVsLlJlc291cmNlRmFjdG9yeSZxdW90OyBwYXRoPSZxdW90Oy9vcmcuZWNsaXBzZS5hbnQudWkvQ29tbW9uIEFudCBTdXBwb3J0JnF1b3Q7IHR5cGU9JnF1b3Q7MiZxdW90Oy8mZ3Q7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC51aS9BbnQgUnVubmVyIFN1cHBvcnQmcXVvdDsgdHlwZT0mcXVvdDsyJnF1b3Q7LyZndDsmIzEwOyZsdDtpdGVtIGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5tb2RlbC5SZXNvdXJjZUZhY3RvcnkmcXVvdDsgcGF0aD0mcXVvdDsvb3JnLmVjbGlwc2UuYW50LnVpL2J1aWxkZmlsZXMvYnVpbGRFeHRyYUpBUi54bWwmcXVvdDsgdHlwZT0mcXVvdDsxJnF1b3Q7LyZndDsmIzEwOyZsdDsvbGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQmZ3Q7JiMxMDt9Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5BVFRSX1JFRlJFU0hfU0NPUEUiIHZhbHVlPSIke3Byb2plY3R9Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0xPQ0FUSU9OIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jOi9vcmcuZWNsaXBzZS5hbnQudWkvYnVpbGRmaWxlcy9idWlsZEV4dHJhSkFSLnhtbH0iLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuQVRUUl9SVU5fSU5fQkFDS0dST1VORCIgdmFsdWU9ImZhbHNlIi8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpLy5leHRlcm5hbFRvb2xCdWlsZGVycy9CdWlsZCBSZW1vdGUgQW50IEpBUi5sYXVuY2ggYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpLy5leHRlcm5hbFRvb2xCdWlsZGVycy9CdWlsZCBSZW1vdGUgQW50IEpBUi5sYXVuY2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYzU4MTQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvQnVpbGQgUmVtb3RlIEFudCBKQVIubGF1bmNoCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLmFudC5BbnRCdWlsZGVyTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BVFRSX0xBVU5DSF9JTl9CQUNLR1JPVU5EIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5ERUZBVUxUX0NMQVNTUEFUSCIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuYW50LnVpLkRFRkFVTFRfVk1fSU5TVEFMTCIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1JVTl9CVUlMRF9LSU5EUyIgdmFsdWU9ImZ1bGwsaW5jcmVtZW50YWwsYXV0byxjbGVhbiIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5hbnQudWkuQVRUUl9UQVJHRVRTX1VQREFURUQiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9UUklHR0VSU19DT05GSUdVUkVEIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuQ0xBU1NQQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LnVpLkFudENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0JVSUxEX1NDT1BFIiB2YWx1ZT0iJHt3b3JraW5nX3NldDombHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDtVVEYtOCZxdW90Oz8mZ3Q7JiMxMDsmbHQ7bGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQgZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtpbmdTZXRGYWN0b3J5JnF1b3Q7IG5hbWU9JnF1b3Q7d29ya2luZ1NldCZxdW90OyBlZGl0UGFnZUlkPSZxdW90O29yZy5lY2xpcHNlLnVpLnJlc291cmNlV29ya2luZ1NldFBhZ2UmcXVvdDsmZ3Q7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC51aS9idWlsZGZpbGVzL2J1aWxkUmVtb3RlRXh0cmFKQVIueG1sJnF1b3Q7IHR5cGU9JnF1b3Q7MSZxdW90Oy8mZ3Q7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC51aS9Db21tb24gQW50IFN1cHBvcnQmcXVvdDsgdHlwZT0mcXVvdDsyJnF1b3Q7LyZndDsmIzEwOyZsdDtpdGVtIGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5tb2RlbC5SZXNvdXJjZUZhY3RvcnkmcXVvdDsgcGF0aD0mcXVvdDsvb3JnLmVjbGlwc2UuYW50LnVpL1JlbW90ZSBBbnQgU3VwcG9ydCZxdW90OyB0eXBlPSZxdW90OzImcXVvdDsvJmd0OyYjMTA7Jmx0Oy9sYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ1NldCZndDsmIzEwO30iLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5hbnQudWkuQVRUUl9BTlRfQ0xFQU5fVEFSR0VUUyIgdmFsdWU9ImNsZWFuLCIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuQVRUUl9SRUZSRVNIX1NDT1BFIiB2YWx1ZT0iJHtwcm9qZWN0fSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9MT0NBVElPTiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvYzovb3JnLmVjbGlwc2UuYW50LnVpL2J1aWxkZmlsZXMvYnVpbGRSZW1vdGVFeHRyYUpBUi54bWx9Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkFUVFJfUlVOX0lOX0JBQ0tHUk9VTkQiIHZhbHVlPSJmYWxzZSIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS8ucHJvamVjdCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YTU4ZjYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmFudC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuRXh0ZXJuYWxUb29sQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+TGF1bmNoQ29uZmlnSGFuZGxlPC9rZXk+Ci0JCQkJCTx2YWx1ZT4mbHQ7cHJvamVjdCZndDsvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0J1aWxkIEFudCBSdW5uZXIgU3VwcG9ydCBKQVIubGF1bmNoPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuRXh0ZXJuYWxUb29sQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+TGF1bmNoQ29uZmlnSGFuZGxlPC9rZXk+Ci0JCQkJCTx2YWx1ZT4mbHQ7cHJvamVjdCZndDsvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0J1aWxkIFJlbW90ZSBBbnQgSkFSLmxhdW5jaDwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLmFwaS50b29scy5hcGlBbmFseXNpc0J1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlLmN2c25hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTQ0MTZmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jRnJpIEphbiAyMSAxOTo0MDo1MiBHTVQtMDg6MDAgMjAwNQ0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotc2VsZmhvc3RpbmcuYmluRXhjbHVkZXM9L29yZy5lY2xpcHNlLmFudC51aS9hbnRfcnVubmVyX3N1cHBvcnRfYmluLC9vcmcuZWNsaXBzZS5hbnQudWkvY29tbW9uX2FudF9zdXBwb3J0X2Jpbiwvb3JnLmVjbGlwc2UuYW50LnVpL3JlbW90ZV9zdXBwb3J0X2Jpbg0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvciBDb250ZW50IEFzc2lzdCBEZXYvWERPQ3Rhc2tzLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvciBDb250ZW50IEFzc2lzdCBEZXYvWERPQ3Rhc2tzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgyMDc1ZS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3IgQ29udGVudCBBc3Npc3QgRGV2L1hET0N0YXNrcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODY4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHRhc2tzPgotPHRhc2sgbmFtZT0iYW50IiBjYXRlZ29yeT0iY29udHJvbCIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQW50IgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtCdWlsZCBhIHN1Yi1wcm9qZWN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtCdWlsZCBhIHN1Yi1wcm9qZWN0LgotCi0gIDxwcmU+Ci0gICZsdDt0YXJnZXQgbmFtZT0mcXVvdDtmb28mcXVvdDsgZGVwZW5kcz0mcXVvdDtpbml0JnF1b3Q7Jmd0OwotICAgICZsdDthbnQgYW50ZmlsZT0mcXVvdDtidWlsZC54bWwmcXVvdDsgdGFyZ2V0PSZxdW90O2JhciZxdW90OyAmZ3Q7Ci0gICAgICAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtwcm9wZXJ0eTEmcXVvdDsgdmFsdWU9JnF1b3Q7YWFhYWEmcXVvdDsgLyZndDsKLSAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O2ZvbyZxdW90OyB2YWx1ZT0mcXVvdDtiYXomcXVvdDsgLyZndDsKLSAgICAmbHQ7L2FudCZndDs8L1NQQU4+Ci0gICZsdDsvdGFyZ2V0Jmd0OzwvU1BBTj4KLQotICAmbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7YmFyJnF1b3Q7IGRlcGVuZHM9JnF1b3Q7aW5pdCZxdW90OyZndDsKLSAgICAmbHQ7ZWNobyBtZXNzYWdlPSZxdW90O3Byb3AgaXMgJHtwcm9wZXJ0eTF9ICR7Zm9vfSZxdW90OyAvJmd0OwotICAmbHQ7L3RhcmdldCZndDsKLSA8L3ByZT5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImFudGZpbGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgYnVpbGRmaWxlIHRvIHVzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGJ1aWxkZmlsZSB0byB1c2UuCi0gRGVmYXVsdHMgdG8gImJ1aWxkLnhtbCIuIFRoaXMgZmlsZSBpcyBleHBlY3RlZCB0byBiZSBhIGZpbGVuYW1lIHJlbGF0aXZlCi0gdG8gdGhlIGRpciBhdHRyaWJ1dGUgZ2l2ZW4uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGRpcmVjdG9yeSB0byB1c2UgYXMgYSBiYXNlIGRpcmVjdG9yeSBmb3IgdGhlIG5ldyBBbnQgcHJvamVjdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGRpcmVjdG9yeSB0byB1c2UgYXMgYSBiYXNlIGRpcmVjdG9yeSBmb3IgdGhlIG5ldyBBbnQgcHJvamVjdC4KLSBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBwcm9qZWN0J3MgYmFzZWRpciwgdW5sZXNzIGluaGVyaXRhbGwKLSBoYXMgYmVlbiBzZXQgdG8gZmFsc2UsIGluIHdoaWNoIGNhc2UgaXQgZG9lc24ndCBoYXZlIGEgZGVmYXVsdAotIHZhbHVlLiBUaGlzIHdpbGwgb3ZlcnJpZGUgdGhlIGJhc2VkaXIgc2V0dGluZyBvZiB0aGUgY2FsbGVkIHByb2plY3QuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5oZXJpdGFsbCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBwYXNzIGFsbCBwcm9wZXJ0aWVzIHRvIHRoZSBuZXcgQW50IHByb2plY3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIHBhc3MgYWxsIHByb3BlcnRpZXMgdG8gdGhlIG5ldyBBbnQgcHJvamVjdC4KLSBEZWZhdWx0cyB0byB0cnVlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImluaGVyaXRyZWZzIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHBhc3MgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIG5ldyBBbnQgcHJvamVjdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgcGFzcyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgbmV3IEFudCBwcm9qZWN0LgotIERlZmF1bHRzIHRvIGZhbHNlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im91dHB1dCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZpbGVuYW1lIHRvIHdyaXRlIHRoZSBvdXRwdXQgdG8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEZpbGVuYW1lIHRvIHdyaXRlIHRoZSBvdXRwdXQgdG8uCi0gVGhpcyBpcyByZWxhdGl2ZSB0byB0aGUgdmFsdWUgb2YgdGhlIGRpciBhdHRyaWJ1dGUKLSBpZiBpdCBoYXMgYmVlbiBzZXQgb3IgdG8gdGhlIGJhc2UgZGlyZWN0b3J5IG9mIHRoZQotIGN1cnJlbnQgcHJvamVjdCBvdGhlcndpc2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHRhcmdldCBvZiB0aGUgbmV3IEFudCBwcm9qZWN0IHRvIGV4ZWN1dGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSB0YXJnZXQgb2YgdGhlIG5ldyBBbnQgcHJvamVjdCB0byBleGVjdXRlLgotIERlZmF1bHRzIHRvIHRoZSBuZXcgcHJvamVjdCdzIGRlZmF1bHQgdGFyZ2V0LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0icmVmZXJlbmNlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BbnQuUmVmZXJlbmNlIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtSZWZlcmVuY2UgZWxlbWVudCBpZGVudGlmeWluZyBhIGRhdGEgdHlwZSB0byBjYXJyeQotIG92ZXIgdG8gdGhlIG5ldyBwcm9qZWN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtSZWZlcmVuY2UgZWxlbWVudCBpZGVudGlmeWluZyBhIGRhdGEgdHlwZSB0byBjYXJyeQotIG92ZXIgdG8gdGhlIG5ldyBwcm9qZWN0Ll1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUHJvcGVydHkiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9InNlZSAmbHQ7cHJvcGVydHkmZ3Q7IgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUHJvcGVydHkgdG8gcGFzcyB0byB0aGUgbmV3IHByb2plY3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW1Byb3BlcnR5IHRvIHBhc3MgdG8gdGhlIG5ldyBwcm9qZWN0LgotIFRoZSBwcm9wZXJ0eSBpcyBwYXNzZWQgYXMgYSAndXNlciBwcm9wZXJ0eSddXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJhbnRjYWxsIiBjYXRlZ29yeT0iY29udHJvbCIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ2FsbFRhcmdldCIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2FsbCBhbm90aGVyIHRhcmdldCBpbiB0aGUgc2FtZSBwcm9qZWN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtDYWxsIGFub3RoZXIgdGFyZ2V0IGluIHRoZSBzYW1lIHByb2plY3QuCi0KLSAgPHByZT4KLSAgICAmbHQ7dGFyZ2V0IG5hbWU9ImZvbyImZ3Q7Ci0gICAgICAmbHQ7YW50Y2FsbCB0YXJnZXQ9ImJhciImZ3Q7Ci0gICAgICAgICZsdDtwYXJhbSBuYW1lPSJwcm9wZXJ0eTEiIHZhbHVlPSJhYWFhYSIgLyZndDsKLSAgICAgICAgJmx0O3BhcmFtIG5hbWU9ImZvbyIgdmFsdWU9ImJheiIgLyZndDsKLSAgICAgICAmbHQ7L2FudGNhbGwmZ3Q7Ci0gICAgJmx0Oy90YXJnZXQmZ3Q7Ci0KLSAgICAmbHQ7dGFyZ2V0IG5hbWU9ImJhciIgZGVwZW5kcz0iaW5pdCImZ3Q7Ci0gICAgICAmbHQ7ZWNobyBtZXNzYWdlPSJwcm9wIGlzICR7cHJvcGVydHkxfSAke2Zvb30iIC8mZ3Q7Ci0gICAgJmx0Oy90YXJnZXQmZ3Q7Ci0gPC9wcmU+Ci0KLSA8cD5UaGlzIG9ubHkgd29ya3MgYXMgZXhwZWN0ZWQgaWYgbmVpdGhlciBwcm9wZXJ0eTEgbm9yIGZvbyBhcmUKLSBkZWZpbmVkIGluIHRoZSBwcm9qZWN0IGl0c2VsZi5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImluaGVyaXRhbGwiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgcGFzcyBhbGwgcHJvcGVydGllcyB0byB0aGUgbmV3IEFudCBwcm9qZWN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCBwYXNzIGFsbCBwcm9wZXJ0aWVzIHRvIHRoZSBuZXcgQW50IHByb2plY3QuCi0gRGVmYXVsdHMgdG8gdHJ1ZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmhlcml0cmVmcyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBwYXNzIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBuZXcgQW50IHByb2plY3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIHBhc3MgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIG5ldyBBbnQgcHJvamVjdC4KLSBEZWZhdWx0cyB0byBmYWxzZQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RhcmdldCB0byBleGVjdXRlLCByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGFyZ2V0IHRvIGV4ZWN1dGUsIHJlcXVpcmVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0icmVmZXJlbmNlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BbnQuUmVmZXJlbmNlIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtSZWZlcmVuY2UgZWxlbWVudCBpZGVudGlmeWluZyBhIGRhdGEgdHlwZSB0byBjYXJyeQotIG92ZXIgdG8gdGhlIGludm9rZWQgdGFyZ2V0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtSZWZlcmVuY2UgZWxlbWVudCBpZGVudGlmeWluZyBhIGRhdGEgdHlwZSB0byBjYXJyeQotIG92ZXIgdG8gdGhlIGludm9rZWQgdGFyZ2V0Ll1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJwYXJhbSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUHJvcGVydHkiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9InNlZSAmbHQ7cHJvcGVydHkmZ3Q7IgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUHJvcGVydHkgdG8gcGFzcyB0byB0aGUgaW52b2tlZCB0YXJnZXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW1Byb3BlcnR5IHRvIHBhc3MgdG8gdGhlIGludm9rZWQgdGFyZ2V0Ll1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9ImFudGxyIiBjYXRlZ29yeT0ib3RoZXIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLkFOVExSIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJbnZva2VzIHRoZSBBTlRMUiBUcmFuc2xhdG9yIGdlbmVyYXRvciBvbiBhIGdyYW1tYXIgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbSW52b2tlcyB0aGUgQU5UTFIgVHJhbnNsYXRvciBnZW5lcmF0b3Igb24gYSBncmFtbWFyIGZpbGUuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWJ1ZyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRvIGVuYWJsZSBQYXJzZVZpZXcgZGVidWdnaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIGEgZmxhZyB0byBlbmFibGUgUGFyc2VWaWV3IGRlYnVnZ2luZwotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRpYWdub3N0aWMiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmxhZyB0byBlbWl0IGRpYWdub3N0aWMgdGV4dC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyBhIGZsYWcgdG8gZW1pdCBkaWFnbm9zdGljIHRleHQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIHByb2Nlc3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB0aGUgcHJvY2VzcwotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImdsaWIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIGFuIG9wdGlvbmFsIHN1cGVyIGdyYW1tYXIgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyBhbiBvcHRpb25hbCBzdXBlciBncmFtbWFyIGZpbGUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaHRtbCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBlbWl0IGh0bWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGVtaXQgaHRtbAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im91dHB1dGRpcmVjdG9yeSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBkaXJlY3RvcnkgdG8gd3JpdGUgdGhlIGdlbmVyYXRlZCBmaWxlcyB0by5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGRpcmVjdG9yeSB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIHRvLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldCIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBncmFtbWFyIGZpbGUgdG8gcHJvY2Vzcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGdyYW1tYXIgZmlsZSB0byBwcm9jZXNzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRyYWNlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGVuYWJsZXMgYWxsIHRyYWNpbmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGVuYWJsZXMgYWxsIHRyYWNpbmcuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHJhY2VsZXhlciIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBlbmFibGVzIGxleGVyIHRyYWNpbmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGVuYWJsZXMgbGV4ZXIgdHJhY2luZy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0cmFjZXBhcnNlciIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBlbmFibGVzIHBhcnNlciB0cmFjaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCBlbmFibGVzIHBhcnNlciB0cmFjaW5nLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRyYWNldHJlZXdhbGtlciIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRvIGFsbG93IHRoZSB1c2VyIHRvIGVuYWJsZSB0cmVlIHdhbGtlciB0cmFjaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIGEgZmxhZyB0byBhbGxvdyB0aGUgdXNlciB0byBlbmFibGUgdHJlZSB3YWxrZXIgdHJhY2luZwotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIGNsYXNzcGF0aCB0byBiZSBzZXQKLSBiZWNhdXNlIGEgZGlyZWN0b3J5IG1pZ2h0IGJlIGdpdmVuIGZvciBBbnRsciBkZWJ1Zy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIGNsYXNzcGF0aCB0byBiZSBzZXQKLSBiZWNhdXNlIGEgZGlyZWN0b3J5IG1pZ2h0IGJlIGdpdmVuIGZvciBBbnRsciBkZWJ1Zy5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0ianZtYXJnIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZS5Bcmd1bWVudCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIG5ldyBKVk0gYXJndW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBuZXcgSlZNIGFyZ3VtZW50Ll1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9ImFudHN0cnVjdHVyZSIgY2F0ZWdvcnk9InhtbCIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQW50U3RydWN0dXJlIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGVzIGEgcGFydGlhbCBEVEQgZm9yIEFudCBmcm9tIHRoZSBjdXJyZW50bHkga25vd24gdGFza3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0NyZWF0ZXMgYSBwYXJ0aWFsIERURCBmb3IgQW50IGZyb20gdGhlIGN1cnJlbnRseSBrbm93biB0YXNrcy5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im91dHB1dCIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBvdXRwdXQgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIG91dHB1dCBmaWxlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJhcHBseSIgY2F0ZWdvcnk9ImNvbnRyb2wiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGVPbiIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRXhlY3V0ZXMgYSBnaXZlbiBjb21tYW5kLCBzdXBwbHlpbmcgYSBzZXQgb2YgZmlsZXMgYXMgYXJndW1lbnRzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtFeGVjdXRlcyBhIGdpdmVuIGNvbW1hbmQsIHN1cHBseWluZyBhIHNldCBvZiBmaWxlcyBhcyBhcmd1bWVudHMuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhcHBlbmQiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciBvdXRwdXQgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIG9yIG92ZXJ3cml0ZSBhbiBleGlzdGluZyBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBXaGV0aGVyIG91dHB1dCBzaG91bGQgYmUgYXBwZW5kZWQgdG8gb3Igb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGZpbGUuCi0gRGVmYXVsdHMgdG8gZmFsc2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdCIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBkaXJlY3Rvcnkgd2hlcmUgdGFyZ2V0IGZpbGVzIGFyZSB0byBiZSBwbGFjZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBkaXJlY3Rvcnkgd2hlcmUgdGFyZ2V0IGZpbGVzIGFyZSB0byBiZSBwbGFjZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHRoZSBwcm9jZXNzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIHByb2Nlc3MuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXhlY3V0YWJsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBjb21tYW5kIHRvIGV4ZWN1dGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbGlmZXhlY3V0aW9uZmFpbHMiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3RvcCB0aGUgYnVpbGQgaWYgcHJvZ3JhbSBjYW5ub3QgYmUgc3RhcnRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU3RvcCB0aGUgYnVpbGQgaWYgcHJvZ3JhbSBjYW5ub3QgYmUgc3RhcnRlZC4gRGVmYXVsdHMgdG8gdHJ1ZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGYWlsIGlmIHRoZSBjb21tYW5kIGV4aXRzIHdpdGggYSBub24temVybyByZXR1cm4gY29kZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgRmFpbCBpZiB0aGUgY29tbWFuZCBleGl0cyB3aXRoIGEgbm9uLXplcm8gcmV0dXJuIGNvZGUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmV3ZW52aXJvbm1lbnQiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRG8gbm90IHByb3BhZ2F0ZSBvbGQgZW52aXJvbm1lbnQgd2hlbiBuZXcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzcGVjaWZpZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIERvIG5vdCBwcm9wYWdhdGUgb2xkIGVudmlyb25tZW50IHdoZW4gbmV3IGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc3BlY2lmaWVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im9zIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTGlzdCBvZiBvcGVyYXRpbmcgc3lzdGVtcyBvbiB3aGljaCB0aGUgY29tbWFuZCBtYXkgYmUgZXhlY3V0ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIExpc3Qgb2Ygb3BlcmF0aW5nIHN5c3RlbXMgb24gd2hpY2ggdGhlIGNvbW1hbmQgbWF5IGJlIGV4ZWN1dGVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im91dHB1dCIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZpbGUgdGhlIG91dHB1dCBvZiB0aGUgcHJvY2VzcyBpcyByZWRpcmVjdGVkIHRvLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBGaWxlIHRoZSBvdXRwdXQgb2YgdGhlIHByb2Nlc3MgaXMgcmVkaXJlY3RlZCB0by4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdXRwdXRwcm9wZXJ0eSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Byb3BlcnR5IG5hbWUgd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHNldCB0byB0aGUgb3V0cHV0IG9mCi0gdGhlIHByb2Nlc3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFByb3BlcnR5IG5hbWUgd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHNldCB0byB0aGUgb3V0cHV0IG9mCi0gdGhlIHByb2Nlc3MuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFyYWxsZWwiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgcnVuIHRoZSBjb21tYW5kIG9ubHkgb25jZSwgYXBwZW5kaW5nIGFsbCBmaWxlcyBhcyBhcmd1bWVudHMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIHJ1biB0aGUgY29tbWFuZCBvbmx5IG9uY2UsIGFwcGVuZGluZyBhbGwgZmlsZXMgYXMgYXJndW1lbnRzLgotIElmIGZhbHNlLCBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgb25jZSBmb3IgZXZlcnkgZmlsZS4gRGVmYXVsdHMgdG8gZmFsc2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVsYXRpdmUiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciB0aGUgZmlsZW5hbWVzIHNob3VsZCBiZSBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZSBhcwotIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGhuYW1lcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgV2hldGhlciB0aGUgZmlsZW5hbWVzIHNob3VsZCBiZSBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZSBhcwotIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGhuYW1lcy4gUGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlCi0gZGlyZWN0b3J5IG9mIHRoZSBjb3JyZXNwb25kaW5nIGZpbGVzZXQgZm9yIHNvdXJjZSBmaWxlcyBvciB0aGUKLSBkZXN0IGF0dHJpYnV0ZSBmb3IgdGFyZ2V0IGZpbGVzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InJlc3VsdHByb3BlcnR5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSBpbiB3aGljaCB0aGUgcmV0dXJuIGNvZGUgb2YgdGhlCi0gY29tbWFuZCBzaG91bGQgYmUgc3RvcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSByZXR1cm4gY29kZSBvZiB0aGUKLSBjb21tYW5kIHNob3VsZCBiZSBzdG9yZWQuIE9ubHkgb2YgaW50ZXJlc3QgaWYgZmFpbG9uZXJyb3I9ZmFsc2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2tpcGVtcHR5ZmlsZXNldHMiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgbm8gc291cmNlIGZpbGVzIGhhdmUgYmVlbiBmb3VuZCBvciBhcmUgbmV3ZXIgdGhhbiB0aGVpcgotIGNvcnJlc3BvbmRpbmcgdGFyZ2V0IGZpbGVzLCBkbyBub3QgcnVuIHRoZSBjb21tYW5kLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiBubyBzb3VyY2UgZmlsZXMgaGF2ZSBiZWVuIGZvdW5kIG9yIGFyZSBuZXdlciB0aGFuIHRoZWlyCi0gY29ycmVzcG9uZGluZyB0YXJnZXQgZmlsZXMsIGRvIG5vdCBydW4gdGhlIGNvbW1hbmQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZU9uLkZpbGVEaXJCb3RoIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O2ZpbGUmcXVvdDssICZxdW90O2RpciZxdW90OywgJnF1b3Q7Ym90aCZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciB0aGUgY29tbWFuZCB3b3JrcyBvbmx5IG9uIGZpbGVzLCBkaXJlY3RvcmllcyBvciBib3RoPy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgV2hldGhlciB0aGUgY29tbWFuZCB3b3JrcyBvbmx5IG9uIGZpbGVzLCBkaXJlY3RvcmllcyBvciBib3RoPwotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZtbGF1bmNoZXIiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgbGF1bmNoIG5ldyBwcm9jZXNzIHdpdGggVk0sIG90aGVyd2lzZSB1c2UgdGhlIE9TJ3Mgc2hlbGwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGxhdW5jaCBuZXcgcHJvY2VzcyB3aXRoIFZNLCBvdGhlcndpc2UgdXNlIHRoZSBPUydzIHNoZWxsLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0iZW52IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnZpcm9ubWVudC5WYXJpYWJsZSIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBsYXVuY2hlZCBwcm9jZXNzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGQgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIGxhdW5jaGVkIHByb2Nlc3MuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGVzZXQiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2UgZmlsZXMgdG8gb3BlcmF0ZSB1cG9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtTb3VyY2UgZmlsZXMgdG8gb3BlcmF0ZSB1cG9uLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJhcmciIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lLkFyZ3VtZW50IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgY29tbWFuZC1saW5lIGFyZ3VtZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgY29tbWFuZC1saW5lIGFyZ3VtZW50Ll1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJtYXBwZXIiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLk1hcHBlciIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iTWFwcGVyIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTWFwcGVyIHRvIHVzZSBmb3IgbWFwcGluZyBzb3VyY2UgZmlsZXMgdG8gdGFyZ2V0IGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtNYXBwZXIgdG8gdXNlIGZvciBtYXBwaW5nIHNvdXJjZSBmaWxlcyB0byB0YXJnZXQgZmlsZXMuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9InNyY2ZpbGUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lLk1hcmtlciIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTWFya2VyIHRoYXQgaW5kaWNhdGVzIHdoZXJlIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBzaG91bGQKLSBiZSBwdXQgb24gdGhlIGNvbW1hbmQgbGluZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbTWFya2VyIHRoYXQgaW5kaWNhdGVzIHdoZXJlIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBzaG91bGQKLSBiZSBwdXQgb24gdGhlIGNvbW1hbmQgbGluZS5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0idGFyZ2V0ZmlsZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmUuTWFya2VyIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtNYXJrZXIgdGhhdCBpbmRpY2F0ZXMgd2hlcmUgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCBmaWxlIHNob3VsZAotIGJlIHB1dCBvbiB0aGUgY29tbWFuZCBsaW5lLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtNYXJrZXIgdGhhdCBpbmRpY2F0ZXMgd2hlcmUgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCBmaWxlIHNob3VsZAotIGJlIHB1dCBvbiB0aGUgY29tbWFuZCBsaW5lLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9ImF2YWlsYWJsZSIgY2F0ZWdvcnk9ImNvbnRyb2wiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkF2YWlsYWJsZSIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2lsbCBzZXQgdGhlIGdpdmVuIHByb3BlcnR5IGlmIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgaXMgYXZhaWxhYmxlIGF0IHJ1bnRpbWUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW1dpbGwgc2V0IHRoZSBnaXZlbiBwcm9wZXJ0eSBpZiB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGlzIGF2YWlsYWJsZSBhdCAKLSBydW50aW1lLiBUaGlzIHRhc2sgbWF5IGFsc28gYmUgdXNlZCBhcyBhIGNvbmRpdGlvbiBieSB0aGUgY29uZGl0aW9uIHRhc2suXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc25hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzc25hbWUgb2YgYSBjbGFzcyB3aGljaCBtdXN0IGJlIGF2YWlsYWJsZSB0byBzZXQgdGhlIGdpdmVuIAotIHByb3BlcnR5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgYSBjbGFzc25hbWUgb2YgYSBjbGFzcyB3aGljaCBtdXN0IGJlIGF2YWlsYWJsZSB0byBzZXQgdGhlIGdpdmVuIAotIHByb3BlcnR5LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzc3BhdGggdG8gYmUgdXNlZCB3aGVuIHNlYXJjaGluZyBmb3IgY2xhc3NlcyBhbmQgcmVzb3VyY2VzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIHdoZW4gc2VhcmNoaW5nIGZvciBjbGFzc2VzIGFuZCByZXNvdXJjZXMuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRocmVmIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2UiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUmVmZXJlbmNlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzc3BhdGggYnkgcmVmZXJlbmNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGNsYXNzcGF0aCBieSByZWZlcmVuY2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZpbGUgd2hpY2ggbXVzdCBiZSBwcmVzZW50IGluIHRoZSBmaWxlIHN5c3RlbSB0byBzZXQgdGhlIGdpdmVuCi0gcHJvcGVydHkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgZmlsZSB3aGljaCBtdXN0IGJlIHByZXNlbnQgaW4gdGhlIGZpbGUgc3lzdGVtIHRvIHNldCB0aGUgZ2l2ZW4KLSBwcm9wZXJ0eS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQYXRoIHRvIHVzZSB3aGVuIGxvb2tpbmcgZm9yIGEgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBwYXRoIHRvIHVzZSB3aGVuIGxvb2tpbmcgZm9yIGEgZmlsZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZ25vcmVzeXN0ZW1jbGFzc2VzIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCB3aGV0aGVyIHRoZSBzZWFyY2ggZm9yIGNsYXNzZXMgc2hvdWxkIGlnbm9yZSB0aGUgcnVudGltZSBjbGFzc2VzIGFuZAotIGp1c3QgdXNlIHRoZSBnaXZlbiBjbGFzc3BhdGguXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB3aGV0aGVyIHRoZSBzZWFyY2ggZm9yIGNsYXNzZXMgc2hvdWxkIGlnbm9yZSB0aGUgcnVudGltZSBjbGFzc2VzIGFuZAotIGp1c3QgdXNlIHRoZSBnaXZlbiBjbGFzc3BhdGguCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvcGVydHkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIG9mIHRoZSBwcm9wZXJ0eSB3aGljaCB3aWxsIGJlIHNldCBpZiB0aGUgcGFydGljdWxhciByZXNvdXJjZQotIGlzIGF2YWlsYWJsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB3aGljaCB3aWxsIGJlIHNldCBpZiB0aGUgcGFydGljdWxhciByZXNvdXJjZQotIGlzIGF2YWlsYWJsZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXNvdXJjZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgb2YgYSBKYXZhIHJlc291cmNlIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHNldCB0aGUgcHJvcGVydHkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgbmFtZSBvZiBhIEphdmEgcmVzb3VyY2Ugd2hpY2ggaXMgcmVxdWlyZWQgdG8gc2V0IHRoZSBwcm9wZXJ0eS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BdmFpbGFibGUuRmlsZURpciIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDtmaWxlJnF1b3Q7LCAmcXVvdDtkaXImcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCB3aGF0IHR5cGUgb2YgZmlsZSBpcyByZXF1aXJlZCAtIGVpdGhlciBkaXJlY3Rvcnkgb3IgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHdoYXQgdHlwZSBvZiBmaWxlIGlzIHJlcXVpcmVkIC0gZWl0aGVyIGRpcmVjdG9yeSBvciBmaWxlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVmFsdWUgdG8gYmUgZ2l2ZW4gdG8gdGhlIHByb3BlcnR5IGlmIHRoZSBkZXNpcmVkIHJlc291cmNlIGlzCi0gYXZhaWxhYmxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIHZhbHVlIHRvIGJlIGdpdmVuIHRvIHRoZSBwcm9wZXJ0eSBpZiB0aGUgZGVzaXJlZCByZXNvdXJjZSBpcwotIGF2YWlsYWJsZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NsYXNzcGF0aCB0byBiZSB1c2VkIHdoZW4gc2VhcmNoaW5nIGZvciBjbGFzc2VzIGFuZCByZXNvdXJjZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0NsYXNzcGF0aCB0byBiZSB1c2VkIHdoZW4gc2VhcmNoaW5nIGZvciBjbGFzc2VzIGFuZCByZXNvdXJjZXMuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImZpbGVwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGF0aCB0byBzZWFyY2ggZm9yIGZpbGUgcmVzb3VyY2VzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtQYXRoIHRvIHNlYXJjaCBmb3IgZmlsZSByZXNvdXJjZXMuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iYmFzZW5hbWUiIGNhdGVnb3J5PSJwcm9wZXJ0eSIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQmFzZW5hbWUiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgYSBwcm9wZXJ0eSB0byB0aGUgYmFzZSBuYW1lIG9mIGEgc3BlY2lmaWVkIGZpbGUsIG9wdGlvbmFsbHkgbWludXMgYSBzdWZmaXguXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW1NldHMgYSBwcm9wZXJ0eSB0byB0aGUgYmFzZSBuYW1lIG9mIGEgc3BlY2lmaWVkIGZpbGUsIG9wdGlvbmFsbHkgbWludXMgYQotIHN1ZmZpeC4KLQotIFRoaXMgdGFzayBjYW4gYWNjZXB0IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKLSA8dWw+Ci0gPGxpPmZpbGUKLSA8bGk+cHJvcGVydHkKLSA8bGk+c3VmZml4Ci0gPC91bD4KLSBUaGUgPGI+ZmlsZTwvYj4gYW5kIDxiPnByb3BlcnR5PC9iPiBhdHRyaWJ1dGVzIGFyZSByZXF1aXJlZC4gVGhlCi0gPGI+c3VmZml4PC9iPiBhdHRyaWJ1dGUgY2FuIGJlIHNwZWNpZmllZCBlaXRoZXIgd2l0aCBvciB3aXRob3V0Ci0gdGhlICZxdW90Oy4mcXVvdDssIGFuZCB0aGUgcmVzdWx0IHdpbGwgYmUgdGhlIHNhbWUgKGllLiwgdGhlCi0gcmV0dXJuZWQgZmlsZSBuYW1lIHdpbGwgYmUgbWludXMgdGhlIC5zdWZmaXgpLgotIDxwPgotIFdoZW4gdGhpcyB0YXNrIGV4ZWN1dGVzLCBpdCB3aWxsIHNldCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IHRvIHRoZQotIHZhbHVlIG9mIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBmaWxlLiBJZiBmaWxlIGlzIGEKLSBkaXJlY3RvcnksIHRoZSBiYXNlbmFtZSB3aWxsIGJlIHRoZSBsYXN0IGRpcmVjdG9yeSBlbGVtZW50LiBJZiBmaWxlCi0gaXMgYSBmdWxsLXBhdGggZmlsZW5hbWUsIHRoZSBiYXNlbmFtZSB3aWxsIGJlIHRoZSBzaW1wbGUgZmlsZSBuYW1lLgotIElmIGEgc3VmZml4IGlzIHNwZWNpZmllZCwgYW5kIHRoZSBzcGVjaWZpZWQgZmlsZSBlbmRzIGluIHRoYXQgc3VmZml4LAotIHRoZSBiYXNlbmFtZSB3aWxsIGJlIHRoZSBzaW1wbGUgZmlsZSBuYW1lIHdpdGhvdXQgdGhlIHN1ZmZpeC5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGaWxlIG9yIGRpcmVjdG9yeSB0byBnZXQgYmFzZSBuYW1lIGZyb20uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEZpbGUgb3IgZGlyZWN0b3J5IHRvIGdldCBiYXNlIG5hbWUgZnJvbS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Byb3BlcnR5IHRvIHNldCBiYXNlIG5hbWUgdG8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFByb3BlcnR5IHRvIHNldCBiYXNlIG5hbWUgdG8uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3VmZml4IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbT3B0aW9uYWwgc3VmZml4IHRvIHJlbW92ZSBmcm9tIGJhc2UgbmFtZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgT3B0aW9uYWwgc3VmZml4IHRvIHJlbW92ZSBmcm9tIGJhc2UgbmFtZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iYmxnZW5jbGllbnQiIGNhdGVnb3J5PSJlamIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYi5Cb3JsYW5kR2VuZXJhdGVDbGllbnQiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0dlbmVyYXRlcyBhIEJvcmxhbmQgQXBwbGljYXRpb24gU2VydmVyIDQuNSBjbGllbnQgSkFSIHVzaW5nIGFzIGlucHV0IHRoZSBFSkIgSkFSIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0dlbmVyYXRlcyBhIEJvcmxhbmQgQXBwbGljYXRpb24gU2VydmVyIDQuNSBjbGllbnQgSkFSIHVzaW5nIGFzCi0gaW5wdXQgdGhlIEVKQiBKQVIgZmlsZS4KLQotIFR3byBtb2RlIGFyZSBhdmFpbGFibGU6IGphdmEgbW9kZSAoZGVmYXVsdCkgYW5kIGZvcmsgbW9kZS4gV2l0aCB0aGUgZm9yayBtb2RlLAotIGl0IGlzIGltcG9zc2libGUgdG8gYWRkIGNsYXNzcGF0aCB0byB0aGUgY29tbW1hbmQgbGluZS5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQYXRoIHRvIHVzZSBmb3IgY2xhc3NwYXRoLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBQYXRoIHRvIHVzZSBmb3IgY2xhc3NwYXRoLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aHJlZiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlJlZmVyZW5jZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUmVmZXJlbmNlIHRvIGV4aXN0aW5nIHBhdGgsIHRvIHVzZSBhcyBhIGNsYXNzcGF0aC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgUmVmZXJlbmNlIHRvIGV4aXN0aW5nIHBhdGgsIHRvIHVzZSBhcyBhIGNsYXNzcGF0aC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGllbnRqYXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGllbnQgSkFSIGZpbGUgbmFtZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgQ2xpZW50IEpBUiBmaWxlIG5hbWUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVidWciIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgdHVybiBvbiB0aGUgZGVidWcgbW9kZSBmb3IgZWFjaCBvZiB0aGUgQm9ybGFuZCB0b29scyBsYXVuY2hlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgdHVybiBvbiB0aGUgZGVidWcgbW9kZSBmb3IgZWFjaCBvZiB0aGUgQm9ybGFuZCB0b29scyBsYXVuY2hlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlamJqYXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFSkIgSkFSIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEVKQiBKQVIgZmlsZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtb2RlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29tbWFuZCBsYXVuY2hpbmcgbW9kZTogamF2YSBvciBmb3JrLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBDb21tYW5kIGxhdW5jaGluZyBtb2RlOiBqYXZhIG9yIGZvcmsuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0iaW50IgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTm8gZGVzY3JpcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBwYXRoIHRvIHRoZSBjbGFzc3BhdGguXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgcGF0aCB0byB0aGUgY2xhc3NwYXRoLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9ImJ1aWxkbnVtYmVyIiBjYXRlZ29yeT0ib3RoZXIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkJ1aWxkTnVtYmVyIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtSZWFkLCBpbmNyZW1lbnQsIGFuZCB3cml0ZSBhIGJ1aWxkIG51bWJlciBpbiBhIGZpbGUgSXQgd2lsbCBmaXJzdCBhdHRlbXB0IHRvIHJlYWQgYSBidWlsZCBudW1iZXIgZnJvbSBhIGZpbGUsIHRoZW4gc2V0IHRoZSBwcm9wZXJ0eSAiYnVpbGQubnVtYmVyIiB0byB0aGUgdmFsdWUgdGhhdCB3YXMgcmVhZCBpbiAob3IgMCBpZiBubyBzdWNoIHZhbHVlKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbUmVhZCwgaW5jcmVtZW50LCBhbmQgd3JpdGUgYSBidWlsZCBudW1iZXIgaW4gYSBmaWxlCi0gSXQgd2lsbCBmaXJzdAotIGF0dGVtcHQgdG8gcmVhZCBhIGJ1aWxkIG51bWJlciBmcm9tIGEgZmlsZSwgdGhlbiBzZXQgdGhlIHByb3BlcnR5Ci0gImJ1aWxkLm51bWJlciIgdG8gdGhlIHZhbHVlIHRoYXQgd2FzIHJlYWQgaW4gKG9yIDAgaWYgbm8gc3VjaCB2YWx1ZSkuIFRoZW4KLSBpdCB3aWxsIGluY3JlbWVudCB0aGUgYnVpbGQgbnVtYmVyIGJ5IG9uZSBhbmQgd3JpdGUgaXQgYmFjayBvdXQgaW50byB0aGUKLSBmaWxlLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBmaWxlIGluIHdoaWNoIHRoZSBidWlsZCBudW1iZXIgaXMgc3RvcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgZmlsZSBpbiB3aGljaCB0aGUgYnVpbGQgbnVtYmVyIGlzIHN0b3JlZC4gRGVmYXVsdHMgdG8KLSAiYnVpbGQubnVtYmVyIiBpZiBub3Qgc3BlY2lmaWVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJidW56aXAyIiBjYXRlZ29yeT0icGFja2FnaW5nIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5CVW56aXAyIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFeHBhbmRzIGEgZmlsZSB0aGF0IGhhcyBiZWVuIGNvbXByZXNzZWQgd2l0aCB0aGUgQlpJUDIgYWxnb3JpdGhtLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtFeHBhbmRzIGEgZmlsZSB0aGF0IGhhcyBiZWVuIGNvbXByZXNzZWQgd2l0aCB0aGUgQlpJUDIKLSBhbGdvcml0aG0uIE5vcm1hbGx5IHVzZWQgdG8gY29tcHJlc3Mgbm9uLWNvbXByZXNzZWQgYXJjaGl2ZXMgc3VjaAotIGFzIFRBUiBmaWxlcy5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3QiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZGVzdGluYXRpb24gZmlsZSBvciBkaXJlY3Rvcnk7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgZGVzdGluYXRpb24gZmlsZSBvciBkaXJlY3Rvcnk7IG9wdGlvbmFsLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNyYyIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBmaWxlIHRvIGV4cGFuZDsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBmaWxlIHRvIGV4cGFuZDsgcmVxdWlyZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9ImJ6aXAyIiBjYXRlZ29yeT0icGFja2FnaW5nIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5CWmlwMiIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29tcHJlc3NlcyBhIGZpbGUgd2l0aCB0aGUgQlpJUDIgYWxnb3JpdGhtLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtDb21wcmVzc2VzIGEgZmlsZSB3aXRoIHRoZSBCWklQMiBhbGdvcml0aG0uIE5vcm1hbGx5IHVzZWQgdG8gY29tcHJlc3MKLSBub24tY29tcHJlc3NlZCBhcmNoaXZlcyBzdWNoIGFzIFRBUiBmaWxlcy5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNyYyIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBmaWxlIHRvIGNvbXByZXNzOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgdGhlIGZpbGUgdG8gY29tcHJlc3M7IHJlcXVpcmVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InppcGZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcmVxdWlyZWQgZGVzdGluYXRpb24gZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgdGhlIHJlcXVpcmVkIGRlc3RpbmF0aW9uIGZpbGUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9ImNhYiIgY2F0ZWdvcnk9Im90aGVyIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5DYWIiCi0gICAgICBtYXRjaGluZ1Rhc2s9InRydWUiPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGUgYSBDQUIgYXJjaGl2ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbQ3JlYXRlIGEgQ0FCIGFyY2hpdmUuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiYXNlZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQmFzZSBkaXJlY3RvcnkgdG8gbG9vayBpbiBmb3IgZmlsZXMgdG8gQ0FCLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBCYXNlIGRpcmVjdG9yeSB0byBsb29rIGluIGZvciBmaWxlcyB0byBDQUIuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2FiZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBuYW1lL2xvY2F0aW9uIG9mIHdoZXJlIHRvIGNyZWF0ZSB0aGUgLmNhYiBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgbmFtZS9sb2NhdGlvbiBvZiB3aGVyZSB0byBjcmVhdGUgdGhlIC5jYWIgZmlsZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21wcmVzcyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBjb21wcmVzcyB0aGUgZmlsZXMgb3RoZXJ3aXNlIG9ubHkgc3RvcmUgdGhlbS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgY29tcHJlc3MgdGhlIGZpbGVzIG90aGVyd2lzZSBvbmx5IHN0b3JlIHRoZW0uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3B0aW9ucyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgYWRkaXRpb25hbCBjYWJhcmMgb3B0aW9ucyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGRpcmVjdGx5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIGFkZGl0aW9uYWwgY2FiYXJjIG9wdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBkaXJlY3RseS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJib3NlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGRpc3BsYXkgY2FiYXJjIG91dHB1dC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgZGlzcGxheSBjYWJhcmMgb3V0cHV0LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZmlsZXMgdG8gYXJjaGl2ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyB0byBhcmNoaXZlLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9ImNjY2hlY2tpbiIgY2F0ZWdvcnk9Im90aGVyIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jbGVhcmNhc2UuQ0NDaGVja2luIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQZXJmb3JtcyBDbGVhckNhc2UgY2hlY2tpbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbUGVyZm9ybXMgQ2xlYXJDYXNlIGNoZWNraW4uCi0KLSA8cD4KLSBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGludGVycHJldGVkOgotIDx0YWJsZSBib3JkZXI9IjEiPgotICAgPHRyPgotICAgICA8dGg+QXR0cmlidXRlPC90aD4KLSAgICAgPHRoPlZhbHVlczwvdGg+Ci0gICAgIDx0aD5SZXF1aXJlZDwvdGg+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPnZpZXdwYXRoPC90ZD4KLSAgICAgIDx0ZD5QYXRoIHRvIHRoZSBDbGVhckNhc2UgdmlldyBmaWxlIG9yIGRpcmVjdG9yeSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgb3BlcmF0ZSBvbjwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPHRyPgotICAgPHRyPgotICAgICAgPHRkPmNvbW1lbnQ8L3RkPgotICAgICAgPHRkPlNwZWNpZnkgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNmaWxlIG1heSBiZSB1c2VkLjwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPHRyPgotICAgPHRyPgotICAgICAgPHRkPmNvbW1lbnRmaWxlPC90ZD4KLSAgICAgIDx0ZD5TcGVjaWZ5IGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvciBjZmlsZSBtYXkgYmUgdXNlZC48L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDx0cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5ub3dhcm48L3RkPgotICAgICAgPHRkPlN1cHByZXNzIHdhcm5pbmcgbWVzc2FnZXM8L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDx0cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5wcmVzZXJ2ZXRpbWU8L3RkPgotICAgICAgPHRkPlByZXNlcnZlIHRoZSBtb2RpZmljYXRpb24gdGltZTwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPHRyPgotICAgPHRyPgotICAgICAgPHRkPmtlZXBjb3B5PC90ZD4KLSAgICAgIDx0ZD5LZWVwcyBhIGNvcHkgb2YgdGhlIGZpbGUgd2l0aCBhIC5rZWVwIGV4dGVuc2lvbjwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPHRyPgotICAgPHRyPgotICAgICAgPHRkPmlkZW50aWNhbDwvdGQ+Ci0gICAgICA8dGQ+QWxsb3dzIHRoZSBmaWxlIHRvIGJlIGNoZWNrZWQgaW4gZXZlbiBpZiBpdCBpcyBpZGVudGljYWwgdG8gdGhlIG9yaWdpbmFsPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8dHI+Ci0gPC90YWJsZT5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNsZWFydG9vbGRpciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSB0aGUgY2xlYXJ0b29sIGV4ZWN1dGFibGUgaXMgbG9jYXRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNsZWFydG9vbCBleGVjdXRhYmxlIGlzIGxvY2F0ZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tbWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NvbW1lbnQgc3RyaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBjb21tZW50IHN0cmluZy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21tZW50ZmlsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZmllcyBhIGZpbGUgY29udGFpbmluZyBhIGNvbW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNwZWNpZmllcyBhIGZpbGUgY29udGFpbmluZyBhIGNvbW1lbnQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWRlbnRpY2FsIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGFsbG93cyB0aGUgZmlsZSB0byBiZSBjaGVja2VkIGluIGV2ZW4KLSBpZiBpdCBpcyBpZGVudGljYWwgdG8gdGhlIG9yaWdpbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCBhbGxvd3MgdGhlIGZpbGUgdG8gYmUgY2hlY2tlZCBpbiBldmVuCi0gaWYgaXQgaXMgaWRlbnRpY2FsIHRvIHRoZSBvcmlnaW5hbC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJrZWVwY29weSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBrZWVwcyBhIGNvcHkgb2YgdGhlIGZpbGUgd2l0aCBhIC5rZWVwIGV4dGVuc2lvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwga2VlcHMgYSBjb3B5IG9mIHRoZSBmaWxlIHdpdGggYSAua2VlcCBleHRlbnNpb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibm93YXJuIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHN1cHByZXNzIHdhcm5pbmcgbWVzc2FnZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIHN1cHByZXNzIHdhcm5pbmcgbWVzc2FnZXMuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJlc2VydmV0aW1lIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHByZXNlcnZlIHRoZSBtb2RpZmljYXRpb24gdGltZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgcHJlc2VydmUgdGhlIG1vZGlmaWNhdGlvbiB0aW1lLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZpZXdwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGF0aCB0byB0aGUgaXRlbSBpbiBhIENsZWFyQ2FzZSB2aWV3IHRvIG9wZXJhdGUgb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgcGF0aCB0byB0aGUgaXRlbSBpbiBhIENsZWFyQ2FzZSB2aWV3IHRvIG9wZXJhdGUgb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9ImNjY2hlY2tvdXQiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2xlYXJjYXNlLkNDQ2hlY2tvdXQiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BlcmZvcm1zIENsZWFyQ2FzZSBjaGVja291dC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbUGVyZm9ybXMgQ2xlYXJDYXNlIGNoZWNrb3V0LgotCi0gPHA+Ci0gVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBpbnRlcnByZXR0ZWQ6Ci0gPHRhYmxlIGJvcmRlcj0iMSI+Ci0gICA8dHI+Ci0gICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgotICAgICA8dGg+VmFsdWVzPC90aD4KLSAgICAgPHRoPlJlcXVpcmVkPC90aD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+dmlld3BhdGg8L3RkPgotICAgICAgPHRkPlBhdGggdG8gdGhlIENsZWFyQ2FzZSB2aWV3IGZpbGUgb3IgZGlyZWN0b3J5IHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBvcGVyYXRlIG9uPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8dHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+cmVzZXJ2ZWQ8L3RkPgotICAgICAgPHRkPlNwZWNpZmllcyB3aGV0aGVyIHRvIGNoZWNrIG91dCB0aGUgZmlsZSBhcyByZXNlcnZlZCBvciBub3Q8L3RkPgotICAgICAgPHRkPlllczwvdGQ+Ci0gICA8dHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+b3V0PC90ZD4KLSAgICAgIDx0ZD5DcmVhdGVzIGEgd3JpdGFibGUgZmlsZSB1bmRlciBhIGRpZmZlcmVudCBmaWxlbmFtZTwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPHRyPgotICAgPHRyPgotICAgICAgPHRkPm5vZGF0YTwvdGQ+Ci0gICAgICA8dGQ+Q2hlY2tzIG91dCB0aGUgZmlsZSBidXQgZG9lcyBub3QgY3JlYXRlIGFuIGVkaXRhYmxlIGZpbGUgY29udGFpbmluZyBpdHMgZGF0YTwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPHRyPgotICAgPHRyPgotICAgICAgPHRkPmJyYW5jaDwvdGQ+Ci0gICAgICA8dGQ+U3BlY2lmeSBhIGJyYW5jaCB0byBjaGVjayBvdXQgdGhlIGZpbGUgdG88L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDx0cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD52ZXJzaW9uPC90ZD4KLSAgICAgIDx0ZD5BbGxvd3MgY2hlY2tvdXQgb2YgYSB2ZXJzaW9uIG90aGVyIHRoYW4gbWFpbiBsYXRlc3Q8L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDx0cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5ub3dhcm48L3RkPgotICAgICAgPHRkPlN1cHByZXNzIHdhcm5pbmcgbWVzc2FnZXM8L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDx0cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5jb21tZW50PC90ZD4KLSAgICAgIDx0ZD5TcGVjaWZ5IGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvciBjZmlsZSBtYXkgYmUgdXNlZC48L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDx0cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5jb21tZW50ZmlsZTwvdGQ+Ci0gICAgICA8dGQ+U3BlY2lmeSBhIGZpbGUgY29udGFpbmluZyBhIGNvbW1lbnQuIE9ubHkgb25lIG9mIGNvbW1lbnQgb3IgY2ZpbGUgbWF5IGJlIHVzZWQuPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8dHI+Ci0gPC90YWJsZT5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImJyYW5jaCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZnkgYSBicmFuY2ggdG8gY2hlY2sgb3V0IHRoZSBmaWxlIHRvLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTcGVjaWZ5IGEgYnJhbmNoIHRvIGNoZWNrIG91dCB0aGUgZmlsZSB0by4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGVhcnRvb2xkaXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3Rvcnkgd2hlcmUgdGhlIGNsZWFydG9vbCBleGVjdXRhYmxlIGlzIGxvY2F0ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBjbGVhcnRvb2wgZXhlY3V0YWJsZSBpcyBsb2NhdGVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbW1lbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDb21tZW50IHN0cmluZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgY29tbWVudCBzdHJpbmcuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tbWVudGZpbGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTcGVjaWZpZXMgYSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTcGVjaWZpZXMgYSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im5vZGF0YSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBjaGVja3Mgb3V0IHRoZSBmaWxlIGJ1dCBkb2VzIG5vdCBjcmVhdGUgYW4KLSBlZGl0YWJsZSBmaWxlIGNvbnRhaW5pbmcgaXRzIGRhdGEuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGNoZWNrcyBvdXQgdGhlIGZpbGUgYnV0IGRvZXMgbm90IGNyZWF0ZSBhbgotIGVkaXRhYmxlIGZpbGUgY29udGFpbmluZyBpdHMgZGF0YS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJub3dhcm4iIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgd2FybmluZyBtZXNzYWdlcyBhcmUgc3VwcHJlc3NlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgd2FybmluZyBtZXNzYWdlcyBhcmUgc3VwcHJlc3NlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdXQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGVzIGEgd3JpdGFibGUgZmlsZSB1bmRlciBhIGRpZmZlcmVudCBmaWxlbmFtZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgQ3JlYXRlcyBhIHdyaXRhYmxlIGZpbGUgdW5kZXIgYSBkaWZmZXJlbnQgZmlsZW5hbWUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVzZXJ2ZWQiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgY2hlY2tzIG91dCB0aGUgZmlsZSBhcyByZXNlcnZlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgY2hlY2tzIG91dCB0aGUgZmlsZSBhcyByZXNlcnZlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGFsbG93cyBjaGVja291dCBvZiBhIHZlcnNpb24gb3RoZXIgdGhhbiBtYWluIGxhdGVzdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgYWxsb3dzIGNoZWNrb3V0IG9mIGEgdmVyc2lvbiBvdGhlciB0aGFuIG1haW4gbGF0ZXN0LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZpZXdwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGF0aCB0byB0aGUgaXRlbSBpbiBhIENsZWFyQ2FzZSB2aWV3IHRvIG9wZXJhdGUgb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgcGF0aCB0byB0aGUgaXRlbSBpbiBhIENsZWFyQ2FzZSB2aWV3IHRvIG9wZXJhdGUgb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9ImNjbWNoZWNraW4iIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2NtLkNDTUNoZWNraW4iCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BlcmZvcm1zIENvbnRpbnV1cyBjaGVja2luIGNvbW1hbmQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW1BlcmZvcm1zIENvbnRpbnV1cyBjaGVja2luIGNvbW1hbmQuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjY21kaXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3Rvcnkgd2hlcmUgdGhlIGNjbSBleGVjdXRhYmxlIGlzIGxvY2F0ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBjY20gZXhlY3V0YWJsZSBpcyBsb2NhdGVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbW1lbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTcGVjaWZpZXMgYSBjb21tZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTcGVjaWZpZXMgYSBjb21tZW50LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQYXRoIHRvIHRoZSBmaWxlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBvcGVyYXRlIG9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBwYXRoIHRvIHRoZSBmaWxlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBvcGVyYXRlIG9uLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRhc2siIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTcGVjaWZpZXMgdGhlIHRhc2sgbnVtYmVyIHVzZWQgdG8gY2hlY2sKLSBpbiB0aGUgZmlsZSAobWF5IHVzZSAnZGVmYXVsdCcpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTcGVjaWZpZXMgdGhlIHRhc2sgbnVtYmVyIHVzZWQgdG8gY2hlY2sKLSBpbiB0aGUgZmlsZSAobWF5IHVzZSAnZGVmYXVsdCcpLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJjY21jaGVja2ludGFzayIgY2F0ZWdvcnk9InNjbSIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2NtLkNDTUNoZWNraW5EZWZhdWx0IgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQZXJmb3JtcyBDb250aW51dXMgQ2hlY2tpbiBEZWZhdWx0IHRhc2sgY29tbWFuZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbUGVyZm9ybXMgQ29udGludXVzIENoZWNraW4gRGVmYXVsdCB0YXNrIGNvbW1hbmQuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjY21kaXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3Rvcnkgd2hlcmUgdGhlIGNjbSBleGVjdXRhYmxlIGlzIGxvY2F0ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBjY20gZXhlY3V0YWJsZSBpcyBsb2NhdGVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbW1lbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTcGVjaWZpZXMgYSBjb21tZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTcGVjaWZpZXMgYSBjb21tZW50LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQYXRoIHRvIHRoZSBmaWxlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBvcGVyYXRlIG9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBwYXRoIHRvIHRoZSBmaWxlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBvcGVyYXRlIG9uLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRhc2siIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTcGVjaWZpZXMgdGhlIHRhc2sgbnVtYmVyIHVzZWQgdG8gY2hlY2sKLSBpbiB0aGUgZmlsZSAobWF5IHVzZSAnZGVmYXVsdCcpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTcGVjaWZpZXMgdGhlIHRhc2sgbnVtYmVyIHVzZWQgdG8gY2hlY2sKLSBpbiB0aGUgZmlsZSAobWF5IHVzZSAnZGVmYXVsdCcpLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJjY21jaGVja291dCIgY2F0ZWdvcnk9Im90aGVyIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jY20uQ0NNQ2hlY2tvdXQiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BlcmZvcm1zIENvbnRpbnV1cyBjaGVja291dCBjb21tYW5kLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtQZXJmb3JtcyBDb250aW51dXMgY2hlY2tvdXQgY29tbWFuZC5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNjbWRpciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSB0aGUgY2NtIGV4ZWN1dGFibGUgaXMgbG9jYXRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNjbSBleGVjdXRhYmxlIGlzIGxvY2F0ZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tbWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZmllcyBhIGNvbW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNwZWNpZmllcyBhIGNvbW1lbnQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BhdGggdG8gdGhlIGZpbGUgdGhhdCB0aGUgY29tbWFuZCB3aWxsIG9wZXJhdGUgb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIHBhdGggdG8gdGhlIGZpbGUgdGhhdCB0aGUgY29tbWFuZCB3aWxsIG9wZXJhdGUgb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFzayIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZmllcyB0aGUgdGFzayBudW1iZXIgdXNlZCB0byBjaGVjawotIGluIHRoZSBmaWxlIChtYXkgdXNlICdkZWZhdWx0JykuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNwZWNpZmllcyB0aGUgdGFzayBudW1iZXIgdXNlZCB0byBjaGVjawotIGluIHRoZSBmaWxlIChtYXkgdXNlICdkZWZhdWx0JykuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9ImNjbWNyZWF0ZXRhc2siIGNhdGVnb3J5PSJzY20iCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNjbS5DQ01DcmVhdGVUYXNrIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGVzIG5ldyBDb250aW51dXMgY2NtIHRhc2sgYW5kIHNldHMgaXQgYXMgdGhlIGRlZmF1bHQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0NyZWF0ZXMgbmV3IENvbnRpbnV1cyBjY20gdGFzayBhbmQgc2V0cyBpdCBhcyB0aGUgZGVmYXVsdC5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNjbWRpciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSB0aGUgY2NtIGV4ZWN1dGFibGUgaXMgbG9jYXRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNjbSBleGVjdXRhYmxlIGlzIGxvY2F0ZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tbWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZmllcyBhIGNvbW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNwZWNpZmllcyBhIGNvbW1lbnQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGxhdGZvcm0iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTcGVjaWZpZXMgdGhlIHRhcmdldCBwbGF0Zm9ybS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU3BlY2lmaWVzIHRoZSB0YXJnZXQgcGxhdGZvcm0uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVsZWFzZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZnkgdGhlIENDTSByZWxlYXNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTcGVjaWZ5IHRoZSBDQ00gcmVsZWFzZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXNvbHZlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZmllcyB0aGUgcmVzb2x2ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNwZWNpZmllcyB0aGUgcmVzb2x2ZXIuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3Vic3lzdGVtIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmaWVzIHRoZSBzdWJzeXN0ZW0uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNwZWNpZmllcyB0aGUgc3Vic3lzdGVtLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRhc2siIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTcGVjaWZpZXMgdGhlIHRhc2sgbnVtYmVyIHVzZWQgdG8gY2hlY2tpbgotIHRoZSBmaWxlIChtYXkgdXNlICdkZWZhdWx0JykuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNwZWNpZmllcyB0aGUgdGFzayBudW1iZXIgdXNlZCB0byBjaGVja2luCi0gdGhlIGZpbGUgKG1heSB1c2UgJ2RlZmF1bHQnKS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iY2NtcmVjb25maWd1cmUiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2NtLkNDTVJlY29uZmlndXJlIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUYXNrIGFsbG93cyB0byByZWNvbmZpZ3VyZSBhIHByb2plY3QsIHJlY3VyY2l2ZWx5IG9yIG5vdF1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtUYXNrIGFsbG93cyB0byByZWNvbmZpZ3VyZSBhIHByb2plY3QsIHJlY3VyY2l2ZWx5IG9yIG5vdF1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2NtZGlyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3J5IHdoZXJlIHRoZSBjY20gZXhlY3V0YWJsZSBpcyBsb2NhdGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgY2NtIGV4ZWN1dGFibGUgaXMgbG9jYXRlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjY21wcm9qZWN0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2NtIHByb2plY3Qgb24gd2hpY2ggdGhlIG9wZXJhdGlvbiBpcyBhcHBsaWVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBjY20gcHJvamVjdCBvbiB3aGljaCB0aGUgb3BlcmF0aW9uIGlzIGFwcGxpZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVjdXJzZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCByZWN1cnNlIG9uIHN1YnByb2plY3QgKGRlZmF1bHQgZmFsc2UpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCByZWN1cnNlIG9uIHN1YnByb2plY3QgKGRlZmF1bHQgZmFsc2UpLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZlcmJvc2UiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgZG8gYSB2ZXJib3NlIHJlY29uZmlndXJlIG9wZXJhdGlvbiAoZGVmYXVsdCBmYWxzZSkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGRvIGEgdmVyYm9zZSByZWNvbmZpZ3VyZSBvcGVyYXRpb24gKGRlZmF1bHQgZmFsc2UpLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJjY3VuY2hlY2tvdXQiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2xlYXJjYXNlLkNDVW5DaGVja291dCIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGVyZm9ybXMgQ2xlYXJDYXNlIFVuQ2hlY2tvdXQgY29tbWFuZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbUGVyZm9ybXMgQ2xlYXJDYXNlIFVuQ2hlY2tvdXQgY29tbWFuZC4KLQotIDxwPgotIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgaW50ZXJwcmV0dGVkOgotIDx0YWJsZSBib3JkZXI9IjEiPgotICAgPHRyPgotICAgICA8dGg+QXR0cmlidXRlPC90aD4KLSAgICAgPHRoPlZhbHVlczwvdGg+Ci0gICAgIDx0aD5SZXF1aXJlZDwvdGg+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPnZpZXdwYXRoPC90ZD4KLSAgICAgIDx0ZD5QYXRoIHRvIHRoZSBDbGVhckNhc2UgdmlldyBmaWxlIG9yIGRpcmVjdG9yeSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgb3BlcmF0ZSBvbjwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPHRyPgotICAgPHRyPgotICAgICAgPHRkPmtlZXBjb3B5PC90ZD4KLSAgICAgIDx0ZD5TcGVjaWZpZXMgd2hldGhlciB0byBrZWVwIGEgY29weSBvZiB0aGUgZmlsZSB3aXRoIGEgLmtlZXAgZXh0ZW5zaW9uIG9yIG5vdDwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPHRyPgotIDwvdGFibGU+XV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGVhcnRvb2xkaXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3Rvcnkgd2hlcmUgdGhlIGNsZWFydG9vbCBleGVjdXRhYmxlIGlzIGxvY2F0ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBjbGVhcnRvb2wgZXhlY3V0YWJsZSBpcyBsb2NhdGVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImtlZXBjb3B5IiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGtlZXAgYSBjb3B5IG9mIHRoZSBmaWxlIHdpdGggYSAua2VlcCBleHRlbnNpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGtlZXAgYSBjb3B5IG9mIHRoZSBmaWxlIHdpdGggYSAua2VlcCBleHRlbnNpb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmlld3BhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQYXRoIHRvIHRoZSBpdGVtIGluIGEgQ2xlYXJDYXNlIHZpZXcgdG8gb3BlcmF0ZSBvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBwYXRoIHRvIHRoZSBpdGVtIGluIGEgQ2xlYXJDYXNlIHZpZXcgdG8gb3BlcmF0ZSBvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iY2N1cGRhdGUiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2xlYXJjYXNlLkNDVXBkYXRlIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQZXJmb3JtcyBhIENsZWFyQ2FzZSBVcGRhdGUgY29tbWFuZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbUGVyZm9ybXMgYSBDbGVhckNhc2UgVXBkYXRlIGNvbW1hbmQuCi0KLSA8cD4KLSBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGludGVycHJldHRlZDoKLSA8dGFibGUgYm9yZGVyPSIxIj4KLSAgIDx0cj4KLSAgICAgPHRoPkF0dHJpYnV0ZTwvdGg+Ci0gICAgIDx0aD5WYWx1ZXM8L3RoPgotICAgICA8dGg+UmVxdWlyZWQ8L3RoPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD52aWV3cGF0aDwvdGQ+Ci0gICAgICA8dGQ+UGF0aCB0byB0aGUgQ2xlYXJDYXNlIHZpZXcgZmlsZSBvciBkaXJlY3RvcnkgdGhhdCB0aGUgY29tbWFuZCB3aWxsIG9wZXJhdGUgb248L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDx0cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5ncmFwaGljYWw8L3RkPgotICAgICAgPHRkPkRpc3BsYXlzIGEgZ3JhcGhpY2FsIGRpYWxvZyBkdXJpbmcgdGhlIHVwZGF0ZTwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPHRyPgotICAgPHRyPgotICAgICAgPHRkPmxvZzwvdGQ+Ci0gICAgICA8dGQ+U3BlY2lmaWVzIGEgbG9nIGZpbGUgZm9yIENsZWFyQ2FzZSB0byB3cml0ZSB0bzwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPHRyPgotICAgPHRyPgotICAgICAgPHRkPm92ZXJ3cml0ZTwvdGQ+Ci0gICAgICA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgdG8gb3ZlcndyaXRlIGhpamFja2VkIGZpbGVzIG9yIG5vdDwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPHRyPgotICAgPHRyPgotICAgICAgPHRkPnJlbmFtZTwvdGQ+Ci0gICAgICA8dGQ+U3BlY2lmaWVzIHRoYXQgaGlqYWNrZWQgZmlsZXMgc2hvdWxkIGJlIHJlbmFtZWQgd2l0aCBhIC5rZWVwIGV4dGVuc2lvbjwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPHRyPgotICAgPHRyPgotICAgICAgPHRkPmN1cnJlbnR0aW1lPC90ZD4KLSAgICAgIDx0ZD5TcGVjaWZpZXMgdGhhdCBtb2RpZmljYXRpb24gdGltZSBzaG91bGQgYmUgd3JpdHRlbiBhcyB0aGUgY3VycmVudCB0aW1lLiBFaXRoZXIgY3VycmVudHRpbWUgb3IgcHJlc2VydmV0aW1lIGNhbiBiZSBzcGVjaWZpZWQuPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8dHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+cHJlc2VydmV0aW1lPC90ZD4KLSAgICAgIDx0ZD5TcGVjaWZpZXMgdGhhdCBtb2RpZmljYXRpb24gdGltZSBzaG91bGQgcHJlc2VydmVkIGZyb20gdGhlIFZPQiB0aW1lLiBFaXRoZXIgY3VycmVudHRpbWUgb3IgcHJlc2VydmV0aW1lIGNhbiBiZSBzcGVjaWZpZWQuPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8dHI+Ci0gPC90YWJsZT5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNsZWFydG9vbGRpciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSB0aGUgY2xlYXJ0b29sIGV4ZWN1dGFibGUgaXMgbG9jYXRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNsZWFydG9vbCBleGVjdXRhYmxlIGlzIGxvY2F0ZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY3VycmVudHRpbWUiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgbW9kaWZpY2F0aW9uIHRpbWUgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgdGhlIGN1cnJlbnQgdGltZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgbW9kaWZpY2F0aW9uIHRpbWUgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgdGhlIGN1cnJlbnQgdGltZS4KLSBFaXRoZXIgY3VycmVudHRpbWUgb3IgcHJlc2VydmV0aW1lIGNhbiBiZSBzcGVjaWZpZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZ3JhcGhpY2FsIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGRpc3BsYXlzIGEgZ3JhcGhpY2FsIGRpYWxvZyBkdXJpbmcgdGhlIHVwZGF0ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgZGlzcGxheXMgYSBncmFwaGljYWwgZGlhbG9nIGR1cmluZyB0aGUgdXBkYXRlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImxvZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xvZyBmaWxlIHdoZXJlIGNsZWFydG9vbCByZWNvcmRzCi0gdGhlIHN0YXR1cyBvZiB0aGUgY29tbWFuZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgbG9nIGZpbGUgd2hlcmUgY2xlYXJ0b29sIHJlY29yZHMKLSB0aGUgc3RhdHVzIG9mIHRoZSBjb21tYW5kLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im92ZXJ3cml0ZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBvdmVyd3JpdGUgaGlqYWNrZWQgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIG92ZXJ3cml0ZSBoaWphY2tlZCBmaWxlcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmVzZXJ2ZXRpbWUiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgbW9kaWZpY2F0aW9uIHRpbWUgc2hvdWxkIGJlIHByZXNlcnZlZCBmcm9tIHRoZSBWT0IgdGltZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgbW9kaWZpY2F0aW9uIHRpbWUgc2hvdWxkIGJlIHByZXNlcnZlZCBmcm9tIHRoZSBWT0IgdGltZS4KLSBFaXRoZXIgY3VycmVudHRpbWUgb3IgcHJlc2VydmV0aW1lIGNhbiBiZSBzcGVjaWZpZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVuYW1lIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGhpamFja2VkIGZpbGVzIGFyZSByZW5hbWVkIHdpdGggYSAua2VlcCBleHRlbnNpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGhpamFja2VkIGZpbGVzIGFyZSByZW5hbWVkIHdpdGggYSAua2VlcCBleHRlbnNpb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmlld3BhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQYXRoIHRvIHRoZSBpdGVtIGluIGEgQ2xlYXJDYXNlIHZpZXcgdG8gb3BlcmF0ZSBvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBwYXRoIHRvIHRoZSBpdGVtIGluIGEgQ2xlYXJDYXNlIHZpZXcgdG8gb3BlcmF0ZSBvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iY2hlY2tzdW0iIGNhdGVnb3J5PSJjb250cm9sIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5DaGVja3N1bSIKLSAgICAgIG1hdGNoaW5nVGFzaz0idHJ1ZSI+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1VzZWQgdG8gY3JlYXRlIG9yIHZlcmlmeSBmaWxlIGNoZWNrc3Vtcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbVXNlZCB0byBjcmVhdGUgb3IgdmVyaWZ5IGZpbGUgY2hlY2tzdW1zLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYWxnb3JpdGhtIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmaWVzIHRoZSBhbGdvcml0aG0gdG8gYmUgdXNlZCB0byBjb21wdXRlIHRoZSBjaGVja3N1bS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU3BlY2lmaWVzIHRoZSBhbGdvcml0aG0gdG8gYmUgdXNlZCB0byBjb21wdXRlIHRoZSBjaGVja3N1bS4KLSBEZWZhdWx0cyB0byAiTUQ1Ii4gT3RoZXIgcG9wdWxhciBhbGdvcml0aG1zIGxpa2UgIlNIQSIgbWF5IGJlIHVzZWQgYXMgd2VsbC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZSBmb3Igd2hpY2ggdGhlIGNoZWNrc3VtIGlzIHRvIGJlIGNhbGN1bGF0ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIGZpbGUgZm9yIHdoaWNoIHRoZSBjaGVja3N1bSBpcyB0byBiZSBjYWxjdWxhdGVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGVleHQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGaWxlIGV4dGVuc2lvbiB0aGF0IGlzIGJlIHRvIHVzZWQgdG8KLSBjcmVhdGUgb3IgaWRlbnRpZnkgZGVzdGluYXRpb24gZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgZmlsZSBleHRlbnNpb24gdGhhdCBpcyBiZSB0byB1c2VkIHRvCi0gY3JlYXRlIG9yIGlkZW50aWZ5IGRlc3RpbmF0aW9uIGZpbGUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZm9yY2VvdmVyd3JpdGUiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciBvciBub3QgdG8gb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGUgaXJyZXNwZWN0aXZlIG9mIAotIHdoZXRoZXIgaXQgaXMgbmV3ZXIgdGhhbgotIHRoZSBzb3VyY2UgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgV2hldGhlciBvciBub3QgdG8gb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGUgaXJyZXNwZWN0aXZlIG9mIAotIHdoZXRoZXIgaXQgaXMgbmV3ZXIgdGhhbgotIHRoZSBzb3VyY2UgZmlsZS4gIERlZmF1bHRzIHRvIGZhbHNlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InByb3BlcnR5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUHJvcGVydHkgdG8gaG9sZCB0aGUgZ2VuZXJhdGVkIGNoZWNrc3VtLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBwcm9wZXJ0eSB0byBob2xkIHRoZSBnZW5lcmF0ZWQgY2hlY2tzdW0uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvdmlkZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtNZXNzYWdlRGlnZXN0IGFsZ29yaXRobSBwcm92aWRlciB0byBiZSB1c2VkCi0gdG8gY2FsY3VsYXRlIHRoZSBjaGVja3N1bS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgTWVzc2FnZURpZ2VzdCBhbGdvcml0aG0gcHJvdmlkZXIgdG8gYmUgdXNlZAotIHRvIGNhbGN1bGF0ZSB0aGUgY2hlY2tzdW0uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVhZGJ1ZmZlcnNpemUiIHR5cGU9ImludCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJpbnQiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBzaXplIG9mIHRoZSByZWFkIGJ1ZmZlciB0byB1c2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBzaXplIG9mIHRoZSByZWFkIGJ1ZmZlciB0byB1c2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyaWZ5cHJvcGVydHkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtWZXJpZnkgcHJvcGVydHkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIHZlcmlmeSBwcm9wZXJ0eS4gIFRoaXMgcHJvamVjdCBwcm9wZXJ0eSBob2xkcwotIHRoZSByZXN1bHQgb2YgYSBjaGVja3N1bSB2ZXJpZmljYXRpb24gLSAidHJ1ZSIgb3IgImZhbHNlIgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZpbGVzIHRvIGdlbmVyYXRlIGNoZWNrc3VtcyBmb3IuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0ZpbGVzIHRvIGdlbmVyYXRlIGNoZWNrc3VtcyBmb3IuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iY2htb2QiIGNhdGVnb3J5PSJmaWxlc3lzdGVtIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5DaG1vZCIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2htb2QgZXF1aXZhbGVudCBmb3IgdW5peC1saWtlIGVudmlyb25tZW50cy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbQ2htb2QgZXF1aXZhbGVudCBmb3IgdW5peC1saWtlIGVudmlyb25tZW50cy5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImFwcGVuZCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIG91dHB1dCBzaG91bGQgYmUgYXBwZW5kZWQgdG8gb3Igb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFdoZXRoZXIgb3V0cHV0IHNob3VsZCBiZSBhcHBlbmRlZCB0byBvciBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZmlsZS4KLSBEZWZhdWx0cyB0byBmYWxzZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0ZXhjbHVkZXMiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVzaW9ucyBzaG91bGQgYmUgdXNlZCBvciBub3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgd2hldGhlciBkZWZhdWx0IGV4Y2x1c2lvbnMgc2hvdWxkIGJlIHVzZWQgb3Igbm90LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3QiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZGlyZWN0b3J5IHdoZXJlIHRhcmdldCBmaWxlcyBhcmUgdG8gYmUgcGxhY2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgZGlyZWN0b3J5IHdoZXJlIHRhcmdldCBmaWxlcyBhcmUgdG8gYmUgcGxhY2VkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRpciIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBkaXJlY3Rvcnkgd2hpY2ggaG9sZHMgdGhlIGZpbGVzIHdob3NlIHBlcm1pc3Npb25zIG11c3QgYmUgY2hhbmdlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGRpcmVjdG9yeSB3aGljaCBob2xkcyB0aGUgZmlsZXMgd2hvc2UgcGVybWlzc2lvbnMgbXVzdCBiZSBjaGFuZ2VkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IG9mIGV4Y2x1ZGUgcGF0dGVybnMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIHNldCBvZiBleGNsdWRlIHBhdHRlcm5zLiBQYXR0ZXJucyBtYXkgYmUgc2VwYXJhdGVkIGJ5IGEgY29tbWEKLSBvciBhIHNwYWNlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImV4ZWN1dGFibGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgY29tbWFuZCB0byBleGVjdXRlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgY29tbWFuZCB0byBleGVjdXRlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxpZmV4ZWN1dGlvbmZhaWxzIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1N0b3AgdGhlIGJ1aWxkIGlmIHByb2dyYW0gY2Fubm90IGJlIHN0YXJ0ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFN0b3AgdGhlIGJ1aWxkIGlmIHByb2dyYW0gY2Fubm90IGJlIHN0YXJ0ZWQuIERlZmF1bHRzIHRvIHRydWUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmFpbCBpZiB0aGUgY29tbWFuZCBleGl0cyB3aXRoIGEgbm9uLXplcm8gcmV0dXJuIGNvZGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEZhaWwgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBhIG5vbi16ZXJvIHJldHVybiBjb2RlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZmlsZSBvciBzaW5nbGUgZGlyZWN0b3J5IG9mIHdoaWNoIHRoZSBwZXJtaXNzaW9ucyBtdXN0IGJlIGNoYW5nZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBmaWxlIG9yIHNpbmdsZSBkaXJlY3Rvcnkgb2Ygd2hpY2ggdGhlIHBlcm1pc3Npb25zIG11c3QgYmUgY2hhbmdlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmNsdWRlcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCBvZiBpbmNsdWRlIHBhdHRlcm5zLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBzZXQgb2YgaW5jbHVkZSBwYXR0ZXJucy4gUGF0dGVybnMgbWF5IGJlIHNlcGFyYXRlZCBieSBhIGNvbW1hCi0gb3IgYSBzcGFjZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuZXdlbnZpcm9ubWVudCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEbyBub3QgcHJvcGFnYXRlIG9sZCBlbnZpcm9ubWVudCB3aGVuIG5ldyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNwZWNpZmllZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgRG8gbm90IHByb3BhZ2F0ZSBvbGQgZW52aXJvbm1lbnQgd2hlbiBuZXcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzcGVjaWZpZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtMaXN0IG9mIG9wZXJhdGluZyBzeXN0ZW1zIG9uIHdoaWNoIHRoZSBjb21tYW5kIG1heSBiZSBleGVjdXRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgTGlzdCBvZiBvcGVyYXRpbmcgc3lzdGVtcyBvbiB3aGljaCB0aGUgY29tbWFuZCBtYXkgYmUgZXhlY3V0ZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3V0cHV0IiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZSB0aGUgb3V0cHV0IG9mIHRoZSBwcm9jZXNzIGlzIHJlZGlyZWN0ZWQgdG8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEZpbGUgdGhlIG91dHB1dCBvZiB0aGUgcHJvY2VzcyBpcyByZWRpcmVjdGVkIHRvLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im91dHB1dHByb3BlcnR5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUHJvcGVydHkgbmFtZSB3aG9zZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIHRoZSBvdXRwdXQgb2YKLSB0aGUgcHJvY2Vzcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgUHJvcGVydHkgbmFtZSB3aG9zZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIHRoZSBvdXRwdXQgb2YKLSB0aGUgcHJvY2Vzcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXJhbGxlbCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBydW4gdGhlIGNvbW1hbmQgb25seSBvbmNlLCBhcHBlbmRpbmcgYWxsIGZpbGVzIGFzIGFyZ3VtZW50cy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgcnVuIHRoZSBjb21tYW5kIG9ubHkgb25jZSwgYXBwZW5kaW5nIGFsbCBmaWxlcyBhcyBhcmd1bWVudHMuCi0gSWYgZmFsc2UsIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBvbmNlIGZvciBldmVyeSBmaWxlLiBEZWZhdWx0cyB0byBmYWxzZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwZXJtIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG5ldyBwZXJtaXNzaW9ucy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIG5ldyBwZXJtaXNzaW9ucy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZWxhdGl2ZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIHRoZSBmaWxlbmFtZXMgc2hvdWxkIGJlIHBhc3NlZCBvbiB0aGUgY29tbWFuZCBsaW5lIGFzCi0gYWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aG5hbWVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBXaGV0aGVyIHRoZSBmaWxlbmFtZXMgc2hvdWxkIGJlIHBhc3NlZCBvbiB0aGUgY29tbWFuZCBsaW5lIGFzCi0gYWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aG5hbWVzLiBQYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJhc2UKLSBkaXJlY3Rvcnkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZXNldCBmb3Igc291cmNlIGZpbGVzIG9yIHRoZQotIGRlc3QgYXR0cmlidXRlIGZvciB0YXJnZXQgZmlsZXMuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVzdWx0cHJvcGVydHkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSByZXR1cm4gY29kZSBvZiB0aGUKLSBjb21tYW5kIHNob3VsZCBiZSBzdG9yZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBuYW1lIG9mIGEgcHJvcGVydHkgaW4gd2hpY2ggdGhlIHJldHVybiBjb2RlIG9mIHRoZQotIGNvbW1hbmQgc2hvdWxkIGJlIHN0b3JlZC4gT25seSBvZiBpbnRlcmVzdCBpZiBmYWlsb25lcnJvcj1mYWxzZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJza2lwZW1wdHlmaWxlc2V0cyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiBubyBzb3VyY2UgZmlsZXMgaGF2ZSBiZWVuIGZvdW5kIG9yIGFyZSBuZXdlciB0aGFuIHRoZWlyCi0gY29ycmVzcG9uZGluZyB0YXJnZXQgZmlsZXMsIGRvIG5vdCBydW4gdGhlIGNvbW1hbmQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIG5vIHNvdXJjZSBmaWxlcyBoYXZlIGJlZW4gZm91bmQgb3IgYXJlIG5ld2VyIHRoYW4gdGhlaXIKLSBjb3JyZXNwb25kaW5nIHRhcmdldCBmaWxlcywgZG8gbm90IHJ1biB0aGUgY29tbWFuZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlT24uRmlsZURpckJvdGgiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7ZmlsZSZxdW90OywgJnF1b3Q7ZGlyJnF1b3Q7LCAmcXVvdDtib3RoJnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIHRoZSBjb21tYW5kIHdvcmtzIG9ubHkgb24gZmlsZXMsIGRpcmVjdG9yaWVzIG9yIGJvdGg/Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBXaGV0aGVyIHRoZSBjb21tYW5kIHdvcmtzIG9ubHkgb24gZmlsZXMsIGRpcmVjdG9yaWVzIG9yIGJvdGg/Ci0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idm1sYXVuY2hlciIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBsYXVuY2ggbmV3IHByb2Nlc3Mgd2l0aCBWTSwgb3RoZXJ3aXNlIHVzZSB0aGUgT1MncyBzaGVsbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgbGF1bmNoIG5ldyBwcm9jZXNzIHdpdGggVk0sIG90aGVyd2lzZSB1c2UgdGhlIE9TJ3Mgc2hlbGwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJlbnYiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudmlyb25tZW50LlZhcmlhYmxlIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIGxhdW5jaGVkIHByb2Nlc3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgbGF1bmNoZWQgcHJvY2Vzcy5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NvdXJjZSBmaWxlcyB0byBvcGVyYXRlIHVwb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW1NvdXJjZSBmaWxlcyB0byBvcGVyYXRlIHVwb24uXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImFyZyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmUuQXJndW1lbnQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBjb21tYW5kLWxpbmUgYXJndW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBjb21tYW5kLWxpbmUgYXJndW1lbnQuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImV4Y2x1ZGUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdHRlcm5TZXQuTmFtZUVudHJ5IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBleGNsdWRlIGxpc3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCBhIG5hbWUgZW50cnkgb24gdGhlIGV4Y2x1ZGUgbGlzdC5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iaW5jbHVkZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0dGVyblNldC5OYW1lRW50cnkiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIG5hbWUgZW50cnkgb24gdGhlIGluY2x1ZGUgbGlzdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgaW5jbHVkZSBsaXN0Ll1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJtYXBwZXIiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLk1hcHBlciIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iTWFwcGVyIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTWFwcGVyIHRvIHVzZSBmb3IgbWFwcGluZyBzb3VyY2UgZmlsZXMgdG8gdGFyZ2V0IGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtNYXBwZXIgdG8gdXNlIGZvciBtYXBwaW5nIHNvdXJjZSBmaWxlcyB0byB0YXJnZXQgZmlsZXMuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9InBhdHRlcm5zZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdHRlcm5TZXQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdHRlcm5zZXQiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSBzZXQgb2YgcGF0dGVybnMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCBhIHNldCBvZiBwYXR0ZXJucy5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0ic3JjZmlsZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmUuTWFya2VyIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtNYXJrZXIgdGhhdCBpbmRpY2F0ZXMgd2hlcmUgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHNob3VsZAotIGJlIHB1dCBvbiB0aGUgY29tbWFuZCBsaW5lLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtNYXJrZXIgdGhhdCBpbmRpY2F0ZXMgd2hlcmUgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHNob3VsZAotIGJlIHB1dCBvbiB0aGUgY29tbWFuZCBsaW5lLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJ0YXJnZXRmaWxlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZS5NYXJrZXIiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW01hcmtlciB0aGF0IGluZGljYXRlcyB3aGVyZSB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IGZpbGUgc2hvdWxkCi0gYmUgcHV0IG9uIHRoZSBjb21tYW5kIGxpbmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW01hcmtlciB0aGF0IGluZGljYXRlcyB3aGVyZSB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IGZpbGUgc2hvdWxkCi0gYmUgcHV0IG9uIHRoZSBjb21tYW5kIGxpbmUuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iY29uY2F0IiBjYXRlZ29yeT0ib3RoZXIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNvbmNhdCIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhpcyBjbGFzcyBjb250YWlucyB0aGUgJ2NvbmNhdCcgdGFzaywgdXNlZCB0byBjb25jYXRlbmF0ZSBhIHNlcmllcyBvZiBmaWxlcyBpbnRvIGEgc2luZ2xlIHN0cmVhbS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbVGhpcyBjbGFzcyBjb250YWlucyB0aGUgJ2NvbmNhdCcgdGFzaywgdXNlZCB0byBjb25jYXRlbmF0ZSBhIHNlcmllcwotIG9mIGZpbGVzIGludG8gYSBzaW5nbGUgc3RyZWFtLiBUaGUgZGVzdGluYXRpb24gb2YgdGhpcyBzdHJlYW0gbWF5Ci0gYmUgdGhlIHN5c3RlbSBjb25zb2xlLCBvciBhIGZpbGUuIFRoZSBmb2xsb3dpbmcgaXMgYSBzYW1wbGUKLSBpbnZvY2F0aW9uOgotCi0gPHByZT4KLSAmbHQ7Y29uY2F0IGRlc3RmaWxlPSZxdW90OyR7YnVpbGQuZGlyfS9pbmRleC54bWwmcXVvdDsKLSAgIGFwcGVuZD0mcXVvdDtmYWxzZSZxdW90OyZndDsKLQotICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7eG1sLnJvb3QuZGlyfSZxdW90OwotICAgICBpbmNsdWRlcz0mcXVvdDsqLnhtbCZxdW90OyAvJmd0OwotCi0gJmx0Oy9jb25jYXQmZ3Q7Ci0gPC9wcmU+XV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhcHBlbmQiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQmVoYXZpb3Igd2hlbiB0aGUgZGVzdGluYXRpb24gZmlsZSBleGlzdHMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIGJlaGF2aW9yIHdoZW4gdGhlIGRlc3RpbmF0aW9uIGZpbGUgZXhpc3RzLiBJZiBzZXQgdG8KLSA8Y29kZT50cnVlPC9jb2RlPiB0aGUgc3RyZWFtIGRhdGEgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUKLSBleGlzdGluZyBmaWxlLCBvdGhlcndpc2UgdGhlIGV4aXN0aW5nIGZpbGUgd2lsbCBiZQotIG92ZXJ3cml0dGVuLiBEZWZhdWx0cyB0byA8Y29kZT5mYWxzZTwvY29kZT4uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdGZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZXN0aW5hdGlvbiBmaWxlLCBvciB1c2VzIHRoZSBjb25zb2xlIGlmIG5vdCBzcGVjaWZpZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIGRlc3RpbmF0aW9uIGZpbGUsIG9yIHVzZXMgdGhlIGNvbnNvbGUgaWYgbm90IHNwZWNpZmllZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbmNvZGluZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0VuY29kaW5nIGZvciB0aGUgaW5wdXQgZmlsZXMsIHVzZWQgd2hlbiBkaXNwbGF5aW5nIHRoZQotIGRhdGEgdmlhIHRoZSBjb25zb2xlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBlbmNvZGluZyBmb3IgdGhlIGlucHV0IGZpbGVzLCB1c2VkIHdoZW4gZGlzcGxheWluZyB0aGUKLSBkYXRhIHZpYSB0aGUgY29uc29sZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImZpbGVsaXN0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlTGlzdCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZWxpc3QiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtMaXN0IG9mIGZpbGVzIHRvIGNvbmNhdGVuYXRlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtMaXN0IG9mIGZpbGVzIHRvIGNvbmNhdGVuYXRlLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IG9mIGZpbGVzIHRvIGNvbmNhdGVuYXRlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtTZXQgb2YgZmlsZXMgdG8gY29uY2F0ZW5hdGUuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gICAgICA8Ym9keSA+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGlzIG1ldGhvZCBhZGRzIHRleHQgd2hpY2ggYXBwZWFycyBpbiB0aGUgJ2NvbmNhdCcgZWxlbWVudC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYm9keT4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9ImNvbmRpdGlvbiIgY2F0ZWdvcnk9ImNvbnRyb2wiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNvbmRpdGlvblRhc2siCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Rhc2sgdG8gc2V0IGEgcHJvcGVydHkgY29uZGl0aW9uYWxseSB1c2luZyAmbHQ7dXB0b2RhdGUmZ3Q7LCAmbHQ7YXZhaWxhYmxlJmd0OywgYW5kIG1hbnkgb3RoZXIgc3VwcG9ydGVkIGNvbmRpdGlvbnMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW1Rhc2sgdG8gc2V0IGEgcHJvcGVydHkgY29uZGl0aW9uYWxseSB1c2luZyAmbHQ7dXB0b2RhdGUmZ3Q7LCAmbHQ7YXZhaWxhYmxlJmd0OywKLSBhbmQgbWFueSBvdGhlciBzdXBwb3J0ZWQgY29uZGl0aW9ucy4KLQotIDxwPlRoaXMgdGFzayBzdXBwb3J0cyBib29sZWFuIGxvZ2ljIGFzIHdlbGwgYXMgcGx1Z2dhYmxlIGNvbmRpdGlvbnMKLSB0byBkZWNpZGUsIHdoZXRoZXIgYSBwcm9wZXJ0eSBzaG91bGQgYmUgc2V0LjwvcD4KLQotIDxwPlRoaXMgdGFzayBkb2VzIG5vdCBleHRlbmQgVGFzayB0byB0YWtlIGFkdmFudGFnZSBvZgotIENvbmRpdGlvbkJhc2UuPC9wPl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvcGVydHkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LiBSZXF1aXJlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IHRvIHNldCwgaWYgY29uZGl0aW9uIGV2YWx1YXRlcyB0byB0cnVlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSB0byBzZXQsIGlmIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4KLSBEZWZhdWx0cyB0byAidHJ1ZSIuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJhbmQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5BbmQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhbiAmbHQ7YW5kJmd0OyBjb25kaXRpb24gImNvbnRhaW5lciIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCBhbiAmbHQ7YW5kJmd0OyBjb25kaXRpb24gImNvbnRhaW5lciIuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImF2YWlsYWJsZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQXZhaWxhYmxlIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYW4gJmx0O2F2YWlsYWJsZSZndDsgY29uZGl0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGQgYW4gJmx0O2F2YWlsYWJsZSZndDsgY29uZGl0aW9uLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJjaGVja3N1bSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ2hlY2tzdW0iCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhbiAmbHQ7Y2hlY2tzdW0mZ3Q7IGNvbmRpdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkIGFuICZsdDtjaGVja3N1bSZndDsgY29uZGl0aW9uLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJjb250YWlucyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkNvbnRhaW5zIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSAmbHQ7Y29udGFpbnMmZ3Q7IGNvbmRpdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgJmx0O2NvbnRhaW5zJmd0OyBjb25kaXRpb24uXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImVxdWFscyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkVxdWFscyIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGFuICZsdDtlcXVhbHMmZ3Q7IGNvbmRpdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkIGFuICZsdDtlcXVhbHMmZ3Q7IGNvbmRpdGlvbi5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNtYXRjaCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkZpbGVzTWF0Y2giCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhICZsdDtmaWxlc21hdGNoJmd0OyBjb25kaXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCBhICZsdDtmaWxlc21hdGNoJmd0OyBjb25kaXRpb24uXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9Imh0dHAiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5IdHRwIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYW4gJmx0O2h0dHAmZ3Q7IGNvbmRpdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkIGFuICZsdDtodHRwJmd0OyBjb25kaXRpb24uXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImlzZmFsc2UiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5Jc0ZhbHNlIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSAmbHQ7aXNmYWxzZSZndDsgY29uZGl0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGQgYSAmbHQ7aXNmYWxzZSZndDsgY29uZGl0aW9uLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJpc3NldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLklzU2V0IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYW4gJmx0O2lzc2V0Jmd0OyBjb25kaXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCBhbiAmbHQ7aXNzZXQmZ3Q7IGNvbmRpdGlvbi5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iaXN0cnVlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uSXNUcnVlIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSAmbHQ7aXN0cnVlJmd0OyBjb25kaXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCBhICZsdDtpc3RydWUmZ3Q7IGNvbmRpdGlvbi5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0ibm90IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uTm90IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYW4gJmx0O25vdCZndDsgY29uZGl0aW9uICJjb250YWluZXIiLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGQgYW4gJmx0O25vdCZndDsgY29uZGl0aW9uICJjb250YWluZXIiLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJvciIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9yIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYW4gJmx0O29yJmd0OyBjb25kaXRpb24gImNvbnRhaW5lciIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCBhbiAmbHQ7b3ImZ3Q7IGNvbmRpdGlvbiAiY29udGFpbmVyIi5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0ib3MiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5PcyIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGFuICZsdDtvcyZndDsgY29uZGl0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGQgYW4gJmx0O29zJmd0OyBjb25kaXRpb24uXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9InNvY2tldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLlNvY2tldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgJmx0O3NvY2tldCZndDsgY29uZGl0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGQgYSAmbHQ7c29ja2V0Jmd0OyBjb25kaXRpb24uXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9InVwdG9kYXRlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5VcFRvRGF0ZSIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGFuICZsdDt1cHRvZGF0ZSZndDsgY29uZGl0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGQgYW4gJmx0O3VwdG9kYXRlJmd0OyBjb25kaXRpb24uXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iY29weSIgY2F0ZWdvcnk9ImZpbGVzeXN0ZW0iCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNvcHkiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NvcGllcyBhIGZpbGUgb3IgZGlyZWN0b3J5IHRvIGEgbmV3IGZpbGUgb3IgZGlyZWN0b3J5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtDb3BpZXMgYSBmaWxlIG9yIGRpcmVjdG9yeSB0byBhIG5ldyBmaWxlCi0gb3IgZGlyZWN0b3J5LiAgRmlsZXMgYXJlIG9ubHkgY29waWVkIGlmIHRoZSBzb3VyY2UgZmlsZSBpcyBuZXdlcgotIHRoYW4gdGhlIGRlc3RpbmF0aW9uIGZpbGUsIG9yIHdoZW4gdGhlIGRlc3RpbmF0aW9uIGZpbGUgZG9lcyBub3QKLSBleGlzdC4gIEl0IGlzIHBvc3NpYmxlIHRvIGV4cGxpY2l0bHkgb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzLjwvcD4KLQotIDxwPlRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gQXJub3V0IEt1aXBlcidzIGluaXRpYWwgZGVzaWduCi0gZG9jdW1lbnQsIHRoZSBmb2xsb3dpbmcgbWFpbGluZyBsaXN0IGRpc2N1c3Npb25zLCBhbmQgdGhlCi0gY29weWZpbGUvY29weWRpciB0YXNrcy48L3A+XV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbmNvZGluZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NoYXJhY3RlciBlbmNvZGluZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgY2hhcmFjdGVyIGVuY29kaW5nCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgZmFsc2UsIG5vdGUgZXJyb3JzIHRvIHRoZSBvdXRwdXQgYnV0IGtlZXAgZ29pbmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIGZhbHNlLCBub3RlIGVycm9ycyB0byB0aGUgb3V0cHV0IGJ1dCBrZWVwIGdvaW5nLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTaW5nbGUgc291cmNlIGZpbGUgdG8gY29weS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyBhIHNpbmdsZSBzb3VyY2UgZmlsZSB0byBjb3B5LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbHRlcmluZyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBlbmFibGVzIGZpbHRlcmluZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgZW5hYmxlcyBmaWx0ZXJpbmcuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmxhdHRlbiIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGVuIGNvcHlpbmcgZGlyZWN0b3J5IHRyZWVzLCB0aGUgZmlsZXMgY2FuIGJlICJmbGF0dGVuZWQiCi0gaW50byBhIHNpbmdsZSBkaXJlY3RvcnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFdoZW4gY29weWluZyBkaXJlY3RvcnkgdHJlZXMsIHRoZSBmaWxlcyBjYW4gYmUgImZsYXR0ZW5lZCIKLSBpbnRvIGEgc2luZ2xlIGRpcmVjdG9yeS4gIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBmaWxlcyB3aXRoCi0gdGhlIHNhbWUgbmFtZSBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSB0cmVlLCBvbmx5IHRoZSBmaXJzdAotIGZpbGUgd2lsbCBiZSBjb3BpZWQgaW50byB0aGUgImZsYXR0ZW5lZCIgZGlyZWN0b3J5LCB1bmxlc3MKLSB0aGUgZm9yY2VvdmVyd3JpdGUgYXR0cmlidXRlIGlzIHRydWUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5jbHVkZWVtcHR5ZGlycyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtVc2VkIHRvIGNvcHkgZW1wdHkgZGlyZWN0b3JpZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFVzZWQgdG8gY29weSBlbXB0eSBkaXJlY3Rvcmllcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdmVyd3JpdGUiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbT3ZlcndyaXRlIGFueSBleGlzdGluZyBkZXN0aW5hdGlvbiBmaWxlKHMpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBPdmVyd3JpdGUgYW55IGV4aXN0aW5nIGRlc3RpbmF0aW9uIGZpbGUocykuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJlc2VydmVsYXN0bW9kaWZpZWQiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbR2l2ZSB0aGUgY29waWVkIGZpbGVzIHRoZSBzYW1lIGxhc3QgbW9kaWZpZWQgdGltZSBhcyB0aGUgb3JpZ2luYWwgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEdpdmUgdGhlIGNvcGllZCBmaWxlcyB0aGUgc2FtZSBsYXN0IG1vZGlmaWVkIHRpbWUgYXMgdGhlIG9yaWdpbmFsIGZpbGVzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRvZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVzdGluYXRpb24gZGlyZWN0b3J5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idG9maWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVzdGluYXRpb24gZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgZGVzdGluYXRpb24gZmlsZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJib3NlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1VzZWQgdG8gZm9yY2UgbGlzdGluZyBvZiBhbGwgbmFtZXMgb2YgY29waWVkIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBVc2VkIHRvIGZvcmNlIGxpc3Rpbmcgb2YgYWxsIG5hbWVzIG9mIGNvcGllZCBmaWxlcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGVzZXQiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgc2V0IG9mIGZpbGVzIHRvIGNvcHkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZmlsZXMgdG8gY29weS5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsdGVyY2hhaW4iIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbHRlckNoYWluIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWx0ZXJDaGFpbiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBGaWx0ZXJDaGFpbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIEZpbHRlckNoYWluLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJmaWx0ZXJzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbHRlclNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsdGVyc2V0IgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIGZpbHRlcnNldC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIGZpbHRlcnNldC5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0ibWFwcGVyIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5NYXBwZXIiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9Ik1hcHBlciIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RlZmluZXMgdGhlIG1hcHBlciB0byBtYXAgc291cmNlIHRvIGRlc3RpbmF0aW9uIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtEZWZpbmVzIHRoZSBtYXBwZXIgdG8gbWFwIHNvdXJjZSB0byBkZXN0aW5hdGlvbiBmaWxlcy5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJjb3B5ZGlyIiBjYXRlZ29yeT0ib3RoZXIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNvcHlkaXIiCi0gICAgICBkZXByZWNhdGVkPSJ0cnVlIgotICAgICAgbWF0Y2hpbmdUYXNrPSJ0cnVlIj4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29waWVzIGEgZGlyZWN0b3J5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtDb3BpZXMgYSBkaXJlY3RvcnkuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0IiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTm8gZGVzY3JpcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbHRlcmluZyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtObyBkZXNjcmlwdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmxhdHRlbiIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtObyBkZXNjcmlwdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZm9yY2VvdmVyd3JpdGUiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTm8gZGVzY3JpcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNyYyIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05vIGRlc2NyaXB0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iY29weWZpbGUiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ29weWZpbGUiCi0gICAgICBkZXByZWNhdGVkPSJ0cnVlIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDb3BpZXMgYSBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtDb3BpZXMgYSBmaWxlLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdCIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05vIGRlc2NyaXB0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWx0ZXJpbmciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtObyBkZXNjcmlwdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZm9yY2VvdmVyd3JpdGUiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTm8gZGVzY3JpcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNyYyIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05vIGRlc2NyaXB0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iY3NjIiBjYXRlZ29yeT0iZG90bmV0IgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kb3RuZXQuQ1NoYXJwIgotICAgICAgbWF0Y2hpbmdUYXNrPSJ0cnVlIj4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29tcGlsZXMgQyMgc291cmNlIGludG8gZXhlY3V0YWJsZXMgb3IgbW9kdWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbQ29tcGlsZXMgQyMgc291cmNlIGludG8gZXhlY3V0YWJsZXMgb3IgbW9kdWxlcy4KLQotICBUaGUgdGFzayB3aWxsIG9ubHkgd29yayBvbiB3aW4ySyB1bnRpbCBvdGhlciBwbGF0Zm9ybXMgc3VwcG9ydAotICBjc2MuZXhlIG9yIGFuIGVxdWl2YWxlbnQuIENTQy5leGUgbXVzdCBiZSBvbiB0aGUgZXhlY3V0ZSBwYXRoIHRvby4gPHA+Ci0KLSAgQWxsIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsOiAmbHQ7Y3NjLyZndDsgc2hvdWxkIHN1ZmZpY2UgdG8gcHJvZHVjZSBhIGRlYnVnCi0gIGJ1aWxkIG9mIGFsbCAqLmNzIGZpbGVzLiBSZWZlcmVuY2VzIHRvIGV4dGVybmFsIGZpbGVzIGRvIHJlcXVpcmUgZXhwbGljaXQKLSAgZW51bWVyYXRpb24sIHNvIGFyZSBvbmUgb2YgdGhlIGZpcnN0IGF0dHJpYnV0ZXMgdG8gY29uc2lkZXIgYWRkaW5nLiA8cD4KLQotICBUaGUgdGFzayBpcyBhIGRpcmVjdG9yeSBiYXNlZCB0YXNrLCBzbyBhdHRyaWJ1dGVzIGxpa2UgPGI+aW5jbHVkZXM9IiouY3MiCi0gIDwvYj4gYW5kIDxiPmV4Y2x1ZGVzPSJicm9rZW4uY3MiPC9iPiBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSBmaWxlcyBwdWxsZWQKLSAgaW4uIEJ5IGRlZmF1bHQsIGFsbCAqLmNzIGZpbGVzIGZyb20gdGhlIHByb2plY3QgZm9sZGVyIGRvd24gYXJlIGluY2x1ZGVkIGluCi0gIHRoZSBjb21tYW5kLiBXaGVuIHRoaXMgaGFwcGVucyB0aGUgb3V0cHV0IGZpbGUgLWlmIG5vdCBzcGVjaWZpZWQtIGlzIHRha2VuCi0gIGFzIHRoZSBmaXJzdCBmaWxlIGluIHRoZSBsaXN0LCB3aGljaCBtYXkgYmUgc29tZXdoYXQgaGFyZCB0byBjb250cm9sLgotICBTcGVjaWZ5aW5nIHRoZSBvdXRwdXQgZmlsZSB3aXRoIDxiPidvdXRmaWxlJzwvYj4gc2VlbXMgcHJ1ZGVudC4gPHA+Ci0KLSAgPHA+Ci0KLSAgVE9ETwotICA8b2w+Ci0gICAgPGxpPiBpcyBpbmNyZW1lbnRhbCBidWlsZCBzdGlsbCBicm9rZW4gaW4gYmV0YS0xPwotICAgIDxsaT4gaXMgV2luMzJJY29uIGJyb2tlbj8KLSAgICA8bGk+IGFsbCB0aGUgbWlzc2luZyBvcHRpb25zCi0gIDwvb2w+Ci0gIDxwPgotCi0gIEhpc3RvcnkKLSAgPFRhYmxlPgotCi0gICAgPHRyPgotCi0gICAgICA8dGQ+Ci0gICAgICAgIDAuMwotICAgICAgPC90ZD4KLQotICAgICAgPHRkPgotICAgICAgICBCZXRhIDEgZWRpdGlvbgotICAgICAgPC90ZD4KLQotICAgICAgPHRkPgotICAgICAgICBUbyBhdm9pZCBoYXZpbmcgdG8gcmVtZW1iZXIgd2hpY2ggYXNzZW1ibGllcyB0byBpbmNsdWRlLCB0aGUgdGFzawotICAgICAgICBhdXRvbWF0aWNhbGx5IHJlZmVycyB0byB0aGUgbWFpbiBkb3RuZXQgbGlicmFyaWVzIGluIEJldGExLgotICAgICAgPC90cj4KLQotICAgICAgPHRyPgotCi0gICAgICAgIDx0ZD4KLSAgICAgICAgICAwLjIKLSAgICAgICAgPC90ZD4KLQotICAgICAgICA8dGQ+Ci0gICAgICAgICAgU2xpZ2h0bHkgZGlmZmVyZW50Ci0gICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgPHRkPgotICAgICAgICAgIFNwbGl0IGNvbW1hbmQgZXhlY3V0aW9uIHRvIGEgc2VwYXJhdGUgY2xhc3M7Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotCi0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgMC4xCi0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgICJJIGNhbid0IGJlbGlldmUgaXQncyBzbyBydWRpbWVudGFyeSIKLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgRmlyc3QgcGFzczsgbWluaW1hbCBidWlsZHMgb25seSBzdXBwb3J0OwotICAgICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPC90YWJsZT5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImFkZGl0aW9uYWxtb2R1bGVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2VtaWNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIG1vZHVsZXMgdG8gcmVmZXIgdG8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNlbWljb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiBtb2R1bGVzIHRvIHJlZmVyIHRvLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlYnVnIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RlYnVnIGZsYWcgb24gb3Igb2ZmLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBzZXQgdGhlIGRlYnVnIGZsYWcgb24gb3Igb2ZmLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmluaXRpb25zIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2VtaWNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIGRlZmluZWQgY29uc3RhbnRzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZW1pY29sb24gc2VwYXJhdGVkIGxpc3Qgb2YgZGVmaW5lZCBjb25zdGFudHMuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdGRpciIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Rlc3RpbmF0aW9uIGRpcmVjdG9yeSBvZiBmaWxlcyB0byBiZSBjb21waWxlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3Rvcnkgb2YgZmlsZXMgdG8gYmUgY29tcGlsZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdGZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIG9mIGV4ZS9saWJyYXJ5IHRvIGNyZWF0ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBuYW1lIG9mIGV4ZS9saWJyYXJ5IHRvIGNyZWF0ZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2NmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZSBmb3IgZ2VuZXJhdGVkIFhNTCBkb2N1bWVudGF0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBmaWxlIGZvciBnZW5lcmF0ZWQgWE1MIGRvY3VtZW50YXRpb24KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHRyYW9wdGlvbnMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBbnkgZXh0cmEgb3B0aW9ucyB3aGljaCBhcmUgbm90IGV4cGxpY2l0bHkgc3VwcG9ydGVkCi0gYnkgdGhpcyB0YXNrLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBBbnkgZXh0cmEgb3B0aW9ucyB3aGljaCBhcmUgbm90IGV4cGxpY2l0bHkgc3VwcG9ydGVkCi0gYnkgdGhpcyB0YXNrLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGZhaWwgb24gY29tcGlsYXRpb24gZXJyb3JzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCBmYWlsIG9uIGNvbXBpbGF0aW9uIGVycm9ycy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlYWxpZ24iIHR5cGU9ImludCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJpbnQiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZpbGUgYWxpZ25tZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGZpbGUgYWxpZ25tZW50LgotIFZhbGlkIHZhbHVlcyBhcmUgMCw1MTIsIDEwMjQsIDIwNDgsIDQwOTYsIDgxOTIsCi0gYW5kIDE2Mzg0LCAwIG1lYW5zICdsZWF2ZSB0byB0aGUgY29tcGlsZXInCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZnVsbHBhdGhzIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHByaW50IHRoZSBmdWxsIHBhdGggb2YgZmlsZXMgb24gZXJyb3JzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCBwcmludCB0aGUgZnVsbCBwYXRoIG9mIGZpbGVzIG9uIGVycm9ycy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmNsdWRlZGVmYXVsdHJlZmVyZW5jZXMiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgYXV0b21hdGljYWxseSBpbmNsdWRlcyB0aGUgY29tbW9uIGFzc2VtYmxpZXMKLSBpbiBkb3RuZXQsIGFuZCB0ZWxscyB0aGUgY29tcGlsZXIgdG8gbGluayBpbiBtc2NvcmUuZGxsLgotCi0gIHNldCB0aGUgYXV0b21hdGljIHJlZmVyZW5jZSBpbmNsdXNpb24gZmxhZyBvbiBvciBvZmYgdGhpcyBmbGFnIGNvbnRyb2xzCi0gIHRoZSBzdHJpbmcgb2YgcmVmZXJlbmNlcyBhbmQgdGhlIC9ub3N0ZGxpYiBvcHRpb24gaW4gQ1NDLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCBhdXRvbWF0aWNhbGx5IGluY2x1ZGVzIHRoZSBjb21tb24gYXNzZW1ibGllcwotIGluIGRvdG5ldCwgYW5kIHRlbGxzIHRoZSBjb21waWxlciB0byBsaW5rIGluIG1zY29yZS5kbGwuCi0KLSAgc2V0IHRoZSBhdXRvbWF0aWMgcmVmZXJlbmNlIGluY2x1c2lvbiBmbGFnIG9uIG9yIG9mZiB0aGlzIGZsYWcgY29udHJvbHMKLSAgdGhlIHN0cmluZyBvZiByZWZlcmVuY2VzIGFuZCB0aGUgL25vc3RkbGliIG9wdGlvbiBpbiBDU0MKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmNyZW1lbnRhbCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJbmNyZW1lbnRhbCBjb21waWxhdGlvbiBmbGFnIG9uIG9yIG9mZi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgc2V0IHRoZSBpbmNyZW1lbnRhbCBjb21waWxhdGlvbiBmbGFnIG9uIG9yIG9mZi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYWluY2xhc3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIG9mIG1haW4gY2xhc3MgZm9yIGV4ZWN1dGFibGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBuYW1lIG9mIG1haW4gY2xhc3MgZm9yIGV4ZWN1dGFibGVzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im5vY29uZmlnIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0EgZmxhZyB0aGF0IHRlbGxzIHRoZSBjb21waWxlciBub3QgdG8gcmVhZCBpbiB0aGUgY29tcGlsZXIgCi0gc2V0dGluZ3MgZmlsZXMgJ2NzYy5yc3AnIGluIGl0cyBiaW4gZGlyZWN0b3J5IGFuZCB0aGVuIHRoZSBsb2NhbCBkaXJlY3RvcnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEEgZmxhZyB0aGF0IHRlbGxzIHRoZSBjb21waWxlciBub3QgdG8gcmVhZCBpbiB0aGUgY29tcGlsZXIgCi0gc2V0dGluZ3MgZmlsZXMgJ2NzYy5yc3AnIGluIGl0cyBiaW4gZGlyZWN0b3J5IGFuZCB0aGVuIHRoZSBsb2NhbCBkaXJlY3RvcnkKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvcHRpbWl6ZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBlbmFibGVzIG9wdGltaXphdGlvbiBmbGFnLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCBlbmFibGVzIG9wdGltaXphdGlvbiBmbGFnLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im91dHB1dGZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPdXRwdXQgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBvdXRwdXQgZmlsZQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWZpbGVzIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BhdGggb2YgcmVmZXJlbmNlcyB0byBpbmNsdWRlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBQYXRoIG9mIHJlZmVyZW5jZXMgdG8gaW5jbHVkZS4KLSBXaWxkY2FyZHMgc2hvdWxkIHdvcmsuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NlbWljb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiBETExzIHRvIHJlZmVyIHRvLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZW1pY29sb24gc2VwYXJhdGVkIGxpc3Qgb2YgRExMcyB0byByZWZlciB0by4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmNkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2UgZGlyZWN0b3J5IG9mIHRoZSBmaWxlcyB0byBiZSBjb21waWxlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBzb3VyY2UgZGlyZWN0b3J5IG9mIHRoZSBmaWxlcyB0byBiZSBjb21waWxlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXR0eXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVHlwZSBvZiB0YXJnZXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgdHlwZSBvZiB0YXJnZXQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idW5zYWZlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGVuYWJsZXMgdGhlIHVuc2FmZSBrZXl3b3JkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCBlbmFibGVzIHRoZSB1bnNhZmUga2V5d29yZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1dGY4b3V0cHV0IiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHJlcXVpcmUgYWxsIGNvbXBpbGVyIG91dHB1dCB0byBiZSBpbiBVVEY4IGZvcm1hdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgcmVxdWlyZSBhbGwgY29tcGlsZXIgb3V0cHV0IHRvIGJlIGluIFVURjggZm9ybWF0LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Indhcm5sZXZlbCIgdHlwZT0iaW50IgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTGV2ZWwgb2Ygd2FybmluZyBjdXJyZW50bHkgYmV0d2VlbiAxIGFuZCA0Ci0gd2l0aCA0IGJlaW5nIHRoZSBzdHJpY3Rlc3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIExldmVsIG9mIHdhcm5pbmcgY3VycmVudGx5IGJldHdlZW4gMSBhbmQgNAotIHdpdGggNCBiZWluZyB0aGUgc3RyaWN0ZXN0LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9IndpbjMyaWNvbiIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZpbGVuYW1lIG9mIGljb24gdG8gaW5jbHVkZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBmaWxlbmFtZSBvZiBpY29uIHRvIGluY2x1ZGUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0id2luMzJyZXMiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGaWxlbmFtZSBvZiBhIHdpbjMyIHJlc291cmNlICguUkVTKSBmaWxlIHRvIGluY2x1ZGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIGZpbGVuYW1lIG9mIGEgd2luMzIgcmVzb3VyY2UgKC5SRVMpIGZpbGUgdG8gaW5jbHVkZS4KLSBUaGlzIGlzIG5vdCBhIC5ORVQgcmVzb3VyY2UsIGJ1dCB3aGF0IFdpbmRvd3MgaXMgdXNlZCB0by4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iY3ZzIiBjYXRlZ29yeT0ic2NtIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5DdnMiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BlcmZvcm1zIG9wZXJhdGlvbnMgb24gYSBDVlMgcmVwb3NpdG9yeS4gb3JpZ2luYWwgMS4yMCBOT1RFOiBUaGlzIGltcGxlbWVudGF0aW9uIGhhcyBiZWVuIG1vdmVkIHRvIEFic3RyYWN0Q3ZzVGFzayB3aXRoIHRoZSBhZGRpdGlvbiBvZiBzb21lIGFjY2Vzc29ycyBmb3IgZXh0ZW5zaWJpbGl0eS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbUGVyZm9ybXMgb3BlcmF0aW9ucyBvbiBhIENWUyByZXBvc2l0b3J5LgotCi0gb3JpZ2luYWwgMS4yMAotCi0gIE5PVEU6IFRoaXMgaW1wbGVtZW50YXRpb24gaGFzIGJlZW4gbW92ZWQgdG8gQWJzdHJhY3RDdnNUYXNrIHdpdGgKLSAgdGhlIGFkZGl0aW9uIG9mIHNvbWUgYWNjZXNzb3JzIGZvciBleHRlbnNpYmlsaXR5Ll1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXBwZW5kIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgdG8gYXBwZW5kIG91dHB1dC9lcnJvciB3aGVuIHJlZGlyZWN0aW5nIHRvIGEgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgV2hldGhlciB0byBhcHBlbmQgb3V0cHV0L2Vycm9yIHdoZW4gcmVkaXJlY3RpbmcgdG8gYSBmaWxlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbW1hbmQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgQ1ZTIGNvbW1hbmQgdG8gZXhlY3V0ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIENWUyBjb21tYW5kIHRvIGV4ZWN1dGUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tcHJlc3Npb24iIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgdGhpcyBpcyB0aGUgc2FtZSBhcyBjb21wcmVzc2lvbmxldmVsPSIzIi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgdGhpcyBpcyB0aGUgc2FtZSBhcyBjb21wcmVzc2lvbmxldmVsPSIzIi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21wcmVzc2lvbmxldmVsIiB0eXBlPSJpbnQiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iaW50IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiBzZXQgdG8gYSB2YWx1ZSAxLTkgaXQgYWRkcyAtek4gdG8gdGhlIGN2cyBjb21tYW5kIGxpbmUsIGVsc2UKLSBpdCBkaXNhYmxlcyBjb21wcmVzc2lvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgc2V0IHRvIGEgdmFsdWUgMS05IGl0IGFkZHMgLXpOIHRvIHRoZSBjdnMgY29tbWFuZCBsaW5lLCBlbHNlCi0gaXQgZGlzYWJsZXMgY29tcHJlc3Npb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY3Zzcm9vdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBDVlNST09UIHZhcmlhYmxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgQ1ZTUk9PVCB2YXJpYWJsZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjdnNyc2giIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgQ1ZTX1JTSCB2YXJpYWJsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIENWU19SU0ggdmFyaWFibGUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1VzZSB0aGUgbW9zdCByZWNlbnQgcmV2aXNpb24gbm8gbGF0ZXIgdGhhbiB0aGUgZ2l2ZW4gZGF0ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVXNlIHRoZSBtb3N0IHJlY2VudCByZXZpc2lvbiBubyBsYXRlciB0aGFuIHRoZSBnaXZlbiBkYXRlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3QiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBjaGVja2VkIG91dCBmaWxlcyBzaG91bGQgYmUgcGxhY2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBjaGVja2VkIG91dCBmaWxlcyBzaG91bGQgYmUgcGxhY2VkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImVycm9yIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGZpbGUgdG8gZGlyZWN0IHN0YW5kYXJkIGVycm9yIGZyb20gdGhlIGNvbW1hbmQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBmaWxlIHRvIGRpcmVjdCBzdGFuZGFyZCBlcnJvciBmcm9tIHRoZSBjb21tYW5kLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1N0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aAotIGEgcmV0dXJuIGNvZGUgb3RoZXIgdGhhbiAwLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIHRoZSBjb21tYW5kIGV4aXRzIHdpdGgKLSBhIHJldHVybiBjb2RlIG90aGVyIHRoYW4gMC4KLSBEZWZhdWx0cyB0byBmYWxzZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJub2V4ZWMiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgcmVwb3J0IG9ubHkgYW5kIGRvbid0IGNoYW5nZSBhbnkgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIHJlcG9ydCBvbmx5IGFuZCBkb24ndCBjaGFuZ2UgYW55IGZpbGVzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im91dHB1dCIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBmaWxlIHRvIGRpcmVjdCBzdGFuZGFyZCBvdXRwdXQgZnJvbSB0aGUgY29tbWFuZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGZpbGUgdG8gZGlyZWN0IHN0YW5kYXJkIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InBhY2thZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcGFja2FnZS9tb2R1bGUgdG8gb3BlcmF0ZSB1cG9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgcGFja2FnZS9tb2R1bGUgdG8gb3BlcmF0ZSB1cG9uLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InBhc3NmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGFzc3dvcmQgZmlsZSB0byByZWFkIHBhc3N3b3JkcyBmcm9tLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBQYXNzd29yZCBmaWxlIHRvIHJlYWQgcGFzc3dvcmRzIGZyb20uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9ydCIgdHlwZT0iaW50IgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUG9ydCB1c2VkIGJ5IENWUyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBzZXJ2ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFBvcnQgdXNlZCBieSBDVlMgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgc2VydmVyLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InF1aWV0IiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHN1cHByZXNzIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIHN1cHByZXNzIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHRhZyBvZiB0aGUgcGFja2FnZS9tb2R1bGUgdG8gb3BlcmF0ZSB1cG9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgdGFnIG9mIHRoZSBwYWNrYWdlL21vZHVsZSB0byBvcGVyYXRlIHVwb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJjb21tYW5kbGluZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmUiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgZGlyZWN0IGNvbW1hbmQtbGluZSB0byBleGVjdXRlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGRpcmVjdCBjb21tYW5kLWxpbmUgdG8gZXhlY3V0ZS5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJjdnNjaGFuZ2Vsb2ciIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY3ZzbGliLkNoYW5nZUxvZ1Rhc2siCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0V4YW1pbmVzIHRoZSBvdXRwdXQgb2YgY3ZzIGxvZyBhbmQgZ3JvdXAgcmVsYXRlZCBjaGFuZ2VzIHRvZ2V0aGVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtFeGFtaW5lcyB0aGUgb3V0cHV0IG9mIGN2cyBsb2cgYW5kIGdyb3VwIHJlbGF0ZWQgY2hhbmdlcyB0b2dldGhlci4KLQotIEl0IHByb2R1Y2VzIGFuIFhNTCBvdXRwdXQgcmVwcmVzZW50aW5nIHRoZSBsaXN0IG9mIGNoYW5nZXMuCi0gPFBSRT4KLSA8Rk9OVCBjb2xvcj0jMDAwMGZmPiZsdDshLS0gUm9vdCBlbGVtZW50IC0tJmd0OzwvRk9OVD4KLSA8Rk9OVCBjb2xvcj0jNmE1YWNkPiZsdDshRUxFTUVOVDwvRk9OVD4gY2hhbmdlbG9nIDxGT05UIGNvbG9yPSNmZjAwZmY+KGVudHJ5PC9GT05UPjxGT05UIGNvbG9yPSNmZjAwZmY+KzwvRk9OVD48Rk9OVCBjb2xvcj0jZmYwMGZmPik8L0ZPTlQ+PEZPTlQgY29sb3I9IzZhNWFjZD4mZ3Q7PC9GT05UPgotIDxGT05UIGNvbG9yPSMwMDAwZmY+Jmx0OyEtLSBDVlMgRW50cnkgLS0mZ3Q7PC9GT05UPgotIDxGT05UIGNvbG9yPSM2YTVhY2Q+Jmx0OyFFTEVNRU5UPC9GT05UPiBlbnRyeSA8Rk9OVCBjb2xvcj0jZmYwMGZmPihkYXRlLGF1dGhvcixmaWxlPC9GT05UPjxGT05UIGNvbG9yPSNmZjAwZmY+KzwvRk9OVD48Rk9OVCBjb2xvcj0jZmYwMGZmPixtc2cpPC9GT05UPjxGT05UIGNvbG9yPSM2YTVhY2Q+Jmd0OzwvRk9OVD4KLSA8Rk9OVCBjb2xvcj0jMDAwMGZmPiZsdDshLS0gRGF0ZSBvZiBjdnMgZW50cnkgLS0mZ3Q7PC9GT05UPgotIDxGT05UIGNvbG9yPSM2YTVhY2Q+Jmx0OyFFTEVNRU5UPC9GT05UPiBkYXRlIDxGT05UIGNvbG9yPSNmZjAwZmY+KCNQQ0RBVEEpPC9GT05UPjxGT05UIGNvbG9yPSM2YTVhY2Q+Jmd0OzwvRk9OVD4KLSA8Rk9OVCBjb2xvcj0jMDAwMGZmPiZsdDshLS0gQXV0aG9yIG9mIGNoYW5nZSAtLSZndDs8L0ZPTlQ+Ci0gPEZPTlQgY29sb3I9IzZhNWFjZD4mbHQ7IUVMRU1FTlQ8L0ZPTlQ+IGF1dGhvciA8Rk9OVCBjb2xvcj0jZmYwMGZmPigjUENEQVRBKTwvRk9OVD48Rk9OVCBjb2xvcj0jNmE1YWNkPiZndDs8L0ZPTlQ+Ci0gPEZPTlQgY29sb3I9IzAwMDBmZj4mbHQ7IS0tIExpc3Qgb2YgZmlsZXMgYWZmZWN0ZWQgLS0mZ3Q7PC9GT05UPgotIDxGT05UIGNvbG9yPSM2YTVhY2Q+Jmx0OyFFTEVNRU5UPC9GT05UPiBtc2cgPEZPTlQgY29sb3I9I2ZmMDBmZj4oI1BDREFUQSk8L0ZPTlQ+PEZPTlQgY29sb3I9IzZhNWFjZD4mZ3Q7PC9GT05UPgotIDxGT05UIGNvbG9yPSMwMDAwZmY+Jmx0OyEtLSBGaWxlIGNoYW5nZWQgLS0mZ3Q7PC9GT05UPgotIDxGT05UIGNvbG9yPSM2YTVhY2Q+Jmx0OyFFTEVNRU5UPC9GT05UPiBmaWxlIDxGT05UIGNvbG9yPSNmZjAwZmY+KG5hbWUscmV2aXNpb24scHJldnJldmlzaW9uPC9GT05UPjxGT05UIGNvbG9yPSNmZjAwZmY+PzwvRk9OVD48Rk9OVCBjb2xvcj0jZmYwMGZmPik8L0ZPTlQ+PEZPTlQgY29sb3I9IzZhNWFjZD4mZ3Q7PC9GT05UPgotIDxGT05UIGNvbG9yPSMwMDAwZmY+Jmx0OyEtLSBOYW1lIG9mIHRoZSBmaWxlIC0tJmd0OzwvRk9OVD4KLSA8Rk9OVCBjb2xvcj0jNmE1YWNkPiZsdDshRUxFTUVOVDwvRk9OVD4gbmFtZSA8Rk9OVCBjb2xvcj0jZmYwMGZmPigjUENEQVRBKTwvRk9OVD48Rk9OVCBjb2xvcj0jNmE1YWNkPiZndDs8L0ZPTlQ+Ci0gPEZPTlQgY29sb3I9IzAwMDBmZj4mbHQ7IS0tIFJldmlzaW9uIG51bWJlciAtLSZndDs8L0ZPTlQ+Ci0gPEZPTlQgY29sb3I9IzZhNWFjZD4mbHQ7IUVMRU1FTlQ8L0ZPTlQ+IHJldmlzaW9uIDxGT05UIGNvbG9yPSNmZjAwZmY+KCNQQ0RBVEEpPC9GT05UPjxGT05UIGNvbG9yPSM2YTVhY2Q+Jmd0OzwvRk9OVD4KLSA8Rk9OVCBjb2xvcj0jMDAwMGZmPiZsdDshLS0gUHJldmlvdXMgcmV2aXNpb24gbnVtYmVyIC0tJmd0OzwvRk9OVD4KLSA8Rk9OVCBjb2xvcj0jNmE1YWNkPiZsdDshRUxFTUVOVDwvRk9OVD4gcHJldnJldmlzaW9uIDxGT05UIGNvbG9yPSNmZjAwZmY+KCNQQ0RBVEEpPC9GT05UPjxGT05UIGNvbG9yPSM2YTVhY2Q+Jmd0OzwvRk9OVD4KLSA8L1BSRT5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRheXNpbnBhc3QiIHR5cGU9ImludCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJpbnQiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW051bWJlciBvZiBkYXlzIHdvcnRoIG9mIGxvZyBlbnRyaWVzIHRvIHByb2Nlc3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgbnVtYmVyIG9mIGRheXMgd29ydGggb2YgbG9nIGVudHJpZXMgdG8gcHJvY2Vzcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0ZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW091dHB1dCBmaWxlIGZvciB0aGUgbG9nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIG91dHB1dCBmaWxlIGZvciB0aGUgbG9nLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRpciIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Jhc2UgZGlyIGZvciBjdnMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgYmFzZSBkaXIgZm9yIGN2cy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbmQiIHR5cGU9ImphdmEudXRpbC5EYXRlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkRhdGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RhdGUgYXQgd2hpY2ggdGhlIGNoYW5nZWxvZyBzaG91bGQgc3RvcC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBkYXRlIGF0IHdoaWNoIHRoZSBjaGFuZ2Vsb2cgc2hvdWxkIHN0b3AuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RhcnQiIHR5cGU9ImphdmEudXRpbC5EYXRlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkRhdGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RhdGUgYXQgd2hpY2ggdGhlIGNoYW5nZWxvZyBzaG91bGQgc3RhcnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgZGF0ZSBhdCB3aGljaCB0aGUgY2hhbmdlbG9nIHNob3VsZCBzdGFydC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2Vyc2ZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtMb29rdXAgbGlzdCBvZiB1c2VyIG5hbWVzICYgYWRkcmVzc2VzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgYSBsb29rdXAgbGlzdCBvZiB1c2VyIG5hbWVzICYgYWRkcmVzc2VzCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyBhYm91dCB3aGljaCBjdnMgbG9ncyB3aWxsIGJlIGdlbmVyYXRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyBhYm91dCB3aGljaCBjdnMgbG9ncyB3aWxsIGJlIGdlbmVyYXRlZC5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0idXNlciIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY3ZzbGliLkN2c1VzZXIiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIHVzZXIgdG8gbGlzdCBjaGFuZ2Vsb2cga25vd3MgYWJvdXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCBhIHVzZXIgdG8gbGlzdCBjaGFuZ2Vsb2cga25vd3MgYWJvdXQuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iY3ZzcGFzcyIgY2F0ZWdvcnk9InNjbSIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ1ZTUGFzcyIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhbiBuZXcgZW50cnkgdG8gYSBDVlMgcGFzc3dvcmQgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbQWRkcyBhbiBuZXcgZW50cnkgdG8gYSBDVlMgcGFzc3dvcmQgZmlsZS5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImN2c3Jvb3QiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgQ1ZTIHJlcG9zaXRvcnkgdG8gYWRkIGFuIGVudHJ5IGZvci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIENWUyByZXBvc2l0b3J5IHRvIGFkZCBhbiBlbnRyeSBmb3IuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFzc2ZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQYXNzd29yZCBmaWxlIHRvIGFkZCB0aGUgZW50cnkgdG8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFBhc3N3b3JkIGZpbGUgdG8gYWRkIHRoZSBlbnRyeSB0by4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXNzd29yZCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Bhc3N3b3JkIHRvIGJlIGFkZGVkIHRvIHRoZSBwYXNzd29yZCBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBQYXNzd29yZCB0byBiZSBhZGRlZCB0byB0aGUgcGFzc3dvcmQgZmlsZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iY3ZzdGFnZGlmZiIgY2F0ZWdvcnk9Im90aGVyIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jdnNsaWIuQ3ZzVGFnRGlmZiIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRXhhbWluZXMgdGhlIG91dHB1dCBvZiBjdnMgcmRpZmYgYmV0d2VlbiB0d28gdGFncy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbRXhhbWluZXMgdGhlIG91dHB1dCBvZiBjdnMgcmRpZmYgYmV0d2VlbiB0d28gdGFncy4KLQotIEl0IHByb2R1Y2VzIGFuIFhNTCBvdXRwdXQgcmVwcmVzZW50aW5nIHRoZSBsaXN0IG9mIGNoYW5nZXMuCi0gPFBSRT4KLSAmbHQ7IS0tIFJvb3QgZWxlbWVudCAtLSZndDsKLSAmbHQ7IUVMRU1FTlQgdGFnZGlmZiAoIGVudHJ5KyApICZndDsKLSAmbHQ7IS0tIFN0YXJ0IHRhZyBvZiB0aGUgcmVwb3J0IC0tJmd0OwotICZsdDshQVRUTElTVCB0YWdkaWZmIHN0YXJ0VGFnIE5NVE9LRU4gI0lNUExJRUQgJmd0OwotICZsdDshLS0gRW5kIHRhZyBvZiB0aGUgcmVwb3J0IC0tJmd0OwotICZsdDshQVRUTElTVCB0YWdkaWZmIGVuZFRhZyBOTVRPS0VOICNJTVBMSUVEICZndDsKLSAmbHQ7IS0tIFN0YXJ0IGRhdGUgb2YgdGhlIHJlcG9ydCAtLSZndDsKLSAmbHQ7IUFUVExJU1QgdGFnZGlmZiBzdGFydERhdGUgTk1UT0tFTiAjSU1QTElFRCAmZ3Q7Ci0gJmx0OyEtLSBFbmQgZGF0ZSBvZiB0aGUgcmVwb3J0IC0tJmd0OwotICZsdDshQVRUTElTVCB0YWdkaWZmIGVuZERhdGUgTk1UT0tFTiAjSU1QTElFRCAmZ3Q7Ci0KLSAmbHQ7IS0tIENWUyB0YWcgZW50cnkgLS0mZ3Q7Ci0gJmx0OyFFTEVNRU5UIGVudHJ5ICggZmlsZSApICZndDsKLSAmbHQ7IS0tIEZpbGUgYWRkZWQsIGNoYW5nZWQgb3IgcmVtb3ZlZCAtLSZndDsKLSAmbHQ7IUVMRU1FTlQgZmlsZSAoIG5hbWUsIHJldmlzaW9uPywgcHJldnJldmlzaW9uPyApICZndDsKLSAmbHQ7IS0tIE5hbWUgb2YgdGhlIGZpbGUgLS0mZ3Q7Ci0gJmx0OyFFTEVNRU5UIG5hbWUgKCAjUENEQVRBICkgJmd0OwotICZsdDshLS0gUmV2aXNpb24gbnVtYmVyIC0tJmd0OwotICZsdDshRUxFTUVOVCByZXZpc2lvbiAoICNQQ0RBVEEgKSAmZ3Q7Ci0gJmx0OyEtLSBQcmV2aW91cyByZXZpc2lvbiBudW1iZXIgLS0mZ3Q7Ci0gJmx0OyFFTEVNRU5UIHByZXZyZXZpc2lvbiAoICNQQ0RBVEEgKSAmZ3Q7Ci0gPC9QUkU+XV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21wcmVzc2lvbiIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCB0aGlzIGlzIHRoZSBzYW1lIGFzIGNvbXByZXNzaW9ubGV2ZWw9IjMiLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCB0aGlzIGlzIHRoZSBzYW1lIGFzIGNvbXByZXNzaW9ubGV2ZWw9IjMiLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbXByZXNzaW9ubGV2ZWwiIHR5cGU9ImludCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJpbnQiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHNldCB0byBhIHZhbHVlIDEtOSBpdCBhZGRzIC16TiB0byB0aGUgY3ZzIGNvbW1hbmQgbGluZSwgZWxzZQotIGl0IGRpc2FibGVzIGNvbXByZXNzaW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiBzZXQgdG8gYSB2YWx1ZSAxLTkgaXQgYWRkcyAtek4gdG8gdGhlIGN2cyBjb21tYW5kIGxpbmUsIGVsc2UKLSBpdCBkaXNhYmxlcyBjb21wcmVzc2lvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjdnNyb290IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIENWU1JPT1QgdmFyaWFibGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBDVlNST09UIHZhcmlhYmxlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImN2c3JzaCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBDVlNfUlNIIHZhcmlhYmxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgQ1ZTX1JTSCB2YXJpYWJsZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0ZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW091dHB1dCBmaWxlIGZvciB0aGUgZGlmZi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBvdXRwdXQgZmlsZSBmb3IgdGhlIGRpZmYuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW5kZGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0VuZCBkYXRlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGVuZCBkYXRlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImVuZHRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0VuZCB0YWcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgZW5kIHRhZy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIHRoZSBjb21tYW5kIGV4aXRzIHdpdGgKLSBhIHJldHVybiBjb2RlIG90aGVyIHRoYW4gMC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU3RvcCB0aGUgYnVpbGQgcHJvY2VzcyBpZiB0aGUgY29tbWFuZCBleGl0cyB3aXRoCi0gYSByZXR1cm4gY29kZSBvdGhlciB0aGFuIDAuCi0gRGVmYXVsdHMgdG8gZmFsc2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFja2FnZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwYWNrYWdlL21vZHVsZSB0byBhbmFseXplLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgcGFja2FnZS9tb2R1bGUgdG8gYW5hbHl6ZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXNzZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Bhc3N3b3JkIGZpbGUgdG8gcmVhZCBwYXNzd29yZHMgZnJvbS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgUGFzc3dvcmQgZmlsZSB0byByZWFkIHBhc3N3b3JkcyBmcm9tLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InBvcnQiIHR5cGU9ImludCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJpbnQiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BvcnQgdXNlZCBieSBDVlMgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgc2VydmVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBQb3J0IHVzZWQgYnkgQ1ZTIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHNlcnZlci4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJxdWlldCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBzdXBwcmVzcyBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCBzdXBwcmVzcyBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InN0YXJ0ZGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1N0YXJ0IGRhdGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgc3RhcnQgZGF0ZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdGFydHRhZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1N0YXJ0IHRhZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBzdGFydCB0YWcuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9ImRkY3JlYXRvciIgY2F0ZWdvcnk9Im90aGVyIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamIuRERDcmVhdG9yIgotICAgICAgbWF0Y2hpbmdUYXNrPSJ0cnVlIj4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQnVpbGRzIGEgc2VyaWFsaXplZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZ2l2ZW4gYSB0ZXh0IGZpbGUgZGVzY3JpcHRpb24gb2YgdGhlIGRlc2NyaXB0b3IgaW4gdGhlIGZvcm1hdCBzdXBwb3J0ZWQgYnkgV2ViTG9naWMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0J1aWxkcyBhIHNlcmlhbGl6ZWQgZGVwbG95bWVudCBkZXNjcmlwdG9yIGdpdmVuIGEgdGV4dCBmaWxlIGRlc2NyaXB0aW9uIG9mIHRoZQotIGRlc2NyaXB0b3IgaW4gdGhlIGZvcm1hdCBzdXBwb3J0ZWQgYnkgV2ViTG9naWMuCi0KLSBUaGlzIGFudCB0YXNrIGlzIGEgZnJvbnQgZW5kIGZvciB0aGUgd2VibG9naWMgRERDcmVhdG9yIHRvb2wuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBjb21waWxhdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBjb21waWxhdGlvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdG9ycyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSBmcm9tIHdoZXJlIHRoZSB0ZXh0IGRlc2NyaXB0aW9ucyBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBhcmUKLSB0byBiZSByZWFkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGRpcmVjdG9yeSBmcm9tIHdoZXJlIHRoZSB0ZXh0IGRlc2NyaXB0aW9ucyBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBhcmUKLSB0byBiZSByZWFkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3QiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3RvcnkgaW50byB3aGljaCB0aGUgc2VyaWFsaXplZCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIGFyZSB0bwotIGJlIHdyaXR0ZW4uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIHNlcmlhbGl6ZWQgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBhcmUgdG8KLSBiZSB3cml0dGVuLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJkZWxldGUiIGNhdGVnb3J5PSJmaWxlc3lzdGVtIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5EZWxldGUiCi0gICAgICBtYXRjaGluZ1Rhc2s9InRydWUiPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZWxldGVzIGEgZmlsZSBvciBkaXJlY3RvcnksIG9yIHNldCBvZiBmaWxlcyBkZWZpbmVkIGJ5IGEgZmlsZXNldC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbRGVsZXRlcyBhIGZpbGUgb3IgZGlyZWN0b3J5LCBvciBzZXQgb2YgZmlsZXMgZGVmaW5lZCBieSBhIGZpbGVzZXQuCi0gVGhlIG9yaWdpbmFsIGRlbGV0ZSB0YXNrIHdvdWxkIGRlbGV0ZSBhIGZpbGUsIG9yIGEgc2V0IG9mIGZpbGVzIAotIHVzaW5nIHRoZSBpbmNsdWRlL2V4Y2x1ZGUgc3ludGF4LiAgVGhlIGRlbHRyZWUgdGFzayB3b3VsZCBkZWxldGUgYSAKLSBkaXJlY3RvcnkgdHJlZS4gIFRoaXMgdGFzayBjb21iaW5lcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGVzZSB0d28KLSBvcmlnaW5hbGx5IGRpc3RpbmN0IHRhc2tzLgotIDxwPkN1cnJlbnRseSBEZWxldGUgZXh0ZW5kcyBNYXRjaGluZ1Rhc2suICBUaGlzIGlzIGludGVuZCA8aT5vbmx5PC9pPgotIHRvIHByb3ZpZGUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIGEgcmVsZWFzZS4gIFRoZSBmdXR1cmUgcG9zaXRpb24KLSBpcyB0byB1c2UgbmVzdGVkIGZpbGVzZXRzIGV4Y2x1c2l2ZWx5LjwvcD5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmF1bHRleGNsdWRlcyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIHdoZXRoZXIgZGVmYXVsdCBleGNsdXNpb25zIHNob3VsZCBiZSB1c2VkIG9yIG5vdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVzaW9ucyBzaG91bGQgYmUgdXNlZCBvciBub3QuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3J5IGZyb20gd2hpY2ggZmlsZXMgYXJlIHRvIGJlIGRlbGV0ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZmlsZXMgYXJlIHRvIGJlIGRlbGV0ZWQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCBvZiBleGNsdWRlIHBhdHRlcm5zLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBzZXQgb2YgZXhjbHVkZSBwYXR0ZXJucy4gUGF0dGVybnMgbWF5IGJlIHNlcGFyYXRlZCBieSBhIGNvbW1hCi0gb3IgYSBzcGFjZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlc2ZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGluY2x1ZGVzIHBhdHRlcm5zLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGluY2x1ZGVzIHBhdHRlcm5zLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIGZhbHNlLCBub3RlIGVycm9ycyBidXQgY29udGludWUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIGZhbHNlLCBub3RlIGVycm9ycyBidXQgY29udGludWUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgb2YgYSBzaW5nbGUgZmlsZSB0byBiZSByZW1vdmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIG5hbWUgb2YgYSBzaW5nbGUgZmlsZSB0byBiZSByZW1vdmVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImluY2x1ZGVlbXB0eWRpcnMiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgZGVsZXRlIGVtcHR5IGRpcmVjdG9yaWVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCBkZWxldGUgZW1wdHkgZGlyZWN0b3JpZXMuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5jbHVkZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgb2YgaW5jbHVkZSBwYXR0ZXJucy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgc2V0IG9mIGluY2x1ZGUgcGF0dGVybnMuIFBhdHRlcm5zIG1heSBiZSBzZXBhcmF0ZWQgYnkgYSBjb21tYQotIG9yIGEgc3BhY2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5jbHVkZXNmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTmFtZSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBpbmNsdWRlcyBwYXR0ZXJucy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBpbmNsdWRlcyBwYXR0ZXJucy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJxdWlldCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlIGFuZCB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgZG8gbm90IGRpc3BsYXkgYSBkaWFnbm9zdGljCi0gbWVzc2FnZSBvciBtb2RpZnkgdGhlIGV4aXQgc3RhdHVzIHRvIHJlZmxlY3QgYW4gZXJyb3IuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUgYW5kIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBkbyBub3QgZGlzcGxheSBhIGRpYWdub3N0aWMKLSBtZXNzYWdlIG9yIG1vZGlmeSB0aGUgZXhpdCBzdGF0dXMgdG8gcmVmbGVjdCBhbiBlcnJvci4KLSBUaGlzIG1lYW5zIHRoYXQgaWYgYSBmaWxlIG9yIGRpcmVjdG9yeSBjYW5ub3QgYmUgZGVsZXRlZCwKLSB0aGVuIG5vIGVycm9yIGlzIHJlcG9ydGVkLiBUaGlzIHNldHRpbmcgZW11bGF0ZXMgdGhlCi0gLWYgb3B0aW9uIHRvIHRoZSBVbml4ICZxdW90O3JtJnF1b3Q7IGNvbW1hbmQuCi0gRGVmYXVsdCBpcyBmYWxzZSBtZWFuaW5nIHRoaW5ncyBhcmUgJnF1b3Q7bm9pc3kmcXVvdDsKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJib3NlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGxpc3QgYWxsIG5hbWVzIG9mIGRlbGV0ZWQgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGxpc3QgYWxsIG5hbWVzIG9mIGRlbGV0ZWQgZmlsZXMuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyB0byBiZSBkZWxldGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgc2V0IG9mIGZpbGVzIHRvIGJlIGRlbGV0ZWQuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImV4Y2x1ZGUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdHRlcm5TZXQuTmFtZUVudHJ5IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBleGNsdWRlIGxpc3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW2FkZCBhIG5hbWUgZW50cnkgb24gdGhlIGV4Y2x1ZGUgbGlzdF1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJleGNsdWRlc2ZpbGUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdHRlcm5TZXQuTmFtZUVudHJ5IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBpbmNsdWRlIGZpbGVzIGxpc3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW2FkZCBhIG5hbWUgZW50cnkgb24gdGhlIGluY2x1ZGUgZmlsZXMgbGlzdF1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJpbmNsdWRlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXR0ZXJuU2V0Lk5hbWVFbnRyeSIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgaW5jbHVkZSBsaXN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVthZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBpbmNsdWRlIGxpc3RdXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iaW5jbHVkZXNmaWxlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXR0ZXJuU2V0Lk5hbWVFbnRyeSIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgaW5jbHVkZSBmaWxlcyBsaXN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVthZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBpbmNsdWRlIGZpbGVzIGxpc3RdXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0icGF0dGVybnNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0dGVyblNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0dGVybnNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIHNldCBvZiBwYXR0ZXJucy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbYWRkIGEgc2V0IG9mIHBhdHRlcm5zXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iZGVsdHJlZSIgY2F0ZWdvcnk9Im90aGVyIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5EZWx0cmVlIgotICAgICAgZGVwcmVjYXRlZD0idHJ1ZSIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTm8gRGVzY3JpcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW11dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3J5IHRvIGJlIGRlbGV0ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgZGlyZWN0b3J5IHRvIGJlIGRlbGV0ZWQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iZGVwZW5kIiBjYXRlZ29yeT0ib3RoZXIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5EZXBlbmQiCi0gICAgICBtYXRjaGluZ1Rhc2s9InRydWUiPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtHZW5lcmF0ZXMgYSBkZXBlbmRlbmN5IGZpbGUgZm9yIGEgZ2l2ZW4gc2V0IG9mIGNsYXNzZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0dlbmVyYXRlcyBhIGRlcGVuZGVuY3kgZmlsZSBmb3IgYSBnaXZlbiBzZXQgb2YgY2xhc3Nlcy5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNhY2hlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVwZW5kZW5jeSBjYWNoZSBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBkZXBlbmRlbmN5IGNhY2hlIGZpbGUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGRlcGVuZGVuY3kgY2hlY2suXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgZGVwZW5kZW5jeSBjaGVjay4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGhyZWYiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJSZWZlcmVuY2UiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggZGVmaW5lZCBlbHNld2hlcmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggZGVmaW5lZCBlbHNld2hlcmUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xvc3VyZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcyBhcmUgZm9sbG93ZWQgdW50aWwgdGhlCi0gY2xvc3VyZSBvZiB0aGUgZGVwZW5kZW5jeSBzZXQgaWYgcmVhY2hlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgYXJlIGZvbGxvd2VkIHVudGlsIHRoZQotIGNsb3N1cmUgb2YgdGhlIGRlcGVuZGVuY3kgc2V0IGlmIHJlYWNoZWQuCi0gV2hlbiBub3Qgc2V0LCB0aGUgZGVwZW5kIHRhc2sgd2lsbCBvbmx5IGZvbGxvdwotIGRpcmVjdCBkZXBlbmRlbmNpZXMgYmV0d2VlbiBjbGFzc2VzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3RkaXIiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVzdGluYXRpb24gZGlyZWN0b3J5IHdoZXJlIHRoZSBjb21waWxlZCBKYXZhIGZpbGVzIGV4aXN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSB3aGVyZSB0aGUgY29tcGlsZWQgSmF2YSBmaWxlcyBleGlzdC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkdW1wIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHRoZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIHdpbGwgYmUgd3JpdHRlbgotIHRvIHRoZSBkZWJ1ZyBsZXZlbCBsb2cuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIHRoZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIHdpbGwgYmUgd3JpdHRlbgotIHRvIHRoZSBkZWJ1ZyBsZXZlbCBsb2cuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjZGlyIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yaWVzIHBhdGggdG8gZmluZCB0aGUgSmF2YSBzb3VyY2UgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgZGlyZWN0b3JpZXMgcGF0aCB0byBmaW5kIHRoZSBKYXZhIHNvdXJjZSBmaWxlcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBjbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBkZXBlbmRlbmN5IGNoZWNrLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgY2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgZGVwZW5kZW5jeSBjaGVjay5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJkZXBlbmRzZXQiIGNhdGVnb3J5PSJmaWxlc3lzdGVtIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5EZXBlbmRTZXQiCi0gICAgICBtYXRjaGluZ1Rhc2s9InRydWUiPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFeGFtaW5lcyBhbmQgcmVtb3ZlcyBvdXQgb2YgZGF0ZSB0YXJnZXQgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0V4YW1pbmVzIGFuZCByZW1vdmVzIG91dCBvZiBkYXRlIHRhcmdldCBmaWxlcy4gIElmIGFueSBvZiB0aGUgdGFyZ2V0IGZpbGVzCi0gYXJlIG91dCBvZiBkYXRlIHdpdGggcmVzcGVjdCB0byBhbnkgb2YgdGhlIHNvdXJjZSBmaWxlcywgYWxsIHRhcmdldAotIGZpbGVzIGFyZSByZW1vdmVkLiAgVGhpcyBpcyB1c2VmdWwgd2hlcmUgZGVwZW5kZW5jaWVzIGNhbm5vdCBiZQotIGNvbXB1dGVkIChmb3IgZXhhbXBsZSwgZHluYW1pY2FsbHkgaW50ZXJwcmV0ZWQgcGFyYW1ldGVycyBvciBmaWxlcwotIHRoYXQgbmVlZCB0byBzdGF5IGluIHN5bmNoIGJ1dCBhcmUgbm90IGRpcmVjdGx5IGxpbmtlZCkgb3Igd2hlcmUKLSB0aGUgYW50IHRhc2sgaW4gcXVlc3Rpb24gY291bGQgY29tcHV0ZSB0aGVtIGJ1dCBkb2VzIG5vdCAoZm9yCi0gZXhhbXBsZSwgdGhlIGxpbmtlZCBEVEQgZm9yIGFuIFhNTCBmaWxlIHVzaW5nIHRoZSBzdHlsZSB0YXNrKS4KLQotIG5lc3RlZCBhcmd1bWVudHM6Ci0gPHVsPgotIDxsaT5zcmNmaWxlc2V0ICAgICAoZmlsZXNldCBkZXNjcmliaW5nIHRoZSBzb3VyY2UgZmlsZXMgdG8gZXhhbWluZSkKLSA8bGk+c3JjZmlsZWxpc3QgICAgKGZpbGVsaXN0IGRlc2NyaWJpbmcgdGhlIHNvdXJjZSBmaWxlcyB0byBleGFtaW5lKQotIDxsaT50YXJnZXRmaWxlc2V0ICAoZmlsZXNldCBkZXNjcmliaW5nIHRoZSB0YXJnZXQgZmlsZXMgdG8gZXhhbWluZSkKLSA8bGk+dGFyZ2V0ZmlsZWxpc3QgKGZpbGVsaXN0IGRlc2NyaWJpbmcgdGhlIHRhcmdldCBmaWxlcyB0byBleGFtaW5lKQotIDwvdWw+Ci0gQXQgbGVhc3Qgb25lIGluc3RhbmNlIG9mIGVpdGhlciBhIGZpbGVzZXQgb3IgZmlsZWxpc3QgZm9yIGJvdGggc291cmNlIGFuZCAKLSB0YXJnZXQgYXJlIHJlcXVpcmVkLgotIDxwPgotIFRoaXMgdGFzayB3aWxsIGV4YW1pbmUgZWFjaCBvZiB0aGUgc291cmNlIGZpbGVzIGFnYWluc3QgZWFjaCBvZiB0aGUgdGFyZ2V0IAotIGZpbGVzLiBJZiBhbnkgdGFyZ2V0IGZpbGVzIGFyZSBvdXQgb2YgZGF0ZSB3aXRoIHJlc3BlY3QgdG8gYW55IG9mIHRoZSBzb3VyY2UgCi0gZmlsZXMsIGFsbCB0YXJnZXRzIGFyZSByZW1vdmVkLiBJZiBhbnkgZmlsZXMgbmFtZWQgaW4gYSAoc3JjIG9yIHRhcmdldCkgCi0gZmlsZWxpc3QgZG8gbm90IGV4aXN0LCBhbGwgdGFyZ2V0cyBhcmUgcmVtb3ZlZC4KLSBIaW50OiBJZiBtaXNzaW5nIGZpbGVzIHNob3VsZCBiZSBpZ25vcmVkLCBzcGVjaWZ5IHRoZW0gYXMgaW5jbHVkZSBwYXR0ZXJucyAKLSBpbiBmaWxlc2V0cywgcmF0aGVyIHRoYW4gdXNpbmcgZmlsZWxpc3RzLgotIDwvcD48cD4KLSBUaGlzIHRhc2sgYXR0ZW1wdHMgdG8gb3B0aW1pemUgc3BlZWQgb2YgZGVwZW5kZW5jeSBjaGVja2luZy4gIEl0IHdpbGwgc3RvcCAKLSBhZnRlciB0aGUgZmlyc3Qgb3V0IG9mIGRhdGUgZmlsZSBpcyBmb3VuZCBhbmQgcmVtb3ZlIGFsbCB0YXJnZXRzLCByYXRoZXIgCi0gdGhhbiBleGhhdXN0aXZlbHkgY2hlY2tpbmcgZXZlcnkgc291cmNlIHZzIHRhcmdldCBjb21iaW5hdGlvbiB1bm5lY2Vzc2FyaWx5LgotIDwvcD48cD4KLSBFeGFtcGxlIHVzZXM6IAotIDx1bD48bGk+Ci0gUmVjb3JkIHRoZSBmYWN0IHRoYXQgYW4gWE1MIGZpbGUgbXVzdCBiZSB1cCB0byBkYXRlCi0gd2l0aCByZXNwZWN0IHRvIGl0cyBYU0QgKFNjaGVtYSBmaWxlKSwgZXZlbiB0aG91Z2ggdGhlIFhNTCBmaWxlCi0gaXRzZWxmIGluY2x1ZGVzIG5vIHJlZmVyZW5jZSB0byBpdHMgWFNELgotIDwvbGk+PGxpPgotIFJlY29yZCB0aGUgZmFjdCB0aGF0IGFuIFhTTCBzdHlsZXNoZWV0IGluY2x1ZGVzIG90aGVyCi0gc3ViLXN0eWxlc2hlZXRzCi0gPC9saT48bGk+Ci0gUmVjb3JkIHRoZSBmYWN0IHRoYXQgamF2YSBmaWxlcyBtdXN0IGJlIHJlY29tcGlsZWQgaWYgdGhlIGFudCBidWlsZAotIGZpbGUgY2hhbmdlcwotIDwvbGk+PC91bD5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0ic3JjZmlsZWxpc3QiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVMaXN0IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlbGlzdCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIGxpc3Qgb2Ygc291cmNlIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGQgYSBsaXN0IG9mIHNvdXJjZSBmaWxlcy5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0ic3JjZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIHNldCBvZiBzb3VyY2UgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCBhIHNldCBvZiBzb3VyY2UgZmlsZXMuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9InRhcmdldGZpbGVsaXN0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlTGlzdCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZWxpc3QiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSBsaXN0IG9mIHRhcmdldCBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgbGlzdCBvZiB0YXJnZXQgZmlsZXMuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9InRhcmdldGZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGVzZXQiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSBzZXQgb2YgdGFyZ2V0IGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGQgYSBzZXQgb2YgdGFyZ2V0IGZpbGVzLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9ImRpcm5hbWUiIGNhdGVnb3J5PSJwcm9wZXJ0eSIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRGlybmFtZSIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGV0ZXJtaW5lcyB0aGUgZGlyZWN0b3J5IG5hbWUgb2YgdGhlIHNwZWNpZmllZCBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtEZXRlcm1pbmVzIHRoZSBkaXJlY3RvcnkgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIGZpbGUuCi0KLSBUaGlzIHRhc2sgY2FuIGFjY2VwdCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0gPHVsPgotIDxsaT5maWxlCi0gPGxpPnByb3BlcnR5Ci0gPC91bD4KLSBCb3RoIDxiPmZpbGU8L2I+IGFuZCA8Yj5wcm9wZXJ0eTwvYj4gYXJlIHJlcXVpcmVkLgotIDxwPgotIFdoZW4gdGhpcyB0YXNrIGV4ZWN1dGVzLCBpdCB3aWxsIHNldCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IHRvIHRoZQotIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmlsZSB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIHRoZSBsYXN0IHBhdGgKLSBlbGVtZW50LiBJZiBmaWxlIGlzIGEgZmlsZSwgdGhlIGRpcmVjdG9yeSB3aWxsIGJlIHRoZSBjdXJyZW50Ci0gZGlyZWN0b3J5Ll1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BhdGggdG8gdGFrZSB0aGUgZGlybmFtZSBvZi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgUGF0aCB0byB0YWtlIHRoZSBkaXJuYW1lIG9mLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InByb3BlcnR5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iZWFyIiBjYXRlZ29yeT0icGFja2FnaW5nIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FYXIiCi0gICAgICBtYXRjaGluZ1Rhc2s9InRydWUiPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGVzIGEgRUFSIGFyY2hpdmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0NyZWF0ZXMgYSBFQVIgYXJjaGl2ZS4gQmFzZWQgb24gV0FSIHRhc2tdXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImFwcHhtbCIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZpbGUgdG8gaW5jb3Jwb3JhdGUgYXMgYXBwbGljYXRpb24ueG1sLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBGaWxlIHRvIGluY29ycG9yYXRlIGFzIGFwcGxpY2F0aW9uLnhtbC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiYXNlZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3J5IGZyb20gd2hpY2ggdG8gYXJjaGl2ZSBmaWxlczsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIERpcmVjdG9yeSBmcm9tIHdoaWNoIHRvIGFyY2hpdmUgZmlsZXM7IG9wdGlvbmFsLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbXByZXNzIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgd2Ugd2FudCB0byBjb21wcmVzcyB0aGUgZmlsZXMgb3Igb25seSBzdG9yZSB0aGVtOwotIG9wdGlvbmFsLCBkZWZhdWx0PXRydWU7Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBXaGV0aGVyIHdlIHdhbnQgdG8gY29tcHJlc3MgdGhlIGZpbGVzIG9yIG9ubHkgc3RvcmUgdGhlbTsKLSBvcHRpb25hbCwgZGVmYXVsdD10cnVlOwotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3RmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGZpbGUgdG8gY3JlYXRlOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGZpbGUgdG8gY3JlYXRlOyByZXF1aXJlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkdXBsaWNhdGUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlppcC5EdXBsaWNhdGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7YWRkJnF1b3Q7LCAmcXVvdDtwcmVzZXJ2ZSZxdW90OywgJnF1b3Q7ZmFpbCZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyBiZWhhdmlvciBmb3Igd2hlbiBhIGR1cGxpY2F0ZSBmaWxlIGlzIGFib3V0IHRvIGJlIGFkZGVkIC0KLSBvbmUgb2YgPGNvZGU+a2VlcDwvY29kZT4sIDxjb2RlPnNraXA8L2NvZGU+IG9yIDxjb2RlPm92ZXJ3cml0ZTwvY29kZT4uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgYmVoYXZpb3IgZm9yIHdoZW4gYSBkdXBsaWNhdGUgZmlsZSBpcyBhYm91dCB0byBiZSBhZGRlZCAtCi0gb25lIG9mIDxjb2RlPmtlZXA8L2NvZGU+LCA8Y29kZT5za2lwPC9jb2RlPiBvciA8Y29kZT5vdmVyd3JpdGU8L2NvZGU+LgotIFBvc3NpYmxlIHZhbHVlcyBhcmU6IDxjb2RlPmtlZXA8L2NvZGU+IChrZWVwIGJvdGgKLSBvZiB0aGUgZmlsZXMpOyA8Y29kZT5za2lwPC9jb2RlPiAoa2VlcCB0aGUgZmlyc3QgdmVyc2lvbgotIG9mIHRoZSBmaWxlIGZvdW5kKTsgPGNvZGU+b3ZlcndyaXRlPC9jb2RlPiBvdmVyd3JpdGUgdGhlIGZpbGUKLSB3aXRoIHRoZSBuZXcgZmlsZQotIERlZmF1bHQgZm9yIHppcCB0YXNrcyBpcyA8Y29kZT5rZWVwPC9jb2RlPgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImVuY29kaW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRW5jb2RpbmcgdG8gdXNlIGZvciBmaWxlbmFtZXMsIGRlZmF1bHRzIHRvIHRoZSBwbGF0Zm9ybSdzCi0gZGVmYXVsdCBlbmNvZGluZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgRW5jb2RpbmcgdG8gdXNlIGZvciBmaWxlbmFtZXMsIGRlZmF1bHRzIHRvIHRoZSBwbGF0Zm9ybSdzCi0gZGVmYXVsdCBlbmNvZGluZy4KLQotIDxwPkZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIHNlZSA8YQotIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrLzEuMi9kb2NzL2d1aWRlL2ludGVybmF0L2VuY29kaW5nLmRvYy5odG1sIj5odHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkay8xLjIvZG9jcy9ndWlkZS9pbnRlcm5hdC9lbmNvZGluZy5kb2MuaHRtbDwvYT4uPC9wPgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGVzb25seSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBlbXVsYXRlIFN1bidzIGphciB1dGlsaXR5IGJ5IG5vdCBhZGRpbmcgcGFyZW50IGRpcmVjdG9yaWVzOwotIG9wdGlvbmFsLCBkZWZhdWx0cyB0byBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgZW11bGF0ZSBTdW4ncyBqYXIgdXRpbGl0eSBieSBub3QgYWRkaW5nIHBhcmVudCBkaXJlY3RvcmllczsKLSBvcHRpb25hbCwgZGVmYXVsdHMgdG8gZmFsc2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5kZXgiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IHdoZXRoZXIgb3Igbm90IHRvIGNyZWF0ZSBhbiBpbmRleCBsaXN0IGZvciBjbGFzc2VzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgd2hldGhlciBvciBub3QgdG8gY3JlYXRlIGFuIGluZGV4IGxpc3QgZm9yIGNsYXNzZXMuCi0gVGhpcyBtYXkgc3BlZWQgdXAgY2xhc3Nsb2FkaW5nIGluIHNvbWUgY2FzZXMuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWFuaWZlc3QiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbWFuaWZlc3QgZmlsZSB0byB1c2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBtYW5pZmVzdCBmaWxlIHRvIHVzZS4gVGhpcyBjYW4gYmUgZWl0aGVyIHRoZSBsb2NhdGlvbiBvZiBhIG1hbmlmZXN0LAotIG9yIHRoZSBuYW1lIG9mIGEgamFyIGFkZGVkIHRocm91Z2ggYSBmaWxlc2V0LiBJZiBpdHMgdGhlIG5hbWUgb2YgYW4gYWRkZWQKLSBqYXIsIHRoZSB0YXNrIGV4cGVjdHMgdGhlIG1hbmlmZXN0IHRvIGJlIGluIHRoZSBqYXIgYXQgTUVUQS1JTkYvTUFOSUZFU1QuTUYuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXBkYXRlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHVwZGF0ZXMgYW4gZXhpc3RpbmcgZmlsZSwgb3RoZXJ3aXNlIG92ZXJ3cml0ZQotIGFueSBleGlzdGluZyBvbmU7IG9wdGlvbmFsIGRlZmF1bHRzIHRvIGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCB1cGRhdGVzIGFuIGV4aXN0aW5nIGZpbGUsIG90aGVyd2lzZSBvdmVyd3JpdGUKLSBhbnkgZXhpc3Rpbmcgb25lOyBvcHRpb25hbCBkZWZhdWx0cyB0byBmYWxzZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3aGVuZW1wdHkiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlppcC5XaGVuRW1wdHkiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7ZmFpbCZxdW90OywgJnF1b3Q7c2tpcCZxdW90OywgJnF1b3Q7Y3JlYXRlJnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIGJlaGF2aW9yIG9mIHRoZSB0YXNrIHdoZW4gbm8gZmlsZXMgbWF0Y2guXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgYmVoYXZpb3Igb2YgdGhlIHRhc2sgd2hlbiBubyBmaWxlcyBtYXRjaC4KLSBQb3NzaWJsZSB2YWx1ZXMgYXJlOiA8Y29kZT5mYWlsPC9jb2RlPiAodGhyb3cgYW4gZXhjZXB0aW9uCi0gYW5kIGhhbHQgdGhlIGJ1aWxkKTsgPGNvZGU+c2tpcDwvY29kZT4gKGRvIG5vdCBjcmVhdGUKLSBhbnkgYXJjaGl2ZSwgYnV0IGlzc3VlIGEgd2FybmluZyk7IDxjb2RlPmNyZWF0ZTwvY29kZT4KLSAobWFrZSBhbiBhcmNoaXZlIHdpdGggbm8gZW50cmllcykuCi0gRGVmYXVsdCBmb3IgemlwIHRhc2tzIGlzIDxjb2RlPnNraXA8L2NvZGU+OwotIGZvciBqYXIgdGFza3MsIDxjb2RlPmNyZWF0ZTwvY29kZT4uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJhcmNoaXZlcyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWmlwRmlsZVNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iWmlwRmlsZXNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgemlwZmlsZXNldC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyB6aXBmaWxlc2V0Ll1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJtYW5pZmVzdCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWFuaWZlc3QiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FsbG93cyB0aGUgbWFuaWZlc3QgZm9yIHRoZSBhcmNoaXZlIGZpbGUgdG8gYmUgcHJvdmlkZWQgaW5saW5lCi0gaW4gdGhlIGJ1aWxkZmlsZSByYXRoZXIgdGhhbiBpbiBhbiBleHRlcm5hbCBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBbGxvd3MgdGhlIG1hbmlmZXN0IGZvciB0aGUgYXJjaGl2ZSBmaWxlIHRvIGJlIHByb3ZpZGVkIGlubGluZQotIGluIHRoZSBidWlsZGZpbGUgcmF0aGVyIHRoYW4gaW4gYW4gZXh0ZXJuYWwgZmlsZS5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZmlsZXMuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9Im1ldGFpbmYiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlppcEZpbGVTZXQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IlppcEZpbGVzZXQiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgemlwZmlsZXNldCB0byBpbmNsdWRlIGluIHRoZSBNRVRBLUlORiBkaXJlY3RvcnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSB6aXBmaWxlc2V0IHRvIGluY2x1ZGUgaW4gdGhlIE1FVEEtSU5GIGRpcmVjdG9yeS5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iemlwZ3JvdXBmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIGdyb3VwIG9mIHppcCBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIGdyb3VwIG9mIHppcCBmaWxlcy5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iemlwZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWmlwRmlsZVNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iWmlwRmlsZXNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZmlsZXMgdGhhdCBjYW4gYmUKLSByZWFkIGZyb20gYW4gYXJjaGl2ZSBhbmQgYmUgZ2l2ZW4gYSBwcmVmaXgvZnVsbHBhdGguXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZmlsZXMgdGhhdCBjYW4gYmUKLSByZWFkIGZyb20gYW4gYXJjaGl2ZSBhbmQgYmUgZ2l2ZW4gYSBwcmVmaXgvZnVsbHBhdGguXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iZWNobyIgY2F0ZWdvcnk9InV0aWxpdHkiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG8iCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1dyaXRlcyBhIG1lc3NhZ2UgdG8gdGhlIEFudCBsb2dnaW5nIGZhY2lsaXRpZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW1dyaXRlcyBhIG1lc3NhZ2UgdG8gdGhlIEFudCBsb2dnaW5nIGZhY2lsaXRpZXMuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhcHBlbmQiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgYXBwZW5kIHRvIGV4aXN0aW5nIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGFwcGVuZCB0byBleGlzdGluZyBmaWxlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGaWxlIHRvIHdyaXRlIHRvLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBGaWxlIHRvIHdyaXRlIHRvLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImxldmVsIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FY2hvLkVjaG9MZXZlbCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDtlcnJvciZxdW90OywgJnF1b3Q7d2FybmluZyZxdW90OywgJnF1b3Q7aW5mbyZxdW90OywgJnF1b3Q7dmVyYm9zZSZxdW90OywgJnF1b3Q7ZGVidWcmcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xvZ2dpbmcgbGV2ZWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgbG9nZ2luZyBsZXZlbC4gTGV2ZWwgc2hvdWxkIGJlIG9uZSBvZgotIDx1bD4KLSAgPGxpPmVycm9yPC9saT4KLSAgPGxpPndhcm5pbmc8L2xpPgotICA8bGk+aW5mbzwvbGk+Ci0gIDxsaT52ZXJib3NlPC9saT4KLSAgPGxpPmRlYnVnPC9saT4KLSA8L3VsPgotIDxwPlRoZSBkZWZhdWx0IGlzICZxdW90O3dhcm5pbmcmcXVvdDsgdG8gZW5zdXJlIHRoYXQgbWVzc2FnZXMgYXJlCi0gZGlzcGxheWVkIGJ5IGRlZmF1bHQgd2hlbiB1c2luZyB0aGUgLXF1aWV0IGNvbW1hbmQgbGluZSBvcHRpb24uPC9wPgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtNZXNzYWdlIHRvIHdyaXRlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBNZXNzYWdlIHRvIHdyaXRlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgICAgIDxib2R5ID4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCBhIG11bHRpbGluZSBtZXNzYWdlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9ib2R5PgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iZWNob3Byb3BlcnRpZXMiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuRWNob1Byb3BlcnRpZXMiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Rpc3BsYXlzIGFsbCB0aGUgY3VycmVudCBwcm9wZXJ0aWVzIGluIHRoZSBidWlsZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbRGlzcGxheXMgYWxsIHRoZSBjdXJyZW50IHByb3BlcnRpZXMgaW4gdGhlIGJ1aWxkLiBUaGUgb3V0cHV0IGNhbiBiZSBzZW50IHRvCi0gIGEgZmlsZSBpZiBkZXNpcmVkLiA8UD4KLQotICBBdHRyaWJ1dGUgImRlc3RmaWxlIiBkZWZpbmVzIGEgZmlsZSB0byBzZW5kIHRoZSBwcm9wZXJ0aWVzIHRvLiBUaGlzIGNhbiBiZQotICBwcm9jZXNzZWQgYXMgYSBzdGFuZGFyZCBwcm9wZXJ0eSBmaWxlIGxhdGVyLiA8UD4KLQotICBBdHRyaWJ1dGUgInByZWZpeCIgZGVmaW5lcyBhIHByZWZpeCB3aGljaCBpcyB1c2VkIHRvIGZpbHRlciB0aGUgcHJvcGVydGllcwotICBvbmx5IHRob3NlIHByb3BlcnRpZXMgc3RhcnRpbmcgd2l0aCB0aGlzIHByZWZpeCB3aWxsIGJlIGVjaG9lZC4gPFA+Ci0KLSAgQnkgZGVmYXVsdCwgdGhlICJmYWlsb25lcnJvciIgYXR0cmlidXRlIGlzIGVuYWJsZWQuIElmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotICB3cml0aW5nIHRoZSBwcm9wZXJ0aWVzIHRvIGEgZmlsZSwgYW5kIHRoaXMgYXR0cmlidXRlIGlzIGVuYWJsZWQsIHRoZW4gYQotICBCdWlsZEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gSWYgZGlzYWJsZWQsIHRoZW4gSU8gZXJyb3JzIHdpbGwgYmUgcmVwb3J0ZWQKLSAgYXMgYSBsb2cgc3RhdGVtZW50LCBidXQgbm8gZXJyb3Igd2lsbCBiZSB0aHJvd24uIDxQPgotCi0gIEV4YW1wbGVzOiA8cHJlPgotICAmbHQ7ZWNob3Byb3BlcnRpZXMgIC8mZ3Q7Ci0gPC9wcmU+IFJlcG9ydCB0aGUgY3VycmVudCBwcm9wZXJ0aWVzIHRvIHRoZSBsb2cuIDxQPgotCi0gIDxwcmU+Ci0gICZsdDtlY2hvcHJvcGVydGllcyBkZXN0ZmlsZT0ibXkucHJvcGVydGllcyIgLyZndDsKLSA8L3ByZT4gUmVwb3J0IHRoZSBjdXJyZW50IHByb3BlcnRpZXMgdG8gdGhlIGZpbGUgIm15LnByb3BlcnRpZXMiLCBhbmQgd2lsbAotICBmYWlsIHRoZSBidWlsZCBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgY3JlYXRlZCBvciB3cml0dGVuIHRvLiA8UD4KLQotICA8cHJlPgotICAmbHQ7ZWNob3Byb3BlcnRpZXMgZGVzdGZpbGU9Im15LnByb3BlcnRpZXMiIGZhaWxvbmVycm9yPSJmYWxzZSIKLSAgICAgIHByZWZpeD0iYW50IiAvJmd0OwotIDwvcHJlPiBSZXBvcnQgYWxsIHByb3BlcnRpZXMgYmVnaW5uaW5nIHdpdGggJ2FudCcgdG8gdGhlIGZpbGUKLSAgIm15LnByb3BlcnRpZXMiLCBhbmQgd2lsbCBsb2cgYSBtZXNzYWdlIGlmIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSBjcmVhdGVkIG9yCi0gIHdyaXR0ZW4gdG8sIGJ1dCB3aWxsIHN0aWxsIGFsbG93IHRoZSBidWlsZCB0byBjb250aW51ZS5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3RmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZSB0byBzdG9yZSB0aGUgcHJvcGVydHkgb3V0cHV0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgYSBmaWxlIHRvIHN0b3JlIHRoZSBwcm9wZXJ0eSBvdXRwdXQuICBJZiB0aGlzIGlzIG5ldmVyIHNwZWNpZmllZCwKLSAgdGhlbiB0aGUgb3V0cHV0IHdpbGwgYmUgc2VudCB0byB0aGUgQW50IGxvZy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCB0aGUgdGFzayB3aWxsIGZhaWwgaWYgYW4gZXJyb3Igb2NjdXJzIHdyaXRpbmcgdGhlIHByb3BlcnRpZXMKLSBmaWxlLCBvdGhlcndpc2UgZXJyb3JzIGFyZSBqdXN0IGxvZ2dlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgdGhlIHRhc2sgd2lsbCBmYWlsIGlmIGFuIGVycm9yIG9jY3VycyB3cml0aW5nIHRoZSBwcm9wZXJ0aWVzCi0gZmlsZSwgb3RoZXJ3aXNlIGVycm9ycyBhcmUganVzdCBsb2dnZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJlZml4IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdGhlIHByZWZpeCBpcyBzZXQsIHRoZW4gb25seSBwcm9wZXJ0aWVzIHdoaWNoIHN0YXJ0IHdpdGggdGhpcwotICBwcmVmaXggc3RyaW5nIHdpbGwgYmUgcmVjb3JkZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRoZSBwcmVmaXggaXMgc2V0LCB0aGVuIG9ubHkgcHJvcGVydGllcyB3aGljaCBzdGFydCB3aXRoIHRoaXMKLSAgcHJlZml4IHN0cmluZyB3aWxsIGJlIHJlY29yZGVkLiAgSWYgdGhpcyBpcyBuZXZlciBzZXQsIG9yIGl0IGlzIHNldAotICB0byBhbiBlbXB0eSBzdHJpbmcgb3IgPHR0Pm51bGw8L3R0PiwgdGhlbiBhbGwgcHJvcGVydGllcyB3aWxsIGJlCi0gIHJlY29yZGVkLiA8UD4KLQotICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb3BlcnR5IGlzIHNldCBhczoKLSAgICA8UFJFPiZsdDtlY2hvcHJvcGVydGllcyAgcHJlZml4PSJhbnQuIiAvJmd0OzwvUFJFPgotICB0aGVuIHRoZSBwcm9wZXJ0eSAiYW50LmhvbWUiIHdpbGwgYmUgcmVjb3JkZWQsIGJ1dCAiYW50LWV4YW1wbGUiCi0gIHdpbGwgbm90LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJlamJjIiBjYXRlZ29yeT0ib3RoZXIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYi5FamJjIgotICAgICAgbWF0Y2hpbmdUYXNrPSJ0cnVlIj4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQnVpbGRzIEVKQiBzdXBwb3J0IGNsYXNzZXMgdXNpbmcgV2ViTG9naWMncyBlamJjIHRvb2wgZnJvbSBhIGRpcmVjdG9yeSBjb250YWluaW5nIGEgc2V0IG9mIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0J1aWxkcyBFSkIgc3VwcG9ydCBjbGFzc2VzIHVzaW5nIFdlYkxvZ2ljJ3MgZWpiYyB0b29sIGZyb20gYSBkaXJlY3RvcnkgY29udGFpbmluZwotIGEgc2V0IG9mIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBjb21waWxhdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBjb21waWxhdGlvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdG9ycyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSBmcm9tIHdoZXJlIHRoZSBzZXJpYWxpemVkIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgYXJlCi0gdG8gYmUgcmVhZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBkaXJlY3RvcnkgZnJvbSB3aGVyZSB0aGUgc2VyaWFsaXplZCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIGFyZQotIHRvIGJlIHJlYWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBzdXBwb3J0IGNsYXNzZXMsIFJNSSBzdHVicywgZXRjIGFyZSB0byBiZSB3cml0dGVuLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBzdXBwb3J0IGNsYXNzZXMsIFJNSSBzdHVicywgZXRjIGFyZSB0byBiZSB3cml0dGVuLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImtlZXBnZW5lcmF0ZWQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBlamJjIHdpbGwga2VlcCB0aGUKLSBpbnRlcm1lZGlhdGUgSmF2YSBmaWxlcyB1c2VkIHRvIGJ1aWxkIHRoZSBjbGFzcyBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgZWpiYyB3aWxsIGtlZXAgdGhlCi0gaW50ZXJtZWRpYXRlIEphdmEgZmlsZXMgdXNlZCB0byBidWlsZCB0aGUgY2xhc3MgZmlsZXMuCi0gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gZGVidWdnaW5nLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im1hbmlmZXN0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTmFtZSBvZiB0aGUgZ2VuZXJhdGVkIG1hbmlmZXN0IGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIG1hbmlmZXN0IGZpbGUuCi0KLSBGb3IgZWFjaCBFSkIgdGhhdCBpcyBwcm9jZXNzZWQgYW4gZW50cnkgaXMgY3JlYXRlZCBpbiB0aGlzIGZpbGUuIFRoaXMgY2FuIHRoZW4gYmUgdXNlZAotIHRvIGNyZWF0ZSBhIGphciBmaWxlIGZvciBkcGxveWluZyB0aGUgYmVhbnMuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgaG9tZSBpbnRlcmZhY2UsIHJlbW90ZSBpbnRlcmZhY2UKLSBhbmQgcHVibGljIGtleSBjbGFzcyBkZWZpbml0aW9ucy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSBob21lIGludGVyZmFjZSwgcmVtb3RlIGludGVyZmFjZQotIGFuZCBwdWJsaWMga2V5IGNsYXNzIGRlZmluaXRpb25zLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJlamJqYXIiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiLkVqYkphciIKLSAgICAgIG1hdGNoaW5nVGFzaz0idHJ1ZSI+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Byb3ZpZGVzIGF1dG9tYXRlZCBFSkIgSkFSIGZpbGUgY3JlYXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW1Byb3ZpZGVzIGF1dG9tYXRlZCBFSkIgSkFSIGZpbGUgY3JlYXRpb24uCi0gPHA+Ci0gRXh0ZW5kcyB0aGUKLSBNYXRjaGluZ1Rhc2sgY2xhc3MgcHJvdmlkZWQgaW4gdGhlIGRlZmF1bHQgYW50IGRpc3RyaWJ1dGlvbiB0byBwcm92aWRlIGEKLSBkaXJlY3Rvcnkgc2Nhbm5pbmcgRUpCIGphcmZpbGUgZ2VuZXJhdG9yLgotIDwvcD4KLQotIDxwPgotIFRoZSB0YXNrIHdvcmtzIGJ5IHRha2luZyB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBvbmUgYXQgYSB0aW1lIGFuZAotIHBhcnNpbmcgdGhlbSB0byBsb2NhdGUgdGhlIG5hbWVzIG9mIHRoZSBjbGFzc2VzIHdoaWNoIHNob3VsZCBiZSBwbGFjZWQgaW4KLSB0aGUgamFyLiBUaGUgY2xhc3NuYW1lcyBhcmUgdHJhbnNsYXRlZCB0byBqYXZhLmlvLkZpbGVzIGJ5IHJlcGxhY2luZwotIHBlcmlvZHMgd2l0aCBGaWxlLnNlcGFyYXRvckNoYXIgYW5kIHJlc29sdmluZyB0aGUgZ2VuZXJhdGVkIGZpbGVuYW1lIGFzIGEKLSByZWxhdGl2ZSBwYXRoIHVuZGVyIHRoZSBzcmNEaXIgYXR0cmlidXRlLiBBbGwgbmVjZXNzYXJ5IGZpbGVzIGFyZSB0aGVuCi0gYXNzZW1ibGVkIGludG8gYSBqYXJmaWxlLiBPbmUgamFyZmlsZSBpcyBjb25zdHJ1Y3RlZCBmb3IgZWFjaCBkZXBsb3ltZW50Ci0gZGVzY3JpcHRvciBmb3VuZC4KLSA8L3A+XV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiYXNlamFybmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Jhc2UgbmFtZSBvZiB0aGUgRUpCIEpBUiB0aGF0IGlzIHRvIGJlIGNyZWF0ZWQgaWYgaXQgaXMgbm90Ci0gdG8gYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBuYW1lIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgYmFzZSBuYW1lIG9mIHRoZSBFSkIgSkFSIHRoYXQgaXMgdG8gYmUgY3JlYXRlZCBpZiBpdCBpcyBub3QKLSB0byBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIG5hbWUgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiYXNlbmFtZXRlcm1pbmF0b3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgc3RyaW5nIHdoaWNoIHRlcm1pbmF0ZXMgdGhlIGJlYW4gbmFtZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIHN0cmluZyB3aGljaCB0ZXJtaW5hdGVzIHRoZSBiZWFuIG5hbWUuCi0gVGhlIGNvbnZlbnRpb24gdXNlZCBieSB0aGlzIHRhc2sgaXMKLSB0aGF0IGJlYW4gZGVzY3JpcHRvcnMgYXJlIG5hbWVkIGFzIHRoZSBCZWFuTmFtZSB3aXRoIHNvbWUgc3VmZml4LiBUaGUKLSBiYXNlTmFtZVRlcm1pbmF0b3Igc3RyaW5nIHNlcGFyYXRlcyB0aGUgYmVhbiBuYW1lIGFuZCB0aGUgc3VmZml4IGFuZAotIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBiZWFuIG5hbWUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NsYXNzcGF0aCB0byB1c2Ugd2hlbiByZXNvbHZpbmcgY2xhc3NlcyBmb3IgaW5jbHVzaW9uIGluIHRoZSBqYXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIHJlc29sdmluZyBjbGFzc2VzIGZvciBpbmNsdXNpb24gaW4gdGhlIGphci4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXBlbmRlbmN5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQW5hbHl6ZXIgdG8gdXNlIHdoZW4gYWRkaW5nIGluIGRlcGVuZGVuY2llcyB0byB0aGUgSkFSLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGFuYWx5emVyIHRvIHVzZSB3aGVuIGFkZGluZyBpbiBkZXBlbmRlbmNpZXMgdG8gdGhlIEpBUi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdG9yZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVzY3JpcHRvciBkaXJlY3RvcnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgZGVzY3JpcHRvciBkaXJlY3RvcnkuIFRoZSBkZXNjcmlwdG9yIGRpcmVjdG9yeSBjb250YWlucyB0aGUKLSBFSkIgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4gVGhlc2UgYXJlIFhNTCBmaWxlcyB0aGF0IGRlY2xhcmUgdGhlCi0gcHJvcGVydGllcyBvZiBhIGJlYW4gaW4gYSBwYXJ0aWN1bGFyIGRlcGxveW1lbnQgc2NlbmFyaW8uIFN1Y2gKLSBwcm9wZXJ0aWVzIGluY2x1ZGUsIGZvciBleGFtcGxlLCB0aGUgdHJhbnNhY3Rpb25hbCBuYXR1cmUgb2YgdGhlIGJlYW4KLSBhbmQgdGhlIHNlY3VyaXR5IGFjY2VzcyBjb250cm9sIHRvIHRoZSBiZWFuJ3MgbWV0aG9kcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0ZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVzdGluYXRpb24gZGlyZWN0b3J5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4gVGhlIEVKQiBqYXIgZmlsZXMgd2lsbCBiZSB3cml0dGVuIGludG8KLSB0aGlzIGRpcmVjdG9yeS4gVGhlIGphciBmaWxlcyB0aGF0IGV4aXN0IGluIHRoaXMgZGlyZWN0b3J5IGFyZSBhbHNvCi0gdXNlZCB3aGVuIGRldGVybWluaW5nIGlmIHRoZSBjb250ZW50cyBvZiB0aGUgamFyIGZpbGUgaGF2ZSBjaGFuZ2VkLgotIE5vdGUgdGhhdCB0aGlzIHBhcmFtZXRlciBpcyBvbmx5IHVzZWQgaWYgbm8gZGVwbG95bWVudCB0b29scyBhcmUKLSBzcGVjaWZpZWQuIFR5cGljYWxseSBlYWNoIGRlcGxveW1lbnQgdG9vbCB3aWxsIHNwZWNpZnkgaXRzIG93bgotIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmbGF0ZGVzdGRpciIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDb250cm9scyB3aGV0aGVyIHRoZQotIGRlc3RpbmF0aW9uIEpBUnMgYXJlIHdyaXR0ZW4gb3V0IGluIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3Rvcnkgd2l0aAotIHRoZSBzYW1lIGhpZXJhcmNoaWNhbCBzdHJ1Y3R1cmUgZnJvbSB3aGljaCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9ycwotIGhhdmUgYmVlbiByZWFkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBDb250cm9scyB3aGV0aGVyIHRoZQotIGRlc3RpbmF0aW9uIEpBUnMgYXJlIHdyaXR0ZW4gb3V0IGluIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3Rvcnkgd2l0aAotIHRoZSBzYW1lIGhpZXJhcmNoaWNhbCBzdHJ1Y3R1cmUgZnJvbSB3aGljaCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9ycwotIGhhdmUgYmVlbiByZWFkLiBJZiB0aGlzIGlzIHNldCB0byB0cnVlIHRoZSBnZW5lcmF0ZWQgRUpCIGphcnMgYXJlCi0gd3JpdHRlbiBpbnRvIHRoZSByb290IG9mIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnksIG90aGVyd2lzZSB0aGV5Ci0gYXJlIHdyaXR0ZW4gb3V0IGluIHRoZSBzYW1lIHJlbGF0aXZlIHBvc2l0aW9uIGFzIHRoZSBkZXBsb3ltZW50Ci0gZGVzY3JpcHRvcnMgaW4gdGhlIGRlc2NyaXB0b3IgZGlyZWN0b3J5LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImdlbmVyaWNqYXJzdWZmaXgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTdWZmaXggZm9yIHRoZSBnZW5lcmF0ZWQgamFyIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgc3VmZml4IGZvciB0aGUgZ2VuZXJhdGVkIGphciBmaWxlLiBXaGVuIGdlbmVyaWMgamFycyBhcmUKLSBnZW5lcmF0ZWQsIHRoZXkgaGF2ZSBhIHN1ZmZpeCB3aGljaCBpcyBhcHBlbmRlZCB0byB0aGUgdGhlIGJlYW4gbmFtZQotIHRvIGNyZWF0ZSB0aGUgbmFtZSBvZiB0aGUgamFyIGZpbGUuIE5vdGUgdGhhdCB0aGlzIHN1ZmZpeCBpbmNsdWRlcwotIHRoZSBleHRlbnNpb24gZm8gdGUgamFyIGZpbGUgYW5kIHNob3VsZCB0aGVyZWZvcmUgZW5kIHdpdGggYW4KLSBhcHByb3ByaWF0ZSBleHRlbnNpb24gc3VjaCBhcyAuamFyIG9yIC5lYXIKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYW5pZmVzdCIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW01hbmlmZXN0IGZpbGUgdG8gdXNlIHdoZW4gamFycmluZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBNYW5pZmVzdCBmaWxlIHRvIHVzZSB3aGVuIGphcnJpbmcuIEFzIG9mIEVKQiAxLjEsIG1hbmlmZXN0Ci0gZmlsZXMgYXJlIG5vIGxvbmdlciB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgRUpCLiBIb3dldmVyLCB0aGV5IHN0aWxsCi0gaGF2ZSBhIHZpdGFsIGltcG9ydGFuY2UgaWYgdGhlIEVKQiBpcyBpbnRlbmRlZCB0byBiZSBwYWNrYWdlZCBpbiBhbgotIEVBUiBmaWxlLiBCeSBhZGRpbmcgIkNsYXNzLVBhdGgiIHNldHRpbmdzIHRvIGEgTWFuaWZlc3QgZmlsZSwgdGhlIEVKQgotIGNhbiBsb29rIGZvciBjbGFzc2VzIGluc2lkZSB0aGUgRUFSIGZpbGUgaXRzZWxmLCBhbGxvd2luZyBmb3IgZWFzaWVyCi0gZGVwbG95bWVudC4gVGhpcyBpcyBvdXRsaW5lZCBpbiB0aGUgSjJFRSBzcGVjaWZpY2F0aW9uLCBhbmQgYWxsIEoyRUUKLSBjb21wb25lbnRzIGFyZSBtZWFudCB0byBzdXBwb3J0IGl0LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWluZyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiLkVqYkphci5OYW1pbmdTY2hlbWUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7ZWpiLW5hbWUmcXVvdDssICZxdW90O2RpcmVjdG9yeSZxdW90OywgJnF1b3Q7ZGVzY3JpcHRvciZxdW90OywgJnF1b3Q7YmFzZWphcm5hbWUmcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWluZyBzY2hlbWUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBqYXJzCi0gZnJvbSB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIG5hbWluZyBzY2hlbWUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBqYXJzCi0gZnJvbSB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU291cmNlIGRpcmVjdG9yeSwgd2hpY2ggaXMgdGhlIGRpcmVjdG9yeSB0aGF0Ci0gY29udGFpbnMgdGhlIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBFSkIgamFyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBzb3VyY2UgZGlyZWN0b3J5LCB3aGljaCBpcyB0aGUgZGlyZWN0b3J5IHRoYXQKLSBjb250YWlucyB0aGUgY2xhc3NlcyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIEVKQiBqYXIuIFR5cGljYWxseQotIHRoaXMgd2lsbCBpbmNsdWRlIHRoZSBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcyBhbmQgdGhlIGJlYW4gY2xhc3MuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJib3JsYW5kIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamIuQm9ybGFuZERlcGxveW1lbnRUb29sIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgZGVwbG95bWVudCB0b29sIGZvciBCb3JsYW5kIHNlcnZlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIGRlcGxveW1lbnQgdG9vbCBmb3IgQm9ybGFuZCBzZXJ2ZXIuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgdG8gdGhlIGNsYXNzcGF0aCB1c2VkIHRvIGxvY2F0ZSB0aGUgc3VwZXIgY2xhc3NlcyBhbmQKLSBpbnRlcmZhY2VzIG9mIHRoZSBjbGFzc2VzIHRoYXQgd2lsbCBtYWtlIHVwIHRoZSBFSkIgSkFSLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIHRvIHRoZSBjbGFzc3BhdGggdXNlZCB0byBsb2NhdGUgdGhlIHN1cGVyIGNsYXNzZXMgYW5kCi0gaW50ZXJmYWNlcyBvZiB0aGUgY2xhc3NlcyB0aGF0IHdpbGwgbWFrZSB1cCB0aGUgRUpCIEpBUi5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iZHRkIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamIuRWpiSmFyLkRURExvY2F0aW9uIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGUgYSBEVEQgbG9jYXRpb24gcmVjb3JkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtDcmVhdGUgYSBEVEQgbG9jYXRpb24gcmVjb3JkLiBUaGlzIHN0b3JlcyB0aGUgbG9jYXRpb24gb2YgYSBEVEQuIFRoZQotIERURCBpcyBpZGVudGlmaWVkIGJ5IGl0cyBwdWJsaWMgSWQuIFRoZSBsb2NhdGlvbiBtYXkgZWl0aGVyIGJlIGEgZmlsZQotIGxvY2F0aW9uIG9yIGEgcmVzb3VyY2UgbG9jYXRpb24uXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImlwbGFuZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYi5JUGxhbmV0RGVwbG95bWVudFRvb2wiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBkZXBsb3ltZW50IHRvb2wgZm9yIGlQbGFuZXQgQXBwbGljYXRpb24gU2VydmVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgZGVwbG95bWVudCB0b29sIGZvciBpUGxhbmV0IEFwcGxpY2F0aW9uIFNlcnZlci5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iamJvc3MiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYi5KYm9zc0RlcGxveW1lbnRUb29sIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgZGVwbG95bWVudCB0b29sIGZvciBKQm9zcyBzZXJ2ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBkZXBsb3ltZW50IHRvb2wgZm9yIEpCb3NzIHNlcnZlci5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iam9uYXMiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYi5Kb25hc0RlcGxveW1lbnRUb29sIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgZGVwbG95bWVudCB0b29sIGZvciBKT25BUyBzZXJ2ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBkZXBsb3ltZW50IHRvb2wgZm9yIEpPbkFTIHNlcnZlci5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0ic3VwcG9ydCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBmaWxlc2V0IGZvciBzdXBwb3J0IGVsZW1lbnRzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgZmlsZXNldCBmb3Igc3VwcG9ydCBlbGVtZW50cy5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0id2VibG9naWMiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYi5XZWJsb2dpY0RlcGxveW1lbnRUb29sIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgZGVwbG95bWVudCB0b29sIGZvciBXZWJsb2dpYyBzZXJ2ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBkZXBsb3ltZW50IHRvb2wgZm9yIFdlYmxvZ2ljIHNlcnZlci5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0id2VibG9naWN0b3BsaW5rIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamIuV2VibG9naWNUT1BMaW5rRGVwbG95bWVudFRvb2wiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBkZXBsb3ltZW50IHRvb2wgZm9yIFdlYmxvZ2ljIHdoZW4gdXNpbmcgdGhlIFRvcGxpbmsKLSBPYmplY3QtUmVsYXRpb25hbCBtYXBwaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgZGVwbG95bWVudCB0b29sIGZvciBXZWJsb2dpYyB3aGVuIHVzaW5nIHRoZSBUb3BsaW5rCi0gT2JqZWN0LVJlbGF0aW9uYWwgbWFwcGluZy5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0id2Vic3BoZXJlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamIuV2Vic3BoZXJlRGVwbG95bWVudFRvb2wiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBkZXBsb3ltZW50IHRvb2wgZm9yIFdlYnNwaGVyZSA0LjAgc2VydmVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgZGVwbG95bWVudCB0b29sIGZvciBXZWJzcGhlcmUgNC4wIHNlcnZlci5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJleGVjIiBjYXRlZ29yeT0iY29udHJvbCIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY1Rhc2siCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0V4ZWN1dGVzIGEgZ2l2ZW4gY29tbWFuZCBpZiB0aGUgb3MgcGxhdGZvcm0gaXMgYXBwcm9wcmlhdGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0V4ZWN1dGVzIGEgZ2l2ZW4gY29tbWFuZCBpZiB0aGUgb3MgcGxhdGZvcm0gaXMgYXBwcm9wcmlhdGUuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhcHBlbmQiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciBvdXRwdXQgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIG9yIG92ZXJ3cml0ZSBhbiBleGlzdGluZyBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBXaGV0aGVyIG91dHB1dCBzaG91bGQgYmUgYXBwZW5kZWQgdG8gb3Igb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGZpbGUuCi0gRGVmYXVsdHMgdG8gZmFsc2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHRoZSBwcm9jZXNzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIHByb2Nlc3MuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXhlY3V0YWJsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBjb21tYW5kIHRvIGV4ZWN1dGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbGlmZXhlY3V0aW9uZmFpbHMiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3RvcCB0aGUgYnVpbGQgaWYgcHJvZ3JhbSBjYW5ub3QgYmUgc3RhcnRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU3RvcCB0aGUgYnVpbGQgaWYgcHJvZ3JhbSBjYW5ub3QgYmUgc3RhcnRlZC4gRGVmYXVsdHMgdG8gdHJ1ZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGYWlsIGlmIHRoZSBjb21tYW5kIGV4aXRzIHdpdGggYSBub24temVybyByZXR1cm4gY29kZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgRmFpbCBpZiB0aGUgY29tbWFuZCBleGl0cyB3aXRoIGEgbm9uLXplcm8gcmV0dXJuIGNvZGUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmV3ZW52aXJvbm1lbnQiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRG8gbm90IHByb3BhZ2F0ZSBvbGQgZW52aXJvbm1lbnQgd2hlbiBuZXcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzcGVjaWZpZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIERvIG5vdCBwcm9wYWdhdGUgb2xkIGVudmlyb25tZW50IHdoZW4gbmV3IGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc3BlY2lmaWVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im9zIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTGlzdCBvZiBvcGVyYXRpbmcgc3lzdGVtcyBvbiB3aGljaCB0aGUgY29tbWFuZCBtYXkgYmUgZXhlY3V0ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIExpc3Qgb2Ygb3BlcmF0aW5nIHN5c3RlbXMgb24gd2hpY2ggdGhlIGNvbW1hbmQgbWF5IGJlIGV4ZWN1dGVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im91dHB1dCIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZpbGUgdGhlIG91dHB1dCBvZiB0aGUgcHJvY2VzcyBpcyByZWRpcmVjdGVkIHRvLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBGaWxlIHRoZSBvdXRwdXQgb2YgdGhlIHByb2Nlc3MgaXMgcmVkaXJlY3RlZCB0by4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdXRwdXRwcm9wZXJ0eSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Byb3BlcnR5IG5hbWUgd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHNldCB0byB0aGUgb3V0cHV0IG9mCi0gdGhlIHByb2Nlc3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFByb3BlcnR5IG5hbWUgd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHNldCB0byB0aGUgb3V0cHV0IG9mCi0gdGhlIHByb2Nlc3MuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVzdWx0cHJvcGVydHkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSByZXR1cm4gY29kZSBvZiB0aGUKLSBjb21tYW5kIHNob3VsZCBiZSBzdG9yZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBuYW1lIG9mIGEgcHJvcGVydHkgaW4gd2hpY2ggdGhlIHJldHVybiBjb2RlIG9mIHRoZQotIGNvbW1hbmQgc2hvdWxkIGJlIHN0b3JlZC4gT25seSBvZiBpbnRlcmVzdCBpZiBmYWlsb25lcnJvcj1mYWxzZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2bWxhdW5jaGVyIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGxhdW5jaCBuZXcgcHJvY2VzcyB3aXRoIFZNLCBvdGhlcndpc2UgdXNlIHRoZSBPUydzIHNoZWxsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCBsYXVuY2ggbmV3IHByb2Nlc3Mgd2l0aCBWTSwgb3RoZXJ3aXNlIHVzZSB0aGUgT1MncyBzaGVsbC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImVudiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW52aXJvbm1lbnQuVmFyaWFibGUiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgbGF1bmNoZWQgcHJvY2Vzcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBsYXVuY2hlZCBwcm9jZXNzLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJhcmciIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lLkFyZ3VtZW50IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgY29tbWFuZC1saW5lIGFyZ3VtZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgY29tbWFuZC1saW5lIGFyZ3VtZW50Ll1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9ImZhaWwiIGNhdGVnb3J5PSJjb250cm9sIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGl0IgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFeGl0cyB0aGUgYWN0aXZlIGJ1aWxkLCBnaXZpbmcgYW4gYWRkaXRpb25hbCBtZXNzYWdlIGlmIGF2YWlsYWJsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbRXhpdHMgdGhlIGFjdGl2ZSBidWlsZCwgZ2l2aW5nIGFuIGFkZGl0aW9uYWwgbWVzc2FnZQotIGlmIGF2YWlsYWJsZS5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImlmIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbT25seSBmYWlsIGlmIGEgcHJvcGVydHkgb2YgdGhlIGdpdmVuIG5hbWUgZXhpc3RzIGluIHRoZSBjdXJyZW50IHByb2plY3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIE9ubHkgZmFpbCBpZiBhIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBuYW1lIGV4aXN0cyBpbiB0aGUgY3VycmVudCBwcm9qZWN0LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBIG1lc3NhZ2UgZ2l2aW5nIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gd2h5IHRoZSBidWlsZCBleGl0ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEEgbWVzc2FnZSBnaXZpbmcgZnVydGhlciBpbmZvcm1hdGlvbiBvbiB3aHkgdGhlIGJ1aWxkIGV4aXRlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1bmxlc3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPbmx5IGZhaWwgaWYgYSBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gbmFtZSBkb2VzIG5vdAotIGV4aXN0IGluIHRoZSBjdXJyZW50IHByb2plY3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIE9ubHkgZmFpbCBpZiBhIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBuYW1lIGRvZXMgbm90Ci0gZXhpc3QgaW4gdGhlIGN1cnJlbnQgcHJvamVjdC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gICAgICA8Ym9keSA+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgYSBtdWx0aWxpbmUgbWVzc2FnZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYm9keT4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9ImZpbHRlciIgY2F0ZWdvcnk9ImZpbGVzeXN0ZW0iCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkZpbHRlciIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyBhIHRva2VuIGZpbHRlciB0aGF0IGlzIHVzZWQgYnkgdGhlIGZpbGUgY29weSB0YXNrcyB0byBkbyB0b2tlbiBzdWJzdGl0dXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW1NldHMgYSB0b2tlbiBmaWx0ZXIgdGhhdCBpcyB1c2VkIGJ5IHRoZSBmaWxlIGNvcHkgdGFza3MKLSB0byBkbyB0b2tlbiBzdWJzdGl0dXRpb24uIFNldHMgbXV0aXBsZSB0b2tlbnMgYnkKLSByZWFkaW5nIHRoZXNlIGZyb20gYSBmaWxlLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsdGVyc2ZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZmlsZSBmcm9tIHdoaWNoIHRoZSBmaWx0ZXJzIG11c3QgYmUgcmVhZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGZpbGUgZnJvbSB3aGljaCB0aGUgZmlsdGVycyBtdXN0IGJlIHJlYWQuCi0gVGhpcyBmaWxlIG11c3QgYmUgYSBmb3JtYXR0ZWQgYXMgYSBwcm9wZXJ0eSBmaWxlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRva2VuIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHRva2VuIHN0cmluZyB3aXRob3V0IEAgZGVsaW1pdGVycy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIHRva2VuIHN0cmluZyB3aXRob3V0IEAgZGVsaW1pdGVycy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBzdHJpbmcgdGhhdCBzaG91bGQgcmVwbGFjZSB0aGUgdG9rZW4gZHVyaW5nIGZpbHRlcmVkIGNvcGllcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIHN0cmluZyB0aGF0IHNob3VsZCByZXBsYWNlIHRoZSB0b2tlbiBkdXJpbmcgZmlsdGVyZWQgY29waWVzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJmaXhjcmxmIiBjYXRlZ29yeT0iZmlsZXN5c3RlbSIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRml4Q1JMRiIKLSAgICAgIG1hdGNoaW5nVGFzaz0idHJ1ZSI+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NvbnZlcnRzIHRleHQgc291cmNlIGZpbGVzIHRvIGxvY2FsIE9TIGZvcm1hdHRpbmcgY29udmVudGlvbnMsIGFzIHdlbGwgYXMgcmVwYWlyIHRleHQgZmlsZXMgZGFtYWdlZCBieSBtaXNjb25maWd1cmVkIG9yIG1pc2d1aWRlZCBlZGl0b3JzIG9yIGZpbGUgdHJhbnNmZXIgcHJvZ3JhbXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0NvbnZlcnRzIHRleHQgc291cmNlIGZpbGVzIHRvIGxvY2FsIE9TIGZvcm1hdHRpbmcgY29udmVudGlvbnMsIGFzCi0gd2VsbCBhcyByZXBhaXIgdGV4dCBmaWxlcyBkYW1hZ2VkIGJ5IG1pc2NvbmZpZ3VyZWQgb3IgbWlzZ3VpZGVkIGVkaXRvcnMgb3IKLSBmaWxlIHRyYW5zZmVyIHByb2dyYW1zLgotIDxwPgotIFRoaXMgdGFzayBjYW4gdGFrZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czoKLSA8dWw+Ci0gPGxpPnNyY2RpcgotIDxsaT5kZXN0ZGlyCi0gPGxpPmluY2x1ZGUKLSA8bGk+ZXhjbHVkZQotIDxsaT5jcgotIDxsaT5lb2wKLSA8bGk+dGFiCi0gPGxpPmVvZgotIDxsaT5lbmNvZGluZwotIDwvdWw+Ci0gT2YgdGhlc2UgYXJndW1lbnRzLCBvbmx5IDxiPnNvdXJjZWRpcjwvYj4gaXMgcmVxdWlyZWQuCi0gPHA+Ci0gV2hlbiB0aGlzIHRhc2sgZXhlY3V0ZXMsIGl0IHdpbGwgc2NhbiB0aGUgc3JjZGlyIGJhc2VkIG9uIHRoZSBpbmNsdWRlCi0gYW5kIGV4Y2x1ZGUgcHJvcGVydGllcy4KLSA8cD4KLSBUaGlzIHZlcnNpb24gZ2VuZXJhbGlzZXMgdGhlIGhhbmRsaW5nIG9mIEVPTCBjaGFyYWN0ZXJzLCBhbmQgYWxsb3dzCi0gZm9yIENSLW9ubHkgbGluZSBlbmRpbmdzICh3aGljaCBJIHN1c3BlY3QgaXMgdGhlIHN0YW5kYXJkIG9uIE1hY3MuKQotIFRhYiBoYW5kbGluZyBoYXMgYWxzbyBiZWVuIGdlbmVyYWxpc2VkIHRvIGFjY29tbW9kYXRlIGFueSB0YWJ3aWR0aAotIGZyb20gMiB0byA4MCwgaW5jbHVzaXZlLiAgSW1wb3J0YW50bHksIGl0IHdpbGwgbGVhdmUgdW50b3VjaGVkIGFueQotIGxpdGVyYWwgVEFCIGNoYXJhY3RlcnMgZW1iZWRkZWQgd2l0aGluIHN0cmluZyBvciBjaGFyYWN0ZXIgY29uc3RhbnRzLgotIDxwPgotIDxlbT5XYXJuaW5nOjwvZW0+IGRvIG5vdCBydW4gb24gYmluYXJ5IGZpbGVzLgotIDxlbT5DYXV0aW9uOjwvZW0+IHJ1biB3aXRoIGNhcmUgb24gY2FyZWZ1bGx5IGZvcm1hdHRlZCBmaWxlcy4KLSBUaGlzIG1heSBzb3VuZCBvYnZpb3VzLCBidXQgaWYgeW91IGRvbid0IHNwZWNpZnkgYXNpcywgcHJlc3VtZSB0aGF0Ci0geW91ciBmaWxlcyBhcmUgZ29pbmcgdG8gYmUgbW9kaWZpZWQuICBJZiAidGFicyIgaXMgImFkZCIgb3IgInJlbW92ZSIsCi0gd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIG1heSBiZSBhZGRlZCBvciByZW1vdmVkIGFzIG5lY2Vzc2FyeS4gIFNpbWlsYXJseSwKLSBmb3IgQ1IncyAtIGluIGZhY3QgImVvbCI9ImNybGYiIG9yIGNyPSJhZGQiIGNhbiByZXN1bHQgaW4gY3IKLSBjaGFyYWN0ZXJzIGJlaW5nIHJlbW92ZWQgaW4gb25lIHNwZWNpYWwgY2FzZSBhY2NvbW1vZGF0ZWQsIGkuZS4sCi0gQ1JDUkxGIGlzIHJlZ2FyZGVkIGFzIGEgc2luZ2xlIEVPTCB0byBoYW5kbGUgY2FzZXMgd2hlcmUgb3RoZXIKLSBwcm9ncmFtcyBoYXZlIGNvbnZlcnRlZCBDUkxGIGludG8gQ1JDUkxGLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdGRpciIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Rlc3RpbmF0aW9uIHdoZXJlIHRoZSBmaXhlZCBmaWxlcyBzaG91bGQgYmUgcGxhY2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGRlc3RpbmF0aW9uIHdoZXJlIHRoZSBmaXhlZCBmaWxlcyBzaG91bGQgYmUgcGxhY2VkLgotIERlZmF1bHQgaXMgdG8gcmVwbGFjZSB0aGUgb3JpZ2luYWwgZmlsZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbmNvZGluZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZmllcyB0aGUgZW5jb2RpbmcgQW50IGV4cGVjdHMgdGhlIGZpbGVzIHRvIGJlIGluIC0KLSBkZWZhdWx0cyB0byB0aGUgcGxhdGZvcm1zIGRlZmF1bHQgZW5jb2RpbmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNwZWNpZmllcyB0aGUgZW5jb2RpbmcgQW50IGV4cGVjdHMgdGhlIGZpbGVzIHRvIGJlIGluIC0KLSBkZWZhdWx0cyB0byB0aGUgcGxhdGZvcm1zIGRlZmF1bHQgZW5jb2RpbmcuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW9mIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5GaXhDUkxGLkFkZEFzaXNSZW1vdmUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7YWRkJnF1b3Q7LCAmcXVvdDthc2lzJnF1b3Q7LCAmcXVvdDtyZW1vdmUmcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZnkgaG93IERPUyBFT0YgKGNvbnRyb2wteikgY2hhcmFjdGVycyBhcmUgdG8gYmUgaGFuZGxlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU3BlY2lmeSBob3cgRE9TIEVPRiAoY29udHJvbC16KSBjaGFyYWN0ZXJzIGFyZSB0byBiZSBoYW5kbGVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImVvbCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRml4Q1JMRi5DckxmIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O2FzaXMmcXVvdDssICZxdW90O2NyJnF1b3Q7LCAmcXVvdDtsZiZxdW90OywgJnF1b3Q7Y3JsZiZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmeSBob3cgRW5kT2ZMaW5lIGNoYXJhY3RlcnMgYXJlIHRvIGJlIGhhbmRsZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNwZWNpZnkgaG93IEVuZE9mTGluZSBjaGFyYWN0ZXJzIGFyZSB0byBiZSBoYW5kbGVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImphdmFmaWxlcyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgdG8gdHJ1ZSBpZiBtb2RpZnlpbmcgSmF2YSBzb3VyY2UgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0byB0cnVlIGlmIG1vZGlmeWluZyBKYXZhIHNvdXJjZSBmaWxlcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmNkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2UgZGlyIHRvIGZpbmQgdGhlIHNvdXJjZSB0ZXh0IGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIHNvdXJjZSBkaXIgdG8gZmluZCB0aGUgc291cmNlIHRleHQgZmlsZXMuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFiIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5GaXhDUkxGLkFkZEFzaXNSZW1vdmUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7YWRkJnF1b3Q7LCAmcXVvdDthc2lzJnF1b3Q7LCAmcXVvdDtyZW1vdmUmcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZnkgaG93IHRhYiBjaGFyYWN0ZXJzIGFyZSB0byBiZSBoYW5kbGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTcGVjaWZ5IGhvdyB0YWIgY2hhcmFjdGVycyBhcmUgdG8gYmUgaGFuZGxlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YWJsZW5ndGgiIHR5cGU9ImludCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJpbnQiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZnkgdGFiIGxlbmd0aCBpbiBjaGFyYWN0ZXJzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTcGVjaWZ5IHRhYiBsZW5ndGggaW4gY2hhcmFjdGVycy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iZnRwIiBjYXRlZ29yeT0ib3RoZXIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLm5ldC5GVFAiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Jhc2ljIEZUUCBjbGllbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0Jhc2ljIEZUUCBjbGllbnQuIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKLSA8dWw+Ci0gICA8bGk+IDxzdHJvbmc+c2VuZDwvc3Ryb25nPiAtIHNlbmQgZmlsZXMgdG8gYSByZW1vdGUgc2VydmVyLiBUaGlzIGlzIHRoZQotICAgZGVmYXVsdCBhY3Rpb24uPC9saT4KLSAgIDxsaT4gPHN0cm9uZz5nZXQ8L3N0cm9uZz4gLSByZXRyaXZlIGZpbGVzIGZyb20gYSByZW1vdGUgc2VydmVyLjwvbGk+Ci0gICA8bGk+IDxzdHJvbmc+ZGVsPC9zdHJvbmc+IC0gZGVsZXRlIGZpbGVzIGZyb20gYSByZW1vdGUgc2VydmVyLjwvbGk+Ci0gICA8bGk+IDxzdHJvbmc+bGlzdDwvc3Ryb25nPiAtIGNyZWF0ZSBhIGZpbGUgbGlzdGluZy48L2xpPgotICAgPGxpPiA8c3Ryb25nPmNobW9kPC9zdHJvbmc+IC0gY2hhbmdlIHVuaXggZmlsZSBwZXJtaXNzaW9ucy48L2xpPgotIDwvdWw+Ci0gPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBTb21lIEZUUCBzZXJ2ZXJzIC0gbm90YWJseSB0aGUgU29sYXJpcyBzZXJ2ZXIgLSBzZWVtCi0gdG8gaG9sZCBkYXRhIHBvcnRzIG9wZW4gYWZ0ZXIgYSAicmV0ciIgb3BlcmF0aW9uLCBhbGxvd2luZyB0aGVtIHRvIHRpbWVvdXQKLSBpbnN0ZWFkIG9mIHNodXR0aW5nIHRoZW0gZG93biBjbGVhbmx5LiBUaGlzIGhhcHBlbnMgaW4gYWN0aXZlIG9yIHBhc3NpdmUKLSBtb2RlLCBhbmQgdGhlIHBvcnRzIHdpbGwgcmVtYWluIG9wZW4gZXZlbiBhZnRlciBlbmRpbmcgdGhlIEZUUCBzZXNzaW9uLiBGVFAKLSAic2VuZCIgb3BlcmF0aW9ucyBzZWVtIHRvIGNsb3NlIHBvcnRzIGltbWVkaWF0ZWx5LiBUaGlzIGJlaGF2aW9yIG1heSBjYXVzZQotIHByb2JsZW1zIG9uIHNvbWUgc3lzdGVtcyB3aGVuIGRvd25sb2FkaW5nIGxhcmdlIHNldHMgb2YgZmlsZXMuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhY3Rpb24iIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLm5ldC5GVFAuQWN0aW9uIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O3NlbmQmcXVvdDssICZxdW90O3B1dCZxdW90OywgJnF1b3Q7cmVjdiZxdW90OywgJnF1b3Q7Z2V0JnF1b3Q7LCAmcXVvdDtkZWwmcXVvdDssICZxdW90O2RlbGV0ZSZxdW90OywgJnF1b3Q7bGlzdCZxdW90OywgJnF1b3Q7bWtkaXImcXVvdDssICZxdW90O2NobW9kJnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGVFAgYWN0aW9uIHRvIGJlIHRha2VuLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBGVFAgYWN0aW9uIHRvIGJlIHRha2VuLiBDdXJyZW50bHkgYWNjZXB0cyAicHV0IiwgImdldCIsICJkZWwiLAotICJta2RpciIsICJjaG1vZCIgYW5kICJsaXN0Ii4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiaW5hcnkiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgdXNlcyBiaW5hcnkgbW9kZSwgb3RoZXJ3aXNlIHRleHQgbW9kZSAoZGVmYXVsdCBpcyBiaW5hcnkpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCB1c2VzIGJpbmFyeSBtb2RlLCBvdGhlcndpc2UgdGV4dCBtb2RlIChkZWZhdWx0IGlzIGJpbmFyeSkuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2htb2QiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGaWxlIHBlcm1pc3Npb24gbW9kZSAoVW5peCBvbmx5KSBmb3IgZmlsZXMgc2VudCB0byB0aGUgc2VydmVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBmaWxlIHBlcm1pc3Npb24gbW9kZSAoVW5peCBvbmx5KSBmb3IgZmlsZXMgc2VudCB0byB0aGUgc2VydmVyLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlcGVuZHMiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IHRvIHRydWUgdG8gdHJhbnNtaXQgb25seSBmaWxlcyB0aGF0IGFyZSBuZXcgb3IgY2hhbmdlZCBmcm9tIHRoZWlyCi0gcmVtb3RlIGNvdW50ZXJwYXJ0cy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRvIHRydWUgdG8gdHJhbnNtaXQgb25seSBmaWxlcyB0aGF0IGFyZSBuZXcgb3IgY2hhbmdlZCBmcm9tIHRoZWlyCi0gcmVtb3RlIGNvdW50ZXJwYXJ0cy4gVGhlIGRlZmF1bHQgaXMgdG8gdHJhbnNtaXQgYWxsIGZpbGVzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Imlnbm9yZW5vbmNyaXRpY2FsZXJyb3JzIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdG8gc2tpcCBlcnJvcnMgb24gZGlyZWN0b3J5IGNyZWF0aW9uLgotIChhbmQgbWF5YmUgbGF0ZXIgb3RoZXIgc2VydmVyIHNwZWNpZmljIGVycm9ycykuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIHNldCB0aGUgZmxhZyB0byBza2lwIGVycm9ycyBvbiBkaXJlY3RvcnkgY3JlYXRpb24uCi0gKGFuZCBtYXliZSBsYXRlciBvdGhlciBzZXJ2ZXIgc3BlY2lmaWMgZXJyb3JzKQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Imxpc3RpbmciIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgb3V0cHV0IGZpbGUgZm9yIHRoZSAibGlzdCIgYWN0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgb3V0cHV0IGZpbGUgZm9yIHRoZSAibGlzdCIgYWN0aW9uLiBUaGlzIGF0dHJpYnV0ZSBpcyBpZ25vcmVkIGZvcgotIGFueSBvdGhlciBhY3Rpb25zLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im5ld2VyIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Egc3lub255bSBmb3IgPHR0PmRlcGVuZHM8L3R0Pi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgQSBzeW5vbnltIGZvciA8dHQ+ZGVwZW5kczwvdHQ+LiBTZXQgdG8gdHJ1ZSB0byB0cmFuc21pdCBvbmx5IG5ldyBvciBjaGFuZ2VkCi0gZmlsZXMuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFzc2l2ZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTcGVjaWZpZXMgd2hldGhlciB0byB1c2UgcGFzc2l2ZSBtb2RlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciB0byB1c2UgcGFzc2l2ZSBtb2RlLiBTZXQgdG8gdHJ1ZSBpZiB5b3UgYXJlIGJlaGluZCBhCi0gZmlyZXdhbGwgYW5kIGNhbm5vdCBjb25uZWN0IHdpdGhvdXQgaXQuIFBhc3NpdmUgbW9kZSBpcyBkaXNhYmxlZCBieQotIGRlZmF1bHQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFzc3dvcmQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtMb2dpbiBwYXNzd29yZCBmb3IgdGhlIGdpdmVuIHVzZXIgaWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIGxvZ2luIHBhc3N3b3JkIGZvciB0aGUgZ2l2ZW4gdXNlciBpZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb3J0IiB0eXBlPSJpbnQiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iaW50IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGVFAgcG9ydCB1c2VkIGJ5IHRoZSByZW1vdGUgc2VydmVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBGVFAgcG9ydCB1c2VkIGJ5IHRoZSByZW1vdGUgc2VydmVyLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InJlbW90ZWRpciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1JlbW90ZSBkaXJlY3Rvcnkgd2hlcmUgZmlsZXMgd2lsbCBiZSBwbGFjZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIHJlbW90ZSBkaXJlY3Rvcnkgd2hlcmUgZmlsZXMgd2lsbCBiZSBwbGFjZWQuIFRoaXMgbWF5IGJlIGEKLSByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRoLCBhbmQgbXVzdCBiZSBpbiB0aGUgcGF0aCBzeW50YXggZXhwZWN0ZWQgYnkKLSB0aGUgcmVtb3RlIHNlcnZlci4gTm8gY29ycmVjdGlvbiBvZiBwYXRoIHN5bnRheCB3aWxsIGJlIHBlcmZvcm1lZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXBhcmF0b3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtSZW1vdGUgZmlsZSBzZXBhcmF0b3IgY2hhcmFjdGVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSByZW1vdGUgZmlsZSBzZXBhcmF0b3IgY2hhcmFjdGVyLiBUaGlzIG5vcm1hbGx5IGRlZmF1bHRzIHRvIHRoZQotIFVuaXggc3RhbmRhcmQgZm9yd2FyZCBzbGFzaCwgYnV0IGNhbiBiZSBtYW51YWxseSBvdmVycmlkZGVuIHVzaW5nIHRoaXMKLSBjYWxsIGlmIHRoZSByZW1vdGUgc2VydmVyIHJlcXVpcmVzIHNvbWUgb3RoZXIgc2VwYXJhdG9yLiBPbmx5IHRoZSBmaXJzdAotIGNoYXJhY3RlciBvZiB0aGUgc3RyaW5nIGlzIHVzZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VydmVyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRlRQIHNlcnZlciB0byBzZW5kIGZpbGVzIHRvLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBGVFAgc2VydmVyIHRvIHNlbmQgZmlsZXMgdG8uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2tpcGZhaWxlZHRyYW5zZmVycyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBlbmFibGVzIHVuc3VjY2Vzc2Z1bCBmaWxlIHB1dCwgZGVsZXRlIGFuZCBnZXQKLSBvcGVyYXRpb25zIHRvIGJlIHNraXBwZWQgd2l0aCBhIHdhcm5pbmcgYW5kIHRoZSByZW1haW5kZXIKLSBvZiB0aGUgZmlsZXMgc3RpbGwgdHJhbnNmZXJyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGVuYWJsZXMgdW5zdWNjZXNzZnVsIGZpbGUgcHV0LCBkZWxldGUgYW5kIGdldAotIG9wZXJhdGlvbnMgdG8gYmUgc2tpcHBlZCB3aXRoIGEgd2FybmluZyBhbmQgdGhlIHJlbWFpbmRlcgotIG9mIHRoZSBmaWxlcyBzdGlsbCB0cmFuc2ZlcnJlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1bWFzayIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RlZmF1bHQgbWFzayBmb3IgZmlsZSBjcmVhdGlvbiBvbiBhIHVuaXggc2VydmVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBkZWZhdWx0IG1hc2sgZm9yIGZpbGUgY3JlYXRpb24gb24gYSB1bml4IHNlcnZlci4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyaWQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtMb2dpbiB1c2VyIGlkIHRvIHVzZSBvbiB0aGUgc3BlY2lmaWVkIHNlcnZlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgbG9naW4gdXNlciBpZCB0byB1c2Ugb24gdGhlIHNwZWNpZmllZCBzZXJ2ZXIuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyYm9zZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgdG8gdHJ1ZSB0byByZWNlaXZlIG5vdGlmaWNhdGlvbiBhYm91dCBlYWNoIGZpbGUgYXMgaXQgaXMKLSB0cmFuc2ZlcnJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRvIHRydWUgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gYWJvdXQgZWFjaCBmaWxlIGFzIGl0IGlzCi0gdHJhbnNmZXJyZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQSBzZXQgb2YgZmlsZXMgdG8gdXBsb2FkIG9yIGRvd25sb2FkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBIHNldCBvZiBmaWxlcyB0byB1cGxvYWQgb3IgZG93bmxvYWRdXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJnZW5rZXkiIGNhdGVnb3J5PSJqYXZhIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5HZW5lcmF0ZUtleSIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbR2VuZXJhdGVzIGEga2V5IGluIGEga2V5c3RvcmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0dlbmVyYXRlcyBhIGtleSBpbiBhIGtleXN0b3JlLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYWxpYXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgYWxpYXMgdG8gYWRkIHVuZGVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgYWxpYXMgdG8gYWRkIHVuZGVyLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGRpc3Rpbmd1aXNoZWQgbmFtZSBmb3IgZW50aXR5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgZGlzdGluZ3Vpc2hlZCBuYW1lIGZvciBlbnRpdHkuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ia2V5YWxnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG1ldGhvZCB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIG5hbWUtdmFsdWUgcGFpci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIG1ldGhvZCB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIG5hbWUtdmFsdWUgcGFpci4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJrZXlwYXNzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGFzc3dvcmQgZm9yIHByaXZhdGUga2V5IChpZiBkaWZmZXJlbnQpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBQYXNzd29yZCBmb3IgcHJpdmF0ZSBrZXkgKGlmIGRpZmZlcmVudCkuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ia2V5c2l6ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0luZGljYXRlcyB0aGUgc2l6ZSBvZiBrZXkgZ2VuZXJhdGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJbmRpY2F0ZXMgdGhlIHNpemUgb2Yga2V5IGdlbmVyYXRlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJrZXlzdG9yZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0tleXN0b3JlIGxvY2F0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBLZXlzdG9yZSBsb2NhdGlvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzaWdhbGciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgYWxnb3JpdGhtIHRvIHVzZSBpbiBzaWduaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgYWxnb3JpdGhtIHRvIHVzZSBpbiBzaWduaW5nLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InN0b3JlcGFzcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Bhc3N3b3JkIGZvciBrZXlzdG9yZSBpbnRlZ3JpdHkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFBhc3N3b3JkIGZvciBrZXlzdG9yZSBpbnRlZ3JpdHkuCi0gTXVzdCBiZSBhdCBsZWFzdCA2IGNoYXJhY3RlcnMgbG9uZy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdG9yZXR5cGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtLZXlzdG9yZSB0eXBlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBLZXlzdG9yZSB0eXBlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZhbGlkaXR5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSW5kaWNhdGVzIGhvdyBtYW55IGRheXMgY2VydGlmaWNhdGUgaXMgdmFsaWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEluZGljYXRlcyBob3cgbWFueSBkYXlzIGNlcnRpZmljYXRlIGlzIHZhbGlkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZlcmJvc2UiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgdmVyYm9zZSBvdXRwdXQgd2hlbiBzaWduaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCB2ZXJib3NlIG91dHB1dCB3aGVuIHNpZ25pbmcuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJkbmFtZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuR2VuZXJhdGVLZXkuRGlzdGluZ3Vpc2hlZE5hbWUiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Rpc3Rpbmd1aXNoZWQgbmFtZSBsaXN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtEaXN0aW5ndWlzaGVkIG5hbWUgbGlzdC5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJnZXQiIGNhdGVnb3J5PSJuZXR3b3JrIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5HZXQiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0dldHMgYSBwYXJ0aWN1bGFyIGZpbGUgZnJvbSBhIFVSTCBzb3VyY2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0dldHMgYSBwYXJ0aWN1bGFyIGZpbGUgZnJvbSBhIFVSTCBzb3VyY2UuCi0gT3B0aW9ucyBpbmNsdWRlIHZlcmJvc2UgcmVwb3J0aW5nLCB0aW1lc3RhbXAgYmFzZWQgZmV0Y2hlcyBhbmQgY29udHJvbGxpbmcKLSBhY3Rpb25zIG9uIGZhaWx1cmVzLiBOQjogYWNjZXNzIHRocm91Z2ggYSBmaXJld2FsbCBvbmx5IHdvcmtzIGlmIHRoZSB3aG9sZQotIEphdmEgcnVudGltZSBpcyBjb3JyZWN0bHkgY29uZmlndXJlZC5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3QiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGVyZSB0byBjb3B5IHRoZSBzb3VyY2UgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgV2hlcmUgdG8gY29weSB0aGUgc291cmNlIGZpbGUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWdub3JlZXJyb3JzIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGxvZyBlcnJvcnMgYnV0IGRvIG5vdCB0cmVhdCBhcyBmYXRhbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgbG9nIGVycm9ycyBidXQgZG8gbm90IHRyZWF0IGFzIGZhdGFsLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InBhc3N3b3JkIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGFzc3dvcmQgZm9yIHRoZSBiYXNpYyBhdXRoZW50aWNhdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgcGFzc3dvcmQgZm9yIHRoZSBiYXNpYyBhdXRoZW50aWNhdGlvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmMiIHR5cGU9ImphdmEubmV0LlVSTCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJVUkwiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1VSTCB0byBnZXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgVVJMIHRvIGdldC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2V0aW1lc3RhbXAiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgY29uZGl0aW9uYWxseSBkb3dubG9hZCBhIGZpbGUgYmFzZWQgb24gdGhlIHRpbWVzdGFtcAotIG9mIHRoZSBsb2NhbCBjb3B5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCBjb25kaXRpb25hbGx5IGRvd25sb2FkIGEgZmlsZSBiYXNlZCBvbiB0aGUgdGltZXN0YW1wCi0gb2YgdGhlIGxvY2FsIGNvcHkuCi0KLSA8cD5JbiB0aGlzIHNpdHVhdGlvbiwgdGhlIGlmLW1vZGlmaWVkLXNpbmNlIGhlYWRlciBpcyBzZXQgc28KLSB0aGF0IHRoZSBmaWxlIGlzIG9ubHkgZmV0Y2hlZCBpZiBpdCBpcyBuZXdlciB0aGFuIHRoZSBsb2NhbAotIGZpbGUgKG9yIHRoZXJlIGlzIG5vIGxvY2FsIGZpbGUpIFRoaXMgZmxhZyBpcyBvbmx5IHZhbGlkIG9uCi0gSFRUUCBjb25uZWN0aW9ucywgaXQgaXMgaWdub3JlZCBpbiBvdGhlciBjYXNlcy4gIFdoZW4gdGhlIGZsYWcKLSBpcyBzZXQsIHRoZSBsb2NhbCBjb3B5IG9mIHRoZSBkb3dubG9hZGVkIGZpbGUgd2lsbCBhbHNvIGhhdmUKLSBpdHMgdGltZXN0YW1wIHNldCB0byB0aGUgcmVtb3RlIGZpbGUgdGltZS48L3A+Ci0KLSA8cD5Ob3RlIHRoYXQgcmVtb3RlIGZpbGVzIG9mIGRhdGUgMS8xLzE5NzAgKEdNVCkgYXJlIHRyZWF0ZWQgYXMKLSAnbm8gdGltZXN0YW1wJywgYW5kIHdlYiBzZXJ2ZXJzIG9mdGVuIHNlcnZlIGZpbGVzIHdpdGggYQotIHRpbWVzdGFtcCBpbiB0aGUgZnV0dXJlIGJ5IHJlcGxhY2luZyB0aGVpciB0aW1lc3RhbXAgd2l0aCB0aGF0Ci0gb2YgdGhlIGN1cnJlbnQgdGltZS4gQWxzbywgaW50ZXItY29tcHV0ZXIgY2xvY2sgZGlmZmVyZW5jZXMgY2FuCi0gY2F1c2Ugbm8gZW5kIG9mIGdyaWVmLjwvcD4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VybmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1VzZXJuYW1lIGZvciBiYXNpYyBhdXRoLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBVc2VybmFtZSBmb3IgYmFzaWMgYXV0aC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJib3NlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHNob3cgdmVyYm9zZSBwcm9ncmVzcyBpbmZvcm1hdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgc2hvdyB2ZXJib3NlIHByb2dyZXNzIGluZm9ybWF0aW9uLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJndW56aXAiIGNhdGVnb3J5PSJwYWNrYWdpbmciCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkdVbnppcCIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRXhwYW5kcyBhIGZpbGUgdGhhdCBoYXMgYmVlbiBjb21wcmVzc2VkIHdpdGggdGhlIEdaSVAgYWxnb3JpdGhtLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtFeHBhbmRzIGEgZmlsZSB0aGF0IGhhcyBiZWVuIGNvbXByZXNzZWQgd2l0aCB0aGUgR1pJUAotIGFsZ29yaXRobS4gTm9ybWFsbHkgdXNlZCB0byBjb21wcmVzcyBub24tY29tcHJlc3NlZCBhcmNoaXZlcyBzdWNoCi0gYXMgVEFSIGZpbGVzLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdCIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBkZXN0aW5hdGlvbiBmaWxlIG9yIGRpcmVjdG9yeTsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBkZXN0aW5hdGlvbiBmaWxlIG9yIGRpcmVjdG9yeTsgb3B0aW9uYWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGZpbGUgdG8gZXhwYW5kOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGZpbGUgdG8gZXhwYW5kOyByZXF1aXJlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iZ3ppcCIgY2F0ZWdvcnk9InBhY2thZ2luZyIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuR1ppcCIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29tcHJlc3NlcyBhIGZpbGUgd2l0aCB0aGUgR1pJUCBhbGdvcml0aG0uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0NvbXByZXNzZXMgYSBmaWxlIHdpdGggdGhlIEdaSVAgYWxnb3JpdGhtLiBOb3JtYWxseSB1c2VkIHRvIGNvbXByZXNzCi0gbm9uLWNvbXByZXNzZWQgYXJjaGl2ZXMgc3VjaCBhcyBUQVIgZmlsZXMuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmMiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZmlsZSB0byBjb21wcmVzczsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIHRoZSBmaWxlIHRvIGNvbXByZXNzOyByZXF1aXJlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ6aXBmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHJlcXVpcmVkIGRlc3RpbmF0aW9uIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIHRoZSByZXF1aXJlZCBkZXN0aW5hdGlvbiBmaWxlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJpY29udHJhY3QiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuSUNvbnRyYWN0IgotICAgICAgbWF0Y2hpbmdUYXNrPSJ0cnVlIj4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSW5zdHJ1bWVudHMgSmF2YSBjbGFzc2VzIHdpdGggaUNvbnRyYWN0IERCQyBwcmVwcm9jZXNzb3IuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0luc3RydW1lbnRzIEphdmEgY2xhc3NlcyB3aXRoIGlDb250cmFjdCBEQkMgcHJlcHJvY2Vzc29yLgotIDxici8+Ci0gVGhlIHRhc2sgY2FuIGdlbmVyYXRlIGEgcHJvcGVydGllcyBmaWxlIGZvciA8YSBocmVmPSJodHRwOi8vaGplbS5zb2wubm8vaGVsbGVzb3kvaWNvbnRyb2wuaHRtbCI+aUNvbnRyb2w8L2E+LAotIGEgZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlIHRoYXQgbGV0cyB5b3UgdHVybiBvbi9vZmYgYXNzZXJ0aW9ucy4gaUNvbnRyb2wgZ2VuZXJhdGVzIGEgY29udHJvbCBmaWxlIHRoYXQgeW91IGNhbiByZWZlciB0bwotIGZyb20gdGhpcyB0YXNrIHVzaW5nIHRoZSBjb250cm9sZmlsZSBhdHRyaWJ1dGUuCi0gaUNvbnRyYWN0IGlzIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cucmVsaWFibGUtc3lzdGVtcy5jb20vdG9vbHMvIj5odHRwOi8vd3d3LnJlbGlhYmxlLXN5c3RlbXMuY29tL3Rvb2xzLzwvYT4KLSA8cC8+Ci0gVGhhbmtzIHRvIFJhaW5lciBTY2htaXR6IGZvciBlbmhhbmNlbWVudHMgYW5kIGNvbW1lbnRzLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYnVpbGRkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtCdWlsZCBkaXJlY3RvcnkgZm9yIGluc3RydW1lbnRlZCBjbGFzc2VzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBidWlsZCBkaXJlY3RvcnkgZm9yIGluc3RydW1lbnRlZCBjbGFzc2VzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3MgZGlyZWN0b3J5ICh1bmluc3RydW1lbnRlZCBjbGFzc2VzKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgY2xhc3MgZGlyZWN0b3J5ICh1bmluc3RydW1lbnRlZCBjbGFzc2VzKS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIGludm9jYXRpb24gb2YgaUNvbnRyYWN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgaW52b2NhdGlvbiBvZiBpQ29udHJhY3QuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRocmVmIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2UiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUmVmZXJlbmNlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgcmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoIGRlZmluZWQgZWxzZXdoZXJlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBBZGRzIGEgcmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoIGRlZmluZWQgZWxzZXdoZXJlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnRyb2xmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29udHJvbCBmaWxlIHRvIHBhc3MgdG8gaUNvbnRyYWN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBjb250cm9sIGZpbGUgdG8gcGFzcyB0byBpQ29udHJhY3QuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbHRocm93YWJsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Rocm93YWJsZSAoRXhjZXB0aW9uKSB0byBiZSB0aHJvd24gb24gYXNzZXJ0aW9uIHZpb2xhdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgVGhyb3dhYmxlIChFeGNlcHRpb24pIHRvIGJlIHRocm93biBvbiBhc3NlcnRpb24gdmlvbGF0aW9uLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Imluc3RydW1lbnRkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJbnN0cnVtZW50YXRpb24gZGlyZWN0b3J5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBpbnN0cnVtZW50YXRpb24gZGlyZWN0b3J5LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImludmFyaWFudCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUdXJucyBvbi9vZmYgaW52YXJpYW50IGluc3RydW1lbnRhdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVHVybnMgb24vb2ZmIGludmFyaWFudCBpbnN0cnVtZW50YXRpb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9zdCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUdXJucyBvbi9vZmYgcG9zdGNvbmRpdGlvbiBpbnN0cnVtZW50YXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFR1cm5zIG9uL29mZiBwb3N0Y29uZGl0aW9uIGluc3RydW1lbnRhdGlvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmUiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVHVybnMgb24vb2ZmIHByZWNvbmRpdGlvbiBpbnN0cnVtZW50YXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFR1cm5zIG9uL29mZiBwcmVjb25kaXRpb24gaW5zdHJ1bWVudGF0aW9uLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InF1aWV0IiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RlbGxzIGlDb250cmFjdCB0byBiZSBxdWlldC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGVsbHMgaUNvbnRyYWN0IHRvIGJlIHF1aWV0LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InJlcGJ1aWxkZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQnVpbGQgZGlyZWN0b3J5IGZvciBpbnN0cnVtZW50ZWQgY2xhc3Nlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgYnVpbGQgZGlyZWN0b3J5IGZvciBpbnN0cnVtZW50ZWQgY2xhc3Nlcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXBvc2l0b3J5ZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQnVpbGQgZGlyZWN0b3J5IGZvciByZXBvc2l0b3J5IGNsYXNzZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIGJ1aWxkIGRpcmVjdG9yeSBmb3IgcmVwb3NpdG9yeSBjbGFzc2VzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNyY2RpciIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NvdXJjZSBkaXJlY3RvcnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIHNvdXJjZSBkaXJlY3RvcnkuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0cyIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgb2YgdGhlIGZpbGUgd2hlcmUgdGFyZ2V0cyB3aWxsIGJlIHdyaXR0ZW4uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgd2hlcmUgdGFyZ2V0cyB3aWxsIGJlIHdyaXR0ZW4uIFRoYXQgaXMgdGhlCi0gZmlsZSB0aGF0IHRlbGxzIGlDb250cmFjdCB3aGF0IGZpbGVzIHRvIHByb2Nlc3MuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXBkYXRlaWNvbnRyb2wiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgdXBkYXRlcyBpQ29udHJvbCBwcm9wZXJ0aWVzIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIHVwZGF0ZXMgaUNvbnRyb2wgcHJvcGVydGllcyBmaWxlCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyYm9zaXR5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVmVyYm9zaXR5IGxldmVsIG9mIGlDb250cmFjdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgdmVyYm9zaXR5IGxldmVsIG9mIGlDb250cmFjdC4gQW55IGNvbWJpbmF0aW9uIG9mCi0gZXJyb3IqLHdhcm5pbmcqLG5vdGUqLGluZm8qLHByb2dyZXNzKixkZWJ1ZyogKGNvbW1hIHNlcGFyYXRlZCkgY2FuIGJlCi0gdXNlZC4gRGVmYXVsdHMgdG8gZXJyb3IqLHdhcm5pbmcqCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzc3BhdGguXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW1NldHMgdGhlIGNsYXNzcGF0aC5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJpbGFzbSIgY2F0ZWdvcnk9Im90aGVyIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kb3RuZXQuSWxhc20iCi0gICAgICBtYXRjaGluZ1Rhc2s9InRydWUiPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBc3NlbWJsZXMgLk5FVCBJbnRlcm1lZGlhdGUgTGFuZ3VhZ2UgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0Fzc2VtYmxlcyAuTkVUIEludGVybWVkaWF0ZSBMYW5ndWFnZSBmaWxlcy4gVGhlIHRhc2sgd2lsbCBvbmx5IHdvcmsKLSAgb24gd2luMksgdW50aWwgb3RoZXIgcGxhdGZvcm1zIHN1cHBvcnQgY3NjLmV4ZSBvciBhbiBlcXVpdmFsZW50LiBpbGFzbS5leGUKLSAgbXVzdCBiZSBvbiB0aGUgZXhlY3V0ZSBwYXRoIHRvby4gPHA+Ci0KLSAgPHA+Ci0KLSAgQWxsIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsOiAmbHQ7aWwvJmd0OyBzaG91bGQgc3VmZmljZSB0byBwcm9kdWNlIGEgZGVidWcKLSAgYnVpbGQgb2YgYWxsICouaWwgZmlsZXMuIFRoZSBvcHRpb24gc2V0IGlzIHJvdWdobHkgY29tcGF0aWJsZSB3aXRoIHRoZQotICBDU2hhcnAgY2xhc3M7IGV2ZW4gdGhvdWdoIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBhcmUgb25seSB2YWd1ZWx5Ci0gIGVxdWl2YWxlbnQuIFtUaGUgbG93IGxldmVsIGNvbW1hbmRzIHRha2UgdGhpbmdzIGxpa2UgL09VVD1maWxlLCBjc2Mgd2FudHMKLSAgL291dDpmaWxlIC4uLiAvdmVyYm9zZSBpcyB1c2VkIHNvbWUgcGxhY2VzOyAvcXVpZXQgaGVyZSBpbiBpbGRhc20uLi4gZXRjLl0KLSAgSXQgd291bGQgYmUgbmljZSBpZiBzb21lb25lIG1hZGUgYWxsIHRoZSBjb21tYW5kIGxpbmUgdG9vbHMgY29uc2lzdGVudCAoYW5kCi0gIG5vdCBhcyBicml0dGxlIGFzIHRoZSBqYXZhIGNtZGxpbmUgdG9vbHMpIDxwPgotCi0gIFRoZSB0YXNrIGlzIGEgZGlyZWN0b3J5IGJhc2VkIHRhc2ssIHNvIGF0dHJpYnV0ZXMgbGlrZSA8Yj5pbmNsdWRlcz0iKi5pbCIKLSAgPC9iPiBhbmQgPGI+ZXhjbHVkZXM9ImJyb2tlbi5pbCI8L2I+IGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGZpbGVzIHB1bGxlZAotICBpbi4gRWFjaCBmaWxlIGlzIGJ1aWx0IG9uIGl0cyBvd24sIHByb2R1Y2luZyBhbiBhcHByb3ByaWF0ZWx5IG5hbWVkIG91dHB1dAotICBmaWxlIHVubGVzcyBtYW51YWxseSBzcGVjaWZpZWQgd2l0aCA8Yj5vdXRmaWxlPC9iPl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVidWciIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVidWcgZmxhZyBvbiBvciBvZmYuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIHNldCB0aGUgZGVidWcgZmxhZyBvbiBvciBvZmYuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXh0cmFvcHRpb25zIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQW55IGV4dHJhIG9wdGlvbnMgd2hpY2ggYXJlIG5vdCBleHBsaWNpdGx5Ci0gc3VwcG9ydGVkIGJ5IHRoaXMgdGFzay5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgQW55IGV4dHJhIG9wdGlvbnMgd2hpY2ggYXJlIG5vdCBleHBsaWNpdGx5Ci0gc3VwcG9ydGVkIGJ5IHRoaXMgdGFzay4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBmYWlscyBpZiBpbGFzbSB0b29sIGZhaWxzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCBmYWlscyBpZiBpbGFzbSB0b29sIGZhaWxzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImtleWZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbmFtZSBvZiBhIGZpbGUgY29udGFpbmluZyBhIHByaXZhdGUga2V5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICB0aGUgbmFtZSBvZiBhIGZpbGUgY29udGFpbmluZyBhIHByaXZhdGUga2V5LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Imxpc3RpbmciIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgcHJvZHVjZSBhIGxpc3RpbmcgKG9mZiBieSBkZWZhdWx0KS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgcHJvZHVjZSBhIGxpc3RpbmcgKG9mZiBieSBkZWZhdWx0KS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdXRwdXRmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbT3V0cHV0IGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgb3V0cHV0IGZpbGUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVzb3VyY2VmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTmFtZSBvZiByZXNvdXJjZSBmaWxlIHRvIGluY2x1ZGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIG5hbWUgb2YgcmVzb3VyY2UgZmlsZSB0byBpbmNsdWRlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNyY2RpciIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NvdXJjZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZmlsZXMgdG8gYmUgY29tcGlsZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgc291cmNlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmaWxlcyB0byBiZSBjb21waWxlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXR0eXBlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVHlwZSBvZiB0YXJnZXQsIGVpdGhlciAiZXhlIiBvciAibGlicmFyeSIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIHR5cGUgb2YgdGFyZ2V0LCBlaXRoZXIgImV4ZSIgb3IgImxpYnJhcnkiLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZlcmJvc2UiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgZW5hYmxlIHZlcmJvc2UgSUxBU00gb3V0cHV0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCBlbmFibGUgdmVyYm9zZSBJTEFTTSBvdXRwdXQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9ImlucHV0IiBjYXRlZ29yeT0iY29udHJvbCIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSW5wdXQiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1JlYWRzIGFuIGlucHV0IGxpbmUgZnJvbSB0aGUgY29uc29sZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbUmVhZHMgYW4gaW5wdXQgbGluZSBmcm9tIHRoZSBjb25zb2xlLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYWRkcHJvcGVydHkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZWZpbmVzIHRoZSBuYW1lIG9mIGEgcHJvcGVydHkgdG8gYmUgY3JlYXRlZCBmcm9tIGlucHV0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBEZWZpbmVzIHRoZSBuYW1lIG9mIGEgcHJvcGVydHkgdG8gYmUgY3JlYXRlZCBmcm9tIGlucHV0LiBCZWhhdmlvdXIgaXMKLSBhY2NvcmRpbmcgdG8gcHJvcGVydHkgdGFzayB3aGljaCBtZWFucyB0aGF0IGV4aXN0aW5nIHByb3BlcnRpZXMKLSBjYW5ub3QgYmUgb3ZlcnJpZGVuLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtNZXNzYWdlIHdoaWNoIGdldHMgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGR1cmluZyB0aGUgYnVpbGQgcnVuLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBNZXNzYWdlIHdoaWNoIGdldHMgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGR1cmluZyB0aGUgYnVpbGQgcnVuLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZhbGlkYXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RlZmluZXMgdmFsaWQgaW5wdXQgcGFyYW1ldGVycyBhcyBjb21tYSBzZXBhcmF0ZWQgc3RyaW5ncy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgRGVmaW5lcyB2YWxpZCBpbnB1dCBwYXJhbWV0ZXJzIGFzIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmdzLiBJZiBzZXQsIGlucHV0Ci0gdGFzayB3aWxsIHJlamVjdCBhbnkgaW5wdXQgbm90IGRlZmluZWQgYXMgYWNjZXB0ZWQgYW5kIHJlcXVpcmVzIHRoZSB1c2VyCi0gdG8gcmVlbnRlciBpdC4gVmFsaWRhcmdzIGFyZSBjYXNlIHNlbnNpdGl2ZS4gSWYgeW91IHdhbnQgJ2EnIGFuZCAnQScgdG8KLSBiZSBhY2NlcHRlZCB5b3UgbmVlZCB0byBkZWZpbmUgYm90aCB2YWx1ZXMgYXMgYWNjZXB0ZWQgYXJndW1lbnRzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgICAgIDxib2R5ID4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCBhIG11bHRpbGluZSBtZXNzYWdlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9ib2R5PgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iaXBsYW5ldC1lamJjIiBjYXRlZ29yeT0iZWpiIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamIuSVBsYW5ldEVqYmNUYXNrIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDb21waWxlcyBFSkIgc3R1YnMgYW5kIHNrZWxldG9ucyBmb3IgdGhlIGlQbGFuZXQgQXBwbGljYXRpb24gU2VydmVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtDb21waWxlcyBFSkIgc3R1YnMgYW5kIHNrZWxldG9ucyBmb3IgdGhlIGlQbGFuZXQgQXBwbGljYXRpb24gU2VydmVyLgotIFRoZSBFSkJzIHRvIGJlIHByb2Nlc3NlZCBhcmUgc3BlY2lmaWVkIGJ5IHRoZSBFSkIgMS4xIHN0YW5kYXJkIFhNTAotIGRlc2NyaXB0b3IsIGFuZCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgYXJlIG9idGFpbmVkIGZyb20gdGhlIGlQbGFuZXQgQXBwbGljYXRpb24KLSBTZXJ2ZXItc3BlY2lmaWMgWE1MIGRlc2NyaXB0b3IuICBTaW5jZSB0aGUgWE1MIGRlc2NyaXB0b3JzIGNhbiBpbmNsdWRlCi0gbXVsdGlwbGUgRUpCcywgdGhpcyBpcyBhIGNvbnZlbmllbnQgd2F5IG9mIHNwZWNpZnlpbmcgbWFueSBFSkJzIGluIGEgc2luZ2xlCi0gQW50IHRhc2suICBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGFsbG93ZWQ6Ci0gICA8dWw+Ci0gICAgIDxsaT48aT5lamJkZXNjcmlwdG9yPC9pPiAtLSBTdGFuZGFyZCBFSkIgMS4xIFhNTCBkZXNjcmlwdG9yICh0eXBpY2FsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlZCAiZWpiLWphci54bWwiKS4gIFRoaXMgYXR0cmlidXRlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZC4KLSAgICAgPGxpPjxpPmlhc2Rlc2NyaXB0b3I8L2k+IC0tIEVKQiBYTUwgZGVzY3JpcHRvciBmb3IgaVBsYW5ldCBBcHBsaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmVyICh0eXBpY2FsbHkgdGl0bGVkICJpYXMtZWpiLWphci54bWwpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQuCi0gICAgIDxsaT48aT5kZXN0PC9pPiAtLSBUaGUgaXMgdGhlIGJhc2UgZGlyZWN0b3J5IHdoZXJlIHRoZSBSTUkgc3R1YnMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBza2VsZXRvbnMgYXJlIHdyaXR0ZW4uICBJbiBhZGRpdGlvbiwgdGhlIGNsYXNzIGZpbGVzCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgZWFjaCBiZWFuIChob21lIGludGVyZmFjZSwgcmVtb3RlIGludGVyZmFjZSwgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBFSkIgaW1wbGVtZW50YXRpb24pIG11c3QgYmUgZm91bmQgaW4gdGhpcyBkaXJlY3RvcnkuCi0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBpcyByZXF1aXJlZC4KLSAgICAgPGxpPjxpPmNsYXNzcGF0aDwvaT4gLS0gVGhlIGNsYXNzcGF0aCB1c2VkIHdoZW4gZ2VuZXJhdGluZyBFSkIgc3R1YnMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrZWxldG9ucy4gIFRoaXMgaXMgYW4gb3B0aW9uYWwgYXR0cmlidXRlIChpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbWl0dGVkLCB0aGUgY2xhc3NwYXRoIHNwZWNpZmllZCB3aGVuIEFudCB3YXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZCB3aWxsIGJlIHVzZWQpLiAgTmVzdGVkICJjbGFzc3BhdGgiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIG1heSBhbHNvIGJlIHVzZWQuCi0gICAgIDxsaT48aT5rZWVwZ2VuZXJhdGVkPC9pPiAtLSBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIEphdmEgc291cmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlcyB3aGljaCBhcmUgZ2VuZXJhdGVkIGJ5IGVqYmMgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWQgb3IgYXV0b21hdGljYWxseSBkZWxldGVkLiAgSWYgInllcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc291cmNlIGZpbGVzIHdpbGwgYmUgcmV0YWluZWQuICBUaGlzIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBhdHRyaWJ1dGUgKGlmIG9taXR0ZWQsIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0cyB0byAibm8iKS4KLSAgICAgPGxpPjxpPmRlYnVnPC9pPiAtLSBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGVqYmMgdXRpbGl0eSBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICBsb2cgYWRkaXRpb25hbCBkZWJ1Z2dpbmcgc3RhdGVtZW50cyB0byB0aGUgc3RhbmRhcmQKLSAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuICBJZiAieWVzIiwgdGhlIGFkZGl0aW9uYWwgZGVidWdnaW5nIHN0YXRlbWVudHMKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGdlbmVyYXRlZCAoaWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gIm5vIikuCi0gICAgIDxsaT48aT5pYXNob21lPC9pPiAtLSBNYXkgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSAiaG9tZSIgZGlyZWN0b3J5IGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpUGxhbmV0IEFwcGxpY2F0aW9uIFNlcnZlciBpbnN0YWxsYXRpb24uICBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB1c2VkIHRvIGZpbmQgdGhlIGVqYmMgdXRpbGl0eSBpZiBpdCBpc24ndAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWQgaW4gdGhlIHVzZXIncyBzeXN0ZW0gcGF0aC4gIFRoaXMgaXMgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGF0dHJpYnV0ZSAoaWYgc3BlY2lmaWVkLCBpdCBzaG91bGQgcmVmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSA8Y29kZT5baW5zdGFsbC1sb2NhdGlvbl0vaXBsYW5ldC9pYXM2L2lhcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb2RlPiBkaXJlY3RvcnkpLiAgSWYgb21pdHRlZCwgdGhlIGVqYmMgdXRpbGl0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBvbiB0aGUgdXNlcidzIHN5c3RlbSBwYXRoLgotICAgPC91bD4KLSA8cD4KLSBGb3IgZWFjaCBFSkIgc3BlY2lmaWVkLCB0aGlzIHRhc2sgd2lsbCBsb2NhdGUgdGhlIHRocmVlIGNsYXNzZXMgdGhhdCBjb21wcmlzZQotIHRoZSBFSkIuICBJZiB0aGVzZSBjbGFzcyBmaWxlcyBjYW5ub3QgYmUgbG9jYXRlZCBpbiB0aGUgPGNvZGU+ZGVzdDwvY29kZT4KLSBkaXJlY3RvcnksIHRoZSB0YXNrIHdpbGwgZmFpbC4gIFRoZSB0YXNrIHdpbGwgYWxzbyBhdHRlbXB0IHRvIGxvY2F0ZSB0aGUgRUpCCi0gc3R1YnMgYW5kIHNrZWxldG9ucyBpbiB0aGlzIGRpcmVjdG9yeS4gIElmIGZvdW5kLCB0aGUgdGltZXN0YW1wcyBvbiB0aGUKLSBzdHVicyBhbmQgc2tlbGV0b25zIHdpbGwgYmUgY2hlY2tlZCB0byBlbnN1cmUgdGhleSBhcmUgdXAgdG8gZGF0ZS4gIE9ubHkgaWYKLSB0aGVzZSBmaWxlcyBjYW5ub3QgYmUgZm91bmQgb3IgaWYgdGhleSBhcmUgb3V0IG9mIGRhdGUgd2lsbCBlamJjIGJlIGNhbGxlZAotIHRvIGdlbmVyYXRlIG5ldyBzdHVicyBhbmQgc2tlbGV0b25zLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NsYXNzcGF0aCB0byBiZSB1c2VkIHdoZW4gY29tcGlsaW5nIHRoZSBFSkIgc3R1YnMgYW5kIHNrZWxldG9ucy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBjb21waWxpbmcgdGhlIEVKQiBzdHVicyBhbmQgc2tlbGV0b25zLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlYnVnIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGRlYnVnZ2luZyBvdXRwdXQgd2lsbCBiZSBnZW5lcmF0ZWQgd2hlbiBlamJjIGlzCi0gZXhlY3V0ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGRlYnVnZ2luZyBvdXRwdXQgd2lsbCBiZSBnZW5lcmF0ZWQgd2hlbiBlamJjIGlzCi0gZXhlY3V0ZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdCIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Rlc3RpbmF0aW9uIGRpcmVjdG9yeSB3aGVyZSB0aGUgRUpCIHNvdXJjZSBjbGFzc2VzIG11c3QgZXhpc3QKLSBhbmQgd2hlcmUgdGhlIHN0dWJzIGFuZCBza2VsZXRvbnMgd2lsbCBiZSB3cml0dGVuLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3Rvcnkgd2hlcmUgdGhlIEVKQiBzb3VyY2UgY2xhc3NlcyBtdXN0IGV4aXN0Ci0gYW5kIHdoZXJlIHRoZSBzdHVicyBhbmQgc2tlbGV0b25zIHdpbGwgYmUgd3JpdHRlbi4gIFRoZSBkZXN0aW5hdGlvbgotIGRpcmVjdG9yeSBtdXN0IGV4aXN0IGJlZm9yZSB0aGlzIHRhc2sgaXMgZXhlY3V0ZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZWpiZGVzY3JpcHRvciIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xvY2F0aW9uIG9mIHRoZSBzdGFuZGFyZCBYTUwgRUpCIGRlc2NyaXB0b3IuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBzdGFuZGFyZCBYTUwgRUpCIGRlc2NyaXB0b3IuICBUeXBpY2FsbHksIHRoaXMKLSBmaWxlIGlzIG5hbWVkICJlamItamFyLnhtbCIuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWFzZGVzY3JpcHRvciIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xvY2F0aW9uIG9mIHRoZSBpQVMtc3BlY2lmaWMgWE1MIEVKQiBkZXNjcmlwdG9yLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgaUFTLXNwZWNpZmljIFhNTCBFSkIgZGVzY3JpcHRvci4gIFR5cGljYWxseSwKLSB0aGlzIGZpbGUgaXMgbmFtZWQgImlhcy1lamItamFyLnhtbCIuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWFzaG9tZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW01heSBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlICJob21lIiBkaXJlY3RvcnkgZm9yIHRoaXMgaUFTIGluc3RhbGxhdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgTWF5IGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgImhvbWUiIGRpcmVjdG9yeSBmb3IgdGhpcyBpQVMgaW5zdGFsbGF0aW9uLgotIFRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIHNob3VsZCB0eXBpY2FsbHkgYmUKLSA8Y29kZT5baW5zdGFsbC1sb2NhdGlvbl0vaXBsYW5ldC9pYXM2L2lhczwvY29kZT4uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ia2VlcGdlbmVyYXRlZCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCB0aGUgSmF2YSBzb3VyY2UgZmlsZXMgd2hpY2ggYXJlIGdlbmVyYXRlZCBieSBlamJjIHdpbGwgYmUgc2F2ZWQgLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCB0aGUgSmF2YSBzb3VyY2UgZmlsZXMgd2hpY2ggYXJlIGdlbmVyYXRlZCBieSBlamJjIHdpbGwgYmUgc2F2ZWQgLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyB0byB0aGUgY2xhc3NwYXRoIHVzZWQgd2hlbiBjb21waWxpbmcgdGhlIEVKQiBzdHVicyBhbmQgc2tlbGV0b25zLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIHRvIHRoZSBjbGFzc3BhdGggdXNlZCB3aGVuIGNvbXBpbGluZyB0aGUgRUpCIHN0dWJzIGFuZCBza2VsZXRvbnMuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iamFyIiBjYXRlZ29yeT0icGFja2FnaW5nIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXIiCi0gICAgICBtYXRjaGluZ1Rhc2s9InRydWUiPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGVzIGEgSkFSIGFyY2hpdmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0NyZWF0ZXMgYSBKQVIgYXJjaGl2ZS5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImJhc2VkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3RvcnkgZnJvbSB3aGljaCB0byBhcmNoaXZlIGZpbGVzOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgRGlyZWN0b3J5IGZyb20gd2hpY2ggdG8gYXJjaGl2ZSBmaWxlczsgb3B0aW9uYWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tcHJlc3MiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciB3ZSB3YW50IHRvIGNvbXByZXNzIHRoZSBmaWxlcyBvciBvbmx5IHN0b3JlIHRoZW07Ci0gb3B0aW9uYWwsIGRlZmF1bHQ9dHJ1ZTsuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFdoZXRoZXIgd2Ugd2FudCB0byBjb21wcmVzcyB0aGUgZmlsZXMgb3Igb25seSBzdG9yZSB0aGVtOwotIG9wdGlvbmFsLCBkZWZhdWx0PXRydWU7Ci0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdGZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZmlsZSB0byBjcmVhdGU7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgZmlsZSB0byBjcmVhdGU7IHJlcXVpcmVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImR1cGxpY2F0ZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuWmlwLkR1cGxpY2F0ZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDthZGQmcXVvdDssICZxdW90O3ByZXNlcnZlJnF1b3Q7LCAmcXVvdDtmYWlsJnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIGJlaGF2aW9yIGZvciB3aGVuIGEgZHVwbGljYXRlIGZpbGUgaXMgYWJvdXQgdG8gYmUgYWRkZWQgLQotIG9uZSBvZiA8Y29kZT5rZWVwPC9jb2RlPiwgPGNvZGU+c2tpcDwvY29kZT4gb3IgPGNvZGU+b3ZlcndyaXRlPC9jb2RlPi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyBiZWhhdmlvciBmb3Igd2hlbiBhIGR1cGxpY2F0ZSBmaWxlIGlzIGFib3V0IHRvIGJlIGFkZGVkIC0KLSBvbmUgb2YgPGNvZGU+a2VlcDwvY29kZT4sIDxjb2RlPnNraXA8L2NvZGU+IG9yIDxjb2RlPm92ZXJ3cml0ZTwvY29kZT4uCi0gUG9zc2libGUgdmFsdWVzIGFyZTogPGNvZGU+a2VlcDwvY29kZT4gKGtlZXAgYm90aAotIG9mIHRoZSBmaWxlcyk7IDxjb2RlPnNraXA8L2NvZGU+IChrZWVwIHRoZSBmaXJzdCB2ZXJzaW9uCi0gb2YgdGhlIGZpbGUgZm91bmQpOyA8Y29kZT5vdmVyd3JpdGU8L2NvZGU+IG92ZXJ3cml0ZSB0aGUgZmlsZQotIHdpdGggdGhlIG5ldyBmaWxlCi0gRGVmYXVsdCBmb3IgemlwIHRhc2tzIGlzIDxjb2RlPmtlZXA8L2NvZGU+Ci0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW5jb2RpbmciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lcywgZGVmYXVsdHMgdG8gdGhlIHBsYXRmb3JtJ3MKLSBkZWZhdWx0IGVuY29kaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBFbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lcywgZGVmYXVsdHMgdG8gdGhlIHBsYXRmb3JtJ3MKLSBkZWZhdWx0IGVuY29kaW5nLgotCi0gPHA+Rm9yIGEgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMgc2VlIDxhCi0gaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qZGsvMS4yL2RvY3MvZ3VpZGUvaW50ZXJuYXQvZW5jb2RpbmcuZG9jLmh0bWwiPmh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrLzEuMi9kb2NzL2d1aWRlL2ludGVybmF0L2VuY29kaW5nLmRvYy5odG1sPC9hPi48L3A+Ci0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZXNvbmx5IiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGVtdWxhdGUgU3VuJ3MgamFyIHV0aWxpdHkgYnkgbm90IGFkZGluZyBwYXJlbnQgZGlyZWN0b3JpZXM7Ci0gb3B0aW9uYWwsIGRlZmF1bHRzIHRvIGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCBlbXVsYXRlIFN1bidzIGphciB1dGlsaXR5IGJ5IG5vdCBhZGRpbmcgcGFyZW50IGRpcmVjdG9yaWVzOwotIG9wdGlvbmFsLCBkZWZhdWx0cyB0byBmYWxzZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmRleCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgd2hldGhlciBvciBub3QgdG8gY3JlYXRlIGFuIGluZGV4IGxpc3QgZm9yIGNsYXNzZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB3aGV0aGVyIG9yIG5vdCB0byBjcmVhdGUgYW4gaW5kZXggbGlzdCBmb3IgY2xhc3Nlcy4KLSBUaGlzIG1heSBzcGVlZCB1cCBjbGFzc2xvYWRpbmcgaW4gc29tZSBjYXNlcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYW5pZmVzdCIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBtYW5pZmVzdCBmaWxlIHRvIHVzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIG1hbmlmZXN0IGZpbGUgdG8gdXNlLiBUaGlzIGNhbiBiZSBlaXRoZXIgdGhlIGxvY2F0aW9uIG9mIGEgbWFuaWZlc3QsCi0gb3IgdGhlIG5hbWUgb2YgYSBqYXIgYWRkZWQgdGhyb3VnaCBhIGZpbGVzZXQuIElmIGl0cyB0aGUgbmFtZSBvZiBhbiBhZGRlZAotIGphciwgdGhlIHRhc2sgZXhwZWN0cyB0aGUgbWFuaWZlc3QgdG8gYmUgaW4gdGhlIGphciBhdCBNRVRBLUlORi9NQU5JRkVTVC5NRi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGUiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgdXBkYXRlcyBhbiBleGlzdGluZyBmaWxlLCBvdGhlcndpc2Ugb3ZlcndyaXRlCi0gYW55IGV4aXN0aW5nIG9uZTsgb3B0aW9uYWwgZGVmYXVsdHMgdG8gZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIHVwZGF0ZXMgYW4gZXhpc3RpbmcgZmlsZSwgb3RoZXJ3aXNlIG92ZXJ3cml0ZQotIGFueSBleGlzdGluZyBvbmU7IG9wdGlvbmFsIGRlZmF1bHRzIHRvIGZhbHNlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9IndoZW5lbXB0eSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuWmlwLldoZW5FbXB0eSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDtmYWlsJnF1b3Q7LCAmcXVvdDtza2lwJnF1b3Q7LCAmcXVvdDtjcmVhdGUmcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgYmVoYXZpb3Igb2YgdGhlIHRhc2sgd2hlbiBubyBmaWxlcyBtYXRjaC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyBiZWhhdmlvciBvZiB0aGUgdGFzayB3aGVuIG5vIGZpbGVzIG1hdGNoLgotIFBvc3NpYmxlIHZhbHVlcyBhcmU6IDxjb2RlPmZhaWw8L2NvZGU+ICh0aHJvdyBhbiBleGNlcHRpb24KLSBhbmQgaGFsdCB0aGUgYnVpbGQpOyA8Y29kZT5za2lwPC9jb2RlPiAoZG8gbm90IGNyZWF0ZQotIGFueSBhcmNoaXZlLCBidXQgaXNzdWUgYSB3YXJuaW5nKTsgPGNvZGU+Y3JlYXRlPC9jb2RlPgotIChtYWtlIGFuIGFyY2hpdmUgd2l0aCBubyBlbnRyaWVzKS4KLSBEZWZhdWx0IGZvciB6aXAgdGFza3MgaXMgPGNvZGU+c2tpcDwvY29kZT47Ci0gZm9yIGphciB0YXNrcywgPGNvZGU+Y3JlYXRlPC9jb2RlPi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9Im1hbmlmZXN0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5NYW5pZmVzdCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWxsb3dzIHRoZSBtYW5pZmVzdCBmb3IgdGhlIGFyY2hpdmUgZmlsZSB0byBiZSBwcm92aWRlZCBpbmxpbmUKLSBpbiB0aGUgYnVpbGRmaWxlIHJhdGhlciB0aGFuIGluIGFuIGV4dGVybmFsIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FsbG93cyB0aGUgbWFuaWZlc3QgZm9yIHRoZSBhcmNoaXZlIGZpbGUgdG8gYmUgcHJvdmlkZWQgaW5saW5lCi0gaW4gdGhlIGJ1aWxkZmlsZSByYXRoZXIgdGhhbiBpbiBhbiBleHRlcm5hbCBmaWxlLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcy5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0ibWV0YWluZiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWmlwRmlsZVNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iWmlwRmlsZXNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSB6aXBmaWxlc2V0IHRvIGluY2x1ZGUgaW4gdGhlIE1FVEEtSU5GIGRpcmVjdG9yeS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHppcGZpbGVzZXQgdG8gaW5jbHVkZSBpbiB0aGUgTUVUQS1JTkYgZGlyZWN0b3J5Ll1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJ6aXBncm91cGZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGVzZXQiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgZ3JvdXAgb2YgemlwIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgZ3JvdXAgb2YgemlwIGZpbGVzLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJ6aXBmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5aaXBGaWxlU2V0IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJaaXBGaWxlc2V0IgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyB0aGF0IGNhbiBiZQotIHJlYWQgZnJvbSBhbiBhcmNoaXZlIGFuZCBiZSBnaXZlbiBhIHByZWZpeC9mdWxscGF0aC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyB0aGF0IGNhbiBiZQotIHJlYWQgZnJvbSBhbiBhcmNoaXZlIGFuZCBiZSBnaXZlbiBhIHByZWZpeC9mdWxscGF0aC5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJqYXJsaWItYXZhaWxhYmxlIiBjYXRlZ29yeT0ib3RoZXIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbi5KYXJMaWJBdmFpbGFibGVUYXNrIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDaGVja3Mgd2hldGhlciBhbiBleHRlbnNpb24gaXMgcHJlc2VudCBpbiBhIGZpbGVzZXQgb3IgYW4gZXh0ZW5zaW9uU2V0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtDaGVja3Mgd2hldGhlciBhbiBleHRlbnNpb24gaXMgcHJlc2VudCBpbiBhIGZpbGVzZXQgb3IgYW4gZXh0ZW5zaW9uU2V0Ll1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBKQVIgbGlicmFyeSB0byBjaGVjay5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIEpBUiBsaWJyYXJ5IHRvIGNoZWNrLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InByb3BlcnR5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG5hbWUgb2YgcHJvcGVydHkgdG8gc2V0IGlmIGV4dGVuc2lvbnMgYXJlIGF2YWlsYWJsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIG5hbWUgb2YgcHJvcGVydHkgdG8gc2V0IGlmIGV4dGVuc2lvbnMgYXJlIGF2YWlsYWJsZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uLkV4dGVuc2lvbkFkYXB0ZXIiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0V4dGVuc2lvbiBsb29raW5nIGZvci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbU2V0IHRoZSBFeHRlbnNpb24gbG9va2luZyBmb3IuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbnNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uLkV4dGVuc2lvblNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBleHRlbnNpb25zIHRvIHNlYXJjaCBpbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBleHRlbnNpb25zIHRvIHNlYXJjaCBpbi5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJqYXJsaWItZGlzcGxheSIgY2F0ZWdvcnk9Im90aGVyIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5leHRlbnNpb24uSmFyTGliRGlzcGxheVRhc2siCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Rpc3BsYXlzIHRoZSAiT3B0aW9uYWwgUGFja2FnZSIgYW5kICJQYWNrYWdlIFNwZWNpZmljYXRpb24iIGluZm9ybWF0aW9uIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHNwZWNpZmllZCBKQVJzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtEaXNwbGF5cyB0aGUgIk9wdGlvbmFsIFBhY2thZ2UiIGFuZCAiUGFja2FnZSBTcGVjaWZpY2F0aW9uIiBpbmZvcm1hdGlvbgotIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHNwZWNpZmllZCBKQVJzLgotCi0gPHA+UHJpb3IgdG8gSkRLMS4zLCBhbiAiT3B0aW9uYWwgUGFja2FnZSIgd2FzIGtub3duIGFzIGFuIEV4dGVuc2lvbi4KLSBUaGUgc3BlY2lmaWNhdGlvbiBmb3IgdGhpcyBtZWNoYW5pc20gaXMgYXZhaWxhYmxlIGluIHRoZSBKREsxLjMKLSBkb2N1bWVudGF0aW9uIGluIHRoZSBkaXJlY3RvcnkKLSAkSkRLX0hPTUUvZG9jcy9ndWlkZS9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbC4gQWx0ZXJuYXRpdmVseSBpdCBpcwotIGF2YWlsYWJsZSBvbmxpbmUgYXQgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sIj4KLSBodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWw8L2E+LjwvcD5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgSkFSIGxpYnJhcnkgdG8gZGlzcGxheSBpbmZvcm1hdGlvbiBmb3IuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBKQVIgbGlicmFyeSB0byBkaXNwbGF5IGluZm9ybWF0aW9uIGZvci4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGVzZXQiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgc2V0IG9mIGZpbGVzIGFib3V0IHdoaWNoIGxpYnJhcnkgZGF0YSB3aWxsIGJlIGRpc3BsYXllZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyBhYm91dCB3aGljaCBsaWJyYXJ5IGRhdGEgd2lsbCBiZSBkaXNwbGF5ZWQuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iamFybGliLW1hbmlmZXN0IiBjYXRlZ29yeT0ib3RoZXIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbi5KYXJMaWJNYW5pZmVzdFRhc2siCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0dlbmVyYXRlcyBhIG1hbmlmZXN0IHRoYXQgZGVjbGFyZXMgYWxsIHRoZSBkZXBlbmRlbmNpZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0dlbmVyYXRlcyBhIG1hbmlmZXN0IHRoYXQgZGVjbGFyZXMgYWxsIHRoZSBkZXBlbmRlbmNpZXMuCi0gVGhlIGRlcGVuZGVuY2llcyBhcmUgZGV0ZXJtaW5lZCBieSBsb29raW5nIGluIHRoZQotIHNwZWNpZmllZCBwYXRoIGFuZCBzZWFyY2hpbmcgZm9yIEV4dGVuc2lvbiAvICJPcHRpb25hbCBQYWNrYWdlIgotIHNwZWNpZmljYXRpb25zIGluIHRoZSBtYW5pZmVzdHMgb2YgdGhlIGphcnMuCi0KLSA8cD5QcmlvciB0byBKREsxLjMsIGFuICJPcHRpb25hbCBQYWNrYWdlIiB3YXMga25vd24gYXMgYW4gRXh0ZW5zaW9uLgotIFRoZSBzcGVjaWZpY2F0aW9uIGZvciB0aGlzIG1lY2hhbmlzbSBpcyBhdmFpbGFibGUgaW4gdGhlIEpESzEuMwotIGRvY3VtZW50YXRpb24gaW4gdGhlIGRpcmVjdG9yeQotICRKREtfSE9NRS9kb2NzL2d1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sLiBBbHRlcm5hdGl2ZWx5IGl0IGlzCi0gYXZhaWxhYmxlIG9ubGluZSBhdCA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWwiPgotIGh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy9ndWlkZS9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbDwvYT4uPC9wPl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdGZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbG9jYXRpb24gd2hlcmUgZ2VuZXJhdGVkIG1hbmlmZXN0IGlzIHBsYWNlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGxvY2F0aW9uIHdoZXJlIGdlbmVyYXRlZCBtYW5pZmVzdCBpcyBwbGFjZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbi5FeHRyYUF0dHJpYnV0ZSIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhbiBhdHRyaWJ1dGUgdGhhdCBpcyB0byBiZSBwdXQgaW4gbWFpbiBzZWN0aW9uIG9mIG1hbmlmZXN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGFuIGF0dHJpYnV0ZSB0aGF0IGlzIHRvIGJlIHB1dCBpbiBtYWluIHNlY3Rpb24gb2YgbWFuaWZlc3QuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImRlcGVuZHMiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbi5FeHRlbnNpb25TZXQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZXh0ZW5zaW9ucyB0aGF0IHRoaXMgbGlicmFyeSByZXF1aXJlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBleHRlbnNpb25zIHRoYXQgdGhpcyBsaWJyYXJ5IHJlcXVpcmVzLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbi5FeHRlbnNpb25BZGFwdGVyIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGFuIGV4dGVuc2lvbiB0aGF0IHRoaXMgbGlicmFyeSBpbXBsZW1lbnRzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGFuIGV4dGVuc2lvbiB0aGF0IHRoaXMgbGlicmFyeSBpbXBsZW1lbnRzLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJvcHRpb25zIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5leHRlbnNpb24uRXh0ZW5zaW9uU2V0IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgc2V0IG9mIGV4dGVuc2lvbnMgdGhhdCB0aGlzIGxpYnJhcnkgb3B0aW9uYWxseSByZXF1aXJlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBleHRlbnNpb25zIHRoYXQgdGhpcyBsaWJyYXJ5IG9wdGlvbmFsbHkgcmVxdWlyZXMuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iamFybGliLXJlc29sdmUiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uLkphckxpYlJlc29sdmVUYXNrIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUcmllcyB0byBsb2NhdGUgYSBKQVIgdG8gc2F0aXNmeSBhbiBleHRlbnNpb24gYW5kIHBsYWNlIGxvY2F0aW9uIG9mIEpBUiBpbnRvIHByb3BlcnR5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtUcmllcyB0byBsb2NhdGUgYSBKQVIgdG8gc2F0aXNmeSBhbiBleHRlbnNpb24gYW5kIHBsYWNlCi0gbG9jYXRpb24gb2YgSkFSIGludG8gcHJvcGVydHkuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjaGVja2V4dGVuc2lvbiIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBsaWJyYXJpZXMgcmV0dXJuZWQgYnkgbmVzdGVkIHJlc29sdmVycyBzaG91bGQgYmUKLSBjaGVja2VkIHRvIHNlZSBpZiB0aGV5IHN1cHBseSBleHRlbnNpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGxpYnJhcmllcyByZXR1cm5lZCBieSBuZXN0ZWQgcmVzb2x2ZXJzIHNob3VsZCBiZQotIGNoZWNrZWQgdG8gc2VlIGlmIHRoZXkgc3VwcGx5IGV4dGVuc2lvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBmYWlsdXJlIHRvIGxvY2F0ZSBsaWJyYXJ5IHNob3VsZCBmYWlsIGJ1aWxkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCBmYWlsdXJlIHRvIGxvY2F0ZSBsaWJyYXJ5IHNob3VsZCBmYWlsIGJ1aWxkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InByb3BlcnR5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGluIHdoaWNoIHRoZSBsb2NhdGlvbiBvZgotIGxpYnJhcnkgaXMgc3RvcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgaW4gd2hpY2ggdGhlIGxvY2F0aW9uIG9mCi0gbGlicmFyeSBpcyBzdG9yZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJhbnQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbi5yZXNvbHZlcnMuQW50UmVzb2x2ZXIiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgQW50IHJlc29sdmVyIHRvIHJ1biBhbiBBbnQgYnVpbGRmaWxlIHRvIGdlbmVyYXRlIGEgbGlicmFyeS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBBbnQgcmVzb2x2ZXIgdG8gcnVuIGFuIEFudCBidWlsZGZpbGUgdG8gZ2VuZXJhdGUgYSBsaWJyYXJ5Ll1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbi5FeHRlbnNpb25BZGFwdGVyIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFeHRlbnNpb24gbG9va2luZyBmb3IuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW1NldCB0aGUgRXh0ZW5zaW9uIGxvb2tpbmcgZm9yLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJsb2NhdGlvbiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uLnJlc29sdmVycy5Mb2NhdGlvblJlc29sdmVyIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGxvY2F0aW9uIHJlc29sdmVyIHRvIGxvb2sgZm9yIGEgbGlicmFyeSBpbiBhIGxvY2F0aW9uCi0gcmVsYXRpdmUgdG8gcHJvamVjdCBkaXJlY3RvcnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgbG9jYXRpb24gcmVzb2x2ZXIgdG8gbG9vayBmb3IgYSBsaWJyYXJ5IGluIGEgbG9jYXRpb24KLSByZWxhdGl2ZSB0byBwcm9qZWN0IGRpcmVjdG9yeS5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0idXJsIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5leHRlbnNpb24ucmVzb2x2ZXJzLlVSTFJlc29sdmVyIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgVVJMIHJlc29sdmVyIHRvIGRvd25sb2FkIGEgbGlicmFyeSBmcm9tIGEgVVJMCi0gdG8gYSBsb2NhbCBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgVVJMIHJlc29sdmVyIHRvIGRvd25sb2FkIGEgbGlicmFyeSBmcm9tIGEgVVJMCi0gdG8gYSBsb2NhbCBmaWxlLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9ImphdmEiIGNhdGVnb3J5PSJqYXZhIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtMYXVuY2hlciBmb3IgSmF2YSBhcHBsaWNhdGlvbnMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0xhdW5jaGVyIGZvciBKYXZhIGFwcGxpY2F0aW9ucy4gQWxsb3dzIHVzZSBvZgotIHRoZSBzYW1lIEpWTSBmb3IgdGhlIGNhbGxlZCBhcHBsaWNhdGlvbiB0aHVzIHJlc3VsdGluZyBpbiBtdWNoCi0gZmFzdGVyIG9wZXJhdGlvbi5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImFwcGVuZCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBhcHBlbmQgb3V0cHV0IHRvIGV4aXN0aW5nIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGFwcGVuZCBvdXRwdXQgdG8gZXhpc3RpbmcgZmlsZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc25hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtKYXZhIGNsYXNzIHRvIGV4ZWN1dGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIEphdmEgY2xhc3MgdG8gZXhlY3V0ZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBydW5uaW5nIHRoZSBKYXZhIGNsYXNzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIHdoZW4gcnVubmluZyB0aGUgSmF2YSBjbGFzcwotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aHJlZiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlJlZmVyZW5jZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3NwYXRoIHRvIHVzZSwgYnkgcmVmZXJlbmNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBDbGFzc3BhdGggdG8gdXNlLCBieSByZWZlcmVuY2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHRoZSBwcm9jZXNzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIHByb2Nlc3MKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCB0aGVuIGZhaWwgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBhCi0gcmV0dXJuY29kZSBvdGhlciB0aGFuIDAuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIHRoZW4gZmFpbCBpZiB0aGUgY29tbWFuZCBleGl0cyB3aXRoIGEKLSByZXR1cm5jb2RlIG90aGVyIHRoYW4gMAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZvcmsiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgZXhlY3V0ZSBpbiBhIG5ldyBWTS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgZXhlY3V0ZSBpbiBhIG5ldyBWTS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJqdm12ZXJzaW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSlZNIHZlcnNpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIEpWTSB2ZXJzaW9uLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImphciIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBsb2NhdGlvbiBvZiB0aGUgSkFSIGZpbGUgdG8gZXhlY3V0ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGxvY2F0aW9uIG9mIHRoZSBKQVIgZmlsZSB0byBleGVjdXRlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Imp2bSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NvbW1hbmQgdXNlZCB0byBzdGFydCB0aGUgVk0gKG9ubHkgaWYgbm90IGZvcmtpbmcpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGNvbW1hbmQgdXNlZCB0byBzdGFydCB0aGUgVk0gKG9ubHkgaWYgbm90IGZvcmtpbmcpLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Imp2bWFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDb21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciB0aGUgSlZNLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZm9yIHRoZSBKVk0uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWF4bWVtb3J5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29ycmVzcG9uZHMgdG8gLW14IG9yIC1YbXggZGVwZW5kaW5nIG9uIFZNIHZlcnNpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIENvcnJlc3BvbmRzIHRvIC1teCBvciAtWG14IGRlcGVuZGluZyBvbiBWTSB2ZXJzaW9uLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im5ld2Vudmlyb25tZW50IiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHVzZSBhIGNvbXBsZXRlbHkgbmV3IGVudmlyb25tZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCB1c2UgYSBjb21wbGV0ZWx5IG5ldyBlbnZpcm9ubWVudC4KLQotIDxwPldpbGwgYmUgaWdub3JlZCBpZiB3ZSBhcmUgbm90IGZvcmtpbmcgYSBuZXcgVk0uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3V0cHV0IiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZSB0aGUgb3V0cHV0IG9mIHRoZSBwcm9jZXNzIGlzIHJlZGlyZWN0ZWQgdG8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEZpbGUgdGhlIG91dHB1dCBvZiB0aGUgcHJvY2VzcyBpcyByZWRpcmVjdGVkIHRvLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRpbWVvdXQiIHR5cGU9ImphdmEubGFuZy5Mb25nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImxvbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHdoaWNoIHRoZSBwcm9jZXNzIHdpbGwgYmUga2lsbGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgcHJvY2VzcyB3aWxsIGJlIGtpbGxlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImVudiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW52aXJvbm1lbnQuVmFyaWFibGUiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuCi0KLSA8cD5XaWxsIGJlIGlnbm9yZWQgaWYgd2UgYXJlIG5vdCBmb3JraW5nIGEgbmV3IFZNLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJzeXNwcm9wZXJ0eSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW52aXJvbm1lbnQuVmFyaWFibGUiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBzeXN0ZW0gcHJvcGVydHkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBzeXN0ZW0gcHJvcGVydHkuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImFyZyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmUuQXJndW1lbnQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBjb21tYW5kLWxpbmUgYXJndW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBjb21tYW5kLWxpbmUgYXJndW1lbnQuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBwYXRoIHRvIHRoZSBjbGFzc3BhdGguXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBwYXRoIHRvIHRoZSBjbGFzc3BhdGguXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9Imp2bWFyZyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmUuQXJndW1lbnQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBKVk0gYXJndW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBKVk0gYXJndW1lbnQuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iamF2YWMiIGNhdGVnb3J5PSJqYXZhIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhYyIKLSAgICAgIG1hdGNoaW5nVGFzaz0idHJ1ZSI+Ci0KLSAgPCEtLSBqYXZhYyB0YXNrIC0tPgotPGV4dGVybmFsPgotPGRlc2NyaXB0aW9uPgotCi08cD5Db21waWxlcyBhIEphdmEgc291cmNlIHRyZWUuPC9wPgotCi08cD5UaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaXJlY3Rvcnkgd2lsbCBiZSByZWN1cnNpdmVseSBzY2FubmVkIGZvciBKYXZhCi1zb3VyY2UgZmlsZXMgdG8gY29tcGlsZS4gT25seSBKYXZhIGZpbGVzIHRoYXQgaGF2ZSBubyBjb3JyZXNwb25kaW5nIGNsYXNzIGZpbGUKLW9yIHdoZXJlIHRoZSBjbGFzcyBmaWxlIGlzIG9sZGVyIHRoYW4gdGhlIGphdmEgZmlsZSB3aWxsIGJlIGNvbXBpbGVkLjwvcD4KLQotPHA+Tm90ZTogQW50IHVzZXMgb25seSB0aGUgbmFtZXMgb2YgdGhlIHNvdXJjZSBhbmQgY2xhc3MgZmlsZXMgdG8gZmluZAotdGhlIGNsYXNzZXMgdGhhdCBuZWVkIGEgcmVidWlsZC4gSXQgd2lsbCBub3Qgc2NhbiB0aGUgc291cmNlIGFuZCB0aGVyZWZvcgotd2lsbCBoYXZlIG5vIGtub3dsZWRnZSBhYm91dCBuZXN0ZWQgY2xhc3NlcywgY2xhc3NlcyB0aGF0IGFyZSBuYW1lZCBkaWZmZXJlbnQKLWZyb20gdGhlIHNvdXJjZSBmaWxlIGFuZCBzbyBvbi48L3A+Ci0KLTxwPlRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIG9mIHRoZSBzb3VyY2UgdHJlZSBzaG91bGQgZm9sbG93IHRoZSBwYWNrYWdlCi1oaWVyYXJjaHkuPC9wPgotCi08cD5JdCBpcyBwb3NzaWJsZSB0byByZWZpbmUgdGhlIHNldCBvZiBmaWxlcyB0aGF0IGFyZSBiZWluZyBjb21waWxlZC9jb3BpZWQuCi1UaGlzIGNhbiBiZSBkb25lIHdpdGggdGhlIDxpPmluY2x1ZGVzPC9pPiwgPGk+aW5jbHVkZXNmaWxlPC9pPiwgPGk+ZXhjbHVkZXM8L2k+LCA8aT5leGNsdWRlc2ZpbGU8L2k+IGFuZCA8aT5kZWZhdWx0ZXhjbHVkZXM8L2k+Ci1hdHRyaWJ1dGVzLiBXaXRoIHRoZSA8aT5pbmNsdWRlczwvaT4gb3IgPGk+aW5jbHVkZXNmaWxlPC9pPiBhdHRyaWJ1dGUgeW91IHNwZWNpZnkgdGhlIGZpbGVzIHlvdSB3YW50IHRvCi1oYXZlIGluY2x1ZGVkIGJ5IHVzaW5nIHBhdHRlcm5zLiBUaGUgPGk+ZXhjbHVkZTwvaT4gb3IgPGk+ZXhjbHVkZXNmaWxlPC9pPiBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5Ci10aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBleGNsdWRlZC4gVGhpcyBpcyBhbHNvIGRvbmUgd2l0aCBwYXR0ZXJucy4gQW5kCi1maW5hbGx5IHdpdGggdGhlIDxpPmRlZmF1bHRleGNsdWRlczwvaT4gYXR0cmlidXRlLCB5b3UgY2FuIHNwZWNpZnkgd2hldGhlciB5b3UKLXdhbnQgdG8gdXNlIGRlZmF1bHQgZXhjbHVzaW9ucyBvciBub3QuIFNlZSB0aGUgc2VjdGlvbiBvbiA8YQotaHJlZj0iLi4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzIj5kaXJlY3RvcnkgYmFzZWQgdGFza3M8L2E+LCBvbiBob3cgdGhlCi1pbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvIHdyaXRlIHBhdHRlcm5zLjwvcD4KLQotPHA+SXQgaXMgcG9zc2libGUgdG8gdXNlIGRpZmZlcmVudCBjb21waWxlcnMuIFRoaXMgY2FuIGJlIHNlbGVjdGVkIHdpdGggdGhlCi0mcXVvdDtidWlsZC5jb21waWxlciZxdW90OyBwcm9wZXJ0eSBvciB0aGUgY29tcGlsZXIgYXR0cmlidXRlLiBIZXJlIGFyZSB0aGUgY2hvaWNlczotPC9wPgotPHVsPgotICA8bGk+Y2xhc3NpYyAodGhlIHN0YW5kYXJkIGNvbXBpbGVyIG9mIEpESyAxLjEvMS4yKSAtIGphdmFjMS4xIGFuZAotICAgICBqYXZhYzEuMiBjYW4gYmUgdXNlZCBhcyBhbGlhc2VzPC9saT4KLSAgPGxpPm1vZGVybiAodGhlIHN0YW5kYXJkIGNvbXBpbGVyIG9mIEpESyAxLjMvMS40KSAtIGphdmFjMS4zIGFuZAotICAgICBqYXZhYzEuNCBjYW4gYmUgdXNlZCBhcyBhbGlhc2VzPC9saT4KLSAgPGxpPmppa2VzICh0aGUgPGEKLSAgICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9qaWtlcy9wcm9qZWN0IiB0YXJnZXQ9Il90b3AiPkppa2VzPC9hPgotICAgIGNvbXBpbGVyKTwvbGk+Ci0gIDxsaT5qdmMgKHRoZSBDb21tYW5kLUxpbmUgQ29tcGlsZXIgZnJvbSBNaWNyb3NvZnQncyBTREsgZm9yIEphdmEgLwotICAgIFZpc3VhbCBKKyspIC0gbWljcm9zb2Z0IGNhbiBiZSB1c2VkIGFzIGFuIGFsaWFzPC9saT4KLSAgPGxpPmtqYyAodGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZG1zLmF0L2tvcGkvIiB0YXJnZXQ9Il90b3AiPmtvcGk8L2E+Ci0gICAgY29tcGlsZXIpPC9saT4KLSAgPGxpPmdjaiAodGhlIGdjaiBjb21waWxlciBmcm9tIGdjYyk8L2xpPgotICA8bGk+c2ogKFN5bWFudGVjIGphdmEgY29tcGlsZXIpIC0gc3ltYW50ZWMgY2FuIGJlIHVzZWQgYXMgYW4gYWxpYXM8L2xpPgotICA8bGk+ZXh0SmF2YWMgKHJ1biBlaXRoZXIgbW9kZXJuIG9yIGNsYXNzaWMgaW4gYSBKVk0gb2YgaXRzIG93bik8L2xpPgotPC91bD4KLTxwPkZvciBKREsgMS4xLzEuMiwgY2xhc3NpYyBpcyB0aGUgZGVmYXVsdC4gRm9yIEpESyAxLjMvMS40LCBtb2Rlcm4gaXMgdGhlIGRlZmF1bHQuCi1JZiB5b3Ugd2lzaCB0byB1c2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgaW50ZXJmYWNlIHRoYW4gdGhvc2UKLXN1cHBsaWVkLCB3cml0ZSBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgQ29tcGlsZXJBZGFwdGVyIGludGVyZmFjZQotKHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzKS4gU3VwcGx5IHRoZSBmdWxsCi1jbGFzc25hbWUgaW4gdGhlICZxdW90O2J1aWxkLmNvbXBpbGVyJnF1b3Q7IHByb3BlcnR5LjwvcD4KLQotPHA+VGhlIGZvcmsgYXR0cmlidXRlIG92ZXJyaWRlcyB0aGUgYnVpbGQuY29tcGlsZXIgc2V0dGluZyBhbmQgZXhwZWN0cwotYSBKREsxLjEgb3IgaGlnaGVyIHRvIGJlIHNldCBpbiBqYXZhLmhvbWUuPC9wPgotCi08cD5UaGlzIHRhc2sgd2lsbCBkcm9wIGFsbCBlbnRyaWVzIHRoYXQgcG9pbnQgdG8gbm9uLWV4aXN0ZW50Ci1maWxlcy9kaXJlY3RvcmllcyBmcm9tIHRoZSBDTEFTU1BBVEggaXQgcGFzc2VzIHRvIHRoZSBjb21waWxlci48L3A+Ci0KLTxwPjxzdHJvbmc+V2luZG93cyBOb3RlOjwvc3Ryb25nPldoZW4gdGhlIG1vZGVybiBjb21waWxlciBpcyB1c2VkCi1pbiB1bmZvcmtlZCBtb2RlIG9uIFdpbmRvd3MsIGl0IGxvY2tzIHVwIHRoZSBmaWxlcyBwcmVzZW50IGluIHRoZQotY2xhc3NwYXRoIG9mIHRoZSAmbHQ7amF2YWMmZ3Q7IHRhc2ssIGFuZCBkb2VzIG5vdCByZWxlYXNlIHRoZW0uICBUaGUgc2lkZQotZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBkZWxldGUgb3IgbW92ZQotdGhvc2UgZmlsZXMgbGF0ZXIgb24gaW4gdGhlIGJ1aWxkLiAgVGhlIHdvcmthcm91bmQgaXMgdG8gZm9yayB3aGVuCi1pbnZva2luZyB0aGUgY29tcGlsZXIuPC9wPgotCi08L2Rlc2NyaXB0aW9uPgotCi08c2VjdGlvbiBhbmNob3I9ImV4YW1wbGVzIiBuYW1lPSJFeGFtcGxlcyI+Ci08cHJlPiAgJmx0O2phdmFjIHNyY2Rpcj0mcXVvdDske3NyY30mcXVvdDsKLSAgICAgICAgIGRlc3RkaXI9JnF1b3Q7JHtidWlsZH0mcXVvdDsKLSAgICAgICAgIGNsYXNzcGF0aD0mcXVvdDt4eXouamFyJnF1b3Q7Ci0gICAgICAgICBkZWJ1Zz0mcXVvdDtvbiZxdW90OwotICAvJmd0OzwvcHJlPgotPHA+Y29tcGlsZXMgYWxsIDxjb2RlPi5qYXZhPC9jb2RlPiBmaWxlcyB1bmRlciB0aGUgPGNvZGU+JHtzcmN9PC9jb2RlPgotZGlyZWN0b3J5LCBhbmQgc3RvcmVzCi10aGUgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcyBpbiB0aGUgPGNvZGU+JHtidWlsZH08L2NvZGU+IGRpcmVjdG9yeS4KLVRoZSBjbGFzc3BhdGggdXNlZCBjb250YWlucyA8Y29kZT54eXouamFyPC9jb2RlPiwgYW5kIGRlYnVnIGluZm9ybWF0aW9uIGlzIG9uLjwvcD4KLQotPHByZT4gICZsdDtqYXZhYyBzcmNkaXI9JnF1b3Q7JHtzcmN9JnF1b3Q7Ci0gICAgICAgICBkZXN0ZGlyPSZxdW90OyR7YnVpbGR9JnF1b3Q7Ci0gICAgICAgICBmb3JrPSZxdW90O3RydWUmcXVvdDsKLSAgLyZndDs8L3ByZT4KLTxwPmNvbXBpbGVzIGFsbCA8Y29kZT4uamF2YTwvY29kZT4gZmlsZXMgdW5kZXIgdGhlIDxjb2RlPiR7c3JjfTwvY29kZT4KLWRpcmVjdG9yeSwgYW5kIHN0b3JlcyB0aGUgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcyBpbiB0aGUKLTxjb2RlPiR7YnVpbGR9PC9jb2RlPiBkaXJlY3RvcnkuICBUaGlzIHdpbGwgZm9yayBvZmYgdGhlIGphdmFjCi1jb21waWxlciB1c2luZyB0aGUgZGVmYXVsdCBqYXZhYyBleGVjdXRhYmxlLjwvcD4KLQotPHByZT4gICZsdDtqYXZhYyBzcmNkaXI9JnF1b3Q7JHtzcmN9JnF1b3Q7Ci0gICAgICAgICBkZXN0ZGlyPSZxdW90OyR7YnVpbGR9JnF1b3Q7Ci0gICAgICAgICBmb3JrPSZxdW90O2phdmEkJGphdmFjLmV4ZSZxdW90OwotICAvJmd0OzwvcHJlPgotPHA+Y29tcGlsZXMgYWxsIDxjb2RlPi5qYXZhPC9jb2RlPiBmaWxlcyB1bmRlciB0aGUgPGNvZGU+JHtzcmN9PC9jb2RlPgotZGlyZWN0b3J5LCBhbmQgc3RvcmVzIHRoZSA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGVzIGluIHRoZQotPGNvZGU+JHtidWlsZH08L2NvZGU+IGRpcmVjdG9yeS4gIFRoaXMgd2lsbCBmb3JrIG9mZiB0aGUgamF2YWMKLWNvbXBpbGVyIHVzaW5nIHRoZSBleGVjdXRhYmxlIG5hbWVkIDxjb2RlPmphdmEkamF2YWMuZXhlPC9jb2RlPi4gIE5vdGUKLXRoYXQgdGhlIDxjb2RlPiQ8L2NvZGU+IHNpZ24gbmVlZHMgdG8gYmUgZXNjYXBlZCBieSBhIHNlY29uZCBvbmUuPC9wPgotCi08cHJlPiAgJmx0O2phdmFjIHNyY2Rpcj0mcXVvdDske3NyY30mcXVvdDsKLSAgICAgICAgIGRlc3RkaXI9JnF1b3Q7JHtidWlsZH0mcXVvdDsKLSAgICAgICAgIGluY2x1ZGVzPSZxdW90O215cGFja2FnZS9wMS8qKixteXBhY2thZ2UvcDIvKiomcXVvdDsKLSAgICAgICAgIGV4Y2x1ZGVzPSZxdW90O215cGFja2FnZS9wMS90ZXN0cGFja2FnZS8qKiZxdW90OwotICAgICAgICAgY2xhc3NwYXRoPSZxdW90O3h5ei5qYXImcXVvdDsKLSAgICAgICAgIGRlYnVnPSZxdW90O29uJnF1b3Q7Ci0gIC8mZ3Q7PC9wcmU+Ci08cD5jb21waWxlcyA8Y29kZT4uamF2YTwvY29kZT4gZmlsZXMgdW5kZXIgdGhlIDxjb2RlPiR7c3JjfTwvY29kZT4KLWRpcmVjdG9yeSwgYW5kIHN0b3JlcyB0aGUKLTxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMgaW4gdGhlIDxjb2RlPiR7YnVpbGR9PC9jb2RlPiBkaXJlY3RvcnkuCi1UaGUgY2xhc3NwYXRoIHVzZWQgY29udGFpbnMgPGNvZGU+eHl6LmphcjwvY29kZT4sIGFuZCBkZWJ1ZyBpbmZvcm1hdGlvbiBpcyBvbi4KLU9ubHkgZmlsZXMgdW5kZXIgPGNvZGU+bXlwYWNrYWdlL3AxPC9jb2RlPiBhbmQgPGNvZGU+bXlwYWNrYWdlL3AyPC9jb2RlPiBhcmUKLXVzZWQuIEZpbGVzIGluIHRoZSA8Y29kZT5teXBhY2thZ2UvcDEvdGVzdHBhY2thZ2U8L2NvZGU+IGRpcmVjdG9yeSBhcmUgZXhjbHVkZWQKLWZyb20gY29tcGlsYXRpb24uPC9wPgotCi08cHJlPiAgJmx0O2phdmFjIHNyY2Rpcj0mcXVvdDske3NyY306JHtzcmMyfSZxdW90OwotICAgICAgICAgZGVzdGRpcj0mcXVvdDske2J1aWxkfSZxdW90OwotICAgICAgICAgaW5jbHVkZXM9JnF1b3Q7bXlwYWNrYWdlL3AxLyoqLG15cGFja2FnZS9wMi8qKiZxdW90OwotICAgICAgICAgZXhjbHVkZXM9JnF1b3Q7bXlwYWNrYWdlL3AxL3Rlc3RwYWNrYWdlLyoqJnF1b3Q7Ci0gICAgICAgICBjbGFzc3BhdGg9JnF1b3Q7eHl6LmphciZxdW90OwotICAgICAgICAgZGVidWc9JnF1b3Q7b24mcXVvdDsKLSAgLyZndDs8L3ByZT4KLQotPHA+aXMgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGV4YW1wbGUsIHdpdGggdGhlIGFkZGl0aW9uIG9mIGEgc2Vjb25kCi1zb3VyY2UgcGF0aCwgZGVmaW5lZCBieQotdGhlIHByb3BlcnR5IDxjb2RlPnNyYzI8L2NvZGU+LiBUaGlzIGNhbiBhbHNvIGJlIHJlcHJlc2VudGVkIHVzaW5nIG5lc3RlZAotPGNvZGU+Jmx0O3NyYyZndDs8L2NvZGU+IGVsZW1lbnRzIGFzIGZvbGxvd3M6PC9wPgotCi08cHJlPiAgJmx0O2phdmFjIGRlc3RkaXI9JnF1b3Q7JHtidWlsZH0mcXVvdDsKLSAgICAgICAgIGNsYXNzcGF0aD0mcXVvdDt4eXouamFyJnF1b3Q7Ci0gICAgICAgICBkZWJ1Zz0mcXVvdDtvbiZxdW90OyZndDsKLSAgICAmbHQ7c3JjIHBhdGg9JnF1b3Q7JHtzcmN9JnF1b3Q7LyZndDsKLSAgICAmbHQ7c3JjIHBhdGg9JnF1b3Q7JHtzcmMyfSZxdW90Oy8mZ3Q7Ci0gICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDtteXBhY2thZ2UvcDEvKiomcXVvdDsvJmd0OwotICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7bXlwYWNrYWdlL3AyLyoqJnF1b3Q7LyZndDsKLSAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90O215cGFja2FnZS9wMS90ZXN0cGFja2FnZS8qKiZxdW90Oy8mZ3Q7Ci0gICZsdDsvamF2YWMmZ3Q7PC9wcmU+Ci0KLTxwPjxiPk5vdGU6PC9iPiBJZiB5b3UgYXJlIHVzaW5nIEFudCBvbiBXaW5kb3dzIGFuZCBhIG5ldyBET1Mgd2luZG93IHBvcHMgdXAKLWZvciBldmVyeSB1c2Ugb2YgYW4gZXh0ZXJuYWwgY29tcGlsZXIsIHRoaXMgbWF5IGJlIGEgcHJvYmxlbSBvZiB0aGUgSkRLIHlvdSBhcmUgdXNpbmcuCi1UaGlzIHByb2JsZW0gbWF5IG9jY3VyIHdpdGggYWxsIEpES3MgJmx0OyAxLjIuPC9wPgotCi08cD48Yj5Ob3RlOjwvYj4gSWYgeW91IHdpc2ggdG8gY29tcGlsZSBvbmx5IHNvdXJjZS1maWxlcyBsb2NhdGVkIGluIHNvbWUgcGFja2FnZXMgYmVsb3cgYQotY29tbW9uIHJvb3QgeW91IHNob3VsZCBub3QgaW5jbHVkZSB0aGVzZSBwYWNrYWdlcyBpbiB0aGUgc3JjZGlyLWF0dHJpYnV0ZS4gVXNlIGluY2x1ZGUvZXhjbHVkZS1hdHRyaWJ1dGVzCi1vciBlbGVtZW50cyB0byBmaWx0ZXIgZm9yIHRoZXNlIHBhY2thZ2VzLiBJZiB5b3UgaW5jbHVkZSBwYXJ0IG9mIHlvdXIgcGFja2FnZS1zdHJ1Y3R1cmUgaW5zaWRlIHRoZSBzcmNkaXItYXR0cmlidXRlCi0ob3IgbmVzdGVkIHNyYy1lbGVtZW50cykgQW50IHdpbGwgc3RhcnQgdG8gcmVjb21waWxlIHlvdXIgc291cmNlcyBldmVyeSB0aW1lIHlvdSBjYWxsIGl0LjwvcD4KLQotPC9zZWN0aW9uPgotCi08c2VjdGlvbiBhbmNob3I9Imppa2VzIiBuYW1lPSJKaWtlcyBOb3RlcyI+Ci0KLTxwPkppa2VzIHN1cHBvcnRzIHNvbWUgZXh0cmEgb3B0aW9ucywgd2hpY2ggY2FuIGJlIHNldCBiZSBkZWZpbmluZwotcHJvcGVydGllcyBwcmlvciB0byBpbnZva2luZyB0aGUgdGFzay4gVGhlIGFudCBkZXZlbG9wZXJzIGFyZSBhd2FyZSB0aGF0Ci10aGlzIGlzIHVnbHkgYW5kIGluZmxleGlibGUgLWV4cGVjdCBhIGJldHRlciBzb2x1dGlvbiBpbiB0aGUgZnV0dXJlLiBBbGwKLXRoZSBvcHRpb25zIGFyZSBib29sZWFuLCBhbmQgbXVzdCBiZSBzZXQgdG8gJnF1b3Q7dHJ1ZSZxdW90OyBvciAmcXVvdDt5ZXMmcXVvdDsgdG8gYmUKLWludGVycHJldGVkIGFzIGFueXRoaW5nIG90aGVyIHRoYW4gZmFsc2U7IGJ5IGRlZmF1bHQKLWJ1aWxkLmNvbXBpbGVyLndhcm5pbmdzIGlzICZxdW90O3RydWUmcXVvdDsgd2hpbGUgYWxsIG90aGVycyBhcmUgJnF1b3Q7ZmFsc2UmcXVvdDs8L3A+Ci0KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotCWJ1aWxkLmNvbXBpbGVyLmVtYWNzCi0JPC90ZD4KLQk8dGQgdmFsaWduPSJ0b3AiPgotCUVuYWJsZSBlbWFjcyBjb21wYXRpYmxlIGVycm9yIG1lc3NhZ2VzCi0gICAgPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0JYnVpbGQuY29tcGlsZXIud2FybmluZ3M8YnIgLz4KLSAgICAgICAgPGI+VGhpcyBwcm9wZXJ0eSBoYXMgYmVlbiBkZXByZWNhdGVkLCB1c2UgdGhlIG5vd2FybiBhdHRyaWJ1dGUKLSAgICAgICAgICBpbnN0ZWFkPC9iPgotCTwvdGQ+Ci0JPHRkIHZhbGlnbj0idG9wIj4KLQlkb24ndCBkaXNhYmxlIHdhcm5pbmcgbWVzc2FnZXMKLSAgICA8L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLQlidWlsZC5jb21waWxlci5wZWRhbnRpYwotCTwvdGQ+Ci0JPHRkIHZhbGlnbj0idG9wIj4KLQllbmFibGUgcGVkYW50aWMgd2FybmluZ3MKLSAgICA8L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLQlidWlsZC5jb21waWxlci5mdWxsZGVwZW5kCi0JPC90ZD4KLQk8dGQgdmFsaWduPSJ0b3AiPgotCWVuYWJsZSBmdWxsIGRlcGVuZGVuY3kgY2hlY2tpbmcsPGJyIC8+Ci0JJnF1b3Q7K0YmcXVvdDsgaW4gdGhlIGppa2VzIG1hbnVhbC4KLSAgICA8L3RkPgotICA8L3RyPgotPC90YWJsZT4KLQotPC9zZWN0aW9uPgotPC9leHRlcm5hbD4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29tcGlsZXMgSmF2YSBzb3VyY2UgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0NvbXBpbGVzIEphdmEgc291cmNlIGZpbGVzLiBUaGlzIHRhc2sgY2FuIHRha2UgdGhlIGZvbGxvd2luZwotIGFyZ3VtZW50czoKLSA8dWw+Ci0gPGxpPnNvdXJjZWRpcgotIDxsaT5kZXN0ZGlyCi0gPGxpPmRlcHJlY2F0aW9uCi0gPGxpPmNsYXNzcGF0aAotIDxsaT5ib290Y2xhc3NwYXRoCi0gPGxpPmV4dGRpcnMKLSA8bGk+b3B0aW1pemUKLSA8bGk+ZGVidWcKLSA8bGk+ZW5jb2RpbmcKLSA8bGk+dGFyZ2V0Ci0gPGxpPmRlcGVuZAotIDxsaT52ZWJvc2UKLSA8bGk+ZmFpbG9uZXJyb3IKLSA8bGk+aW5jbHVkZWFudHJ1bnRpbWUKLSA8bGk+aW5jbHVkZWphdmFydW50aW1lCi0gPGxpPnNvdXJjZQotIDxsaT5jb21waWxlcgotIDwvdWw+Ci0gT2YgdGhlc2UgYXJndW1lbnRzLCB0aGUgPGI+c291cmNlZGlyPC9iPiBhbmQgPGI+ZGVzdGRpcjwvYj4gYXJlIHJlcXVpcmVkLgotIDxwPgotIFdoZW4gdGhpcyB0YXNrIGV4ZWN1dGVzLCBpdCB3aWxsIHJlY3Vyc2l2ZWx5IHNjYW4gdGhlIHNvdXJjZWRpciBhbmQKLSBkZXN0ZGlyIGxvb2tpbmcgZm9yIEphdmEgc291cmNlIGZpbGVzIHRvIGNvbXBpbGUuIFRoaXMgdGFzayBtYWtlcyBpdHMKLSBjb21waWxlIGRlY2lzaW9uIGJhc2VkIG9uIHRpbWVzdGFtcC5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImJvb3RjbGFzc3BhdGhyZWYiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJSZWZlcmVuY2UiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggZGVmaW5lZCBlbHNld2hlcmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggZGVmaW5lZCBlbHNld2hlcmUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYm9vdGNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtCb290Y2xhc3NwYXRoIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNvbXBpbGUgdGhlIGNsYXNzZXMKLSBhZ2FpbnN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBib290Y2xhc3NwYXRoIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNvbXBpbGUgdGhlIGNsYXNzZXMKLSBhZ2FpbnN0LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBjb21waWxhdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBjb21waWxhdGlvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGhyZWYiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJSZWZlcmVuY2UiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggZGVmaW5lZCBlbHNld2hlcmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEFkZHMgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggZGVmaW5lZCBlbHNld2hlcmUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tcGlsZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDaG9vc2UgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHBhcnRpY3VsYXIgdGFzay5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgQ2hvb3NlIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBwYXJ0aWN1bGFyIHRhc2suCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVidWciIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSW5kaWNhdGVzIHdoZXRoZXIgc291cmNlIHNob3VsZCBiZSBjb21waWxlZAotIHdpdGggZGVidWcgaW5mb3JtYXRpb247IGRlZmF1bHRzIHRvIG9mZi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgc291cmNlIHNob3VsZCBiZSBjb21waWxlZAotIHdpdGggZGVidWcgaW5mb3JtYXRpb247IGRlZmF1bHRzIHRvIG9mZi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWJ1Z2xldmVsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbS2V5d29yZCBsaXN0IHRvIGJlIGFwcGVuZGVkIHRvIHRoZSAtZyBjb21tYW5kLWxpbmUgc3dpdGNoLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBLZXl3b3JkIGxpc3QgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIC1nIGNvbW1hbmQtbGluZSBzd2l0Y2guCi0KLSBUaGlzIHdpbGwgYmUgaWdub3JlZCBieSBhbGwgaW1wbGVtZW50YXRpb25zIGV4Y2VwdCBtb2Rlcm4KLSBhbmQgY2xhc3NpYyh2ZXIgPj0gMS4yKS4gTGVnYWwgdmFsdWVzIGFyZSBub25lIG9yIGEKLSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgZm9sbG93aW5nIGtleXdvcmRzOiBsaW5lcywgdmFycywKLSBhbmQgc291cmNlLiBJZiBkZWJ1Z2xldmVsIGlzIG5vdCBzcGVjaWZpZWQsIGJ5IGRlZmF1bHQsIDpub25lCi0gd2lsbCBiZSBhcHBlbmRlZCB0byAtZy4gSWYgZGVidWcgaXMgbm90IHR1cm5lZCBvbiwgdGhpcyBhdHRyaWJ1dGUKLSB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVwZW5kIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0VuYWJsZXMgZGVwZW5kZW5jeS10cmFja2luZyBmb3IgY29tcGlsZXJzCi0gdGhhdCBzdXBwb3J0IHRoaXMgKGppa2VzIGFuZCBjbGFzc2ljKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgRW5hYmxlcyBkZXBlbmRlbmN5LXRyYWNraW5nIGZvciBjb21waWxlcnMKLSB0aGF0IHN1cHBvcnQgdGhpcyAoamlrZXMgYW5kIGNsYXNzaWMpLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlcHJlY2F0aW9uIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0luZGljYXRlcyB3aGV0aGVyIHNvdXJjZSBzaG91bGQgYmUKLSBjb21waWxlZCB3aXRoIGRlcHJlY2F0aW9uIGluZm9ybWF0aW9uOyBkZWZhdWx0cyB0byBvZmYuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEluZGljYXRlcyB3aGV0aGVyIHNvdXJjZSBzaG91bGQgYmUKLSBjb21waWxlZCB3aXRoIGRlcHJlY2F0aW9uIGluZm9ybWF0aW9uOyBkZWZhdWx0cyB0byBvZmYuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdGRpciIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Rlc3RpbmF0aW9uIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBKYXZhIHNvdXJjZQotIGZpbGVzIHNob3VsZCBiZSBjb21waWxlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgSmF2YSBzb3VyY2UKLSBmaWxlcyBzaG91bGQgYmUgY29tcGlsZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW5jb2RpbmciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtKYXZhIHNvdXJjZSBmaWxlIGVuY29kaW5nIG5hbWUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgSmF2YSBzb3VyY2UgZmlsZSBlbmNvZGluZyBuYW1lLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImV4ZWN1dGFibGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbmFtZSBvZiB0aGUgamF2YWMgZXhlY3V0YWJsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgdGhlIG5hbWUgb2YgdGhlIGphdmFjIGV4ZWN1dGFibGUuCi0KLSA8cD5JZ25vcmVkIHVubGVzcyBmb3JrIGlzIHRydWUgb3IgZXh0SmF2YWMgaGFzIGJlZW4gc3BlY2lmaWVkCi0gYXMgdGhlIGNvbXBpbGVyLjwvcD4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHRkaXJzIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0V4dGVuc2lvbiBkaXJlY3RvcmllcyB0aGF0IHdpbGwgYmUgdXNlZCBkdXJpbmcgdGhlCi0gY29tcGlsYXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIGV4dGVuc2lvbiBkaXJlY3RvcmllcyB0aGF0IHdpbGwgYmUgdXNlZCBkdXJpbmcgdGhlCi0gY29tcGlsYXRpb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJ1aWxkIHdpbGwgY29udGludWUKLSBldmVuIGlmIHRoZXJlIGFyZSBjb21waWxhdGlvbiBlcnJvcnM7IGRlZmF1bHRzIHRvIHRydWUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSBidWlsZCB3aWxsIGNvbnRpbnVlCi0gZXZlbiBpZiB0aGVyZSBhcmUgY29tcGlsYXRpb24gZXJyb3JzOyBkZWZhdWx0cyB0byB0cnVlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZvcmsiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgZm9ya3MgdGhlIGphdmFjIGNvbXBpbGVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCBmb3JrcyB0aGUgamF2YWMgY29tcGlsZXIuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5jbHVkZWFudHJ1bnRpbWUiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgaW5jbHVkZXMgQW50J3Mgb3duIGNsYXNzcGF0aCBpbiB0aGUgY2xhc3NwYXRoLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCBpbmNsdWRlcyBBbnQncyBvd24gY2xhc3NwYXRoIGluIHRoZSBjbGFzc3BhdGguCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5jbHVkZWphdmFydW50aW1lIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGluY2x1ZGVzIHRoZSBKYXZhIHJ1bnRpbWUgbGlicmFyaWVzIGluIHRoZSBjbGFzc3BhdGguXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGluY2x1ZGVzIHRoZSBKYXZhIHJ1bnRpbWUgbGlicmFyaWVzIGluIHRoZSBjbGFzc3BhdGguCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGlzdGZpbGVzIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGxpc3QgdGhlIHNvdXJjZSBmaWxlcyBiZWluZyBoYW5kZWQgb2ZmIHRvIHRoZSBjb21waWxlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgbGlzdCB0aGUgc291cmNlIGZpbGVzIGJlaW5nIGhhbmRlZCBvZmYgdG8gdGhlIGNvbXBpbGVyLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im1lbW9yeWluaXRpYWxzaXplIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciB0aGUgdW5kZXJseWluZyBWTQotIGlmIGphdmFjIGlzIHJ1biBleHRlcm5hbGx5OyBpZ25vcmVkIG90aGVyd2lzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciB0aGUgdW5kZXJseWluZyBWTQotIGlmIGphdmFjIGlzIHJ1biBleHRlcm5hbGx5OyBpZ25vcmVkIG90aGVyd2lzZS4KLSBEZWZhdWx0cyB0byB0aGUgc3RhbmRhcmQgVk0gbWVtb3J5IHNldHRpbmcuCi0gKEV4YW1wbGVzOiA4Mzg4NjA4MCwgODE5MjBrLCBvciA4MG0pCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWVtb3J5bWF4aW11bXNpemUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbWF4aW11bSBzaXplIG9mIHRoZSBtZW1vcnkgZm9yIHRoZSB1bmRlcmx5aW5nIFZNCi0gaWYgamF2YWMgaXMgcnVuIGV4dGVybmFsbHk7IGlnbm9yZWQgb3RoZXJ3aXNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgbWF4aW11bSBzaXplIG9mIHRoZSBtZW1vcnkgZm9yIHRoZSB1bmRlcmx5aW5nIFZNCi0gaWYgamF2YWMgaXMgcnVuIGV4dGVybmFsbHk7IGlnbm9yZWQgb3RoZXJ3aXNlLgotIERlZmF1bHRzIHRvIHRoZSBzdGFuZGFyZCBWTSBtZW1vcnkgc2V0dGluZy4KLSAoRXhhbXBsZXM6IDgzODg2MDgwLCA4MTkyMGssIG9yIDgwbSkKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJub3dhcm4iIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgZW5hYmxlcyB0aGUgLW5vd2FybiBvcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGVuYWJsZXMgdGhlIC1ub3dhcm4gb3B0aW9uLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im9wdGltaXplIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGNvbXBpbGVzIHdpdGggb3B0aW1pemF0aW9uIGVuYWJsZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGNvbXBpbGVzIHdpdGggb3B0aW1pemF0aW9uIGVuYWJsZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic291cmNlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVmFsdWUgb2YgdGhlIC1zb3VyY2UgY29tbWFuZC1saW5lIHN3aXRjaDsgd2lsbCBiZSBpZ25vcmVkCi0gYnkgYWxsIGltcGxlbWVudGF0aW9ucyBleGNlcHQgbW9kZXJuIGFuZCBqaWtlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVmFsdWUgb2YgdGhlIC1zb3VyY2UgY29tbWFuZC1saW5lIHN3aXRjaDsgd2lsbCBiZSBpZ25vcmVkCi0gYnkgYWxsIGltcGxlbWVudGF0aW9ucyBleGNlcHQgbW9kZXJuIGFuZCBqaWtlcy4KLQotIElmIHlvdSB1c2UgdGhpcyBhdHRyaWJ1dGUgdG9nZXRoZXIgd2l0aCBqaWtlcywgeW91IG11c3QKLSBtYWtlIHN1cmUgdGhhdCB5b3VyIHZlcnNpb24gb2YgamlrZXMgc3VwcG9ydHMgdGhlIC1zb3VyY2Ugc3dpdGNoLgotIExlZ2FsIHZhbHVlcyBhcmUgMS4zIGFuZCAxLjQgLSBieSBkZWZhdWx0LCBubyAtc291cmNlIGFyZ3VtZW50Ci0gd2lsbCBiZSB1c2VkIGF0IGFsbC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb3VyY2VwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NvdXJjZXBhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBjb21waWxhdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBzb3VyY2VwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgY29tcGlsYXRpb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic291cmNlcGF0aHJlZiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlJlZmVyZW5jZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHJlZmVyZW5jZSB0byBhIHNvdXJjZSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBBZGRzIGEgcmVmZXJlbmNlIHRvIGEgc291cmNlIHBhdGggZGVmaW5lZCBlbHNld2hlcmUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjZGlyIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NvdXJjZSBkaXJlY3RvcmllcyB0byBmaW5kIHRoZSBzb3VyY2UgSmF2YSBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBzb3VyY2UgZGlyZWN0b3JpZXMgdG8gZmluZCB0aGUgc291cmNlIEphdmEgZmlsZXMuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGFyZ2V0IFZNIHRoYXQgdGhlIGNsYXNzZXMgd2lsbCBiZSBjb21waWxlZCBmb3IuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIHRhcmdldCBWTSB0aGF0IHRoZSBjbGFzc2VzIHdpbGwgYmUgY29tcGlsZWQgZm9yLiBWYWxpZAotIHN0cmluZ3MgYXJlICIxLjEiLCAiMS4yIiwgYW5kICIxLjMiLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZlcmJvc2UiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgYXNrcyB0aGUgY29tcGlsZXIgZm9yIHZlcmJvc2Ugb3V0cHV0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCBhc2tzIHRoZSBjb21waWxlciBmb3IgdmVyYm9zZSBvdXRwdXQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJib290Y2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHBhdGggdG8gdGhlIGJvb3RjbGFzc3BhdGguXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBwYXRoIHRvIHRoZSBib290Y2xhc3NwYXRoLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgcGF0aCB0byB0aGUgY2xhc3NwYXRoLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgcGF0aCB0byB0aGUgY2xhc3NwYXRoLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJjb21waWxlcmFyZyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YWMuSW1wbGVtZW50YXRpb25TcGVjaWZpY0FyZ3VtZW50IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGFuIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbW1hbmQtbGluZSBhcmd1bWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhbiBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb21tYW5kLWxpbmUgYXJndW1lbnQuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImV4dGRpcnMiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgcGF0aCB0byBleHRkaXJzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgcGF0aCB0byBleHRkaXJzLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJzb3VyY2VwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHBhdGggdG8gc291cmNlcGF0aC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHBhdGggdG8gc291cmNlcGF0aC5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0ic3JjIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHBhdGggZm9yIHNvdXJjZSBjb21waWxhdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHBhdGggZm9yIHNvdXJjZSBjb21waWxhdGlvbi5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJqYXZhY2MiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuamF2YWNjLkphdmFDQyIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSmF2YUNDIGNvbXBpbGVyIGNvbXBpbGVyIHRhc2suXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0phdmFDQyBjb21waWxlciBjb21waWxlciB0YXNrLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYnVpbGRwYXJzZXIiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQlVJTERfUEFSU0VSIGdyYW1tYXIgb3B0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBCVUlMRF9QQVJTRVIgZ3JhbW1hciBvcHRpb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYnVpbGR0b2tlbm1hbmFnZXIiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQlVJTERfVE9LRU5fTUFOQUdFUiBncmFtbWFyIG9wdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgQlVJTERfVE9LRU5fTUFOQUdFUiBncmFtbWFyIG9wdGlvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYWNoZXRva2VucyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDQUNIRV9UT0tFTlMgZ3JhbW1hciBvcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIENBQ0hFX1RPS0VOUyBncmFtbWFyIG9wdGlvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjaG9pY2VhbWJpZ3VpdHljaGVjayIgdHlwZT0iaW50IgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ0hPSUNFX0FNQklHVUlUWV9DSEVDSyBncmFtbWFyIG9wdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgQ0hPSUNFX0FNQklHVUlUWV9DSEVDSyBncmFtbWFyIG9wdGlvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21tb250b2tlbmFjdGlvbiIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDT01NT05fVE9LRU5fQUNUSU9OIGdyYW1tYXIgb3B0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBDT01NT05fVE9LRU5fQUNUSU9OIGdyYW1tYXIgb3B0aW9uLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlYnVnbG9va2FoZWFkIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RFQlVHX0xPT0tBSEVBRCBncmFtbWFyIG9wdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgREVCVUdfTE9PS0FIRUFEIGdyYW1tYXIgb3B0aW9uLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlYnVncGFyc2VyIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RFQlVHX1BBUlNFUiBncmFtbWFyIG9wdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgREVCVUdfUEFSU0VSIGdyYW1tYXIgb3B0aW9uLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlYnVndG9rZW5tYW5hZ2VyIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RFQlVHX1RPS0VOX01BTkFHRVIgZ3JhbW1hciBvcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIERFQlVHX1RPS0VOX01BTkFHRVIgZ3JhbW1hciBvcHRpb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXJyb3JyZXBvcnRpbmciIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRVJST1JfUkVQT1JUSU5HIGdyYW1tYXIgb3B0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBFUlJPUl9SRVBPUlRJTkcgZ3JhbW1hciBvcHRpb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZm9yY2VsYWNoZWNrIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZPUkNFX0xBX0NIRUNLIGdyYW1tYXIgb3B0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBGT1JDRV9MQV9DSEVDSyBncmFtbWFyIG9wdGlvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZ25vcmVjYXNlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lHTk9SRV9DQVNFIGdyYW1tYXIgb3B0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBJR05PUkVfQ0FTRSBncmFtbWFyIG9wdGlvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJqYXZhY2Nob21lIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBKYXZhQ0MgZGlzdHJpYnV0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEphdmFDQyBkaXN0cmlidXRpb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iamF2YXVuaWNvZGVlc2NhcGUiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSkFWQV9VTklDT0RFX0VTQ0FQRSBncmFtbWFyIG9wdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgSkFWQV9VTklDT0RFX0VTQ0FQRSBncmFtbWFyIG9wdGlvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb29rYWhlYWQiIHR5cGU9ImludCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJpbnQiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xPT0tBSEVBRCBncmFtbWFyIG9wdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgTE9PS0FIRUFEIGdyYW1tYXIgb3B0aW9uLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im9wdGltaXpldG9rZW5tYW5hZ2VyIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW09QVElNSVpFX1RPS0VOX01BTkFHRVIgZ3JhbW1hciBvcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIE9QVElNSVpFX1RPS0VOX01BTkFHRVIgZ3JhbW1hciBvcHRpb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3RoZXJhbWJpZ3VpdHljaGVjayIgdHlwZT0iaW50IgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbT1RIRVJfQU1CSUdVSVRZX0NIRUNLIGdyYW1tYXIgb3B0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBPVEhFUl9BTUJJR1VJVFlfQ0hFQ0sgZ3JhbW1hciBvcHRpb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3V0cHV0ZGlyZWN0b3J5IiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGRpcmVjdG9yeSB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIHRvLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgZGlyZWN0b3J5IHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMgdG8uCi0gSWYgbm90IHNldCwgdGhlIGZpbGVzIGFyZSB3cml0dGVuIHRvIHRoZSBkaXJlY3RvcnkKLSBjb250YWluaW5nIHRoZSBncmFtbWFyIGZpbGUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2FuaXR5Y2hlY2siIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU0FOSVRZX0NIRUNLIGdyYW1tYXIgb3B0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBTQU5JVFlfQ0hFQ0sgZ3JhbW1hciBvcHRpb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RhdGljIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NUQVRJQyBncmFtbWFyIG9wdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgU1RBVElDIGdyYW1tYXIgb3B0aW9uLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldCIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBncmFtbWFyIGZpbGUgdG8gcHJvY2Vzcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGdyYW1tYXIgZmlsZSB0byBwcm9jZXNzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InVuaWNvZGVpbnB1dCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtVTklDT0RFX0lOUFVUIGdyYW1tYXIgb3B0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBVTklDT0RFX0lOUFVUIGdyYW1tYXIgb3B0aW9uLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXJjaGFyc3RyZWFtIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1VTRVJfQ0hBUl9TVFJFQU0gZ3JhbW1hciBvcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIFVTRVJfQ0hBUl9TVFJFQU0gZ3JhbW1hciBvcHRpb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlcnRva2VubWFuYWdlciIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtVU0VSX1RPS0VOX01BTkFHRVIgZ3JhbW1hciBvcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIFVTRVJfVE9LRU5fTUFOQUdFUiBncmFtbWFyIG9wdGlvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iamF2YWRvYyIgY2F0ZWdvcnk9ImphdmEiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmFkb2MiCi0gICAgICA+Ci0KLSAgPCEtLSBqYXZhZG9jIHRhc2sgLS0+Ci08ZXh0ZXJuYWw+Ci08ZGVzY3JpcHRpb24+Ci0KLTxwPkdlbmVyYXRlcyBjb2RlIGRvY3VtZW50YXRpb24gdXNpbmcgdGhlIGphdmFkb2MgdG9vbC48L3A+Ci0KLTxwPlRoZSBzb3VyY2UgZGlyZWN0b3J5IHdpbGwgYmUgcmVjdXJzaXZlbHkgc2Nhbm5lZCBmb3IgSmF2YSBzb3VyY2UgZmlsZXMgdG8gcHJvY2VzcwotYnV0IG9ubHkgdGhvc2UgbWF0Y2hpbmcgdGhlIGluY2x1c2lvbiBydWxlcywgYW5kIG5vdCBtYXRjaGluZyB0aGUgZXhjbHVzaW9ucyBydWxlcwotd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGphdmFkb2MgdG9vbC4gVGhpcwotYWxsb3dzIHdpbGRjYXJkcyB0byBiZSB1c2VkIHRvIGNob29zZSBiZXR3ZWVuIHBhY2thZ2UgbmFtZXMsIHJlZHVjaW5nIHZlcmJvc2l0eQotYW5kIG1hbmFnZW1lbnQgY29zdHMgb3ZlciB0aW1lLiBUaGlzIHRhc2ssIGhvd2V2ZXIsIGhhcyBubyBub3Rpb24gb2YKLSZxdW90O2NoYW5nZWQmcXVvdDsgZmlsZXMsIHVubGlrZSB0aGUgPGEgaHJlZj0iamF2YWMuaHRtbCI+amF2YWM8L2E+IHRhc2suIFRoaXMgbWVhbnMKLWFsbCBwYWNrYWdlcyB3aWxsIGJlIHByb2Nlc3NlZCBlYWNoIHRpbWUgdGhpcyB0YXNrIGlzIHJ1bi4gSW4gZ2VuZXJhbCwgaG93ZXZlciwKLXRoaXMgdGFzayBpcyB1c2VkIG11Y2ggbGVzcyBmcmVxdWVudGx5LjwvcD4KLQotPHA+VGhpcyB0YXNrIHdvcmtzIHNlYW1sZXNzbHkgYmV0d2VlbiBkaWZmZXJlbnQgamF2YWRvYyB2ZXJzaW9ucyAoMS4xIGFuZCAxLjIpLAotd2l0aCB0aGUgb2J2aW91cyByZXN0cmljdGlvbiB0aGF0IHRoZSAxLjIgYXR0cmlidXRlcyB3aWxsIGJlIGlnbm9yZWQgaWYgcnVuIGluIGEKLTEuMSBWTS48L3A+Ci0KLTxwPk5PVEU6IHNpbmNlIGphdmFkb2MgY2FsbHMgU3lzdGVtLmV4aXQoKSwgamF2YWRvYyBjYW5ub3QgYmUgcnVuIGluc2lkZSB0aGUKLXNhbWUgVk0gYXMgYW50IHdpdGhvdXQgYnJlYWtpbmcgZnVuY3Rpb25hbGl0eS4gRm9yIHRoaXMgcmVhc29uLCB0aGlzIHRhc2sKLWFsd2F5cyBmb3JrcyB0aGUgVk0uIFRoaXMgb3ZlcmhlYWQgaXMgbm90IHNpZ25pZmljYW50IHNpbmNlIGphdmFkb2MgaXMgbm9ybWFsbHkgYSBoZWF2eQotYXBwbGljYXRpb24gYW5kIHdpbGwgYmUgY2FsbGVkIGluZnJlcXVlbnRseS48L3A+Ci0KLTxwPk5PVEU6IHRoZSBwYWNrYWdlbGlzdCBhdHRyaWJ1dGUgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBsaXN0IG9mIHBhY2thZ2VzIHRvCi1kb2N1bWVudCBvdXRzaWRlIG9mIHRoZSBBbnQgZmlsZS4gSXQncyBhIG11Y2ggYmV0dGVyIHByYWN0aWNlIHRvIGluY2x1ZGUgZXZlcnl0aGluZwotaW5zaWRlIHRoZSBidWlsZC54bWwgZmlsZS4gVGhpcyBvcHRpb24gd2FzIGFkZGVkIGluIG9yZGVyIHRvIG1ha2UgaXQgZWFzaWVyIHRvCi1taWdyYXRlIGZyb20gcmVndWxhciBtYWtlZmlsZXMsIHdoZXJlIHlvdSB3b3VsZCB1c2UgdGhpcyBvcHRpb24gb2YgamF2YWRvYy4KLVRoZSBwYWNrYWdlcyBsaXN0ZWQgaW4gcGFja2FnZWxpc3QgYXJlIG5vdCBjaGVja2VkLCBzbyB0aGUgdGFzayBwZXJmb3JtcyBldmVuCi1pZiBzb21lIHBhY2thZ2VzIGFyZSBtaXNzaW5nIG9yIGJyb2tlbi4gVXNlIHRoaXMgb3B0aW9uIGlmIHlvdSB3aXNoIHRvIGNvbnZlcnQgZnJvbQotYW4gZXhpc3RpbmcgbWFrZWZpbGUuIE9uY2UgdGhpbmdzIGFyZSBydW5uaW5nIHlvdSBzaG91bGQgdGhlbiBzd2l0Y2ggdG8gdGhlIHJlZ3VsYXIKLW5vdGF0aW9uLiA8L3A+Ci0KLTxwPjxpPjxiPkRFUFJFQ0FUSU9OOjwvYj4gdGhlIGphdmFkb2MyIHRhc2sgc2ltcGx5IHBvaW50cyB0byB0aGUgamF2YWRvYyB0YXNrIGFuZCBpdCdzCi10aGVyZSBmb3IgYmFjayBjb21wYXRpYmlsaXR5IHJlYXNvbnMuIFNpbmNlIHRoaXMgdGFzayB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlCi12ZXJzaW9ucywgeW91IGFyZSBzdHJvbmdseSBlbmNvdXJhZ2VkIHRvIHVzZSA8YSBocmVmPSJqYXZhZG9jLmh0bWwiPmphdmFkb2M8L2E+Ci1pbnN0ZWFkLjwvaT48L3A+Ci08L2Rlc2NyaXB0aW9uPgotCi08c2VjdGlvbiBhbmNob3I9ImV4YW1wbGVzIiBuYW1lPSJFeGFtcGxlIj4KLTxwcmU+ICAmbHQ7amF2YWRvYyBwYWNrYWdlbmFtZXM9JnF1b3Q7Y29tLmR1bW15LnRlc3QuKiZxdW90OwotICAgICAgICAgICBzb3VyY2VwYXRoPSZxdW90O3NyYyZxdW90OwotICAgICAgICAgICBleGNsdWRlcGFja2FnZW5hbWVzPSZxdW90O2NvbS5kdW1teS50ZXN0LmRvYy1maWxlcy4qJnF1b3Q7Ci0gICAgICAgICAgIGRlZmF1bHRleGNsdWRlcz0mcXVvdDt5ZXMmcXVvdDsKLSAgICAgICAgICAgZGVzdGRpcj0mcXVvdDtkb2NzL2FwaSZxdW90OwotICAgICAgICAgICBhdXRob3I9JnF1b3Q7dHJ1ZSZxdW90OwotICAgICAgICAgICB2ZXJzaW9uPSZxdW90O3RydWUmcXVvdDsKLSAgICAgICAgICAgdXNlPSZxdW90O3RydWUmcXVvdDsKLSAgICAgICAgICAgd2luZG93dGl0bGU9JnF1b3Q7VGVzdCBBUEkmcXVvdDsmZ3Q7Ci0gICAgJmx0O2RvY3RpdGxlJmd0OyZsdDshW0NEQVRBWyZsdDtoMSZndDtUZXN0Jmx0Oy9oMSZndDtdXSZndDsmbHQ7L2RvY3RpdGxlJmd0OwotICAgICZsdDtib3R0b20mZ3Q7Jmx0OyFbQ0RBVEFbJmx0O2kmZ3Q7Q29weXJpZ2h0ICZhbXA7IzE2OTsgMjAwMCBEdW1teSBDb3JwLiBBbGwgUmlnaHRzIFJlc2VydmVkLiZsdDsvaSZndDtdXSZndDsmbHQ7L2JvdHRvbSZndDsKLSAgICAmbHQ7dGFnIG5hbWU9JnF1b3Q7dG9kbyZxdW90OyBzY29wZT0mcXVvdDthbGwmcXVvdDsgZGVzY3JpcHRpb249JnF1b3Q7VG8gZG86JnF1b3Q7IC8mZ3Q7Ci0gICAgJmx0O2dyb3VwIHRpdGxlPSZxdW90O0dyb3VwIDEgUGFja2FnZXMmcXVvdDsgcGFja2FnZXM9JnF1b3Q7Y29tLmR1bW15LnRlc3QuYSomcXVvdDsvJmd0OwotICAgICZsdDtncm91cCB0aXRsZT0mcXVvdDtHcm91cCAyIFBhY2thZ2VzJnF1b3Q7IHBhY2thZ2VzPSZxdW90O2NvbS5kdW1teS50ZXN0LmIqOmNvbS5kdW1teS50ZXN0LmMqJnF1b3Q7LyZndDsKLSAgICAmbHQ7bGluayBvZmZsaW5lPSZxdW90O3RydWUmcXVvdDsgaHJlZj0mcXVvdDtodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkay8xLjIvZG9jcy9hcGkvJnF1b3Q7IHBhY2thZ2VsaXN0TG9jPSZxdW90O0M6XHRtcCZxdW90Oy8mZ3Q7Ci0gICAgJmx0O2xpbmsgaHJlZj0mcXVvdDtodHRwOi8vZGV2ZWxvcGVyLmphdmEuc3VuLmNvbS9kZXZlbG9wZXIvcHJvZHVjdHMveG1sL2RvY3MvYXBpLyZxdW90Oy8mZ3Q7Ci0gICZsdDsvamF2YWRvYyZndDs8L3ByZT4KLTwvc2VjdGlvbj4KLTwvZXh0ZXJuYWw+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0dlbmVyYXRlcyBKYXZhZG9jIGRvY3VtZW50YXRpb24gZm9yIGEgY29sbGVjdGlvbiBvZiBzb3VyY2UgY29kZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbR2VuZXJhdGVzIEphdmFkb2MgZG9jdW1lbnRhdGlvbiBmb3IgYSBjb2xsZWN0aW9uCi0gb2Ygc291cmNlIGNvZGUuCi0KLSA8UD5DdXJyZW50IGtub3duIGxpbWl0YXRpb25zIGFyZToKLQotIDxQPjxVTD4KLSAgICA8TEk+cGF0dGVybnMgbXVzdCBiZSBvZiB0aGUgZm9ybSAieHh4LioiLCBldmVyeSBvdGhlciBwYXR0ZXJuIGRvZXNuJ3QKLSAgICAgICAgd29yay4KLSAgICA8TEk+dGhlcmUgaXMgbm8gY29udHJvbCBvbiBhcmd1bWVudHMgc2FuaXR5IHNpbmNlIHRoZXkgYXJlIGxlZnQKLSAgICAgICAgdG8gdGhlIGphdmFkb2MgaW1wbGVtZW50YXRpb24uCi0gICAgPExJPmFyZ3VtZW50IEogaW4gamF2YWRvYzEgaXMgbm90IHN1cHBvcnRlZCAod2hhdCBpcyB0aGF0IGZvciBhbnl3YXk/KQotIDwvVUw+Ci0KLSA8UD5JZiBubyA8Q09ERT5kb2NsZXQ8L0NPREU+IGlzIHNldCwgdGhlbiB0aGUgPENPREU+dmVyc2lvbjwvQ09ERT4gYW5kCi0gPENPREU+YXV0aG9yPC9DT0RFPiBhcmUgYnkgZGVmYXVsdCA8Q09ERT4ieWVzIjwvQ09ERT4uCi0KLSA8UD5Ob3RlOiBUaGlzIHRhc2sgaXMgcnVuIG9uIGFub3RoZXIgVk0gYmVjYXVzZSB0aGUgSmF2YWRvYyBjb2RlIGNhbGxzCi0gPENPREU+U3lzdGVtLmV4aXQoKTwvQ09ERT4gd2hpY2ggd291bGQgYnJlYWsgQW50IGZ1bmN0aW9uYWxpdHkuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmFkb2MuQWNjZXNzVHlwZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDtwcm90ZWN0ZWQmcXVvdDssICZxdW90O3B1YmxpYyZxdW90OywgJnF1b3Q7cGFja2FnZSZxdW90OywgJnF1b3Q7cHJpdmF0ZSZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2NvcGUgdG8gYmUgcHJvY2Vzc2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIHNjb3BlIHRvIGJlIHByb2Nlc3NlZC4gVGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUKLSB1c2Ugb2YgdGhlIHNldFB1YmxpYywgc2V0UHJpdmF0ZSwgZXRjIG1ldGhvZHMuIEl0IGdpdmVzIGJldHRlciBidWlsZAotIGZpbGUgY29udHJvbCBvdmVyIHdoYXQgc2NvcGUgaXMgcHJvY2Vzc2VkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImFkZGl0aW9uYWxwYXJhbSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciBvbiB0aGUgY29tbWFuZCBsaW5lLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIgb24gdGhlIGNvbW1hbmQgbGluZQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImF1dGhvciIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJbmNsdWRlIHRoZSBhdXRob3IgdGFnIGluIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSW5jbHVkZSB0aGUgYXV0aG9yIHRhZyBpbiB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYm9vdGNsYXNzcGF0aHJlZiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlJlZmVyZW5jZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHJlZmVyZW5jZSB0byBhIENMQVNTUEFUSCBkZWZpbmVkIGVsc2V3aGVyZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgQWRkcyBhIHJlZmVyZW5jZSB0byBhIENMQVNTUEFUSCBkZWZpbmVkIGVsc2V3aGVyZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJib290Y2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Jvb3QgY2xhc3NwYXRoIHRvIHVzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBib290IGNsYXNzcGF0aCB0byB1c2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYm90dG9tIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGV4dCB0byBiZSBwbGFjZWQgYXQgdGhlIGJvdHRvbSBvZiBlYWNoIG91dHB1dCBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIHRleHQgdG8gYmUgcGxhY2VkIGF0IHRoZSBib3R0b20gb2YgZWFjaCBvdXRwdXQgZmlsZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjaGFyc2V0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2hhcnNldCBmb3IgY3Jvc3MtcGxhdGZvcm0gdmlld2luZyBvZiBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgQ2hhcnNldCBmb3IgY3Jvc3MtcGxhdGZvcm0gdmlld2luZyBvZiBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgamF2YWRvYyBydW4uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgamF2YWRvYyBydW4uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRocmVmIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2UiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUmVmZXJlbmNlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgcmVmZXJlbmNlIHRvIGEgQ0xBU1NQQVRIIGRlZmluZWQgZWxzZXdoZXJlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBBZGRzIGEgcmVmZXJlbmNlIHRvIGEgQ0xBU1NQQVRIIGRlZmluZWQgZWxzZXdoZXJlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmF1bHRleGNsdWRlcyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIHdoZXRoZXIgZGVmYXVsdCBleGNsdXNpb25zIHNob3VsZCBiZSB1c2VkIG9yIG5vdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVzaW9ucyBzaG91bGQgYmUgdXNlZCBvciBub3QuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdGRpciIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSB0aGUgSmF2YWRvYyBvdXRwdXQgd2lsbCBiZSBnZW5lcmF0ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBKYXZhZG9jIG91dHB1dCB3aWxsIGJlIGdlbmVyYXRlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2NlbmNvZGluZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW091dHB1dCBmaWxlIGVuY29kaW5nIG5hbWUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIE91dHB1dCBmaWxlIGVuY29kaW5nIG5hbWUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jbGV0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3MgdGhhdCBzdGFydHMgdGhlIGRvY2xldCB1c2VkIGluIGdlbmVyYXRpbmcgdGhlIAotIGRvY3VtZW50YXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgY2xhc3MgdGhhdCBzdGFydHMgdGhlIGRvY2xldCB1c2VkIGluIGdlbmVyYXRpbmcgdGhlIAotIGRvY3VtZW50YXRpb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jbGV0cGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzc3BhdGggdXNlZCB0byBmaW5kIHRoZSBkb2NsZXQgY2xhc3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgY2xhc3NwYXRoIHVzZWQgdG8gZmluZCB0aGUgZG9jbGV0IGNsYXNzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRvY2xldHBhdGhyZWYiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJSZWZlcmVuY2UiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NsYXNzcGF0aCB1c2VkIHRvIGZpbmQgdGhlIGRvY2xldCBjbGFzcyBieSByZWZlcmVuY2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgY2xhc3NwYXRoIHVzZWQgdG8gZmluZCB0aGUgZG9jbGV0IGNsYXNzIGJ5IHJlZmVyZW5jZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2N0aXRsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RpdGxlIG9mIHRoZSBnZW5lcmF0ZWQgb3ZlcnZpZXcgcGFnZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSB0aXRsZSBvZiB0aGUgZ2VuZXJhdGVkIG92ZXJ2aWV3IHBhZ2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW5jb2RpbmciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFbmNvZGluZyBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZXMsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGVuY29kaW5nIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlcywKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlcGFja2FnZW5hbWVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTGlzdCBvZiBwYWNrYWdlcyB0byBiZSBleGNsdWRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBsaXN0IG9mIHBhY2thZ2VzIHRvIGJlIGV4Y2x1ZGVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImV4dGRpcnMiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTG9jYXRpb24gb2YgdGhlIGV4dGVuc2lvbnMgZGlyZWN0b3JpZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgbG9jYXRpb24gb2YgdGhlIGV4dGVuc2lvbnMgZGlyZWN0b3JpZXMuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2hvdWxkIHRoZSBidWlsZCBwcm9jZXNzIGZhaWwgaWYgamF2YWRvYyBmYWlscyAoYXMgaW5kaWNhdGVkIGJ5Ci0gYSBub24gemVybyByZXR1cm4gY29kZSk/Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTaG91bGQgdGhlIGJ1aWxkIHByb2Nlc3MgZmFpbCBpZiBqYXZhZG9jIGZhaWxzIChhcyBpbmRpY2F0ZWQgYnkKLSBhIG5vbiB6ZXJvIHJldHVybiBjb2RlKT8KLQotIDxwPkRlZmF1bHQgaXMgZmFsc2UuPC9wPgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZvb3RlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Zvb3RlciB0ZXh0IHRvIGJlIHBsYWNlZCBhdCB0aGUgYm90dG9tIG9mIGVhY2ggb3V0cHV0IGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgZm9vdGVyIHRleHQgdG8gYmUgcGxhY2VkIGF0IHRoZSBib3R0b20gb2YgZWFjaCBvdXRwdXQgZmlsZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJncm91cCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0dyb3VwIHNwZWNpZmllZCBwYWNrYWdlcyB0b2dldGhlciBpbiBvdmVydmlldyBwYWdlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBHcm91cCBzcGVjaWZpZWQgcGFja2FnZXMgdG9nZXRoZXIgaW4gb3ZlcnZpZXcgcGFnZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJoZWFkZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtIZWFkZXIgdGV4dCB0byBiZSBwbGFjZWQgYXQgdGhlIHRvcCBvZiBlYWNoIG91dHB1dCBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGhlYWRlciB0ZXh0IHRvIGJlIHBsYWNlZCBhdCB0aGUgdG9wIG9mIGVhY2ggb3V0cHV0IGZpbGUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaGVscGZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTcGVjaWZpZXMgdGhlIEhUTUwgaGVscCBmaWxlIHRvIHVzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU3BlY2lmaWVzIHRoZSBIVE1MIGhlbHAgZmlsZSB0byB1c2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGluayIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NyZWF0ZSBsaW5rcyB0byBqYXZhZG9jIG91dHB1dCBhdCB0aGUgZ2l2ZW4gVVJMLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBDcmVhdGUgbGlua3MgdG8gamF2YWRvYyBvdXRwdXQgYXQgdGhlIGdpdmVuIFVSTC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsaW5rb2ZmbGluZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xpbmsgdG8gZG9jcyBhdCAidXJsIiB1c2luZyBwYWNrYWdlIGxpc3QgYXQgInVybDIiCi0gLSBzZXBhcmF0ZSB0aGUgVVJMcyBieSB1c2luZyBhIHNwYWNlIGNoYXJhY3Rlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgTGluayB0byBkb2NzIGF0ICJ1cmwiIHVzaW5nIHBhY2thZ2UgbGlzdCBhdCAidXJsMiIKLSAtIHNlcGFyYXRlIHRoZSBVUkxzIGJ5IHVzaW5nIGEgc3BhY2UgY2hhcmFjdGVyLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImxvY2FsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xvY2FsIHRvIHVzZSBpbiBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgbG9jYWwgdG8gdXNlIGluIGRvY3VtZW50YXRpb24gZ2VuZXJhdGlvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXhtZW1vcnkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtNYXhpbXVtIG1lbW9yeSB0byBiZSB1c2VkIGJ5IHRoZSBqYXZhZG9jIHByb2Nlc3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgbWF4aW11bSBtZW1vcnkgdG8gYmUgdXNlZCBieSB0aGUgamF2YWRvYyBwcm9jZXNzCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibm9kZXByZWNhdGVkIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGRvIG5vdCBpbmNsdWRlIEBkZXByZWNhdGVkIGluZm9ybWF0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCBkbyBub3QgaW5jbHVkZSBAZGVwcmVjYXRlZCBpbmZvcm1hdGlvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJub2RlcHJlY2F0ZWRsaXN0IiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGRvIG5vdCBnZW5lcmF0ZSBkZXByZWNhdGVkIGxpc3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGRvIG5vdCBnZW5lcmF0ZSBkZXByZWNhdGVkIGxpc3QuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibm9oZWxwIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGRvIG5vdCBnZW5lcmF0ZSBoZWxwIGxpbmsuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGRvIG5vdCBnZW5lcmF0ZSBoZWxwIGxpbmsKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJub2luZGV4IiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGRvIG5vdCBnZW5lcmF0ZSBpbmRleC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgZG8gbm90IGdlbmVyYXRlIGluZGV4LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im5vbmF2YmFyIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGRvIG5vdCBnZW5lcmF0ZSBuYXZpZ2F0aW9uIGJhci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgZG8gbm90IGdlbmVyYXRlIG5hdmlnYXRpb24gYmFyLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im5vdHJlZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBkbyBub3QgZ2VuZXJhdGUgY2xhc3MgaGllcmFyY2h5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCBkbyBub3QgZ2VuZXJhdGUgY2xhc3MgaGllcmFyY2h5LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im9sZCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJbmRpY2F0ZSB3aGV0aGVyIEphdmFkb2Mgc2hvdWxkIHByb2R1Y2Ugb2xkIHN0eWxlIChKREsgMS4xKSAKLSBkb2N1bWVudGF0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJbmRpY2F0ZSB3aGV0aGVyIEphdmFkb2Mgc2hvdWxkIHByb2R1Y2Ugb2xkIHN0eWxlIChKREsgMS4xKSAKLSBkb2N1bWVudGF0aW9uLgotCi0gVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IEpESyAxLjEgYW5kIGhhcyBiZWVuIHBoYXNlZCBvdXQgaW4gSkRLIDEuNAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im92ZXJ2aWV3IiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmeSB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBvdmVydmlldyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkCi0gZG9jdW1lbnRhdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU3BlY2lmeSB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBvdmVydmlldyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkCi0gZG9jdW1lbnRhdGlvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYWNrYWdlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0luZGljYXRlIHdoZXRoZXIgb25seSBwYWNrYWdlLCBwcm90ZWN0ZWQgYW5kIHB1YmxpYyBjbGFzc2VzIGFuZCAKLSBtZW1iZXJzIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgc2NvcGUgcHJvY2Vzc2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJbmRpY2F0ZSB3aGV0aGVyIG9ubHkgcGFja2FnZSwgcHJvdGVjdGVkIGFuZCBwdWJsaWMgY2xhc3NlcyBhbmQgCi0gbWVtYmVycyBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHNjb3BlIHByb2Nlc3NlZAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InBhY2thZ2VsaXN0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG5hbWUgb2YgYSBmaWxlIGNvbnRhaW5pbmcgdGhlIHBhY2thZ2VzIHRvIHByb2Nlc3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIHRoZSBwYWNrYWdlcyB0byBwcm9jZXNzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InBhY2thZ2VuYW1lcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BhY2thZ2UgbmFtZXMgdG8gYmUgcHJvY2Vzc2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIHBhY2thZ2UgbmFtZXMgdG8gYmUgcHJvY2Vzc2VkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InByaXZhdGUiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSW5kaWNhdGUgd2hldGhlciBhbGwgY2xhc3NlcyBhbmQgCi0gbWVtYmVycyBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHNjb3BlIHByb2Nlc3NlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSW5kaWNhdGUgd2hldGhlciBhbGwgY2xhc3NlcyBhbmQgCi0gbWVtYmVycyBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHNjb3BlIHByb2Nlc3NlZAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InByb3RlY3RlZCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJbmRpY2F0ZSB3aGV0aGVyIG9ubHkgcHJvdGVjdGVkIGFuZCBwdWJsaWMgY2xhc3NlcyBhbmQgbWVtYmVycyBhcmUgdG8gCi0gYmUgaW5jbHVkZWQgaW4gdGhlIHNjb3BlIHByb2Nlc3NlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSW5kaWNhdGUgd2hldGhlciBvbmx5IHByb3RlY3RlZCBhbmQgcHVibGljIGNsYXNzZXMgYW5kIG1lbWJlcnMgYXJlIHRvIAotIGJlIGluY2x1ZGVkIGluIHRoZSBzY29wZSBwcm9jZXNzZWQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwdWJsaWMiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSW5kaWNhdGUgd2hldGhlciBvbmx5IHB1YmxpYyBjbGFzc2VzIGFuZCBtZW1iZXJzIGFyZSB0byBiZSBpbmNsdWRlZCBpbiAKLSB0aGUgc2NvcGUgcHJvY2Vzc2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJbmRpY2F0ZSB3aGV0aGVyIG9ubHkgcHVibGljIGNsYXNzZXMgYW5kIG1lbWJlcnMgYXJlIHRvIGJlIGluY2x1ZGVkIGluIAotIHRoZSBzY29wZSBwcm9jZXNzZWQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXJpYWx3YXJuIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGdlbmVyYXRlIHdhcm5pbmcgYWJvdXQgQHNlcmlhbCB0YWcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGdlbmVyYXRlIHdhcm5pbmcgYWJvdXQgQHNlcmlhbCB0YWcuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic291cmNlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRW5hYmxlcyB0aGUgLXNvdXJjZSBzd2l0Y2gsIHdpbGwgYmUgaWdub3JlZCBpZiBqYXZhZG9jIGlzIG5vdAotIHRoZSAxLjQgdmVyc2lvbiBvciBhIGRpZmZlcmVudCBkb2NsZXQgdGhhbiB0aGUgc3RhbmRhcmQgZG9jbGV0Ci0gaXMgdXNlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgRW5hYmxlcyB0aGUgLXNvdXJjZSBzd2l0Y2gsIHdpbGwgYmUgaWdub3JlZCBpZiBqYXZhZG9jIGlzIG5vdAotIHRoZSAxLjQgdmVyc2lvbiBvciBhIGRpZmZlcmVudCBkb2NsZXQgdGhhbiB0aGUgc3RhbmRhcmQgZG9jbGV0Ci0gaXMgdXNlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb3VyY2VmaWxlcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xpc3Qgb2Ygc291cmNlIGZpbGVzIHRvIHByb2Nlc3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgbGlzdCBvZiBzb3VyY2UgZmlsZXMgdG8gcHJvY2Vzcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb3VyY2VwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZnkgd2hlcmUgdG8gZmluZCBzb3VyY2UgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU3BlY2lmeSB3aGVyZSB0byBmaW5kIHNvdXJjZSBmaWxlCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic291cmNlcGF0aHJlZiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlJlZmVyZW5jZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHJlZmVyZW5jZSB0byBhIENMQVNTUEFUSCBkZWZpbmVkIGVsc2V3aGVyZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgQWRkcyBhIHJlZmVyZW5jZSB0byBhIENMQVNTUEFUSCBkZWZpbmVkIGVsc2V3aGVyZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcGxpdGluZGV4IiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0dlbmVyYXRlIGEgc3BsaXQgaW5kZXguXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEdlbmVyYXRlIGEgc3BsaXQgaW5kZXgKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdHlsZXNoZWV0ZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZmllcyB0aGUgQ1NTIHN0eWxlc2hlZXQgZmlsZSB0byB1c2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNwZWNpZmllcyB0aGUgQ1NTIHN0eWxlc2hlZXQgZmlsZSB0byB1c2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0dlbmVyYXRlIHRoZSAmcXVvdDt1c2UmcXVvdCBwYWdlIGZvciBlYWNoIHBhY2thZ2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEdlbmVyYXRlIHRoZSAmcXVvdDt1c2UmcXVvdCBwYWdlIGZvciBlYWNoIHBhY2thZ2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlZXh0ZXJuYWxmaWxlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1dvcmsgYXJvdW5kIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXQgYnkgdXNpbmcgYW4gZXh0ZXJuYWwgZmlsZQotIGZvciB0aGUgc291cmNlZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFdvcmsgYXJvdW5kIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXQgYnkgdXNpbmcgYW4gZXh0ZXJuYWwgZmlsZQotIGZvciB0aGUgc291cmNlZmlsZXMuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyYm9zZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtSdW4gamF2YWRvYyBpbiB2ZXJib3NlIG1vZGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFJ1biBqYXZhZG9jIGluIHZlcmJvc2UgbW9kZQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSW5jbHVkZSB0aGUgdmVyc2lvbiB0YWcgaW4gdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJbmNsdWRlIHRoZSB2ZXJzaW9uIHRhZyBpbiB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0id2luZG93dGl0bGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaXRsZSB0byBiZSBwbGFjZWQgaW4gdGhlIEhUTUwgJmx0O3RpdGxlJmd0OyB0YWcgb2YgdGhlIAotIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIHRpdGxlIHRvIGJlIHBsYWNlZCBpbiB0aGUgSFRNTCAmbHQ7dGl0bGUmZ3Q7IHRhZyBvZiB0aGUgCi0gZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJib3R0b20iIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmFkb2MuSHRtbCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGV4dCB0byBiZSBwbGFjZWQgYXQgdGhlIGJvdHRvbSBvZiBlYWNoIG91dHB1dCBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtTZXQgdGhlIHRleHQgdG8gYmUgcGxhY2VkIGF0IHRoZSBib3R0b20gb2YgZWFjaCBvdXRwdXQgZmlsZS5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iZG9jdGl0bGUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmFkb2MuSHRtbCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgZG9jdW1lbnQgdGl0bGUgdG8gdXNlIGZvciB0aGUgb3ZlcnZpZXcgcGFnZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgZG9jdW1lbnQgdGl0bGUgdG8gdXNlIGZvciB0aGUgb3ZlcnZpZXcgcGFnZS5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iZXhjbHVkZXBhY2thZ2UiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmFkb2MuUGFja2FnZU5hbWUiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIHBhY2thZ2UgdG8gYmUgZXhjbHVkZWQgZnJvbSB0aGUgamF2YWRvYyBydW4uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCBhIHBhY2thZ2UgdG8gYmUgZXhjbHVkZWQgZnJvbSB0aGUgamF2YWRvYyBydW4uXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGVzZXQiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgZmlsZXNldC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIGZpbGVzZXQuCi0KLSA8cD5BbGwgaW5jbHVkZWQgZmlsZXMgd2lsbCBiZSBhZGRlZCBhcyBzb3VyY2VmaWxlcy4gIFRoZSB0YXNrCi0gd2lsbCBhdXRvbWF0aWNhbGx5IGFkZAotIDxjb2RlPmluY2x1ZGVzPSZxdW90OyoqJiM0NzsqLmphdmEmcXVvdDs8L2NvZGU+IHRvIHRoZQotIGZpbGVzZXQuPC9wPl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJmb290ZXIiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmFkb2MuSHRtbCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRm9vdGVyIHRleHQgdG8gYmUgcGxhY2VkIGF0IHRoZSBib3R0b20gb2YgZWFjaCBvdXRwdXQgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbU2V0IHRoZSBmb290ZXIgdGV4dCB0byBiZSBwbGFjZWQgYXQgdGhlIGJvdHRvbSBvZiBlYWNoIG91dHB1dCBmaWxlLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJoZWFkZXIiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmFkb2MuSHRtbCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSGVhZGVyIHRleHQgdG8gYmUgcGxhY2VkIGF0IHRoZSB0b3Agb2YgZWFjaCBvdXRwdXQgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbU2V0IHRoZSBoZWFkZXIgdGV4dCB0byBiZSBwbGFjZWQgYXQgdGhlIHRvcCBvZiBlYWNoIG91dHB1dCBmaWxlLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJwYWNrYWdlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhZG9jLlBhY2thZ2VOYW1lIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSBzaW5nbGUgcGFja2FnZSB0byBiZSBwcm9jZXNzZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCBhIHNpbmdsZSBwYWNrYWdlIHRvIGJlIHByb2Nlc3NlZC4KLQotIElmIHRoZSBwYWNrYWdlIG5hbWUgZW5kcyB3aXRoICZxdW90Oy4qJnF1b3Q7IHRoZSBKYXZhZG9jIHRhc2sKLSB3aWxsIGZpbmQgYW5kIHByb2Nlc3MgYWxsIHN1YnBhY2thZ2VzLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJwYWNrYWdlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EaXJTZXQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IkRpcnNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBwYWNrYWdlc2V0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgcGFja2FnZXNldC4KLQotIDxwPkFsbCBpbmNsdWRlZCBkaXJlY3RvcmllcyB3aWxsIGJlIHRyYW5zbGF0ZWQgaW50byBwYWNrYWdlCi0gbmFtZXMgYmUgY29udmVydGluZyB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvciBpbnRvIGRvdHMuPC9wPl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJzb3VyY2UiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmFkb2MuU291cmNlRmlsZSIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgc2luZ2xlIHNvdXJjZSBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGQgYSBzaW5nbGUgc291cmNlIGZpbGUuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9InRhZ2xldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YWRvYy5FeHRlbnNpb25JbmZvIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSB0YWdsZXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCBhIHRhZ2xldF1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJib290Y2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ3JlYXRlIGEgUGF0aCB0byBiZSBjb25maWd1cmVkIHdpdGggdGhlIGJvb3QgY2xhc3NwYXRoLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtDcmVhdGUgYSBQYXRoIHRvIGJlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgYm9vdCBjbGFzc3BhdGhdXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ3JlYXRlIGEgUGF0aCB0byBiZSBjb25maWd1cmVkIHdpdGggdGhlIGNsYXNzcGF0aCB0byB1c2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0NyZWF0ZSBhIFBhdGggdG8gYmUgY29uZmlndXJlZCB3aXRoIHRoZSBjbGFzc3BhdGggdG8gdXNlXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImRvY2xldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YWRvYy5Eb2NsZXRJbmZvIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGUgYSBkb2NsZXQgdG8gYmUgdXNlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtDcmVhdGUgYSBkb2NsZXQgdG8gYmUgdXNlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJncm91cCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YWRvYy5Hcm91cEFyZ3VtZW50IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXBhcmF0ZXMgcGFja2FnZXMgb24gdGhlIG92ZXJ2aWV3IHBhZ2UgaW50byB3aGF0ZXZlcgotIGdyb3VwcyB5b3Ugc3BlY2lmeSwgb25lIGdyb3VwIHBlciB0YWJsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbU2VwYXJhdGVzIHBhY2thZ2VzIG9uIHRoZSBvdmVydmlldyBwYWdlIGludG8gd2hhdGV2ZXIKLSBncm91cHMgeW91IHNwZWNpZnksIG9uZSBncm91cCBwZXIgdGFibGUuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImxpbmsiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmFkb2MuTGlua0FyZ3VtZW50IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGUgbGluayB0byBqYXZhZG9jIG91dHB1dCBhdCB0aGUgZ2l2ZW4gVVJMLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtDcmVhdGUgbGluayB0byBqYXZhZG9jIG91dHB1dCBhdCB0aGUgZ2l2ZW4gVVJMLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJzb3VyY2VwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ3JlYXRlIGEgcGF0aCB0byBiZSBjb25maWd1cmVkIHdpdGggdGhlIGxvY2F0aW9ucyBvZiB0aGUgc291cmNlCi0gZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0NyZWF0ZSBhIHBhdGggdG8gYmUgY29uZmlndXJlZCB3aXRoIHRoZSBsb2NhdGlvbnMgb2YgdGhlIHNvdXJjZQotIGZpbGVzLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJ0YWciIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmFkb2MuVGFnQXJndW1lbnQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NyZWF0ZXMgYW5kIGFkZHMgYSAtdGFnIGFyZ3VtZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtDcmVhdGVzIGFuZCBhZGRzIGEgLXRhZyBhcmd1bWVudC4gVGhpcyBpcyB1c2VkIHRvIHNwZWNpZnkKLSBjdXN0b20gdGFncy4gVGhpcyBhcmd1bWVudCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgSmF2YURvYyAxLjQsCi0gYW5kIHdpbGwgZ2VuZXJhdGUgYSB2ZXJib3NlIG1lc3NhZ2UgKGFuZCB0aGVuIGJlIGlnbm9yZWQpCi0gd2hlbiBydW4gb24gSmF2YSB2ZXJzaW9ucyBiZWxvdyAxLjQuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iamF2YWgiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuSmF2YWgiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0dlbmVyYXRlcyBKTkkgaGVhZGVyIGZpbGVzIHVzaW5nIGphdmFoLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtHZW5lcmF0ZXMgSk5JIGhlYWRlciBmaWxlcyB1c2luZyBqYXZhaC4KLQotIFRoaXMgdGFzayBjYW4gdGFrZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czoKLSA8dWw+Ci0gPGxpPmNsYXNzbmFtZSAtIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzPC9saT4KLSA8bGk+b3V0cHV0RmlsZSAtIENvbmNhdGVuYXRlcyB0aGUgcmVzdWx0aW5nIGhlYWRlciBvciBzb3VyY2UgZmlsZXMgZm9yIGFsbAotICAgICB0aGUgY2xhc3NlcyBsaXN0ZWQgaW50byB0aGlzIGZpbGU8L2xpPgotIDxsaT5kZXN0ZGlyIC0gU2V0cyB0aGUgZGlyZWN0b3J5IHdoZXJlIGphdmFoIHNhdmVzIHRoZSBoZWFkZXIgZmlsZXMgb3IgdGhlCi0gICAgIHN0dWIgZmlsZXM8L2xpPgotIDxsaT5jbGFzc3BhdGg8L2xpPgotIDxsaT5ib290Y2xhc3NwYXRoPC9saT4KLSA8bGk+Zm9yY2UgLSBTcGVjaWZpZXMgdGhhdCBvdXRwdXQgZmlsZXMgc2hvdWxkIGFsd2F5cyBiZSB3cml0dGVuCi0oSkRLMS4yIG9ubHkpPC9saT4KLSA8bGk+b2xkIC0gU3BlY2lmaWVzIHRoYXQgb2xkIEpESzEuMC1zdHlsZSBoZWFkZXIgZmlsZXMgc2hvdWxkIGJlIGdlbmVyYXRlZAotICAgICAob3RoZXJ3aXNlIG91dHB1dCBmaWxlIGNvbnRhaW4gSk5JLXN0eWxlIG5hdGl2ZSBtZXRob2QKLSAgICAgIGZ1bmN0aW9uIHByb3RvdHlwZXMpIChKREsxLjIgb25seSk8L2xpPgotIDxsaT5zdHVicyAtIGdlbmVyYXRlIEMgZGVjbGFyYXRpb25zIGZyb20gdGhlIEphdmEgb2JqZWN0IGZpbGUgKHVzZWQgd2l0aCBvbGQpPC9saT4KLSA8bGk+dmVyYm9zZSAtIGNhdXNlcyBqYXZhaCB0byBwcmludCBhIG1lc3NhZ2UgdG8gc3Rkb3V0IGNvbmNlcm5pbmcgdGhlIHN0YXR1cwotICAgICBvZiB0aGUgZ2VuZXJhdGVkIGZpbGVzPC9saT4KLSA8bGk+ZXh0ZGlycyAtIE92ZXJyaWRlIGxvY2F0aW9uIG9mIGluc3RhbGxlZCBleHRlbnNpb25zPC9saT4KLSA8L3VsPgotIE9mIHRoZXNlIGFyZ3VtZW50cywgZWl0aGVyIDxiPm91dHB1dEZpbGU8L2I+IG9yIDxiPmRlc3RkaXI8L2I+IGlzIHJlcXVpcmVkLAotIGJ1dCBub3QgYm90aC4gTW9yZSB0aGFuIG9uZSBjbGFzc25hbWUgbWF5IGJlIHNwZWNpZmllZCwgdXNpbmcgYSBjb21tYS1zZXBhcmF0ZWQKLSBsaXN0IG9yIGJ5IHVzaW5nIDxjb2RlPiZsdDtjbGFzcyBuYW1lPSJ4eHgiJmd0OzwvY29kZT4gZWxlbWVudHMgd2l0aGluIHRoZSB0YXNrLgotIDxwPgotIFdoZW4gdGhpcyB0YXNrIGV4ZWN1dGVzLCBpdCB3aWxsIGdlbmVyYXRlIEMgaGVhZGVyIGFuZCBzb3VyY2UgZmlsZXMgdGhhdAotIGFyZSBuZWVkZWQgdG8gaW1wbGVtZW50IG5hdGl2ZSBtZXRob2RzLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYm9vdGNsYXNzcGF0aHJlZiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlJlZmVyZW5jZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHJlZmVyZW5jZSB0byBhIGNsYXNzcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgQWRkcyBhIHJlZmVyZW5jZSB0byBhIGNsYXNzcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJib290Y2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xvY2F0aW9uIG9mIGJvb3RzdHJhcCBjbGFzcyBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgbG9jYXRpb24gb2YgYm9vdHN0cmFwIGNsYXNzIGZpbGVzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyAob3IgY2xhc3Nlcywgc2VwYXJhdGVkIGJ5IGNvbW1hcykuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MgKG9yIGNsYXNzZXMsIHNlcGFyYXRlZCBieSBjb21tYXMpLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgY2xhc3NwYXRoIHRvIHVzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgdGhlIGNsYXNzcGF0aCB0byB1c2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRocmVmIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2UiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUmVmZXJlbmNlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgcmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoIGRlZmluZWQgZWxzZXdoZXJlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBBZGRzIGEgcmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoIGRlZmluZWQgZWxzZXdoZXJlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3RkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZXN0aW5hdGlvbiBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgSmF2YSBzb3VyY2UKLSBmaWxlcyBzaG91bGQgYmUgY29tcGlsZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIEphdmEgc291cmNlCi0gZmlsZXMgc2hvdWxkIGJlIGNvbXBpbGVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZvcmNlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIG91dHB1dCBmaWxlcyBzaG91bGQgYWx3YXlzIGJlIHdyaXR0ZW4gKEpESzEuMiBvbmx5KS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgb3V0cHV0IGZpbGVzIHNob3VsZCBhbHdheXMgYmUgd3JpdHRlbiAoSkRLMS4yIG9ubHkpLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im9sZCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBzcGVjaWZpZXMgdGhhdCBvbGQgSkRLMS4wLXN0eWxlIGhlYWRlciBmaWxlcyBzaG91bGQgYmUKLSBnZW5lcmF0ZWQuCi0gKG90aGVyd2lzZSBvdXRwdXQgZmlsZSBjb250YWluIEpOSS1zdHlsZSBuYXRpdmUgbWV0aG9kIGZ1bmN0aW9uIHByb3RvdHlwZXMpIChKREsxLjIgb25seSkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIHNwZWNpZmllcyB0aGF0IG9sZCBKREsxLjAtc3R5bGUgaGVhZGVyIGZpbGVzIHNob3VsZCBiZQotIGdlbmVyYXRlZC4KLSAob3RoZXJ3aXNlIG91dHB1dCBmaWxlIGNvbnRhaW4gSk5JLXN0eWxlIG5hdGl2ZSBtZXRob2QgZnVuY3Rpb24gcHJvdG90eXBlcykgKEpESzEuMiBvbmx5KQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im91dHB1dGZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDb25jYXRlbmF0ZXMgdGhlIHJlc3VsdGluZyBoZWFkZXIgb3Igc291cmNlIGZpbGVzIGZvciBhbGwKLSB0aGUgY2xhc3NlcyBsaXN0ZWQgaW50byB0aGlzIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIENvbmNhdGVuYXRlcyB0aGUgcmVzdWx0aW5nIGhlYWRlciBvciBzb3VyY2UgZmlsZXMgZm9yIGFsbAotIHRoZSBjbGFzc2VzIGxpc3RlZCBpbnRvIHRoaXMgZmlsZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdHVicyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBnZW5lcmF0ZSBDIGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBKYXZhIG9iamVjdCBmaWxlICh1c2VkIHdpdGggb2xkKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgZ2VuZXJhdGUgQyBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgSmF2YSBvYmplY3QgZmlsZSAodXNlZCB3aXRoIG9sZCkuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyYm9zZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBjYXVzZXMgSmF2YWggdG8gcHJpbnQgYSBtZXNzYWdlIGNvbmNlcm5pbmcKLSB0aGUgc3RhdHVzIG9mIHRoZSBnZW5lcmF0ZWQgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGNhdXNlcyBKYXZhaCB0byBwcmludCBhIG1lc3NhZ2UgY29uY2VybmluZwotIHRoZSBzdGF0dXMgb2YgdGhlIGdlbmVyYXRlZCBmaWxlcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImJvb3RjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIHBhdGggdG8gYm9vdHN0cmFwIGNsYXNzIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIHBhdGggdG8gYm9vdHN0cmFwIGNsYXNzIGZpbGVzLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJjbGFzcyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuSmF2YWguQ2xhc3NBcmd1bWVudCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBjbGFzcyB0byBwcm9jZXNzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGNsYXNzIHRvIHByb2Nlc3MuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BhdGggdG8gdXNlIGZvciBjbGFzc3BhdGguXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW1BhdGggdG8gdXNlIGZvciBjbGFzc3BhdGguXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iamRlcGVuZCIgY2F0ZWdvcnk9Im90aGVyIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qZGVwZW5kLkpEZXBlbmRUYXNrIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtSdW5zIEpEZXBlbmQgdGVzdHMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW1J1bnMgSkRlcGVuZCB0ZXN0cy4KLQotIDxwPkpEZXBlbmQgaXMgYSB0b29sIHRvIGdlbmVyYXRlIGRlc2lnbiBxdWFsaXR5IG1ldHJpY3MgZm9yIGVhY2ggSmF2YSBwYWNrYWdlLgotIEl0IGhhcyBiZWVuIGluaXRpYWxseSBjcmVhdGVkIGJ5IE1pa2UgQ2xhcmsuIEpEZXBlbmQgY2FuIGJlIGZvdW5kIGF0IDxhCi0gaHJlZj0iaHR0cDovL3d3dy5jbGFya3dhcmUuY29tL3NvZnR3YXJlL0pEZXBlbmQuaHRtbCI+aHR0cDovL3d3dy5jbGFya3dhcmUuY29tL3NvZnR3YXJlL0pEZXBlbmQuaHRtbDwvYT4uCi0KLSBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBzcGF3biBhIG5ldyBKYXZhIFZNLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aHJlZiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlJlZmVyZW5jZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHJlZmVyZW5jZSB0byBhIGNsYXNzcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgQWRkcyBhIHJlZmVyZW5jZSB0byBhIGNsYXNzcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZGlyZWN0b3J5IHRvIGludm9rZSB0aGUgVk0gaW4uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBkaXJlY3RvcnkgdG8gaW52b2tlIHRoZSBWTSBpbi4gSWdub3JlZCBpZiBubyBKVk0gaXMgZm9ya2VkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZvcmsiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgZm9ya3MgaW50byBhIG5ldyBKVk0uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGZvcmtzIGludG8gYSBuZXcgSlZNLiBEZWZhdWx0OiBmYWxzZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmb3JtYXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpkZXBlbmQuSkRlcGVuZFRhc2suRm9ybWF0QXR0cmlidXRlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O3htbCZxdW90OywgJnF1b3Q7dGV4dCZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGZvcm1hdCB0byB3cml0ZSB0aGUgb3V0cHV0IGluLCAieG1sIiBvciAidGV4dCIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBmb3JtYXQgdG8gd3JpdGUgdGhlIG91dHB1dCBpbiwgInhtbCIgb3IgInRleHQiLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImhhbHRvbmVycm9yIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgb3Igbm90IHRvIGhhbHQgb24gZmFpbHVyZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgV2hldGhlciBvciBub3QgdG8gaGFsdCBvbiBmYWlsdXJlLiBEZWZhdWx0OiBmYWxzZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJqdm0iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgY29tbWFuZCB1c2VkIHRvIGludm9rZSBhIGZvcmtlZCBKYXZhIFZpcnR1YWwgTWFjaGluZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGNvbW1hbmQgdXNlZCB0byBpbnZva2UgYSBmb3JrZWQgSmF2YSBWaXJ0dWFsIE1hY2hpbmUuCi0KLSBEZWZhdWx0IGlzIDx0dD5qYXZhPC90dD4uIElnbm9yZWQgaWYgbm8gSlZNIGlzIGZvcmtlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdXRwdXRmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG91dHB1dCBmaWxlIG5hbWUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBvdXRwdXQgZmlsZSBuYW1lLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHBhdGggdG8gdGhlIGNsYXNzcGF0aC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHBhdGggdG8gdGhlIGNsYXNzcGF0aC5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0ic291cmNlc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgcGF0aCB0byBzb3VyY2UgY29kZSB0byBhbmFseXplLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgcGF0aCB0byBzb3VyY2UgY29kZSB0byBhbmFseXplLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9ImpqdHJlZSIgY2F0ZWdvcnk9Im90aGVyIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qYXZhY2MuSkpUcmVlIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtSdW5zIHRoZSBKSlRyZWUgY29tcGlsZXIgY29tcGlsZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW1J1bnMgdGhlIEpKVHJlZSBjb21waWxlciBjb21waWxlci5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImJ1aWxkbm9kZWZpbGVzIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0JVSUxEX05PREVfRklMRVMgZ3JhbW1hciBvcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIEJVSUxEX05PREVfRklMRVMgZ3JhbW1hciBvcHRpb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iamF2YWNjaG9tZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgSmF2YUNDIGRpc3RyaWJ1dGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBKYXZhQ0MgZGlzdHJpYnV0aW9uLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im11bHRpIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW01VTFRJIGdyYW1tYXIgb3B0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBNVUxUSSBncmFtbWFyIG9wdGlvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJub2RlZGVmYXVsdHZvaWQiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTk9ERV9ERUZBVUxUX1ZPSUQgZ3JhbW1hciBvcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIE5PREVfREVGQVVMVF9WT0lEIGdyYW1tYXIgb3B0aW9uLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im5vZGVmYWN0b3J5IiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05PREVfRkFDVE9SWSBncmFtbWFyIG9wdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgTk9ERV9GQUNUT1JZIGdyYW1tYXIgb3B0aW9uLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im5vZGVwYWNrYWdlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTk9ERV9QQUNLQUdFIGdyYW1tYXIgb3B0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBOT0RFX1BBQ0tBR0UgZ3JhbW1hciBvcHRpb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibm9kZXByZWZpeCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05PREVfUFJFRklYIGdyYW1tYXIgb3B0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBOT0RFX1BSRUZJWCBncmFtbWFyIG9wdGlvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJub2Rlc2NvcGVob29rIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05PREVfU0NPUEVfSE9PSyBncmFtbWFyIG9wdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgTk9ERV9TQ09QRV9IT09LIGdyYW1tYXIgb3B0aW9uLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im5vZGV1c2VzcGFyc2VyIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05PREVfVVNFU19QQVJTRVIgZ3JhbW1hciBvcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIE5PREVfVVNFU19QQVJTRVIgZ3JhbW1hciBvcHRpb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3V0cHV0ZGlyZWN0b3J5IiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGRpcmVjdG9yeSB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIGZpbGUgdG8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBkaXJlY3RvcnkgdG8gd3JpdGUgdGhlIGdlbmVyYXRlZCBmaWxlIHRvLgotIElmIG5vdCBzZXQsIHRoZSBmaWxlcyBhcmUgd3JpdHRlbiB0byB0aGUgZGlyZWN0b3J5Ci0gY29udGFpbmluZyB0aGUgZ3JhbW1hciBmaWxlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InN0YXRpYyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTVEFUSUMgZ3JhbW1hciBvcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIFNUQVRJQyBncmFtbWFyIG9wdGlvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgamp0cmVlIGdyYW1tYXIgZmlsZSB0byBwcm9jZXNzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgamp0cmVlIGdyYW1tYXIgZmlsZSB0byBwcm9jZXNzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZpc2l0b3IiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVklTSVRPUiBncmFtbWFyIG9wdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgVklTSVRPUiBncmFtbWFyIG9wdGlvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2aXNpdG9yZXhjZXB0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVklTSVRPUl9FWENFUFRJT04gZ3JhbW1hciBvcHRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIFZJU0lUT1JfRVhDRVBUSU9OIGdyYW1tYXIgb3B0aW9uLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJqcGNvdmVyYWdlIiBjYXRlZ29yeT0ibWV0cmljcyIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2l0cmFrYS5Db3ZlcmFnZSIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUnVucyBTaXRyYWthIEpQcm9iZSBDb3ZlcmFnZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbUnVucyBTaXRyYWthIEpQcm9iZSBDb3ZlcmFnZS4KLQotIE9wdGlvbnMgYXJlIHByZXR0eSBudW1lcm91cywgeW91J2QgYmV0dGVyIGNoZWNrIHRoZSBtYW51YWwgZm9yIGEgZnVsbAotIGRlc2NyaXB0aW9ucyBvZiBvcHRpb25zLiAobm90IHRoYXQgc2ltcGxlIHNpbmNlIHRoZXkgZGlmZmVyIGZyb20gdGhlIG9ubGluZQotIGhlbHAsIGZyb20gdGhlIHVzYWdlIGNvbW1hbmQgbGluZSBhbmQgZnJvbSB0aGUgZXhhbXBsZXMuLi4pCi0gPHA+Ci0gRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIHZpc2l0IDxhIGhyZWY9Imh0dHA6Ly93d3cuc2l0cmFrYS5jb20iPnd3dy5zaXRyYWthLmNvbTwvYT5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImFwcGxldCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBydW4gYW4gYXBwbGV0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCBydW4gYW4gYXBwbGV0LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzbmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NsYXNzbmFtZSB0byBydW4gYXMgc3RhbmRhbG9uZSBvciBydW5uZXIgZm9yIGZpbGVzZXRzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBjbGFzc25hbWUgdG8gcnVuIGFzIHN0YW5kYWxvbmUgb3IgcnVubmVyIGZvciBmaWxlc2V0cy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleGl0cHJvbXB0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVG9nZ2xlcyBkaXNwbGF5IG9mIHRoZSBjb25zb2xlIHByb21wdDogYWx3YXlzLCBlcnJvciwgbmV2ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRvZ2dsZXMgZGlzcGxheSBvZiB0aGUgY29uc29sZSBwcm9tcHQ6IGFsd2F5cywgZXJyb3IsIG5ldmVyCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmluYWxzbmFwc2hvdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1R5cGUgb2Ygc25hcHNob3QgdG8gc2VuZCBhdCBwcm9ncmFtIHRlcm1pbmF0aW9uOiBub25lLCBjb3ZlcmFnZSwgYWxsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUeXBlIG9mIHNuYXBzaG90IHRvIHNlbmQgYXQgcHJvZ3JhbSB0ZXJtaW5hdGlvbjogbm9uZSwgY292ZXJhZ2UsIGFsbC4KLSBDYW4gYmUgbnVsbCwgZGVmYXVsdCB0byBub25lCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaG9tZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBkaXJlY3Rvcnkgd2hlcmUgSlByb2JlIGlzIGluc3RhbGxlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGRpcmVjdG9yeSB3aGVyZSBKUHJvYmUgaXMgaW5zdGFsbGVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImphdmFleGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQYXRoIHRvIHRoZSBqYXZhIGV4ZWN1dGFibGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFBhdGggdG8gdGhlIGphdmEgZXhlY3V0YWJsZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZWNvcmRmcm9tc3RhcnQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNpdHJha2EuQ292ZXJhZ2UuUmVjb3JkZnJvbXN0YXJ0IgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O2NvdmVyYWdlJnF1b3Q7LCAmcXVvdDtub25lJnF1b3Q7LCAmcXVvdDthbGwmcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBWyJhbGwiLCAiY292ZXJhZ2UiLCAgb3IgIm5vbmUiLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICAiYWxsIiwgImNvdmVyYWdlIiwgIG9yICJub25lIi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZWVkbmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NlZWQgbmFtZSBmb3Igc25hcHNob3QgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgc2VlZCBuYW1lIGZvciBzbmFwc2hvdCBmaWxlLiBDYW4gYmUgbnVsbCwgZGVmYXVsdCB0byBzbmFwCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic25hcHNob3RkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHNuYXBzaG90IGZpbGVzIGFyZSBzdG9yZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBwYXRoIHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgc25hcHNob3QgZmlsZXMgYXJlIHN0b3JlZC4KLSBDaG9vc2UgYSBkaXJlY3RvcnkgdGhhdCBpcyByZWFjaGFibGUgYnkgYm90aCB0aGUgcmVtb3RlCi0gYW5kIGxvY2FsIGNvbXB1dGVycywgYW5kIGVudGVyIHRoZSBzYW1lIHBhdGggb24gdGhlIGNvbW1hbmQtbGluZQotIGFuZCBpbiB0aGUgdmlld2VyLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRyYWNrbmF0aXZlcyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCB0cmFjayBuYXRpdmUgbWV0aG9kcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgdHJhY2sgbmF0aXZlIG1ldGhvZHMuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idm0iIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNpdHJha2EuQ292ZXJhZ2UuSmF2YXZtIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O2phdmEyJnF1b3Q7LCAmcXVvdDtqZGsxMTgmcXVvdDssICZxdW90O2pkazExNyZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSW5kaWNhdGVzIHdoaWNoIHZpcnR1YWwgbWFjaGluZSB0byBydW46ICJqZGsxMTciLCAiamRrMTE4IiBvciAiamF2YTIiLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJbmRpY2F0ZXMgd2hpY2ggdmlydHVhbCBtYWNoaW5lIHRvIHJ1bjogImpkazExNyIsICJqZGsxMTgiIG9yICJqYXZhMiIuCi0gQ2FuIGJlIG51bGwsIGRlZmF1bHQgdG8gImphdmEyIi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3YXJubGV2ZWwiIHR5cGU9ImphdmEubGFuZy5JbnRlZ2VyIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IHdhcm5pbmcgbGV2ZWwgKDAtMywgd2hlcmUgMCBpcyB0aGUgbGVhc3QgYW1vdW50IG9mIHdhcm5pbmdzKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHdhcm5pbmcgbGV2ZWwgKDAtMywgd2hlcmUgMCBpcyB0aGUgbGVhc3QgYW1vdW50IG9mIHdhcm5pbmdzKS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3b3JraW5nZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHBoeXNpY2FsIHBhdGggdG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgVk0uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBwaHlzaWNhbCBwYXRoIHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIFZNLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBjbGFzc25hbWVzIHRvIGV4ZWN1dGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW3RoZSBjbGFzc25hbWVzIHRvIGV4ZWN1dGUuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImFyZyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmUuQXJndW1lbnQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBjb21tYW5kIGFyZ3VtZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgY29tbWFuZCBhcmd1bWVudC5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3NwYXRoIHRvIHJ1biB0aGUgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW2NsYXNzcGF0aCB0byBydW4gdGhlIGZpbGVzLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJmaWx0ZXJzIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zaXRyYWthLkZpbHRlcnMiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RlZmluZXMgY2xhc3MvbWV0aG9kIGZpbHRlcnMgYmFzZWQgb24gcGF0dGVybiBtYXRjaGluZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbRGVmaW5lcyBjbGFzcy9tZXRob2QgZmlsdGVycyBiYXNlZCBvbiBwYXR0ZXJuIG1hdGNoaW5nLgotIFRoZSBzeW50YXggaXMgZmlsdGVycyBpcyBzaW1pbGFyIHRvIGEgZmlsZXNldC5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0ianZtYXJnIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZS5Bcmd1bWVudCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIEpWTSBhcmd1bWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIEpWTSBhcmd1bWVudC5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0ic29ja2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zaXRyYWthLlNvY2tldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVmaW5lIGEgaG9zdCBhbmQgcG9ydCB0byBjb25uZWN0IHRvIGlmIHlvdSB3YW50IHRvIGRvCi0gcmVtb3RlIHZpZXdpbmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0RlZmluZSBhIGhvc3QgYW5kIHBvcnQgdG8gY29ubmVjdCB0byBpZiB5b3Ugd2FudCB0byBkbwotIHJlbW90ZSB2aWV3aW5nLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJ0cmlnZ2VycyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2l0cmFrYS5UcmlnZ2VycyIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVmaW5lcyBldmVudHMgdG8gdXNlIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZQotIGNvbGxlY3Rpb24gb2YgZGF0YSBwZXJmb3JtZWQgZHVyaW5nIGNvdmVyYWdlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtEZWZpbmVzIGV2ZW50cyB0byB1c2UgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlCi0gY29sbGVjdGlvbiBvZiBkYXRhIHBlcmZvcm1lZCBkdXJpbmcgY292ZXJhZ2UuCi0KLSBGb3IgZXhhbXBsZSB5b3UgbWF5IHJ1biBhIHdob2xlIGFwcGxpY2F0aW9uIGJ1dCBvbmx5IGRlY2lkZQotIHRvIGNvbGxlY3QgZGF0YSBvbmNlIGl0IHJlYWNoZXMgYSBjZXJ0YWluIG1ldGhvZCBhbmQgb25jZSBpdAotIGV4aXRzIGFub3RoZXIgb25lLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9ImpwY292bWVyZ2UiIGNhdGVnb3J5PSJtZXRyaWNzIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zaXRyYWthLkNvdk1lcmdlIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtSdW5zIHRoZSBzbmFwc2hvdCBtZXJnZSB1dGlsaXR5IGZvciBKUHJvYmUgQ292ZXJhZ2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW1J1bnMgdGhlIHNuYXBzaG90IG1lcmdlIHV0aWxpdHkgZm9yIEpQcm9iZSBDb3ZlcmFnZS5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImhvbWUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZGlyZWN0b3J5IHdoZXJlIEpQcm9iZSBpcyBpbnN0YWxsZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBkaXJlY3Rvcnkgd2hlcmUgSlByb2JlIGlzIGluc3RhbGxlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0b2ZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPdXRwdXQgc25hcHNob3QgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBvdXRwdXQgc25hcHNob3QgZmlsZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJib3NlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHBlcmZvcm0gdGhlIG1lcmdlIGluIHZlcmJvc2UgbW9kZSBnaXZpbmcgZGV0YWlscwotIGFib3V0IHRoZSBzbmFwc2hvdCBwcm9jZXNzaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCBwZXJmb3JtIHRoZSBtZXJnZSBpbiB2ZXJib3NlIG1vZGUgZ2l2aW5nIGRldGFpbHMKLSBhYm91dCB0aGUgc25hcHNob3QgcHJvY2Vzc2luZy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGVzZXQiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSBmaWxlc2V0IGNvbnRhaW5pbmcgdGhlIHNuYXBzaG90cyB0byBpbmNsdWRlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVthZGQgYSBmaWxlc2V0IGNvbnRhaW5pbmcgdGhlIHNuYXBzaG90cyB0byBpbmNsdWRlLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9ImpwY292cmVwb3J0IiBjYXRlZ29yeT0ibWV0cmljcyIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2l0cmFrYS5Db3ZSZXBvcnQiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1J1bnMgdGhlIEpQcm9iZSBDb3ZlcmFnZSAzLjAgc25hcHNob3QgbWVyZ2UgdXRpbGl0eS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbUnVucyB0aGUgSlByb2JlIENvdmVyYWdlIDMuMCBzbmFwc2hvdCBtZXJnZSB1dGlsaXR5Ll1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZm9ybWF0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zaXRyYWthLkNvdlJlcG9ydC5SZXBvcnRGb3JtYXQiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7aHRtbCZxdW90OywgJnF1b3Q7dGV4dCZxdW90OywgJnF1b3Q7eG1sJnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGb3JtYXQgb2YgdGhlIHJlcG9ydDogImh0bWwiLCAidGV4dCIsIG9yICJ4bWwiLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBzZXQgdGhlIGZvcm1hdCBvZiB0aGUgcmVwb3J0OiAiaHRtbCIsICJ0ZXh0Iiwgb3IgInhtbCIKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJob21lIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGRpcmVjdG9yeSB3aGVyZSBKUHJvYmUgaXMgaW5zdGFsbGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgZGlyZWN0b3J5IHdoZXJlIEpQcm9iZSBpcyBpbnN0YWxsZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5jbHVkZXNvdXJjZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBpbmNsdWRlIHRleHQgb2YgdGhlIHNvdXJjZSBjb2RlIGxpbmVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCBpbmNsdWRlIHRleHQgb2YgdGhlIHNvdXJjZSBjb2RlIGxpbmVzLgotIE9ubHkgYXBwbGllcyB0byBmb3JtYXQ9InhtbCIgYW5kIHR5cGU9InZlcnlkZXRhaWxlZCIKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwZXJjZW50IiB0eXBlPSJqYXZhLmxhbmcuSW50ZWdlciIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJpbnQiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0EgbnVtZXJpYyB2YWx1ZSBmb3IgdGhlIHRocmVzaG9sZCBmb3IgcHJpbnRpbmcgbWV0aG9kcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgQSBudW1lcmljIHZhbHVlIGZvciB0aGUgdGhyZXNob2xkIGZvciBwcmludGluZyBtZXRob2RzLgotIE11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic25hcHNob3QiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbmFtZSBvZiB0aGUgc25hcHNob3QgZmlsZSB0aGF0IGlzIHRoZSBzb3VyY2UgdG8gdGhlIHJlcG9ydC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHNuYXBzaG90IGZpbGUgdGhhdCBpcyB0aGUgc291cmNlIHRvIHRoZSByZXBvcnQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idG9maWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBvdXRwdXQgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBvdXRwdXQgZmlsZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zaXRyYWthLkNvdlJlcG9ydC5SZXBvcnRUeXBlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O2V4ZWN1dGl2ZSZxdW90OywgJnF1b3Q7c3VtbWFyeSZxdW90OywgJnF1b3Q7ZGV0YWlsZWQmcXVvdDssICZxdW90O3ZlcnlkZXRhaWxlZCZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHR5cGUgb2YgcmVwb3J0IHRvIGJlIGdlbmVyYXRlZDogImV4ZWN1dGl2ZSIsICJzdW1tYXJ5IiwKLSAiZGV0YWlsZWQiIG9yICJ2ZXJ5ZGV0YWlsZWQiLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgdHlwZSBvZiByZXBvcnQgdG8gYmUgZ2VuZXJhdGVkOiAiZXhlY3V0aXZlIiwgInN1bW1hcnkiLAotICJkZXRhaWxlZCIgb3IgInZlcnlkZXRhaWxlZCIuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNpdHJha2EuQ292UmVwb3J0LlJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBjbGFzc2VzIHdob3NlIGNvdmVyYWdlIGluZm9ybWF0aW9uIHdpbGwgYmUKLSBjaGVja2VkIGFnYWluc3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgY2xhc3NlcyB3aG9zZSBjb3ZlcmFnZSBpbmZvcm1hdGlvbiB3aWxsIGJlCi0gY2hlY2tlZCBhZ2FpbnN0Ll1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJzb3VyY2VwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHBhdGggdG8gc291cmNlIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgcGF0aCB0byBzb3VyY2UgZmlsZXMuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0ianNwYyIgY2F0ZWdvcnk9Im90aGVyIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qc3AuSnNwQyIKLSAgICAgIG1hdGNoaW5nVGFzaz0idHJ1ZSI+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1J1bnMgYSBKU1AgY29tcGlsZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW1J1bnMgYSBKU1AgY29tcGlsZXIuCi0KLSA8cD4gVGhpcyB0YXNrIHRha2VzIHRoZSBnaXZlbiBqc3AgZmlsZXMgYW5kIGNvbXBpbGVzIHRoZW0gaW50byBqYXZhCi0gZmlsZXMuIEl0IGlzIHRoZW4gdXAgdG8gdGhlIHVzZXIgdG8gY29tcGlsZSB0aGUgamF2YSBmaWxlcyBpbnRvIGNsYXNzZXMuCi0KLSA8cD4gVGhlIHRhc2sgcmVxdWlyZXMgdGhlIHNyY2RpciBhbmQgZGVzdGRpciBhdHRyaWJ1dGVzIHRvIGJlCi0gc2V0LiBUaGlzIFRhc2sgaXMgYSBNYXRjaGluZ1Rhc2ssIHNvIHRoZSBmaWxlcyB0byBiZSBjb21waWxlZCBjYW4gYmUKLSBzcGVjaWZpZWQgdXNpbmcgaW5jbHVkZXMvZXhjbHVkZXMgYXR0cmlidXRlcyBvciBuZXN0ZWQgaW5jbHVkZS9leGNsdWRlCi0gZWxlbWVudHMuIE9wdGlvbmFsIGF0dHJpYnV0ZXMgYXJlIHZlcmJvc2UgKHNldCB0aGUgdmVyYm9zaXR5IGxldmVsIHBhc3NlZAotIHRvIGphc3BlciksIHBhY2thZ2UgKG5hbWUgb2YgdGhlIGRlc3RpbmF0aW9uIHBhY2thZ2UgZm9yIGdlbmVyYXRlZCBqYXZhCi0gY2xhc3NlcyBhbmQgY2xhc3NwYXRoICh0aGUgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIHJ1bm5pbmcgdGhlIGpzcAotIGNvbXBpbGVyKS4KLSA8cD4gVGhpcyB0YXNrIHN1cHBvcnRzIHRoZSBuZXN0ZWQgZWxlbWVudHMgY2xhc3NwYXRoIChBIFBhdGgpIGFuZAotIGNsYXNzcGF0aHJlZiAoQSBSZWZlcmVuY2UpIHdoaWNoIGNhbiBiZSB1c2VkIGluIHByZWZlcmVuY2UgdG8gdGhlCi0gYXR0cmlidXRlIGNsYXNzcGF0aCwgaWYgdGhlIGpzcCBjb21waWxlciBpcyBub3QgYWxyZWFkeSBpbiB0aGUgYW50Ci0gY2xhc3NwYXRoLgotCi0gPHA+PGg0PlVzYWdlPC9oND4KLSA8cHJlPgotICZsdDtqc3BjIHNyY2Rpcj0iJHtiYXNlZGlyfS9zcmMvd2FyIgotICAgICAgIGRlc3RkaXI9IiR7YmFzZWRpcn0vZ2Vuc3JjIgotICAgICAgIHBhY2thZ2U9ImNvbS5pM3NwLmpzcCIKLSAgICAgICB2ZXJib3NlPSI5IiZndDsKLSAgICZsdDtpbmNsdWRlIG5hbWU9IioqXC8qLmpzcCIgLyZndDsKLSAmbHQ7L2pzcGMmZ3Q7Ci0gPC9wcmU+XV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgY29tcGlsYXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgY29tcGlsYXRpb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRocmVmIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2UiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUmVmZXJlbmNlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgcmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoIGRlZmluZWQgZWxzZXdoZXJlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBBZGRzIGEgcmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoIGRlZmluZWQgZWxzZXdoZXJlCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tcGlsZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzcyBuYW1lIG9mIGEgSlNQIGNvbXBpbGVyIGFkYXB0ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIENsYXNzIG5hbWUgb2YgYSBKU1AgY29tcGlsZXIgYWRhcHRlci4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21waWxlcmNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzc3BhdGggdG8gYmUgdXNlZCB0byBmaW5kIHRoaXMgY29tcGlsZXIgYWRhcHRlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCB0byBmaW5kIHRoaXMgY29tcGlsZXIgYWRhcHRlcgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3RkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZXN0aW5hdGlvbiBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgSlNQIHNvdXJjZQotIGZpbGVzIHNob3VsZCBiZSBjb21waWxlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgSlNQIHNvdXJjZQotIGZpbGVzIHNob3VsZCBiZSBjb21waWxlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIG9yIG5vdCB0aGUgYnVpbGQgc2hvdWxkIGhhbHQgaWYgY29tcGlsYXRpb24gZmFpbHMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFdoZXRoZXIgb3Igbm90IHRoZSBidWlsZCBzaG91bGQgaGFsdCBpZiBjb21waWxhdGlvbiBmYWlscy4KLSBEZWZhdWx0cyB0byA8Y29kZT50cnVlPC9jb2RlPi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZXBsdWdpbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0phdmEgUGx1Z2luIENMQVNTSUQgZm9yIEludGVybmV0IEV4cGxvcmVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBKYXZhIFBsdWdpbiBDTEFTU0lEIGZvciBJbnRlcm5ldCBFeHBsb3JlcgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im1hcHBlZCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBnZW5lcmF0ZSBzZXBhcmF0ZSB3cml0ZSgpIGNhbGxzIGZvciBlYWNoIEhUTUwgbGluZQotIGluIHRoZSBKU1AuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGdlbmVyYXRlIHNlcGFyYXRlIHdyaXRlKCkgY2FsbHMgZm9yIGVhY2ggSFRNTCBsaW5lCi0gaW4gdGhlIEpTUC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYWNrYWdlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTmFtZSBvZiB0aGUgcGFja2FnZSB0aGUgY29tcGlsZWQganNwIGZpbGVzIHNob3VsZCBiZSBpbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRoZSBjb21waWxlZCBqc3AgZmlsZXMgc2hvdWxkIGJlIGluLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNyY2RpciIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQYXRoIGZvciBzb3VyY2UgSlNQIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBQYXRoIGZvciBzb3VyY2UgSlNQIGZpbGVzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InVyaWJhc2UiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgVVJJIGNvbnRleHQgb2YgcmVsYXRpdmUgVVJJIHJlZmVyZW5jZXMgaW4gdGhlIEpTUCBwYWdlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIFVSSSBjb250ZXh0IG9mIHJlbGF0aXZlIFVSSSByZWZlcmVuY2VzIGluIHRoZSBKU1AgcGFnZXMuCi0gSWYgaXQgZG9lcyBub3QgZXhpc3QgdGhlbiBpdCBpcyBkZXJpdmVkIGZyb20gdGhlIGxvY2F0aW9uCi0gb2YgdGhlIGZpbGUgcmVsYXRpdmUgdG8gdGhlIGRlY2xhcmVkIG9yIGRlcml2ZWQgdmFsdWUgb2YgdXJpcm9vdC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cmlyb290IiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHJvb3QgZGlyZWN0b3J5IHRoYXQgdXJpIGZpbGVzIHNob3VsZCBiZSByZXNvbHZlZAotICBhZ2FpbnN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgcm9vdCBkaXJlY3RvcnkgdGhhdCB1cmkgZmlsZXMgc2hvdWxkIGJlIHJlc29sdmVkCi0gIGFnYWluc3QuIChEZWZhdWx0IGlzIHRoZSBkaXJlY3RvcnkganNwYyBpcyBpbnZva2VkIGZyb20pCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyYm9zZSIgdHlwZT0iaW50IgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVmVyYm9zZSBsZXZlbCBvZiB0aGUgY29tcGlsZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgdmVyYm9zZSBsZXZlbCBvZiB0aGUgY29tcGlsZXIKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3ZWJpbmMiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPdXRwdXQgZmlsZW5hbWUgZm9yIHRoZSBmcmFjdGlvbiBvZiB3ZWIueG1sIHRoYXQgbGlzdHMKLSAgc2VydmxldHMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIG91dHB1dCBmaWxlbmFtZSBmb3IgdGhlIGZyYWN0aW9uIG9mIHdlYi54bWwgdGhhdCBsaXN0cwotICBzZXJ2bGV0cy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3ZWJ4bWwiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGaWxlbmFtZSBmb3Igd2ViLnhtbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgRmlsZW5hbWUgZm9yIHdlYi54bWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJ3ZWJhcHAiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpzcC5Kc3BDLldlYkFwcFBhcmFtZXRlciIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHNpbmdsZSB3ZWJhcHAuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBzaW5nbGUgd2ViYXBwLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgcGF0aCB0byB0aGUgY2xhc3NwYXRoLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgcGF0aCB0byB0aGUgY2xhc3NwYXRoLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJjb21waWxlcmNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1N1cHBvcnQgbmVzdGVkIGNvbXBpbGVyIGNsYXNzcGF0aCwgdXNlZCB0byBsb2NhdGUgY29tcGlsZXIgYWRhcHRlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbU3VwcG9ydCBuZXN0ZWQgY29tcGlsZXIgY2xhc3NwYXRoLCB1c2VkIHRvIGxvY2F0ZSBjb21waWxlciBhZGFwdGVyXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0ianVuaXQiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuSlVuaXRUYXNrIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtSdW5zIEpVbml0IHRlc3RzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtSdW5zIEpVbml0IHRlc3RzLgotCi0gPHA+IEpVbml0IGlzIGEgZnJhbWV3b3JrIHRvIGNyZWF0ZSB1bml0IHRlc3QuIEl0IGhhcyBiZWVuIGluaXRpYWxseQotIGNyZWF0ZWQgYnkgRXJpY2ggR2FtbWEgYW5kIEtlbnQgQmVjay4gIEpVbml0IGNhbiBiZSBmb3VuZCBhdCA8YQotIGhyZWY9Imh0dHA6Ly93d3cuanVuaXQub3JnIj5odHRwOi8vd3d3Lmp1bml0Lm9yZzwvYT4uCi0KLSA8cD4gPGNvZGU+SlVuaXRUYXNrPC9jb2RlPiBjYW4gcnVuIGEgc2luZ2xlIHNwZWNpZmljCi0gPGNvZGU+SlVuaXRUZXN0PC9jb2RlPiB1c2luZyB0aGUgPGNvZGU+dGVzdDwvY29kZT4gZWxlbWVudC48L3A+Ci0gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgdGFyZ2V0IDxjb2RlPjxwcmU+Ci0gICAmbHQ7dGFyZ2V0IG5hbWU9InRlc3QtaW50LWNoYXJzIiBkZXBlbmRzPSJqYXItdGVzdCImZ3Q7Ci0gICAgICAgJmx0O2VjaG8gbWVzc2FnZT0idGVzdGluZyBpbnRlcm5hdGlvbmFsIGNoYXJhY3RlcnMiLyZndDsKLSAgICAgICAmbHQ7anVuaXQgcHJpbnRzdW1tYXJ5PSJubyIgaGFsdG9uZmFpbHVyZT0ieWVzIiBmb3JrPSJmYWxzZSImZ3Q7Ci0gICAgICAgICAgICZsdDtjbGFzc3BhdGggcmVmaWQ9ImNsYXNzcGF0aCIvJmd0OwotICAgICAgICAgICAmbHQ7Zm9ybWF0dGVyIHR5cGU9InBsYWluIiB1c2VmaWxlPSJmYWxzZSIgLyZndDsKLSAgICAgICAgICAgJmx0O3Rlc3QgbmFtZT0ib3JnLmFwYWNoZS5lY3MuSW50ZXJuYXRpb25hbENoYXJUZXN0IiAvJmd0OwotICAgICAgICZsdDsvanVuaXQmZ3Q7Ci0gICAmbHQ7L3RhcmdldCZndDsKLSA8L3ByZT48L2NvZGU+Ci0gPHA+cnVucyBhIHNpbmdsZSBqdW5pdCB0ZXN0Ci0gKDxjb2RlPm9yZy5hcGFjaGUuZWNzLkludGVybmF0aW9uYWxDaGFyVGVzdDwvY29kZT4pIGluIHRoZSBjdXJyZW50Ci0gVk0gdXNpbmcgdGhlIHBhdGggd2l0aCBpZCA8Y29kZT5jbGFzc3BhdGg8L2NvZGU+IGFzIGNsYXNzcGF0aCBhbmQKLSBwcmVzZW50cyB0aGUgcmVzdWx0cyBmb3JtYXR0ZWQgdXNpbmcgdGhlIHN0YW5kYXJkCi0gPGNvZGU+cGxhaW48L2NvZGU+IGZvcm1hdHRlciBvbiB0aGUgY29tbWFuZCBsaW5lLjwvcD4KLQotIDxwPiBUaGlzIHRhc2sgY2FuIGFsc28gcnVuIGJhdGNoZXMgb2YgdGVzdHMuICBUaGUKLSA8Y29kZT5iYXRjaHRlc3Q8L2NvZGU+IGVsZW1lbnQgY3JlYXRlcyBhIDxjb2RlPkJhdGNoVGVzdDwvY29kZT4KLSBiYXNlZCBvbiBhIGZpbGVzZXQuICBUaGlzIGFsbG93cywgZm9yIGV4YW1wbGUsIGFsbCBjbGFzc2VzIGZvdW5kIGluCi0gZGlyZWN0b3J5IHRvIGJlIHJ1biBhcyB0ZXN0Y2FzZXMuPC9wPgotCi0gPHA+Rm9yIGV4YW1wbGUsPC9wPjxjb2RlPjxwcmU+Ci0gJmx0O3RhcmdldCBuYW1lPSJydW4tdGVzdHMiIGRlcGVuZHM9ImR1bXAtaW5mbyxjb21waWxlLXRlc3RzIiBpZj0ianVuaXQucHJlc2VudCImZ3Q7Ci0gICAmbHQ7anVuaXQgcHJpbnRzdW1tYXJ5PSJubyIgaGFsdG9uZmFpbHVyZT0ieWVzIiBmb3JrPSIke2p1bml0LmZvcmt9IiZndDsKLSAgICAgJmx0O2p2bWFyZyB2YWx1ZT0iLWNsYXNzaWMiLyZndDsKLSAgICAgJmx0O2NsYXNzcGF0aCByZWZpZD0idGVzdHMtY2xhc3NwYXRoIi8mZ3Q7Ci0gICAgICZsdDtzeXNwcm9wZXJ0eSBrZXk9ImJ1aWxkLnRlc3RzIiB2YWx1ZT0iJHtidWlsZC50ZXN0c30iLyZndDsKLSAgICAgJmx0O2Zvcm1hdHRlciB0eXBlPSJicmllZiIgdXNlZmlsZT0iZmFsc2UiIC8mZ3Q7Ci0gICAgICZsdDtiYXRjaHRlc3QmZ3Q7Ci0gICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIke3Rlc3RzLmRpcn0iJmd0OwotICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKiomIzA0NzsqVGVzdCoiIC8mZ3Q7Ci0gICAgICAgJmx0Oy9maWxlc2V0Jmd0OwotICAgICAmbHQ7L2JhdGNodGVzdCZndDsKLSAgICZsdDsvanVuaXQmZ3Q7Ci0gJmx0Oy90YXJnZXQmZ3Q7Ci0gPC9wcmU+PC9jb2RlPgotIDxwPnRoaXMgdGFyZ2V0IGZpbmRzIGFueSBjbGFzc2VzIHdpdGggYSA8Y29kZT50ZXN0PC9jb2RlPiBkaXJlY3RvcnkKLSBhbnl3aGVyZSBpbiB0aGVpciBwYXRoICh1bmRlciB0aGUgdG9wIDxjb2RlPiR7dGVzdHMuZGlyfTwvY29kZT4sIG9mCi0gY291cnNlKSBhbmQgY3JlYXRlcyA8Y29kZT5KVW5pdFRlc3Q8L2NvZGU+J3MgZm9yIGVhY2ggb25lLjwvcD4KLQotIDxwPiBPZiBjb3Vyc2UsIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+IGFuZAotIDxjb2RlPiZsdDtiYXRjaCZndDs8L2NvZGU+IGVsZW1lbnRzIGNhbiBiZSBjb21iaW5lZCBmb3IgbW9yZQotIGNvbXBsZXggdGVzdHMuIEZvciBhbiBleGFtcGxlLCBzZWUgdGhlIGFudCA8Y29kZT5idWlsZC54bWw8L2NvZGU+Ci0gdGFyZ2V0IDxjb2RlPnJ1bi10ZXN0czwvY29kZT4gKHRoZSBzZWNvbmQgZXhhbXBsZSBpcyBhbiBlZGl0ZWQKLSB2ZXJzaW9uKS48L3A+Ci0KLSA8cD4gVG8gc3Bhd24gYSBuZXcgSmF2YSBWTSB0byBwcmV2ZW50IGludGVyZmVyZW5jZXMgYmV0d2VlbgotIGRpZmZlcmVudCB0ZXN0Y2FzZXMsIHlvdSBuZWVkIHRvIGVuYWJsZSA8Y29kZT5mb3JrPC9jb2RlPi4gIEEKLSBudW1iZXIgb2YgYXR0cmlidXRlcyBhbmQgZWxlbWVudHMgYWxsb3cgeW91IHRvIHNldCB1cCBob3cgdGhpcyBKVk0KLSBydW5zLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGRpcmVjdG9yeSB0byBpbnZva2UgdGhlIFZNIGluLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgZGlyZWN0b3J5IHRvIGludm9rZSB0aGUgVk0gaW4uIElnbm9yZWQgaWYgbm8gSlZNIGlzIGZvcmtlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlcnJvcnByb3BlcnR5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUHJvcGVydHkgdG8gc2V0IHRvICJ0cnVlIiBpZiB0aGVyZSBpcyBhIGVycm9yIGluIGEgdGVzdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgUHJvcGVydHkgdG8gc2V0IHRvICJ0cnVlIiBpZiB0aGVyZSBpcyBhIGVycm9yIGluIGEgdGVzdC4KLQotIDxwPlRoaXMgcHJvcGVydHkgaXMgYXBwbGllZCBvbiBhbGwgQmF0Y2hUZXN0IChiYXRjaHRlc3QpIGFuZAotIEpVbml0VGVzdCAodGVzdCksIGhvd2V2ZXIsIGl0IGNhbiBwb3NzaWJseSBiZSBvdmVycmlkZW4gYnkKLSB0aGVpciBvd24gcHJvcGVydGllcy48L3A+Ci0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbHVyZXByb3BlcnR5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUHJvcGVydHkgdG8gc2V0IHRvICJ0cnVlIiBpZiB0aGVyZSBpcyBhIGZhaWx1cmUgaW4gYSB0ZXN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBQcm9wZXJ0eSB0byBzZXQgdG8gInRydWUiIGlmIHRoZXJlIGlzIGEgZmFpbHVyZSBpbiBhIHRlc3QuCi0KLSA8cD5UaGlzIHByb3BlcnR5IGlzIGFwcGxpZWQgb24gYWxsIEJhdGNoVGVzdCAoYmF0Y2h0ZXN0KSBhbmQKLSBKVW5pdFRlc3QgKHRlc3QpLCBob3dldmVyLCBpdCBjYW4gcG9zc2libHkgYmUgb3ZlcnJpZGVuIGJ5Ci0gdGhlaXIgb3duIHByb3BlcnRpZXMuPC9wPgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbHRlcnRyYWNlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHNtYXJ0bHkgZmlsdGVyIHRoZSBzdGFjayBmcmFtZXMgb2YKLSBKVW5pdCBlcnJvcnMgYW5kIGZhaWx1cmVzIGJlZm9yZSByZXBvcnRpbmcgdGhlbS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgc21hcnRseSBmaWx0ZXIgdGhlIHN0YWNrIGZyYW1lcyBvZgotIEpVbml0IGVycm9ycyBhbmQgZmFpbHVyZXMgYmVmb3JlIHJlcG9ydGluZyB0aGVtLgotCi0gPHA+VGhpcyBwcm9wZXJ0eSBpcyBhcHBsaWVkIG9uIGFsbCBCYXRjaFRlc3QgKGJhdGNodGVzdCkgYW5kCi0gSlVuaXRUZXN0ICh0ZXN0KSBob3dldmVyIGl0IGNhbiBwb3NzaWJseSBiZSBvdmVycmlkZGVuIGJ5IHRoZWlyCi0gb3duIHByb3BlcnRpZXMuPC9wPgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZvcmsiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgSlZNIHNob3VsZCBiZSBmb3JrZWQgZm9yIGVhY2ggdGVzdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgSlZNIHNob3VsZCBiZSBmb3JrZWQgZm9yIGVhY2ggdGVzdC4KLQotIDxwPkl0IGF2b2lkcyBpbnRlcmZlcmVuY2UgYmV0d2VlbiB0ZXN0Y2FzZXMgYW5kIHBvc3NpYmx5IGF2b2lkcwotIGhhbmdpbmcgdGhlIGJ1aWxkLiAgdGhpcyBwcm9wZXJ0eSBpcyBhcHBsaWVkIG9uIGFsbCBCYXRjaFRlc3QKLSAoYmF0Y2h0ZXN0KSBhbmQgSlVuaXRUZXN0ICh0ZXN0KSBob3dldmVyIGl0IGNhbiBwb3NzaWJseSBiZQotIG92ZXJyaWRkZW4gYnkgdGhlaXIgb3duIHByb3BlcnRpZXMuPC9wPgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImhhbHRvbmVycm9yIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHN0b3AgdGhlIGJ1aWxkIHByb2Nlc3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiBhIHRlc3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIHN0b3AgdGhlIGJ1aWxkIHByb2Nlc3Mgd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBpbiBhIHRlc3QuCi0gVGhpcyBwcm9wZXJ0eSBpcyBhcHBsaWVkIG9uIGFsbCBCYXRjaFRlc3QgKGJhdGNodGVzdCkgYW5kIEpVbml0VGVzdAotICh0ZXN0KSBob3dldmVyIGl0IGNhbiBwb3NzaWJseSBiZSBvdmVycmlkZGVuIGJ5IHRoZWlyIG93bgotIHByb3BlcnRpZXMuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaGFsdG9uZmFpbHVyZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBzdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIGEgdGVzdCBmYWlscwotIChlcnJvcnMgYXJlIGNvbnNpZGVyZWQgZmFpbHVyZXMgYXMgd2VsbCkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIHN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgYSB0ZXN0IGZhaWxzCi0gKGVycm9ycyBhcmUgY29uc2lkZXJlZCBmYWlsdXJlcyBhcyB3ZWxsKS4KLSBUaGlzIHByb3BlcnR5IGlzIGFwcGxpZWQgb24gYWxsIEJhdGNoVGVzdCAoYmF0Y2h0ZXN0KSBhbmQKLSBKVW5pdFRlc3QgKHRlc3QpIGhvd2V2ZXIgaXQgY2FuIHBvc3NpYmx5IGJlIG92ZXJyaWRkZW4gYnkgdGhlaXIKLSBvd24gcHJvcGVydGllcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmNsdWRlYW50cnVudGltZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBpbmNsdWRlIGFudC5qYXIsIG9wdGlvbmFsLmphciBhbmQganVuaXQuamFyIGluIHRoZSBmb3JrZWQgVk0uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGluY2x1ZGUgYW50Lmphciwgb3B0aW9uYWwuamFyIGFuZCBqdW5pdC5qYXIgaW4gdGhlIGZvcmtlZCBWTS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJqdm0iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgY29tbWFuZCB1c2VkIHRvIGludm9rZSB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUsCi0gZGVmYXVsdCBpcyAnamF2YScuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBjb21tYW5kIHVzZWQgdG8gaW52b2tlIHRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSwKLSBkZWZhdWx0IGlzICdqYXZhJy4gVGhlIGNvbW1hbmQgaXMgcmVzb2x2ZWQgYnkKLSBqYXZhLmxhbmcuUnVudGltZS5leGVjKCkuIElnbm9yZWQgaWYgZm9yayBpcyBkaXNhYmxlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXhtZW1vcnkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtNYXhpbXVtIG1lbW9yeSB0byBiZSB1c2VkIGJ5IGFsbCBmb3JrZWQgSlZNcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBtYXhpbXVtIG1lbW9yeSB0byBiZSB1c2VkIGJ5IGFsbCBmb3JrZWQgSlZNcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuZXdlbnZpcm9ubWVudCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCB1c2UgYSBuZXcgZW52aXJvbm1lbnQgd2hlbiBmb3JrZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIHVzZSBhIG5ldyBlbnZpcm9ubWVudCB3aGVuIGZvcmtlZC4KLQotIDxwPldpbGwgYmUgaWdub3JlZCBpZiB3ZSBhcmUgbm90IGZvcmtpbmcgYSBuZXcgVk0uPC9wPgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InByaW50c3VtbWFyeSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuSlVuaXRUYXNrLlN1bW1hcnlBdHRyaWJ1dGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7dHJ1ZSZxdW90OywgJnF1b3Q7eWVzJnF1b3Q7LCAmcXVvdDtmYWxzZSZxdW90OywgJnF1b3Q7bm8mcXVvdDssICZxdW90O29uJnF1b3Q7LCAmcXVvdDtvZmYmcXVvdDssICZxdW90O3dpdGhPdXRBbmRFcnImcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHByaW50IG9uZS1saW5lIHN0YXRpc3RpY3MgZm9yIGVhY2ggdGVzdCwgb3IgIndpdGhPdXRBbmRFcnIiCi0gdG8gYWxzbyBzaG93IHN0YW5kYXJkIG91dHB1dCBhbmQgZXJyb3IuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIHByaW50IG9uZS1saW5lIHN0YXRpc3RpY3MgZm9yIGVhY2ggdGVzdCwgb3IgIndpdGhPdXRBbmRFcnIiCi0gdG8gYWxzbyBzaG93IHN0YW5kYXJkIG91dHB1dCBhbmQgZXJyb3IuCi0KLSBDYW4gdGFrZSB0aGUgdmFsdWVzIG9uLCBvZmYsIGFuZCB3aXRoT3V0QW5kRXJyLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNob3dvdXRwdXQiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgc2VuZCBhbnkgb3V0cHV0IGdlbmVyYXRlZCBieSB0ZXN0cyB0byBBbnQncyBsb2dnaW5nIHN5c3RlbQotIGFzIHdlbGwgYXMgdG8gdGhlIGZvcm1hdHRlcnMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIHNlbmQgYW55IG91dHB1dCBnZW5lcmF0ZWQgYnkgdGVzdHMgdG8gQW50J3MgbG9nZ2luZyBzeXN0ZW0KLSBhcyB3ZWxsIGFzIHRvIHRoZSBmb3JtYXR0ZXJzLgotIEJ5IGRlZmF1bHQgb25seSB0aGUgZm9ybWF0dGVycyByZWNlaXZlIHRoZSBvdXRwdXQuCi0KLSA8cD5PdXRwdXQgd2lsbCBhbHdheXMgYmUgcGFzc2VkIHRvIHRoZSBmb3JtYXR0ZXJzIGFuZCBub3QgYnkKLSBzaG93biBieSBkZWZhdWx0LiAgVGhpcyBvcHRpb24gc2hvdWxkIGZvciBleGFtcGxlIGJlIHNldCBmb3IKLSB0ZXN0cyB0aGF0IGFyZSBpbnRlcmFjdGl2ZSBhbmQgcHJvbXB0IHRoZSB1c2VyIHRvIGRvCi0gc29tZXRoaW5nLjwvcD4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJqYXZhLmxhbmcuSW50ZWdlciIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJpbnQiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RpbWVvdXQgdmFsdWUgKGluIG1pbGxpc2Vjb25kcykuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgdGltZW91dCB2YWx1ZSAoaW4gbWlsbGlzZWNvbmRzKS4KLQotIDxwPklmIHRoZSB0ZXN0IGlzIHJ1bm5pbmcgZm9yIG1vcmUgdGhhbiB0aGlzIHZhbHVlLCB0aGUgdGVzdAotIHdpbGwgYmUgY2FuY2VsZWQuICh3b3JrcyBvbmx5IHdoZW4gaW4gJ2ZvcmsnIG1vZGUpLjwvcD4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImVudiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW52aXJvbm1lbnQuVmFyaWFibGUiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGU7IHVzZWQgd2hlbiBmb3JraW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlOyB1c2VkIHdoZW4gZm9ya2luZy4KLQotIDxwPldpbGwgYmUgaWdub3JlZCBpZiB3ZSBhcmUgbm90IGZvcmtpbmcgYSBuZXcgVk0uPC9wPl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJmb3JtYXR0ZXIiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LkZvcm1hdHRlckVsZW1lbnQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIG5ldyBmb3JtYXR0ZXIgdG8gYWxsIHRlc3RzIG9mIHRoaXMgdGFzay5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgbmV3IGZvcm1hdHRlciB0byBhbGwgdGVzdHMgb2YgdGhpcyB0YXNrLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJzeXNwcm9wZXJ0eSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW52aXJvbm1lbnQuVmFyaWFibGUiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBzeXN0ZW0gcHJvcGVydHkgdGhhdCB0ZXN0cyBjYW4gYWNjZXNzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgc3lzdGVtIHByb3BlcnR5IHRoYXQgdGVzdHMgY2FuIGFjY2Vzcy4KLSBUaGlzIG1pZ2h0IGJlIHVzZWZ1bCB0byB0cmFuZmVyIEFudCBwcm9wZXJ0aWVzIHRvIHRoZQotIHRlc3RjYXNlcyB3aGVuIEpWTSBmb3JraW5nIGlzIG5vdCBlbmFibGVkLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJ0ZXN0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5KVW5pdFRlc3QiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIG5ldyBzaW5nbGUgdGVzdGNhc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCBhIG5ldyBzaW5nbGUgdGVzdGNhc2UuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImJhdGNodGVzdCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuQmF0Y2hUZXN0IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgc2V0IG9mIHRlc3RzIGJhc2VkIG9uIHBhdHRlcm4gbWF0Y2hpbmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgdGVzdHMgYmFzZWQgb24gcGF0dGVybiBtYXRjaGluZy5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBwYXRoIHRvIGNsYXNzcGF0aCB1c2VkIGZvciB0ZXN0cy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBwYXRoIHRvIGNsYXNzcGF0aCB1c2VkIGZvciB0ZXN0cy5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0ianZtYXJnIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZS5Bcmd1bWVudCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIEpWTSBhcmd1bWVudDsgaWdub3JlZCBpZiBub3QgZm9ya2luZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIEpWTSBhcmd1bWVudDsgaWdub3JlZCBpZiBub3QgZm9ya2luZy5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJqdW5pdHJlcG9ydCIgY2F0ZWdvcnk9InRlc3RpbmciCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LlhNTFJlc3VsdEFnZ3JlZ2F0b3IiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FnZ3JlZ2F0ZXMgYWxsICZsdDtqdW5pdCZndDsgWE1MIGZvcm1hdHRlciB0ZXN0c3VpdGUgZGF0YSB1bmRlciBhIHNwZWNpZmljIGRpcmVjdG9yeSBhbmQgdHJhbnNmb3JtcyB0aGUgcmVzdWx0cyB2aWEgWFNMVC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbQWdncmVnYXRlcyBhbGwgJmx0O2p1bml0Jmd0OyBYTUwgZm9ybWF0dGVyIHRlc3RzdWl0ZSBkYXRhIHVuZGVyCi0gYSBzcGVjaWZpYyBkaXJlY3RvcnkgYW5kIHRyYW5zZm9ybXMgdGhlIHJlc3VsdHMgdmlhIFhTTFQuCi0gSXQgaXMgbm90IHBhcnRpY3VsYXJ5IGNsZWFuIGJ1dAotIHNob3VsZCBiZSBoZWxwZnVsIHdoaWxlIEkgYW0gdGhpbmtpbmcgYWJvdXQgYW5vdGhlciB0ZWNobmlxdWUuCi0KLSA8cD4gVGhlIG1haW4gcHJvYmxlbSBpcyBkdWUgdG8gdGhlIGZhY3QgdGhhdCBhIEpWTSBjYW4gYmUgZm9ya2VkIGZvciBhIHRlc3RjYXNlCi0gdGh1cyBtYWtpbmcgaXQgaW1wb3NzaWJsZSB0byBhZ2dyZWdhdGUgYWxsIHRlc3RjYXNlcyBzaW5jZSB0aGUgbGlzdGVuZXIgaXMKLSAob2J2aW91c2x5KSBpbiB0aGUgZm9ya2VkIEpWTS4gQSBzb2x1dGlvbiBjb3VsZCBiZSB0byB3cml0ZSBhCi0gVGVzdExpc3RlbmVyIHRoYXQgd2lsbCByZWNlaXZlIGV2ZW50cyBmcm9tIHRoZSBUZXN0UnVubmVyIHZpYSBzb2NrZXRzLiBUaGlzCi0gaXMgSU1ITyB0aGUgc2ltcGxlc3Qgd2F5IHRvIGRvIGl0IHRvIGF2b2lkIHRoaXMgZmlsZSBoYWNraW5nIHRoaW5nLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idG9kaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZXN0aW5hdGlvbiBkaXJlY3Rvcnkgd2hlcmUgdGhlIHJlc3VsdHMgc2hvdWxkIGJlIHdyaXR0ZW4uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IHdoZXJlIHRoZSByZXN1bHRzIHNob3VsZCBiZSB3cml0dGVuLiBJZiBub3QKLSBzZXQgaWYgd2lsbCB1c2Uge0BsaW5rICNERUZBVUxUX0RJUn0uIFdoZW4gZ2l2ZW4gYSByZWxhdGl2ZSBkaXJlY3RvcnkKLSBpdCB3aWxsIHJlc29sdmUgaXQgZnJvbSB0aGUgcHJvamVjdCBkaXJlY3RvcnkuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idG9maWxlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTmFtZSBvZiB0aGUgYWdncmVnZWdhdGVkIHJlc3VsdHMgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBuYW1lIG9mIHRoZSBhZ2dyZWdlZ2F0ZWQgcmVzdWx0cyBmaWxlLiBJdCBtdXN0IGJlIHJlbGF0aXZlCi0gZnJvbSB0aGUgPHR0PnRvZGlyPC90dD4gYXR0cmlidXRlLiBJZiBub3Qgc2V0IGl0IHdpbGwgdXNlIHtAbGluayAjREVGQVVMVF9GSUxFTkFNRX0KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGVzZXQiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSBuZXcgZmlsZXNldCBjb250YWluaW5nIHRoZSBYTUwgcmVzdWx0cyB0byBhZ2dyZWdhdGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCBhIG5ldyBmaWxlc2V0IGNvbnRhaW5pbmcgdGhlIFhNTCByZXN1bHRzIHRvIGFnZ3JlZ2F0ZV1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJyZXBvcnQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LkFnZ3JlZ2F0ZVRyYW5zZm9ybWVyIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtHZW5lcmF0ZSBhIHJlcG9ydCBiYXNlZCBvbiB0aGUgZG9jdW1lbnQgY3JlYXRlZCBieSB0aGUgbWVyZ2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0dlbmVyYXRlIGEgcmVwb3J0IGJhc2VkIG9uIHRoZSBkb2N1bWVudCBjcmVhdGVkIGJ5IHRoZSBtZXJnZS5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJrZXlzdWJzdCIgY2F0ZWdvcnk9Im90aGVyIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5LZXlTdWJzdCIKLSAgICAgIGRlcHJlY2F0ZWQ9InRydWUiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0tleXdvcmQgc3Vic3RpdHV0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtLZXl3b3JkIHN1YnN0aXR1dGlvbi4gSW5wdXQgZmlsZSBpcyB3cml0dGVuIHRvIG91dHB1dCBmaWxlLgotIERvIG5vdCBtYWtlIGlucHV0IGZpbGUgc2FtZSBhcyBvdXRwdXQgZmlsZS4KLSBLZXl3b3JkcyBpbiBpbnB1dCBmaWxlcyBsb29rIGxpa2UgdGhpczogQGZvb0AuIFNlZSB0aGUgZG9jcyBmb3IgdGhlIAotIHNldEtleXMgbWV0aG9kIHRvIHVuZGVyc3RhbmQgaG93IHRvIGRvIHRoZSBzdWJzdGl0dXRpb25zLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdCIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Rlc3RpbmF0aW9uIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgZGVzdGluYXRpb24gZmlsZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJrZXlzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbS2V5cy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUga2V5cy4KLUZvcm1hdCBzdHJpbmcgaXMgbGlrZSB0aGlzOgotPHA+Ci1uYW1lPXZhbHVlKm5hbWUyPXZhbHVlCi08cD4KLU5hbWVzIGFyZSBjYXNlIHNlbnNpdGl2ZS4KLTxwPgotVXNlIHRoZSBzZXRTZXAoKSBtZXRob2QgdG8gY2hhbmdlIHRoZSAqIHRvIHNvbWV0aGluZyBlbHNlCi1pZiB5b3UgbmVlZCB0byB1c2UgKiBhcyBhIG5hbWUgb3IgdmFsdWUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VwIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2VwZXJhdG9yIGJldHdlZW4gbmFtZT12YWx1ZSBhcmd1bWVudHMKLWluIHNldEtleXMoKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgc2VwZXJhdG9yIGJldHdlZW4gbmFtZT12YWx1ZSBhcmd1bWVudHMKLWluIHNldEtleXMoKS4gQnkgZGVmYXVsdCBpdCBpcyAiKiIuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU291cmNlIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgc291cmNlIGZpbGUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9ImxvYWRmaWxlIiBjYXRlZ29yeT0idXRpbGl0eSIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTG9hZEZpbGUiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xvYWQgYSBmaWxlIGludG8gYSBwcm9wZXJ0eV1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtMb2FkIGEgZmlsZSBpbnRvIGEgcHJvcGVydHldXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImVuY29kaW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRW5jb2RpbmcgdG8gdXNlIGZvciBpbnB1dCwgZGVmYXVsdHMgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdAotIGVuY29kaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBFbmNvZGluZyB0byB1c2UgZm9yIGlucHV0LCBkZWZhdWx0cyB0byB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0Ci0gZW5jb2RpbmcuIDxwPgotCi0gRm9yIGEgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMgc2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrLzEuMi9kb2NzL2d1aWRlL2ludGVybmF0L2VuY29kaW5nLmRvYy5odG1sIj4KLSBodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkay8xLjIvZG9jcy9ndWlkZS9pbnRlcm5hdC9lbmNvZGluZy5kb2MuaHRtbAotIDwvYT4uPC9wPgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIGZhaWwgb24gbG9hZCBlcnJvci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgZmFpbCBvbiBsb2FkIGVycm9yLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InByb3BlcnR5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUHJvcGVydHkgbmFtZSB0byBzYXZlIHRvLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBQcm9wZXJ0eSBuYW1lIHRvIHNhdmUgdG8uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZpbGUgdG8gbG9hZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgZmlsZSB0byBsb2FkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsdGVyY2hhaW4iIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbHRlckNoYWluIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWx0ZXJDaGFpbiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCB0aGUgRmlsdGVyQ2hhaW4gZWxlbWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkIHRoZSBGaWx0ZXJDaGFpbiBlbGVtZW50Ll1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9ImxvYWRwcm9wZXJ0aWVzIiBjYXRlZ29yeT0idXRpbGl0eSIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTG9hZFByb3BlcnRpZXMiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xvYWQgYSBmaWxlJ3MgY29udGVudHMgYXMgQW50IHByb3BlcnRpZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0xvYWQgYSBmaWxlJ3MgY29udGVudHMgYXMgQW50IHByb3BlcnRpZXMuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmNmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZSB0byBsb2FkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBmaWxlIHRvIGxvYWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJmaWx0ZXJjaGFpbiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsdGVyQ2hhaW4iCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbHRlckNoYWluIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIEZpbHRlckNoYWluLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgRmlsdGVyQ2hhaW4uXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0ibWFpbCIgY2F0ZWdvcnk9Im5ldHdvcmsiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsLkVtYWlsVGFzayIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQSB0YXNrIHRvIHNlbmQgU01UUCBlbWFpbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbQSB0YXNrIHRvIHNlbmQgU01UUCBlbWFpbC4gVGhpcyBpcyBhIHJlZmFjdG9yaW5nIG9mIHRoZSBTZW5kTWFpbCBhbmQKLSBNaW1lTWFpbCB0YXNrcyBzdWNoIHRoYXQgYm90aCBhcmUgd2l0aGluIGEgc2luZ2xlIHRhc2suXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiY2NsaXN0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyAiYmNjIiBhZGRyZXNzIGVsZW1lbnRzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBBZGRzICJiY2MiIGFkZHJlc3MgZWxlbWVudHMKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjY2xpc3QiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzICJjYyIgYWRkcmVzcyBlbGVtZW50cy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgQWRkcyAiY2MiIGFkZHJlc3MgZWxlbWVudHMKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbmNvZGluZyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuZW1haWwuRW1haWxUYXNrLkVuY29kaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O2F1dG8mcXVvdDssICZxdW90O21pbWUmcXVvdDssICZxdW90O3V1JnF1b3Q7LCAmcXVvdDtwbGFpbiZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWxsb3dzIHRoZSBidWlsZCB3cml0ZXIgdG8gY2hvb3NlIHRoZSBwcmVmZXJyZWQgZW5jb2RpbmcgbWV0aG9kLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBBbGxvd3MgdGhlIGJ1aWxkIHdyaXRlciB0byBjaG9vc2UgdGhlIHByZWZlcnJlZCBlbmNvZGluZyBtZXRob2QKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJbmRpY2F0ZXMgd2hldGhlciBCdWlsZEV4Y2VwdGlvbnMgc2hvdWxkIGJlIHBhc3NlZCBiYWNrIHRvIHRoZSBjb3JlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJbmRpY2F0ZXMgd2hldGhlciBCdWlsZEV4Y2VwdGlvbnMgc2hvdWxkIGJlIHBhc3NlZCBiYWNrIHRvIHRoZSBjb3JlCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZXMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgbGlzdCBvZiBmaWxlcyB0byBiZSBhdHRhY2hlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgQWRkcyBhIGxpc3Qgb2YgZmlsZXMgdG8gYmUgYXR0YWNoZWQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmcm9tIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2hvcnRoYW5kIHRvIHNldCB0aGUgZnJvbSBhZGRyZXNzIGVsZW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNob3J0aGFuZCB0byBzZXQgdGhlIGZyb20gYWRkcmVzcyBlbGVtZW50Ci0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5jbHVkZWZpbGVuYW1lcyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIEluY2x1ZGVmaWxlbmFtZXMgYXR0cmlidXRlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIEluY2x1ZGVmaWxlbmFtZXMgYXR0cmlidXRlCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWFpbGhvc3QiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtIb3N0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBob3N0Ci0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWFpbHBvcnQiIHR5cGU9ImludCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJpbnQiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW01haWwgc2VydmVyIHBvcnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIG1haWwgc2VydmVyIHBvcnQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtZXNzYWdlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2hvcnRoYW5kIG1ldGhvZCB0byBzZXQgdGhlIG1lc3NhZ2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNob3J0aGFuZCBtZXRob2QgdG8gc2V0IHRoZSBtZXNzYWdlCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZWZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTaG9ydGhhbmQgbWV0aG9kIHRvIHNldCB0aGUgbWVzc2FnZSBmcm9tIGEgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2hvcnRoYW5kIG1ldGhvZCB0byBzZXQgdGhlIG1lc3NhZ2UgZnJvbSBhIGZpbGUKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtZXNzYWdlbWltZXR5cGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTaG9ydGhhbmQgbWV0aG9kIHRvIHNldCB0eXBlIG9mIHRoZSB0ZXh0IG1lc3NhZ2UsIHRleHQvcGxhaW4gYnkgZGVmYXVsdAotIGJ1dCB0ZXh0L2h0bWwgb3IgdGV4dC94bWwgaXMgcXVpdGUgZmVhc2libGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNob3J0aGFuZCBtZXRob2QgdG8gc2V0IHR5cGUgb2YgdGhlIHRleHQgbWVzc2FnZSwgdGV4dC9wbGFpbiBieSBkZWZhdWx0Ci0gYnV0IHRleHQvaHRtbCBvciB0ZXh0L3htbCBpcyBxdWl0ZSBmZWFzaWJsZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdWJqZWN0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3ViamVjdCBsaW5lIG9mIHRoZSBlbWFpbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgc3ViamVjdCBsaW5lIG9mIHRoZSBlbWFpbAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRvbGlzdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgInRvIiBhZGRyZXNzIGVsZW1lbnRzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBBZGRzICJ0byIgYWRkcmVzcyBlbGVtZW50cwotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0iYmNjIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5lbWFpbC5FbWFpbEFkZHJlc3MiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgImJjYyIgYWRkcmVzcyBlbGVtZW50cy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyAiYmNjIiBhZGRyZXNzIGVsZW1lbnRzXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImNjIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5lbWFpbC5FbWFpbEFkZHJlc3MiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgImNjIiBhZGRyZXNzIGVsZW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgImNjIiBhZGRyZXNzIGVsZW1lbnRdXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZmlsZXMgKG5lc3RlZCBmaWxlc2V0IGF0dHJpYnV0ZSkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZmlsZXMgKG5lc3RlZCBmaWxlc2V0IGF0dHJpYnV0ZSkuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImZyb20iIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsLkVtYWlsQWRkcmVzcyIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIGZyb20gYWRkcmVzcyBlbGVtZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgZnJvbSBhZGRyZXNzIGVsZW1lbnRdXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0ibWVzc2FnZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuZW1haWwuTWVzc2FnZSIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgbWVzc2FnZSBlbGVtbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCBhIG1lc3NhZ2UgZWxlbW50XV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9InRvIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5lbWFpbC5FbWFpbEFkZHJlc3MiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSB0byBhZGRyZXNzIGVsZW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSB0byBhZGRyZXNzIGVsZW1lbnRdXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJtYW5pZmVzdCIgY2F0ZWdvcnk9ImphdmEiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1hbmlmZXN0VGFzayIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ3JlYXRlcyBhIG1hbmlmZXN0IGZpbGUgZm9yIGluY2x1c2lvbiBpbiBhIEpBUiwgQW50IHRhc2sgd3JhcHBlciBhcm91bmRdXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbQ3JlYXRlcyBhIG1hbmlmZXN0IGZpbGUgZm9yIGluY2x1c2lvbiBpbiBhIEpBUiwgQW50IHRhc2sgd3JhcHBlcgotIGFyb3VuZCB7QGxpbmsgTWFuaWZlc3QgTWFuaWZlc3R9LiAgVGhpcyB0YXNrIGNhbiBiZSB1c2VkIHRvIHdyaXRlIGEKLSBNYW5pZmVzdCBmaWxlLCBvcHRpb25hbGx5IHJlcGxhY2luZyBvciB1cGRhdGluZyBhbiBleGlzdGluZyBmaWxlLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBuYW1lIG9mIHRoZSBtYW5pZmVzdCBmaWxlIHRvIGNyZWF0ZS91cGRhdGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBtYW5pZmVzdCBmaWxlIHRvIGNyZWF0ZS91cGRhdGUuCi0gUmVxdWlyZWQgaWYgdXNlZCBhcyBhIHRhc2suCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibW9kZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWFuaWZlc3RUYXNrLk1vZGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7dXBkYXRlJnF1b3Q7LCAmcXVvdDtyZXBsYWNlJnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtVcGRhdGUgcG9saWN5OiBlaXRoZXIgInVwZGF0ZSIgb3IgInJlcGxhY2UiOyBkZWZhdWx0IGlzICJyZXBsYWNlIi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVXBkYXRlIHBvbGljeTogZWl0aGVyICJ1cGRhdGUiIG9yICJyZXBsYWNlIjsgZGVmYXVsdCBpcyAicmVwbGFjZSIuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1hbmlmZXN0LkF0dHJpYnV0ZSIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGFuIGF0dHJpYnV0ZSB0byB0aGUgbWFuaWZlc3QgLSBpdCBpcyBhZGRlZCB0byB0aGUgbWFpbiBzZWN0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGQgYW4gYXR0cmlidXRlIHRvIHRoZSBtYW5pZmVzdCAtIGl0IGlzIGFkZGVkIHRvIHRoZSBtYWluIHNlY3Rpb24uXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9InNlY3Rpb24iIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1hbmlmZXN0LlNlY3Rpb24iCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIHNlY3Rpb24gdG8gdGhlIG1hbmlmZXN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGQgYSBzZWN0aW9uIHRvIHRoZSBtYW5pZmVzdF1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9Im1hdWRpdCIgY2F0ZWdvcnk9Im90aGVyIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5tZXRhbWF0YS5NQXVkaXQiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ludm9rZXMgdGhlIE1ldGFtYXRhIEF1ZGl0LyBXZWJnYWluIFF1YWxpdHkgQW5hbHl6ZXIgb24gYSBzZXQgb2YgSmF2YSBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbSW52b2tlcyB0aGUgTWV0YW1hdGEgQXVkaXQvIFdlYmdhaW4gUXVhbGl0eSBBbmFseXplciBvbiBhIHNldCBvZiBKYXZhIGZpbGVzLgotIDxwPgotIDxpPm1hdWRpdDwvaT4gcGVyZm9ybXMgc3RhdGljIGFuYWx5c2lzIG9mIHRoZSBKYXZhIHNvdXJjZSBjb2RlIGFuZCBieXRlIGNvZGUgZmlsZXMgdG8gZmluZCBhbmQgcmVwb3J0Ci0gZXJyb3JzIG9mIHN0eWxlIGFuZCBwb3RlbnRpYWwgcHJvYmxlbXMgcmVsYXRlZCB0byBwZXJmb3JtYW5jZSwgbWFpbnRlbmFuY2UgYW5kIHJvYnVzdG5lc3MuCi0gIEFzIGEgY29udmVuaWVuY2UsIGEgc3R5bGVzaGVldCBpcyBnaXZlbiBpbiA8dHQ+ZXRjPC90dD4gZGlyZWN0b3J5LCBzbyB0aGF0IGFuIEhUTUwgcmVwb3J0IAotIGNhbiBiZSBnZW5lcmF0ZWQgZnJvbSB0aGUgWE1MIGZpbGUuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaXgiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQXV0b21hdGljYWxseSBmaXggY2VydGFpbiBlcnJvcnMgCi0gKHRob3NlIG1hcmtlZCBhcyBmaXhhYmxlIGluIHRoZSBtYW51YWwpOwotIG9wdGlvbmFsLCBkZWZhdWx0PWZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBBdXRvbWF0aWNhbGx5IGZpeCBjZXJ0YWluIGVycm9ycyAKLSAodGhvc2UgbWFya2VkIGFzIGZpeGFibGUgaW4gdGhlIG1hbnVhbCk7Ci0gb3B0aW9uYWwsIGRlZmF1bHQ9ZmFsc2UKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsaXN0IiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NyZWF0ZXMgbGlzdGluZyBmaWxlIGZvciBlYWNoIGF1ZGl0ZWQgZmlsZTsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIENyZWF0ZXMgbGlzdGluZyBmaWxlIGZvciBlYWNoIGF1ZGl0ZWQgZmlsZTsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuIAotIFdoZW4gc2V0LCBhIC5tYXVkaXQgZmlsZSB3aWxsIGJlIGdlbmVyYXRlZCBpbiB0aGUKLSBzYW1lIGxvY2F0aW9uIGFzIHRoZSBzb3VyY2UgZmlsZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYXhtZW1vcnkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtNYXhpbXVtIG1lbW9yeSBmb3IgdGhlIEpWTTsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgbWF4aW11bSBtZW1vcnkgZm9yIHRoZSBKVk07IG9wdGlvbmFsLgotIC1teCBvciAtWG14IGRlcGVuZGluZyBvbiBWTSB2ZXJzaW9uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWV0YW1hdGFob21lIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGhvbWUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIE1ldGFtYXRhIGRpc3RyaWJ1dGlvbjsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBob21lIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBNZXRhbWF0YSBkaXN0cmlidXRpb247IHJlcXVpcmVkCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idG9maWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIFhNTCBmaWxlIHRvIHdoaWNoIHRoZSBBdWRpdCByZXN1bHQgc2hvdWxkIGJlIHdyaXR0ZW4gdG87IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgWE1MIGZpbGUgdG8gd2hpY2ggdGhlIEF1ZGl0IHJlc3VsdCBzaG91bGQgYmUgd3JpdHRlbiB0bzsgcmVxdWlyZWQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1bnVzZWQiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmluZHMgZGVjbGFyYXRpb25zIHVudXNlZCBpbiBzZWFyY2ggcGF0aHM7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBGaW5kcyBkZWNsYXJhdGlvbnMgdW51c2VkIGluIHNlYXJjaCBwYXRoczsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuIAotIEl0IHdpbGwgbG9vayBmb3IgdW51c2VkIGdsb2JhbCBkZWNsYXJhdGlvbnMKLSBpbiB0aGUgc291cmNlIGNvZGUgd2l0aGluIGEgdXNlIGRvbWFpbiBzcGVjaWZpZWQgYnkgdGhlIAotIDx0dD5zZWFyY2hwYXRoPC90dD4gZWxlbWVudC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGVzZXQiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgamF2YSBmaWxlcyBvciBkaXJlY3RvcnkgdG8gYXVkaXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW1RoZSBqYXZhIGZpbGVzIG9yIGRpcmVjdG9yeSB0byBhdWRpdC4KLSBXaGF0ZXZlciB0aGUgZmlsdGVyIGlzLCBvbmx5IHRoZSBmaWxlcyB0aGF0IGVuZCAKLSB3aXRoIC5qYXZhIHdpbGwgYmUgaW5jbHVkZWQgZm9yIHByb2Nlc3NpbmcuIAotIE5vdGUgdGhhdCB0aGUgYmFzZSBkaXJlY3RvcnkgdXNlZCBmb3IgdGhlIGZpbGVzZXQgCi0gTVVTVCBiZSB0aGUgcm9vdCBvZiB0aGUgc291cmNlIGZpbGVzIG90aGVyd2lzZSBwYWNrYWdlIG5hbWVzCi0gZGVkdWNlZCBmcm9tIHRoZSBmaWxlIHBhdGggd2lsbCBiZSBpbmNvcnJlY3QuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NsYXNzIHBhdGggKGFsc28gc291cmNlIHBhdGggdW5sZXNzIG9uZSBleHBsaWNpdGx5IHNldCkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW1NldHMgdGhlIGNsYXNzIHBhdGggKGFsc28gc291cmNlIHBhdGggdW5sZXNzIG9uZSBleHBsaWNpdGx5IHNldCkuCi0gT3ZlcnJpZGVzIE1FVEFQQVRIL0NMQVNTUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9Imp2bWFyZyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmUuQXJndW1lbnQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZGl0aW9uYWwgb3B0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBKVk0uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZGl0aW9uYWwgb3B0aW9uYWwgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBKVk0uIAotIFlvdSBjYW4gYXZvaWQgdXNpbmcgdGhlICA8Y29kZT4mbHQ7anZtYXJnJmd0OzwvY29kZT4gYnkgYWRkaW5nIHRoZXNlIGVtcHR5IAotIGVudHJpZXMgdG8gPGNvZGU+bWV0YW1hdGEucHJvcGVydGllczwvY29kZT4gbG9jYXRlZCBhdCA8Y29kZT4ke21ldGFtYXRhLmhvbWV9L2JpbjwvY29kZT4KLQotIDxwcmU+bWV0YW1hdGEuY2xhc3NwYXRoPQotIG1ldGFtYXRhLnNvdXJjZXBhdGg9Ci0gbWV0YW1hdGEuYmFzZWNsYXNzcGF0aD0KLSA8L3ByZT5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0icnVsZXNwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3NwYXRoIGZvciBhZGRpdGlvbmFsIGF1ZGl0IHJ1bGVzCi0gdGhlc2UgbXVzdCBiZSBwbGFjZWQgYmVmb3JlIG1ldGFtYXRhLmphciAhIS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbY2xhc3NwYXRoIGZvciBhZGRpdGlvbmFsIGF1ZGl0IHJ1bGVzCi0gdGhlc2UgbXVzdCBiZSBwbGFjZWQgYmVmb3JlIG1ldGFtYXRhLmphciAhIV1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJzZWFyY2hwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2VhcmNoIHBhdGggdG8gdXNlIGZvciB1bnVzZWQgZ2xvYmFsIGRlY2xhcmF0aW9uczsgCi0gcmVxdWlyZWQgd2hlbiA8dHQ+dW51c2VkPC90dD4gaXMgc2V0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtzZWFyY2ggcGF0aCB0byB1c2UgZm9yIHVudXNlZCBnbG9iYWwgZGVjbGFyYXRpb25zOyAKLSByZXF1aXJlZCB3aGVuIDx0dD51bnVzZWQ8L3R0PiBpcyBzZXQuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9InNvdXJjZXBhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2UgcGF0aC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbU2V0cyB0aGUgc291cmNlIHBhdGguIAotIE92ZXJyaWRlcyB0aGUgU09VUkNFUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJtaW1lbWFpbCIgY2F0ZWdvcnk9Im90aGVyIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5uZXQuTWltZU1haWwiCi0gICAgICBkZXByZWNhdGVkPSJ0cnVlIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBIHRhc2sgdG8gc2VuZCBTTVRQIGVtYWlsOyBVc2UgPHR0Pm1haWw8L3R0PiBpbnN0ZWFkXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0EgdGFzayB0byBzZW5kIFNNVFAgZW1haWw7IFVzZSA8dHQ+bWFpbDwvdHQ+IGluc3RlYWRdXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImJjY2xpc3QiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzICJiY2MiIGFkZHJlc3MgZWxlbWVudHMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEFkZHMgImJjYyIgYWRkcmVzcyBlbGVtZW50cwotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNjbGlzdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgImNjIiBhZGRyZXNzIGVsZW1lbnRzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBBZGRzICJjYyIgYWRkcmVzcyBlbGVtZW50cwotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImVuY29kaW5nIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5lbWFpbC5FbWFpbFRhc2suRW5jb2RpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7YXV0byZxdW90OywgJnF1b3Q7bWltZSZxdW90OywgJnF1b3Q7dXUmcXVvdDssICZxdW90O3BsYWluJnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBbGxvd3MgdGhlIGJ1aWxkIHdyaXRlciB0byBjaG9vc2UgdGhlIHByZWZlcnJlZCBlbmNvZGluZyBtZXRob2QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEFsbG93cyB0aGUgYnVpbGQgd3JpdGVyIHRvIGNob29zZSB0aGUgcHJlZmVycmVkIGVuY29kaW5nIG1ldGhvZAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0luZGljYXRlcyB3aGV0aGVyIEJ1aWxkRXhjZXB0aW9ucyBzaG91bGQgYmUgcGFzc2VkIGJhY2sgdG8gdGhlIGNvcmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEluZGljYXRlcyB3aGV0aGVyIEJ1aWxkRXhjZXB0aW9ucyBzaG91bGQgYmUgcGFzc2VkIGJhY2sgdG8gdGhlIGNvcmUKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBsaXN0IG9mIGZpbGVzIHRvIGJlIGF0dGFjaGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBBZGRzIGEgbGlzdCBvZiBmaWxlcyB0byBiZSBhdHRhY2hlZAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZyb20iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTaG9ydGhhbmQgdG8gc2V0IHRoZSBmcm9tIGFkZHJlc3MgZWxlbWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2hvcnRoYW5kIHRvIHNldCB0aGUgZnJvbSBhZGRyZXNzIGVsZW1lbnQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmNsdWRlZmlsZW5hbWVzIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgSW5jbHVkZWZpbGVuYW1lcyBhdHRyaWJ1dGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgSW5jbHVkZWZpbGVuYW1lcyBhdHRyaWJ1dGUKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYWlsaG9zdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0hvc3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIGhvc3QKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtYWlscG9ydCIgdHlwZT0iaW50IgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTWFpbCBzZXJ2ZXIgcG9ydC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgbWFpbCBzZXJ2ZXIgcG9ydAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTaG9ydGhhbmQgbWV0aG9kIHRvIHNldCB0aGUgbWVzc2FnZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2hvcnRoYW5kIG1ldGhvZCB0byBzZXQgdGhlIG1lc3NhZ2UKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtZXNzYWdlZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Nob3J0aGFuZCBtZXRob2QgdG8gc2V0IHRoZSBtZXNzYWdlIGZyb20gYSBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTaG9ydGhhbmQgbWV0aG9kIHRvIHNldCB0aGUgbWVzc2FnZSBmcm9tIGEgZmlsZQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2VtaW1ldHlwZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Nob3J0aGFuZCBtZXRob2QgdG8gc2V0IHR5cGUgb2YgdGhlIHRleHQgbWVzc2FnZSwgdGV4dC9wbGFpbiBieSBkZWZhdWx0Ci0gYnV0IHRleHQvaHRtbCBvciB0ZXh0L3htbCBpcyBxdWl0ZSBmZWFzaWJsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2hvcnRoYW5kIG1ldGhvZCB0byBzZXQgdHlwZSBvZiB0aGUgdGV4dCBtZXNzYWdlLCB0ZXh0L3BsYWluIGJ5IGRlZmF1bHQKLSBidXQgdGV4dC9odG1sIG9yIHRleHQveG1sIGlzIHF1aXRlIGZlYXNpYmxlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InN1YmplY3QiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTdWJqZWN0IGxpbmUgb2YgdGhlIGVtYWlsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBzdWJqZWN0IGxpbmUgb2YgdGhlIGVtYWlsCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idG9saXN0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyAidG8iIGFkZHJlc3MgZWxlbWVudHMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEFkZHMgInRvIiBhZGRyZXNzIGVsZW1lbnRzCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJiY2MiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsLkVtYWlsQWRkcmVzcyIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyAiYmNjIiBhZGRyZXNzIGVsZW1lbnRzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzICJiY2MiIGFkZHJlc3MgZWxlbWVudHNdXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iY2MiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsLkVtYWlsQWRkcmVzcyIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyAiY2MiIGFkZHJlc3MgZWxlbWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyAiY2MiIGFkZHJlc3MgZWxlbWVudF1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyAobmVzdGVkIGZpbGVzZXQgYXR0cmlidXRlKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyAobmVzdGVkIGZpbGVzZXQgYXR0cmlidXRlKS5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iZnJvbSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuZW1haWwuRW1haWxBZGRyZXNzIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgZnJvbSBhZGRyZXNzIGVsZW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBmcm9tIGFkZHJlc3MgZWxlbWVudF1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJtZXNzYWdlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5lbWFpbC5NZXNzYWdlIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSBtZXNzYWdlIGVsZW1udC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgbWVzc2FnZSBlbGVtbnRdXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0idG8iIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsLkVtYWlsQWRkcmVzcyIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHRvIGFkZHJlc3MgZWxlbWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHRvIGFkZHJlc3MgZWxlbWVudF1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9Im1rZGlyIiBjYXRlZ29yeT0iZmlsZXN5c3RlbSIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWtkaXIiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NyZWF0ZXMgYSBnaXZlbiBkaXJlY3RvcnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0NyZWF0ZXMgYSBnaXZlbiBkaXJlY3RvcnkuCi0gQ3JlYXRlcyBhIGRpcmVjdG9yeSBhbmQgYW55IG5vbi1leGlzdGVudCBwYXJlbnQgZGlyZWN0b3JpZXMsIHdoZW4KLSBuZWNlc3NhcnldXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRpciIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBkaXJlY3RvcnkgdG8gY3JlYXRlOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgdGhlIGRpcmVjdG9yeSB0byBjcmVhdGU7IHJlcXVpcmVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJtbWV0cmljcyIgY2F0ZWdvcnk9Im90aGVyIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5tZXRhbWF0YS5NTWV0cmljcyIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29tcHV0ZXMgdGhlIG1ldHJpY3Mgb2YgYSBzZXQgb2YgSmF2YSBmaWxlcyBhbmQgd3JpdGUgdGhlIHJlc3VsdHMgdG8gYW4gWE1MIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0NvbXB1dGVzIHRoZSBtZXRyaWNzIG9mIGEgc2V0IG9mIEphdmEgZmlsZXMgYW5kIHdyaXRlIHRoZSByZXN1bHRzIHRvIGFuIFhNTAotIGZpbGUuIEFzIGEgY29udmVuaWVuY2UsIGEgc3R5bGVzaGVldCBpcyBnaXZlbiBpbiA8dHQ+ZXRjPC90dD4gZGlyZWN0b3J5LAotIHNvIHRoYXQgYW4gSFRNTCByZXBvcnQgY2FuIGJlIGdlbmVyYXRlZCBmcm9tIHRoZSBYTUwgZmlsZS4KLSA8cD4KLSBZb3Ugd2lsbCBub3QgYmUgYWJsZSB0byB1c2UgdGhpcyB0YXNrIHdpdGggdGhlIGV2YWx1YXRpb24gdmVyc2lvbiBzaW5jZQotIGFzIG9mIE1ldGFtYXRhIDIuMCwgTWV0cmljcyBkb2VzIG5vdCBzdXBwb3J0IGNvbW1hbmQgbGluZSA6LShdXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImdyYW51bGFyaXR5IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5tZXRhbWF0YS5NTWV0cmljcy5HcmFudWxhcml0eUF0dHJpYnV0ZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDtjb21waWxhdGlvbi11bml0cyZxdW90OywgJnF1b3Q7ZmlsZXMmcXVvdDssICZxdW90O21ldGhvZHMmcXVvdDssICZxdW90O3R5cGVzJnF1b3Q7LCAmcXVvdDtwYWNrYWdlcyZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbR3JhbnVsYXJpdHkgb2YgdGhlIGF1ZGl0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBzZXQgdGhlIGdyYW51bGFyaXR5IG9mIHRoZSBhdWRpdC4gU2hvdWxkIGJlIG9uZSBvZiAnZmlsZXMnLCAnbWV0aG9kcycKLSBvciAndHlwZXMnLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im1heG1lbW9yeSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW01heGltdW0gbWVtb3J5IGZvciB0aGUgSlZNOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBtYXhpbXVtIG1lbW9yeSBmb3IgdGhlIEpWTTsgb3B0aW9uYWwuCi0gLW14IG9yIC1YbXggZGVwZW5kaW5nIG9uIFZNIHZlcnNpb24KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJtZXRhbWF0YWhvbWUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgaG9tZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgTWV0YW1hdGEgZGlzdHJpYnV0aW9uOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGhvbWUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIE1ldGFtYXRhIGRpc3RyaWJ1dGlvbjsgcmVxdWlyZWQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0b2ZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPdXRwdXQgWE1MIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgb3V0cHV0IFhNTCBmaWxlCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGphdmEgZmlsZXMgb3IgZGlyZWN0b3J5IHRvIGF1ZGl0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtUaGUgamF2YSBmaWxlcyBvciBkaXJlY3RvcnkgdG8gYXVkaXQuCi0gV2hhdGV2ZXIgdGhlIGZpbHRlciBpcywgb25seSB0aGUgZmlsZXMgdGhhdCBlbmQgCi0gd2l0aCAuamF2YSB3aWxsIGJlIGluY2x1ZGVkIGZvciBwcm9jZXNzaW5nLiAKLSBOb3RlIHRoYXQgdGhlIGJhc2UgZGlyZWN0b3J5IHVzZWQgZm9yIHRoZSBmaWxlc2V0IAotIE1VU1QgYmUgdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSBmaWxlcyBvdGhlcndpc2UgcGFja2FnZSBuYW1lcwotIGRlZHVjZWQgZnJvbSB0aGUgZmlsZSBwYXRoIHdpbGwgYmUgaW5jb3JyZWN0Ll1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDbGFzcyBwYXRoIChhbHNvIHNvdXJjZSBwYXRoIHVubGVzcyBvbmUgZXhwbGljaXRseSBzZXQpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtTZXRzIHRoZSBjbGFzcyBwYXRoIChhbHNvIHNvdXJjZSBwYXRoIHVubGVzcyBvbmUgZXhwbGljaXRseSBzZXQpLgotIE92ZXJyaWRlcyBNRVRBUEFUSC9DTEFTU1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGVzLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJqdm1hcmciIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lLkFyZ3VtZW50IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRpdGlvbmFsIG9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgSlZNLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRpdGlvbmFsIG9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgSlZNLiAKLSBZb3UgY2FuIGF2b2lkIHVzaW5nIHRoZSAgPGNvZGU+Jmx0O2p2bWFyZyZndDs8L2NvZGU+IGJ5IGFkZGluZyB0aGVzZSBlbXB0eSAKLSBlbnRyaWVzIHRvIDxjb2RlPm1ldGFtYXRhLnByb3BlcnRpZXM8L2NvZGU+IGxvY2F0ZWQgYXQgPGNvZGU+JHttZXRhbWF0YS5ob21lfS9iaW48L2NvZGU+Ci0KLSA8cHJlPm1ldGFtYXRhLmNsYXNzcGF0aD0KLSBtZXRhbWF0YS5zb3VyY2VwYXRoPQotIG1ldGFtYXRhLmJhc2VjbGFzc3BhdGg9Ci0gPC9wcmU+XV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9InBhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOZXcgcGF0aCAoZGlyZWN0b3J5KSB0byBtZWFzdXJlIG1ldHJpY3MgZnJvbS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbU2V0IGEgbmV3IHBhdGggKGRpcmVjdG9yeSkgdG8gbWVhc3VyZSBtZXRyaWNzIGZyb20uXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9InNvdXJjZXBhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2UgcGF0aC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbU2V0cyB0aGUgc291cmNlIHBhdGguIAotIE92ZXJyaWRlcyB0aGUgU09VUkNFUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJtb3ZlIiBjYXRlZ29yeT0iZmlsZXN5c3RlbSIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTW92ZSIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTW92ZXMgYSBmaWxlIG9yIGRpcmVjdG9yeSB0byBhIG5ldyBmaWxlIG9yIGRpcmVjdG9yeS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbTW92ZXMgYSBmaWxlIG9yIGRpcmVjdG9yeSB0byBhIG5ldyBmaWxlIG9yIGRpcmVjdG9yeS4KLSBCeSBkZWZhdWx0LCB0aGUKLSBkZXN0aW5hdGlvbiBmaWxlIGlzIG92ZXJ3cml0dGVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLgotIFdoZW4gPGk+b3ZlcndyaXRlPC9pPiBpcwotIHR1cm5lZCBvZmYsIHRoZW4gZmlsZXMgYXJlIG9ubHkgbW92ZWQgaWYgdGhlIHNvdXJjZSBmaWxlIGlzCi0gbmV3ZXIgdGhhbiB0aGUgZGVzdGluYXRpb24gZmlsZSwgb3Igd2hlbiB0aGUgZGVzdGluYXRpb24gZmlsZSBkb2VzCi0gbm90IGV4aXN0LgotCi0gPHA+U291cmNlIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBhcmUgb25seSBkZWxldGVkIHdoZW4gdGhlIGZpbGUgb3IKLSBkaXJlY3RvcnkgaGFzIGJlZW4gY29waWVkIHRvIHRoZSBkZXN0aW5hdGlvbiBzdWNjZXNzZnVsbHkuICBGaWx0ZXJpbmcKLSBhbHNvIHdvcmtzLjwvcD4KLQotIDxwPlRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gQXJub3V0IEt1aXBlcidzIGluaXRpYWwgZGVzaWduCi0gZG9jdW1lbnQsIHRoZSBmb2xsb3dpbmcgbWFpbGluZyBsaXN0IGRpc2N1c3Npb25zLCBhbmQgdGhlCi0gY29weWZpbGUvY29weWRpciB0YXNrcy48L3A+XV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbmNvZGluZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NoYXJhY3RlciBlbmNvZGluZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgY2hhcmFjdGVyIGVuY29kaW5nCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgZmFsc2UsIG5vdGUgZXJyb3JzIHRvIHRoZSBvdXRwdXQgYnV0IGtlZXAgZ29pbmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIGZhbHNlLCBub3RlIGVycm9ycyB0byB0aGUgb3V0cHV0IGJ1dCBrZWVwIGdvaW5nLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTaW5nbGUgc291cmNlIGZpbGUgdG8gY29weS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyBhIHNpbmdsZSBzb3VyY2UgZmlsZSB0byBjb3B5LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbHRlcmluZyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBlbmFibGVzIGZpbHRlcmluZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgZW5hYmxlcyBmaWx0ZXJpbmcuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmxhdHRlbiIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGVuIGNvcHlpbmcgZGlyZWN0b3J5IHRyZWVzLCB0aGUgZmlsZXMgY2FuIGJlICJmbGF0dGVuZWQiCi0gaW50byBhIHNpbmdsZSBkaXJlY3RvcnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFdoZW4gY29weWluZyBkaXJlY3RvcnkgdHJlZXMsIHRoZSBmaWxlcyBjYW4gYmUgImZsYXR0ZW5lZCIKLSBpbnRvIGEgc2luZ2xlIGRpcmVjdG9yeS4gIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBmaWxlcyB3aXRoCi0gdGhlIHNhbWUgbmFtZSBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSB0cmVlLCBvbmx5IHRoZSBmaXJzdAotIGZpbGUgd2lsbCBiZSBjb3BpZWQgaW50byB0aGUgImZsYXR0ZW5lZCIgZGlyZWN0b3J5LCB1bmxlc3MKLSB0aGUgZm9yY2VvdmVyd3JpdGUgYXR0cmlidXRlIGlzIHRydWUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5jbHVkZWVtcHR5ZGlycyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtVc2VkIHRvIGNvcHkgZW1wdHkgZGlyZWN0b3JpZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFVzZWQgdG8gY29weSBlbXB0eSBkaXJlY3Rvcmllcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdmVyd3JpdGUiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbT3ZlcndyaXRlIGFueSBleGlzdGluZyBkZXN0aW5hdGlvbiBmaWxlKHMpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBPdmVyd3JpdGUgYW55IGV4aXN0aW5nIGRlc3RpbmF0aW9uIGZpbGUocykuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJlc2VydmVsYXN0bW9kaWZpZWQiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbR2l2ZSB0aGUgY29waWVkIGZpbGVzIHRoZSBzYW1lIGxhc3QgbW9kaWZpZWQgdGltZSBhcyB0aGUgb3JpZ2luYWwgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEdpdmUgdGhlIGNvcGllZCBmaWxlcyB0aGUgc2FtZSBsYXN0IG1vZGlmaWVkIHRpbWUgYXMgdGhlIG9yaWdpbmFsIGZpbGVzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRvZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVzdGluYXRpb24gZGlyZWN0b3J5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idG9maWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVzdGluYXRpb24gZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgZGVzdGluYXRpb24gZmlsZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJib3NlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1VzZWQgdG8gZm9yY2UgbGlzdGluZyBvZiBhbGwgbmFtZXMgb2YgY29waWVkIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBVc2VkIHRvIGZvcmNlIGxpc3Rpbmcgb2YgYWxsIG5hbWVzIG9mIGNvcGllZCBmaWxlcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGVzZXQiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgc2V0IG9mIGZpbGVzIHRvIGNvcHkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZmlsZXMgdG8gY29weS5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsdGVyY2hhaW4iIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbHRlckNoYWluIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWx0ZXJDaGFpbiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBGaWx0ZXJDaGFpbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIEZpbHRlckNoYWluLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJmaWx0ZXJzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbHRlclNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsdGVyc2V0IgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIGZpbHRlcnNldC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIGZpbHRlcnNldC5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0ibWFwcGVyIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5NYXBwZXIiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9Ik1hcHBlciIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RlZmluZXMgdGhlIG1hcHBlciB0byBtYXAgc291cmNlIHRvIGRlc3RpbmF0aW9uIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtEZWZpbmVzIHRoZSBtYXBwZXIgdG8gbWFwIHNvdXJjZSB0byBkZXN0aW5hdGlvbiBmaWxlcy5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJtcGFyc2UiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubWV0YW1hdGEuTVBhcnNlIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTaW1wbGUgTWV0YW1hdGEgTVBhcnNlIHRhc2suXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW1NpbXBsZSBNZXRhbWF0YSBNUGFyc2UgdGFzay4KLSBCYXNlZCBvbiB0aGUgb3JpZ2luYWwgd3JpdHRlbiBieQotIDxhIGhyZWY9Im1haWx0bzp0aG9tYXMuaGFhc0Bzb2Z0d2lyZWQtaW5jLmNvbSI+VGhvbWFzIEhhYXM8L2E+LgotIFRoaXMgdmVyc2lvbiB3YXMgd3JpdHRlbiBmb3IgTWV0YW1hdGEgMi4wIGF2YWlsYWJsZSBhdAotIDxhIGhyZWY9Imh0dHA6Ly93d3cubWV0YW1hdGEuY29tIj5odHRwOi8vd3d3Lm1ldGFtYXRhLmNvbTwvYT5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNsZWFudXAiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUmVtb3ZlIHRoZSBpbnRlcm1lZGlhdGUgU3VuIEphdmFDQyBmaWxlIAotIDsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFJlbW92ZSB0aGUgaW50ZXJtZWRpYXRlIFN1biBKYXZhQ0MgZmlsZSAKLSA7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlYnVncGFyc2VyIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCBwYXJzZXIgZGVidWcgbW9kZTsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIHNldCBwYXJzZXIgZGVidWcgbW9kZTsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWJ1Z3NjYW5uZXIiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IHNjYW5uZXIgZGVidWcgbW9kZTsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIHNldCBzY2FubmVyIGRlYnVnIG1vZGU7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWF4bWVtb3J5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTWF4aW11bSBtZW1vcnkgZm9yIHRoZSBKVk07IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIG1heGltdW0gbWVtb3J5IGZvciB0aGUgSlZNOyBvcHRpb25hbC4KLSAtbXggb3IgLVhteCBkZXBlbmRpbmcgb24gVk0gdmVyc2lvbgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im1ldGFtYXRhaG9tZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBob21lIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBNZXRhbWF0YSBkaXN0cmlidXRpb247IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgaG9tZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgTWV0YW1hdGEgZGlzdHJpYnV0aW9uOyByZXF1aXJlZAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldCIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSAuamogZmlsZSB0byBwcm9jZXNzOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIC5qaiBmaWxlIHRvIHByb2Nlc3M7IHJlcXVpcmVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZlcmJvc2UiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IHZlcmJvc2UgbW9kZTsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIHNldCB2ZXJib3NlIG1vZGU7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGUgYSBjbGFzc3BhdGggZW50cnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW2NyZWF0ZSBhIGNsYXNzcGF0aCBlbnRyeV1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJqdm1hcmciIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lLkFyZ3VtZW50IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRpdGlvbmFsIG9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgSlZNLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRpdGlvbmFsIG9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgSlZNLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJzb3VyY2VwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ3JlYXRlcyBhIHNvdXJjZXBhdGggZW50cnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW2NyZWF0ZXMgYSBzb3VyY2VwYXRoIGVudHJ5XV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0ibmF0aXZlMmFzY2lpIiBjYXRlZ29yeT0ib3RoZXIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLk5hdGl2ZTJBc2NpaSIKLSAgICAgIG1hdGNoaW5nVGFzaz0idHJ1ZSI+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NvbnZlcnRzIGZpbGVzIGZyb20gbmF0aXZlIGVuY29kaW5ncyB0byBBU0NJSS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbQ29udmVydHMgZmlsZXMgZnJvbSBuYXRpdmUgZW5jb2RpbmdzIHRvIEFTQ0lJLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdCIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Rlc3RpbmF0aW9uIGRpcmVjdG9yeSB0byBwbGFjZSBjb252ZXJ0ZWQgZmlsZXMgaW50by5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgdG8gcGxhY2UgY29udmVydGVkIGZpbGVzIGludG8uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW5jb2RpbmciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFbmNvZGluZyB0byB0cmFuc2xhdGUgdG8vZnJvbS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBlbmNvZGluZyB0byB0cmFuc2xhdGUgdG8vZnJvbS4KLSBJZiB1bnNldCwgdGhlIGRlZmF1bHQgZW5jb2RpbmcgZm9yIHRoZSBKVk0gaXMgdXNlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFeHRlbnNpb24gd2hpY2ggY29udmVydGVkIGZpbGVzIHNob3VsZCBoYXZlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGV4dGVuc2lvbiB3aGljaCBjb252ZXJ0ZWQgZmlsZXMgc2hvdWxkIGhhdmUuCi0gSWYgdW5zZXQsIGZpbGVzIHdpbGwgbm90IGJlIHJlbmFtZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmV2ZXJzZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRoZSBjb252ZXJzaW9uIHRvIHJ1biBpbiB0aGUgcmV2ZXJzZSBzZW5zZSwKLSB0aGF0IGlzIEFzY2lpIHRvIE5hdGl2ZSBlbmNvZGluZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgRmxhZyB0aGUgY29udmVyc2lvbiB0byBydW4gaW4gdGhlIHJldmVyc2Ugc2Vuc2UsCi0gdGhhdCBpcyBBc2NpaSB0byBOYXRpdmUgZW5jb2RpbmcuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU291cmNlIGRpcmVjdG9yeSBpbiB3aGljaCB0byBmaW5kIGZpbGVzIHRvIGNvbnZlcnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgc291cmNlIGRpcmVjdG9yeSBpbiB3aGljaCB0byBmaW5kIGZpbGVzIHRvIGNvbnZlcnQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJtYXBwZXIiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLk1hcHBlciIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iTWFwcGVyIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVmaW5lcyB0aGUgRmlsZU5hbWVNYXBwZXIgdG8gdXNlIChuZXN0ZWQgbWFwcGVyIGVsZW1lbnQpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtEZWZpbmVzIHRoZSBGaWxlTmFtZU1hcHBlciB0byB1c2UgKG5lc3RlZCBtYXBwZXIgZWxlbWVudCkuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0ibmV0cmV4eGMiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuTmV0UmV4eEMiCi0gICAgICBtYXRjaGluZ1Rhc2s9InRydWUiPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDb21waWxlcyBOZXRSZXh4IHNvdXJjZSBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbQ29tcGlsZXMgTmV0UmV4eCBzb3VyY2UgZmlsZXMuCi0gVGhpcyB0YXNrIGNhbiB0YWtlIHRoZSBmb2xsb3dpbmcKLSBhcmd1bWVudHM6Ci0gPHVsPgotIDxsaT5iaW5hcnk8L2xpPgotIDxsaT5jbGFzc3BhdGg8L2xpPgotIDxsaT5jb21tZW50czwvbGk+Ci0gPGxpPmNvbXBpbGU8L2xpPgotIDxsaT5jb25zb2xlPC9saT4KLSA8bGk+Y3Jvc3NyZWY8L2xpPgotIDxsaT5kZWNpbWFsPC9saT4KLSA8bGk+ZGVzdGRpcjwvbGk+Ci0gPGxpPmRpYWc8L2xpPgotIDxsaT5leHBsaWNpdDwvbGk+Ci0gPGxpPmZvcm1hdDwvbGk+Ci0gPGxpPmtlZXA8L2xpPgotIDxsaT5sb2dvPC9saT4KLSA8bGk+cmVwbGFjZTwvbGk+Ci0gPGxpPnNhdmVsb2c8L2xpPgotIDxsaT5zcmNkaXI8L2xpPgotIDxsaT5zb3VyY2VkaXI8L2xpPgotIDxsaT5zdHJpY3RhcmdzPC9saT4KLSA8bGk+c3RyaWN0YXNzaWduPC9saT4KLSA8bGk+c3RyaWN0Y2FzZTwvbGk+Ci0gPGxpPnN0cmljdGltcG9ydDwvbGk+Ci0gPGxpPnN5bWJvbHM8L2xpPgotIDxsaT50aW1lPC9saT4KLSA8bGk+dHJhY2U8L2xpPgotIDxsaT51dGY4PC9saT4KLSA8bGk+dmVyYm9zZTwvbGk+Ci0gPGxpPnN1cHByZXNzTWV0aG9kQXJndW1lbnROb3RVc2VkPC9saT4KLSA8bGk+c3VwcHJlc3NQcml2YXRlUHJvcGVydHlOb3RVc2VkPC9saT4KLSA8bGk+c3VwcHJlc3NWYXJpYWJsZU5vdFVzZWQ8L2xpPgotIDxsaT5zdXBwcmVzc0V4Y2VwdGlvbk5vdFNpZ25hbGxlZDwvbGk+Ci0gPGxpPnN1cHByZXNzRGVwcmVjYXRpb248L2xpPgotIDwvdWw+Ci0gT2YgdGhlc2UgYXJndW1lbnRzLCB0aGUgPGI+c3JjZGlyPC9iPiBhcmd1bWVudCBpcyByZXF1aXJlZC4KLQotIDxwPldoZW4gdGhpcyB0YXNrIGV4ZWN1dGVzLCBpdCB3aWxsIHJlY3Vyc2l2ZWx5IHNjYW4gdGhlIHNyY2RpcgotIGxvb2tpbmcgZm9yIE5ldFJleHggc291cmNlIGZpbGVzIHRvIGNvbXBpbGUuIFRoaXMgdGFzayBtYWtlcyBpdHMKLSBjb21waWxlIGRlY2lzaW9uIGJhc2VkIG9uIHRpbWVzdGFtcC4KLSA8cD5CZWZvcmUgZmlsZXMgYXJlIGNvbXBpbGVkIHRoZXkgYW5kIGFueSBvdGhlciBmaWxlIGluIHRoZQotIHNyY2RpciB3aWxsIGJlIGNvcGllZCB0byB0aGUgZGVzdGRpciBhbGxvd2luZyBzdXBwb3J0IGZpbGVzIHRvIGJlCi0gbG9jYXRlZCBwcm9wZXJseSBpbiB0aGUgY2xhc3NwYXRoLiBUaGUgcmVhc29uIGZvciBjb3B5aW5nIHRoZSBzb3VyY2UgZmlsZXMKLSBiZWZvcmUgdGhlIGNvbXBpbGUgaXMgdGhhdCBOZXRSZXh4QyBoYXMgb25seSB0d28gZGVzdGluYXRpb25zIGZvciBjbGFzc2ZpbGVzOgotIDxvbD4KLSA8bGk+VGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBhbmQsPC9saT4KLSA8bGk+VGhlIGRpcmVjdG9yeSB0aGUgc291cmNlIGlzIGluIChzZWUgc291cmNlZGlyIG9wdGlvbikKLSA8L29sPl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYmluYXJ5IiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCB3aGV0aGVyIGxpdGVyYWxzIGFyZSB0cmVhdGVkIGFzIGJpbmFyeSwgcmF0aGVyIHRoYW4gTmV0UmV4eCB0eXBlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHdoZXRoZXIgbGl0ZXJhbHMgYXJlIHRyZWF0ZWQgYXMgYmluYXJ5LCByYXRoZXIgdGhhbiBOZXRSZXh4IHR5cGVzCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3NwYXRoIHVzZWQgZm9yIE5ldFJleHggY29tcGlsYXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgY2xhc3NwYXRoIHVzZWQgZm9yIE5ldFJleHggY29tcGlsYXRpb24KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21tZW50cyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgd2hldGhlciBjb21tZW50cyBhcmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGdlbmVyYXRlZCBqYXZhIHNvdXJjZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHdoZXRoZXIgY29tbWVudHMgYXJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBnZW5lcmF0ZWQgamF2YSBzb3VyY2UuCi0gVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMgdGhlIGZsYWcgdG8KLSBmYWxzZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21wYWN0IiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCB3aGV0aGVyIGVycm9yIG1lc3NhZ2VzIGNvbWUgb3V0IGluIGNvbXBhY3Qgb3IgdmVyYm9zZSBmb3JtYXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB3aGV0aGVyIGVycm9yIG1lc3NhZ2VzIGNvbWUgb3V0IGluIGNvbXBhY3Qgb3IgdmVyYm9zZSBmb3JtYXQuIFZhbGlkCi0gdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMgdGhlIGZsYWcgdG8gZmFsc2UuCi0gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21waWxlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCB3aGV0aGVyIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHNob3VsZCBjb21waWxlIHRoZSBnZW5lcmF0ZWQgamF2YSBjb2RlCi0gVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgd2hldGhlciB0aGUgTmV0UmV4eCBjb21waWxlciBzaG91bGQgY29tcGlsZSB0aGUgZ2VuZXJhdGVkIGphdmEgY29kZQotIFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvCi0gZmFsc2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuIFNldHRpbmcgdGhpcyBmbGFnIHRvIGZhbHNlLCB3aWxsCi0gYXV0b21hdGljYWxseSBzZXQgdGhlIGtlZXAgZmxhZyB0byB0cnVlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbnNvbGUiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IHdoZXRoZXIgb3Igbm90IG1lc3NhZ2VzIHNob3VsZCBiZSBkaXNwbGF5ZWQgb24gdGhlICdjb25zb2xlJyBWYWxpZAotIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHdoZXRoZXIgb3Igbm90IG1lc3NhZ2VzIHNob3VsZCBiZSBkaXNwbGF5ZWQgb24gdGhlICdjb25zb2xlJyBWYWxpZAotIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLgotIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY3Jvc3NyZWYiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciB2YXJpYWJsZSBjcm9zcyByZWZlcmVuY2VzIGFyZSBnZW5lcmF0ZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFdoZXRoZXIgdmFyaWFibGUgY3Jvc3MgcmVmZXJlbmNlcyBhcmUgZ2VuZXJhdGVkCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVjaW1hbCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgd2hldGhlciBkZWNpbWFsIGFyaXRobWV0aWMgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBuZXRyZXh4IGNvZGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB3aGV0aGVyIGRlY2ltYWwgYXJpdGhtZXRpYyBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIG5ldHJleHggY29kZS4KLSBCaW5hcnkgYXJpdGhtZXRpYyBpcyB1c2VkIHdoZW4gdGhpcyBmbGFnIGlzIHR1cm5lZCBvZmYuIFZhbGlkIHRydWUKLSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMgdGhlIGZsYWcgdG8gZmFsc2UuIFRoZQotIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0ZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVzdGluYXRpb24gZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIE5ldFJleHggc291cmNlIGZpbGVzCi0gc2hvdWxkIGJlIGNvcGllZCBhbmQgdGhlbiBjb21waWxlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgTmV0UmV4eCBzb3VyY2UgZmlsZXMKLSBzaG91bGQgYmUgY29waWVkIGFuZCB0aGVuIGNvbXBpbGVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRpYWciIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlIGlzIGdlbmVyYXRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgV2hldGhlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlIGlzIGdlbmVyYXRlZAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImV4cGxpY2l0IiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgd2hldGhlciB2YXJpYWJsZXMgbXVzdCBiZSBkZWNsYXJlZCBleHBsaWNpdGx5IGJlZm9yZSB1c2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgd2hldGhlciB2YXJpYWJsZXMgbXVzdCBiZSBkZWNsYXJlZCBleHBsaWNpdGx5IGJlZm9yZSB1c2UuIFZhbGlkCi0gdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMgdGhlIGZsYWcgdG8gZmFsc2UuCi0gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZm9ybWF0IiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgdGhlIGdlbmVyYXRlZCBqYXZhIGNvZGUgaXMgZm9ybWF0dGVkIG5pY2VseSBvciBsZWZ0IHRvIG1hdGNoCi0gTmV0UmV4eCBsaW5lIG51bWJlcnMgZm9yIGNhbGwgc3RhY2sgZGVidWdnaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBXaGV0aGVyIHRoZSBnZW5lcmF0ZWQgamF2YSBjb2RlIGlzIGZvcm1hdHRlZCBuaWNlbHkgb3IgbGVmdCB0byBtYXRjaAotIE5ldFJleHggbGluZSBudW1iZXJzIGZvciBjYWxsIHN0YWNrIGRlYnVnZ2luZwotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImphdmEiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciB0aGUgZ2VuZXJhdGVkIGphdmEgY29kZSBpcyBwcm9kdWNlZCBWYWxpZCB0cnVlIHZhbHVlcyBhcmUgIm9uIgotIG9yICJ0cnVlIi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgV2hldGhlciB0aGUgZ2VuZXJhdGVkIGphdmEgY29kZSBpcyBwcm9kdWNlZCBWYWxpZCB0cnVlIHZhbHVlcyBhcmUgIm9uIgotIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcwotIGZhbHNlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImtlZXAiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyB3aGV0aGVyIHRoZSBnZW5lcmF0ZWQgamF2YSBzb3VyY2UgZmlsZSBzaG91bGQgYmUga2VwdCBhZnRlcgotIGNvbXBpbGF0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHdoZXRoZXIgdGhlIGdlbmVyYXRlZCBqYXZhIHNvdXJjZSBmaWxlIHNob3VsZCBiZSBrZXB0IGFmdGVyCi0gY29tcGlsYXRpb24uIFRoZSBnZW5lcmF0ZWQgZmlsZXMgd2lsbCBoYXZlIGFuIGV4dGVuc2lvbiBvZiAuamF2YS5rZWVwLAotIDxiPm5vdDwvYj4gLmphdmEgVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlCi0gc2V0cyB0aGUgZmxhZyB0byBmYWxzZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9nbyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIHRoZSBjb21waWxlciB0ZXh0IGxvZ28gaXMgZGlzcGxheWVkIHdoZW4gY29tcGlsaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBXaGV0aGVyIHRoZSBjb21waWxlciB0ZXh0IGxvZ28gaXMgZGlzcGxheWVkIHdoZW4gY29tcGlsaW5nCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVwbGFjZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIHRoZSBnZW5lcmF0ZWQgLmphdmEgZmlsZSBzaG91bGQgYmUgcmVwbGFjZWQgd2hlbiBjb21waWxpbmcKLSBWYWxpZCB0cnVlIHZhbHVlcyBhcmUgIm9uIiBvciAidHJ1ZSIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFdoZXRoZXIgdGhlIGdlbmVyYXRlZCAuamF2YSBmaWxlIHNob3VsZCBiZSByZXBsYWNlZCB3aGVuIGNvbXBpbGluZwotIFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvCi0gZmFsc2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNhdmVsb2ciIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyB3aGV0aGVyIHRoZSBjb21waWxlciBtZXNzYWdlcyB3aWxsIGJlIHdyaXR0ZW4gdG8gTmV0UmV4eEMubG9nIGFzCi0gd2VsbCBhcyB0byB0aGUgY29uc29sZSBWYWxpZCB0cnVlIHZhbHVlcyBhcmUgIm9uIiBvciAidHJ1ZSIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgd2hldGhlciB0aGUgY29tcGlsZXIgbWVzc2FnZXMgd2lsbCBiZSB3cml0dGVuIHRvIE5ldFJleHhDLmxvZyBhcwotIHdlbGwgYXMgdG8gdGhlIGNvbnNvbGUgVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IgInRydWUiLiBBbnl0aGluZwotIGVsc2Ugc2V0cyB0aGUgZmxhZyB0byBmYWxzZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic291cmNlZGlyIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RlbGxzIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHRvIHN0b3JlIHRoZSBjbGFzcyBmaWxlcyBpbiB0aGUgc2FtZQotIGRpcmVjdG9yeSBhcyB0aGUgc291cmNlIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUZWxscyB0aGUgTmV0UmV4eCBjb21waWxlciB0byBzdG9yZSB0aGUgY2xhc3MgZmlsZXMgaW4gdGhlIHNhbWUKLSBkaXJlY3RvcnkgYXMgdGhlIHNvdXJjZSBmaWxlcy4gVGhlIGFsdGVybmF0aXZlIGlzIHRoZSB3b3JraW5nIGRpcmVjdG9yeQotIFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvCi0gZmFsc2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU291cmNlIGRpciB0byBmaW5kIHRoZSBzb3VyY2UgSmF2YSBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBzb3VyY2UgZGlyIHRvIGZpbmQgdGhlIHNvdXJjZSBKYXZhIGZpbGVzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InN0cmljdGFyZ3MiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGVsbHMgdGhlIE5ldFJleHggY29tcGlsZXIgdGhhdCBtZXRob2QgY2FsbHMgYWx3YXlzIG5lZWQgcGFyZW50aGVzZXMsCi0gZXZlbiBpZiBubyBhcmd1bWVudHMgYXJlIG5lZWRlZCwgZS5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUZWxscyB0aGUgTmV0UmV4eCBjb21waWxlciB0aGF0IG1ldGhvZCBjYWxscyBhbHdheXMgbmVlZCBwYXJlbnRoZXNlcywKLSBldmVuIGlmIG5vIGFyZ3VtZW50cyBhcmUgbmVlZGVkLCBlLmcuIDxjb2RlPmFTdHJpbmdWYXIuZ2V0Qnl0ZXM8L2NvZGU+Ci0gdnMuIDxjb2RlPmFTdHJpbmdWYXIuZ2V0Qnl0ZXMoKTwvY29kZT4gVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJvbiIgb3IKLSAidHJ1ZSIuIEFueXRoaW5nIGVsc2Ugc2V0cyB0aGUgZmxhZyB0byBmYWxzZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMKLSBmYWxzZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdHJpY3Rhc3NpZ24iIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGVsbHMgdGhlIE5ldFJleHggY29tcGlsZSB0aGF0IGFzc2lnbm1lbnRzIG11c3QgbWF0Y2ggZXhhY3RseSBvbiB0eXBlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUZWxscyB0aGUgTmV0UmV4eCBjb21waWxlIHRoYXQgYXNzaWdubWVudHMgbXVzdCBtYXRjaCBleGFjdGx5IG9uIHR5cGUKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdHJpY3RjYXNlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZmllcyB3aGV0aGVyIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHNob3VsZCBiZSBjYXNlIHNlbnNpdGl2ZSBvciBub3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHNob3VsZCBiZSBjYXNlIHNlbnNpdGl2ZSBvciBub3QKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdHJpY3RpbXBvcnQiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyB3aGV0aGVyIGNsYXNzZXMgbmVlZCB0byBiZSBpbXBvcnRlZCBleHBsaWNpdGx5IHVzaW5nIGFuIDxjb2RlPmltcG9ydDwvY29kZT4KLSBzdGF0ZW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgd2hldGhlciBjbGFzc2VzIG5lZWQgdG8gYmUgaW1wb3J0ZWQgZXhwbGljaXRseSB1c2luZyBhbiA8Y29kZT5pbXBvcnQ8L2NvZGU+Ci0gc3RhdGVtZW50LiBCeSBkZWZhdWx0IHRoZSBOZXRSZXh4IGNvbXBpbGVyIHdpbGwgaW1wb3J0IGNlcnRhaW4gcGFja2FnZXMKLSBhdXRvbWF0aWNhbGx5IFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzCi0gdGhlIGZsYWcgdG8gZmFsc2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InN0cmljdHByb3BzIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgd2hldGhlciBsb2NhbCBwcm9wZXJ0aWVzIG5lZWQgdG8gYmUgcXVhbGlmaWVkIGV4cGxpY2l0bHkgdXNpbmcKLSA8Y29kZT50aGlzPC9jb2RlPiBWYWxpZCB0cnVlIHZhbHVlcyBhcmUgIm9uIiBvciAidHJ1ZSIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgd2hldGhlciBsb2NhbCBwcm9wZXJ0aWVzIG5lZWQgdG8gYmUgcXVhbGlmaWVkIGV4cGxpY2l0bHkgdXNpbmcKLSA8Y29kZT50aGlzPC9jb2RlPiBWYWxpZCB0cnVlIHZhbHVlcyBhcmUgIm9uIiBvciAidHJ1ZSIuIEFueXRoaW5nIGVsc2UKLSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdHJpY3RzaWduYWwiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciB0aGUgY29tcGlsZXIgc2hvdWxkIGZvcmNlIGNhdGNoaW5nIG9mIGV4Y2VwdGlvbnMgYnkgZXhwbGljaXRseQotIG5hbWVkIHR5cGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBXaGV0aGVyIHRoZSBjb21waWxlciBzaG91bGQgZm9yY2UgY2F0Y2hpbmcgb2YgZXhjZXB0aW9ucyBieSBleHBsaWNpdGx5Ci0gbmFtZWQgdHlwZXMKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdXBwcmVzc2RlcHJlY2F0aW9uIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RlbGxzIHdoZXRoZXIgd2Ugc2hvdWxkIGZpbHRlciBvdXQgYW55IGRlcHJlY2F0aW9uLW1lc3NhZ2VzCi0gb2YgdGhlIGNvbXBpbGVyIG91dC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGVsbHMgd2hldGhlciB3ZSBzaG91bGQgZmlsdGVyIG91dCBhbnkgZGVwcmVjYXRpb24tbWVzc2FnZXMKLSBvZiB0aGUgY29tcGlsZXIgb3V0LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InN1cHByZXNzZXhjZXB0aW9ubm90c2lnbmFsbGVkIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgdGhlIHRhc2sgc2hvdWxkIHN1cHByZXNzIHRoZSAiRm9vRXhjZXB0aW9uIGlzIGluIFNJR05BTFMgbGlzdAotIGJ1dCBpcyBub3Qgc2lnbmFsbGVkIHdpdGhpbiB0aGUgbWV0aG9kIiwgd2hpY2ggaXMgc29tZXRpbWVzIHJhdGhlcgotIHVzZWxlc3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFdoZXRoZXIgdGhlIHRhc2sgc2hvdWxkIHN1cHByZXNzIHRoZSAiRm9vRXhjZXB0aW9uIGlzIGluIFNJR05BTFMgbGlzdAotIGJ1dCBpcyBub3Qgc2lnbmFsbGVkIHdpdGhpbiB0aGUgbWV0aG9kIiwgd2hpY2ggaXMgc29tZXRpbWVzIHJhdGhlcgotIHVzZWxlc3MuIFRoZSB3YXJuaW5nIGlzIGxvZ2dlZCBhcyB2ZXJib3NlIG1lc3NhZ2UsIHRob3VnaC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdXBwcmVzc21ldGhvZGFyZ3VtZW50bm90dXNlZCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIHRoZSB0YXNrIHNob3VsZCBzdXBwcmVzcyB0aGUgIk1ldGhvZCBhcmd1bWVudCBpcyBub3QgdXNlZCIgaW4KLSBzdHJpY3RhcmdzLU1vZGUsIHdoaWNoIGNhbiBub3QgYmUgc3VwcHJlc3NlZCBieSB0aGUgY29tcGlsZXIgaXRzZWxmLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBXaGV0aGVyIHRoZSB0YXNrIHNob3VsZCBzdXBwcmVzcyB0aGUgIk1ldGhvZCBhcmd1bWVudCBpcyBub3QgdXNlZCIgaW4KLSBzdHJpY3RhcmdzLU1vZGUsIHdoaWNoIGNhbiBub3QgYmUgc3VwcHJlc3NlZCBieSB0aGUgY29tcGlsZXIgaXRzZWxmLgotIFRoZSB3YXJuaW5nIGlzIGxvZ2dlZCBhcyB2ZXJib3NlIG1lc3NhZ2UsIHRob3VnaC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdXBwcmVzc3ByaXZhdGVwcm9wZXJ0eW5vdHVzZWQiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciB0aGUgdGFzayBzaG91bGQgc3VwcHJlc3MgdGhlICJQcml2YXRlIHByb3BlcnR5IGlzIGRlZmluZWQgYnV0Ci0gbm90IHVzZWQiIGluIHN0cmljdGFyZ3MtTW9kZSwgd2hpY2ggY2FuIGJlIHF1aXRlIGFubm95aW5nIHdoaWxlCi0gZGV2ZWxvcGluZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgV2hldGhlciB0aGUgdGFzayBzaG91bGQgc3VwcHJlc3MgdGhlICJQcml2YXRlIHByb3BlcnR5IGlzIGRlZmluZWQgYnV0Ci0gbm90IHVzZWQiIGluIHN0cmljdGFyZ3MtTW9kZSwgd2hpY2ggY2FuIGJlIHF1aXRlIGFubm95aW5nIHdoaWxlCi0gZGV2ZWxvcGluZy4gVGhlIHdhcm5pbmcgaXMgbG9nZ2VkIGFzIHZlcmJvc2UgbWVzc2FnZSwgdGhvdWdoLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InN1cHByZXNzdmFyaWFibGVub3R1c2VkIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgdGhlIHRhc2sgc2hvdWxkIHN1cHByZXNzIHRoZSAiVmFyaWFibGUgaXMgc2V0IGJ1dCBub3QgdXNlZCIgaW4KLSBzdHJpY3RhcmdzLU1vZGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFdoZXRoZXIgdGhlIHRhc2sgc2hvdWxkIHN1cHByZXNzIHRoZSAiVmFyaWFibGUgaXMgc2V0IGJ1dCBub3QgdXNlZCIgaW4KLSBzdHJpY3RhcmdzLU1vZGUuIEJlIGNhcmVmdWwgd2l0aCB0aGlzIG9uZSEgVGhlIHdhcm5pbmcgaXMgbG9nZ2VkIGFzCi0gdmVyYm9zZSBtZXNzYWdlLCB0aG91Z2guCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3ltYm9scyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIHdoZXRoZXIgZGVidWcgc3ltYm9scyBzaG91bGQgYmUgZ2VuZXJhdGVkIGludG8gdGhlIGNsYXNzIGZpbGUKLSBWYWxpZCB0cnVlIHZhbHVlcyBhcmUgIm9uIiBvciAidHJ1ZSIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgd2hldGhlciBkZWJ1ZyBzeW1ib2xzIHNob3VsZCBiZSBnZW5lcmF0ZWQgaW50byB0aGUgY2xhc3MgZmlsZQotIFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvCi0gZmFsc2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRpbWUiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQXNrcyB0aGUgTmV0UmV4eCBjb21waWxlciB0byBwcmludCBjb21waWxhdGlvbiB0aW1lcyB0byB0aGUgY29uc29sZQotIFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgQXNrcyB0aGUgTmV0UmV4eCBjb21waWxlciB0byBwcmludCBjb21waWxhdGlvbiB0aW1lcyB0byB0aGUgY29uc29sZQotIFZhbGlkIHRydWUgdmFsdWVzIGFyZSAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvCi0gZmFsc2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRyYWNlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5OZXRSZXh4Qy5UcmFjZUF0dHIiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7dHJhY2UmcXVvdDssICZxdW90O3RyYWNlMSZxdW90OywgJnF1b3Q7dHJhY2UyJnF1b3Q7LCAmcXVvdDtub3RyYWNlJnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtObyBkZXNjcmlwdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXRmOCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUZWxscyB0aGUgTmV0UmV4eCBjb21waWxlciB0aGF0IHRoZSBzb3VyY2UgaXMgaW4gVVRGOCBWYWxpZCB0cnVlIHZhbHVlcwotIGFyZSAib24iIG9yICJ0cnVlIi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGVsbHMgdGhlIE5ldFJleHggY29tcGlsZXIgdGhhdCB0aGUgc291cmNlIGlzIGluIFVURjggVmFsaWQgdHJ1ZSB2YWx1ZXMKLSBhcmUgIm9uIiBvciAidHJ1ZSIuIEFueXRoaW5nIGVsc2Ugc2V0cyB0aGUgZmxhZyB0byBmYWxzZS4gVGhlIGRlZmF1bHQKLSB2YWx1ZSBpcyBmYWxzZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJib3NlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5OZXRSZXh4Qy5WZXJib3NlQXR0ciIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDt2ZXJib3NlJnF1b3Q7LCAmcXVvdDt2ZXJib3NlMCZxdW90OywgJnF1b3Q7dmVyYm9zZTEmcXVvdDssICZxdW90O3ZlcmJvc2UyJnF1b3Q7LCAmcXVvdDt2ZXJib3NlMyZxdW90OywgJnF1b3Q7dmVyYm9zZTQmcXVvdDssICZxdW90O3ZlcmJvc2U1JnF1b3Q7LCAmcXVvdDtub3ZlcmJvc2UmcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgbG90cyBvZiB3YXJuaW5ncyBhbmQgZXJyb3IgbWVzc2FnZXMgc2hvdWxkIGJlIGdlbmVyYXRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgV2hldGhlciBsb3RzIG9mIHdhcm5pbmdzIGFuZCBlcnJvciBtZXNzYWdlcyBzaG91bGQgYmUgZ2VuZXJhdGVkCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9InA0YWRkIiBjYXRlZ29yeT0ib3RoZXIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlLlA0QWRkIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIHNwZWNpZmllZCBmaWxlcyB0byBQZXJmb3JjZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbQWRkcyBzcGVjaWZpZWQgZmlsZXMgdG8gUGVyZm9yY2UuCi0KLSA8Yj5FeGFtcGxlIFVzYWdlOjwvYj4KLSA8dGFibGUgYm9yZGVyPSIxIj4KLSA8dGg+RnVuY3Rpb248L3RoPjx0aD5Db21tYW5kPC90aD4KLSA8dHI+PHRkPkFkZCBmaWxlcyB1c2luZyBQNFVTRVIsIFA0UE9SVCBhbmQgUDRDTElFTlQgc2V0dGluZ3Mgc3BlY2lmaWVkPC90ZD48dGQ+Jmx0O1A0YWRkIDxicj5QNHZpZXc9Ii8vcHJvamVjdHMvZm9vL21haW4vc291cmNlLy4uLiIgPGJyPlA0VXNlcj0iZmJsb2dncyIgPGJyPlA0UG9ydD0ia20wMToxNjY2IiA8YnI+UDRDbGllbnQ9ImZibG9nZ3NjbGllbnQiJmd0Ozxicj4mbHQ7ZmlsZXNldCBiYXNlZGlyPSJkaXIiIGluY2x1ZGVzPSIqKiYjNDc7Ki5qYXZhIiZndDs8YnI+Jmx0Oy9wNGFkZCZndDs8L3RkPjwvdHI+Ci0gPHRyPjx0ZD5BZGQgZmlsZXMgdXNpbmcgUDRVU0VSLCBQNFBPUlQgYW5kIFA0Q0xJRU5UIHNldHRpbmdzIGRlZmluZWQgaW4gZW52aXJvbm1lbnQ8L3RkPjx0ZD4mbHQ7UDRhZGQgUDR2aWV3PSIvL3Byb2plY3RzL2Zvby9tYWluL3NvdXJjZS8uLi4iIC8mZ3Q7PGJyPiZsdDtmaWxlc2V0IGJhc2VkaXI9ImRpciIgaW5jbHVkZXM9IioqJiM0NzsqLmphdmEiJmd0Ozxicj4mbHQ7L3A0YWRkJmd0OzwvdGQ+PC90cj4KLSA8dHI+PHRkPlNwZWNpZnkgdGhlIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHRvIHBhc3MgdG8gZWFjaCBpbnZvY2F0aW9uIG9mIHA0PC90ZD48dGQ+Jmx0O3A0YWRkIENvbW1hbmRsZW5ndGg9IjQ1MCImZ3Q7PC90ZD48L3RyPgotIDwvdGFibGU+XV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VsaXN0IiB0eXBlPSJpbnQiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iaW50IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiBzcGVjaWZpZWQgdGhlIG9wZW4gZmlsZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSBzcGVjaWZpZWQgcGVuZGluZyBjaGFuZ2VsaXN0IG51bWJlcjsgb3RoZXJ3aXNlIHRoZSBvcGVuIGZpbGVzIGFyZQotIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVmYXVsdCBjaGFuZ2VsaXN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiBzcGVjaWZpZWQgdGhlIG9wZW4gZmlsZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSBzcGVjaWZpZWQgcGVuZGluZyBjaGFuZ2VsaXN0IG51bWJlcjsgb3RoZXJ3aXNlIHRoZSBvcGVuIGZpbGVzIGFyZQotIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVmYXVsdCBjaGFuZ2VsaXN0LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNsaWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwNCBjbGllbnQgc3BlYyB0byB1c2U7Ci0gb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBwNCBjbGllbnQgc3BlYyB0byB1c2U7Ci0gb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbWRvcHRzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IGV4dHJhIGNvbW1hbmQgb3B0aW9uczsgb25seSB1c2VkIG9uIHNvbWUKLSBvZiB0aGUgUGVyZm9yY2UgdGFza3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCBleHRyYSBjb21tYW5kIG9wdGlvbnM7IG9ubHkgdXNlZCBvbiBzb21lCi0gb2YgdGhlIFBlcmZvcmNlIHRhc2tzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbW1hbmRsZW5ndGgiIHR5cGU9ImludCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJpbnQiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Bvc2l0aXZlIGludGVnZXIgc3BlY2lmeWluZyB0aGUgbWF4aW11bSBsZW5ndGgKLSAgIG9mIHRoZSBjb21tYW5kbGluZSB3aGVuIGNhbGxpbmcgUGVyZm9yY2UgdG8gYWRkIHRoZSBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgcG9zaXRpdmUgaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBtYXhpbXVtIGxlbmd0aAotICAgb2YgdGhlIGNvbW1hbmRsaW5lIHdoZW4gY2FsbGluZyBQZXJmb3JjZSB0byBhZGQgdGhlIGZpbGVzLiAKLSAgIERlZmF1bHRzIHRvIDQ1MCwgaGlnaGVyIHZhbHVlcyBtZWFuIGZhc3RlciBleGVjdXRpb24sCi0gICBidXQgYWxzbyBwb3NzaWJsZSBmYWlsdXJlcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIHRvIHN0b3AgdGhlIGJ1aWxkICh0cnVlLCBkZWZhdWx0KSAKLSBvciBrZWVwIGdvaW5nIGlmIGFuIGVycm9yIGlzIHJldHVybmVkIGZyb20gdGhlIHA0IGNvbW1hbmQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIHdoZXRoZXIgdG8gc3RvcCB0aGUgYnVpbGQgKHRydWUsIGRlZmF1bHQpIAotIG9yIGtlZXAgZ29pbmcgaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQgZnJvbSB0aGUgcDQgY29tbWFuZAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InBvcnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcDRkIHNlcnZlciBhbmQgcG9ydCB0byBjb25uZWN0IHRvOwotIG9wdGlvbmFsLCBkZWZhdWx0ICJwZXJmb3JjZToxNjY2Ii5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIHA0ZCBzZXJ2ZXIgYW5kIHBvcnQgdG8gY29ubmVjdCB0bzsKLSBvcHRpb25hbCwgZGVmYXVsdCAicGVyZm9yY2U6MTY2NiIKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHA0IHVzZXJuYW1lOwotIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgcDQgdXNlcm5hbWU7Ci0gb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2aWV3IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGNsaWVudCwgYnJhbmNoIG9yIGxhYmVsIHZpZXcgdG8gb3BlcmF0ZSB1cG9uOwotIG9wdGlvbmFsIGRlZmF1bHQgIi8vLi4uIi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGNsaWVudCwgYnJhbmNoIG9yIGxhYmVsIHZpZXcgdG8gb3BlcmF0ZSB1cG9uOwotIG9wdGlvbmFsIGRlZmF1bHQgIi8vLi4uIgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZpbGVzIHRvIGFkZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbZmlsZXMgdG8gYWRkXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0icDRjaGFuZ2UiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2UuUDRDaGFuZ2UiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1JlcXVlc3RzIGEgbmV3IGNoYW5nZWxpc3QgZnJvbSB0aGUgUGVyZm9yY2Ugc2VydmVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtSZXF1ZXN0cyBhIG5ldyBjaGFuZ2VsaXN0IGZyb20gdGhlIFBlcmZvcmNlIHNlcnZlci4KLSBQNENoYW5nZSBjcmVhdGVzIGEgbmV3IGNoYW5nZWxpc3QgaW4gcGVyZm9yY2UuIFA0Q2hhbmdlIHNldHMgdGhlIHByb3BlcnR5Ci0gJHtwNC5jaGFuZ2V9IHdpdGggdGhlIG5ldyBjaGFuZ2VsaXN0IG51bWJlci4gVGhpcyBzaG91bGQgdGhlbiBiZSBwYXNzZWQgaW50bwotIHA0ZWRpdCBhbmQgcDRzdWJtaXQuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGllbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcDQgY2xpZW50IHNwZWMgdG8gdXNlOwotIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgcDQgY2xpZW50IHNwZWMgdG8gdXNlOwotIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY21kb3B0cyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCBleHRyYSBjb21tYW5kIG9wdGlvbnM7IG9ubHkgdXNlZCBvbiBzb21lCi0gb2YgdGhlIFBlcmZvcmNlIHRhc2tzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgZXh0cmEgY29tbWFuZCBvcHRpb25zOyBvbmx5IHVzZWQgb24gc29tZQotIG9mIHRoZSBQZXJmb3JjZSB0YXNrcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Rlc2NyaXB0aW9uIGZvciBDaGFuZ2VMaXN0O29wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBEZXNjcmlwdGlvbiBmb3IgQ2hhbmdlTGlzdDtvcHRpb25hbC4KLSBJZiBub25lIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBkZWZhdWx0IHRvICJBdXRvU3VibWl0IEJ5IEFudCIKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIHRvIHN0b3AgdGhlIGJ1aWxkICh0cnVlLCBkZWZhdWx0KSAKLSBvciBrZWVwIGdvaW5nIGlmIGFuIGVycm9yIGlzIHJldHVybmVkIGZyb20gdGhlIHA0IGNvbW1hbmQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIHdoZXRoZXIgdG8gc3RvcCB0aGUgYnVpbGQgKHRydWUsIGRlZmF1bHQpIAotIG9yIGtlZXAgZ29pbmcgaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQgZnJvbSB0aGUgcDQgY29tbWFuZAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InBvcnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcDRkIHNlcnZlciBhbmQgcG9ydCB0byBjb25uZWN0IHRvOwotIG9wdGlvbmFsLCBkZWZhdWx0ICJwZXJmb3JjZToxNjY2Ii5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIHA0ZCBzZXJ2ZXIgYW5kIHBvcnQgdG8gY29ubmVjdCB0bzsKLSBvcHRpb25hbCwgZGVmYXVsdCAicGVyZm9yY2U6MTY2NiIKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHA0IHVzZXJuYW1lOwotIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgcDQgdXNlcm5hbWU7Ci0gb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2aWV3IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGNsaWVudCwgYnJhbmNoIG9yIGxhYmVsIHZpZXcgdG8gb3BlcmF0ZSB1cG9uOwotIG9wdGlvbmFsIGRlZmF1bHQgIi8vLi4uIi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGNsaWVudCwgYnJhbmNoIG9yIGxhYmVsIHZpZXcgdG8gb3BlcmF0ZSB1cG9uOwotIG9wdGlvbmFsIGRlZmF1bHQgIi8vLi4uIgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJwNGNvdW50ZXIiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2UuUDRDb3VudGVyIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPYnRhaW5zIG9yIHNldHMgdGhlIHZhbHVlIG9mIGEgY291bnRlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbT2J0YWlucyBvciBzZXRzIHRoZSB2YWx1ZSBvZiBhIGNvdW50ZXIuCi0KLSA8cD4gV2hlbiB1c2VkIGluIGl0cyBiYXNlIGZvcm0KLSAod2hlcmUgb25seSB0aGUgY291bnRlciBuYW1lIGlzIHByb3ZpZGVkKSwgdGhlIGNvdW50ZXIgdmFsdWUgd2lsbCBiZQotIHByaW50ZWQgdG8gdGhlIG91dHB1dCBzdHJlYW0uIFdoZW4gdGhlIHZhbHVlIGlzIHByb3ZpZGVkLCB0aGUgY291bnRlcgotIHdpbGwgYmUgc2V0IHRvIHRoZSB2YWx1ZSBwcm92aWRlZC4gV2hlbiBhIHByb3BlcnR5IG5hbWUgaXMgcHJvdmlkZWQsCi0gdGhlIHByb3BlcnR5IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBjb3VudGVyLiBZb3UgbWF5Ci0gbm90IHNwZWNpZnkgdG8gYm90aCBnZXQgYW5kIHNldCB0aGUgdmFsdWUgb2YgdGhlIGNvdW50ZXIgaW4gdGhlIHNhbWUKLSBUYXNrLgotIDwvcD4KLSA8UD4KLSBUaGUgdXNlciBwZXJmb3JtaW5nIHRoaXMgdGFzayBtdXN0IGhhdmUgUGVyZm9yY2UgJnF1b3Q7cmV2aWV3JnF1b3Q7IHBlcm1pc3Npb25zCi0gYXMgZGVmaW5lZCBieSBQZXJmb3JjZSBwcm90ZWN0aW9ucyBpbiBvcmRlciBmb3IgdGhpcyB0YXNrIHRvIHN1Y2NlZWQuCi08L1A+Ci0KLSBFeGFtcGxlIFVzYWdlOjxicj4KLSAmbHQ7cDRjb3VudGVyIG5hbWU9IiR7cDQuY291bnRlcn0iIHByb3BlcnR5PSR7cDQuY2hhbmdlfSIvJmd0O11dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xpZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHA0IGNsaWVudCBzcGVjIHRvIHVzZTsKLSBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIHA0IGNsaWVudCBzcGVjIHRvIHVzZTsKLSBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlcgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNtZG9wdHMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgZXh0cmEgY29tbWFuZCBvcHRpb25zOyBvbmx5IHVzZWQgb24gc29tZQotIG9mIHRoZSBQZXJmb3JjZSB0YXNrcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IGV4dHJhIGNvbW1hbmQgb3B0aW9uczsgb25seSB1c2VkIG9uIHNvbWUKLSBvZiB0aGUgUGVyZm9yY2UgdGFza3MuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciB0byBzdG9wIHRoZSBidWlsZCAodHJ1ZSwgZGVmYXVsdCkgCi0gb3Iga2VlcCBnb2luZyBpZiBhbiBlcnJvciBpcyByZXR1cm5lZCBmcm9tIHRoZSBwNCBjb21tYW5kLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICB3aGV0aGVyIHRvIHN0b3AgdGhlIGJ1aWxkICh0cnVlLCBkZWZhdWx0KSAKLSBvciBrZWVwIGdvaW5nIGlmIGFuIGVycm9yIGlzIHJldHVybmVkIGZyb20gdGhlIHA0IGNvbW1hbmQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG5hbWUgb2YgdGhlIGNvdW50ZXI7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgY291bnRlcjsgcmVxdWlyZWQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb3J0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHA0ZCBzZXJ2ZXIgYW5kIHBvcnQgdG8gY29ubmVjdCB0bzsKLSBvcHRpb25hbCwgZGVmYXVsdCAicGVyZm9yY2U6MTY2NiIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBwNGQgc2VydmVyIGFuZCBwb3J0IHRvIGNvbm5lY3QgdG87Ci0gb3B0aW9uYWwsIGRlZmF1bHQgInBlcmZvcmNlOjE2NjYiCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvcGVydHkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBIHByb3BlcnR5IHRvIGJlIHNldCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgY291bnRlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgQSBwcm9wZXJ0eSB0byBiZSBzZXQgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIGNvdW50ZXIKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHA0IHVzZXJuYW1lOwotIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgcDQgdXNlcm5hbWU7Ci0gb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0iaW50IgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGNvdW50ZXI7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgbmV3IHZhbHVlIGZvciB0aGUgY291bnRlcjsgb3B0aW9uYWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmlldyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBjbGllbnQsIGJyYW5jaCBvciBsYWJlbCB2aWV3IHRvIG9wZXJhdGUgdXBvbjsKLSBvcHRpb25hbCBkZWZhdWx0ICIvLy4uLiIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBjbGllbnQsIGJyYW5jaCBvciBsYWJlbCB2aWV3IHRvIG9wZXJhdGUgdXBvbjsKLSBvcHRpb25hbCBkZWZhdWx0ICIvLy4uLiIKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0icDRkZWxldGUiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2UuUDREZWxldGUiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NoZWNrb3V0IGZpbGVzIGZvciBkZWxldGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbQ2hlY2tvdXQgZmlsZXMgZm9yIGRlbGV0aW9uLgotCi0gRXhhbXBsZSBVc2FnZTo8YnI+Ci0gJmx0O3A0ZGVsZXRlIGNoYW5nZT0iJHtwNC5jaGFuZ2V9IiB2aWV3PSIvL2RlcG90L3Byb2plY3QvZm9vLnR4dCIgLyZndDs8YnI+Ci0KLSBTaW1wbGUgcmUtd3JpdGUgb2YgUDRFZGl0IGNoYW5naW5nICdlZGl0JyB0byAnZGVsZXRlJy48YnI+XV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBbiBleGlzdGluZyBjaGFuZ2VsaXN0IG51bWJlciBmb3IgdGhlIGRlbGV0aW9uOyBvcHRpb25hbAotIGJ1dCBzdHJvbmdseSByZWNvbW1lbmRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgQW4gZXhpc3RpbmcgY2hhbmdlbGlzdCBudW1iZXIgZm9yIHRoZSBkZWxldGlvbjsgb3B0aW9uYWwKLSBidXQgc3Ryb25nbHkgcmVjb21tZW5kZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xpZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHA0IGNsaWVudCBzcGVjIHRvIHVzZTsKLSBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIHA0IGNsaWVudCBzcGVjIHRvIHVzZTsKLSBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlcgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNtZG9wdHMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgZXh0cmEgY29tbWFuZCBvcHRpb25zOyBvbmx5IHVzZWQgb24gc29tZQotIG9mIHRoZSBQZXJmb3JjZSB0YXNrcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IGV4dHJhIGNvbW1hbmQgb3B0aW9uczsgb25seSB1c2VkIG9uIHNvbWUKLSBvZiB0aGUgUGVyZm9yY2UgdGFza3MuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciB0byBzdG9wIHRoZSBidWlsZCAodHJ1ZSwgZGVmYXVsdCkgCi0gb3Iga2VlcCBnb2luZyBpZiBhbiBlcnJvciBpcyByZXR1cm5lZCBmcm9tIHRoZSBwNCBjb21tYW5kLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICB3aGV0aGVyIHRvIHN0b3AgdGhlIGJ1aWxkICh0cnVlLCBkZWZhdWx0KSAKLSBvciBrZWVwIGdvaW5nIGlmIGFuIGVycm9yIGlzIHJldHVybmVkIGZyb20gdGhlIHA0IGNvbW1hbmQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb3J0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHA0ZCBzZXJ2ZXIgYW5kIHBvcnQgdG8gY29ubmVjdCB0bzsKLSBvcHRpb25hbCwgZGVmYXVsdCAicGVyZm9yY2U6MTY2NiIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBwNGQgc2VydmVyIGFuZCBwb3J0IHRvIGNvbm5lY3QgdG87Ci0gb3B0aW9uYWwsIGRlZmF1bHQgInBlcmZvcmNlOjE2NjYiCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwNCB1c2VybmFtZTsKLSBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIHA0IHVzZXJuYW1lOwotIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmlldyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBjbGllbnQsIGJyYW5jaCBvciBsYWJlbCB2aWV3IHRvIG9wZXJhdGUgdXBvbjsKLSBvcHRpb25hbCBkZWZhdWx0ICIvLy4uLiIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBjbGllbnQsIGJyYW5jaCBvciBsYWJlbCB2aWV3IHRvIG9wZXJhdGUgdXBvbjsKLSBvcHRpb25hbCBkZWZhdWx0ICIvLy4uLiIKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0icDRlZGl0IiBjYXRlZ29yeT0ib3RoZXIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlLlA0RWRpdCIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbT3BlbiBmaWxlKHMpIGZvciBlZGl0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtPcGVuIGZpbGUocykgZm9yIGVkaXQuIAotIFA0Q2hhbmdlIHNob3VsZCBiZSB1c2VkIHRvIG9idGFpbiBhIG5ldyBjaGFuZ2VsaXN0IGZvciBQNEVkaXQgYXMsCi0gYWx0aG91Z2ggUDRFZGl0IGNhbiBvcGVuIGZpbGVzIHRvIHRoZSBkZWZhdWx0IGNoYW5nZSwgIAotIFA0U3VibWl0IGNhbm5vdCB5ZXQgc3VibWl0IHRvIGl0LgotIEV4YW1wbGUgVXNhZ2U6PGJyPgotICZsdDtwNGVkaXQgY2hhbmdlPSIke3A0LmNoYW5nZX0iIHZpZXc9Ii8vZGVwb3QvcHJvamVjdC9mb28udHh0IiAvJmd0O11dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2hhbmdlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQW4gZXhpc3RpbmcgY2hhbmdlbGlzdCBudW1iZXIgdG8gYXNzaWduIGZpbGVzIHRvOyBvcHRpb25hbAotIGJ1dCBzdHJvbmdseSByZWNvbW1lbmRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgQW4gZXhpc3RpbmcgY2hhbmdlbGlzdCBudW1iZXIgdG8gYXNzaWduIGZpbGVzIHRvOyBvcHRpb25hbAotIGJ1dCBzdHJvbmdseSByZWNvbW1lbmRlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGllbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcDQgY2xpZW50IHNwZWMgdG8gdXNlOwotIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgcDQgY2xpZW50IHNwZWMgdG8gdXNlOwotIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY21kb3B0cyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCBleHRyYSBjb21tYW5kIG9wdGlvbnM7IG9ubHkgdXNlZCBvbiBzb21lCi0gb2YgdGhlIFBlcmZvcmNlIHRhc2tzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgZXh0cmEgY29tbWFuZCBvcHRpb25zOyBvbmx5IHVzZWQgb24gc29tZQotIG9mIHRoZSBQZXJmb3JjZSB0YXNrcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIHRvIHN0b3AgdGhlIGJ1aWxkICh0cnVlLCBkZWZhdWx0KSAKLSBvciBrZWVwIGdvaW5nIGlmIGFuIGVycm9yIGlzIHJldHVybmVkIGZyb20gdGhlIHA0IGNvbW1hbmQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIHdoZXRoZXIgdG8gc3RvcCB0aGUgYnVpbGQgKHRydWUsIGRlZmF1bHQpIAotIG9yIGtlZXAgZ29pbmcgaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQgZnJvbSB0aGUgcDQgY29tbWFuZAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InBvcnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcDRkIHNlcnZlciBhbmQgcG9ydCB0byBjb25uZWN0IHRvOwotIG9wdGlvbmFsLCBkZWZhdWx0ICJwZXJmb3JjZToxNjY2Ii5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIHA0ZCBzZXJ2ZXIgYW5kIHBvcnQgdG8gY29ubmVjdCB0bzsKLSBvcHRpb25hbCwgZGVmYXVsdCAicGVyZm9yY2U6MTY2NiIKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHA0IHVzZXJuYW1lOwotIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgcDQgdXNlcm5hbWU7Ci0gb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2aWV3IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGNsaWVudCwgYnJhbmNoIG9yIGxhYmVsIHZpZXcgdG8gb3BlcmF0ZSB1cG9uOwotIG9wdGlvbmFsIGRlZmF1bHQgIi8vLi4uIi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGNsaWVudCwgYnJhbmNoIG9yIGxhYmVsIHZpZXcgdG8gb3BlcmF0ZSB1cG9uOwotIG9wdGlvbmFsIGRlZmF1bHQgIi8vLi4uIgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJwNGhhdmUiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2UuUDRIYXZlIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtMaXN0cyBQZXJmb3JjZSBmaWxlcyBjdXJyZW50bHkgb24gY2xpZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtMaXN0cyBQZXJmb3JjZSBmaWxlcyBjdXJyZW50bHkgb24gY2xpZW50LgotCi0gUDRIYXZlIHNpbXBseSBkdW1wcyB0aGUgY3VycmVudCBmaWxlIHZlcnNpb24gaW5mbyBpbnRvCi0gdGhlIEFudCBsb2cgKG9yIHN0ZG91dCkuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGllbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcDQgY2xpZW50IHNwZWMgdG8gdXNlOwotIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgcDQgY2xpZW50IHNwZWMgdG8gdXNlOwotIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY21kb3B0cyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCBleHRyYSBjb21tYW5kIG9wdGlvbnM7IG9ubHkgdXNlZCBvbiBzb21lCi0gb2YgdGhlIFBlcmZvcmNlIHRhc2tzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgZXh0cmEgY29tbWFuZCBvcHRpb25zOyBvbmx5IHVzZWQgb24gc29tZQotIG9mIHRoZSBQZXJmb3JjZSB0YXNrcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIHRvIHN0b3AgdGhlIGJ1aWxkICh0cnVlLCBkZWZhdWx0KSAKLSBvciBrZWVwIGdvaW5nIGlmIGFuIGVycm9yIGlzIHJldHVybmVkIGZyb20gdGhlIHA0IGNvbW1hbmQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIHdoZXRoZXIgdG8gc3RvcCB0aGUgYnVpbGQgKHRydWUsIGRlZmF1bHQpIAotIG9yIGtlZXAgZ29pbmcgaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQgZnJvbSB0aGUgcDQgY29tbWFuZAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InBvcnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcDRkIHNlcnZlciBhbmQgcG9ydCB0byBjb25uZWN0IHRvOwotIG9wdGlvbmFsLCBkZWZhdWx0ICJwZXJmb3JjZToxNjY2Ii5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIHA0ZCBzZXJ2ZXIgYW5kIHBvcnQgdG8gY29ubmVjdCB0bzsKLSBvcHRpb25hbCwgZGVmYXVsdCAicGVyZm9yY2U6MTY2NiIKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHA0IHVzZXJuYW1lOwotIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgcDQgdXNlcm5hbWU7Ci0gb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2aWV3IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGNsaWVudCwgYnJhbmNoIG9yIGxhYmVsIHZpZXcgdG8gb3BlcmF0ZSB1cG9uOwotIG9wdGlvbmFsIGRlZmF1bHQgIi8vLi4uIi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGNsaWVudCwgYnJhbmNoIG9yIGxhYmVsIHZpZXcgdG8gb3BlcmF0ZSB1cG9uOwotIG9wdGlvbmFsIGRlZmF1bHQgIi8vLi4uIgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJwNGxhYmVsIiBjYXRlZ29yeT0ib3RoZXIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlLlA0TGFiZWwiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NyZWF0ZXMgYSBuZXcgUGVyZm9yY2UgbGFiZWwgYW5kIHNldCBjb250ZW50cyB0byByZWZsZWN0IGN1cnJlbnQgY2xpZW50IGZpbGUgcmV2aXNpb25zLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtDcmVhdGVzIGEgbmV3IFBlcmZvcmNlIGxhYmVsIGFuZCBzZXQgY29udGVudHMgdG8gcmVmbGVjdCBjdXJyZW50Ci0gIGNsaWVudCBmaWxlIHJldmlzaW9ucy4KLQotICBMYWJlbCBuYW1lIGRlZmF1bHRzIHRvIEFudExhYmVsIGlmIG5vbmUgc2V0LgotCi0gRXhhbXBsZSBVc2FnZToKLSA8cHJlPgotICAgJmx0O1A0TGFiZWwgbmFtZT0iTXlMYWJlbC0ke1RTVEFNUH0tJHtEU1RBTVB9IiBkZXNjPSJBdXRvIEJ1aWxkIExhYmVsIiAvJmd0OwotIDwvcHJlPl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xpZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHA0IGNsaWVudCBzcGVjIHRvIHVzZTsKLSBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIHA0IGNsaWVudCBzcGVjIHRvIHVzZTsKLSBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlcgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNtZG9wdHMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgZXh0cmEgY29tbWFuZCBvcHRpb25zOyBvbmx5IHVzZWQgb24gc29tZQotIG9mIHRoZSBQZXJmb3JjZSB0YXNrcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IGV4dHJhIGNvbW1hbmQgb3B0aW9uczsgb25seSB1c2VkIG9uIHNvbWUKLSBvZiB0aGUgUGVyZm9yY2UgdGFza3MuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzYyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xhYmVsIERlc2NyaXB0aW9uOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgTGFiZWwgRGVzY3JpcHRpb247IG9wdGlvbmFsCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciB0byBzdG9wIHRoZSBidWlsZCAodHJ1ZSwgZGVmYXVsdCkgCi0gb3Iga2VlcCBnb2luZyBpZiBhbiBlcnJvciBpcyByZXR1cm5lZCBmcm9tIHRoZSBwNCBjb21tYW5kLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICB3aGV0aGVyIHRvIHN0b3AgdGhlIGJ1aWxkICh0cnVlLCBkZWZhdWx0KSAKLSBvciBrZWVwIGdvaW5nIGlmIGFuIGVycm9yIGlzIHJldHVybmVkIGZyb20gdGhlIHA0IGNvbW1hbmQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2NrIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hlbiBzZXQgdG8gImxvY2tlZCIsIFBlcmZvcmNlIHdpbGwgbG9jayB0aGUgbGFiZWwgb25jZSBjcmVhdGVkOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgd2hlbiBzZXQgdG8gImxvY2tlZCIsIFBlcmZvcmNlIHdpbGwgbG9jayB0aGUgbGFiZWwgb25jZSBjcmVhdGVkOyBvcHRpb25hbC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG5hbWUgb2YgdGhlIGxhYmVsOyBvcHRpb25hbCwgZGVmYXVsdCAiQW50TGFiZWwiLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgbGFiZWw7IG9wdGlvbmFsLCBkZWZhdWx0ICJBbnRMYWJlbCIKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb3J0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHA0ZCBzZXJ2ZXIgYW5kIHBvcnQgdG8gY29ubmVjdCB0bzsKLSBvcHRpb25hbCwgZGVmYXVsdCAicGVyZm9yY2U6MTY2NiIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBwNGQgc2VydmVyIGFuZCBwb3J0IHRvIGNvbm5lY3QgdG87Ci0gb3B0aW9uYWwsIGRlZmF1bHQgInBlcmZvcmNlOjE2NjYiCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwNCB1c2VybmFtZTsKLSBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIHA0IHVzZXJuYW1lOwotIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmlldyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBjbGllbnQsIGJyYW5jaCBvciBsYWJlbCB2aWV3IHRvIG9wZXJhdGUgdXBvbjsKLSBvcHRpb25hbCBkZWZhdWx0ICIvLy4uLiIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBjbGllbnQsIGJyYW5jaCBvciBsYWJlbCB2aWV3IHRvIG9wZXJhdGUgdXBvbjsKLSBvcHRpb25hbCBkZWZhdWx0ICIvLy4uLiIKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0icDRyZW9wZW4iIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2UuUDRSZW9wZW4iCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05vIERlc2NyaXB0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtdXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNsaWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwNCBjbGllbnQgc3BlYyB0byB1c2U7Ci0gb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBwNCBjbGllbnQgc3BlYyB0byB1c2U7Ci0gb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbWRvcHRzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IGV4dHJhIGNvbW1hbmQgb3B0aW9uczsgb25seSB1c2VkIG9uIHNvbWUKLSBvZiB0aGUgUGVyZm9yY2UgdGFza3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCBleHRyYSBjb21tYW5kIG9wdGlvbnM7IG9ubHkgdXNlZCBvbiBzb21lCi0gb2YgdGhlIFBlcmZvcmNlIHRhc2tzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgdG8gc3RvcCB0aGUgYnVpbGQgKHRydWUsIGRlZmF1bHQpIAotIG9yIGtlZXAgZ29pbmcgaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQgZnJvbSB0aGUgcDQgY29tbWFuZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgd2hldGhlciB0byBzdG9wIHRoZSBidWlsZCAodHJ1ZSwgZGVmYXVsdCkgCi0gb3Iga2VlcCBnb2luZyBpZiBhbiBlcnJvciBpcyByZXR1cm5lZCBmcm9tIHRoZSBwNCBjb21tYW5kCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9ydCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwNGQgc2VydmVyIGFuZCBwb3J0IHRvIGNvbm5lY3QgdG87Ci0gb3B0aW9uYWwsIGRlZmF1bHQgInBlcmZvcmNlOjE2NjYiLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgcDRkIHNlcnZlciBhbmQgcG9ydCB0byBjb25uZWN0IHRvOwotIG9wdGlvbmFsLCBkZWZhdWx0ICJwZXJmb3JjZToxNjY2IgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRvY2hhbmdlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGNoYW5nZWxpc3QgdG8gbW92ZSBmaWxlcyB0bzsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBjaGFuZ2VsaXN0IHRvIG1vdmUgZmlsZXMgdG87IHJlcXVpcmVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcDQgdXNlcm5hbWU7Ci0gb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBwNCB1c2VybmFtZTsKLSBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlcgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZpZXciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgY2xpZW50LCBicmFuY2ggb3IgbGFiZWwgdmlldyB0byBvcGVyYXRlIHVwb247Ci0gb3B0aW9uYWwgZGVmYXVsdCAiLy8uLi4iLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgY2xpZW50LCBicmFuY2ggb3IgbGFiZWwgdmlldyB0byBvcGVyYXRlIHVwb247Ci0gb3B0aW9uYWwgZGVmYXVsdCAiLy8uLi4iCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9InA0cmV2ZXJ0IiBjYXRlZ29yeT0ib3RoZXIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlLlA0UmV2ZXJ0IgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtSZXZlcnQgUGVyZm9yY2Ugb3BlbiBmaWxlcyBvciBmaWxlcyBpbiBhIGNoYW5nZWxpc3RdXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbUmV2ZXJ0IFBlcmZvcmNlIG9wZW4gZmlsZXMgb3IgZmlsZXMgaW4gYSBjaGFuZ2VsaXN0XV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgY2hhbmdlbGlzdCB0byByZXZlcnQ7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgY2hhbmdlbGlzdCB0byByZXZlcnQ7IG9wdGlvbmFsLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNsaWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwNCBjbGllbnQgc3BlYyB0byB1c2U7Ci0gb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBwNCBjbGllbnQgc3BlYyB0byB1c2U7Ci0gb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbWRvcHRzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IGV4dHJhIGNvbW1hbmQgb3B0aW9uczsgb25seSB1c2VkIG9uIHNvbWUKLSBvZiB0aGUgUGVyZm9yY2UgdGFza3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCBleHRyYSBjb21tYW5kIG9wdGlvbnM7IG9ubHkgdXNlZCBvbiBzb21lCi0gb2YgdGhlIFBlcmZvcmNlIHRhc2tzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgdG8gc3RvcCB0aGUgYnVpbGQgKHRydWUsIGRlZmF1bHQpIAotIG9yIGtlZXAgZ29pbmcgaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQgZnJvbSB0aGUgcDQgY29tbWFuZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgd2hldGhlciB0byBzdG9wIHRoZSBidWlsZCAodHJ1ZSwgZGVmYXVsdCkgCi0gb3Iga2VlcCBnb2luZyBpZiBhbiBlcnJvciBpcyByZXR1cm5lZCBmcm9tIHRoZSBwNCBjb21tYW5kCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9ydCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwNGQgc2VydmVyIGFuZCBwb3J0IHRvIGNvbm5lY3QgdG87Ci0gb3B0aW9uYWwsIGRlZmF1bHQgInBlcmZvcmNlOjE2NjYiLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgcDRkIHNlcnZlciBhbmQgcG9ydCB0byBjb25uZWN0IHRvOwotIG9wdGlvbmFsLCBkZWZhdWx0ICJwZXJmb3JjZToxNjY2IgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InJldmVydG9ubHl1bmNoYW5nZWQiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmxhZyB0byByZXZlcnQgb25seSB1bmNoYW5nZWQgZmlsZXMgKHA0IHJldmVydCAtYSk7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBmbGFnIHRvIHJldmVydCBvbmx5IHVuY2hhbmdlZCBmaWxlcyAocDQgcmV2ZXJ0IC1hKTsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwNCB1c2VybmFtZTsKLSBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIHA0IHVzZXJuYW1lOwotIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmlldyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBjbGllbnQsIGJyYW5jaCBvciBsYWJlbCB2aWV3IHRvIG9wZXJhdGUgdXBvbjsKLSBvcHRpb25hbCBkZWZhdWx0ICIvLy4uLiIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBjbGllbnQsIGJyYW5jaCBvciBsYWJlbCB2aWV3IHRvIG9wZXJhdGUgdXBvbjsKLSBvcHRpb25hbCBkZWZhdWx0ICIvLy4uLiIKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0icDRzdWJtaXQiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2UuUDRTdWJtaXQiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1N1Ym1pdHMgYSBudW1iZXJlZCBjaGFuZ2VsaXN0IHRvIFBlcmZvcmNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtTdWJtaXRzIGEgbnVtYmVyZWQgY2hhbmdlbGlzdCB0byBQZXJmb3JjZS4KLQotIDxCPk5vdGU6PC9CPiBQNFN1Ym1pdCBjYW5ub3QgKHlldCkgc3VibWl0IHRoZSBkZWZhdWx0IGNoYW5nZWxpc3QuCi0gVGhpcyBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtIHdpdGggdGhlIEFOVCB0YXNrIGFzIHRoZSB1c3VhbCBmbG93IGlzCi0gUDRDaGFuZ2UgdG8gY3JlYXRlIGEgbmV3IG51bWJlcmVkIGNoYW5nZSBmb2xsb3dlZCBieSBQNEVkaXQgdGhlbiBQNFN1Ym1pdC4KLQotIEV4YW1wbGUgVXNhZ2U6LTxicj4KLSAmbHQ7cDRzdWJtaXQgY2hhbmdlPSIke3A0LmNoYW5nZX0iIC8mZ3Q7XV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgY2hhbmdlbGlzdCBudW1iZXIgdG8gc3VibWl0OyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGNoYW5nZWxpc3QgbnVtYmVyIHRvIHN1Ym1pdDsgcmVxdWlyZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xpZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHA0IGNsaWVudCBzcGVjIHRvIHVzZTsKLSBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIHA0IGNsaWVudCBzcGVjIHRvIHVzZTsKLSBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlcgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNtZG9wdHMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgZXh0cmEgY29tbWFuZCBvcHRpb25zOyBvbmx5IHVzZWQgb24gc29tZQotIG9mIHRoZSBQZXJmb3JjZSB0YXNrcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IGV4dHJhIGNvbW1hbmQgb3B0aW9uczsgb25seSB1c2VkIG9uIHNvbWUKLSBvZiB0aGUgUGVyZm9yY2UgdGFza3MuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciB0byBzdG9wIHRoZSBidWlsZCAodHJ1ZSwgZGVmYXVsdCkgCi0gb3Iga2VlcCBnb2luZyBpZiBhbiBlcnJvciBpcyByZXR1cm5lZCBmcm9tIHRoZSBwNCBjb21tYW5kLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICB3aGV0aGVyIHRvIHN0b3AgdGhlIGJ1aWxkICh0cnVlLCBkZWZhdWx0KSAKLSBvciBrZWVwIGdvaW5nIGlmIGFuIGVycm9yIGlzIHJldHVybmVkIGZyb20gdGhlIHA0IGNvbW1hbmQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb3J0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHA0ZCBzZXJ2ZXIgYW5kIHBvcnQgdG8gY29ubmVjdCB0bzsKLSBvcHRpb25hbCwgZGVmYXVsdCAicGVyZm9yY2U6MTY2NiIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBwNGQgc2VydmVyIGFuZCBwb3J0IHRvIGNvbm5lY3QgdG87Ci0gb3B0aW9uYWwsIGRlZmF1bHQgInBlcmZvcmNlOjE2NjYiCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwNCB1c2VybmFtZTsKLSBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIHA0IHVzZXJuYW1lOwotIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmlldyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBjbGllbnQsIGJyYW5jaCBvciBsYWJlbCB2aWV3IHRvIG9wZXJhdGUgdXBvbjsKLSBvcHRpb25hbCBkZWZhdWx0ICIvLy4uLiIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBjbGllbnQsIGJyYW5jaCBvciBsYWJlbCB2aWV3IHRvIG9wZXJhdGUgdXBvbjsKLSBvcHRpb25hbCBkZWZhdWx0ICIvLy4uLiIKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0icDRzeW5jIiBjYXRlZ29yeT0ib3RoZXIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlLlA0U3luYyIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3luY2hyb25pemUgY2xpZW50IHNwYWNlIHRvIGEgUGVyZm9yY2UgZGVwb3Qgdmlldy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbU3luY2hyb25pemUgY2xpZW50IHNwYWNlIHRvIGEgUGVyZm9yY2UgZGVwb3Qgdmlldy4KLQotICBUaGUgQVBJIGFsbG93cyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgb2YgdGhlICJwNCBzeW5jIiBjb21tYW5kCi0gKHN1Y2ggYXMgInA0IHN5bmMgLWYgLy8uLi4jaGF2ZSIgb3Igb3RoZXIgZXhvdGljIGludm9jYXRpb25zKS48L1A+Ci0KLSA8Yj5FeGFtcGxlIFVzYWdlOjwvYj4KLSA8dGFibGUgYm9yZGVyPSIxIj4KLSA8dGg+RnVuY3Rpb248L3RoPjx0aD5Db21tYW5kPC90aD4KLSA8dHI+PHRkPlN5bmMgdG8gaGVhZCB1c2luZyBQNFVTRVIsIFA0UE9SVCBhbmQgUDRDTElFTlQgc2V0dGluZ3Mgc3BlY2lmaWVkPC90ZD48dGQ+Jmx0O1A0U3luYyA8YnI+UDR2aWV3PSIvL3Byb2plY3RzL2Zvby9tYWluL3NvdXJjZS8uLi4iIDxicj5QNFVzZXI9ImZibG9nZ3MiIDxicj5QNFBvcnQ9ImttMDE6MTY2NiIgPGJyPlA0Q2xpZW50PSJmYmxvZ2dzY2xpZW50IiAvJmd0OzwvdGQ+PC90cj4KLSA8dHI+PHRkPlN5bmMgdG8gaGVhZCB1c2luZyBQNFVTRVIsIFA0UE9SVCBhbmQgUDRDTElFTlQgc2V0dGluZ3MgZGVmaW5lZCBpbiBlbnZpcm9ubWVudDwvdGQ+PHRkPiZsdDtQNFN5bmMgUDR2aWV3PSIvL3Byb2plY3RzL2Zvby9tYWluL3NvdXJjZS8uLi4iIC8mZ3Q7PC90ZD48L3RyPgotIDx0cj48dGQ+Rm9yY2UgYSByZS1zeW5jIHRvIGhlYWQsIHJlZnJlc2hpbmcgYWxsIGZpbGVzPC90ZD48dGQ+Jmx0O1A0U3luYyBmb3JjZT0ieWVzIiBQNHZpZXc9Ii8vcHJvamVjdHMvZm9vL21haW4vc291cmNlLy4uLiIgLyZndDs8L3RkPjwvdHI+Ci0gPHRyPjx0ZD5TeW5jIHRvIGEgbGFiZWw8L3RkPjx0ZD4mbHQ7UDRTeW5jIGxhYmVsPSJteVBlcmZvcmNlTGFiZWwiIC8mZ3Q7PC90ZD48L3RyPgotIDwvdGFibGU+XV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGllbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcDQgY2xpZW50IHNwZWMgdG8gdXNlOwotIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgcDQgY2xpZW50IHNwZWMgdG8gdXNlOwotIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB1c2VyCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY21kb3B0cyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCBleHRyYSBjb21tYW5kIG9wdGlvbnM7IG9ubHkgdXNlZCBvbiBzb21lCi0gb2YgdGhlIFBlcmZvcmNlIHRhc2tzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgZXh0cmEgY29tbWFuZCBvcHRpb25zOyBvbmx5IHVzZWQgb24gc29tZQotIG9mIHRoZSBQZXJmb3JjZSB0YXNrcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIHRvIHN0b3AgdGhlIGJ1aWxkICh0cnVlLCBkZWZhdWx0KSAKLSBvciBrZWVwIGdvaW5nIGlmIGFuIGVycm9yIGlzIHJldHVybmVkIGZyb20gdGhlIHA0IGNvbW1hbmQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIHdoZXRoZXIgdG8gc3RvcCB0aGUgYnVpbGQgKHRydWUsIGRlZmF1bHQpIAotIG9yIGtlZXAgZ29pbmcgaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQgZnJvbSB0aGUgcDQgY29tbWFuZAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZvcmNlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRm9yY2UgYSByZWZyZXNoIG9mIGZpbGVzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQ7IGZhbHNlIGJ5IGRlZmF1bHQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIGZvcmNlIGEgcmVmcmVzaCBvZiBmaWxlcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0OyBmYWxzZSBieSBkZWZhdWx0LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTGFiZWwgdG8gc3luYyBjbGllbnQgdG87IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBMYWJlbCB0byBzeW5jIGNsaWVudCB0bzsgb3B0aW9uYWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9ydCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwNGQgc2VydmVyIGFuZCBwb3J0IHRvIGNvbm5lY3QgdG87Ci0gb3B0aW9uYWwsIGRlZmF1bHQgInBlcmZvcmNlOjE2NjYiLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgcDRkIHNlcnZlciBhbmQgcG9ydCB0byBjb25uZWN0IHRvOwotIG9wdGlvbmFsLCBkZWZhdWx0ICJwZXJmb3JjZToxNjY2IgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcDQgdXNlcm5hbWU7Ci0gb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHVzZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBwNCB1c2VybmFtZTsKLSBvcHRpb25hbCwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdXNlcgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZpZXciIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgY2xpZW50LCBicmFuY2ggb3IgbGFiZWwgdmlldyB0byBvcGVyYXRlIHVwb247Ci0gb3B0aW9uYWwgZGVmYXVsdCAiLy8uLi4iLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgY2xpZW50LCBicmFuY2ggb3IgbGFiZWwgdmlldyB0byBvcGVyYXRlIHVwb247Ci0gb3B0aW9uYWwgZGVmYXVsdCAiLy8uLi4iCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9InBhcmFsbGVsIiBjYXRlZ29yeT0iY29udHJvbCIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUGFyYWxsZWwiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0V4ZWN1dGVzIHRoZSBjb250YWluZWQgdGFza3MgaW4gc2VwYXJhdGUgdGhyZWFkcywgY29udGludWluZyBvbmNlIGFsbCBhcmUgY29tcGxldGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtFeGVjdXRlcyB0aGUgY29udGFpbmVkIHRhc2tzIGluIHNlcGFyYXRlIHRocmVhZHMsIGNvbnRpbnVpbmcKLSBvbmNlIGFsbCBhcmUgY29tcGxldGVkLgotIDxwPl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9InBhdGNoIiBjYXRlZ29yeT0idXRpbGl0eSIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUGF0Y2giCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BhdGNoZXMgYSBmaWxlIGJ5IGFwcGx5aW5nIGEgJ2RpZmYnIGZpbGUgdG8gaXQ7IHJlcXVpcmVzICJwYXRjaCIgdG8gYmUgb24gdGhlIGV4ZWN1dGlvbiBwYXRoLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtQYXRjaGVzIGEgZmlsZSBieSBhcHBseWluZyBhICdkaWZmJyBmaWxlIHRvIGl0OyByZXF1aXJlcyAicGF0Y2giIHRvIGJlCi0gb24gdGhlIGV4ZWN1dGlvbiBwYXRoLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYmFja3VwcyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRvIGNyZWF0ZSBiYWNrdXBzOyBvcHRpb25hbCwgZGVmYXVsdD1mYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgZmxhZyB0byBjcmVhdGUgYmFja3Vwczsgb3B0aW9uYWwsIGRlZmF1bHQ9ZmFsc2UKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXIiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZGlyZWN0b3J5IHRvIHJ1biB0aGUgcGF0Y2ggY29tbWFuZCBpbiwgZGVmYXVsdHMgdG8gdGhlCi0gcHJvamVjdCdzIGJhc2UgZGlyZWN0b3J5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgZGlyZWN0b3J5IHRvIHJ1biB0aGUgcGF0Y2ggY29tbWFuZCBpbiwgZGVmYXVsdHMgdG8gdGhlCi0gcHJvamVjdCdzIGJhc2UgZGlyZWN0b3J5LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Imlnbm9yZXdoaXRlc3BhY2UiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmxhZyB0byBpZ25vcmUgd2hpdGVzcGFjZSBkaWZmZXJlbmNlczsgZGVmYXVsdD1mYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgZmxhZyB0byBpZ25vcmUgd2hpdGVzcGFjZSBkaWZmZXJlbmNlczsgZGVmYXVsdD1mYWxzZQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im9yaWdpbmFsZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBmaWxlIHRvIHBhdGNoOyBvcHRpb25hbCBpZiBpdCBjYW4gYmUgaW5mZXJyZWQgZnJvbQotIHRoZSBkaWZmIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBmaWxlIHRvIHBhdGNoOyBvcHRpb25hbCBpZiBpdCBjYW4gYmUgaW5mZXJyZWQgZnJvbQotIHRoZSBkaWZmIGZpbGUKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXRjaGZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZmlsZSBjb250YWluaW5nIHRoZSBkaWZmIG91dHB1dDsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGRpZmYgb3V0cHV0OyByZXF1aXJlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJxdWlldCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXb3JrIHNpbGVudGx5IHVubGVzcyBhbiBlcnJvciBvY2N1cnM7IG9wdGlvbmFsLCBkZWZhdWx0PWZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBXb3JrIHNpbGVudGx5IHVubGVzcyBhbiBlcnJvciBvY2N1cnM7IG9wdGlvbmFsLCBkZWZhdWx0PWZhbHNlCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmV2ZXJzZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBc3N1bWUgcGF0Y2ggd2FzIGNyZWF0ZWQgd2l0aCBvbGQgYW5kIG5ldyBmaWxlcyBzd2FwcGVkOyBvcHRpb25hbCwKLSBkZWZhdWx0PWZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBBc3N1bWUgcGF0Y2ggd2FzIGNyZWF0ZWQgd2l0aCBvbGQgYW5kIG5ldyBmaWxlcyBzd2FwcGVkOyBvcHRpb25hbCwKLSBkZWZhdWx0PWZhbHNlCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3RyaXAiIHR5cGU9ImludCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJpbnQiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1N0cmlwIHRoZSBzbWFsbGVzdCBwcmVmaXggY29udGFpbmluZyA8aT5udW08L2k+IGxlYWRpbmcgc2xhc2hlcwotIGZyb20gZmlsZW5hbWVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTdHJpcCB0aGUgc21hbGxlc3QgcHJlZml4IGNvbnRhaW5pbmcgPGk+bnVtPC9pPiBsZWFkaW5nIHNsYXNoZXMKLSBmcm9tIGZpbGVuYW1lcy4KLQotIDxwPnBhdGNoJ3MgPGk+LXA8L2k+IG9wdGlvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0icGF0aGNvbnZlcnQiIGNhdGVnb3J5PSJ1dGlsaXR5IgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5QYXRoQ29udmVydCIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29udmVydHMgcGF0aCBhbmQgY2xhc3NwYXRoIGluZm9ybWF0aW9uIHRvIGEgc3BlY2lmaWMgdGFyZ2V0IE9TIGZvcm1hdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbQ29udmVydHMgcGF0aCBhbmQgY2xhc3NwYXRoIGluZm9ybWF0aW9uIHRvIGEgc3BlY2lmaWMgdGFyZ2V0IE9TCi0gZm9ybWF0LiBUaGUgcmVzdWx0aW5nIGZvcm1hdHRlZCBwYXRoIGlzIHBsYWNlZCBpbnRvIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkaXJzZXAiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZWZhdWx0IGRpcmVjdG9yeSBzZXBhcmF0b3Igc3RyaW5nOwotIGRlZmF1bHRzIHRvIGN1cnJlbnQgSlZNLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGRlZmF1bHQgZGlyZWN0b3J5IHNlcGFyYXRvciBzdHJpbmc7Ci0gZGVmYXVsdHMgdG8gY3VycmVudCBKVk0ge0BsaW5rIGphdmEuaW8uRmlsZSNzZXBhcmF0b3IgRmlsZS5zZXBhcmF0b3J9Ci0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGF0aHNlcCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RlZmF1bHQgcGF0aCBzZXBhcmF0b3Igc3RyaW5nOwotIGRlZmF1bHRzIHRvIGN1cnJlbnQgSlZNLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGRlZmF1bHQgcGF0aCBzZXBhcmF0b3Igc3RyaW5nOwotIGRlZmF1bHRzIHRvIGN1cnJlbnQgSlZNCi0ge0BsaW5rIGphdmEuaW8uRmlsZSNwYXRoU2VwYXJhdG9yIEZpbGUucGF0aFNlcGFyYXRvcn0KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwcm9wZXJ0eSBpbnRvIHdoaWNoIHRoZSBjb252ZXJ0ZWQgcGF0aCB3aWxsIGJlIHBsYWNlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIHByb3BlcnR5IGludG8gd2hpY2ggdGhlIGNvbnZlcnRlZCBwYXRoIHdpbGwgYmUgcGxhY2VkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InJlZmlkIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2UiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUmVmZXJlbmNlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgcmVmZXJlbmNlIHRvIGEgUGF0aCwgRmlsZVNldCwgRGlyU2V0LCBvciBGaWxlTGlzdCBkZWZpbmVkCi0gZWxzZXdoZXJlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBBZGRzIGEgcmVmZXJlbmNlIHRvIGEgUGF0aCwgRmlsZVNldCwgRGlyU2V0LCBvciBGaWxlTGlzdCBkZWZpbmVkCi0gZWxzZXdoZXJlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNldG9uZW1wdHkiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IHNldG9uZW1wdHkKLQotIElmIGZhbHNlLCBkb24ndCBzZXQgdGhlIG5ldyBwcm9wZXJ0eSBpZiB0aGUgcmVzdWx0IGlzIHRoZSBlbXB0eSBzdHJpbmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCBzZXRvbmVtcHR5Ci0KLSBJZiBmYWxzZSwgZG9uJ3Qgc2V0IHRoZSBuZXcgcHJvcGVydHkgaWYgdGhlIHJlc3VsdCBpcyB0aGUgZW1wdHkgc3RyaW5nLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldG9zIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5QYXRoQ29udmVydC5UYXJnZXRPcyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDt3aW5kb3dzJnF1b3Q7LCAmcXVvdDt1bml4JnF1b3Q7LCAmcXVvdDtuZXR3YXJlJnF1b3Q7LCAmcXVvdDtvcy8yJnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXQgdGFyZ2V0b3MgdG8gYSBwbGF0Zm9ybSB0byBvbmUgb2YKLSAid2luZG93cyIsICJ1bml4IiwgIm5ldHdhcmUiLCBvciAib3MvMiI7IHJlcXVpcmVkIHVubGVzcwotIHVubGVzcyBwYXRoc2VwIGFuZC9vciBkaXJzZXAgYXJlIHNwZWNpZmllZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRhcmdldG9zIHRvIGEgcGxhdGZvcm0gdG8gb25lIG9mCi0gIndpbmRvd3MiLCAidW5peCIsICJuZXR3YXJlIiwgb3IgIm9zLzIiOyByZXF1aXJlZCB1bmxlc3MKLSB1bmxlc3MgcGF0aHNlcCBhbmQvb3IgZGlyc2VwIGFyZSBzcGVjaWZpZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJtYXAiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlBhdGhDb252ZXJ0Lk1hcEVudHJ5IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGUgYSBuZXN0ZWQgTUFQIGVsZW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0NyZWF0ZSBhIG5lc3RlZCBNQVAgZWxlbWVudF1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ3JlYXRlIGEgbmVzdGVkIFBBVEggZWxlbWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQ3JlYXRlIGEgbmVzdGVkIFBBVEggZWxlbWVudF1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9InByb3BlcnR5IiBjYXRlZ29yeT0ib3RoZXIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlByb3BlcnR5IgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIGEgcHJvcGVydHkgYnkgbmFtZSwgb3Igc2V0IG9mIHByb3BlcnRpZXMgKGZyb20gZmlsZSBvciByZXNvdXJjZSkgaW4gdGhlIHByb2plY3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW1NldHMgYSBwcm9wZXJ0eSBieSBuYW1lLCBvciBzZXQgb2YgcHJvcGVydGllcyAoZnJvbSBmaWxlIG9yCi0gcmVzb3VyY2UpIGluIHRoZSBwcm9qZWN0LiAgPC9wPgotIFByb3BlcnRpZXMgYXJlIGltbXV0YWJsZTogd2hvZXZlciBzZXRzIGEgcHJvcGVydHkgZmlyc3QgZnJlZXplcyBpdCBmb3IgdGhlCi0gcmVzdCBvZiB0aGUgYnVpbGQ7IHRoZXkgYXJlIG1vc3QgZGVmaW5hdGVseSBub3QgdmFyaWFibGUuIAotIDxwPlRoZXJlIGFyZSBmaXZlIHdheXMgdG8gc2V0IHByb3BlcnRpZXM6PC9wPgotIDx1bD4KLSAgIDxsaT5CeSBzdXBwbHlpbmcgYm90aCB0aGUgPGk+bmFtZTwvaT4gYW5kIDxpPnZhbHVlPC9pPiBhdHRyaWJ1dGUuPC9saT4KLSAgIDxsaT5CeSBzdXBwbHlpbmcgYm90aCB0aGUgPGk+bmFtZTwvaT4gYW5kIDxpPnJlZmlkPC9pPiBhdHRyaWJ1dGUuPC9saT4KLSAgIDxsaT5CeSBzZXR0aW5nIHRoZSA8aT5maWxlPC9pPiBhdHRyaWJ1dGUgd2l0aCB0aGUgZmlsZW5hbWUgb2YgdGhlIHByb3BlcnR5Ci0gICAgIGZpbGUgdG8gbG9hZC4gVGhpcyBwcm9wZXJ0eSBmaWxlIGhhcyB0aGUgZm9ybWF0IGFzIGRlZmluZWQgYnkgdGhlIGZpbGUgdXNlZAotICAgICBpbiB0aGUgY2xhc3MgamF2YS51dGlsLlByb3BlcnRpZXMuPC9saT4KLSAgIDxsaT5CeSBzZXR0aW5nIHRoZSA8aT5yZXNvdXJjZTwvaT4gYXR0cmlidXRlIHdpdGggdGhlIHJlc291cmNlIG5hbWUgb2YgdGhlCi0gICAgIHByb3BlcnR5IGZpbGUgdG8gbG9hZC4gVGhpcyBwcm9wZXJ0eSBmaWxlIGhhcyB0aGUgZm9ybWF0IGFzIGRlZmluZWQgYnkgdGhlCi0gICAgIGZpbGUgdXNlZCBpbiB0aGUgY2xhc3MgamF2YS51dGlsLlByb3BlcnRpZXMuPC9saT4KLSAgIDxsaT5CeSBzZXR0aW5nIHRoZSA8aT5lbnZpcm9ubWVudDwvaT4gYXR0cmlidXRlIHdpdGggYSBwcmVmaXggdG8gdXNlLgotICAgICBQcm9wZXJ0aWVzIHdpbGwgYmUgZGVmaW5lZCBmb3IgZXZlcnkgZW52aXJvbm1lbnQgdmFyaWFibGUgYnkKLSAgICAgcHJlZml4aW5nIHRoZSBzdXBwbGllZCBuYW1lIGFuZCBhIHBlcmlvZCB0byB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuPC9saT4KLSA8L3VsPgotIDxwPkFsdGhvdWdoIGNvbWJpbmF0aW9ucyBvZiB0aGVzZSB3YXlzIGFyZSBwb3NzaWJsZSwgb25seSBvbmUgc2hvdWxkIGJlIHVzZWQKLSBhdCBhIHRpbWUuIFByb2JsZW1zIG1pZ2h0IG9jY3VyIHdpdGggdGhlIG9yZGVyIGluIHdoaWNoIHByb3BlcnRpZXMgYXJlIHNldCwgZm9yCi0gaW5zdGFuY2UuPC9wPgotIDxwPlRoZSB2YWx1ZSBwYXJ0IG9mIHRoZSBwcm9wZXJ0aWVzIGJlaW5nIHNldCwgbWlnaHQgY29udGFpbiByZWZlcmVuY2VzIHRvIG90aGVyCi0gcHJvcGVydGllcy4gVGhlc2UgcmVmZXJlbmNlcyBhcmUgcmVzb2x2ZWQgYXQgdGhlIHRpbWUgdGhlc2UgcHJvcGVydGllcyBhcmUgc2V0LgotIFRoaXMgYWxzbyBob2xkcyBmb3IgcHJvcGVydGllcyBsb2FkZWQgZnJvbSBhIHByb3BlcnR5IGZpbGUuPC9wPgotIFByb3BlcnRpZXMgYXJlIGNhc2Ugc2Vuc2l0aXZlLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCBhIHJlc291cmNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvb2tpbmcgdXAgYSByZXNvdXJjZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGhyZWYiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJSZWZlcmVuY2UiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCBhIHJlc291cmNlLAotIGdpdmVuIGFzIHJlZmVyZW5jZSB0byBhICZsdDtwYXRoJmd0OyBkZWZpbmVkIGVsc2V3aGVyZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgdGhlIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiBsb29raW5nIHVwIGEgcmVzb3VyY2UsCi0gZ2l2ZW4gYXMgcmVmZXJlbmNlIHRvIGEgJmx0O3BhdGgmZ3Q7IGRlZmluZWQgZWxzZXdoZXJlCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZW52aXJvbm1lbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcHJlZml4IHRvIHVzZSB3aGVuIHJldHJpZXZpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICB0aGUgcHJlZml4IHRvIHVzZSB3aGVuIHJldHJpZXZpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzLiAKLSBUaHVzIGlmIHlvdSBzcGVjaWZ5IGVudmlyb25tZW50PSZxdW90O215ZW52JnF1b3Q7IAotIHlvdSB3aWxsIGJlIGFibGUgdG8gYWNjZXNzIE9TLXNwZWNpZmljIAotIGVudmlyb25tZW50IHZhcmlhYmxlcyB2aWEgcHJvcGVydHkgbmFtZXMgJnF1b3Q7bXllbnYuUEFUSCZxdW90OyBvciAKLSAmcXVvdDtteWVudi5URVJNJnF1b3Q7LiAKLSA8cD4KLSBOb3RlIHRoYXQgaWYgeW91IHN1cHBseSBhIHByb3BlcnR5IG5hbWUgd2l0aCBhIGZpbmFsIAotICZxdW90Oy4mcXVvdDsgaXQgd2lsbCBub3QgYmUgZG91YmxlZC4gaWUgZW52aXJvbm1lbnQ9JnF1b3Q7bXllbnYuJnF1b3Q7IHdpbGwgc3RpbGwgCi0gYWxsb3cgYWNjZXNzIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aHJvdWdoICZxdW90O215ZW52LlBBVEgmcXVvdDsgYW5kIAotICZxdW90O215ZW52LlRFUk0mcXVvdDsuIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBjdXJyZW50bHkgb25seSBpbXBsZW1lbnRlZCAKLSBvbiBzZWxlY3QgcGxhdGZvcm1zLiBGZWVsIGZyZWUgdG8gc2VuZCBwYXRjaGVzIHRvIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgcGxhdGZvcm1zCi0gdGhpcyBmdW5jdGlvbmFsaXR5IGlzIHN1cHBvcnRlZCBvbiA7KS48YnI+Ci0gTm90ZSBhbHNvIHRoYXQgcHJvcGVydGllcyBhcmUgY2FzZSBzZW5zaXRpdmUsIGV2ZW4gaWYgdGhlCi0gZW52aXJvbm1lbnQgdmFyaWFibGVzIG9uIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSBhcmUgbm90LCBlLmcuIGl0Ci0gd2lsbCBiZSAke2Vudi5QYXRofSBub3QgJHtlbnYuUEFUSH0gb24gV2luZG93cyAyMDAwLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZmlsZW5hbWUgb2YgYSBwcm9wZXJ0eSBmaWxlIHRvIGxvYWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIHRoZSBmaWxlbmFtZSBvZiBhIHByb3BlcnR5IGZpbGUgdG8gbG9hZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Byb3BlcnR5IHRvIHRoZSBhYnNvbHV0ZSBmaWxlbmFtZSBvZiB0aGUKLSBnaXZlbiBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBwcm9wZXJ0eSB0byB0aGUgYWJzb2x1dGUgZmlsZW5hbWUgb2YgdGhlCi0gZ2l2ZW4gZmlsZS4gSWYgdGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlIGlzIGFuIGFic29sdXRlIHBhdGgsIGl0Ci0gaXMgbGVmdCB1bmNoYW5nZWQgKHdpdGggLyBhbmQgXCBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0byB0aGUKLSBjdXJyZW50IHBsYXRmb3JtcyBjb252ZW50aW9ucykuIE90aGVyd2lzZSBpdCBpcyB0YWtlbiBhcyBhIHBhdGgKLSByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCdzIGJhc2VkaXIgYW5kIGV4cGFuZGVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIHNldHMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQcmVmaXggdG8gYXBwbHkgdG8gcHJvcGVydGllcyBsb2FkZWQgdXNpbmcgPGNvZGU+ZmlsZTwvY29kZT4KLSBvciA8Y29kZT5yZXNvdXJjZTwvY29kZT4uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFByZWZpeCB0byBhcHBseSB0byBwcm9wZXJ0aWVzIGxvYWRlZCB1c2luZyA8Y29kZT5maWxlPC9jb2RlPgotIG9yIDxjb2RlPnJlc291cmNlPC9jb2RlPi4gCi0gQSAiLiIgaXMgYXBwZW5kZWQgdG8gdGhlIHByZWZpeCBpZiBub3Qgc3BlY2lmaWVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InJlZmlkIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2UiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUmVmZXJlbmNlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtSZWZlcmVuY2UgdG8gYW4gQW50IGRhdGF0eXBlCi0gZGVjbGFyZWQgZWxzZXdoZXJlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIGEgcmVmZXJlbmNlIHRvIGFuIEFudCBkYXRhdHlwZQotIGRlY2xhcmVkIGVsc2V3aGVyZS4gCi0gT25seSB5aWVsZHMgcmVhc29uYWJsZSByZXN1bHRzIGZvciByZWZlcmVuY2VzCi0gUEFUSCBsaWtlIHN0cnVjdHVyZXMgb3IgcHJvcGVydGllcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXNvdXJjZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSByZXNvdXJjZSBuYW1lIG9mIGEgcHJvcGVydHkgZmlsZSB0byBsb2FkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICB0aGUgcmVzb3VyY2UgbmFtZSBvZiBhIHByb3BlcnR5IGZpbGUgdG8gbG9hZAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVmFsdWUgb2YgdGhlIHByb3BlcnR5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvb2tpbmcgdXAgYSByZXNvdXJjZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbVGhlIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiBsb29raW5nIHVwIGEgcmVzb3VyY2UuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0icHJvcGVydHlmaWxlIiBjYXRlZ29yeT0ib3RoZXIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLlByb3BlcnR5RmlsZSIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTW9kaWZpZXMgc2V0dGluZ3MgaW4gYSBwcm9wZXJ0eSBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtNb2RpZmllcyBzZXR0aW5ncyBpbiBhIHByb3BlcnR5IGZpbGUuCi0KLSA8cD4KLVRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBpdHMgdXNhZ2U6Ci0gICAgPHVsPiZsdDt0YXJnZXQgbmFtZT0ic2V0U3RhdGUiJmd0Ozxicj4KLSAgICA8dWw+Jmx0O3Byb3BlcnR5PGJyPgotICAgICAgICA8dWw+bmFtZT0iaGVhZGVyIjxicj4KLSAgICAgICAgdmFsdWU9IiMjR2VuZXJhdGVkIGZpbGUgLSBkbyBub3QgbW9kaWZ5ISIvJmd0Ozxicj4KLSAgICAgICZsdDtwcm9wZXJ0eWZpbGUgZmlsZT0iYXByb3BmaWxlLnByb3BlcnRpZXMiIGNvbW1lbnQ9IiR7aGVhZGVyfSImZ3Q7PGJyPgotICAgICAgICAmbHQ7ZW50cnkga2V5PSJwcm9kdWN0LnZlcnNpb24ubWFqb3IiIHR5cGU9ImludCIgIHZhbHVlPSI1Ii8mZ3Q7PGJyPgotICAgICAgICAmbHQ7ZW50cnkga2V5PSJwcm9kdWN0LnZlcnNpb24ubWlub3IiIHR5cGU9ImludCIgIHZhbHVlPSIwIi8mZ3Q7PGJyPgotICAgICAgICAmbHQ7ZW50cnkga2V5PSJwcm9kdWN0LmJ1aWxkLm1ham9yIiAgIHR5cGU9ImludCIgIHZhbHVlPSIwIiAvJmd0Ozxicj4KLSAgICAgICAgJmx0O2VudHJ5IGtleT0icHJvZHVjdC5idWlsZC5taW5vciIgICB0eXBlPSJpbnQiICBvcGVyYXRpb249IisiIC8mZ3Q7PGJyPgotICAgICAgICAmbHQ7ZW50cnkga2V5PSJwcm9kdWN0LmJ1aWxkLmRhdGUiICAgIHR5cGU9ImRhdGUiIHZhbHVlPSJub3ciIC8mZ3Q7PGJyPgotICAgICAgICAmbHQ7ZW50cnkga2V5PSJpbnRTZXQiIHR5cGU9ImludCIgb3BlcmF0aW9uPSI9IiB2YWx1ZT0iNjgxIi8mZ3Q7PGJyPgotICAgICAgICAmbHQ7ZW50cnkga2V5PSJpbnREZWMiIHR5cGU9ImludCIgb3BlcmF0aW9uPSItIi8mZ3Q7PGJyPgotICAgICAgICAmbHQ7ZW50cnkga2V5PSJTdHJpbmdFcXVhbHMiIHR5cGU9InN0cmluZyIgdmFsdWU9InRlc3RWYWx1ZSIvJmd0Ozxicj4KLSAgICAgJmx0Oy9wcm9wZXJ0eWZpbGUmZ3Q7PGJyPjwvdWw+Ci0gICAmbHQ7L3RhcmdldCZndDs8L3VsPjxwPgotCi1UaGUgJmx0O3Byb3BlcnR5ZmlsZSZndDsgdGFzayBtdXN0IGhhdmU6PGJyPgotICAgIDx1bD48bGk+ZmlsZTwvbGk+PC91bD4KLU90aGVyIHBhcmFtZXRlcnMgYXJlOjxicj4KLSAgICA8dWw+PGxpPmNvbW1lbnQsIGtleSwgb3BlcmF0aW9uLCB0eXBlIGFuZCB2YWx1ZSAodGhlIGZpbmFsIGZvdXIgYmVpbmcgZWxpbWluYXRlZCBzaG9ydGx5KTwvbGk+PC91bD4KLQotVGhlICZsdDtlbnRyeSZndDsgdGFzayBtdXN0IGhhdmU6PGJyPgotICAgIDx1bD48bGk+a2V5PC9saT48L3VsPgotT3RoZXIgcGFyYW1ldGVycyBhcmU6PGJyPgotICAgIDx1bD48bGk+b3BlcmF0aW9uPC9saT4KLSAgICAgICAgPGxpPnR5cGU8L2xpPgotICAgICAgICA8bGk+dmFsdWU8L2xpPgotICAgICAgICA8bGk+ZGVmYXVsdDwvbGk+Ci0gICAgICAgIDxsaT51bml0PC9saT4KLSAgICA8L3VsPgotCi1JZiB0eXBlIGlzIHVuc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBzdHJpbmcKLQotUGFyYW1ldGVyIHZhbHVlczo8YnI+Ci0gICAgPHVsPjxsaT5vcGVyYXRpb246PC9saT4KLSAgICAgICAgPHVsPjxsaT4iPSIgKHNldCAtLSBkZWZhdWx0KTwvbGk+Ci0gICAgICAgIDxsaT4iLSIgKGRlYyk8L2xpPgotICAgICAgICA8bGk+IisiIChpbmMpPC9saT4KLQotICAgIDxsaT50eXBlOjwvbGk+Ci0gICAgICAgIDx1bD48bGk+ImludCI8L2xpPgotICAgICAgICA8bGk+ImRhdGUiPC9saT4KLSAgICAgICAgPGxpPiJzdHJpbmciPC9saT48L3VsPjwvdWw+Ci0KLSAgICA8bGk+dmFsdWU6PC9saT4KLSAgICAgIDx1bD48bGk+aG9sZHMgdGhlIGRlZmF1bHQgdmFsdWUsIGlmIHRoZSBwcm9wZXJ0eQotICAgICAgICAgICAgICB3YXMgbm90IGZvdW5kIGluIHByb3BlcnR5IGZpbGU8L2xpPgotICAgICAgICAgIDxsaT4ibm93IiBJbiBjYXNlIG9mIHR5cGUgImRhdGUiLCB0aGUKLSAgICAgICAgICAgICAgdmFsdWUgIm5vdyIgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgY3VycmVudAotICAgICAgICAgICAgICBkYXRlL3RpbWUgYW5kIHVzZWQgZXZlbiBpZiBhIHZhbGlkIGRhdGUgd2FzCi0gICAgICAgICAgICAgIGZvdW5kIGluIHRoZSBwcm9wZXJ0eSBmaWxlLjwvbGk+PC91bD4KLQotU3RyaW5nIHByb3BlcnR5IHR5cGVzIGNhbiBvbmx5IHVzZSB0aGUgIj0iIG9wZXJhdGlvbi4KLUludCBwcm9wZXJ0eSB0eXBlcyBjYW4gb25seSB1c2UgdGhlICI9IiwgIi0iIG9yICIrIiBvcGVyYXRpb25zLjxwPgotCi1UaGUgbWVzc2FnZSBwcm9wZXJ0eSBpcyB1c2VkIGZvciB0aGUgcHJvcGVydHkgZmlsZSBoZWFkZXIsIHdpdGggIlxcIiBiZWluZwotYSBuZXdsaW5lIGRlbGltaXRlciBjaGFyYWN0ZXIuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21tZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbT3B0aW9uYWwgaGVhZGVyIGNvbW1lbnQgZm9yIHRoZSBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBvcHRpb25hbCBoZWFkZXIgY29tbWVudCBmb3IgdGhlIGZpbGUKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTG9jYXRpb24gb2YgdGhlIHByb3BlcnR5IGZpbGUgdG8gYmUgZWRpdGVkOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgTG9jYXRpb24gb2YgdGhlIHByb3BlcnR5IGZpbGUgdG8gYmUgZWRpdGVkOyByZXF1aXJlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImVudHJ5IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5Qcm9wZXJ0eUZpbGUuRW50cnkiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05vIGRlc2NyaXB0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtdXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJwdmNzIiBjYXRlZ29yeT0ib3RoZXIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnB2Y3MuUHZjcyIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRXh0cmFjdHMgdGhlIGxhdGVzdCBlZGl0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSBmcm9tIGEgUFZDUyByZXBvc2l0b3J5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtFeHRyYWN0cyB0aGUgbGF0ZXN0IGVkaXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlIGZyb20gYSBQVkNTIHJlcG9zaXRvcnkuCi0gUFZDUyBpcyBhIHZlcnNpb24gY29udHJvbCBzeXN0ZW0KLSBkZXZlbG9wZWQgYnkgPGEgaHJlZj0iaHR0cDovL3d3dy5tZXJhbnQuY29tL3Byb2R1Y3RzL3B2Y3MiPk1lcmFudDwvYT4uCi0gPGJyPgotIEJlZm9yZSB1c2luZyB0aGlzIHRhZywgdGhlIHVzZXIgcnVubmluZyBhbnQgbXVzdCBoYXZlIGFjY2VzcyB0byB0aGUgY29tbWFuZHMgCi0gb2YgUFZDUyAoZ2V0IGFuZCBwY2xpKSBhbmQgbXVzdCBoYXZlIGFjY2VzcyB0byB0aGUgcmVwb3NpdG9yeS4gTm90ZSB0aGF0IHRoZSB3YXkgdG8gc3BlY2lmeQotIHRoZSByZXBvc2l0b3J5IGlzIHBsYXRmb3JtIGRlcGVuZGVudCBzbyB1c2UgcHJvcGVydHkgdG8gc3BlY2lmeSBsb2NhdGlvbiBvZiByZXBvc2l0b3J5LgotIDxicj4KLSBUaGlzIHZlcnNpb24gaGFzIGJlZW4gdGVzdGVkIGFnYWlucyBQVkNTIHZlcnNpb24gNi41IGFuZCA2LjYgdW5kZXIgV2luZG93cyBhbmQgU29sYXJpcy4KLQotIDxiPjE5LTA0LTIwMDE8L2I+IDxwPlRoZSB0YXNrIG5vdyBoYXMgYSBtb3JlIHJvYnVzdAotIHBhcnNlci4gSXQgYWxsb3dzIGZvciBwbGF0Zm9ybSBpbmRlcGVuZGFudCBmaWxlIHBhdGhzCi0gYW5kIHN1cHBvcnRzIGZpbGUgbmFtZXMgd2l0aCA8aT4oKTwvaT4uIFRoYW5rcyB0byBFcmlrIEh1c2J5IGZvcgotIGJyaW5naW5nIHRoZSBidWcgdG8gbXkgYXR0ZW50aW9uLgotCi0gPGI+MjctMDQtMjAwMTwvYj4gPHA+VU5DIHBhdGhzIGFyZSBub3cgaGFuZGxlZCBwcm9wZXJseS4KLSBGaXggcHJvdmlkZWQgYnkgRG9uIEplZmZlcnkuIEhlIGFsc28gYWRkZWQgYW4gPGk+VXBkYXRlT25seTwvaT4gZmxhZwotIHRoYXQsIHdoZW4gdHJ1ZSwgY29uZGl0aW9ucyB0aGUgUFZDUyBnZXQgdXNpbmcgdGhlIC1VIG9wdGlvbiB0byBvbmx5Ci0gdXBkYXRlIHRob3NlIGZpbGVzIHRoYXQgaGF2ZSBhIG1vZGlmaWNhdGlvbiB0aW1lIChpbiBQVkNTKSB0aGF0IGlzIG5ld2VyCi0gdGhhbiB0aGUgZXhpc3Rpbmcgd29ya2ZpbGUuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlbmFtZWZvcm1hdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBmb3JtYXQgb2YgdGhlIGZvbGRlciBuYW1lczsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBmb3JtYXQgb2YgdGhlIGZvbGRlciBuYW1lczsgb3B0aW9uYWwuCi0gVGhpcyBtdXN0IGJlIGluIGEgZm9ybWF0IHN1aXRhYmxlIGZvciAKLSA8Y29kZT5qYXZhLnRleHQuTWVzc2FnZUZvcm1hdDwvY29kZT4uCi0gIEluZGV4IDEgb2YgdGhlIGZvcm1hdCB3aWxsIGJlIHVzZWQgYXMgdGhlIGZpbGUgbmFtZS4KLSAgRGVmYXVsdHMgdG8gPGNvZGU+ezB9LWFyYyh7MX0pPC9jb2RlPgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZvcmNlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmaWVzIHRoZSB2YWx1ZSBvZiB0aGUgZm9yY2UgYXJndW1lbnQ7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTcGVjaWZpZXMgdGhlIHZhbHVlIG9mIHRoZSBmb3JjZSBhcmd1bWVudDsgb3B0aW9uYWwuCi0gSWYgc2V0IHRvIDxpPnllczwvaT4gYWxsIGZpbGVzIHRoYXQgZXhpc3RzIGFuZCBhcmUgCi0gd3JpdGFibGUgYXJlIG92ZXJ3cml0dGVuLiBEZWZhdWx0IDxpPm5vPC9pPiBjYXVzZXMgdGhlIGZpbGVzIAotIHRoYXQgYXJlIHdyaXRhYmxlIHRvIGJlIGlnbm9yZWQuIFRoaXMgc3RvcHMgdGhlIFBWQ1MgY29tbWFuZCAKLSA8aT5nZXQ8L2k+IHRvIHN0b3AgYXNraW5nIHF1ZXN0aW9ucyEKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZ25vcmVyZXR1cm5jb2RlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHNldCB0byB0cnVlIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBleGVjdXRpbmcgdGhlIHB2Y3MKLSBjb21tYW5kcyBhcmUgaWdub3JlZDsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHNldCB0byB0cnVlIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBleGVjdXRpbmcgdGhlIHB2Y3MKLSBjb21tYW5kcyBhcmUgaWdub3JlZDsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFiZWwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPbmx5IGZpbGVzIG1hcmtlZCB3aXRoIHRoaXMgbGFiZWwgYXJlIGV4dHJhY3RlZDsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIE9ubHkgZmlsZXMgbWFya2VkIHdpdGggdGhpcyBsYWJlbCBhcmUgZXh0cmFjdGVkOyBvcHRpb25hbC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsaW5lc3RhcnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGF0IGEgdmFsaWQgcmV0dXJuIHZhbHVlIGZyb20gUFZDUyBsb29rcyBsaWtlCi0gIHdoZW4gaXQgZGVzY3JpYmVzIGEgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgV2hhdCBhIHZhbGlkIHJldHVybiB2YWx1ZSBmcm9tIFBWQ1MgbG9va3MgbGlrZQotICB3aGVuIGl0IGRlc2NyaWJlcyBhIGZpbGUuICBEZWZhdWx0cyB0byA8Y29kZT4mcXVvdDtQOjwvY29kZT4uCi0gSWYgeW91IGFyZSBub3QgdXNpbmcgYW4gVU5DIG5hbWUgZm9yIHlvdXIgcmVwb3NpdG9yeSBhbmQgdGhlCi0gZHJpdmUgbGV0dGVyIDxjb2RlPlA8L2NvZGU+IGlzIGluY29ycmVjdCBmb3IgeW91ciBzZXR1cCwgeW91IG1heQotIG5lZWQgdG8gY2hhbmdlIHRoaXMgdmFsdWUsIFVOQyBuYW1lcyB3aWxsIGFsd2F5cyBiZQotIGFjY2VwdGVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InByb21vdGlvbmdyb3VwIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBwcm9tb3Rpb25ncm91cCBhcmd1bWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBwcm9tb3Rpb25ncm91cCBhcmd1bWVudAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InB2Y3NiaW4iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBQVkNTIGJpbiBkaXJlY3Rvcnk7IG9wdGlvbmFsIGlmIG9uIHRoZSBQQVRILl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBQVkNTIGJpbiBkaXJlY3Rvcnk7IG9wdGlvbmFsIGlmIG9uIHRoZSBQQVRILgotIE9uIHNvbWUgc3lzdGVtcyB0aGUgUFZDUyBleGVjdXRhYmxlcyA8aT5wY2xpPC9pPgotIGFuZCA8aT5nZXQ8L2k+IGFyZSBub3QgZm91bmQgaW4gdGhlIFBBVEguIEluIHN1Y2ggY2FzZXMgdGhpcyBhdHRyaWJ1dGUKLSBzaG91bGQgYmUgc2V0IHRvIHRoZSBiaW4gZGlyZWN0b3J5IG9mIHRoZSBQVkNTIGluc3RhbGxhdGlvbiBjb250YWluaW5nCi0gdGhlIGV4ZWN1dGFibGVzIG1lbnRpb25lZCBiZWZvcmUuIElmIHRoaXMgYXR0cmlidXRlIGlzbid0IHNwZWNpZmllZCB0aGUKLSB0YWcgZXhwZWN0cyB0aGUgZXhlY3V0YWJsZXMgdG8gYmUgZm91bmQgdXNpbmcgdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHZjc3Byb2plY3QiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcHJvamVjdCB3aXRoaW4gdGhlIFBWQ1MgcmVwb3NpdG9yeSB0byBleHRyYWN0IGZpbGVzIGZyb207Ci0gb3B0aW9uYWwsIGRlZmF1bHQgJnF1b3Q7LyZxdW90Oy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIHByb2plY3Qgd2l0aGluIHRoZSBQVkNTIHJlcG9zaXRvcnkgdG8gZXh0cmFjdCBmaWxlcyBmcm9tOwotIG9wdGlvbmFsLCBkZWZhdWx0ICZxdW90Oy8mcXVvdDsKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXBvc2l0b3J5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG5ldHdvcmsgbmFtZSBvZiB0aGUgUFZDUyByZXBvc2l0b3J5OyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIG5ldHdvcmsgbmFtZSBvZiB0aGUgUFZDUyByZXBvc2l0b3J5OyByZXF1aXJlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGVvbmx5IiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHNldCB0byA8aT50cnVlPC9pPiBmaWxlcyBhcmUgZmV0Y2hlZCBvbmx5IGlmIAotIG5ld2VyIHRoYW4gZXhpc3RpbmcgbG9jYWwgZmlsZXM7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiBzZXQgdG8gPGk+dHJ1ZTwvaT4gZmlsZXMgYXJlIGZldGNoZWQgb25seSBpZiAKLSBuZXdlciB0aGFuIGV4aXN0aW5nIGxvY2FsIGZpbGVzOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3b3Jrc3BhY2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXb3Jrc3BhY2UgdG8gdXNlOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgV29ya3NwYWNlIHRvIHVzZTsgb3B0aW9uYWwuICAKLSBCeSBzcGVjaWZ5aW5nIGEgd29ya3NwYWNlLCB0aGUgZmlsZXMgYXJlIGV4dHJhY3RlZCB0byB0aGF0IGxvY2F0aW9uLgotIEEgUFZDUyB3b3Jrc3BhY2UgaXMgYSBuYW1lIGZvciBhIGxvY2F0aW9uIG9mIHRoZSB3b3JrZmlsZXMgYW5kIAotIGlzbid0IGFzIHN1Y2ggdGhlIGxvY2F0aW9uIGl0c2VsZi4gCi0gWW91IGRlZmluZSB0aGUgbG9jYXRpb24gZm9yIGEgd29ya3NwYWNlIHVzaW5nIHRoZSBQVkNTIEdVSSBjbGllbnRzLgotIElmIHRoaXMgaXNuJ3Qgc3BlY2lmaWVkIHRoZSBkZWZhdWx0IHdvcmtzcGFjZSBmb3IgdGhlIGN1cnJlbnQgdXNlciBpcyB1c2VkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0icHZjc3Byb2plY3QiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnB2Y3MuUHZjc1Byb2plY3QiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZnkgYSBwcm9qZWN0IHdpdGhpbiB0aGUgUFZDUyByZXBvc2l0b3J5IHRvIGV4dHJhY3QgZmlsZXMgZnJvbS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbU3BlY2lmeSBhIHByb2plY3Qgd2l0aGluIHRoZSBQVkNTIHJlcG9zaXRvcnkgdG8gZXh0cmFjdCBmaWxlcyBmcm9tLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9InJlY29yZCIgY2F0ZWdvcnk9InV0aWxpdHkiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlJlY29yZGVyIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGN1cnJlbnQgYnVpbGQgcHJvY2VzcyB0aGF0IHJlY29yZHMgdGhlIG91dHB1dCB0byBhIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0FkZHMgYSBsaXN0ZW5lciB0byB0aGUgY3VycmVudCBidWlsZCBwcm9jZXNzIHRoYXQgcmVjb3JkcyB0aGUKLSBvdXRwdXQgdG8gYSBmaWxlLgotIDxwPlNldmVyYWwgcmVjb3JkZXJzIGNhbiBleGlzdCBhdCB0aGUgc2FtZSB0aW1lLiAgRWFjaCByZWNvcmRlciBpcwotIGFzc29jaWF0ZWQgd2l0aCBhIGZpbGUuICBUaGUgZmlsZW5hbWUgaXMgdXNlZCBhcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvcgotIHRoZSByZWNvcmRlcnMuICBUaGUgZmlyc3QgY2FsbCB0byB0aGUgcmVjb3JkZXIgdGFzayB3aXRoIGFuIHVudXNlZCBmaWxlbmFtZQotIHdpbGwgY3JlYXRlIGEgcmVjb3JkZXIgKHVzaW5nIHRoZSBwYXJhbWV0ZXJzIHByb3ZpZGVkKSBhbmQgYWRkIGl0IHRvIHRoZQotIGxpc3RlbmVycyBvZiB0aGUgYnVpbGQuICBBbGwgc3Vic2VxdWVudCBjYWxscyB0byB0aGUgcmVjb3JkZXIgdGFzayB1c2luZwotIHRoaXMgZmlsZW5hbWUgd2lsbCBtb2RpZnkgdGhhdCByZWNvcmRlcnMgc3RhdGUgKHJlY29yZGluZyBvciBub3QpIG9yIG90aGVyCi0gcHJvcGVydGllcyAobGlrZSBsb2dnaW5nIGxldmVsKS48L3A+Ci0gPHA+U29tZSB0ZWNobmljYWwgaXNzdWVzOiB0aGUgZmlsZSdzIHByaW50IHN0cmVhbSBpcyBmbHVzaGVkIGZvciAmcXVvdDtmaW5pc2hlZCZxdW90OwotIGV2ZW50cyAoYnVpbGRGaW5pc2hlZCwgdGFyZ2V0RmluaXNoZWQgYW5kIHRhc2tGaW5pc2hlZCksIGFuZCBpcyBjbG9zZWQgb24KLSBhIGJ1aWxkRmluaXNoZWQgZXZlbnQuPC9wPl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYWN0aW9uIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5SZWNvcmRlci5BY3Rpb25DaG9pY2VzIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O3N0YXJ0JnF1b3Q7LCAmcXVvdDtzdG9wJnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBY3Rpb24gZm9yIHRoZSBhc3NvY2lhdGVkIHJlY29yZGVyIGVudHJ5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBhY3Rpb24gZm9yIHRoZSBhc3NvY2lhdGVkIHJlY29yZGVyIGVudHJ5LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImFwcGVuZCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIG9yIG5vdCB0aGUgbG9nZ2VyIHNob3VsZCBhcHBlbmQgdG8gYSBwcmV2aW91cyBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBXaGV0aGVyIG9yIG5vdCB0aGUgbG9nZ2VyIHNob3VsZCBhcHBlbmQgdG8gYSBwcmV2aW91cyBmaWxlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImVtYWNzbW9kZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtObyBkZXNjcmlwdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9nbGV2ZWwiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlJlY29yZGVyLlZlcmJvc2l0eUxldmVsQ2hvaWNlcyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDtlcnJvciZxdW90OywgJnF1b3Q7d2FybiZxdW90OywgJnF1b3Q7aW5mbyZxdW90OywgJnF1b3Q7dmVyYm9zZSZxdW90OywgJnF1b3Q7ZGVidWcmcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xldmVsIHRvIHdoaWNoIHRoaXMgcmVjb3JkZXIgZW50cnkgc2hvdWxkIGxvZyB0by5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgbGV2ZWwgdG8gd2hpY2ggdGhpcyByZWNvcmRlciBlbnRyeSBzaG91bGQgbG9nIHRvLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIG9mIHRoZSBmaWxlIHRvIGxvZyB0bywgYW5kIHRoZSBuYW1lIG9mIHRoZSByZWNvcmRlcgotIGVudHJ5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGxvZyB0bywgYW5kIHRoZSBuYW1lIG9mIHRoZSByZWNvcmRlcgotIGVudHJ5LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJyZW5hbWUiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUmVuYW1lIgotICAgICAgZGVwcmVjYXRlZD0idHJ1ZSIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUmVuYW1lcyBhIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW1JlbmFtZXMgYSBmaWxlLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdCIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05ldyBuYW1lIG9mIHRoZSBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBuZXcgbmFtZSBvZiB0aGUgZmlsZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXBsYWNlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyB3aGV0aGVyIGFuIGV4aXN0aW5nIGZpbGUgc2hvdWxkIGJlIHJlcGxhY2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHdoZXRoZXIgYW4gZXhpc3RpbmcgZmlsZSBzaG91bGQgYmUgcmVwbGFjZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZSB0byBiZSByZW5hbWVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBmaWxlIHRvIGJlIHJlbmFtZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9InJlbmFtZWV4dGVuc2lvbnMiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuUmVuYW1lRXh0ZW5zaW9ucyIKLSAgICAgIGRlcHJlY2F0ZWQ9InRydWUiCi0gICAgICBtYXRjaGluZ1Rhc2s9InRydWUiPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtObyBEZXNjcmlwdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmcm9tZXh0ZW5zaW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHN0cmluZyB0aGF0IGZpbGVzIG11c3QgZW5kIGluIHRvIGJlIHJlbmFtZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBzdHJpbmcgdGhhdCBmaWxlcyBtdXN0IGVuZCBpbiB0byBiZSByZW5hbWVkCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVwbGFjZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTdG9yZSByZXBsYWNlIGF0dHJpYnV0ZSAtIHRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0YXJnZXQgZmlsZQotIHNob3VsZCBiZSBvdmVyd3JpdHRlbiBpZiBwcmVzZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBzdG9yZSByZXBsYWNlIGF0dHJpYnV0ZSAtIHRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0YXJnZXQgZmlsZQotIHNob3VsZCBiZSBvdmVyd3JpdHRlbiBpZiBwcmVzZW50Ci0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU291cmNlIGRpciB0byBmaW5kIHRoZSBmaWxlcyB0byBiZSByZW5hbWVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIHNvdXJjZSBkaXIgdG8gZmluZCB0aGUgZmlsZXMgdG8gYmUgcmVuYW1lZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0b2V4dGVuc2lvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBzdHJpbmcgdGhhdCByZW5hbWVkIGZpbGVzIHdpbGwgZW5kIHdpdGggb24KLSBjb21wbGV0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgc3RyaW5nIHRoYXQgcmVuYW1lZCBmaWxlcyB3aWxsIGVuZCB3aXRoIG9uCi0gY29tcGxldGlvbgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJyZXBsYWNlIiBjYXRlZ29yeT0iZmlsZXN5c3RlbSIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUmVwbGFjZSIKLSAgICAgIG1hdGNoaW5nVGFzaz0idHJ1ZSI+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1JlcGxhY2VzIGFsbCBvY2N1cnJlbmNlcyBvZiBvbmUgb3IgbW9yZSBzdHJpbmcgdG9rZW5zIHdpdGggZ2l2ZW4gdmFsdWVzIGluIHRoZSBpbmRpY2F0ZWQgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW1JlcGxhY2VzIGFsbCBvY2N1cnJlbmNlcyBvZiBvbmUgb3IgbW9yZSBzdHJpbmcgdG9rZW5zIHdpdGggZ2l2ZW4KLSB2YWx1ZXMgaW4gdGhlIGluZGljYXRlZCBmaWxlcy4gRWFjaCB2YWx1ZSBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIAotIG9yIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IGF2YWlsYWJsZSBpbiBhIGRlc2lnbmF0ZWQgcHJvcGVydHkgZmlsZS4KLSBJZiB5b3Ugd2FudCB0byByZXBsYWNlIGEgdGV4dCB0aGF0IGNyb3NzZXMgbGluZSBib3VuZGFyaWVzLCB5b3UKLSBtdXN0IHVzZSBhIG5lc3RlZCA8Y29kZT4mbHQ7cmVwbGFjZXRva2VuJmd0OzwvY29kZT4gZWxlbWVudC5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRpciIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBiYXNlIGRpcmVjdG9yeSB0byB1c2Ugd2hlbiByZXBsYWNpbmcgYSB0b2tlbiBpbiBtdWx0aXBsZSBmaWxlczsKLSByZXF1aXJlZCBpZiA8Y29kZT5maWxlPC9jb2RlPiBpcyBub3QgZGVmaW5lZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGJhc2UgZGlyZWN0b3J5IHRvIHVzZSB3aGVuIHJlcGxhY2luZyBhIHRva2VuIGluIG11bHRpcGxlIGZpbGVzOwotIHJlcXVpcmVkIGlmIDxjb2RlPmZpbGU8L2NvZGU+IGlzIG5vdCBkZWZpbmVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImVuY29kaW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZSBlbmNvZGluZyB0byB1c2Ugb24gdGhlIGZpbGVzIHJlYWQgYW5kIHdyaXR0ZW4gYnkgdGhlIHRhc2s7Ci0gb3B0aW9uYWwsIGRlZmF1bHRzIHRvIGRlZmF1bHQgSlZNIGVuY29kaW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGZpbGUgZW5jb2RpbmcgdG8gdXNlIG9uIHRoZSBmaWxlcyByZWFkIGFuZCB3cml0dGVuIGJ5IHRoZSB0YXNrOwotIG9wdGlvbmFsLCBkZWZhdWx0cyB0byBkZWZhdWx0IEpWTSBlbmNvZGluZwotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2UgZmlsZTsgcmVxdWlyZWQgdW5sZXNzIDxjb2RlPmRpcjwvY29kZT4gaXMgc2V0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIHNvdXJjZSBmaWxlOyByZXF1aXJlZCB1bmxlc3MgPGNvZGU+ZGlyPC9jb2RlPiBpcyBzZXQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvcGVydHlmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSBmaWxlIGZyb20gd2hpY2ggcHJvcGVydGllcyBzcGVjaWZpZWQgdXNpbmcKLSBuZXN0ZWQgPGNvZGU+Jmx0O3JlcGxhY2VmaWx0ZXImZ3Q7PC9jb2RlPiBlbGVtZW50cyBhcmUgZHJhd247Ci0gUmVxdWlyZWQgb25seSBpZiA8aT5wcm9wZXJ0eTwvaT4gYXR0cmlidXRlIG9mCi0gPGNvZGU+Jmx0O3JlcGxhY2VmaWx0ZXImZ3Q7PC9jb2RlPiBpcyB1c2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgbmFtZSBvZiBhIHByb3BlcnR5IGZpbGUgZnJvbSB3aGljaCBwcm9wZXJ0aWVzIHNwZWNpZmllZCB1c2luZwotIG5lc3RlZCA8Y29kZT4mbHQ7cmVwbGFjZWZpbHRlciZndDs8L2NvZGU+IGVsZW1lbnRzIGFyZSBkcmF3bjsKLSBSZXF1aXJlZCBvbmx5IGlmIDxpPnByb3BlcnR5PC9pPiBhdHRyaWJ1dGUgb2YKLSA8Y29kZT4mbHQ7cmVwbGFjZWZpbHRlciZndDs8L2NvZGU+IGlzIHVzZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVwbGFjZWZpbHRlcmZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIG9mIGEgcHJvcGVydHkgZmlsZSBjb250YWluaW5nIGZpbHRlcnM7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBuYW1lIG9mIGEgcHJvcGVydHkgZmlsZSBjb250YWluaW5nIGZpbHRlcnM7IG9wdGlvbmFsLgotIEVhY2ggcHJvcGVydHkgd2lsbCBiZSB0cmVhdGVkIGFzIGEKLSByZXBsYWNlZmlsdGVyIHdoZXJlIHRva2VuIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBhbmQgdmFsdWUKLSBpcyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InN1bW1hcnkiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSW5kaWNhdGVzIHdoZXRoZXIgYSBzdW1tYXJ5IG9mIHRoZSByZXBsYWNlIG9wZXJhdGlvbiBzaG91bGQgYmUKLSBwcm9kdWNlZCwgZGV0YWlsaW5nIGhvdyBtYW55IHRva2VuIG9jY3VycmVuY2VzIGFuZCBmaWxlcyB3ZXJlCi0gcHJvY2Vzc2VkOyBvcHRpb25hbCwgZGVmYXVsdD1mYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgYSBzdW1tYXJ5IG9mIHRoZSByZXBsYWNlIG9wZXJhdGlvbiBzaG91bGQgYmUKLSBwcm9kdWNlZCwgZGV0YWlsaW5nIGhvdyBtYW55IHRva2VuIG9jY3VycmVuY2VzIGFuZCBmaWxlcyB3ZXJlCi0gcHJvY2Vzc2VkOyBvcHRpb25hbCwgZGVmYXVsdD1mYWxzZQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRva2VuIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3RyaW5nIHRva2VuIHRvIHJlcGxhY2U7Ci0gcmVxdWlyZWQgdW5sZXNzIGEgbmVzdGVkCi0gPGNvZGU+cmVwbGFjZXRva2VuPC9jb2RlPiBlbGVtZW50IG9yIHRoZSA8Y29kZT5yZXBsYWNlZmlsdGVyZmlsZTwvY29kZT4KLSBhdHRyaWJ1dGUgaXMgdXNlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBzdHJpbmcgdG9rZW4gdG8gcmVwbGFjZTsKLSByZXF1aXJlZCB1bmxlc3MgYSBuZXN0ZWQKLSA8Y29kZT5yZXBsYWNldG9rZW48L2NvZGU+IGVsZW1lbnQgb3IgdGhlIDxjb2RlPnJlcGxhY2VmaWx0ZXJmaWxlPC9jb2RlPgotIGF0dHJpYnV0ZSBpcyB1c2VkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3RyaW5nIHZhbHVlIHRvIHVzZSBhcyB0b2tlbiByZXBsYWNlbWVudDsKLSBvcHRpb25hbCwgZGVmYXVsdCBpcyB0aGUgZW1wdHkgc3RyaW5nICIiLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIHN0cmluZyB2YWx1ZSB0byB1c2UgYXMgdG9rZW4gcmVwbGFjZW1lbnQ7Ci0gb3B0aW9uYWwsIGRlZmF1bHQgaXMgdGhlIGVtcHR5IHN0cmluZyAiIgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0icmVwbGFjZXRva2VuIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5SZXBsYWNlLk5lc3RlZFN0cmluZyIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHRva2VuIHRvIGZpbHRlciBhcyB0aGUgdGV4dCBvZiBhIG5lc3RlZCBlbGVtZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVt0aGUgdG9rZW4gdG8gZmlsdGVyIGFzIHRoZSB0ZXh0IG9mIGEgbmVzdGVkIGVsZW1lbnRdXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0icmVwbGFjZXZhbHVlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5SZXBsYWNlLk5lc3RlZFN0cmluZyIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHN0cmluZyB0byByZXBsYWNlIHRoZSB0b2tlbiBhcyB0aGUgdGV4dCBvZiBhIG5lc3RlZCBlbGVtZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVt0aGUgc3RyaW5nIHRvIHJlcGxhY2UgdGhlIHRva2VuIGFzIHRoZSB0ZXh0IG9mIGEgbmVzdGVkIGVsZW1lbnRdXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0icmVwbGFjZWZpbHRlciIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUmVwbGFjZS5SZXBsYWNlZmlsdGVyIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSBuZXN0ZWQgJmx0O3JlcGxhY2VmaWx0ZXImZ3Q7IGVsZW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCBhIG5lc3RlZCAmbHQ7cmVwbGFjZWZpbHRlciZndDsgZWxlbWVudC5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJyZXBsYWNlcmVnZXhwIiBjYXRlZ29yeT0ib3RoZXIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLlJlcGxhY2VSZWdFeHAiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BlcmZvcm1zIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdHJpbmcgcmVwbGFjZW1lbnRzIGluIGEgdGV4dCBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtQZXJmb3JtcyByZWd1bGFyIGV4cHJlc3Npb24gc3RyaW5nIHJlcGxhY2VtZW50cyBpbiBhIHRleHQKLSBmaWxlLiAgVGhlIGlucHV0IGZpbGUocykgbXVzdCBiZSBhYmxlIHRvIGJlIHByb3Blcmx5IHByb2Nlc3NlZCBieQotIGEgUmVhZGVyIGluc3RhbmNlLiAgVGhhdCBpcywgdGhleSBtdXN0IGJlIHRleHQgb25seSwgbm8gYmluYXJ5LgotCi0gVGhlIHN5bnRheCBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uIGRlcGVuZHMgb24gdGhlIGltcGxlbXRhdGlvbiB0aGF0Ci0geW91IGNob29zZSB0byB1c2UuIFRoZSBzeXN0ZW0gcHJvcGVydHkgPGNvZGU+YW50LnJlZ2V4cC5yZWdleHBpbXBsPC9jb2RlPgotIHdpbGwgYmUgdGhlIGNsYXNzbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgKHRoZSBkZWZhdWx0Ci0gaXMgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuSmFrYXJ0YU9yb1JlZ2V4cDwvY29kZT4gYW5kCi0gcmVxdWlyZXMgdGhlIEpha2FydGEgT3JvIFBhY2thZ2UpLgotCi0gPHByZT4KLSBGb3IgamRrICAmbHQ7PSAxLjMsIHRoZXJlIGFyZSB0d28gYXZhaWxhYmxlIGltcGxlbWVudGF0aW9uczoKLSAgIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwLkpha2FydGFPcm9SZWdleHAgKHRoZSBkZWZhdWx0KQotICAgICAgICBSZXF1aXJlcyAgdGhlIGpha2FydGEtb3JvIHBhY2thZ2UKLQotICAgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuSmFrYXJ0YVJlZ2V4cFJlZ2V4cAotICAgICAgICBSZXF1aXJlcyB0aGUgamFrYXJ0YS1yZWdleHAgcGFja2FnZQotCi0gRm9yIGpkayAmZ3Q7PSAxLjQgYW4gYWRkaXRpb25hbCBpbXBsZW1lbnRhdGlvbiBpcyBhdmFpbGFibGU6Ci0gICBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5KZGsxNFJlZ2V4cFJlZ2V4cAotICAgICAgICBSZXF1aXJlcyB0aGUgamRrIDEuNCBidWlsdCBpbiByZWd1bGFyIGV4cHJlc3Npb24gcGFja2FnZS4KLQotIFVzYWdlOgotCi0gICBDYWxsIFN5bnRheDoKLQotICAgICAmbHQ7cmVwbGFjZXJlZ2V4cCBmaWxlPSJmaWxlIgotICAgICAgICAgICAgICAgICAgICBtYXRjaD0icGF0dGVybiIgCi0gICAgICAgICAgICAgICAgICAgIHJlcGxhY2U9InBhdHRlcm4iIAotICAgICAgICAgICAgICAgICAgICBmbGFncz0ib3B0aW9ucyI/Ci0gICAgICAgICAgICAgICAgICAgIGJ5bGluZT0idHJ1ZXxmYWxzZSI/ICZndDsKLSAgICAgICByZWdleHA/Ci0gICAgICAgc3Vic3RpdHV0aW9uPwotICAgICAgIGZpbGVzZXQqCi0gICAgICZsdDsvcmVwbGFjZXJlZ2V4cCZndDsKLQotICAgIE5PVEU6IFlvdSBtdXN0IGhhdmUgZWl0aGVyIHRoZSBmaWxlIGF0dHJpYnV0ZSBzcGVjaWZpZWQsIG9yIGF0IGxlYXN0IG9uZSBmaWxlc2V0IHN1YmVsZW1lbnQKLSAgICB0byBvcGVyYXRpb24gb24uICBZb3UgbWF5IG5vdCBoYXZlIHRoZSBmaWxlIGF0dHJpYnV0ZSBzcGVjaWZpZWQgaWYgeW91IG5lc3QgZmlsZXNldCBlbGVtZW50cwotICAgIGluc2lkZSB0aGlzIHRhc2suICBBbHNvLCB5b3UgY2Fubm90IHNwZWNpZnkgYm90aCBtYXRjaCBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24gc3ViZWxlbWVudCBhdAotICAgIHRoZSBzYW1lIHRpbWUsIG5vciBjYW4geW91IHNwZWNpZnkgdGhlIHJlcGxhY2UgYXR0cmlidXRlIGFuZCB0aGUgc3Vic3RpdHV0aW9uIHN1YmVsZW1lbnQgYXQKLSAgICB0aGUgc2FtZSB0aW1lLgotCi0gICBBdHRyaWJ1dGVzOgotCi0gICAgIGZpbGUgICAgLS0mZ3Q7IEEgc2luZ2xlIGZpbGUgdG8gb3BlcmF0aW9uIG9uIChtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUgZmlsZXNldCBzdWJlbGVtZW50cykKLSAgICAgbWF0Y2ggICAtLSZndDsgVGhlIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCAKLSAgICAgcmVwbGFjZSAtLSZndDsgVGhlIEV4cHJlc3Npb24gcmVwbGFjZW1lbnQgc3RyaW5nIAotICAgICBmbGFncyAgIC0tJmd0OyBUaGUgb3B0aW9ucyB0byBnaXZlIHRvIHRoZSByZXBsYWNlbWVudCAKLSAgICAgICAgICAgICAgICAgZyA9IFN1YnN0aXR1dGUgYWxsIG9jY3VycmVuY2VzLiBkZWZhdWx0IGlzIHRvIHJlcGxhY2Ugb25seSB0aGUgZmlyc3Qgb25lCi0gICAgICAgICAgICAgICAgIGkgPSBDYXNlIGluc2Vuc2l0aXZlIG1hdGNoCi0KLSAgICAgYnlsaW5lICAtLSZndDsgU2hvdWxkIHRoaXMgZmlsZSBiZSBwcm9jZXNzZWQgYSBzaW5nbGUgbGluZSBhdCBhIHRpbWUgKGRlZmF1bHQgaXMgZmFsc2UpCi0gICAgICAgICAgICAgICAgICJ0cnVlIiBpbmRpY2F0ZXMgdG8gcGVyZm9ybSByZXBsYWNlbWVudCBvbiBhIGxpbmUgYnkgbGluZSBiYXNpcwotICAgICAgICAgICAgICAgICAiZmFsc2UiIGluZGljYXRlcyB0byBwZXJmb3JtIHJlcGxhY2VtZW50IG9uIHRoZSB3aG9sZSBmaWxlIGF0IG9uY2UuCi0KLSAgRXhhbXBsZToKLQotICAgICBUaGUgZm9sbG93aW5nIGNhbGwgY291bGQgYmUgdXNlZCB0byByZXBsYWNlIGFuIG9sZCBwcm9wZXJ0eSBuYW1lIGluIGEgIi5wcm9wZXJ0aWVzIgotICAgICBmaWxlIHdpdGggYSBuZXcgbmFtZS4gIEluIHRoZSByZXBsYWNlIGF0dHJpYnV0ZSwgeW91IGNhbiByZWZlciB0byBhbnkgcGFydCBvZiB0aGUKLSAgICAgbWF0Y2ggZXhwcmVzc2lvbiBpbiBwYXJlbnRoZXNpcyB1c2luZyBiYWNrc2xhc2ggZm9sbG93ZWQgYnkgYSBudW1iZXIgbGlrZSAnXDEnLgotCi0gICAgICZsdDtyZXBsYWNlcmVnZXhwIGZpbGU9InRlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgICAgICAgbWF0Y2g9Ik15UHJvcGVydHk9KC4qKSIKLSAgICAgICAgICAgICAgICAgICAgcmVwbGFjZT0iTmV3UHJvcGVydHk9XDEiCi0gICAgICAgICAgICAgICAgICAgIGJ5bGluZT0idHJ1ZSIgLyZndDsKLQotIDwvcHJlPl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYnlsaW5lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUHJvY2VzcyB0aGUgZmlsZShzKSBvbmUgbGluZSBhdCBhIHRpbWUsIGV4ZWN1dGluZyB0aGUgcmVwbGFjZW1lbnQKLSBvbiBvbmUgbGluZSBhdCBhIHRpbWUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFByb2Nlc3MgdGhlIGZpbGUocykgb25lIGxpbmUgYXQgYSB0aW1lLCBleGVjdXRpbmcgdGhlIHJlcGxhY2VtZW50Ci0gb24gb25lIGxpbmUgYXQgYSB0aW1lLiAgVGhpcyBpcyB1c2VmdWwgaWYgeW91Ci0gd2FudCB0byBvbmx5IHJlcGxhY2UgdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBvbgotIGVhY2ggbGluZSwgd2hpY2ggaXMgbm90IGVhc3kgdG8gZG8gd2hlbiBwcm9jZXNzaW5nIHRoZSBmaWxlIGFzIGEgd2hvbGUuCi0gRGVmYXVsdHMgdG8gPGk+ZmFsc2U8L2k+LjwvdGQ+Ci0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZpbGUgZm9yIHdoaWNoIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gc2hvdWxkIGJlIHJlcGxhY2VkOwotIHJlcXVpcmVkIHVubGVzcyBhIG5lc3RlZCBmaWxlc2V0IGlzIHN1cHBsaWVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBmaWxlIGZvciB3aGljaCB0aGUgcmVndWxhciBleHByZXNzaW9uIHNob3VsZCBiZSByZXBsYWNlZDsKLSByZXF1aXJlZCB1bmxlc3MgYSBuZXN0ZWQgZmlsZXNldCBpcyBzdXBwbGllZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmbGFncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBmbGFncyB0byB1c2Ugd2hlbiBtYXRjaGluZyB0aGUgcmVndWxhciBleHByZXNzaW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgZmxhZ3MgdG8gdXNlIHdoZW4gbWF0Y2hpbmcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4gIEZvciBtb3JlCi0gaW5mb3JtYXRpb24sIGNvbnN1bHQgdGhlIFBlcmw1IHN5bnRheC4KLSA8dWw+Ci0gIDxsaT5nIDogR2xvYmFsIHJlcGxhY2VtZW50LiAgUmVwbGFjZSBhbGwgb2NjdXJlbmNlcyBmb3VuZAotICA8bGk+aSA6IENhc2UgSW5zZW5zaXRpdmUuICBEbyBub3QgY29uc2lkZXIgY2FzZSBpbiB0aGUgbWF0Y2gKLSAgPGxpPm0gOiBNdWx0aWxpbmUuICBUcmVhdCB0aGUgc3RyaW5nIGFzIG11bHRpcGxlIGxpbmVzIG9mIGlucHV0LCAKLSAgICAgICAgIHVzaW5nICJeIiBhbmQgIiQiIGFzIHRoZSBzdGFydCBvciBlbmQgb2YgYW55IGxpbmUsIHJlc3BlY3RpdmVseSwgcmF0aGVyIHRoYW4gc3RhcnQgb3IgZW5kIG9mIHN0cmluZy4KLSAgPGxpPiBzIDogU2luZ2xlbGluZS4gIFRyZWF0IHRoZSBzdHJpbmcgYXMgYSBzaW5nbGUgbGluZSBvZiBpbnB1dCwgdXNpbmcKLSAgICAgICAgIi4iIHRvIG1hdGNoIGFueSBjaGFyYWN0ZXIsIGluY2x1ZGluZyBhIG5ld2xpbmUsIHdoaWNoIG5vcm1hbGx5LCBpdCB3b3VsZCBub3QgbWF0Y2guCi08L3VsPgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im1hdGNoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHRvIG1hdGNoIGluIHRoZSBmaWxlKHMpOwotIHJlcXVpcmVkIGlmIG5vIG5lc3RlZCAmbHQ7cmVnZXhwJmd0OyBpcyB1c2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICB0aGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gdG8gbWF0Y2ggaW4gdGhlIGZpbGUocyk7Ci0gcmVxdWlyZWQgaWYgbm8gbmVzdGVkICZsdDtyZWdleHAmZ3Q7IGlzIHVzZWQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXBsYWNlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHN1YnN0aXR1dGlvbiBwYXR0ZXJuIHRvIHBsYWNlIGluIHRoZSBmaWxlKHMpIGluIHBsYWNlCi0gb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIHN1YnN0aXR1dGlvbiBwYXR0ZXJuIHRvIHBsYWNlIGluIHRoZSBmaWxlKHMpIGluIHBsYWNlCi0gb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSBSZXF1aXJlZCBpZiBubyBuZXN0ZWQgJmx0O3N1YnN0aXR1dGlvbiZndDsgaXMgdXNlZAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xpc3QgZmlsZXMgdG8gYXBwbHkgdGhlIHJlcGxhY2VtZW50IHRvLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtsaXN0IGZpbGVzIHRvIGFwcGx5IHRoZSByZXBsYWNlbWVudCB0b11dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJyZWdleHAiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZ3VsYXJFeHByZXNzaW9uIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBIHJlZ3VsYXIgZXhwcmVzc2lvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQSByZWd1bGFyIGV4cHJlc3Npb24uCi0gWW91IGNhbiB1c2UgdGhpcyBlbGVtZW50IHRvIHJlZmVyIHRvIGEgcHJldmlvdXNseQotIGRlZmluZWQgcmVndWxhciBleHByZXNzaW9uIGRhdGF0eXBlIGluc3RhbmNlXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9InN1YnN0aXR1dGlvbiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuU3Vic3RpdHV0aW9uIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBIHN1YnN0aXR1dGlvbiBwYXR0ZXJuLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBIHN1YnN0aXR1dGlvbiBwYXR0ZXJuLiAgWW91IGNhbiB1c2UgdGhpcyBlbGVtZW50IHRvIHJlZmVyIHRvIGEgcHJldmlvdXNseQotIGRlZmluZWQgc3Vic3RpdHV0aW9uIHBhdHRlcm4gZGF0YXR5cGUgaW5zdGFuY2UuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0icm1pYyIgY2F0ZWdvcnk9ImphdmEiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlJtaWMiCi0gICAgICBtYXRjaGluZ1Rhc2s9InRydWUiPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtSdW5zIHRoZSBybWljIGNvbXBpbGVyIGFnYWluc3QgY2xhc3Nlcy48L3A+IDxwPlJtaWMgY2FuIGJlIHJ1biBvbiBhIHNpbmdsZSBjbGFzcyAoYXMgc3BlY2lmaWVkIHdpdGggdGhlIGNsYXNzbmFtZSBhdHRyaWJ1dGUpIG9yIGEgbnVtYmVyIG9mIGNsYXNzZXMgYXQgb25jZSAoYWxsIGNsYXNzZXMgYmVsb3cgYmFzZSB0aGF0IGFyZSBuZWl0aGVyIF9TdHViIG5vciBfU2tlbCBjbGFzc2VzKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbUnVucyB0aGUgcm1pYyBjb21waWxlciBhZ2FpbnN0IGNsYXNzZXMuPC9wPgotIDxwPlJtaWMgY2FuIGJlIHJ1biBvbiBhIHNpbmdsZSBjbGFzcyAoYXMgc3BlY2lmaWVkIHdpdGggdGhlIGNsYXNzbmFtZQotIGF0dHJpYnV0ZSkgb3IgYSBudW1iZXIgb2YgY2xhc3NlcyBhdCBvbmNlIChhbGwgY2xhc3NlcyBiZWxvdyBiYXNlIHRoYXQKLSBhcmUgbmVpdGhlciBfU3R1YiBub3IgX1NrZWwgY2xhc3NlcykuICBJZiB5b3Ugd2FudCB0byBybWljIGEgc2luZ2xlCi0gY2xhc3MgYW5kIHRoaXMgY2xhc3MgaXMgYSBjbGFzcyBuZXN0ZWQgaW50byBhbm90aGVyIGNsYXNzLCB5b3UgaGF2ZSB0bwotIHNwZWNpZnkgdGhlIGNsYXNzbmFtZSBpbiB0aGUgZm9ybSA8Y29kZT5PdXRlciQkSW5uZXI8L2NvZGU+IGluc3RlYWQgb2YKLSA8Y29kZT5PdXRlci5Jbm5lcjwvY29kZT4uPC9wPgotIDxwPkl0IGlzIHBvc3NpYmxlIHRvIHJlZmluZSB0aGUgc2V0IG9mIGZpbGVzIHRoYXQgYXJlIGJlaW5nIHJtaWNlZC4gVGhpcyBjYW4gYmUKLSBkb25lIHdpdGggdGhlIDxpPmluY2x1ZGVzPC9pPiwgPGk+aW5jbHVkZXNmaWxlPC9pPiwgPGk+ZXhjbHVkZXM8L2k+LCAKLSA8aT5leGNsdWRlc2ZpbGU8L2k+IGFuZCA8aT5kZWZhdWx0ZXhjbHVkZXM8L2k+Ci0gYXR0cmlidXRlcy4gV2l0aCB0aGUgPGk+aW5jbHVkZXM8L2k+IG9yIDxpPmluY2x1ZGVzZmlsZTwvaT4gYXR0cmlidXRlIHlvdSBzcGVjaWZ5IHRoZSBmaWxlcyB5b3Ugd2FudCB0bwotIGhhdmUgaW5jbHVkZWQgYnkgdXNpbmcgcGF0dGVybnMuIFRoZSA8aT5leGNsdWRlPC9pPiBvciA8aT5leGNsdWRlc2ZpbGU8L2k+IGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHNwZWNpZnkKLSB0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBleGNsdWRlZC4gVGhpcyBpcyBhbHNvIGRvbmUgd2l0aCBwYXR0ZXJucy4gQW5kCi0gZmluYWxseSB3aXRoIHRoZSA8aT5kZWZhdWx0ZXhjbHVkZXM8L2k+IGF0dHJpYnV0ZSwgeW91IGNhbiBzcGVjaWZ5IHdoZXRoZXIgeW91Ci0gd2FudCB0byB1c2UgZGVmYXVsdCBleGNsdXNpb25zIG9yIG5vdC4gU2VlIHRoZSBzZWN0aW9uIG9uIAotIGRpcmVjdG9yeSBiYXNlZCB0YXNrczwvYT4sIG9uIGhvdyB0aGUKLSBpbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvIHdyaXRlIHBhdHRlcm5zLjwvcD4KLSA8cD5UaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgRmlsZVNldCBhbmQKLSBzdXBwb3J0cyBhbGwgYXR0cmlidXRlcyBvZiA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+Ci0gKDxjb2RlPmRpcjwvY29kZT4gYmVjb21lcyA8Y29kZT5iYXNlPC9jb2RlPikgYXMgd2VsbCBhcyB0aGUgbmVzdGVkCi0gPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiBhbmQKLSA8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KLSA8cD5JdCBpcyBwb3NzaWJsZSB0byB1c2UgZGlmZmVyZW50IGNvbXBpbGVycy4gVGhpcyBjYW4gYmUgc2VsZWN0ZWQKLSB3aXRoIHRoZSAmcXVvdDtidWlsZC5ybWljJnF1b3Q7IHByb3BlcnR5IG9yIHRoZSA8Y29kZT5jb21waWxlcjwvY29kZT4KLSBhdHRyaWJ1dGUuIDxhIG5hbWU9ImNvbXBpbGVydmFsdWVzIj5UaGVyZSBhcmUgdGhyZWUgY2hvaWNlczwvYT46PC9wPgotIDx1bD4KLSAgIDxsaT5zdW4gKHRoZSBzdGFuZGFyZCBjb21waWxlciBvZiB0aGUgSkRLKTwvbGk+Ci0gICA8bGk+a2FmZmUgKHRoZSBzdGFuZGFyZCBjb21waWxlciBvZiAKLSAgICAgICB7QGxpbmsgPGEgaHJlZj0iaHR0cDovL3d3dy5rYWZmZS5vcmciPkthZmZlPC9hPn0pPC9saT4KLSAgIDxsaT53ZWJsb2dpYzwvbGk+Ci0gPC91bD4KLSA8cD4gVGhlIDxhIGhyZWY9Imh0dHA6Ly9kaW9uZS56Y3UuY3ovfnRvbWFuNDAvbWluaVJNSS8iPm1pbmlSTUk8L2E+Ci0gcHJvamVjdCBjb250YWlucyBhIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHRhc2sgYXMgd2VsbCwKLSBwbGVhc2UgY29uc3VsdCBtaW5pUk1JJ3MgZG9jdW1lbnRhdGlvbiB0byBsZWFybiBob3cgdG8gdXNlIGl0LjwvcD5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImJhc2UiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtMb2NhdGlvbiB0byBzdG9yZSB0aGUgY29tcGlsZWQgZmlsZXM7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBsb2NhdGlvbiB0byBzdG9yZSB0aGUgY29tcGlsZWQgZmlsZXM7IHJlcXVpcmVkCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGNsYXNzIHRvIHJ1biA8Y29kZT5ybWljPC9jb2RlPiBhZ2FpbnN0OwotIG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSB0aGUgY2xhc3MgdG8gcnVuIDxjb2RlPnJtaWM8L2NvZGU+IGFnYWluc3Q7Ci0gb3B0aW9uYWwKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgY29tcGlsYXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIHRoaXMgY29tcGlsYXRpb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRocmVmIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2UiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUmVmZXJlbmNlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIHRvIHRoZSBjbGFzc3BhdGggYSByZWZlcmVuY2UgdG8gCi0gYSAmbHQ7cGF0aCZndDsgZGVmaW5lZCBlbHNld2hlcmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEFkZHMgdG8gdGhlIGNsYXNzcGF0aCBhIHJlZmVyZW5jZSB0byAKLSBhICZsdDtwYXRoJmd0OyBkZWZpbmVkIGVsc2V3aGVyZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21waWxlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NvbXBpbGVyIGltcGxlbWVudGF0aW9uIHRvIHVzZTsgb3B0aW9uYWwsCi0gZGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5idWlsZC5ybWljPC9jb2RlPiBwcm9wZXJ0eSwKLSBvciBmYWlsaW5nIHRoYXQsIGRlZmF1bHQgY29tcGlsZXIgZm9yIHRoZSBjdXJyZW50IFZNLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBjb21waWxlciBpbXBsZW1lbnRhdGlvbiB0byB1c2U7IG9wdGlvbmFsLAotIGRlZmF1bHRzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+YnVpbGQucm1pYzwvY29kZT4gcHJvcGVydHksCi0gb3IgZmFpbGluZyB0aGF0LCBkZWZhdWx0IGNvbXBpbGVyIGZvciB0aGUgY3VycmVudCBWTQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlYnVnIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0dlbmVyYXRlIGRlYnVnIGluZm8gKHBhc3NlcyAtZyB0byBybWljKTsKLSBvcHRpb25hbCwgZGVmYXVsdHMgdG8gZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIGdlbmVyYXRlIGRlYnVnIGluZm8gKHBhc3NlcyAtZyB0byBybWljKTsKLSBvcHRpb25hbCwgZGVmYXVsdHMgdG8gZmFsc2UKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHRkaXJzIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0V4dGVuc2lvbiBkaXJlY3RvcmllcyB0aGF0IHdpbGwgYmUgdXNlZCBkdXJpbmcgdGhlCi0gY29tcGlsYXRpb247IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBleHRlbnNpb24gZGlyZWN0b3JpZXMgdGhhdCB3aWxsIGJlIHVzZWQgZHVyaW5nIHRoZQotIGNvbXBpbGF0aW9uOyBvcHRpb25hbC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWx0ZXJpbmciIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSW5kaWNhdGVzIHdoZXRoZXIgdG9rZW4gZmlsdGVyaW5nIHNob3VsZCB0YWtlIHBsYWNlOwotIG9wdGlvbmFsLCBkZWZhdWx0PWZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBpbmRpY2F0ZXMgd2hldGhlciB0b2tlbiBmaWx0ZXJpbmcgc2hvdWxkIHRha2UgcGxhY2U7Ci0gb3B0aW9uYWwsIGRlZmF1bHQ9ZmFsc2UKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZGwiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSW5kaWNhdGVzIHRoYXQgSURMIG91dHB1dCBzaG91bGQgYmUgCi0gZ2VuZXJhdGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJbmRpY2F0ZXMgdGhhdCBJREwgb3V0cHV0IHNob3VsZCBiZSAKLSBnZW5lcmF0ZWQuICBUaGlzIGRlZmF1bHRzIHRvIGZhbHNlIAotIGlmIG5vdCBzZXQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWRsb3B0cyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Bhc3MgYWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIGlkbCBjb21waWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBwYXNzIGFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciBpZGwgY29tcGlsZQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Imlpb3AiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSW5kaWNhdGVzIHRoYXQgSUlPUCBjb21wYXRpYmxlIHN0dWJzIHNob3VsZAotIGJlIGdlbmVyYXRlZDsgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIGZhbHNlIAotIGlmIG5vdCBzZXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEluZGljYXRlcyB0aGF0IElJT1AgY29tcGF0aWJsZSBzdHVicyBzaG91bGQKLSBiZSBnZW5lcmF0ZWQ7IG9wdGlvbmFsLCBkZWZhdWx0cyB0byBmYWxzZSAKLSBpZiBub3Qgc2V0LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Imlpb3BvcHRzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IGFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciBpaW9wLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgYWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIGlpb3AKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmNsdWRlYW50cnVudGltZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIHdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgYW50J3Mgb3duIGNsYXNzcGF0aCBpbiB0aGlzIHRhc2sncyAKLSBjbGFzc3BhdGguXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgd2hldGhlciBvciBub3QgdG8gaW5jbHVkZSBhbnQncyBvd24gY2xhc3NwYXRoIGluIHRoaXMgdGFzaydzIAotIGNsYXNzcGF0aC4KLSBPcHRpb25hbDsgZGVmYXVsdCBpcyA8Y29kZT50cnVlPC9jb2RlPi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbmNsdWRlamF2YXJ1bnRpbWUiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGFzaydzIGNsYXNzcGF0aC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgdGFzaydzIGNsYXNzcGF0aC4KLSBFbmFibGVzIG9yIGRpc2FibGVzIGluY2x1ZGluZyB0aGUgZGVmYXVsdCBydW4tdGltZQotIGxpYnJhcmllcyBmcm9tIHRoZSBleGVjdXRpbmcgVk07IG9wdGlvbmFsLAotIGRlZmF1bHRzIHRvIGZhbHNlCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic291cmNlYmFzZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW09wdGlvbmFsIGRpcmVjdG9yeSB0byBzYXZlIGdlbmVyYXRlZCBzb3VyY2UgZmlsZXMgdG8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIG9wdGlvbmFsIGRpcmVjdG9yeSB0byBzYXZlIGdlbmVyYXRlZCBzb3VyY2UgZmlsZXMgdG8uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3R1YnZlcnNpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTcGVjaWZ5IHRoZSBKREsgdmVyc2lvbiBmb3IgdGhlIGdlbmVyYXRlZCBzdHViIGNvZGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNwZWNpZnkgdGhlIEpESyB2ZXJzaW9uIGZvciB0aGUgZ2VuZXJhdGVkIHN0dWIgY29kZS4KLSBTcGVjaWZ5ICZxdW90OzEuMSZxdW90OyB0byBwYXNzIHRoZSAmcXVvdDstdjEuMSZxdW90OyBvcHRpb24gdG8gcm1pYy48L3RkPgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZlcmlmeSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRvIGVuYWJsZSB2ZXJpZmljYXRpb24gc28gdGhhdCB0aGUgY2xhc3NlcyAKLSBmb3VuZCBieSB0aGUgZGlyZWN0b3J5IG1hdGNoIGFyZQotIGNoZWNrZWQgdG8gc2VlIGlmIHRoZXkgaW1wbGVtZW50IGphdmEucm1pLlJlbW90ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgRmxhZyB0byBlbmFibGUgdmVyaWZpY2F0aW9uIHNvIHRoYXQgdGhlIGNsYXNzZXMgCi0gZm91bmQgYnkgdGhlIGRpcmVjdG9yeSBtYXRjaCBhcmUKLSBjaGVja2VkIHRvIHNlZSBpZiB0aGV5IGltcGxlbWVudCBqYXZhLnJtaS5SZW1vdGUuCi0gT3B0aW9uYWw7IGhpcyBkZWZhdWx0cyB0byBmYWxzZSBpZiBub3Qgc2V0LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ3JlYXRlcyBhIG5lc3RlZCBjbGFzc3BhdGggZWxlbWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQ3JlYXRlcyBhIG5lc3RlZCBjbGFzc3BhdGggZWxlbWVudC5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iY29tcGlsZXJhcmciIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlJtaWMuSW1wbGVtZW50YXRpb25TcGVjaWZpY0FyZ3VtZW50IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGFuIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGNvbW1hbmQgbGluZSBhcmd1bWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhbiBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBjb21tYW5kIGxpbmUgYXJndW1lbnQuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImV4dGRpcnMiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtNYXliZSBjcmVhdGVzIGEgbmVzdGVkIGV4dGRpcnMgZWxlbWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbTWF5YmUgY3JlYXRlcyBhIG5lc3RlZCBleHRkaXJzIGVsZW1lbnQuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0icnBtIiBjYXRlZ29yeT0ib3RoZXIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLlJwbSIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSW52b2tlcyB0aGUgcnBtIHRvb2wgdG8gYnVpbGQgYSBMaW51eCBpbnN0YWxsYXRpb24gZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbSW52b2tlcyB0aGUgcnBtIHRvb2wgdG8gYnVpbGQgYSBMaW51eCBpbnN0YWxsYXRpb24gZmlsZS5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNsZWFuYnVpbGRkaXIiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmxhZyAob3B0aW9uYWwsIGRlZmF1bHQ9ZmFsc2UpIHRvIHJlbW92ZSAKLSB0aGUgZ2VuZXJhdGVkIGZpbGVzIGluIHRoZSBCVUlMRCBkaXJlY3RvcnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEZsYWcgKG9wdGlvbmFsLCBkZWZhdWx0PWZhbHNlKSB0byByZW1vdmUgCi0gdGhlIGdlbmVyYXRlZCBmaWxlcyBpbiB0aGUgQlVJTEQgZGlyZWN0b3J5Ci0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tbWFuZCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doYXQgY29tbWFuZCB0byBpc3N1ZSB0byB0aGUgcnBtIHRvb2w7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBXaGF0IGNvbW1hbmQgdG8gaXNzdWUgdG8gdGhlIHJwbSB0b29sOyBvcHRpb25hbC4KLSBUaGUgZGVmYXVsdCBpcyAiLWJiIgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImVycm9yIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbT3B0aW9uYWwgZmlsZSB0byBzYXZlIHN0ZGVyciB0by5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgT3B0aW9uYWwgZmlsZSB0byBzYXZlIHN0ZGVyciB0bwotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im91dHB1dCIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW09wdGlvbmFsIGZpbGUgdG8gc2F2ZSBzdGRvdXQgdG8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIE9wdGlvbmFsIGZpbGUgdG8gc2F2ZSBzdGRvdXQgdG8uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVtb3Zlc291cmNlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgKG9wdGlvbmFsLCBkZWZhdWx0PWZhbHNlKSAKLSB0byByZW1vdmUgdGhlIHNvdXJjZXMgYWZ0ZXIgdGhlIGJ1aWxkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBGbGFnIChvcHRpb25hbCwgZGVmYXVsdD1mYWxzZSkgCi0gdG8gcmVtb3ZlIHRoZSBzb3VyY2VzIGFmdGVyIHRoZSBidWlsZC4KLSBTZWUgdGhlIHRoZSA8dHQ+LS1ybXNvdXJjZTwvdHQ+ICBvcHRpb24gb2YgcnBtYnVpbGQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVtb3Zlc3BlYyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIChvcHRpb25hbCwgZGVmYXVsdD1mYWxzZSkgdG8gcmVtb3ZlIHRoZSBzcGVjIGZpbGUgZnJvbSBTUEVDUy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgRmxhZyAob3B0aW9uYWwsIGRlZmF1bHQ9ZmFsc2UpIHRvIHJlbW92ZSB0aGUgc3BlYyBmaWxlIGZyb20gU1BFQ1MKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcGVjZmlsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBuYW1lIG9mIHRoZSBzcGVjIEZpbGUgdG8gdXNlOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHNwZWMgRmlsZSB0byB1c2U7IHJlcXVpcmVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRvcGRpciIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBkaXJlY3Rvcnkgd2hpY2ggd2lsbCBoYXZlIHRoZSBleHBlY3RlZAotIHN1YmRpcmVjdG9yaWVzLCBTUEVDUywgU09VUkNFUywgQlVJTEQsIFNSUE1TIDsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBkaXJlY3Rvcnkgd2hpY2ggd2lsbCBoYXZlIHRoZSBleHBlY3RlZAotIHN1YmRpcmVjdG9yaWVzLCBTUEVDUywgU09VUkNFUywgQlVJTEQsIFNSUE1TIDsgb3B0aW9uYWwuIAotIElmIHRoaXMgaXNuJ3Qgc3BlY2lmaWVkLAotIHRoZSA8dHQ+YmFzZURpcjwvdHQ+IHZhbHVlIGlzIHVzZWQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0ic2NyaXB0IiBjYXRlZ29yeT0ib3RoZXIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLlNjcmlwdCIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRXhlY3V0ZXMgYSBzY3JpcHQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0V4ZWN1dGVzIGEgc2NyaXB0Ll1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFuZ3VhZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZWZpbmVzIHRoZSBsYW5ndWFnZSAocmVxdWlyZWQpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBEZWZpbmVzIHRoZSBsYW5ndWFnZSAocmVxdWlyZWQpLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNyYyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xvYWQgdGhlIHNjcmlwdCBmcm9tIGFuIGV4dGVybmFsIGZpbGUgOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgTG9hZCB0aGUgc2NyaXB0IGZyb20gYW4gZXh0ZXJuYWwgZmlsZSA7IG9wdGlvbmFsLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgICAgIDxib2R5ID4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBzY3JpcHQgdGV4dC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYm9keT4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9InNlcXVlbnRpYWwiIGNhdGVnb3J5PSJjb250cm9sIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5TZXF1ZW50aWFsIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXF1ZW50aWFsIGlzIGEgY29udGFpbmVyIHRhc2sgLSBpdCBjYW4gY29udGFpbiBvdGhlciBBbnQgdGFza3MuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW1NlcXVlbnRpYWwgaXMgYSBjb250YWluZXIgdGFzayAtIGl0IGNhbiBjb250YWluIG90aGVyIEFudCB0YXNrcy4gVGhlIG5lc3RlZCAKLSB0YXNrcyBhcmUgc2ltcGx5IGV4ZWN1dGVkIGluIHNlcXVlbmNlLiBTZXF1ZW50aWFsJ3MgcHJpbWFyeSB1c2UgaXMgdG8gc3VwcG9ydCAKLSB0aGUgc2VxdWVudGlhbCBleGVjdXRpb24gb2YgYSBzdWJzZXQgb2YgdGFza3Mgd2l0aGluIHRoZQote0BsaW5rIFBhcmFsbGVsIFBhcmFsbGVsIFRhc2t9IAotCi0gPHA+Ci0gVGhlIHNlcXVlbnRpYWwgdGFzayBoYXMgbm8gYXR0cmlidXRlcyBhbmQgZG9lcyBub3Qgc3VwcG9ydCBhbnkgbmVzdGVkIAotIGVsZW1lbnRzIGFwYXJ0IGZyb20gQW50IHRhc2tzLiBBbnkgdmFsaWQgQW50IHRhc2sgbWF5IGJlIGVtYmVkZGVkIHdpdGhpbiB0aGUgCi0gc2VxdWVudGlhbCB0YXNrLjwvcD5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJzZXJ2ZXJkZXBsb3kiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuajJlZS5TZXJ2ZXJEZXBsb3kiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NvbnRyb2xzIGhvdCBkZXBsb3ltZW50IHRvb2xzIGZvciBKMkVFIHNlcnZlcnMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0NvbnRyb2xzIGhvdCBkZXBsb3ltZW50IHRvb2xzIGZvciBKMkVFIHNlcnZlcnMuCi0KLSAgVGhpcyBjbGFzcyBpcyB1c2VkIGFzIGEgZnJhbWV3b3JrIGZvciB0aGUgY3JlYXRpb24gb2YgdmVuZG9yIHNwZWNpZmljCi0gIGhvdCBkZXBsb3ltZW50IHRvb2xzLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYWN0aW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQsIHVzdWFsbHkgImRlcGxveSI7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZCwgdXN1YWxseSAiZGVwbG95IjsgcmVxdWlyZWQuCi0gICBTb21lIHRvb2xzIHN1cHBvcnQgYWRkaXRpb25hbCBhY3Rpb25zLCBzdWNoIGFzICJkZWxldGUiLCAibGlzdCIsICJ1bmRlcGxveSIsICJ1cGRhdGUiLi4uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic291cmNlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGZpbGVuYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgZGVwbG95ZWQ7IG9wdGlvbmFsCi0gIGRlcGVuZGluZyB1cG9uIHRoZSB0b29sIGFuZCB0aGUgYWN0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgZmlsZW5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBkZXBsb3llZDsgb3B0aW9uYWwKLSAgZGVwZW5kaW5nIHVwb24gdGhlIHRvb2wgYW5kIHRoZSBhY3Rpb24uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJnZW5lcmljIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qMmVlLkdlbmVyaWNIb3REZXBsb3ltZW50VG9vbCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ3JlYXRlcyBhIGdlbmVyaWMgZGVwbG95bWVudCB0b29sLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtDcmVhdGVzIGEgZ2VuZXJpYyBkZXBsb3ltZW50IHRvb2wuCi0gIDxwPkFudCBjYWxscyB0aGlzIG1ldGhvZCBvbiBjcmVhdGlvbiB0byBoYW5kbGUgZW1iZWRkZWQgImdlbmVyaWMiIGVsZW1lbnRzCi0gIGluIHRoZSBTZXJ2ZXJEZXBsb3kgdGFzay5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iam9uYXMiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmoyZWUuSm9uYXNIb3REZXBsb3ltZW50VG9vbCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ3JlYXRlcyBhIEpPbkFTIGRlcGxveW1lbnQgdG9vbCwgZm9yIGRlcGxveW1lbnQgdG8gSk9uQVMgc2VydmVycy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQ3JlYXRlcyBhIEpPbkFTIGRlcGxveW1lbnQgdG9vbCwgZm9yIGRlcGxveW1lbnQgdG8gSk9uQVMgc2VydmVycy4KLSAgPHA+QW50IGNhbGxzIHRoaXMgbWV0aG9kIG9uIGNyZWF0aW9uIHRvIGhhbmRsZSBlbWJlZGRlZCAiam9uYXMiIGVsZW1lbnRzCi0gIGluIHRoZSBTZXJ2ZXJEZXBsb3kgdGFzay5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0id2VibG9naWMiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmoyZWUuV2ViTG9naWNIb3REZXBsb3ltZW50VG9vbCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ3JlYXRlcyBhIFdlYkxvZ2ljIGRlcGxveW1lbnQgdG9vbCwgZm9yIGRlcGxveW1lbnQgdG8gV2ViTG9naWMgc2VydmVycy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQ3JlYXRlcyBhIFdlYkxvZ2ljIGRlcGxveW1lbnQgdG9vbCwgZm9yIGRlcGxveW1lbnQgdG8gV2ViTG9naWMgc2VydmVycy4KLSAgPHA+QW50IGNhbGxzIHRoaXMgbWV0aG9kIG9uIGNyZWF0aW9uIHRvIGhhbmRsZSBlbWJlZGRlZCAid2VibG9naWMiIGVsZW1lbnRzCi0gIGluIHRoZSBTZXJ2ZXJEZXBsb3kgdGFzay5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJzZXRwcm94eSIgY2F0ZWdvcnk9Im90aGVyIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5uZXQuU2V0UHJveHkiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgSmF2YSdzIHdlYiBwcm94eSBwcm9wZXJ0aWVzLCBzbyB0aGF0IHRhc2tzIGFuZCBjb2RlIHJ1biBpbiB0aGUgc2FtZSBKVk0gY2FuIGhhdmUgdGhyb3VnaC10aGUtZmlyZXdhbGwgYWNjZXNzIHRvIHJlbW90ZSB3ZWIgc2l0ZXMsIGFuZCByZW1vdGUgZnRwIHNpdGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtTZXRzIEphdmEncyB3ZWIgcHJveHkgcHJvcGVydGllcywgc28gdGhhdCB0YXNrcyBhbmQgY29kZSBydW4gaW4KLSB0aGUgc2FtZSBKVk0gY2FuIGhhdmUgdGhyb3VnaC10aGUtZmlyZXdhbGwgYWNjZXNzIHRvIHJlbW90ZSB3ZWIgc2l0ZXMsCi0gYW5kIHJlbW90ZSBmdHAgc2l0ZXMuCi0gWW91IGNhbiBub21pbmF0ZSBhbiBodHRwIGFuZCBmdHAgcHJveHksIG9yIGEgc29ja3Mgc2VydmVyLCByZXNldCB0aGUgc2VydmVyIAotIHNldHRpbmdzLCBvciBkbyBub3RoaW5nIGF0IGFsbC4KLSA8cD4gCi0gRXhhbXBsZXMKLSA8cHJlPiZsdDtzZXRwcm94eS8mZ3Q7PC9wcmU+Ci0gZG8gbm90aGluZwotIDxwcmU+Jmx0O3NldHByb3h5IHByb3h5aG9zdD0iZmlyZXdhbGwiLyZndDs8L3ByZT4KLSBzZXQgdGhlIHByb3h5IHRvIGZpcmV3YWxsOjgwCi0gPHByZT4mbHQ7c2V0cHJveHkgcHJveHlob3N0PSJmaXJld2FsbCIgcHJveHlwb3J0PSI4MSIvJmd0OzwvcHJlPgotIHNldCB0aGUgcHJveHkgdG8gZmlyZXdhbGw6ODEKLSA8cHJlPiZsdDtzZXRwcm94eSBwcm94eWhvc3Q9IiIvJmd0OzwvcHJlPgotIHN0b3AgdXNpbmcgdGhlIGh0dHAgcHJveHk7IGRvbid0IGNoYW5nZSB0aGUgc29ja3Mgc2V0dGluZ3MKLSA8cHJlPiZsdDtzZXRwcm94eSBzb2Nrc3Byb3h5aG9zdD0ic29ja3N5Ii8mZ3Q7PC9wcmU+Ci0gdXNlIHNvY2tzIHZpYSBzb2Nrc3k6MTA4MAotIDxwcmU+Jmx0O3NldHByb3h5IHNvY2tzcHJveHlob3N0PSIiLyZndDs8L3ByZT4KLSBzdG9wIHVzaW5nIHRoZSBzb2NrcyBzZXJ2ZXJdXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im5vbnByb3h5aG9zdHMiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBIGxpc3Qgb2YgaG9zdHMgdG8gYnlwYXNzIHRoZSBwcm94eSBvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgQSBsaXN0IG9mIGhvc3RzIHRvIGJ5cGFzcyB0aGUgcHJveHkgb24uIFRoZXNlIHNob3VsZCBiZSBzZXBhcmF0ZWQKLSB3aXRoIHRoZSB2ZXJ0aWNhbCBiYXIgY2hhcmFjdGVyICd8Jy4gT25seSBpbiBKYXZhIDEuNCBkb2VzIGZ0cCB1c2UKLSB0aGlzIGxpc3QuCi0gZS5nLiBmb3pib3QuY29ycC5zdW4uY29tfCouZW5nLnN1bi5jb20KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm94eWhvc3QiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgSFRUUC9mdHAgcHJveHkgaG9zdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgdGhlIEhUVFAvZnRwIHByb3h5IGhvc3QuIFNldCB0aGlzIHRvICIiIGZvciB0aGUgaHR0cCBwcm94eQotIG9wdGlvbiB0byBiZSBkaXNhYmxlZAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InByb3h5cG9ydCIgdHlwZT0iaW50IgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIEhUVFAvZnRwIHByb3h5IHBvcnQgbnVtYmVyOyBkZWZhdWx0IGlzIDgwLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICB0aGUgSFRUUC9mdHAgcHJveHkgcG9ydCBudW1iZXI7IGRlZmF1bHQgaXMgODAKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb2Nrc3Byb3h5aG9zdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBuYW1lIG9mIGEgU29ja3Mgc2VydmVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgbmFtZSBvZiBhIFNvY2tzIHNlcnZlci4gU2V0IHRvICIiIHRvIHR1cm4gc29ja3MKLSBwcm94eWluZyBvZmYuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic29ja3Nwcm94eXBvcnQiIHR5cGU9ImludCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJpbnQiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Byb3h5UG9ydCBmb3Igc29ja3MgY29ubmVjdGlvbnMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgUHJveHlQb3J0IGZvciBzb2NrcyBjb25uZWN0aW9ucy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTA4MAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJzaWduamFyIiBjYXRlZ29yeT0iamF2YSIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuU2lnbkphciIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2lnbnMgamFyIG9yIHppcCBmaWxlcyB3aXRoIHRoZSBqYXZhc2lnbiBjb21tYW5kIGxpbmUgdG9vbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbU2lnbnMgamFyIG9yIHppcCBmaWxlcyB3aXRoIHRoZSBqYXZhc2lnbiBjb21tYW5kIGxpbmUgdG9vbC4gVGhlCi0gdG9vbCBkZXRhaWxlZCBkZXBlbmRlbmN5IGNoZWNraW5nOiBmaWxlcyBhcmUgb25seSBzaWduZWQgaWYgdGhleQotIGFyZSBub3Qgc2lnbmVkLiBUaGUgPHR0PnNpZ25qYXI8L3R0PiBhdHRyaWJ1dGUgY2FuIHBvaW50IHRvIHRoZSBmaWxlIHRvCi0gZ2VuZXJhdGU7IGlmIHRoaXMgZmlsZSBleGlzdHMgdGhlbgotIGl0cyBtb2RpZmljYXRpb24gZGF0ZSBpcyB1c2VkIGFzIGEgY3VlIGFzIHRvIHdoZXRoZXIgdG8gcmVzaWduIGFueSBKQVIgZmlsZS4KLSA8YnI+ICAKLSA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFJlcXVpcmVzIEphdmEgMS4yIG9yIGxhdGVyLiA8L3A+XV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbGlhcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBhbGlhcyB0byBzaWduIHVuZGVyOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgdGhlIGFsaWFzIHRvIHNpZ24gdW5kZXI7IHJlcXVpcmVkCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW50ZXJuYWxzZiIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRvIGluY2x1ZGUgdGhlIC5TRiBmaWxlIGluc2lkZSB0aGUgc2lnbmF0dXJlOwotIG9wdGlvbmFsOyBkZWZhdWx0IGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBGbGFnIHRvIGluY2x1ZGUgdGhlIC5TRiBmaWxlIGluc2lkZSB0aGUgc2lnbmF0dXJlOwotIG9wdGlvbmFsOyBkZWZhdWx0IGZhbHNlCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iamFyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGphciBmaWxlIHRvIHNpZ247IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICB0aGUgamFyIGZpbGUgdG8gc2lnbjsgcmVxdWlyZWQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJrZXlwYXNzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGFzc3dvcmQgZm9yIHByaXZhdGUga2V5IChpZiBkaWZmZXJlbnQpOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgcGFzc3dvcmQgZm9yIHByaXZhdGUga2V5IChpZiBkaWZmZXJlbnQpOyBvcHRpb25hbAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImtleXN0b3JlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbS2V5c3RvcmUgbG9jYXRpb247IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBrZXlzdG9yZSBsb2NhdGlvbjsgcmVxdWlyZWQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYXp5IiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdG8gY29udHJvbCB3aGV0aGVyIHRoZSBwcmVzZW5jZSBvZiBhIHNpZ25hdHVyZQotIGZpbGUgbWVhbnMgYSBKQVIgaXMgc2lnbmVkOwotIG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBmbGFnIHRvIGNvbnRyb2wgd2hldGhlciB0aGUgcHJlc2VuY2Ugb2YgYSBzaWduYXR1cmUKLSBmaWxlIG1lYW5zIGEgSkFSIGlzIHNpZ25lZDsKLSBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNlY3Rpb25zb25seSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRvIGNvbXB1dGUgaGFzaCBvZiBlbnRpcmUgbWFuaWZlc3Q7Ci0gb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIGZsYWcgdG8gY29tcHV0ZSBoYXNoIG9mIGVudGlyZSBtYW5pZmVzdDsKLSBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNpZ2ZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIG9mIC5TRi8uRFNBIGZpbGU7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBuYW1lIG9mIC5TRi8uRFNBIGZpbGU7IG9wdGlvbmFsCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2lnbmVkamFyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTmFtZSBvZiBzaWduZWQgSkFSIGZpbGU7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBuYW1lIG9mIHNpZ25lZCBKQVIgZmlsZTsgb3B0aW9uYWwKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdG9yZXBhc3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQYXNzd29yZCBmb3Iga2V5c3RvcmUgaW50ZWdyaXR5OyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgcGFzc3dvcmQgZm9yIGtleXN0b3JlIGludGVncml0eTsgcmVxdWlyZWQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdG9yZXR5cGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtLZXlzdG9yZSB0eXBlOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAga2V5c3RvcmUgdHlwZTsgb3B0aW9uYWwKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJib3NlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0VuYWJsZSB2ZXJib3NlIG91dHB1dCB3aGVuIHNpZ25pbmcKLSA7IG9wdGlvbmFsOiBkZWZhdWx0IGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBFbmFibGUgdmVyYm9zZSBvdXRwdXQgd2hlbiBzaWduaW5nCi0gOyBvcHRpb25hbDogZGVmYXVsdCBmYWxzZQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZmlsZXMgdG8gc2lnbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyB0byBzaWduXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0ic2xlZXAiIGNhdGVnb3J5PSJ1dGlsaXR5IgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5TbGVlcCIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2xlZXAsIG9yIHBhdXNlLCBmb3IgYSBwZXJpb2Qgb2YgdGltZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbU2xlZXAsIG9yIHBhdXNlLCBmb3IgYSBwZXJpb2Qgb2YgdGltZS4KLQotIEEgdGFzayBmb3Igc2xlZXBpbmcgYSBzaG9ydCBwZXJpb2Qgb2YgdGltZSwgdXNlZnVsIHdoZW4gYQotIGJ1aWxkIG9yIGRlcGxveW1lbnQgcHJvY2VzcyByZXF1aXJlcyBhbiBpbnRlcnZhbCBiZXR3ZWVuIHRhc2tzLgotPHA+Ci0gQSBuZWdhdGl2ZSB2YWx1ZSBjYW4gYmUgc3VwcGxpZWQgdG8gYW55IG9mIGF0dHJpYnV0ZXMgcHJvdmlkZWQgdGhlIHRvdGFsIHNsZWVwIHRpbWUgCi0gaXMgcG9zaXRpdmUsIHBlbmRpbmcgZnVuZGFtZW50YWwgY2hhbmdlcyBpbiBwaHlzaWNzIGFuZCBKVk0KLSBleGVjdXRpb24gdGltczwvcD4KLSBOb3RlIHRoYXQgc2xlZXAgdGltZXMgYXJlIGFsd2F5cyBoaW50cyB0byBiZSBpbnRlcnByZWQgYnkgdGhlIE9TIGhvdyBpdCBmZWVscyAKLSBzbWFsbCB0aW1lcyBtYXkgZWl0aGVyIGJlIGlnbm9yZWQgb3Igcm91bmRlZCB1cCB0byBhIG1pbmltdW0gdGltZXNsaWNlLiBOb3RlIAotIGFsc28gdGhhdCB0aGUgc3lzdGVtIGNsb2NrcyBvZnRlbiBoYXZlIGEgZmFpcmx5IGxvdyBncmFudWxhcml0eSB0b28sIHdoaWNoIGNvbXBsaWNhdGVzIAotIG1lYXN1cmluZyBob3cgbG9uZyBhIHNsZWVwIGFjdHVhbGx5IHRvb2suPC9wPl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmxhZyBjb250cm9sbGluZyB3aGV0aGVyIHRvIGJyZWFrIHRoZSBidWlsZCBvbiBhbiBlcnJvci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgZmxhZyBjb250cm9sbGluZyB3aGV0aGVyIHRvIGJyZWFrIHRoZSBidWlsZCBvbiBhbiBlcnJvci4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJob3VycyIgdHlwZT0iaW50IgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSG91cnMgdG8gYWRkIHRvIHRoZSBzbGVlcCB0aW1lLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBob3VycyB0byBhZGQgdG8gdGhlIHNsZWVwIHRpbWUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWlsbGlzZWNvbmRzIiB0eXBlPSJpbnQiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iaW50IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtNaWxsaXNlY29uZHMgdG8gYWRkIHRvIHRoZSBzbGVlcCB0aW1lLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBtaWxsaXNlY29uZHMgdG8gYWRkIHRvIHRoZSBzbGVlcCB0aW1lCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWludXRlcyIgdHlwZT0iaW50IgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTWludXRlcyB0byBhZGQgdG8gdGhlIHNsZWVwIHRpbWUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIG1pbnV0ZXMgdG8gYWRkIHRvIHRoZSBzbGVlcCB0aW1lCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2Vjb25kcyIgdHlwZT0iaW50IgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2Vjb25kcyB0byBhZGQgdG8gdGhlIHNsZWVwIHRpbWUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIHNlY29uZHMgdG8gYWRkIHRvIHRoZSBzbGVlcCB0aW1lCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9InNvc2NoZWNraW4iIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc29zLlNPU0NoZWNraW4iCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NvbW1pdHMgYW5kIHVubG9ja3MgZmlsZXMgaW4gVmlzdWFsIFNvdXJjZVNhZmUgdmlhIGEgU291cmNlT2ZmU2l0ZSBzZXJ2ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0NvbW1pdHMgYW5kIHVubG9ja3MgZmlsZXMgaW4gVmlzdWFsIFNvdXJjZVNhZmUgdmlhIGEgU291cmNlT2ZmU2l0ZSBzZXJ2ZXIuCi0KLSA8cD4KLSBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGludGVycHJldHRlZDoKLSA8dGFibGUgYm9yZGVyPSIxIj4KLSAgIDx0cj4KLSAgICAgPHRoPkF0dHJpYnV0ZTwvdGg+Ci0gICAgIDx0aD5WYWx1ZXM8L3RoPgotICAgICA8dGg+UmVxdWlyZWQ8L3RoPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgPHRkPnNvc2NtZGRpcjwvdGQ+Ci0gICAgIDx0ZD5EaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgc29zY21kKC5leGUpIDxicj4KLSAgICAgc29zY21kKC5leGUpIG11c3QgYmUgaW4gdGhlIHBhdGggaWYgdGhpcyBpcyBub3Qgc3BlY2lmaWVkPC90ZD4KLSAgICAgPHRkPk5vPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+dnNzc2VydmVycGF0aDwvdGQ+Ci0gICAgICA8dGQ+cGF0aCB0byB0aGUgc3Jjc2FmZS5pbmkgIC0gZWcuIFxcc2VydmVyXHZzc1xzcmNzYWZlLmluaTwvdGQ+Ci0gICAgICA8dGQ+WWVzPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+c29zc2VydmVycGF0aDwvdGQ+Ci0gICAgICA8dGQ+YWRkcmVzcyBhbmQgcG9ydCBvZiB0aGUgU09TIHNlcnZlciAgLSBlZy4gMTkyLjE2OC4wLjE6ODg4ODwvdGQ+Ci0gICAgICA8dGQ+WWVzPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+cHJvamVjdHBhdGg8L3RkPgotICAgICAgPHRkPlNvdXJjZVNhZmUgcHJvamVjdCBwYXRoIHdpdGhvdXQgdGhlICIkIjwvdGQ+Ci0gICAgICA8dGQ+WWVzPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+ZmlsZTwvdGQ+Ci0gICAgICA8dGQ+RmlsZW5hbWUgdG8gYWN0IHVwb248YnI+IElmIG5vIGZpbGUgaXMgc3BlY2lmaWVkIHRoZW4gYWN0IHVwb24gdGhlIHByb2plY3Q8L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+dXNlcm5hbWU8L3RkPgotICAgICAgPHRkPlNvdXJjZVNhZmUgdXNlcm5hbWU8L3RkPgotICAgICAgPHRkPlllczwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPnBhc3N3b3JkPC90ZD4KLSAgICAgIDx0ZD5Tb3VyY2VTYWZlIHBhc3N3b3JkPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPmxvY2FscGF0aDwvdGQ+Ci0gICAgICA8dGQ+T3ZlcnJpZGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBnZXQgdG8gdGhlIHNwZWNpZmllZCBwYXRoPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPnNvc2hvbWU8L3RkPgotICAgICAgPHRkPlRoZSBwYXRoIHRvIHRoZSBTb3VyY2VPZmZTaXRlIGhvbWUgZGlyZWN0b3J5PC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPm5vY29tcHJlc3Npb248L3RkPgotICAgICAgPHRkPnRydWUgb3IgZmFsc2UgLSBkaXNhYmxlIGNvbXByZXNzaW9uPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPnJlY3Vyc2l2ZTwvdGQ+Ci0gICAgICA8dGQ+dHJ1ZSBvciBmYWxzZSAtIE9ubHkgd29ya3Mgd2l0aCB0aGUgQ2hlY2tPdXRQcm9qZWN0IGNvbW1hbmQ8L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+bm9jYWNoZTwvdGQ+Ci0gICAgICA8dGQ+dHJ1ZSBvciBmYWxzZSAtIE9ubHkgbmVlZGVkIGlmIFNPU0hPTUUgaXMgc2V0IGFzIGFuIGVudmlyb21lbnQgdmFyaWFibGU8L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+dmVyYm9zZTwvdGQ+Ci0gICAgICA8dGQ+dHJ1ZSBvciBmYWxzZSAtIFN0YXR1cyBtZXNzYWdlcyBhcmUgZGlzcGxheWVkPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotICAgPHRkPmNvbW1lbnQ8L3RkPgotICAgICAgPHRkPkEgY29tbWVudCB0byBiZSBhcHBsaWVkIHRvIGFsbCBmaWxlcyBiZWluZyBjaGVja2VkIGluPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotIDwvdGFibGU+XV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21tZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29tbWVudCB0byBhcHBseSB0byBhbGwgZmlsZXMgYmVpbmcgbGFiZWxsZWQ7Ci0gb3B0aW9uYWwsIG9ubHkgdmFsaWQgaW4gU09TTGFiZWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgY29tbWVudCB0byBhcHBseSB0byBhbGwgZmlsZXMgYmVpbmcgbGFiZWxsZWQ7Ci0gb3B0aW9uYWwsIG9ubHkgdmFsaWQgaW4gU09TTGFiZWwKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZW5hbWUgdG8gYWN0IHVwb247IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIEZpbGVuYW1lIHRvIGFjdCB1cG9uOyBvcHRpb25hbC4KLSBJZiBubyBmaWxlIGlzIHNwZWNpZmllZCB0aGVuIHRoZSB0YXNrcyAKLSBhY3QgdXBvbiB0aGUgcHJvamVjdAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTGFiZWxlZCB2ZXJzaW9uIHRvIG9wZXJhdGUgb24gaW4gU291cmNlU2FmZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBsYWJlbGVkIHZlcnNpb24gdG8gb3BlcmF0ZSBvbiBpbiBTb3VyY2VTYWZlCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9jYWxwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW092ZXJyaWRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgZ2V0IHRvIHRoZSBzcGVjaWZpZWQgcGF0aDsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIE92ZXJyaWRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgZ2V0IHRvIHRoZSBzcGVjaWZpZWQgcGF0aDsgb3B0aW9uYWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibm9jYWNoZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRvIGRpc2FibGUgdGhlIGNhY2hlIHdoZW4gc2V0OwotIG9wdGlvbmFsIG5lZWRlZCBpZiBTT1NIT01FIGlzIHNldCBhcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgZmxhZyB0byBkaXNhYmxlIHRoZSBjYWNoZSB3aGVuIHNldDsKLSBvcHRpb25hbCBuZWVkZWQgaWYgU09TSE9NRSBpcyBzZXQgYXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibm9jb21wcmVzcyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRoYXQgZGlzYWJsZXMgY29tcHJlc3Npb24gd2hlbiBzZXQ7IG9wdGlvbmFsLCBkZWZhdWx0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBGbGFnIHRoYXQgZGlzYWJsZXMgY29tcHJlc3Npb24gd2hlbiBzZXQ7IG9wdGlvbmFsLCBkZWZhdWx0Ci0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFzc3dvcmQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2VTYWZlIHBhc3N3b3JkOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBTb3VyY2VTYWZlIHBhc3N3b3JkOyBvcHRpb25hbC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9qZWN0cGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NvdXJjZVNhZmUgcHJvamVjdCBwYXRoIHdpdGhvdXQgdGhlICIkIiBwcmVmaXg7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIFNvdXJjZVNhZmUgcHJvamVjdCBwYXRoIHdpdGhvdXQgdGhlICIkIiBwcmVmaXg7IHJlcXVpcmVkCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVjdXJzaXZlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdG8gcmVjdXJzaXZlbHkgYXBwbHkgdGhlIGFjdGlvbiAobm90IHZhbGlkCi0gb24gYWxsIFNPUyB0YXNrcyApOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgRmxhZyB0byByZWN1cnNpdmVseSBhcHBseSB0aGUgYWN0aW9uIChub3QgdmFsaWQKLSBvbiBhbGwgU09TIHRhc2tzICk7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic29zY21kIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3J5IHdoZXJlIHNvc2NtZCguZXhlKSBpcyBsb2NhdGVkOwotIG9wdGlvbmFsLCBzb3NjbWQgbXVzdCBiZSBvbiB0aGUgcGF0aCBpZiBvbWl0dGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSBzb3NjbWQoLmV4ZSkgaXMgbG9jYXRlZDsKLSBvcHRpb25hbCwgc29zY21kIG11c3QgYmUgb24gdGhlIHBhdGggaWYgb21pdHRlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb3Nob21lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHBhdGggdG8gdGhlIFNvdXJjZU9mZlNpdGUgaG9tZSBkaXJlY3RvcnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBwYXRoIHRvIHRoZSBTb3VyY2VPZmZTaXRlIGhvbWUgZGlyZWN0b3J5Ci0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic29zc2VydmVycGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHJlc3MgYW5kIHBvcnQgb2YgU291cmNlT2ZmU2l0ZSBTZXJ2ZXIsCi0gZWcuIDE5Mi4xNjguMC4xOjg4ODggOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBhZGRyZXNzIGFuZCBwb3J0IG9mIFNvdXJjZU9mZlNpdGUgU2VydmVyLAotIGVnLiAxOTIuMTY4LjAuMTo4ODg4IDsgcmVxdWlyZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlcm5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2VTYWZlIHVzZXJuYW1lOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBTb3VyY2VTYWZlIHVzZXJuYW1lOyByZXF1aXJlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJib3NlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0VuYWJsZSB2ZXJib3NlIG91dHB1dDsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEVuYWJsZSB2ZXJib3NlIG91dHB1dDsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQSB2ZXJzaW9uIG51bWJlciB0byBnZXQgLSAKLSBvbmx5IHdvcmtzIHdpdGggdGhlIFNPU0dldCBvbiBhIGZpbGU7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGEgdmVyc2lvbiBudW1iZXIgdG8gZ2V0IC0gCi0gb25seSB3b3JrcyB3aXRoIHRoZSBTT1NHZXQgb24gYSBmaWxlOyBvcHRpb25hbC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2c3NzZXJ2ZXJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGF0aCB0byB0aGUgbG9jYXRpb24gb2YgdGhlIHNzLmluaSBmaWxlOyAKLSByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBwYXRoIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3MuaW5pIGZpbGU7IAotIHJlcXVpcmVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJzb3NjaGVja291dCIgY2F0ZWdvcnk9Im90aGVyIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zb3MuU09TQ2hlY2tvdXQiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1JldHJpZXZlcyBhbmQgbG9ja3MgZmlsZXMgaW4gVmlzdWFsIFNvdXJjZVNhZmUgdmlhIGEgU291cmNlT2ZmU2l0ZSBzZXJ2ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW1JldHJpZXZlcyBhbmQgbG9ja3MgZmlsZXMgaW4gVmlzdWFsIFNvdXJjZVNhZmUgdmlhIGEgU291cmNlT2ZmU2l0ZSBzZXJ2ZXIuCi0KLSA8cD4KLSBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGludGVycHJldHRlZDoKLSA8dGFibGUgYm9yZGVyPSIxIj4KLSAgIDx0cj4KLSAgICAgPHRoPkF0dHJpYnV0ZTwvdGg+Ci0gICAgIDx0aD5WYWx1ZXM8L3RoPgotICAgICA8dGg+UmVxdWlyZWQ8L3RoPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgPHRkPnNvc2NtZGRpcjwvdGQ+Ci0gICAgIDx0ZD5EaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgc29zY21kKC5leGUpIDxicj4KLSAgICAgc29zY21kKC5leGUpIG11c3QgYmUgaW4gdGhlIHBhdGggaWYgdGhpcyBpcyBub3Qgc3BlY2lmaWVkPC90ZD4KLSAgICAgPHRkPk5vPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+dnNzc2VydmVycGF0aDwvdGQ+Ci0gICAgICA8dGQ+cGF0aCB0byB0aGUgc3Jjc2FmZS5pbmkgIC0gZWcuIFxcc2VydmVyXHZzc1xzcmNzYWZlLmluaTwvdGQ+Ci0gICAgICA8dGQ+WWVzPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+c29zc2VydmVycGF0aDwvdGQ+Ci0gICAgICA8dGQ+YWRkcmVzcyBhbmQgcG9ydCBvZiB0aGUgU09TIHNlcnZlciAgLSBlZy4gMTkyLjE2OC4wLjE6ODg4ODwvdGQ+Ci0gICAgICA8dGQ+WWVzPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+cHJvamVjdHBhdGg8L3RkPgotICAgICAgPHRkPlNvdXJjZVNhZmUgcHJvamVjdCBwYXRoIHdpdGhvdXQgdGhlICIkIjwvdGQ+Ci0gICAgICA8dGQ+WWVzPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+ZmlsZTwvdGQ+Ci0gICAgICA8dGQ+RmlsZW5hbWUgdG8gYWN0IHVwb248YnI+IElmIG5vIGZpbGUgaXMgc3BlY2lmaWVkIHRoZW4gYWN0IHVwb24gdGhlIHByb2plY3Q8L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+dXNlcm5hbWU8L3RkPgotICAgICAgPHRkPlNvdXJjZVNhZmUgdXNlcm5hbWU8L3RkPgotICAgICAgPHRkPlllczwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPnBhc3N3b3JkPC90ZD4KLSAgICAgIDx0ZD5Tb3VyY2VTYWZlIHBhc3N3b3JkPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPmxvY2FscGF0aDwvdGQ+Ci0gICAgICA8dGQ+T3ZlcnJpZGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBnZXQgdG8gdGhlIHNwZWNpZmllZCBwYXRoPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPnNvc2hvbWU8L3RkPgotICAgICAgPHRkPlRoZSBwYXRoIHRvIHRoZSBTb3VyY2VPZmZTaXRlIGhvbWUgZGlyZWN0b3J5PC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPm5vY29tcHJlc3Npb248L3RkPgotICAgICAgPHRkPnRydWUgb3IgZmFsc2UgLSBkaXNhYmxlIGNvbXByZXNzaW9uPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPnJlY3Vyc2l2ZTwvdGQ+Ci0gICAgICA8dGQ+dHJ1ZSBvciBmYWxzZSAtIE9ubHkgd29ya3Mgd2l0aCB0aGUgQ2hlY2tPdXRQcm9qZWN0IGNvbW1hbmQ8L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+bm9jYWNoZTwvdGQ+Ci0gICAgICA8dGQ+dHJ1ZSBvciBmYWxzZSAtIE9ubHkgbmVlZGVkIGlmIFNPU0hPTUUgaXMgc2V0IGFzIGFuIGVudmlyb21lbnQgdmFyaWFibGU8L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+dmVyYm9zZTwvdGQ+Ci0gICAgICA8dGQ+dHJ1ZSBvciBmYWxzZSAtIFN0YXR1cyBtZXNzYWdlcyBhcmUgZGlzcGxheWVkPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotIDwvdGFibGU+XV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21tZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ29tbWVudCB0byBhcHBseSB0byBhbGwgZmlsZXMgYmVpbmcgbGFiZWxsZWQ7Ci0gb3B0aW9uYWwsIG9ubHkgdmFsaWQgaW4gU09TTGFiZWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgY29tbWVudCB0byBhcHBseSB0byBhbGwgZmlsZXMgYmVpbmcgbGFiZWxsZWQ7Ci0gb3B0aW9uYWwsIG9ubHkgdmFsaWQgaW4gU09TTGFiZWwKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZW5hbWUgdG8gYWN0IHVwb247IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIEZpbGVuYW1lIHRvIGFjdCB1cG9uOyBvcHRpb25hbC4KLSBJZiBubyBmaWxlIGlzIHNwZWNpZmllZCB0aGVuIHRoZSB0YXNrcyAKLSBhY3QgdXBvbiB0aGUgcHJvamVjdAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTGFiZWxlZCB2ZXJzaW9uIHRvIG9wZXJhdGUgb24gaW4gU291cmNlU2FmZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBsYWJlbGVkIHZlcnNpb24gdG8gb3BlcmF0ZSBvbiBpbiBTb3VyY2VTYWZlCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9jYWxwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW092ZXJyaWRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgZ2V0IHRvIHRoZSBzcGVjaWZpZWQgcGF0aDsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIE92ZXJyaWRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgZ2V0IHRvIHRoZSBzcGVjaWZpZWQgcGF0aDsgb3B0aW9uYWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibm9jYWNoZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRvIGRpc2FibGUgdGhlIGNhY2hlIHdoZW4gc2V0OwotIG9wdGlvbmFsIG5lZWRlZCBpZiBTT1NIT01FIGlzIHNldCBhcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgZmxhZyB0byBkaXNhYmxlIHRoZSBjYWNoZSB3aGVuIHNldDsKLSBvcHRpb25hbCBuZWVkZWQgaWYgU09TSE9NRSBpcyBzZXQgYXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibm9jb21wcmVzcyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRoYXQgZGlzYWJsZXMgY29tcHJlc3Npb24gd2hlbiBzZXQ7IG9wdGlvbmFsLCBkZWZhdWx0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBGbGFnIHRoYXQgZGlzYWJsZXMgY29tcHJlc3Npb24gd2hlbiBzZXQ7IG9wdGlvbmFsLCBkZWZhdWx0Ci0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFzc3dvcmQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2VTYWZlIHBhc3N3b3JkOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBTb3VyY2VTYWZlIHBhc3N3b3JkOyBvcHRpb25hbC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9qZWN0cGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NvdXJjZVNhZmUgcHJvamVjdCBwYXRoIHdpdGhvdXQgdGhlICIkIiBwcmVmaXg7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIFNvdXJjZVNhZmUgcHJvamVjdCBwYXRoIHdpdGhvdXQgdGhlICIkIiBwcmVmaXg7IHJlcXVpcmVkCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVjdXJzaXZlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdG8gcmVjdXJzaXZlbHkgYXBwbHkgdGhlIGFjdGlvbiAobm90IHZhbGlkCi0gb24gYWxsIFNPUyB0YXNrcyApOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgRmxhZyB0byByZWN1cnNpdmVseSBhcHBseSB0aGUgYWN0aW9uIChub3QgdmFsaWQKLSBvbiBhbGwgU09TIHRhc2tzICk7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic29zY21kIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3J5IHdoZXJlIHNvc2NtZCguZXhlKSBpcyBsb2NhdGVkOwotIG9wdGlvbmFsLCBzb3NjbWQgbXVzdCBiZSBvbiB0aGUgcGF0aCBpZiBvbWl0dGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSBzb3NjbWQoLmV4ZSkgaXMgbG9jYXRlZDsKLSBvcHRpb25hbCwgc29zY21kIG11c3QgYmUgb24gdGhlIHBhdGggaWYgb21pdHRlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzb3Nob21lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHBhdGggdG8gdGhlIFNvdXJjZU9mZlNpdGUgaG9tZSBkaXJlY3RvcnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBwYXRoIHRvIHRoZSBTb3VyY2VPZmZTaXRlIGhvbWUgZGlyZWN0b3J5Ci0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic29zc2VydmVycGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHJlc3MgYW5kIHBvcnQgb2YgU291cmNlT2ZmU2l0ZSBTZXJ2ZXIsCi0gZWcuIDE5Mi4xNjguMC4xOjg4ODggOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBhZGRyZXNzIGFuZCBwb3J0IG9mIFNvdXJjZU9mZlNpdGUgU2VydmVyLAotIGVnLiAxOTIuMTY4LjAuMTo4ODg4IDsgcmVxdWlyZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlcm5hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2VTYWZlIHVzZXJuYW1lOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBTb3VyY2VTYWZlIHVzZXJuYW1lOyByZXF1aXJlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJib3NlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0VuYWJsZSB2ZXJib3NlIG91dHB1dDsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEVuYWJsZSB2ZXJib3NlIG91dHB1dDsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQSB2ZXJzaW9uIG51bWJlciB0byBnZXQgLSAKLSBvbmx5IHdvcmtzIHdpdGggdGhlIFNPU0dldCBvbiBhIGZpbGU7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGEgdmVyc2lvbiBudW1iZXIgdG8gZ2V0IC0gCi0gb25seSB3b3JrcyB3aXRoIHRoZSBTT1NHZXQgb24gYSBmaWxlOyBvcHRpb25hbC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2c3NzZXJ2ZXJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGF0aCB0byB0aGUgbG9jYXRpb24gb2YgdGhlIHNzLmluaSBmaWxlOyAKLSByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBwYXRoIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3MuaW5pIGZpbGU7IAotIHJlcXVpcmVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJzb3NnZXQiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc29zLlNPU0dldCIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUmV0cmlldmVzIGEgcmVhZC1vbmx5IGNvcHkgb2YgdGhlIHNwZWNpZmllZCBwcm9qZWN0IG9yIGZpbGUgZnJvbSBWaXN1YWwgU291cmNlU2FmZSB2aWEgYSBTb3VyY2VPZmZTaXRlIHNlcnZlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbUmV0cmlldmVzIGEgcmVhZC1vbmx5IGNvcHkgb2YgdGhlIHNwZWNpZmllZCBwcm9qZWN0IG9yIGZpbGUKLSBmcm9tIFZpc3VhbCBTb3VyY2VTYWZlIHZpYSBhIFNvdXJjZU9mZlNpdGUgc2VydmVyLgotIDxwPgotIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgaW50ZXJwcmV0dGVkOgotIDx0YWJsZSBib3JkZXI9IjEiPgotICAgIDx0Ym9keT4KLSAgICAgIDx0cj4KLSAgICAgICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgotICAgICAgICAgPHRoPlZhbHVlczwvdGg+Ci0gICAgICAgICA8dGg+UmVxdWlyZWQ8L3RoPgotICAgICAgIDwvdHI+Ci0gICAgICAgPHRyPgotICAgICAgICAgPHRkPnNvc2NtZGRpcjwvdGQ+Ci0gICAgICAgICA8dGQ+RGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHNvc2NtZCguZXhlKSA8YnI+Ci0gICAgICAgICBzb3NjbWQoLmV4ZSkgbXVzdCBiZSBpbiB0aGUgcGF0aCBpZiB0aGlzIGlzIG5vdCBzcGVjaWZpZWQ8L3RkPgotICAgICAgICAgPHRkPk5vPC90ZD4KLSAgICAgICA8L3RyPgotICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQ+dnNzc2VydmVycGF0aDwvdGQ+Ci0gICAgICAgICAgPHRkPnBhdGggdG8gdGhlIHNyY3NhZmUuaW5pICAtIGVnLiBcXHNlcnZlclx2c3Ncc3Jjc2FmZS5pbmk8L3RkPgotICAgICAgICAgIDx0ZD5ZZXM8L3RkPgotICAgICAgIDwvdHI+Ci0gICAgICAgPHRyPgotICAgICAgICAgIDx0ZD5zb3NzZXJ2ZXJwYXRoPC90ZD4KLSAgICAgICAgICA8dGQ+YWRkcmVzcyBhbmQgcG9ydCBvZiB0aGUgU09TIHNlcnZlciAgLSBlZy4gMTkyLjE2OC4wLjE6ODg4ODwvdGQ+Ci0gICAgICAgICAgPHRkPlllczwvdGQ+Ci0gICAgICAgPC90cj4KLSAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkPnByb2plY3RwYXRoPC90ZD4KLSAgICAgICAgICA8dGQ+U291cmNlU2FmZSBwcm9qZWN0IHBhdGggd2l0aG91dCB0aGUgIiQiPC90ZD4KLSAgICAgICAgICA8dGQ+WWVzPC90ZD4KLSAgICAgICA8L3RyPgotICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQ+ZmlsZTwvdGQ+Ci0gICAgICAgICAgPHRkPkZpbGVuYW1lIHRvIGFjdCB1cG9uPGJyPgotICAgICAgICAgICAgICBJZiBubyBmaWxlIGlzIHNwZWNpZmllZCB0aGVuIGFjdCB1cG9uIHRoZSBwcm9qZWN0PC90ZD4KLSAgICAgICAgICA8dGQ+Tm88L3RkPgotICAgICAgIDwvdHI+Ci0gICAgICAgPHRyPgotICAgICAgICAgIDx0ZD51c2VybmFtZTwvdGQ+Ci0gICAgICAgICAgPHRkPlNvdXJjZVNhZmUgdXNlcm5hbWU8L3RkPgotICAgICAgICAgIDx0ZD5ZZXM8L3RkPgotICAgICAgIDwvdHI+Ci0gICAgICAgPHRyPgotICAgICAgICAgIDx0ZD5wYXNzd29yZDwvdGQ+Ci0gICAgICAgICAgPHRkPlNvdXJjZVNhZmUgcGFzc3dvcmQ8L3RkPgotICAgICAgICAgIDx0ZD5ObzwvdGQ+Ci0gICAgICAgPC90cj4KLSAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkPmxvY2FscGF0aDwvdGQ+Ci0gICAgICAgICAgPHRkPk92ZXJyaWRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgZ2V0IHRvIHRoZSBzcGVjaWZpZWQgcGF0aDwvdGQ+Ci0gICAgICAgICAgPHRkPk5vPC90ZD4KLSAgICAgICA8L3RyPgotICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQ+c29zaG9tZTwvdGQ+Ci0gICAgICAgICAgPHRkPlRoZSBwYXRoIHRvIHRoZSBTb3VyY2VPZmZTaXRlIGhvbWUgZGlyZWN0b3J5PC90ZD4KLSAgICAgICAgICA8dGQ+Tm88L3RkPgotICAgICAgIDwvdHI+Ci0gICAgICAgPHRyPgotICAgICAgICAgIDx0ZD5ub2NvbXByZXNzaW9uPC90ZD4KLSAgICAgICAgICA8dGQ+dHJ1ZSBvciBmYWxzZSAtIGRpc2FibGUgY29tcHJlc3Npb248L3RkPgotICAgICAgICAgIDx0ZD5ObzwvdGQ+Ci0gICAgICAgPC90cj4KLSAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkPnJlY3Vyc2l2ZTwvdGQ+Ci0gICAgICAgICAgPHRkPnRydWUgb3IgZmFsc2UgLSBPbmx5IHdvcmtzIHdpdGggdGhlIEdldFByb2plY3QgY29tbWFuZDwvdGQ+Ci0gICAgICAgICAgPHRkPk5vPC90ZD4KLSAgICAgICA8L3RyPgotICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQ+dmVyc2lvbjwvdGQ+Ci0gICAgICAgICAgPHRkPmEgdmVyc2lvbiBudW1iZXIgdG8gZ2V0IC0gT25seSB3b3JrcyB3aXRoIHRoZSBHZXRGaWxlIGNvbW1hbmQ8L3RkPgotICAgICAgICAgIDx0ZD5ObzwvdGQ+Ci0gICAgICAgPC90cj4KLSAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkPmxhYmVsPC90ZD4KLSAgICAgICAgICA8dGQ+YSBsYWJlbCB2ZXJzaW9uIHRvIGdldCAtIE9ubHkgd29ya3Mgd2l0aCB0aGUgR2V0UHJvamVjdCBjb21tYW5kPC90ZD4KLSAgICAgICAgICA8dGQ+Tm88L3RkPgotICAgICAgIDwvdHI+Ci0gICAgICAgPHRyPgotICAgICAgICAgIDx0ZD5ub2NhY2hlPC90ZD4KLSAgICAgICAgICA8dGQ+dHJ1ZSBvciBmYWxzZSAtIE9ubHkgbmVlZGVkIGlmIFNPU0hPTUUgaXMgc2V0IGFzIGFuIGVudmlyb21lbnQgdmFyaWFibGU8L3RkPgotICAgICAgICAgIDx0ZD5ObzwvdGQ+Ci0gICAgICAgPC90cj4KLSAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkPnZlcmJvc2U8L3RkPgotICAgICAgICAgPHRkPnRydWUgb3IgZmFsc2UgLSBTdGF0dXMgbWVzc2FnZXMgYXJlIGRpc3BsYXllZDwvdGQ+Ci0gICAgICAgIDx0ZD5ObzwvdGQ+Ci0gICAgICA8L3RyPl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tbWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NvbW1lbnQgdG8gYXBwbHkgdG8gYWxsIGZpbGVzIGJlaW5nIGxhYmVsbGVkOwotIG9wdGlvbmFsLCBvbmx5IHZhbGlkIGluIFNPU0xhYmVsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGNvbW1lbnQgdG8gYXBwbHkgdG8gYWxsIGZpbGVzIGJlaW5nIGxhYmVsbGVkOwotIG9wdGlvbmFsLCBvbmx5IHZhbGlkIGluIFNPU0xhYmVsCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZpbGVuYW1lIHRvIGFjdCB1cG9uOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBGaWxlbmFtZSB0byBhY3QgdXBvbjsgb3B0aW9uYWwuCi0gSWYgbm8gZmlsZSBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgdGFza3MgCi0gYWN0IHVwb24gdGhlIHByb2plY3QKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xhYmVsZWQgdmVyc2lvbiB0byBvcGVyYXRlIG9uIGluIFNvdXJjZVNhZmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgbGFiZWxlZCB2ZXJzaW9uIHRvIG9wZXJhdGUgb24gaW4gU291cmNlU2FmZQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImxvY2FscGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPdmVycmlkZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIGdldCB0byB0aGUgc3BlY2lmaWVkIHBhdGg7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBPdmVycmlkZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIGdldCB0byB0aGUgc3BlY2lmaWVkIHBhdGg7IG9wdGlvbmFsLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im5vY2FjaGUiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmxhZyB0byBkaXNhYmxlIHRoZSBjYWNoZSB3aGVuIHNldDsKLSBvcHRpb25hbCBuZWVkZWQgaWYgU09TSE9NRSBpcyBzZXQgYXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIGZsYWcgdG8gZGlzYWJsZSB0aGUgY2FjaGUgd2hlbiBzZXQ7Ci0gb3B0aW9uYWwgbmVlZGVkIGlmIFNPU0hPTUUgaXMgc2V0IGFzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im5vY29tcHJlc3MiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmxhZyB0aGF0IGRpc2FibGVzIGNvbXByZXNzaW9uIHdoZW4gc2V0OyBvcHRpb25hbCwgZGVmYXVsdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgRmxhZyB0aGF0IGRpc2FibGVzIGNvbXByZXNzaW9uIHdoZW4gc2V0OyBvcHRpb25hbCwgZGVmYXVsdAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InBhc3N3b3JkIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU291cmNlU2FmZSBwYXNzd29yZDsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgU291cmNlU2FmZSBwYXNzd29yZDsgb3B0aW9uYWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvamVjdHBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2VTYWZlIHByb2plY3QgcGF0aCB3aXRob3V0IHRoZSAiJCIgcHJlZml4OyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBTb3VyY2VTYWZlIHByb2plY3QgcGF0aCB3aXRob3V0IHRoZSAiJCIgcHJlZml4OyByZXF1aXJlZAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InJlY3Vyc2l2ZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRvIHJlY3Vyc2l2ZWx5IGFwcGx5IHRoZSBhY3Rpb24gKG5vdCB2YWxpZAotIG9uIGFsbCBTT1MgdGFza3MgKTsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEZsYWcgdG8gcmVjdXJzaXZlbHkgYXBwbHkgdGhlIGFjdGlvbiAobm90IHZhbGlkCi0gb24gYWxsIFNPUyB0YXNrcyApOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNvc2NtZCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSBzb3NjbWQoLmV4ZSkgaXMgbG9jYXRlZDsKLSBvcHRpb25hbCwgc29zY21kIG11c3QgYmUgb24gdGhlIHBhdGggaWYgb21pdHRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBkaXJlY3Rvcnkgd2hlcmUgc29zY21kKC5leGUpIGlzIGxvY2F0ZWQ7Ci0gb3B0aW9uYWwsIHNvc2NtZCBtdXN0IGJlIG9uIHRoZSBwYXRoIGlmIG9taXR0ZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic29zaG9tZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwYXRoIHRvIHRoZSBTb3VyY2VPZmZTaXRlIGhvbWUgZGlyZWN0b3J5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgcGF0aCB0byB0aGUgU291cmNlT2ZmU2l0ZSBob21lIGRpcmVjdG9yeQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNvc3NlcnZlcnBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRyZXNzIGFuZCBwb3J0IG9mIFNvdXJjZU9mZlNpdGUgU2VydmVyLAotIGVnLiAxOTIuMTY4LjAuMTo4ODg4IDsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgYWRkcmVzcyBhbmQgcG9ydCBvZiBTb3VyY2VPZmZTaXRlIFNlcnZlciwKLSBlZy4gMTkyLjE2OC4wLjE6ODg4OCA7IHJlcXVpcmVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU291cmNlU2FmZSB1c2VybmFtZTsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgU291cmNlU2FmZSB1c2VybmFtZTsgcmVxdWlyZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyYm9zZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFbmFibGUgdmVyYm9zZSBvdXRwdXQ7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBFbmFibGUgdmVyYm9zZSBvdXRwdXQ7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0EgdmVyc2lvbiBudW1iZXIgdG8gZ2V0IC0gCi0gb25seSB3b3JrcyB3aXRoIHRoZSBTT1NHZXQgb24gYSBmaWxlOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBhIHZlcnNpb24gbnVtYmVyIHRvIGdldCAtIAotIG9ubHkgd29ya3Mgd2l0aCB0aGUgU09TR2V0IG9uIGEgZmlsZTsgb3B0aW9uYWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idnNzc2VydmVycGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BhdGggdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBzcy5pbmkgZmlsZTsgCi0gcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgcGF0aCB0byB0aGUgbG9jYXRpb24gb2YgdGhlIHNzLmluaSBmaWxlOyAKLSByZXF1aXJlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0ic29zbGFiZWwiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc29zLlNPU0xhYmVsIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtMYWJlbHMgVmlzdWFsIFNvdXJjZVNhZmUgZmlsZXMgdmlhIGEgU291cmNlT2ZmU2l0ZSBzZXJ2ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0xhYmVscyBWaXN1YWwgU291cmNlU2FmZSBmaWxlcyB2aWEgYSBTb3VyY2VPZmZTaXRlIHNlcnZlci4KLSA8cD4KLSBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGludGVycHJldGVkOgotIDx0YWJsZSBib3JkZXI9IjEiPgotICAgPHRyPgotICAgICA8dGg+QXR0cmlidXRlPC90aD4KLSAgICAgPHRoPlZhbHVlczwvdGg+Ci0gICAgIDx0aD5SZXF1aXJlZDwvdGg+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICA8dGQ+c29zY21kZGlyPC90ZD4KLSAgICAgPHRkPkRpcmVjdG9yeSB3aGljaCBjb250YWlucyBzb3NjbWQoLmV4ZSkgPGJyPgotICAgICBzb3NjbWQoLmV4ZSkgbXVzdCBiZSBpbiB0aGUgcGF0aCBpZiB0aGlzIGlzIG5vdCBzcGVjaWZpZWQ8L3RkPgotICAgICA8dGQ+Tm88L3RkPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD52c3NzZXJ2ZXJwYXRoPC90ZD4KLSAgICAgIDx0ZD5wYXRoIHRvIHRoZSBzcmNzYWZlLmluaSAgLSBlZy4gXFxzZXJ2ZXJcdnNzXHNyY3NhZmUuaW5pPC90ZD4KLSAgICAgIDx0ZD5ZZXM8L3RkPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5zb3NzZXJ2ZXJwYXRoPC90ZD4KLSAgICAgIDx0ZD5hZGRyZXNzIGFuZCBwb3J0IG9mIHRoZSBTT1Mgc2VydmVyICAtIGVnLiAxOTIuMTY4LjAuMTo4ODg4PC90ZD4KLSAgICAgIDx0ZD5ZZXM8L3RkPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5wcm9qZWN0cGF0aDwvdGQ+Ci0gICAgICA8dGQ+U291cmNlU2FmZSBwcm9qZWN0IHBhdGggd2l0aG91dCB0aGUgIiQiPC90ZD4KLSAgICAgIDx0ZD5ZZXM8L3RkPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD51c2VybmFtZTwvdGQ+Ci0gICAgICA8dGQ+U291cmNlU2FmZSB1c2VybmFtZTwvdGQ+Ci0gICAgICA8dGQ+WWVzPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+cGFzc3dvcmQ8L3RkPgotICAgICAgPHRkPlNvdXJjZVNhZmUgcGFzc3dvcmQ8L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+bGFiZWw8L3RkPgotICAgICAgPHRkPlRoZSBsYWJlbCB0byBhcHBseSB0byBhIHByb2plY3Q8L3RkPgotICAgICAgPHRkPlllczwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPmNvbW1lbnQ8L3RkPgotICAgICAgPHRkPkEgY29tbWVudCB0byBiZSBhcHBsaWVkIHRvIGFsbCBmaWxlcyBiZWluZyBsYWJlbGVkPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPnZlcmJvc2U8L3RkPgotICAgICAgPHRkPnRydWUgb3IgZmFsc2UgLSBTdGF0dXMgbWVzc2FnZXMgYXJlIGRpc3BsYXllZDwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPC90cj4KLSA8L3RhYmxlPl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tbWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NvbW1lbnQgdG8gYXBwbHkgdG8gYWxsIGZpbGVzIGJlaW5nIGxhYmVsbGVkOwotIG9wdGlvbmFsLCBvbmx5IHZhbGlkIGluIFNPU0xhYmVsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGNvbW1lbnQgdG8gYXBwbHkgdG8gYWxsIGZpbGVzIGJlaW5nIGxhYmVsbGVkOwotIG9wdGlvbmFsLCBvbmx5IHZhbGlkIGluIFNPU0xhYmVsCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZpbGVuYW1lIHRvIGFjdCB1cG9uOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBGaWxlbmFtZSB0byBhY3QgdXBvbjsgb3B0aW9uYWwuCi0gSWYgbm8gZmlsZSBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgdGFza3MgCi0gYWN0IHVwb24gdGhlIHByb2plY3QKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xhYmVsZWQgdmVyc2lvbiB0byBvcGVyYXRlIG9uIGluIFNvdXJjZVNhZmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgbGFiZWxlZCB2ZXJzaW9uIHRvIG9wZXJhdGUgb24gaW4gU291cmNlU2FmZQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImxvY2FscGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPdmVycmlkZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIGdldCB0byB0aGUgc3BlY2lmaWVkIHBhdGg7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBPdmVycmlkZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIGdldCB0byB0aGUgc3BlY2lmaWVkIHBhdGg7IG9wdGlvbmFsLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im5vY2FjaGUiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmxhZyB0byBkaXNhYmxlIHRoZSBjYWNoZSB3aGVuIHNldDsKLSBvcHRpb25hbCBuZWVkZWQgaWYgU09TSE9NRSBpcyBzZXQgYXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIGZsYWcgdG8gZGlzYWJsZSB0aGUgY2FjaGUgd2hlbiBzZXQ7Ci0gb3B0aW9uYWwgbmVlZGVkIGlmIFNPU0hPTUUgaXMgc2V0IGFzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im5vY29tcHJlc3MiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmxhZyB0aGF0IGRpc2FibGVzIGNvbXByZXNzaW9uIHdoZW4gc2V0OyBvcHRpb25hbCwgZGVmYXVsdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgRmxhZyB0aGF0IGRpc2FibGVzIGNvbXByZXNzaW9uIHdoZW4gc2V0OyBvcHRpb25hbCwgZGVmYXVsdAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InBhc3N3b3JkIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU291cmNlU2FmZSBwYXNzd29yZDsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgU291cmNlU2FmZSBwYXNzd29yZDsgb3B0aW9uYWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvamVjdHBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2VTYWZlIHByb2plY3QgcGF0aCB3aXRob3V0IHRoZSAiJCIgcHJlZml4OyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBTb3VyY2VTYWZlIHByb2plY3QgcGF0aCB3aXRob3V0IHRoZSAiJCIgcHJlZml4OyByZXF1aXJlZAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InJlY3Vyc2l2ZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRvIHJlY3Vyc2l2ZWx5IGFwcGx5IHRoZSBhY3Rpb24gKG5vdCB2YWxpZAotIG9uIGFsbCBTT1MgdGFza3MgKTsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEZsYWcgdG8gcmVjdXJzaXZlbHkgYXBwbHkgdGhlIGFjdGlvbiAobm90IHZhbGlkCi0gb24gYWxsIFNPUyB0YXNrcyApOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNvc2NtZCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSBzb3NjbWQoLmV4ZSkgaXMgbG9jYXRlZDsKLSBvcHRpb25hbCwgc29zY21kIG11c3QgYmUgb24gdGhlIHBhdGggaWYgb21pdHRlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBkaXJlY3Rvcnkgd2hlcmUgc29zY21kKC5leGUpIGlzIGxvY2F0ZWQ7Ci0gb3B0aW9uYWwsIHNvc2NtZCBtdXN0IGJlIG9uIHRoZSBwYXRoIGlmIG9taXR0ZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic29zaG9tZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBwYXRoIHRvIHRoZSBTb3VyY2VPZmZTaXRlIGhvbWUgZGlyZWN0b3J5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgcGF0aCB0byB0aGUgU291cmNlT2ZmU2l0ZSBob21lIGRpcmVjdG9yeQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNvc3NlcnZlcnBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRyZXNzIGFuZCBwb3J0IG9mIFNvdXJjZU9mZlNpdGUgU2VydmVyLAotIGVnLiAxOTIuMTY4LjAuMTo4ODg4IDsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgYWRkcmVzcyBhbmQgcG9ydCBvZiBTb3VyY2VPZmZTaXRlIFNlcnZlciwKLSBlZy4gMTkyLjE2OC4wLjE6ODg4OCA7IHJlcXVpcmVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU291cmNlU2FmZSB1c2VybmFtZTsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgU291cmNlU2FmZSB1c2VybmFtZTsgcmVxdWlyZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyYm9zZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFbmFibGUgdmVyYm9zZSBvdXRwdXQ7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBFbmFibGUgdmVyYm9zZSBvdXRwdXQ7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0EgdmVyc2lvbiBudW1iZXIgdG8gZ2V0IC0gCi0gb25seSB3b3JrcyB3aXRoIHRoZSBTT1NHZXQgb24gYSBmaWxlOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBhIHZlcnNpb24gbnVtYmVyIHRvIGdldCAtIAotIG9ubHkgd29ya3Mgd2l0aCB0aGUgU09TR2V0IG9uIGEgZmlsZTsgb3B0aW9uYWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idnNzc2VydmVycGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1BhdGggdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBzcy5pbmkgZmlsZTsgCi0gcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgcGF0aCB0byB0aGUgbG9jYXRpb24gb2YgdGhlIHNzLmluaSBmaWxlOyAKLSByZXF1aXJlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0ic291bmQiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc291bmQuU291bmRUYXNrIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQbGF5cyBhIHNvdW5kIGZpbGUgYXQgdGhlIGVuZCBvZiB0aGUgYnVpbGQsIGFjY29yZGluZyB0byB3aGV0aGVyIHRoZSBidWlsZCBmYWlsZWQgb3Igc3VjY2VlZGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtQbGF5cyBhIHNvdW5kIGZpbGUgYXQgdGhlIGVuZCBvZiB0aGUgYnVpbGQsIGFjY29yZGluZyB0byB3aGV0aGVyIHRoZSBidWlsZCBmYWlsZWQgb3Igc3VjY2VlZGVkLgotCi0gVGhlcmUgYXJlIHRocmVlIGF0dHJpYnV0ZXMgdG8gYmUgc2V0OgotCi0gPGNvZGU+c291cmNlPC9jb2RlPjogdGhlIGxvY2F0aW9uIG9mIHRoZSBhdWRpbyBmaWxlIHRvIGJlIHBsYXllZAotIDxjb2RlPmR1cmF0aW9uPC9jb2RlPjogcGxheSB0aGUgc291bmQgZmlsZSBjb250aW51b3VzbHkgdW50aWwgImR1cmF0aW9uIiBtaWxsaXNlY29uZHMgaGFzIGV4cGlyZWQKLSA8Y29kZT5sb29wczwvY29kZT46IHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHNvdW5kIGZpbGUgc2hvdWxkIGJlIHBsYXllZCB1bnRpbCBzdG9wcGVkCi0KLSBJIGhhdmUgb25seSB0ZXN0ZWQgdGhpcyB3aXRoIC5XQVYgYW5kIC5BSUZGIHNvdW5kIGZpbGUgZm9ybWF0cy4gQm90aCBzZWVtCi0gdG8gd29yayBmaW5lLgotCi0gcGxhbnMgZm9yIHRoZSBmdXR1cmU6Ci0gLSB1c2UgdGhlIG1pZGkgYXBpIHRvIGRlZmluZSBzb3VuZHMgKG9yIGRydW0gYmVhdCBldGMpIGluIHhtbCBhbmQgaGF2ZQotICAgQW50IHBsYXkgdGhlbSBiYWNrXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImZhaWwiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNvdW5kLlNvdW5kVGFzay5CdWlsZEFsZXJ0IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSBzb3VuZCB3aGVuIHRoZSBidWlsZCBmYWlscy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbYWRkIGEgc291bmQgd2hlbiB0aGUgYnVpbGQgZmFpbHNdXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0ic3VjY2VzcyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc291bmQuU291bmRUYXNrLkJ1aWxkQWxlcnQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIHNvdW5kIHdoZW4gdGhlIGJ1aWxkIHN1Y2NlZWRzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVthZGQgYSBzb3VuZCB3aGVuIHRoZSBidWlsZCBzdWNjZWVkc11dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9InNwbGFzaCIgY2F0ZWdvcnk9Im90aGVyIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zcGxhc2guU3BsYXNoVGFzayIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ3JlYXRlcyBhIHNwbGFzaCBzY3JlZW4uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0NyZWF0ZXMgYSBzcGxhc2ggc2NyZWVuLiBUaGUgc3BsYXNoIHNjcmVlbiBpcyBkaXNwbGF5ZWQKLSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBidWlsZCBhbmQgaW5jbHVkZXMgYSBoYW5keSBwcm9ncmVzcyBiYXIgYXMKLSB3ZWxsLiBVc2UgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgc291bmQgdGFzayB0byBwcm92aWRlIGludGVyZXN0Ci0gd2hpbHN0IHdhaXRpbmcgZm9yIHlvdXIgYnVpbGRzIHRvIGNvbXBsZXRlLi4uXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbWFnZXVybCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0EgVVJMIHBvaW50aW5nIHRvIGFuIGltYWdlIHRvIGRpc3BsYXk7IG9wdGlvbmFsLCBkZWZhdWx0IGFudGxvZ28uZ2lmCi0gZnJvbSB0aGUgY2xhc3NwYXRoLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBBIFVSTCBwb2ludGluZyB0byBhbiBpbWFnZSB0byBkaXNwbGF5OyBvcHRpb25hbCwgZGVmYXVsdCBhbnRsb2dvLmdpZgotIGZyb20gdGhlIGNsYXNzcGF0aC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXNzd29yZCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Byb3h5IHBhc3N3b3JkOyByZXF1aXJlZCBpZiA8dHQ+dXNlcjwvdHQ+IGlzIHNldC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgUHJveHkgcGFzc3dvcmQ7IHJlcXVpcmVkIGlmIDx0dD51c2VyPC90dD4gaXMgc2V0LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InBvcnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQcm94eSBwb3J0OyBvcHRpb25hbCwgZGVmYXVsdCA4MC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgUHJveHkgcG9ydDsgb3B0aW9uYWwsIGRlZmF1bHQgODAuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJveHkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIG9mIHByb3h5OyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgbmFtZSBvZiBwcm94eTsgb3B0aW9uYWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2hvd2R1cmF0aW9uIiB0eXBlPSJpbnQiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iaW50IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtIb3cgbG9uZyB0byBzaG93IHRoZSBzcGxhc2ggc2NyZWVuIGluIG1pbGxpc2Vjb25kcywKLSBvcHRpb25hbDsgZGVmYXVsdCA1MDAwIG1zLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBob3cgbG9uZyB0byBzaG93IHRoZSBzcGxhc2ggc2NyZWVuIGluIG1pbGxpc2Vjb25kcywKLSBvcHRpb25hbDsgZGVmYXVsdCA1MDAwIG1zLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InVzZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQcm94eSB1c2VyOyBvcHRpb25hbCwgZGVmYXVsdCA9bm9uZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgUHJveHkgdXNlcjsgb3B0aW9uYWwsIGRlZmF1bHQgPW5vbmUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9InNxbCIgY2F0ZWdvcnk9ImRhdGFiYXNlIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5TUUxFeGVjIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtFeGVjdXRlcyBhIHNlcmllcyBvZiBTUUwgc3RhdGVtZW50cyBvbiBhIGRhdGFiYXNlIHVzaW5nIEpEQkMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0V4ZWN1dGVzIGEgc2VyaWVzIG9mIFNRTCBzdGF0ZW1lbnRzIG9uIGEgZGF0YWJhc2UgdXNpbmcgSkRCQy4KLQotIDxwPlN0YXRlbWVudHMgY2FuCi0gZWl0aGVyIGJlIHJlYWQgaW4gZnJvbSBhIHRleHQgZmlsZSB1c2luZyB0aGUgPGk+c3JjPC9pPiBhdHRyaWJ1dGUgb3IgZnJvbSAKLSBiZXR3ZWVuIHRoZSBlbmNsb3NpbmcgU1FMIHRhZ3MuPC9wPgotIDxwPk11bHRpcGxlIHN0YXRlbWVudHMgY2FuIGJlIHByb3ZpZGVkLCBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucyAob3IgdGhlIAotIGRlZmluZWQgPGk+ZGVsaW1pdGVyPC9pPikuIEluZGl2aWR1YWwgbGluZXMgd2l0aGluIHRoZSBzdGF0ZW1lbnRzIGNhbiBiZSAKLSBjb21tZW50ZWQgdXNpbmcgZWl0aGVyIC0tLCAvLyBvciBSRU0gYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLjwvcD4KLSA8cD5UaGUgPGk+YXV0b2NvbW1pdDwvaT4gYXR0cmlidXRlIHNwZWNpZmllcyB3aGV0aGVyIGF1dG8tY29tbWl0IHNob3VsZCBiZSAKLSB0dXJuZWQgb24gb3Igb2ZmIHdoaWxzdCBleGVjdXRpbmcgdGhlIHN0YXRlbWVudHMuIElmIGF1dG8tY29tbWl0IGlzIHR1cm5lZCAKLSBvbiBlYWNoIHN0YXRlbWVudCB3aWxsIGJlIGV4ZWN1dGVkIGFuZCBjb21taXR0ZWQuIElmIGl0IGlzIHR1cm5lZCBvZmYgdGhlIAotIHN0YXRlbWVudHMgd2lsbCBhbGwgYmUgZXhlY3V0ZWQgYXMgb25lIHRyYW5zYWN0aW9uLjwvcD4KLSA8cD5UaGUgPGk+b25lcnJvcjwvaT4gYXR0cmlidXRlIHNwZWNpZmllcyBob3cgdG8gcHJvY2VlZCB3aGVuIGFuIGVycm9yIG9jY3VycyAKLSBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiBvbmUgb2YgdGhlIHN0YXRlbWVudHMuIAotIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOiA8Yj5jb250aW51ZTwvYj4gZXhlY3V0aW9uLCBvbmx5IHNob3cgdGhlIGVycm9yOwotIDxiPnN0b3A8L2I+IGV4ZWN1dGlvbiBhbmQgY29tbWl0IHRyYW5zYWN0aW9uOwotIGFuZCA8Yj5hYm9ydDwvYj4gZXhlY3V0aW9uIGFuZCB0cmFuc2FjdGlvbiBhbmQgZmFpbCB0YXNrLjwvcD5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImFwcGVuZCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIG91dHB1dCBzaG91bGQgYmUgYXBwZW5kZWQgdG8gb3Igb3ZlcndyaXRlCi0gYW4gZXhpc3RpbmcgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgd2hldGhlciBvdXRwdXQgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIG9yIG92ZXJ3cml0ZQotIGFuIGV4aXN0aW5nIGZpbGUuICBEZWZhdWx0cyB0byBmYWxzZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhdXRvY29tbWl0IiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0F1dG8gY29tbWl0IGZsYWcgZm9yIGRhdGFiYXNlIGNvbm5lY3Rpb247Ci0gb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEF1dG8gY29tbWl0IGZsYWcgZm9yIGRhdGFiYXNlIGNvbm5lY3Rpb247Ci0gb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2FjaGluZyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDYWNoaW5nIGxvYWRlcnMgLyBkcml2ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIENhY2hpbmcgbG9hZGVycyAvIGRyaXZlci4gVGhpcyBpcyB0byBhdm9pZAotIGdldHRpbmcgYW4gT3V0T2ZNZW1vcnlFcnJvciB3aGVuIGNhbGxpbmcgdGhpcyB0YXNrCi0gbXVsdGlwbGUgdGltZXMgaW4gYSByb3c7IGRlZmF1bHQ6IHRydWUKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3NwYXRoIGZvciBsb2FkaW5nIHRoZSBkcml2ZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIGNsYXNzcGF0aCBmb3IgbG9hZGluZyB0aGUgZHJpdmVyLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aHJlZiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlJlZmVyZW5jZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3NwYXRoIGZvciBsb2FkaW5nIHRoZSBkcml2ZXIgCi0gdXNpbmcgdGhlIGNsYXNzcGF0aCByZWZlcmVuY2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgY2xhc3NwYXRoIGZvciBsb2FkaW5nIHRoZSBkcml2ZXIgCi0gdXNpbmcgdGhlIGNsYXNzcGF0aCByZWZlcmVuY2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVsaW1pdGVyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVsaW1pdGVyIHRoYXQgc2VwYXJhdGVzIFNRTCBzdGF0ZW1lbnRzOyAKLSBvcHRpb25hbCwgZGVmYXVsdCAmcXVvdDs7JnF1b3Q7Ci0KLSA8cD5Gb3IgZXhhbXBsZSwgc2V0IHRoaXMgdG8gImdvIiBhbmQgZGVsaW1pdGVydHlwZSB0byAiUk9XIiBmb3IKLSBTeWJhc2UgQVNFIG9yIE1TIFNRTCBTZXJ2ZXIuPC9wPi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBkZWxpbWl0ZXIgdGhhdCBzZXBhcmF0ZXMgU1FMIHN0YXRlbWVudHM7IAotIG9wdGlvbmFsLCBkZWZhdWx0ICZxdW90OzsmcXVvdDsKLQotIDxwPkZvciBleGFtcGxlLCBzZXQgdGhpcyB0byAiZ28iIGFuZCBkZWxpbWl0ZXJ0eXBlIHRvICJST1ciIGZvcgotIFN5YmFzZSBBU0Ugb3IgTVMgU1FMIFNlcnZlci48L3A+Ci0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVsaW1pdGVydHlwZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuU1FMRXhlYy5EZWxpbWl0ZXJUeXBlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O25vcm1hbCZxdW90OywgJnF1b3Q7cm93JnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZWxpbWl0ZXIgdHlwZTogIm5vcm1hbCIgb3IgInJvdyIgKGRlZmF1bHQgIm5vcm1hbCIpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGRlbGltaXRlciB0eXBlOiAibm9ybWFsIiBvciAicm93IiAoZGVmYXVsdCAibm9ybWFsIikuCi0KLSA8cD5UaGUgZGVsaW1pdGVyIHR5cGUgdGFrZXMgdHdvIHZhbHVlcyAtIG5vcm1hbCBhbmQgcm93LiBOb3JtYWwKLSBtZWFucyB0aGF0IGFueSBvY2N1cmVuY2Ugb2YgdGhlIGRlbGltaXRlciB0ZXJtaW5hdGUgdGhlIFNRTAotIGNvbW1hbmQgd2hlcmVhcyB3aXRoIHJvdywgb25seSBhIGxpbmUgY29udGFpbmluZyBqdXN0IHRoZQotIGRlbGltaXRlciBpcyByZWNvZ25pemVkIGFzIHRoZSBlbmQgb2YgdGhlIGNvbW1hbmQuPC9wPgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRyaXZlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NsYXNzIG5hbWUgb2YgdGhlIEpEQkMgZHJpdmVyOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgQ2xhc3MgbmFtZSBvZiB0aGUgSkRCQyBkcml2ZXI7IHJlcXVpcmVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImVuY29kaW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmlsZSBlbmNvZGluZyB0byB1c2Ugb24gdGhlIFNRTCBmaWxlcyByZWFkIGluLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGZpbGUgZW5jb2RpbmcgdG8gdXNlIG9uIHRoZSBTUUwgZmlsZXMgcmVhZCBpbgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im9uZXJyb3IiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlNRTEV4ZWMuT25FcnJvciIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDtjb250aW51ZSZxdW90OywgJnF1b3Q7c3RvcCZxdW90OywgJnF1b3Q7YWJvcnQmcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FjdGlvbiB0byBwZXJmb3JtIHdoZW4gc3RhdGVtZW50IGZhaWxzOiBjb250aW51ZSwgc3RvcCwgb3IgYWJvcnQKLSBvcHRpb25hbDsgZGVmYXVsdCAmcXVvdDthYm9ydCZxdW90Oy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgQWN0aW9uIHRvIHBlcmZvcm0gd2hlbiBzdGF0ZW1lbnQgZmFpbHM6IGNvbnRpbnVlLCBzdG9wLCBvciBhYm9ydAotIG9wdGlvbmFsOyBkZWZhdWx0ICZxdW90O2Fib3J0JnF1b3Q7Ci0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3V0cHV0IiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbT3V0cHV0IGZpbGU7IAotIG9wdGlvbmFsLCBkZWZhdWx0cyB0byB0aGUgQW50IGxvZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBvdXRwdXQgZmlsZTsgCi0gb3B0aW9uYWwsIGRlZmF1bHRzIHRvIHRoZSBBbnQgbG9nLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InBhc3N3b3JkIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGFzc3dvcmQ7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBwYXNzd29yZDsgcmVxdWlyZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJpbnQiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUHJpbnQgcmVzdWx0IHNldHMgZnJvbSB0aGUgc3RhdGVtZW50czsKLSBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgUHJpbnQgcmVzdWx0IHNldHMgZnJvbSB0aGUgc3RhdGVtZW50czsKLSBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InJkYm1zIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRXhlY3V0ZSB0YXNrIG9ubHkgaWYgdGhlIGxvd2VyIGNhc2UgcHJvZHVjdCBuYW1lIAotIG9mIHRoZSBEQiBtYXRjaGVzIHRoaXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEV4ZWN1dGUgdGFzayBvbmx5IGlmIHRoZSBsb3dlciBjYXNlIHByb2R1Y3QgbmFtZSAKLSBvZiB0aGUgREIgbWF0Y2hlcyB0aGlzCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2hvd2hlYWRlcnMiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUHJpbnQgaGVhZGVycyBmb3IgcmVzdWx0IHNldHMgZnJvbSB0aGUgCi0gc3RhdGVtZW50czsgb3B0aW9uYWwsIGRlZmF1bHQgdHJ1ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgUHJpbnQgaGVhZGVycyBmb3IgcmVzdWx0IHNldHMgZnJvbSB0aGUgCi0gc3RhdGVtZW50czsgb3B0aW9uYWwsIGRlZmF1bHQgdHJ1ZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmMiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIG9mIHRoZSBTUUwgZmlsZSB0byBiZSBydW4uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgbmFtZSBvZiB0aGUgU1FMIGZpbGUgdG8gYmUgcnVuLgotIFJlcXVpcmVkIHVubGVzcyBzdGF0ZW1lbnRzIGFyZSBlbmNsb3NlZCBpbiB0aGUgYnVpbGRmaWxlCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXJsIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGF0YWJhc2UgY29ubmVjdGlvbiBVUkw7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIFVSTDsgcmVxdWlyZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlcmlkIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVXNlciBuYW1lIGZvciB0aGUgY29ubmVjdGlvbjsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgdXNlciBuYW1lIGZvciB0aGUgY29ubmVjdGlvbjsgcmVxdWlyZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1ZlcnNpb24gc3RyaW5nLCBleGVjdXRlIHRhc2sgb25seSBpZiAKLSByZGJtcyB2ZXJzaW9uIG1hdGNoOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgdmVyc2lvbiBzdHJpbmcsIGV4ZWN1dGUgdGFzayBvbmx5IGlmIAotIHJkYm1zIHZlcnNpb24gbWF0Y2g7IG9wdGlvbmFsLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZmlsZXMgKG5lc3RlZCBmaWxlc2V0IGF0dHJpYnV0ZSkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZmlsZXMgKG5lc3RlZCBmaWxlc2V0IGF0dHJpYnV0ZSkuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIHBhdGggdG8gdGhlIGNsYXNzcGF0aCBmb3IgbG9hZGluZyB0aGUgZHJpdmVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGQgYSBwYXRoIHRvIHRoZSBjbGFzc3BhdGggZm9yIGxvYWRpbmcgdGhlIGRyaXZlci5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0idHJhbnNhY3Rpb24iIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlNRTEV4ZWMuVHJhbnNhY3Rpb24iCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIFNRTCB0cmFuc2FjdGlvbiB0byBleGVjdXRlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGQgYSBTUUwgdHJhbnNhY3Rpb24gdG8gZXhlY3V0ZV1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICAgICAgPGJvZHkgPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IGFuIGlubGluZSBTUUwgY29tbWFuZCB0byBleGVjdXRlLiAKLSBOQjogUHJvcGVydGllcyBhcmUgbm90IGV4cGFuZGVkIGluIHRoaXMgdGV4dC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYm9keT4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9InN0eWxlYm9vayIgY2F0ZWdvcnk9Im90aGVyIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5TdHlsZUJvb2siCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0V4ZWN1dGVzIHRoZSBBcGFjaGUgU3R5bGVib29rIGRvY3VtZW50YXRpb24gZ2VuZXJhdG9yLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtFeGVjdXRlcyB0aGUgQXBhY2hlIFN0eWxlYm9vayBkb2N1bWVudGF0aW9uIGdlbmVyYXRvci4KLSBVbmxpa2UgdGhlIGNvbW1hbmRsaW5lIHZlcnNpb24gb2YgdGhpcyB0b29sLCBhbGwgdGhyZWUgYXJndW1lbnRzCi0gYXJlIHJlcXVpcmVkIHRvIHJ1biBzdHlsZWJvb2suCi0gPHA+Ci0gQmVpbmcgZXh0ZW5kZWQgZnJvbSAmbHQ7SmF2YSZndDssIGFsbCB0aGUgcGFyZW50J3MgYXR0cmlidXRlcwotIGFuZCBvcHRpb25zIGFyZSBhdmFpbGFibGUuIERvIG5vdCBzZXQgYW55IGFwYXJ0IGZyb20gdGhlIDx0dD5jbGFzc3BhdGg8L3R0PgotIGFzIHRoZXkgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIHRoZXJlIGluIGZ1dHVyZS5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImFwcGVuZCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBhcHBlbmQgb3V0cHV0IHRvIGV4aXN0aW5nIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGFwcGVuZCBvdXRwdXQgdG8gZXhpc3RpbmcgZmlsZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJib29rIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGJvb2sgeG1sIGZpbGUgdGhhdCB0aGUgZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uIHN0YXJ0cyBmcm9tOyAKLSByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGJvb2sgeG1sIGZpbGUgdGhhdCB0aGUgZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uIHN0YXJ0cyBmcm9tOyAKLSByZXF1aXJlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc25hbWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtKYXZhIGNsYXNzIHRvIGV4ZWN1dGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIEphdmEgY2xhc3MgdG8gZXhlY3V0ZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBydW5uaW5nIHRoZSBKYXZhIGNsYXNzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIHdoZW4gcnVubmluZyB0aGUgSmF2YSBjbGFzcwotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aHJlZiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlJlZmVyZW5jZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ2xhc3NwYXRoIHRvIHVzZSwgYnkgcmVmZXJlbmNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBDbGFzc3BhdGggdG8gdXNlLCBieSByZWZlcmVuY2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHdvcmtpbmcgZGlyZWN0b3J5IG9mIHRoZSBwcm9jZXNzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgdGhlIHByb2Nlc3MKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCB0aGVuIGZhaWwgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBhCi0gcmV0dXJuY29kZSBvdGhlciB0aGFuIDAuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIHRoZW4gZmFpbCBpZiB0aGUgY29tbWFuZCBleGl0cyB3aXRoIGEKLSByZXR1cm5jb2RlIG90aGVyIHRoYW4gMAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZvcmsiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgZXhlY3V0ZSBpbiBhIG5ldyBWTS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgZXhlY3V0ZSBpbiBhIG5ldyBWTS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJqdm12ZXJzaW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSlZNIHZlcnNpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIEpWTSB2ZXJzaW9uLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImphciIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBsb2NhdGlvbiBvZiB0aGUgSkFSIGZpbGUgdG8gZXhlY3V0ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGxvY2F0aW9uIG9mIHRoZSBKQVIgZmlsZSB0byBleGVjdXRlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Imp2bSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NvbW1hbmQgdXNlZCB0byBzdGFydCB0aGUgVk0gKG9ubHkgaWYgbm90IGZvcmtpbmcpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGNvbW1hbmQgdXNlZCB0byBzdGFydCB0aGUgVk0gKG9ubHkgaWYgbm90IGZvcmtpbmcpLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Imp2bWFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDb21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciB0aGUgSlZNLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZm9yIHRoZSBKVk0uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9hZGVyY29uZmlnIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQSBsb2FkZXIgY29uZmlndXJhdGlvbiB0byBzZW5kIHRvIHN0eWxlYm9vazsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEEgbG9hZGVyIGNvbmZpZ3VyYXRpb24gdG8gc2VuZCB0byBzdHlsZWJvb2s7IG9wdGlvbmFsLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im1heG1lbW9yeSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NvcnJlc3BvbmRzIHRvIC1teCBvciAtWG14IGRlcGVuZGluZyBvbiBWTSB2ZXJzaW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBDb3JyZXNwb25kcyB0byAtbXggb3IgLVhteCBkZXBlbmRpbmcgb24gVk0gdmVyc2lvbi4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuZXdlbnZpcm9ubWVudCIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCB1c2UgYSBjb21wbGV0ZWx5IG5ldyBlbnZpcm9ubWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgdXNlIGEgY29tcGxldGVseSBuZXcgZW52aXJvbm1lbnQuCi0KLSA8cD5XaWxsIGJlIGlnbm9yZWQgaWYgd2UgYXJlIG5vdCBmb3JraW5nIGEgbmV3IFZNLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im91dHB1dCIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZpbGUgdGhlIG91dHB1dCBvZiB0aGUgcHJvY2VzcyBpcyByZWRpcmVjdGVkIHRvLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBGaWxlIHRoZSBvdXRwdXQgb2YgdGhlIHByb2Nlc3MgaXMgcmVkaXJlY3RlZCB0by4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJza2luZGlyZWN0b3J5IiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSBzdHlsZWJvb2sgc2tpbjsKLSByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSBzdHlsZWJvb2sgc2tpbjsKLSByZXF1aXJlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXRkaXJlY3RvcnkiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IHdoZXJlIHRoZSBkb2N1bWVudGF0aW9uIGlzIGdlbmVyYXRlZDsKLSByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSB3aGVyZSB0aGUgZG9jdW1lbnRhdGlvbiBpcyBnZW5lcmF0ZWQ7Ci0gcmVxdWlyZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGltZW91dCIgdHlwZT0iamF2YS5sYW5nLkxvbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0ibG9uZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGltZW91dCBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIHByb2Nlc3Mgd2lsbCBiZSBraWxsZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHdoaWNoIHRoZSBwcm9jZXNzIHdpbGwgYmUga2lsbGVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0iZW52IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnZpcm9ubWVudC5WYXJpYWJsZSIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLQotIDxwPldpbGwgYmUgaWdub3JlZCBpZiB3ZSBhcmUgbm90IGZvcmtpbmcgYSBuZXcgVk0uXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9InN5c3Byb3BlcnR5IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnZpcm9ubWVudC5WYXJpYWJsZSIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHN5c3RlbSBwcm9wZXJ0eS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHN5c3RlbSBwcm9wZXJ0eS5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iYXJnIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZS5Bcmd1bWVudCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIGNvbW1hbmQtbGluZSBhcmd1bWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIGNvbW1hbmQtbGluZSBhcmd1bWVudC5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHBhdGggdG8gdGhlIGNsYXNzcGF0aC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHBhdGggdG8gdGhlIGNsYXNzcGF0aC5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0ianZtYXJnIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZS5Bcmd1bWVudCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIEpWTSBhcmd1bWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIEpWTSBhcmd1bWVudC5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJ0YXIiIGNhdGVnb3J5PSJwYWNrYWdpbmciCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlRhciIKLSAgICAgIG1hdGNoaW5nVGFzaz0idHJ1ZSI+Ci0KLSAgPCEtLSB0YXIgdGFzayAtLT4KLTxleHRlcm5hbD4KLTxkZXNjcmlwdGlvbj4KLTxwPkNyZWF0ZXMgYSB0YXIgYXJjaGl2ZS48L3A+Ci0KLTxwPlRoZSA8aT5iYXNlZGlyPC9pPiBhdHRyaWJ1dGUgaXMgdGhlIHJlZmVyZW5jZSBkaXJlY3RvcnkgZnJvbSB3aGVyZSB0byB0YXIuPC9wPgotCi08cD5UaGlzIHRhc2sgaXMgYSA8YSBocmVmPSIuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MiPmRpcmVjdG9yeSBiYXNlZCB0YXNrPC9hPgotYW5kLCBhcyBzdWNoLCBmb3JtcyBhbiBpbXBsaWNpdCA8YSBocmVmPSIuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlc2V0PC9hPi4gVGhpcwotZGVmaW5lcyB3aGljaCBmaWxlcywgcmVsYXRpdmUgdG8gdGhlIDxpPmJhc2VkaXI8L2k+LCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQotYXJjaGl2ZS4gVGhlIHRhciB0YXNrIHN1cHBvcnRzIGFsbCB0aGUgYXR0cmlidXRlcyBvZiBGaWxlc2V0IHRvIHJlZmluZSB0aGUKLXNldCBvZiBmaWxlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgaW1wbGljaXQgZmlsZXNldC48L3A+Ci0KLTxwPkluIGFkZGl0aW9uIHRvIHRoZSBpbXBsaWNpdCBmaWxlc2V0LCB0aGUgdGFyIHRhc2sgc3VwcG9ydHMgbmVzdGVkIGZpbGVzZXRzLiBUaGVzZQotZmlsZXNldHMgYXJlIGV4dGVuZGVkIHRvIGFsbG93IGNvbnRyb2wgb3ZlciB0aGUgYWNjZXNzIG1vZGUsIHVzZXJuYW1lIGFuZCBncm91cG5hbWUKLXRvIGJlIGFwcGxpZWQgdG8gdGhlIHRhciBlbnRyaWVzLiBUaGlzIGlzIHVzZWZ1bCwgZm9yIGV4YW1wbGUsIHdoZW4gcHJlcGFyaW5nIGFyY2hpdmVzIGZvcgotVW5peCBzeXN0ZW1zIHdoZXJlIHNvbWUgZmlsZXMgbmVlZCB0byBoYXZlIGV4ZWN1dGUgcGVybWlzc2lvbi48L3A+Ci0KLTxwPkVhcmx5IHZlcnNpb25zIG9mIHRhciBkaWQgbm90IHN1cHBvcnQgcGF0aCBsZW5ndGhzIGdyZWF0ZXIgdGhhbiAxMDAKLWNoYXJhY3RlcnMuIE1vZGVybiB2ZXJzaW9ucyBvZiB0YXIgZG8gc28sIGJ1dCBpbiBpbmNvbXBhdGlibGUgd2F5cy4KLVRoZSBiZWhhdmlvdXIgb2YgdGhlIHRhciB0YXNrIHdoZW4gaXQgZW5jb3VudGVycyBzdWNoIHBhdGhzIGlzCi1jb250cm9sbGVkIGJ5IHRoZSA8aT5sb25nZmlsZTwvaT4gYXR0cmlidXRlLgotSWYgdGhlIGxvbmdmaWxlIGF0dHJpYnV0ZSBpcyBzZXQgdG8gPGNvZGU+ZmFpbDwvY29kZT4sIGFueSBsb25nIHBhdGhzIHdpbGwKLWNhdXNlIHRoZSB0YXIgdGFzayB0byBmYWlsLiAgSWYgdGhlIGxvbmdmaWxlIGF0dHJpYnV0ZSBpcyBzZXQgdG8KLTxjb2RlPnRydW5jYXRlPC9jb2RlPiwgYW55IGxvbmcgcGF0aHMgd2lsbCBiZSB0cnVuY2F0ZWQgdG8gdGhlIDEwMCBjaGFyYWN0ZXIKLW1heGltdW0gbGVuZ3RoIHByaW9yIHRvIGFkZGluZyB0byB0aGUgYXJjaGl2ZS4gSWYgdGhlIHZhbHVlIG9mIHRoZSBsb25nZmlsZQotYXR0cmlidXRlIGlzIHNldCB0byA8Y29kZT5vbWl0PC9jb2RlPiB0aGVuIGZpbGVzIGNvbnRhaW5pbmcgbG9uZyBwYXRocyB3aWxsIGJlCi1vbWl0dGVkIGZyb20gdGhlIGFyY2hpdmUuICBFaXRoZXIgb3B0aW9uIGVuc3VyZXMgdGhhdCB0aGUgYXJjaGl2ZSBjYW4gYmUKLXVudGFycmVkIGJ5IGFueSBjb21wbGlhbnQgdmVyc2lvbiBvZiB0YXIuIElmIHRoZSBsb3NzIG9mIHBhdGggb3IgZmlsZQotaW5mb3JtYXRpb24gaXMgbm90IGFjY2VwdGFibGUsIGFuZCBpdCByYXJlbHkgaXMsIGxvbmdmaWxlIG1heSBiZSBzZXQgdG8gdGhlCi12YWx1ZSA8Y29kZT5nbnU8L2NvZGU+LiBUaGUgdGFyIHRhc2sgd2lsbCB0aGVuIHByb2R1Y2UgYSBHTlUgdGFyIGZpbGUgd2hpY2gKLWNhbiBoYXZlIGFyYml0cmFyeSBsZW5ndGggcGF0aHMuIE5vdGUgaG93ZXZlciwgdGhhdCB0aGUgcmVzdWx0aW5nIGFyY2hpdmUgd2lsbAotb25seSBiZSBhYmxlIHRvIGJlIHVudGFycmVkIHdpdGggR05VIHRhci4gIFRoZSBkZWZhdWx0IGZvciB0aGUgbG9uZ2ZpbGUKLWF0dHJpYnV0ZSBpcyA8Y29kZT53YXJuPC9jb2RlPiB3aGljaCBiZWhhdmVzIGp1c3QgbGlrZSB0aGUgZ251IG9wdGlvbiBleGNlcHQKLXRoYXQgaXQgcHJvZHVjZXMgYSB3YXJuaW5nIGZvciBlYWNoIGZpbGUgcGF0aCBlbmNvdW50ZXJlZCB0aGF0IGRvZXMgbm90IG1hdGNoCi10aGUgbGltaXQuPC9wPgotCi08cD5Ob3RlIHRoYXQgdGhpcyB0YXNrIGRvZXMgbm90IHBlcmZvcm0gY29tcHJlc3Npb24uIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGUKLTxhIGhyZWY9Imd6aXAuaHRtbCI+R1ppcDwvYT4gdGFzayB0byBwcmVwYXJlIGEgLnRhci5neiBwYWNrYWdlLjwvcD4KLTwvZGVzY3JpcHRpb24+Ci0KLTxzZWN0aW9uIGFuY2hvcj0iZXhhbXBsZXMiIG5hbWU9IkV4YW1wbGVzIj4KLTxwcmU+ICAmbHQ7dGFyIHRhcmZpbGU9JnF1b3Q7JHtkaXN0fS9tYW51YWwudGFyJnF1b3Q7IGJhc2VkaXI9JnF1b3Q7aHRkb2NzL21hbnVhbCZxdW90Oy8mZ3Q7Ci0gICZsdDtnemlwIHppcGZpbGU9JnF1b3Q7JHtkaXN0fS9tYW51YWwudGFyLmd6JnF1b3Q7IHNyYz0mcXVvdDske2Rpc3R9L21hbnVhbC50YXImcXVvdDsvJmd0OzwvcHJlPgotPHA+dGFycyBhbGwgZmlsZXMgaW4gdGhlIDxjb2RlPmh0ZG9jcy9tYW51YWw8L2NvZGU+IGRpcmVjdG9yeSBpbnRvIGEgZmlsZSBjYWxsZWQgPGNvZGU+bWFudWFsLnRhcjwvY29kZT4KLWluIHRoZSA8Y29kZT4ke2Rpc3R9PC9jb2RlPiAgZGlyZWN0b3J5LCB0aGVuIGFwcGxpZXMgdGhlIGd6aXAgdGFzayB0byBjb21wcmVzcwotaXQuPC9wPgotPHByZT4gICZsdDt0YXIgZGVzdGZpbGU9JnF1b3Q7JHtkaXN0fS9tYW51YWwudGFyJnF1b3Q7Ci0gICAgICAgYmFzZWRpcj0mcXVvdDtodGRvY3MvbWFudWFsJnF1b3Q7Ci0gICAgICAgZXhjbHVkZXM9JnF1b3Q7bXlkb2NzLyoqLCAqKi90b2RvLmh0bWwmcXVvdDsKLSAgLyZndDs8L3ByZT4KLTxwPnRhcnMgYWxsIGZpbGVzIGluIHRoZSA8Y29kZT5odGRvY3MvbWFudWFsPC9jb2RlPiBkaXJlY3RvcnkgaW50byBhIGZpbGUgY2FsbGVkIDxjb2RlPm1hbnVhbC50YXI8L2NvZGU+Ci1pbiB0aGUgPGNvZGU+JHtkaXN0fTwvY29kZT4gZGlyZWN0b3J5LiBGaWxlcyBpbiB0aGUgZGlyZWN0b3J5IDxjb2RlPm15ZG9jczwvY29kZT4sCi1vciBmaWxlcyB3aXRoIHRoZSBuYW1lIDxjb2RlPnRvZG8uaHRtbDwvY29kZT4gYXJlIGV4Y2x1ZGVkLjwvcD4KLQotPHByZT4KLSZsdDt0YXIgZGVzdGZpbGU9JnF1b3Q7JHtiYXNlZGlyfS9kb2NzLnRhciZxdW90OyZndDsKLSAgJmx0O3RhcmZpbGVzZXQgZGlyPSZxdW90OyR7ZGlyLnNyY30vZG9jcyZxdW90OwotICAgICAgICAgICAgICBmdWxscGF0aD0mcXVvdDsvdXNyL2RvYy9hbnQvUkVBRE1FJnF1b3Q7Ci0gICAgICAgICAgICAgIHByZXNlcnZlTGVhZGluZ1NsYXNoZXM9JnF1b3Q7dHJ1ZSZxdW90OyZndDsKLSAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90O3JlYWRtZS50eHQmcXVvdDsvJmd0OwotICAmbHQ7L3RhcmZpbGVzZXQmZ3Q7Ci0gICZsdDt0YXJmaWxlc2V0IGRpcj0mcXVvdDske2Rpci5zcmN9L2RvY3MmcXVvdDsKLSAgICAgICAgICAgICAgcHJlZml4PSZxdW90Oy91c3IvZG9jL2FudCZxdW90OwotICAgICAgICAgICAgICBwcmVzZXJ2ZUxlYWRpbmdTbGFzaGVzPSZxdW90O3RydWUmcXVvdDsmZ3Q7Ci0gICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqLmh0bWwmcXVvdDsvJmd0OwotICAmbHQ7L3RhcmZpbGVzZXQmZ3Q7Ci0mbHQ7L3RhciZndDs8L3ByZT4KLQotPHA+Ci0gIFdyaXRlcyB0aGUgZmlsZSA8Y29kZT5kb2NzL3JlYWRtZS50eHQ8L2NvZGU+IGFzCi0gIDxjb2RlPi91c3IvZG9jL2FudC9SRUFETUU8L2NvZGU+IGludG8gdGhlIGFyY2hpdmUuIEFsbAotICA8Y29kZT4qLmh0bWw8L2NvZGU+IGZpbGVzIGluIHRoZSA8Y29kZT5kb2NzPC9jb2RlPiBkaXJlY3RvcnkgYXJlCi0gIHByZWZpeGVkIGJ5IDxjb2RlPi91c3IvZG9jL2FudDwvY29kZT4sIHNvIGZvciBleGFtcGxlCi0gIDxjb2RlPmRvY3MvaW5kZXguaHRtbDwvY29kZT4gaXMgd3JpdHRlbiBhcwotICA8Y29kZT4vdXNyL2RvYy9hbnQvaW5kZXguaHRtbDwvY29kZT4gdG8gdGhlIGFyY2hpdmUuCi08L3A+Ci0KLTxwcmU+Jmx0O3RhciBsb25nZmlsZT0mcXVvdDtnbnUmcXVvdDsKLSAgICAgZGVzdGZpbGU9JnF1b3Q7JHtkaXN0LmJhc2V9LyR7ZGlzdC5uYW1lfS1zcmMudGFyJnF1b3Q7ICZndDsKLSAgJmx0O3RhcmZpbGVzZXQgZGlyPSZxdW90OyR7ZGlzdC5uYW1lfS8uLiZxdW90OyBtb2RlPSZxdW90Ozc1NSZxdW90OyB1c2VybmFtZT0mcXVvdDthbnQmcXVvdDsgZ3JvdXA9JnF1b3Q7YW50JnF1b3Q7Jmd0OwotICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7JHtkaXN0Lm5hbWV9L2Jvb3RzdHJhcC5zaCZxdW90Oy8mZ3Q7Ci0gICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDske2Rpc3QubmFtZX0vYnVpbGQuc2gmcXVvdDsvJmd0OwotICAmbHQ7L3RhcmZpbGVzZXQmZ3Q7Ci0gICZsdDt0YXJmaWxlc2V0IGRpcj0mcXVvdDske2Rpc3QubmFtZX0vLi4mcXVvdDsgdXNlcm5hbWU9JnF1b3Q7YW50JnF1b3Q7IGdyb3VwPSZxdW90O2FudCZxdW90OyZndDsKLSAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyR7ZGlzdC5uYW1lfS8qKiZxdW90Oy8mZ3Q7Ci0gICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDske2Rpc3QubmFtZX0vYm9vdHN0cmFwLnNoJnF1b3Q7LyZndDsKLSAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90OyR7ZGlzdC5uYW1lfS9idWlsZC5zaCZxdW90Oy8mZ3Q7Ci0gICZsdDsvdGFyZmlsZXNldCZndDsKLSZsdDsvdGFyJmd0OyA8L3ByZT4KLQotPHA+VGhpcyBleGFtcGxlIHNob3dzIGJ1aWxkaW5nIGEgdGFyIHdoaWNoIHVzZXMgdGhlIEdOVSBleHRlbnNpb25zIGZvciBsb25nIHBhdGhzIGFuZAotd2hlcmUgc29tZSBmaWxlcyBuZWVkIHRvIGJlIG1hcmtlZCBhcyBleGVjdXRhYmxlIChtb2RlIDc1NSkKLWFuZCB0aGUgcmVzdCBhcmUgdXNlIHRoZSBkZWZhdWx0IG1vZGUgKHJlYWQtd3JpdGUgYnkgb3duZXIpLiBUaGUgZmlyc3QKLWZpbGVzZXQgc2VsZWN0cyBqdXN0IHRoZSBleGVjdXRhYmxlIGZpbGVzLiBUaGUgc2Vjb25kIGZpbGVzZXQgbXVzdCBleGNsdWRlCi10aGUgZXhlY3V0YWJsZSBmaWxlcyBhbmQgaW5jbHVkZSBhbGwgb3RoZXJzLiA8L3A+Ci0KLTxwPjxzdHJvbmc+Tm90ZTogPC9zdHJvbmc+IFRoZSB0YXIgdGFzayBkb2VzIG5vdCBlbnN1cmUgdGhhdCBhIGZpbGUgaXMgb25seSBzZWxlY3RlZAotYnkgb25lIGZpbGVzZXQuIElmIHRoZSBzYW1lIGZpbGUgaXMgc2VsZWN0ZWQgYnkgbW9yZSB0aGFuIG9uZSBmaWxlc2V0LCBpdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQotdGFyIGZpbGUgdHdpY2UsIHdpdGggdGhlIHNhbWUgcGF0aC48L3A+Ci0KLTxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlIHBhdHRlcm5zIGluIHRoZSBpbmNsdWRlIGFuZCBleGNsdWRlCi1lbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSByZWxhdGl2ZSB0byB0aGUgY29ycmVzcG9uZGluZyBkaXIKLWF0dHJpYnV0ZSBhcyB3aXRoIGFsbCBvdGhlciBmaWxlc2V0cy4gIEluIHRoZSBleGFtcGxlIGFib3ZlLAotPGNvZGU+JHtkaXN0Lm5hbWV9PC9jb2RlPiBpcyBub3QgYW4gYWJzb2x1dGUgcGF0aCwgYnV0IGEgc2ltcGxlIG5hbWUKLW9mIGEgZGlyZWN0b3J5LCBzbyA8Y29kZT4ke2Rpc3QubmFtZX08L2NvZGU+IGlzIGEgdmFsaWQgcGF0aCByZWxhdGl2ZQotdG8gPGNvZGU+JHtkaXN0Lm5hbWV9Ly4uPC9jb2RlPi48L3A+Ci0KLTwvc2VjdGlvbj4KLTwvZXh0ZXJuYWw+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NyZWF0ZXMgYSB0YXIgYXJjaGl2ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbQ3JlYXRlcyBhIHRhciBhcmNoaXZlLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYmFzZWRpciIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoaXMgaXMgdGhlIGJhc2UgZGlyZWN0b3J5IHRvIGxvb2sgaW4gZm9yIHRoaW5ncyB0byB0YXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoaXMgaXMgdGhlIGJhc2UgZGlyZWN0b3J5IHRvIGxvb2sgaW4gZm9yIHRoaW5ncyB0byB0YXIuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tcHJlc3Npb24iIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlRhci5UYXJDb21wcmVzc2lvbk1ldGhvZCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDtub25lJnF1b3Q7LCAmcXVvdDtnemlwJnF1b3Q7LCAmcXVvdDtiemlwMiZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IGNvbXByZXNzaW9uIG1ldGhvZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IGNvbXByZXNzaW9uIG1ldGhvZC4KLSBBbGxvd2FibGUgdmFsdWVzIGFyZQotIDx1bD4KLSA8bGk+ICBub25lIC0gbm8gY29tcHJlc3Npb24KLSA8bGk+ICBnemlwIC0gR3ppcCBjb21wcmVzc2lvbgotIDxsaT4gIGJ6aXAyIC0gQnppcDIgY29tcHJlc3Npb24KLSA8L3VsPgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3RmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IGlzIHRoZSBuYW1lL2xvY2F0aW9uIG9mIHdoZXJlIHRvIGNyZWF0ZSB0aGUgdGFyIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCBpcyB0aGUgbmFtZS9sb2NhdGlvbiBvZiB3aGVyZSB0byBjcmVhdGUgdGhlIHRhciBmaWxlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImxvbmdmaWxlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5UYXIuVGFyTG9uZ0ZpbGVNb2RlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O3dhcm4mcXVvdDssICZxdW90O2ZhaWwmcXVvdDssICZxdW90O3RydW5jYXRlJnF1b3Q7LCAmcXVvdDtnbnUmcXVvdDssICZxdW90O29taXQmcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCBob3cgdG8gaGFuZGxlIGxvbmcgZmlsZXMsIHRob3NlIHdpdGggYSBwYXRoJmd0OzEwMCBjaGFycy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IGhvdyB0byBoYW5kbGUgbG9uZyBmaWxlcywgdGhvc2Ugd2l0aCBhIHBhdGgmZ3Q7MTAwIGNoYXJzLgotIE9wdGlvbmFsLCBkZWZhdWx0PXdhcm4uCi0gPHA+Ci0gQWxsb3dhYmxlIHZhbHVlcyBhcmUKLSA8dWw+Ci0gPGxpPiAgdHJ1bmNhdGUgLSBwYXRocyBhcmUgdHJ1bmNhdGVkIHRvIHRoZSBtYXhpbXVtIGxlbmd0aAotIDxsaT4gIGZhaWwgLSBwYXRocyBncmVhdGVyIHRoYW4gdGhlIG1heGltaW0gY2F1c2UgYSBidWlsZCBleGNlcHRpb24KLSA8bGk+ICB3YXJuIC0gcGF0aHMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIGNhdXNlIGEgd2FybmluZyBhbmQgR05VIGlzIHVzZWQKLSA8bGk+ICBnbnUgLSBHTlUgZXh0ZW5zaW9ucyBhcmUgdXNlZCBmb3IgYW55IHBhdGhzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bS4KLSA8bGk+ICBvbWl0IC0gcGF0aHMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIGFyZSBvbWl0dGVkIGZyb20gdGhlIGFyY2hpdmUKLSA8L3VsPgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0idGFyZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVGFyLlRhckZpbGVTZXQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIG5ldyBmaWxlc2V0IHdpdGggdGhlIG9wdGlvbiB0byBzcGVjaWZ5IHBlcm1pc3Npb25zLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGQgYSBuZXcgZmlsZXNldCB3aXRoIHRoZSBvcHRpb24gdG8gc3BlY2lmeSBwZXJtaXNzaW9uc11dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9InRhc2tkZWYiIGNhdGVnb3J5PSJpbnRlcm5hbCIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVGFza2RlZiIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHRhc2sgZGVmaW5pdGlvbiB0byB0aGUgY3VycmVudCBwcm9qZWN0LCBzdWNoIHRoYXQgdGhpcyBuZXcgdGFzayBjYW4gYmUgdXNlZCBpbiB0aGUgY3VycmVudCBwcm9qZWN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtBZGRzIGEgdGFzayBkZWZpbml0aW9uIHRvIHRoZSBjdXJyZW50IHByb2plY3QsIHN1Y2ggdGhhdCB0aGlzIG5ldyB0YXNrIGNhbiBiZQotIHVzZWQgaW4gdGhlIGN1cnJlbnQgcHJvamVjdC4gVHdvIGF0dHJpYnV0ZXMgYXJlIG5lZWRlZCwgdGhlIG5hbWUgdGhhdCBpZGVudGlmaWVzCi0gdGhpcyB0YXNrIHVuaXF1ZWx5LCBhbmQgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgY2xhc3MgKGluY2x1ZGluZyB0aGUgcGFja2FnZXMpIHRoYXQKLSBpbXBsZW1lbnRzIHRoaXMgdGFzay48L3A+Ci0gPHA+WW91IGNhbiBhbHNvIGRlZmluZSBhIGdyb3VwIG9mIHRhc2tzIGF0IG9uY2UgdXNpbmcgdGhlIGZpbGUgb3IKLSByZXNvdXJjZSBhdHRyaWJ1dGVzLiAgVGhlc2UgYXR0cmlidXRlcyBwb2ludCB0byBmaWxlcyBpbiB0aGUgZm9ybWF0IG9mCi0gSmF2YSBwcm9wZXJ0eSBmaWxlcy4gIEVhY2ggbGluZSBkZWZpbmVzIGEgc2luZ2xlIHRhc2sgaW4gdGhlCi0gZm9ybWF0OjwvcD4KLSA8cHJlPgotIHRhc2tuYW1lPWZ1bGx5LnF1YWxpZmllZC5qYXZhLmNsYXNzbmFtZQotIDwvcHJlPl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGZ1bGwgY2xhc3MgbmFtZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlZmluZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIHRoZSBmdWxsIGNsYXNzIG5hbWUgb2YgdGhlIG9iamVjdCBiZWluZyBkZWZpbmVkLgotIFJlcXVpcmVkLCB1bmxlc3MgZmlsZSBvciByZXNvdXJjZSBoYXZlCi0gYmVlbiBzcGVjaWZpZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NsYXNzcGF0aCB0byBiZSB1c2VkIHdoZW4gc2VhcmNoaW5nIGZvciBjb21wb25lbnQgYmVpbmcgZGVmaW5lZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCB3aGVuIHNlYXJjaGluZyBmb3IgY29tcG9uZW50IGJlaW5nIGRlZmluZWQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGhyZWYiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJSZWZlcmVuY2UiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1JlZmVyZW5jZSB0byBhIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiBsb2FkaW5nIHRoZSBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgcmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvYWRpbmcgdGhlIGZpbGVzLgotIFRvIGFjdHVhbGx5IHNoYXJlIHRoZSBzYW1lIGxvYWRlciwgc2V0IGxvYWRlcnJlZiBhcyB3ZWxsCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgIHRvIGxvYWQKLSBhbnQgbmFtZS9jbGFzc25hbWUgcGFpcnMgZnJvbS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgTmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSAgdG8gbG9hZAotIGFudCBuYW1lL2NsYXNzbmFtZSBwYWlycyBmcm9tLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImxvYWRlcnJlZiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlJlZmVyZW5jZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVXNlIHRoZSByZWZlcmVuY2UgdG8gbG9jYXRlIHRoZSBsb2FkZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFVzZSB0aGUgcmVmZXJlbmNlIHRvIGxvY2F0ZSB0aGUgbG9hZGVyLiBJZiB0aGUgbG9hZGVyIGlzIG5vdAotIGZvdW5kLCB0YXNrZGVmIHdpbGwgdXNlIHRoZSBzcGVjaWZpZWQgY2xhc3NwYXRoIGFuZCByZWdpc3RlciBpdAotIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotIFRoaXMgYWxsb3cgbXVsdGlwbGUgdGFza2RlZi90eXBlZGVmIHRvIHVzZSB0aGUgc2FtZSBjbGFzcyBsb2FkZXIsCi0gc28gdGhleSBjYW4gYmUgdXNlZCB0b2dldGhlci4gSXQgZWxpbWluYXRlIHRoZSBuZWVkIHRvCi0gcHV0IHRoZW0gaW4gdGhlIENMQVNTUEFUSC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTmFtZSBvZiB0aGUgcHJvcGVydHkgcmVzb3VyY2UgdG8gbG9hZAotIGFudCBuYW1lL2NsYXNzbmFtZSBwYWlycyBmcm9tLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBOYW1lIG9mIHRoZSBwcm9wZXJ0eSByZXNvdXJjZSB0byBsb2FkCi0gYW50IG5hbWUvY2xhc3NuYW1lIHBhaXJzIGZyb20uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVzb3VyY2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIG9mIHRoZSBwcm9wZXJ0eSByZXNvdXJjZSB0byBsb2FkCi0gYW50IG5hbWUvY2xhc3NuYW1lIHBhaXJzIGZyb20uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIE5hbWUgb2YgdGhlIHByb3BlcnR5IHJlc291cmNlIHRvIGxvYWQKLSBhbnQgbmFtZS9jbGFzc25hbWUgcGFpcnMgZnJvbS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NyZWF0ZSB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBzZWFyY2hpbmcgZm9yIGNvbXBvbmVudCBiZWluZyBkZWZpbmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtDcmVhdGUgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIHdoZW4gc2VhcmNoaW5nIGZvciBjb21wb25lbnQgYmVpbmcgZGVmaW5lZF1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9InRlbG5ldCIgY2F0ZWdvcnk9Im90aGVyIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5uZXQuVGVsbmV0VGFzayIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQXV0b21hdGVzIHRoZSB0ZWxuZXQgcHJvdG9jb2wuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0F1dG9tYXRlcyB0aGUgdGVsbmV0IHByb3RvY29sLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW5pdGlhbGNyIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NlbmQgYSBjYXJyaWFnZSByZXR1cm4gYWZ0ZXIgY29ubmVjdGluZzsgb3B0aW9uYWwsIGRlZmF1bHRzIHRvIGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBzZW5kIGEgY2FycmlhZ2UgcmV0dXJuIGFmdGVyIGNvbm5lY3Rpbmc7IG9wdGlvbmFsLCBkZWZhdWx0cyB0byBmYWxzZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXNzd29yZCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBsb2dpbiBwYXNzd29yZCB0byB1c2UKLSByZXF1aXJlZCBpZiA8dHQ+dXNlcmlkPC90dD4gaXMgc2V0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIHRoZSBsb2dpbiBwYXNzd29yZCB0byB1c2UKLSByZXF1aXJlZCBpZiA8dHQ+dXNlcmlkPC90dD4gaXMgc2V0LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InBvcnQiIHR5cGU9ImludCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJpbnQiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RjcCBwb3J0IHRvIGNvbm5lY3QgdG87IGRlZmF1bHQgaXMgMjMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgdGNwIHBvcnQgdG8gY29ubmVjdCB0bzsgZGVmYXVsdCBpcyAyMy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXJ2ZXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtIb3N0bmFtZSBvciBhZGRyZXNzIG9mIHRoZSByZW1vdGUgc2VydmVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGhvc3RuYW1lIG9yIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBzZXJ2ZXIuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGltZW91dCIgdHlwZT0iamF2YS5sYW5nLkludGVnZXIiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iaW50IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZWZhdWx0IHRpbWVvdXQgaW4gc2Vjb25kcyB0byB3YWl0IGZvciBhIHJlc3BvbnNlLCAKLSB6ZXJvIG1lYW5zIGZvcmV2ZXIgKHRoZSBkZWZhdWx0KS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgc2V0IGEgZGVmYXVsdCB0aW1lb3V0IGluIHNlY29uZHMgdG8gd2FpdCBmb3IgYSByZXNwb25zZSwgCi0gemVybyBtZWFucyBmb3JldmVyICh0aGUgZGVmYXVsdCkKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyaWQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbG9naW4gaWQgdG8gdXNlIG9uIHRoZSBzZXJ2ZXI7IAotIHJlcXVpcmVkIGlmIDx0dD5wYXNzd29yZDwvdHQ+IGlzIHNldC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSB0aGUgbG9naW4gaWQgdG8gdXNlIG9uIHRoZSBzZXJ2ZXI7IAotIHJlcXVpcmVkIGlmIDx0dD5wYXNzd29yZDwvdHQ+IGlzIHNldC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9InJlYWQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLm5ldC5UZWxuZXRUYXNrLlRlbG5ldFN1YlRhc2siCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Egc3RyaW5nIHRvIHdhaXQgZm9yIGZyb20gdGhlIHNlcnZlci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQSBzdHJpbmcgdG8gd2FpdCBmb3IgZnJvbSB0aGUgc2VydmVyLiAKLSAgQSBzdWJUYXNrICZsdDtyZWFkJmd0OyB0YWcgd2FzIGZvdW5kLiAgQ3JlYXRlIHRoZSBvYmplY3QsIAotICBTYXZlIGl0IGluIG91ciBsaXN0LCBhbmQgcmV0dXJuIGl0Ll1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJ3cml0ZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubmV0LlRlbG5ldFRhc2suVGVsbmV0U3ViVGFzayIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIHRleHQgdG8gc2VuZCB0byB0aGUgc2VydmVyCi0gIEEgc3ViVGFzayAmbHQ7d3JpdGUmZ3Q7IHRhZyB3YXMgZm91bmQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCB0ZXh0IHRvIHNlbmQgdG8gdGhlIHNlcnZlcgotICBBIHN1YlRhc2sgJmx0O3dyaXRlJmd0OyB0YWcgd2FzIGZvdW5kLiAgQ3JlYXRlIHRoZSBvYmplY3QsIAotICBTYXZlIGl0IGluIG91ciBsaXN0LCBhbmQgcmV0dXJuIGl0Ll1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9InRlbXBmaWxlIiBjYXRlZ29yeT0ib3RoZXIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlRlbXBGaWxlIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGlzIHRhc2sgc2V0cyBhIHByb3BlcnR5IHRvICB0aGUgbmFtZSBvZiBhIHRlbXBvcmFyeSBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtUaGlzIHRhc2sgc2V0cyBhIHByb3BlcnR5IHRvICB0aGUgbmFtZSBvZiBhIHRlbXBvcmFyeSBmaWxlLiAKLSAgVW5saWtlIHRoZSBKYXZhMS4yIG1ldGhvZCB0byBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSwgdGhpcyB0YXNrCi0gIGRvZXMgd29yayBvbiBKYXZhMS4xLiBBbHNvLCBpdCBkb2VzIG5vdCBhY3R1YWxseSBjcmVhdGUgdGhlCi0gIHRlbXBvcmFyeSBmaWxlLCBidXQgaXQgZG9lcyBndWFyYW50ZWUgdGhhdCB0aGUgZmlsZSBkaWQgbm90Ci0gIGV4aXN0IHdoZW4gdGhlIHRhc2sgd2FzIGV4ZWN1dGVkLiAKLSA8cD4gIAotIEV4YW1wbGVzCi0gPHByZT4mbHQ7dGVtcGZpbGUgcHJvcGVydHk9InRlbXAuZmlsZSIgLyZndDs8L3ByZT4KLSBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZQotIDxwcmU+Jmx0O3RlbXBmaWxlIHByb3BlcnR5PSJ0ZW1wLmZpbGUiIHN1ZmZpeD0iLnhtbCIgLyZndDs8L3ByZT4KLSBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSB3aXRoIHRoZSAueG1sIHN1ZmZpeC4KLSA8cHJlPiZsdDt0ZW1wZmlsZSBwcm9wZXJ0eT0idGVtcC5maWxlIiBkZXN0RGlyPSJidWlsZCIvJmd0OzwvcHJlPgotIGNyZWF0ZSBhIHRlbXAgZmlsZSBpbiB0aGUgYnVpbGQgc3ViZGlyXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0ZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVzdGluYXRpb24gZGlyZWN0b3J5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuIElmIG51bGwsIAotdGhlIHBhcmVudCBkaXJlY3RvcnkgaXMgdXNlZCBpbnN0ZWFkCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJlZml4IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbT3B0aW9uYWwgcHJlZml4IHN0cmluZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgb3B0aW9uYWwgcHJlZml4IHN0cmluZwotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InByb3BlcnR5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHByb3BlcnR5IHlvdSB3aXNoIHRvIGFzc2lnbiB0aGUgdGVtcG9yYXJ5IGZpbGUgdG8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBwcm9wZXJ0eSB5b3Ugd2lzaCB0byBhc3NpZ24gdGhlIHRlbXBvcmFyeSBmaWxlIHRvCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3VmZml4IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3VmZml4IHN0cmluZyBmb3IgdGhlIHRlbXAgZmlsZSAob3B0aW9uYWwpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTdWZmaXggc3RyaW5nIGZvciB0aGUgdGVtcCBmaWxlIChvcHRpb25hbCkKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0idG91Y2giIGNhdGVnb3J5PSJmaWxlc3lzdGVtIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Ub3VjaCIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVG91Y2ggYSBmaWxlIGFuZC9vciBmaWxlc2V0KHMpOyBjb3JyZXNwb25kcyB0byB0aGUgVW5peCB0b3VjaCBjb21tYW5kLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtUb3VjaCBhIGZpbGUgYW5kL29yIGZpbGVzZXQocyk7IGNvcnJlc3BvbmRzIHRvIHRoZSBVbml4IHRvdWNoIGNvbW1hbmQuCi0KLSA8cD5JZiB0aGUgZmlsZSB0byB0b3VjaCBkb2Vzbid0IGV4aXN0LCBhbiBlbXB0eSBvbmUgaXMKLSBjcmVhdGVkLiA8L3A+Ci0KLSA8cD5Ob3RlOiBTZXR0aW5nIHRoZSBtb2RpZmljYXRpb24gdGltZSBvZiBmaWxlcyBpcyBub3Qgc3VwcG9ydGVkIGluCi0gSkRLIDEuMS48L3A+XV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkYXRldGltZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBuZXcgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIGZpbGUKLSBpbiB0aGUgZm9ybWF0IE1NL0REL1lZWVkgSEg6TU0gQU0gPGk+b3I8L2k+IFBNOwotIE9wdGlvbmFsLCBkZWZhdWx0PW5vdy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgdGhlIG5ldyBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUgZmlsZQotIGluIHRoZSBmb3JtYXQgTU0vREQvWVlZWSBISDpNTSBBTSA8aT5vcjwvaT4gUE07Ci0gT3B0aW9uYWwsIGRlZmF1bHQ9bm93Ci0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NpbmdsZSBzb3VyY2UgZmlsZSB0byB0b3VjaC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyBhIHNpbmdsZSBzb3VyY2UgZmlsZSB0byB0b3VjaC4gIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0Ci0gYW4gZW1wdHkgZmlsZSB3aWxsIGJlIGNyZWF0ZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWlsbGlzIiB0eXBlPSJsb25nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImxvbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBuZXcgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIGZpbGUKLSBpbiBtaWxsaXNlY29uZHMgc2luY2UgbWlkbmlnaHQgSmFuIDEgMTk3MC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgdGhlIG5ldyBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUgZmlsZQotIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBtaWRuaWdodCBKYW4gMSAxOTcwLgotIE9wdGlvbmFsLCBkZWZhdWx0PW5vdwotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIHNldCBvZiBmaWxlcyB0byB0b3VjaC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgc2V0IG9mIGZpbGVzIHRvIHRvdWNoXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0idHJhbnNsYXRlIiBjYXRlZ29yeT0ib3RoZXIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmkxOG4uVHJhbnNsYXRlIgotICAgICAgbWF0Y2hpbmdUYXNrPSJ0cnVlIj4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVHJhbnNsYXRlcyB0ZXh0IGVtYmVkZGVkIGluIGZpbGVzIHVzaW5nIFJlc291cmNlIEJ1bmRsZSBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbVHJhbnNsYXRlcyB0ZXh0IGVtYmVkZGVkIGluIGZpbGVzIHVzaW5nIFJlc291cmNlIEJ1bmRsZSBmaWxlcy5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImJ1bmRsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgRmFtaWx5IG5hbWUgb2YgcmVzb3VyY2UgYnVuZGxlOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyBGYW1pbHkgbmFtZSBvZiByZXNvdXJjZSBidW5kbGU7IHJlcXVpcmVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImJ1bmRsZWNvdW50cnkiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIGxvY2FsZSBzcGVjaWZpYyBjb3VudHJ5IG9mIHJlc291cmNlIGJ1bmRsZTsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgbG9jYWxlIHNwZWNpZmljIGNvdW50cnkgb2YgcmVzb3VyY2UgYnVuZGxlOyBvcHRpb25hbC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJidW5kbGVlbmNvZGluZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgUmVzb3VyY2UgQnVuZGxlIGZpbGUgZW5jb2Rpbmcgc2NoZW1lOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyBSZXNvdXJjZSBCdW5kbGUgZmlsZSBlbmNvZGluZyBzY2hlbWU7IG9wdGlvbmFsLiAgRGVmYXVsdHMgdG8gc291cmNlIGZpbGUKLSBlbmNvZGluZwotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImJ1bmRsZWxhbmd1YWdlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyBsb2NhbGUgc3BlY2lmaWMgbGFuZ3VhZ2Ugb2YgcmVzb3VyY2UgYnVuZGxlOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyBsb2NhbGUgc3BlY2lmaWMgbGFuZ3VhZ2Ugb2YgcmVzb3VyY2UgYnVuZGxlOyBvcHRpb25hbC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJidW5kbGV2YXJpYW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyBsb2NhbGUgc3BlY2lmaWMgdmFyaWFudCBvZiByZXNvdXJjZSBidW5kbGU7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIGxvY2FsZSBzcGVjaWZpYyB2YXJpYW50IG9mIHJlc291cmNlIGJ1bmRsZTsgb3B0aW9uYWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdGVuY29kaW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyBkZXN0aW5hdGlvbiBmaWxlIGVuY29kaW5nIHNjaGVtZTsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgZGVzdGluYXRpb24gZmlsZSBlbmNvZGluZyBzY2hlbWU7IG9wdGlvbmFsLiAgRGVmYXVsdHMgdG8gc291cmNlIGZpbGUKLSBlbmNvZGluZwotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImVuZHRva2VuIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyBlbmRpbmcgdG9rZW4gdG8gaWRlbnRpZnkga2V5czsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgZW5kaW5nIHRva2VuIHRvIGlkZW50aWZ5IGtleXM7IHJlcXVpcmVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZvcmNlb3ZlcndyaXRlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgb3Igbm90IHRvIG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlIGlycmVzcGVjdGl2ZSBvZgotIHdoZXRoZXIgaXQgaXMgbmV3ZXIgdGhhbiB0aGUgc291cmNlIGZpbGUgYXMgd2VsbCBhcyB0aGUKLSByZXNvdXJjZSBidW5kbGUgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgV2hldGhlciBvciBub3QgdG8gb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGUgaXJyZXNwZWN0aXZlIG9mCi0gd2hldGhlciBpdCBpcyBuZXdlciB0aGFuIHRoZSBzb3VyY2UgZmlsZSBhcyB3ZWxsIGFzIHRoZQotIHJlc291cmNlIGJ1bmRsZSBmaWxlLgotIERlZmF1bHRzIHRvIGZhbHNlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNyY2VuY29kaW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyBzb3VyY2UgZmlsZSBlbmNvZGluZyBzY2hlbWU7IG9wdGlvbmFsLAotIGRlZmF1bHRzIHRvIGVuY29kaW5nIG9mIGxvY2FsIHN5c3RlbS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyBzb3VyY2UgZmlsZSBlbmNvZGluZyBzY2hlbWU7IG9wdGlvbmFsLAotIGRlZmF1bHRzIHRvIGVuY29kaW5nIG9mIGxvY2FsIHN5c3RlbS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdGFydHRva2VuIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyBzdGFydGluZyB0b2tlbiB0byBpZGVudGlmeSBrZXlzOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyBzdGFydGluZyB0b2tlbiB0byBpZGVudGlmeSBrZXlzOyByZXF1aXJlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0b2RpciIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgRGVzdGluYXRpb24gZGlyZWN0b3J5OyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyBEZXN0aW5hdGlvbiBkaXJlY3Rvcnk7IHJlcXVpcmVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZmlsZXMgdG8gdHJhbnNsYXRlIGFzIGEgbmVzdGVkIGZpbGVzZXQgZWxlbWVudC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyB0byB0cmFuc2xhdGUgYXMgYSBuZXN0ZWQgZmlsZXNldCBlbGVtZW50Ll1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9InRzdGFtcCIgY2F0ZWdvcnk9InV0aWxpdHkiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlRzdGFtcCIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyBwcm9wZXJ0aWVzIHRvIHRoZSBjdXJyZW50IHRpbWUsIG9yIG9mZnNldHMgZnJvbSB0aGUgY3VycmVudCB0aW1lLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtTZXRzIHByb3BlcnRpZXMgdG8gdGhlIGN1cnJlbnQgdGltZSwgb3Igb2Zmc2V0cyBmcm9tIHRoZSBjdXJyZW50IHRpbWUuCi0gVGhlIGRlZmF1bHQgcHJvcGVydGllcyBhcmUgVFNUQU1QLCBEU1RBTVAgYW5kIFRPREFZO11dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJlZml4IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUHJlZml4IGZvciB0aGUgcHJvcGVydGllcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IGEgcHJlZml4IGZvciB0aGUgcHJvcGVydGllcy4gSWYgdGhlIHByZWZpeCBkb2VzIG5vdCBlbmQgd2l0aCBhICIuIgotIG9uZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJmb3JtYXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlRzdGFtcC5DdXN0b21Gb3JtYXQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NyZWF0ZSBhIGN1c3RvbSBmb3JtYXQgd2l0aCB0aGUgdGhlIGN1cnJlbnQgcHJlZml4Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtjcmVhdGUgYSBjdXN0b20gZm9ybWF0IHdpdGggdGhlIHRoZSBjdXJyZW50IHByZWZpeC5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJ0eXBlZGVmIiBjYXRlZ29yeT0iaW50ZXJuYWwiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlR5cGVkZWYiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBkYXRhIHR5cGUgZGVmaW5pdGlvbiB0byB0aGUgY3VycmVudCBwcm9qZWN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtBZGRzIGEgZGF0YSB0eXBlIGRlZmluaXRpb24gdG8gdGhlIGN1cnJlbnQgcHJvamVjdC4KLSBUd28gYXR0cmlidXRlcyBhcmUKLSBuZWVkZWQsIHRoZSBuYW1lIHRoYXQgaWRlbnRpZmllcyB0aGlzIGRhdGEgdHlwZSB1bmlxdWVseSwgYW5kIHRoZSBmdWxsCi0gbmFtZSBvZiB0aGUgY2xhc3MgKGluY2x1ZGluZyB0aGUgcGFja2FnZXMpIHRoYXQgaW1wbGVtZW50cyB0aGlzCi0gdHlwZS4KLSA8cD5Zb3UgY2FuIGFsc28gZGVmaW5lIGEgZ3JvdXAgb2YgZGF0YSB0eXBlcyBhdCBvbmNlIHVzaW5nIHRoZSBmaWxlIG9yCi0gcmVzb3VyY2UgYXR0cmlidXRlcy4gIFRoZXNlIGF0dHJpYnV0ZXMgcG9pbnQgdG8gZmlsZXMgaW4gdGhlIGZvcm1hdCBvZgotIEphdmEgcHJvcGVydHkgZmlsZXMuICAgRWFjaCBsaW5lIGRlZmluZXMgYSBzaW5nbGUgZGF0YSB0eXBlIGluIHRoZQotIGZvcm1hdDo8L3A+Ci0gPHByZT4KLSB0eXBlbmFtZT1mdWxseS5xdWFsaWZpZWQuamF2YS5jbGFzc25hbWUKLSA8L3ByZT4KLSA8cD5UeXBlZGVmIHNob3VsZCBiZSB1c2VkIHRvIGFkZCB5b3VyIG93biB0eXBlcyB0byB0aGUgc3lzdGVtLiBEYXRhCi0gdHlwZXMgYXJlIHRoaW5ncyBsaWtlcGF0aHMgb3IgZmlsZXNldHMgdGhhdCBjYW4gYmUgZGVmaW5lZCBhdAotIHRoZSBwcm9qZWN0IGxldmVsIGFuZCByZWZlcmVuY2VkIHZpYSB0aGVpciBJRCBhdHRyaWJ1dGUuPC9wPgotIDxwPkN1c3RvbSBkYXRhIHR5cGVzIHVzdWFsbHkgbmVlZCBjdXN0b20gdGFza3MgdG8gcHV0IHRoZW0gdG8gZ29vZCB1c2UuPC9wPl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGZ1bGwgY2xhc3MgbmFtZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGRlZmluZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIHRoZSBmdWxsIGNsYXNzIG5hbWUgb2YgdGhlIG9iamVjdCBiZWluZyBkZWZpbmVkLgotIFJlcXVpcmVkLCB1bmxlc3MgZmlsZSBvciByZXNvdXJjZSBoYXZlCi0gYmVlbiBzcGVjaWZpZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NsYXNzcGF0aCB0byBiZSB1c2VkIHdoZW4gc2VhcmNoaW5nIGZvciBjb21wb25lbnQgYmVpbmcgZGVmaW5lZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCB3aGVuIHNlYXJjaGluZyBmb3IgY29tcG9uZW50IGJlaW5nIGRlZmluZWQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGhyZWYiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJSZWZlcmVuY2UiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1JlZmVyZW5jZSB0byBhIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiBsb2FkaW5nIHRoZSBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgcmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvYWRpbmcgdGhlIGZpbGVzLgotIFRvIGFjdHVhbGx5IHNoYXJlIHRoZSBzYW1lIGxvYWRlciwgc2V0IGxvYWRlcnJlZiBhcyB3ZWxsCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGUgIHRvIGxvYWQKLSBhbnQgbmFtZS9jbGFzc25hbWUgcGFpcnMgZnJvbS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgTmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSAgdG8gbG9hZAotIGFudCBuYW1lL2NsYXNzbmFtZSBwYWlycyBmcm9tLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImxvYWRlcnJlZiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlJlZmVyZW5jZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVXNlIHRoZSByZWZlcmVuY2UgdG8gbG9jYXRlIHRoZSBsb2FkZXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFVzZSB0aGUgcmVmZXJlbmNlIHRvIGxvY2F0ZSB0aGUgbG9hZGVyLiBJZiB0aGUgbG9hZGVyIGlzIG5vdAotIGZvdW5kLCB0YXNrZGVmIHdpbGwgdXNlIHRoZSBzcGVjaWZpZWQgY2xhc3NwYXRoIGFuZCByZWdpc3RlciBpdAotIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotIFRoaXMgYWxsb3cgbXVsdGlwbGUgdGFza2RlZi90eXBlZGVmIHRvIHVzZSB0aGUgc2FtZSBjbGFzcyBsb2FkZXIsCi0gc28gdGhleSBjYW4gYmUgdXNlZCB0b2dldGhlci4gSXQgZWxpbWluYXRlIHRoZSBuZWVkIHRvCi0gcHV0IHRoZW0gaW4gdGhlIENMQVNTUEFUSC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTmFtZSBvZiB0aGUgcHJvcGVydHkgcmVzb3VyY2UgdG8gbG9hZAotIGFudCBuYW1lL2NsYXNzbmFtZSBwYWlycyBmcm9tLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBOYW1lIG9mIHRoZSBwcm9wZXJ0eSByZXNvdXJjZSB0byBsb2FkCi0gYW50IG5hbWUvY2xhc3NuYW1lIHBhaXJzIGZyb20uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVzb3VyY2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIG9mIHRoZSBwcm9wZXJ0eSByZXNvdXJjZSB0byBsb2FkCi0gYW50IG5hbWUvY2xhc3NuYW1lIHBhaXJzIGZyb20uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIE5hbWUgb2YgdGhlIHByb3BlcnR5IHJlc291cmNlIHRvIGxvYWQKLSBhbnQgbmFtZS9jbGFzc25hbWUgcGFpcnMgZnJvbS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NyZWF0ZSB0aGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgd2hlbiBzZWFyY2hpbmcgZm9yIGNvbXBvbmVudCBiZWluZyBkZWZpbmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtDcmVhdGUgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIHdoZW4gc2VhcmNoaW5nIGZvciBjb21wb25lbnQgYmVpbmcgZGVmaW5lZF1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9InVudGFyIiBjYXRlZ29yeT0icGFja2FnaW5nIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5VbnRhciIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVW50YXIgYSBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtVbnRhciBhIGZpbGUuCi0gPHA+Rm9yIEpESyAxLjEgJnF1b3Q7bGFzdCBtb2RpZmllZCB0aW1lJnF1b3Q7IGZpZWxkIGlzIHNldCB0byBjdXJyZW50IHRpbWUgaW5zdGVhZCBvZiBiZWluZwotIGNhcnJpZWQgZnJvbSB0aGUgYXJjaGl2ZSBmaWxlLjwvcD4KLSA8cD5QYXR0ZXJuU2V0cyBhcmUgdXNlZCB0byBzZWxlY3QgZmlsZXMgdG8gZXh0cmFjdAotIDxJPmZyb208L0k+IHRoZSBhcmNoaXZlLiAgSWYgbm8gcGF0dGVybnNldCBpcyB1c2VkLCBhbGwgZmlsZXMgYXJlIGV4dHJhY3RlZC4KLSA8L3A+Ci0gPHA+RmlsZVNldD5zIG1heSBiZSB1c2VkIHVzZWQgdG8gc2VsZWN0IGFyY2hpdmVkIGZpbGVzCi0gdG8gcGVyZm9ybSB1bmFyY2hpdmFsIHVwb24uCi0gPC9wPgotIDxwPkZpbGUgcGVybWlzc2lvbnMgd2lsbCBub3QgYmUgcmVzdG9yZWQgb24gZXh0cmFjdGVkIGZpbGVzLjwvcD4KLSA8cD5UaGUgdW50YXIgdGFzayByZWNvZ25pemVzIHRoZSBsb25nIHBhdGhuYW1lIGVudHJpZXMgdXNlZCBieSBHTlUgdGFyLjxwPl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tcHJlc3Npb24iIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlVudGFyLlVudGFyQ29tcHJlc3Npb25NZXRob2QiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7bm9uZSZxdW90OywgJnF1b3Q7Z3ppcCZxdW90OywgJnF1b3Q7YnppcDImcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCBkZWNvbXByZXNzaW9uIGFsZ29yaXRobSB0byB1c2U7IGRlZmF1bHQ9bm9uZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IGRlY29tcHJlc3Npb24gYWxnb3JpdGhtIHRvIHVzZTsgZGVmYXVsdD1ub25lLgotCi0gQWxsb3dhYmxlIHZhbHVlcyBhcmUKLSA8dWw+Ci0gICA8bGk+bm9uZSAtIG5vIGNvbXByZXNzaW9uCi0gICA8bGk+Z3ppcCAtIEd6aXAgY29tcHJlc3Npb24KLSAgIDxsaT5iemlwMiAtIEJ6aXAyIGNvbXByZXNzaW9uCi0gPC91bD4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0IiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVzdGluYXRpb24gZGlyZWN0b3J5Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4gRmlsZSB3aWxsIGJlIHVuemlwcGVkIGludG8gdGhlCi0gZGVzdGluYXRpb24gZGlyZWN0b3J5LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im92ZXJ3cml0ZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTaG91bGQgd2Ugb3ZlcndyaXRlIGZpbGVzIGluIGRlc3QsIGV2ZW4gaWYgdGhleSBhcmUgbmV3ZXIgdGhhbgotIHRoZSBjb3JyZXNwb25kaW5nIGVudHJpZXMgaW4gdGhlIGFyY2hpdmU/Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTaG91bGQgd2Ugb3ZlcndyaXRlIGZpbGVzIGluIGRlc3QsIGV2ZW4gaWYgdGhleSBhcmUgbmV3ZXIgdGhhbgotIHRoZSBjb3JyZXNwb25kaW5nIGVudHJpZXMgaW4gdGhlIGFyY2hpdmU/Ci0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGF0aCB0byB6aXAtZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBwYXRoIHRvIHppcC1maWxlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIGZpbGVzZXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCBhIGZpbGVzZXRdXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0icGF0dGVybnNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0dGVyblNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0dGVybnNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIHBhdHRlcm5zZXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCBhIHBhdHRlcm5zZXRdXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJ1bnppcCIgY2F0ZWdvcnk9InBhY2thZ2luZyIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhwYW5kIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtVbnppcCBhIGZpbGUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW1VuemlwIGEgZmlsZS5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3QiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZXN0aW5hdGlvbiBkaXJlY3RvcnkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LiBGaWxlIHdpbGwgYmUgdW56aXBwZWQgaW50byB0aGUKLSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ib3ZlcndyaXRlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1Nob3VsZCB3ZSBvdmVyd3JpdGUgZmlsZXMgaW4gZGVzdCwgZXZlbiBpZiB0aGV5IGFyZSBuZXdlciB0aGFuCi0gdGhlIGNvcnJlc3BvbmRpbmcgZW50cmllcyBpbiB0aGUgYXJjaGl2ZT8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNob3VsZCB3ZSBvdmVyd3JpdGUgZmlsZXMgaW4gZGVzdCwgZXZlbiBpZiB0aGV5IGFyZSBuZXdlciB0aGFuCi0gdGhlIGNvcnJlc3BvbmRpbmcgZW50cmllcyBpbiB0aGUgYXJjaGl2ZT8KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzcmMiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQYXRoIHRvIHppcC1maWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIHBhdGggdG8gemlwLWZpbGUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgZmlsZXNldC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgZmlsZXNldF1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJwYXR0ZXJuc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXR0ZXJuU2V0IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXR0ZXJuc2V0IgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgcGF0dGVybnNldC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgcGF0dGVybnNldF1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9InVwdG9kYXRlIiBjYXRlZ29yeT0iY29udHJvbCIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVXBUb0RhdGUiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgdGhlIGdpdmVuIHByb3BlcnR5IGlmIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGhhcyBhIHRpbWVzdGFtcCBncmVhdGVyIHRoYW4gYWxsIG9mIHRoZSBzb3VyY2UgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW1NldHMgdGhlIGdpdmVuIHByb3BlcnR5IGlmIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGhhcyBhIHRpbWVzdGFtcAotIGdyZWF0ZXIgdGhhbiBhbGwgb2YgdGhlIHNvdXJjZSBmaWxlcy5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InByb3BlcnR5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHByb3BlcnR5IHRvIHNldCBpZiB0aGUgdGFyZ2V0IGZpbGUgaXMgbW9yZSB1cC10by1kYXRlIHRoYW4KLSAoZWFjaCBvZikgdGhlIHNvdXJjZSBmaWxlKHMpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgcHJvcGVydHkgdG8gc2V0IGlmIHRoZSB0YXJnZXQgZmlsZSBpcyBtb3JlIHVwLXRvLWRhdGUgdGhhbgotIChlYWNoIG9mKSB0aGUgc291cmNlIGZpbGUocykuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBmaWxlIHRoYXQgbXVzdCBiZSBvbGRlciB0aGFuIHRoZSB0YXJnZXQgZmlsZQotIGlmIHRoZSBwcm9wZXJ0eSBpcyB0byBiZSBzZXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBmaWxlIHRoYXQgbXVzdCBiZSBvbGRlciB0aGFuIHRoZSB0YXJnZXQgZmlsZQotIGlmIHRoZSBwcm9wZXJ0eSBpcyB0byBiZSBzZXQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0ZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBmaWxlIHdoaWNoIG11c3QgYmUgbW9yZSB1cC10by1kYXRlIHRoYW4gKGVhY2ggb2YpIHRoZSBzb3VyY2UgZmlsZShzKQotIGlmIHRoZSBwcm9wZXJ0eSBpcyB0byBiZSBzZXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBmaWxlIHdoaWNoIG11c3QgYmUgbW9yZSB1cC10by1kYXRlIHRoYW4gKGVhY2ggb2YpIHRoZSBzb3VyY2UgZmlsZShzKQotIGlmIHRoZSBwcm9wZXJ0eSBpcyB0byBiZSBzZXQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgdmFsdWUgdG8gc2V0IHRoZSBuYW1lZCBwcm9wZXJ0eSB0byBpZiB0aGUgdGFyZ2V0IGZpbGUgaXMgbW9yZQotIHVwLXRvLWRhdGUgdGhhbiAoZWFjaCBvZikgdGhlIHNvdXJjZSBmaWxlKHMpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgdmFsdWUgdG8gc2V0IHRoZSBuYW1lZCBwcm9wZXJ0eSB0byBpZiB0aGUgdGFyZ2V0IGZpbGUgaXMgbW9yZQotIHVwLXRvLWRhdGUgdGhhbiAoZWFjaCBvZikgdGhlIHNvdXJjZSBmaWxlKHMpLiBEZWZhdWx0cyB0byAndHJ1ZScuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJzcmNmaWxlcyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05lc3RlZCAmbHQ7c3JjZmlsZXMmZ3Q7IGVsZW1lbnQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW05lc3RlZCAmbHQ7c3JjZmlsZXMmZ3Q7IGVsZW1lbnQuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9Im1hcHBlciIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuTWFwcGVyIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJNYXBwZXIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEZWZpbmVzIHRoZSBGaWxlTmFtZU1hcHBlciB0byB1c2UgKG5lc3RlZCBtYXBwZXIgZWxlbWVudCkuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0RlZmluZXMgdGhlIEZpbGVOYW1lTWFwcGVyIHRvIHVzZSAobmVzdGVkIG1hcHBlciBlbGVtZW50KS5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJ2YWpleHBvcnQiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaWRlLlZBSkV4cG9ydCIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRXhwb3J0IHBhY2thZ2VzIGZyb20gdGhlIFZpc3VhbCBBZ2UgZm9yIEphdmEgd29ya3NwYWNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtFeHBvcnQgcGFja2FnZXMgZnJvbSB0aGUgVmlzdWFsIEFnZSBmb3IgSmF2YSB3b3Jrc3BhY2UuCi0gVGhlIHBhY2thZ2VzIGFyZSBzcGVjaWZpZWQgc2ltaWxhciB0byBhbGwgb3RoZXIgTWF0Y2hpbmdUYXNrcy4KLSBTaW5jZSB0aGUgVkEgV29ya3NwYWNlIGlzIG5vdCBmaWxlIGJhc2VkLCB0aGlzIHRhc2sgaXMgc2ltdWxhdGluZwotIGEgZGlyZWN0b3J5IGhpZXJhcmNoeSBmb3IgdGhlIHdvcmtzcGFjZToKLSBUaGUgJ3Jvb3QnIGNvbnRhaW5zIGFsbCBwcm9qZWN0ICdkaXIncywgYW5kIHRoZSBwcm9qZWN0cyBjb250YWluCi0gdGhlaXIgcmVzcGVjdGl2ZSBwYWNrYWdlICdkaXIncy4KLSBFeGFtcGxlOgotIDxibG9ja3F1b3RlPgotICZsdDt2YWpleHBvcnQgZGVzdGRpcj0iQzovYnVpbGRkaXIvc291cmNlIj4KLSAmbmJzcDsmbHQ7aW5jbHVkZSBuYW1lPSIvTXlWQVByb2plY3Qvb3JnL2Zvby9zdWJzeXN0ZW0xLyoqIiAvPgotICZuYnNwOyZsdDtleGNsdWRlIG5hbWU9Ii9NeVZBUHJvamVjdC9vcmcvZm9vL3N1YnN5c3RlbTEvdGVzdC8qKiIvPgotICZsdDsvdmFqZXhwb3J0PgotIDwvYmxvY2txdW90ZT4KLSBleHBvcnRzIGFsbCBwYWNrYWdlcyBpbiB0aGUgcHJvamVjdCBNeVZBUHJvamVjdCB3aGljaCBzdGFydCB3aXRoCi0gJ29yZy5mb28uc3Vic3lzdGVtMScgZXhjZXB0IG9mIHRoZXNlIHN0YXJ0aW5nIHdpdGgKLSAnb3JnLmZvby5zdWJzeXN0ZW0xLnRlc3QnLgotCi0gVGhlcmUgYXJlIGZsYWdzIHRvIGNob29zZSB3aGljaCBpdGVtcyB0byBleHBvcnQ6Ci0gZXhwb3J0U291cmNlczogICBleHBvcnQgSmF2YSBzb3VyY2VzCi0gZXhwb3J0UmVzb3VyY2VzOiBleHBvcnQgcHJvamVjdCByZXNvdXJjZXMKLSBleHBvcnRDbGFzc2VzOiAgIGV4cG9ydCBjbGFzcyBmaWxlcwotIGV4cG9ydERlYnVnSW5mbzogZXhwb3J0IGNsYXNzIGZpbGVzIHdpdGggZGVidWcgaW5mbyAodXNlIHdpdGggZXhwb3J0Q2xhc3NlcykKLSBkZWZhdWx0IGlzIGV4cG9ydGluZyBKYXZhIGZpbGVzIGFuZCByZXNvdXJjZXMuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0ZXhjbHVkZXMiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVzaW9ucyBzaG91bGQgYmUgdXNlZCBvciBub3Q7IGRlZmF1bHQgdHJ1ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVzaW9ucyBzaG91bGQgYmUgdXNlZCBvciBub3Q7IGRlZmF1bHQgdHJ1ZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0ZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVzdGluYXRpb24gZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIHNlbGVjdGVkCi0gaXRlbXMgc2hvdWxkIGJlIGV4cG9ydGVkOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgc2VsZWN0ZWQKLSBpdGVtcyBzaG91bGQgYmUgZXhwb3J0ZWQ7IHJlcXVpcmVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IG9mIGV4Y2x1ZGUgcGF0dGVybnMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIHNldCBvZiBleGNsdWRlIHBhdHRlcm5zLiBQYXR0ZXJucyBtYXkgYmUgc2VwYXJhdGVkIGJ5IGEgY29tbWEKLSBvciBhIHNwYWNlLiBDdXJyZW50bHkgb25seSBwYXR0ZXJucyBkZW5vdGluZyBwYWNrYWdlcyBhcmUKLSBzdXBwb3J0ZWQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJleHBvcnRjbGFzc2VzIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW09wdGlvbmFsIGZsYWcgdG8gZXhwb3J0IHRoZSBjbGFzcyBmaWxlczsgZGVmYXVsdCBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgb3B0aW9uYWwgZmxhZyB0byBleHBvcnQgdGhlIGNsYXNzIGZpbGVzOyBkZWZhdWx0IGZhbHNlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImV4cG9ydGRlYnVnaW5mbyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPcHRpb25hbCBmbGFnIHRvIGV4cG9ydCB0aGUgZGVidWcgaW5mbzsgZGVmYXVsdCBmYWxzZS4KLSBkZWJ1ZyBpbmZvLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBvcHRpb25hbCBmbGFnIHRvIGV4cG9ydCB0aGUgZGVidWcgaW5mbzsgZGVmYXVsdCBmYWxzZS4KLSBkZWJ1ZyBpbmZvCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXhwb3J0cmVzb3VyY2VzIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW09wdGlvbmFsIGZsYWcgdG8gZXhwb3J0IHRoZSByZXNvdXJjZSBmaWxlOyBkZWZhdWx0IHRydWUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIG9wdGlvbmFsIGZsYWcgdG8gZXhwb3J0IHRoZSByZXNvdXJjZSBmaWxlOyBkZWZhdWx0IHRydWUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXhwb3J0c291cmNlcyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPcHRpb25hbCBmbGFnIHRvIGV4cG9ydCB0aGUgSmF2YSBmaWxlczsgZGVmYXVsdCB0cnVlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBvcHRpb25hbCBmbGFnIHRvIGV4cG9ydCB0aGUgSmF2YSBmaWxlczsgZGVmYXVsdCB0cnVlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImluY2x1ZGVzIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IG9mIGluY2x1ZGUgcGF0dGVybnMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIHNldCBvZiBpbmNsdWRlIHBhdHRlcm5zLiBQYXR0ZXJucyBtYXkgYmUgc2VwYXJhdGVkIGJ5IGEgY29tbWEKLSBvciBhIHNwYWNlLiBDdXJyZW50bHkgb25seSBwYXR0ZXJucyBkZW5vdGluZyBwYWNrYWdlcyBhcmUKLSBzdXBwb3J0ZWQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdmVyd3JpdGUiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgT3ZlcndyaXRlIGlzIHNldCwgZmlsZXMgd2lsbCBiZSBvdmVyd3JpdHRlbiBkdXJpbmcgZXhwb3J0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBpZiBPdmVyd3JpdGUgaXMgc2V0LCBmaWxlcyB3aWxsIGJlIG92ZXJ3cml0dGVuIGR1cmluZyBleHBvcnQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZW1vdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIGFuZCBwb3J0IG9mIGEgcmVtb3RlIHRvb2wgc2VydmVyLCBvcHRpb25hLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBOYW1lIGFuZCBwb3J0IG9mIGEgcmVtb3RlIHRvb2wgc2VydmVyLCBvcHRpb25hLgotIEZvcm1hdDogJmx0O3NlcnZlcm5hbWUmZ3Q7OiZsdDtwb3J0IG5vJmd0Oy4KLSBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQsIHRoZSB0YXNrcyB3aWxsIGJlIGV4ZWN1dGVkIG9uIHRoZSBzcGVjaWZpZWQgdG9vbAotIHNlcnZlci4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImV4Y2x1ZGUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdHRlcm5TZXQuTmFtZUVudHJ5IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBleGNsdWRlIGxpc3QuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW2FkZCBhIG5hbWUgZW50cnkgb24gdGhlIGV4Y2x1ZGUgbGlzdF1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJpbmNsdWRlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXR0ZXJuU2V0Lk5hbWVFbnRyeSIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgaW5jbHVkZSBsaXN0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVthZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBpbmNsdWRlIGxpc3RdXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJ2YWppbXBvcnQiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaWRlLlZBSkltcG9ydCIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSW1wb3J0IHNvdXJjZSwgY2xhc3MgZmlsZXMsIGFuZCByZXNvdXJjZXMgdG8gdGhlIFZpc3VhbCBBZ2UgZm9yIEphdmEgd29ya3NwYWNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtJbXBvcnQgc291cmNlLCBjbGFzcyBmaWxlcywgYW5kIHJlc291cmNlcyB0byB0aGUgVmlzdWFsIEFnZSBmb3IgSmF2YQotIHdvcmtzcGFjZS4KLSA8cD4KLSBFeGFtcGxlOgotIDxwcmU+Ci0gJmx0O3ZhamltcG9ydCBwcm9qZWN0PSJNeVZBUHJvamVjdCImZ3Q7Ci0gICAmbHQ7ZmlsZXNldCBkaXI9InNyYyImZ3Q7Ci0gICAgICZsdDtpbmNsdWRlIG5hbWU9Im9yZy9mb28vc3Vic3lzdGVtMS8qKiIgLyZndDsKLSAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0iL29yZy9mb28vc3Vic3lzdGVtMS90ZXN0LyoqIiAvJmd0OwotICAmbHQ7L2ZpbGVzZXQmZ3Q7Ci0gJmx0Oy92YWpleHBvcnQmZ3Q7Ci0gPC9wcmU+Ci0gaW1wb3J0IGFsbCBzb3VyY2UgYW5kIHJlc291cmNlIGZpbGVzIGZyb20gdGhlICJzcmMiIGRpcmVjdG9yeQotIHdoaWNoIHN0YXJ0IHdpdGggJ29yZy5mb28uc3Vic3lzdGVtMScsIGV4Y2VwdCBvZiB0aGVzZSBzdGFydGluZyB3aXRoCi0gJ29yZy5mb28uc3Vic3lzdGVtMS50ZXN0JyBpbnRvIHRoZSBwcm9qZWN0IE15VkFQcm9qZWN0LgotIDwvcD4KLSA8cD5JZiBNeVZBUHJvamVjdCBpc24ndCBsb2FkZWQgaW50byB0aGUgV29ya3NwYWNlLCBhIG5ldyBlZGl0aW9uIGlzCi0gY3JlYXRlZCBpbiB0aGUgcmVwb3NpdG9yeSBhbmQgYXV0b21hdGljYWxseSBsb2FkZWQgaW50byB0aGUgV29ya3NwYWNlLgotIFRoZXJlIGhhcyB0byBiZSBhdCBsZWFzdCBvbmUgbmVzdGVkIEZpbGVTZXQgZWxlbWVudC4KLSA8L3A+Ci0gPHA+VGhlcmUgYXJlIGF0dHJpYnV0ZXMgdG8gY2hvb3NlIHdoaWNoIGl0ZW1zIHRvIGV4cG9ydDoKLSA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgotIDx0cj4KLSAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+Ci0gPC90cj4KLSA8dHI+Ci0gICA8dGQgdmFsaWduPSJ0b3AiPnByb2plY3Q8L3RkPgotICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiB0aGUgUHJvamVjdCB0byBpbXBvcnQgdG88L3RkPgotICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgotIDwvdHI+Ci0gPHRyPgotICAgPHRkIHZhbGlnbj0idG9wIj5pbXBvcnRTb3VyY2VzPC90ZD4KLSAgIDx0ZCB2YWxpZ249InRvcCI+aW1wb3J0IEphdmEgc291cmNlcywgZGVmYXVsdHMgdG8gInllcyI8L3RkPgotICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gPC90cj4KLSA8dHI+Ci0gICA8dGQgdmFsaWduPSJ0b3AiPmltcG9ydFJlc291cmNlczwvdGQ+Ci0gICA8dGQgdmFsaWduPSJ0b3AiPmltcG9ydCByZXNvdXJjZSBmaWxlcyAoYW55dGhpbmcgdGhhdCBkb2Vzbid0Ci0gICAgICAgICAgICAgICAgICAgIGVuZCB3aXRoIC5qYXZhIG9yIC5jbGFzcyksIGRlZmF1bHRzIHRvICJ5ZXMiPC90ZD4KLSAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotIDwvdHI+Ci0gPHRyPgotICAgPHRkIHZhbGlnbj0idG9wIj5pbXBvcnRDbGFzc2VzPC90ZD4KLSAgIDx0ZCB2YWxpZ249InRvcCI+aW1wb3J0IGNsYXNzIGZpbGVzLCBkZWZhdWx0cyB0byAibm8iPC90ZD4KLSAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotIDwvdHI+Ci0gPC90YWJsZT5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmF1bHRleGNsdWRlcyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIHdoZXRoZXIgZGVmYXVsdCBleGNsdXNpb25zIHNob3VsZCBiZSB1c2VkIG9yIG5vdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVzaW9ucyBzaG91bGQgYmUgdXNlZCBvciBub3QuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaW1wb3J0Y2xhc3NlcyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRvIGltcG9ydCAuY2xhc3MgZmlsZXM7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBGbGFnIHRvIGltcG9ydCAuY2xhc3MgZmlsZXM7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImltcG9ydHJlc291cmNlcyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJbXBvcnQgcmVzb3VyY2UgZmlsZXMgKGFueXRoaW5nIHRoYXQgZG9lc24ndCBlbmQgaW4KLSAuY2xhc3Mgb3IgLmphdmEpOyBvcHRpb25hbCwgZGVmYXVsdCB0cnVlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJbXBvcnQgcmVzb3VyY2UgZmlsZXMgKGFueXRoaW5nIHRoYXQgZG9lc24ndCBlbmQgaW4KLSAuY2xhc3Mgb3IgLmphdmEpOyBvcHRpb25hbCwgZGVmYXVsdCB0cnVlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImltcG9ydHNvdXJjZXMiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSW1wb3J0IC5qYXZhIGZpbGVzOyBvcHRpb25hbCwgZGVmYXVsdCB0cnVlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJbXBvcnQgLmphdmEgZmlsZXM7IG9wdGlvbmFsLCBkZWZhdWx0IHRydWUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvamVjdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBWaXN1YWxBZ2UgZm9yIEphdmEgUHJvamVjdCBuYW1lIHRvIGltcG9ydCBpbnRvLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgVmlzdWFsQWdlIGZvciBKYXZhIFByb2plY3QgbmFtZSB0byBpbXBvcnQgaW50by4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZW1vdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIGFuZCBwb3J0IG9mIGEgcmVtb3RlIHRvb2wgc2VydmVyLCBvcHRpb25hLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBOYW1lIGFuZCBwb3J0IG9mIGEgcmVtb3RlIHRvb2wgc2VydmVyLCBvcHRpb25hLgotIEZvcm1hdDogJmx0O3NlcnZlcm5hbWUmZ3Q7OiZsdDtwb3J0IG5vJmd0Oy4KLSBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQsIHRoZSB0YXNrcyB3aWxsIGJlIGV4ZWN1dGVkIG9uIHRoZSBzcGVjaWZpZWQgdG9vbAotIHNlcnZlci4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGVzZXQiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgc2V0IG9mIGZpbGVzIChuZXN0ZWQgZmlsZXNldCBhdHRyaWJ1dGUpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgc2V0IG9mIGZpbGVzIChuZXN0ZWQgZmlsZXNldCBhdHRyaWJ1dGUpLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9InZhamxvYWQiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaWRlLlZBSkxvYWQiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xvYWQgc3BlY2lmaWMgcHJvamVjdCB2ZXJzaW9ucyBpbnRvIHRoZSBWaXN1YWwgQWdlIGZvciBKYXZhIHdvcmtzcGFjZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbTG9hZCBzcGVjaWZpYyBwcm9qZWN0IHZlcnNpb25zIGludG8gdGhlIFZpc3VhbCBBZ2UgZm9yIEphdmEgd29ya3NwYWNlLgotIEVhY2ggcHJvamVjdCBhbmQgdmVyc2lvbiBuYW1lIGhhcyB0byBiZSBzcGVjaWZpZWQgY29tcGxldGVseS4KLSBFeGFtcGxlOiAgCi0gPGJsb2NrcXVvdGU+IAotICZsdDt2YWpsb2FkPgotICZuYnNwOyZsdDtwcm9qZWN0IG5hbWU9Ik15VkFQcm9qZWN0IiB2ZXJzaW9uPSIyLjEiLz4KLSAmbmJzcDsmbHQ7cHJvamVjdCBuYW1lPSJBcGFjaGUgWGVyY2VzIiB2ZXJzaW9uPSIxLjIuMCIvPgotICZsdDsvdmFqbG9hZD4KLSA8L2Jsb2NrcXVvdGU+XV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZW1vdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIGFuZCBwb3J0IG9mIGEgcmVtb3RlIHRvb2wgc2VydmVyLCBvcHRpb25hLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBOYW1lIGFuZCBwb3J0IG9mIGEgcmVtb3RlIHRvb2wgc2VydmVyLCBvcHRpb25hLgotIEZvcm1hdDogJmx0O3NlcnZlcm5hbWUmZ3Q7OiZsdDtwb3J0IG5vJmd0Oy4KLSBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQsIHRoZSB0YXNrcyB3aWxsIGJlIGV4ZWN1dGVkIG9uIHRoZSBzcGVjaWZpZWQgdG9vbAotIHNlcnZlci4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9InZhanByb2plY3QiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmlkZS5WQUpQcm9qZWN0RGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhIHByb2plY3QgZGVzY3JpcHRpb24gZW50cnkgb24gdGhlIHByb2plY3QgbGlzdC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgcHJvamVjdCBkZXNjcmlwdGlvbiBlbnRyeSBvbiB0aGUgcHJvamVjdCBsaXN0Ll1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9InZzc2FkZCIgY2F0ZWdvcnk9InNjbSIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudnNzLk1TVlNTQUREIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQZXJmb3JtcyBBZGQgY29tbWFuZHMgdG8gTWljcm9zb2Z0IFZpc3VhbCBTb3VyY2VTYWZlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtQZXJmb3JtcyBBZGQgY29tbWFuZHMgdG8gTWljcm9zb2Z0IFZpc3VhbCBTb3VyY2VTYWZlLgotIEJhc2VkIG9uIHRoZSBWU1MgQ2hlY2tpbiBjb2RlIGJ5IE1hcnRpbiBQb2VzY2hsXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhdXRvcmVzcG9uc2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGF0IHRvIHJlc3BvbmQgd2l0aCAoc2V0cyB0aGUgLUkgb3B0aW9uKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgV2hhdCB0byByZXNwb25kIHdpdGggKHNldHMgdGhlIC1JIG9wdGlvbikuIEJ5IGRlZmF1bHQsIC1JLSBpcwotIHVzZWQ7IHZhbHVlcyBvZiBZIG9yIE4gd2lsbCBiZSBhcHBlbmRlZCB0byB0aGlzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbW1lbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDb21tZW50IHRvIGFwcGx5OyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgY29tbWVudCB0byBhcHBseTsgb3B0aW9uYWwuCi0gPHA+Ci0gSWYgdGhpcyBpcyBudWxsIG9yIGVtcHR5LCBpdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggIi0iIHdoaWNoCi0gaXMgd2hhdCBTb3VyY2VTYWZlIHVzZXMgZm9yIGFuIGVtcHR5IGNvbW1lbnQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9jYWxwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xvY2FsIHBhdGguXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgbG9jYWwgcGF0aC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2dpbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBsb2dpbiB0byB1c2Ugd2hlbiBhY2Nlc3NpbmcgVlNTLCBmb3JtYXR0ZWQgYXMgInVzZXJuYW1lLHBhc3N3b3JkIjsKLSBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGxvZ2luIHRvIHVzZSB3aGVuIGFjY2Vzc2luZyBWU1MsIGZvcm1hdHRlZCBhcyAidXNlcm5hbWUscGFzc3dvcmQiOwotIG9wdGlvbmFsLgotIDxwPgotIFlvdSBjYW4gb21pdCB0aGUgcGFzc3dvcmQgaWYgeW91ciBkYXRhYmFzZSBpcyBub3QgcGFzc3dvcmQgcHJvdGVjdGVkLgotICBpZiB5b3UgaGF2ZSBhIHBhc3N3b3JkIGFuZCBvbWl0IGl0LCBBbnQvVlNTIHdpbGwgaGFuZy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZWN1cnNpdmUiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IGJlaGF2aW91ciByZWN1cnNpdmUgb3Igbm9uLXJlY3Vyc2l2ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IGJlaGF2aW91ciByZWN1cnNpdmUgb3Igbm9uLXJlY3Vyc2l2ZQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNlcnZlcnBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3Jzc2FmZS5pbmk8L2NvZGU+IHJlc2lkZXM7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcnNzYWZlLmluaTwvY29kZT4gcmVzaWRlczsgb3B0aW9uYWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3NkaXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3MuZXhlPC9jb2RlPiByZXNpZGVzOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNzLmV4ZTwvY29kZT4gcmVzaWRlczsgb3B0aW9uYWwuCi0gQnkgZGVmYXVsdCB0aGUgdGFzayBleHBlY3RzIGl0IHRvIGJlIGluIHRoZSBQQVRILgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZzc3BhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2VTYWZlIHBhdGggd2hpY2ggc3BlY2lmaWVzIHRoZSBwcm9qZWN0L2ZpbGUocykgeW91IHdpc2ggdG8gCi0gcGVyZm9ybSB0aGUgYWN0aW9uIG9uOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU291cmNlU2FmZSBwYXRoIHdoaWNoIHNwZWNpZmllcyB0aGUgcHJvamVjdC9maWxlKHMpIHlvdSB3aXNoIHRvIAotIHBlcmZvcm0gdGhlIGFjdGlvbiBvbjsgcmVxdWlyZWQuIFlvdSBzaG91bGQgbm90IHNwZWNpZnkgdGhlIGxlYWRpbmcgZG9sbGFyLXNpZ24gLSAKLSBpdCBpcyBwcmVwZW5kZWQgYnkgQW50IGF1dG9tYXRpY2FsbHkuCi0gPHA+Ci0gQW50IGNhbid0IGNvcGUgd2l0aCBhICckJyBzaWduIGluIGFuIGF0dHJpYnV0ZSBzbyB3ZSBoYXZlIHRvIGFkZCBpdCBoZXJlLgotIEFsc28gd2Ugc3RyaXAgb2ZmIGFueSAndnNzOi8vJyBwcmVmaXggd2hpY2ggaXMgYW4gWE1TIHNwZWNpYWwgYW5kIHNob3VsZCBwcm9iYWJseSBiZSByZW1vdmVkIQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9IndyaXRhYmxlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xlYXZlIGFkZGVkIGZpbGVzIHdyaXRhYmxlPy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgTGVhdmUgYWRkZWQgZmlsZXMgd3JpdGFibGU/IERlZmF1bHQ6IGZhbHNlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJ2c3NjaGVja2luIiBjYXRlZ29yeT0ic2NtIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC52c3MuTVNWU1NDSEVDS0lOIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQZXJmb3JtcyBDaGVja0luIGNvbW1hbmRzIHRvIE1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbUGVyZm9ybXMgQ2hlY2tJbiBjb21tYW5kcyB0byBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhdXRvcmVzcG9uc2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGF0IHRvIHJlc3BvbmQgd2l0aCAoc2V0cyB0aGUgLUkgb3B0aW9uKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgV2hhdCB0byByZXNwb25kIHdpdGggKHNldHMgdGhlIC1JIG9wdGlvbikuIEJ5IGRlZmF1bHQsIC1JLSBpcwotIHVzZWQ7IHZhbHVlcyBvZiBZIG9yIE4gd2lsbCBiZSBhcHBlbmRlZCB0byB0aGlzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbW1lbnQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDb21tZW50IHRvIGFwcGx5OyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBjb21tZW50IHRvIGFwcGx5OyBvcHRpb25hbC4KLSA8cD4KLSBJZiB0aGlzIGlzIG51bGwgb3IgZW1wdHksIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCAiLSIgd2hpY2gKLSBpcyB3aGF0IFNvdXJjZVNhZmUgdXNlcyBmb3IgYW4gZW1wdHkgY29tbWVudC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2NhbHBhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTG9jYWwgcGF0aC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBsb2NhbCBwYXRoLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImxvZ2luIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGxvZ2luIHRvIHVzZSB3aGVuIGFjY2Vzc2luZyBWU1MsIGZvcm1hdHRlZCBhcyAidXNlcm5hbWUscGFzc3dvcmQiOwotIG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgbG9naW4gdG8gdXNlIHdoZW4gYWNjZXNzaW5nIFZTUywgZm9ybWF0dGVkIGFzICJ1c2VybmFtZSxwYXNzd29yZCI7Ci0gb3B0aW9uYWwuCi0gPHA+Ci0gWW91IGNhbiBvbWl0IHRoZSBwYXNzd29yZCBpZiB5b3VyIGRhdGFiYXNlIGlzIG5vdCBwYXNzd29yZCBwcm90ZWN0ZWQuCi0gIGlmIHlvdSBoYXZlIGEgcGFzc3dvcmQgYW5kIG9taXQgaXQsIEFudC9WU1Mgd2lsbCBoYW5nLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InJlY3Vyc2l2ZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRvIHRlbGwgdGhlIHRhc2sgdG8gcmVjdXJzZSBkb3duIHRoZSB0cmVlOwotIG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBGbGFnIHRvIHRlbGwgdGhlIHRhc2sgdG8gcmVjdXJzZSBkb3duIHRoZSB0cmVlOwotIG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNlcnZlcnBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3Jzc2FmZS5pbmk8L2NvZGU+IHJlc2lkZXM7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcnNzYWZlLmluaTwvY29kZT4gcmVzaWRlczsgb3B0aW9uYWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3NkaXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3MuZXhlPC9jb2RlPiByZXNpZGVzOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNzLmV4ZTwvY29kZT4gcmVzaWRlczsgb3B0aW9uYWwuCi0gQnkgZGVmYXVsdCB0aGUgdGFzayBleHBlY3RzIGl0IHRvIGJlIGluIHRoZSBQQVRILgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZzc3BhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2VTYWZlIHBhdGggd2hpY2ggc3BlY2lmaWVzIHRoZSBwcm9qZWN0L2ZpbGUocykgeW91IHdpc2ggdG8gCi0gcGVyZm9ybSB0aGUgYWN0aW9uIG9uOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU291cmNlU2FmZSBwYXRoIHdoaWNoIHNwZWNpZmllcyB0aGUgcHJvamVjdC9maWxlKHMpIHlvdSB3aXNoIHRvIAotIHBlcmZvcm0gdGhlIGFjdGlvbiBvbjsgcmVxdWlyZWQuIFlvdSBzaG91bGQgbm90IHNwZWNpZnkgdGhlIGxlYWRpbmcgZG9sbGFyLXNpZ24gLSAKLSBpdCBpcyBwcmVwZW5kZWQgYnkgQW50IGF1dG9tYXRpY2FsbHkuCi0gPHA+Ci0gQW50IGNhbid0IGNvcGUgd2l0aCBhICckJyBzaWduIGluIGFuIGF0dHJpYnV0ZSBzbyB3ZSBoYXZlIHRvIGFkZCBpdCBoZXJlLgotIEFsc28gd2Ugc3RyaXAgb2ZmIGFueSAndnNzOi8vJyBwcmVmaXggd2hpY2ggaXMgYW4gWE1TIHNwZWNpYWwgYW5kIHNob3VsZCBwcm9iYWJseSBiZSByZW1vdmVkIQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9IndyaXRhYmxlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xlYXZlIGNoZWNrZWQgaW4gZmlsZXMgd3JpdGFibGU/Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBMZWF2ZSBjaGVja2VkIGluIGZpbGVzIHdyaXRhYmxlPyBEZWZhdWx0OiBmYWxzZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0idnNzY2hlY2tvdXQiIGNhdGVnb3J5PSJzY20iCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnZzcy5NU1ZTU0NIRUNLT1VUIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQZXJmb3JtcyBDaGVja091dCBjb21tYW5kcyB0byBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW1BlcmZvcm1zIENoZWNrT3V0IGNvbW1hbmRzIHRvIE1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZS4KLSA8cD5JZiB5b3Ugc3BlY2lmeSB0d28gb3IgbW9yZSBhdHRyaWJ1dGVzIGZyb20gdmVyc2lvbiwgZGF0ZSBhbmQgCi0gbGFiZWwgb25seSBvbmUgd2lsbCBiZSB1c2VkIGluIHRoZSBvcmRlciB2ZXJzaW9uLCBkYXRlLCBsYWJlbC48L3A+XV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhdXRvcmVzcG9uc2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGF0IHRvIHJlc3BvbmQgd2l0aCAoc2V0cyB0aGUgLUkgb3B0aW9uKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgV2hhdCB0byByZXNwb25kIHdpdGggKHNldHMgdGhlIC1JIG9wdGlvbikuIEJ5IGRlZmF1bHQsIC1JLSBpcwotIHVzZWQ7IHZhbHVlcyBvZiBZIG9yIE4gd2lsbCBiZSBhcHBlbmRlZCB0byB0aGlzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEYXRlIHRvIGdldDsKLSBvcHRpb25hbCwgb25seSBvbmUgb2YgPHR0PnZlcnNpb248L3R0PiwgPHR0PmxhYmVsPC90dD4sIG9yIDx0dD5kYXRlPC90dD4KLSBhbGxvd2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGRhdGUgdG8gZ2V0OwotIG9wdGlvbmFsLCBvbmx5IG9uZSBvZiA8dHQ+dmVyc2lvbjwvdHQ+LCA8dHQ+bGFiZWw8L3R0Piwgb3IgPHR0PmRhdGU8L3R0PgotIGFsbG93ZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFiZWwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtMYWJlbCB0byBnZXQ7Ci0gb3B0aW9uYWwsIG9ubHkgb25lIG9mIDx0dD52ZXJzaW9uPC90dD4sIDx0dD5sYWJlbDwvdHQ+LCBvciA8dHQ+ZGF0ZTwvdHQ+Ci0gYWxsb3dlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBsYWJlbCB0byBnZXQ7Ci0gb3B0aW9uYWwsIG9ubHkgb25lIG9mIDx0dD52ZXJzaW9uPC90dD4sIDx0dD5sYWJlbDwvdHQ+LCBvciA8dHQ+ZGF0ZTwvdHQ+Ci0gYWxsb3dlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2NhbHBhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTG9jYWwgcGF0aC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBsb2NhbCBwYXRoLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImxvZ2luIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGxvZ2luIHRvIHVzZSB3aGVuIGFjY2Vzc2luZyBWU1MsIGZvcm1hdHRlZCBhcyAidXNlcm5hbWUscGFzc3dvcmQiOwotIG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgbG9naW4gdG8gdXNlIHdoZW4gYWNjZXNzaW5nIFZTUywgZm9ybWF0dGVkIGFzICJ1c2VybmFtZSxwYXNzd29yZCI7Ci0gb3B0aW9uYWwuCi0gPHA+Ci0gWW91IGNhbiBvbWl0IHRoZSBwYXNzd29yZCBpZiB5b3VyIGRhdGFiYXNlIGlzIG5vdCBwYXNzd29yZCBwcm90ZWN0ZWQuCi0gIGlmIHlvdSBoYXZlIGEgcGFzc3dvcmQgYW5kIG9taXQgaXQsIEFudC9WU1Mgd2lsbCBoYW5nLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InJlY3Vyc2l2ZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRvIHRlbGwgdGhlIHRhc2sgdG8gcmVjdXJzZSBkb3duIHRoZSB0cmVlOwotIG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBGbGFnIHRvIHRlbGwgdGhlIHRhc2sgdG8gcmVjdXJzZSBkb3duIHRoZSB0cmVlOwotIG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNlcnZlcnBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3Jzc2FmZS5pbmk8L2NvZGU+IHJlc2lkZXM7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcnNzYWZlLmluaTwvY29kZT4gcmVzaWRlczsgb3B0aW9uYWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3NkaXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3MuZXhlPC9jb2RlPiByZXNpZGVzOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNzLmV4ZTwvY29kZT4gcmVzaWRlczsgb3B0aW9uYWwuCi0gQnkgZGVmYXVsdCB0aGUgdGFzayBleHBlY3RzIGl0IHRvIGJlIGluIHRoZSBQQVRILgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtWZXJzaW9uIHRvIGdldDsKLSBvcHRpb25hbCwgb25seSBvbmUgb2YgPHR0PnZlcnNpb248L3R0PiwgPHR0PmxhYmVsPC90dD4sIG9yIDx0dD5kYXRlPC90dD4KLSBhbGxvd2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIHZlcnNpb24gdG8gZ2V0OwotIG9wdGlvbmFsLCBvbmx5IG9uZSBvZiA8dHQ+dmVyc2lvbjwvdHQ+LCA8dHQ+bGFiZWw8L3R0Piwgb3IgPHR0PmRhdGU8L3R0PgotIGFsbG93ZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idnNzcGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NvdXJjZVNhZmUgcGF0aCB3aGljaCBzcGVjaWZpZXMgdGhlIHByb2plY3QvZmlsZShzKSB5b3Ugd2lzaCB0byAKLSBwZXJmb3JtIHRoZSBhY3Rpb24gb247IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTb3VyY2VTYWZlIHBhdGggd2hpY2ggc3BlY2lmaWVzIHRoZSBwcm9qZWN0L2ZpbGUocykgeW91IHdpc2ggdG8gCi0gcGVyZm9ybSB0aGUgYWN0aW9uIG9uOyByZXF1aXJlZC4gWW91IHNob3VsZCBub3Qgc3BlY2lmeSB0aGUgbGVhZGluZyBkb2xsYXItc2lnbiAtIAotIGl0IGlzIHByZXBlbmRlZCBieSBBbnQgYXV0b21hdGljYWxseS4KLSA8cD4KLSBBbnQgY2FuJ3QgY29wZSB3aXRoIGEgJyQnIHNpZ24gaW4gYW4gYXR0cmlidXRlIHNvIHdlIGhhdmUgdG8gYWRkIGl0IGhlcmUuCi0gQWxzbyB3ZSBzdHJpcCBvZmYgYW55ICd2c3M6Ly8nIHByZWZpeCB3aGljaCBpcyBhbiBYTVMgc3BlY2lhbCBhbmQgc2hvdWxkIHByb2JhYmx5IGJlIHJlbW92ZWQhCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9InZzc2NwIiBjYXRlZ29yeT0ic2NtIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC52c3MuTVNWU1NDUCIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGVyZm9ybXMgQ1AgKENoYW5nZSBQcm9qZWN0KSBjb21tYW5kcyB0byBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW1BlcmZvcm1zIENQIChDaGFuZ2UgUHJvamVjdCkgY29tbWFuZHMgdG8gTWljcm9zb2Z0IFZpc3VhbCBTb3VyY2VTYWZlLgotIDxwPlRoaXMgdGFzayBpcyB0eXBpY2FsbHkgdXNlZCBiZWZvcmUgYSBWc3NBZGQgaW4gb3JkZXIgdG8gc2V0IHRoZSB0YXJnZXQgcHJvamVjdDwvcD4KLSBCYXNlZCBvbiB0aGUgVlNTIENoZWNraW4gY29kZSBieSBNYXJ0aW4gUG9lc2NobF1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXV0b3Jlc3BvbnNlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hhdCB0byByZXNwb25kIHdpdGggKHNldHMgdGhlIC1JIG9wdGlvbikuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFdoYXQgdG8gcmVzcG9uZCB3aXRoIChzZXRzIHRoZSAtSSBvcHRpb24pLiBCeSBkZWZhdWx0LCAtSS0gaXMKLSB1c2VkOyB2YWx1ZXMgb2YgWSBvciBOIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhpcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2dpbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBsb2dpbiB0byB1c2Ugd2hlbiBhY2Nlc3NpbmcgVlNTLCBmb3JtYXR0ZWQgYXMgInVzZXJuYW1lLHBhc3N3b3JkIjsKLSBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGxvZ2luIHRvIHVzZSB3aGVuIGFjY2Vzc2luZyBWU1MsIGZvcm1hdHRlZCBhcyAidXNlcm5hbWUscGFzc3dvcmQiOwotIG9wdGlvbmFsLgotIDxwPgotIFlvdSBjYW4gb21pdCB0aGUgcGFzc3dvcmQgaWYgeW91ciBkYXRhYmFzZSBpcyBub3QgcGFzc3dvcmQgcHJvdGVjdGVkLgotICBpZiB5b3UgaGF2ZSBhIHBhc3N3b3JkIGFuZCBvbWl0IGl0LCBBbnQvVlNTIHdpbGwgaGFuZy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzZXJ2ZXJwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNyc3NhZmUuaW5pPC9jb2RlPiByZXNpZGVzOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBkaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3Jzc2FmZS5pbmk8L2NvZGU+IHJlc2lkZXM7IG9wdGlvbmFsLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNzZGlyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNzLmV4ZTwvY29kZT4gcmVzaWRlczsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIGRpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcy5leGU8L2NvZGU+IHJlc2lkZXM7IG9wdGlvbmFsLgotIEJ5IGRlZmF1bHQgdGhlIHRhc2sgZXhwZWN0cyBpdCB0byBiZSBpbiB0aGUgUEFUSC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2c3NwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU291cmNlU2FmZSBwYXRoIHdoaWNoIHNwZWNpZmllcyB0aGUgcHJvamVjdC9maWxlKHMpIHlvdSB3aXNoIHRvIAotIHBlcmZvcm0gdGhlIGFjdGlvbiBvbjsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNvdXJjZVNhZmUgcGF0aCB3aGljaCBzcGVjaWZpZXMgdGhlIHByb2plY3QvZmlsZShzKSB5b3Ugd2lzaCB0byAKLSBwZXJmb3JtIHRoZSBhY3Rpb24gb247IHJlcXVpcmVkLiBZb3Ugc2hvdWxkIG5vdCBzcGVjaWZ5IHRoZSBsZWFkaW5nIGRvbGxhci1zaWduIC0gCi0gaXQgaXMgcHJlcGVuZGVkIGJ5IEFudCBhdXRvbWF0aWNhbGx5LgotIDxwPgotIEFudCBjYW4ndCBjb3BlIHdpdGggYSAnJCcgc2lnbiBpbiBhbiBhdHRyaWJ1dGUgc28gd2UgaGF2ZSB0byBhZGQgaXQgaGVyZS4KLSBBbHNvIHdlIHN0cmlwIG9mZiBhbnkgJ3ZzczovLycgcHJlZml4IHdoaWNoIGlzIGFuIFhNUyBzcGVjaWFsIGFuZCBzaG91bGQgcHJvYmFibHkgYmUgcmVtb3ZlZCEKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0idnNzY3JlYXRlIiBjYXRlZ29yeT0ic2NtIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC52c3MuTVNWU1NDUkVBVEUiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NyZWF0ZXMgYSBuZXcgcHJvamVjdCBpbiBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0NyZWF0ZXMgYSBuZXcgcHJvamVjdCBpbiBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUuCi0gPHA+Ci0gVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBpbnRlcnByZXRlZDoKLSA8dGFibGUgYm9yZGVyPSIxIj4KLSAgIDx0cj4KLSAgICAgPHRoPkF0dHJpYnV0ZTwvdGg+Ci0gICAgIDx0aD5WYWx1ZXM8L3RoPgotICAgICA8dGg+UmVxdWlyZWQ8L3RoPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5sb2dpbjwvdGQ+Ci0gICAgICA8dGQ+dXNlcm5hbWUscGFzc3dvcmQ8L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+dnNzcGF0aDwvdGQ+Ci0gICAgICA8dGQ+U291cmNlU2FmZSBwYXRoIG9mIHByb2plY3QgdG8gYmUgY3JlYXRlZDwvdGQ+Ci0gICAgICA8dGQ+WWVzPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+c3NkaXI8L3RkPgotICAgICAgPHRkPmRpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcy5leGU8L2NvZGU+IHJlc2lkZXMuIEJ5IGRlZmF1bHQgdGhlIHRhc2sKLSAgICAgIGV4cGVjdHMgaXQgdG8gYmUgaW4gdGhlIFBBVEguPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPnF1aWV0PC90ZD4KLSAgICAgIDx0ZD5zdXBwcmVzcyBvdXRwdXQgKG9mZiBieSBkZWZhdWx0KTwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5mYWlsT25FcnJvcjwvdGQ+Ci0gICAgICA8dGQ+ZmFpbCBpZiB0aGVyZSBpcyBhbiBlcnJvciBjcmVhdGluZyB0aGUgcHJvamVjdCAodHJ1ZSBieSBkZWZhdWx0KTwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPC90cj4gICAKLSAgIDx0cj4KLSAgICAgIDx0ZD5hdXRvcmVzcG9uc2U8L3RkPgotICAgICAgPHRkPldoYXQgdG8gcmVzcG9uZCB3aXRoIChzZXRzIHRoZSAtSSBvcHRpb24pLiBCeSBkZWZhdWx0LCAtSS0gaXMKLSAgICAgIHVzZWQ7IHZhbHVlcyBvZiBZIG9yIE4gd2lsbCBiZSBhcHBlbmRlZCB0byB0aGlzLjwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5jb21tZW50PC90ZD4KLSAgICAgIDx0ZD5UaGUgY29tbWVudCB0byB1c2UgZm9yIHRoaXMgbGFiZWwuIEVtcHR5IG9yICctJyBmb3Igbm8gY29tbWVudC48L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDwvdHI+Ci0gPC90YWJsZT5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImF1dG9yZXNwb25zZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doYXQgdG8gcmVzcG9uZCB3aXRoIChzZXRzIHRoZSAtSSBvcHRpb24pLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBXaGF0IHRvIHJlc3BvbmQgd2l0aCAoc2V0cyB0aGUgLUkgb3B0aW9uKS4gQnkgZGVmYXVsdCwgLUktIGlzCi0gdXNlZDsgdmFsdWVzIG9mIFkgb3IgTiB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoaXMuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tbWVudCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NvbW1lbnQgdG8gYXBwbHkgaW4gU291cmNlU2FmZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0cyB0aGUgY29tbWVudCB0byBhcHBseSBpbiBTb3VyY2VTYWZlLgotIDxwPgotIElmIHRoaXMgaXMgbnVsbCBvciBlbXB0eSwgaXQgd2lsbCBiZSByZXBsYWNlZCB3aXRoICItIiB3aGljaAotIGlzIHdoYXQgU291cmNlU2FmZSB1c2VzIGZvciBhbiBlbXB0eSBjb21tZW50LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZhaWxvbmVycm9yIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgd2hldGhlciB0YXNrIHNob3VsZCBmYWlsIGlmIHRoZXJlIGlzIGFuIGVycm9yIGNyZWF0aW5nIHRoZSBwcm9qZWN0OwotIG9wdGlvbmFsLCBkZWZhdWx0IHRydWUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgd2hldGhlciB0YXNrIHNob3VsZCBmYWlsIGlmIHRoZXJlIGlzIGFuIGVycm9yIGNyZWF0aW5nIHRoZSBwcm9qZWN0OwotIG9wdGlvbmFsLCBkZWZhdWx0IHRydWUuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9naW4iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbG9naW4gdG8gdXNlIHdoZW4gYWNjZXNzaW5nIFZTUywgZm9ybWF0dGVkIGFzICJ1c2VybmFtZSxwYXNzd29yZCI7Ci0gb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBsb2dpbiB0byB1c2Ugd2hlbiBhY2Nlc3NpbmcgVlNTLCBmb3JtYXR0ZWQgYXMgInVzZXJuYW1lLHBhc3N3b3JkIjsKLSBvcHRpb25hbC4KLSA8cD4KLSBZb3UgY2FuIG9taXQgdGhlIHBhc3N3b3JkIGlmIHlvdXIgZGF0YWJhc2UgaXMgbm90IHBhc3N3b3JkIHByb3RlY3RlZC4KLSAgaWYgeW91IGhhdmUgYSBwYXNzd29yZCBhbmQgb21pdCBpdCwgQW50L1ZTUyB3aWxsIGhhbmcuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icXVpZXQiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cy9jbGVhcnMgcXVpZXQgbW9kZTsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMvY2xlYXJzIHF1aWV0IG1vZGU7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNlcnZlcnBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3Jzc2FmZS5pbmk8L2NvZGU+IHJlc2lkZXM7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcnNzYWZlLmluaTwvY29kZT4gcmVzaWRlczsgb3B0aW9uYWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3NkaXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3MuZXhlPC9jb2RlPiByZXNpZGVzOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNzLmV4ZTwvY29kZT4gcmVzaWRlczsgb3B0aW9uYWwuCi0gQnkgZGVmYXVsdCB0aGUgdGFzayBleHBlY3RzIGl0IHRvIGJlIGluIHRoZSBQQVRILgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZzc3BhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2VTYWZlIHBhdGggd2hpY2ggc3BlY2lmaWVzIHRoZSBwcm9qZWN0L2ZpbGUocykgeW91IHdpc2ggdG8gCi0gcGVyZm9ybSB0aGUgYWN0aW9uIG9uOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU291cmNlU2FmZSBwYXRoIHdoaWNoIHNwZWNpZmllcyB0aGUgcHJvamVjdC9maWxlKHMpIHlvdSB3aXNoIHRvIAotIHBlcmZvcm0gdGhlIGFjdGlvbiBvbjsgcmVxdWlyZWQuIFlvdSBzaG91bGQgbm90IHNwZWNpZnkgdGhlIGxlYWRpbmcgZG9sbGFyLXNpZ24gLSAKLSBpdCBpcyBwcmVwZW5kZWQgYnkgQW50IGF1dG9tYXRpY2FsbHkuCi0gPHA+Ci0gQW50IGNhbid0IGNvcGUgd2l0aCBhICckJyBzaWduIGluIGFuIGF0dHJpYnV0ZSBzbyB3ZSBoYXZlIHRvIGFkZCBpdCBoZXJlLgotIEFsc28gd2Ugc3RyaXAgb2ZmIGFueSAndnNzOi8vJyBwcmVmaXggd2hpY2ggaXMgYW4gWE1TIHNwZWNpYWwgYW5kIHNob3VsZCBwcm9iYWJseSBiZSByZW1vdmVkIQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJ2c3NnZXQiIGNhdGVnb3J5PSJzY20iCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnZzcy5NU1ZTU0dFVCIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGVyZm9ybSBHZXQgY29tbWFuZHMgdG8gTWljcm9zb2Z0IFZpc3VhbCBTb3VyY2VTYWZlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtQZXJmb3JtIEdldCBjb21tYW5kcyB0byBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUuCi0gPHA+Ci0gVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBpbnRlcnByZXRlZDoKLSA8dGFibGUgYm9yZGVyPSIxIj4KLSAgIDx0cj4KLSAgICAgPHRoPkF0dHJpYnV0ZTwvdGg+Ci0gICAgIDx0aD5WYWx1ZXM8L3RoPgotICAgICA8dGg+UmVxdWlyZWQ8L3RoPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5sb2dpbjwvdGQ+Ci0gICAgICA8dGQ+dXNlcm5hbWUscGFzc3dvcmQ8L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+dnNzcGF0aDwvdGQ+Ci0gICAgICA8dGQ+U291cmNlU2FmZSBwYXRoPC90ZD4KLSAgICAgIDx0ZD5ZZXM8L3RkPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5sb2NhbHBhdGg8L3RkPgotICAgICAgPHRkPk92ZXJyaWRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgZ2V0IHRvIHRoZSBzcGVjaWZpZWQgcGF0aDwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD53cml0YWJsZTwvdGQ+Ci0gICAgICA8dGQ+dHJ1ZSBvciBmYWxzZTwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5yZWN1cnNpdmU8L3RkPgotICAgICAgPHRkPnRydWUgb3IgZmFsc2U8L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+dmVyc2lvbjwvdGQ+Ci0gICAgICA8dGQ+YSB2ZXJzaW9uIG51bWJlciB0byBnZXQ8L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+ZGF0ZTwvdGQ+Ci0gICAgICA8dGQ+YSBkYXRlIHN0YW1wIHRvIGdldCBhdDwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5sYWJlbDwvdGQ+Ci0gICAgICA8dGQ+YSBsYWJlbCB0byBnZXQgZm9yPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPnF1aWV0PC90ZD4KLSAgICAgIDx0ZD5zdXBwcmVzcyBvdXRwdXQgKG9mZiBieSBkZWZhdWx0KTwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5hdXRvcmVzcG9uc2U8L3RkPgotICAgICAgPHRkPldoYXQgdG8gcmVzcG9uZCB3aXRoIChzZXRzIHRoZSAtSSBvcHRpb24pLiBCeSBkZWZhdWx0LCAtSS0gaXMKLSAgICAgIHVzZWQ7IHZhbHVlcyBvZiBZIG9yIE4gd2lsbCBiZSBhcHBlbmRlZCB0byB0aGlzLjwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPC90cj4KLSA8L3RhYmxlPgotIDxwPk5vdGUgdGhhdCBvbmx5IG9uZSBvZiB2ZXJzaW9uLCBkYXRlIG9yIGxhYmVsIHNob3VsZCBiZSBzcGVjaWZpZWQ8L3A+XV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhdXRvcmVzcG9uc2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGF0IHRvIHJlc3BvbmQgd2l0aCAoc2V0cyB0aGUgLUkgb3B0aW9uKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgV2hhdCB0byByZXNwb25kIHdpdGggKHNldHMgdGhlIC1JIG9wdGlvbikuIEJ5IGRlZmF1bHQsIC1JLSBpcwotIHVzZWQ7IHZhbHVlcyBvZiBZIG9yIE4gd2lsbCBiZSBhcHBlbmRlZCB0byB0aGlzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRhdGUiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEYXRlIHRvIGdldDsKLSBvcHRpb25hbCwgb25seSBvbmUgb2YgPHR0PnZlcnNpb248L3R0PiwgPHR0PmxhYmVsPC90dD4sIG9yIDx0dD5kYXRlPC90dD4KLSBhbGxvd2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGRhdGUgdG8gZ2V0OwotIG9wdGlvbmFsLCBvbmx5IG9uZSBvZiA8dHQ+dmVyc2lvbjwvdHQ+LCA8dHQ+bGFiZWw8L3R0Piwgb3IgPHR0PmRhdGU8L3R0PgotIGFsbG93ZWQuCi0gPHA+Ci0gT1JJR0lOQUwgQ09NTUVOVCBUSEFUIERPRVMgTk9UIFNFRU0gQVQgQUxMIFZBTElEOgotIE5vdGUgd2UgYXNzdW1lIHRoYXQgaWYgdGhlIHN1cHBsaWVkIHN0cmluZyBoYXMgdGhlIHZhbHVlICJudWxsIiB0aGF0IHNvbWV0aGluZwotIHdlbnQgd3JvbmcgYW5kIHRoYXQgdGhlIHN0cmluZyB2YWx1ZSBnb3QgcG9wdWxhdGVkIGZyb20gYSBudWxsIG9iamVjdC4gVGhpcwotIGhhcHBlbnMgaWYgYSBhbnQgdmFyaWFibGUgaXMgdXNlZCBlLmcuIGRhdGU9IiR7ZGF0ZX0iIHdoZW4gZGF0ZQotIGhhcyBub3QgYmVlbiBkZWZpbmVkIHRvIGFudCEKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0xhYmVsIHRvIGdldDsKLSBvcHRpb25hbCwgb25seSBvbmUgb2YgPHR0PnZlcnNpb248L3R0PiwgPHR0PmxhYmVsPC90dD4sIG9yIDx0dD5kYXRlPC90dD4KLSBhbGxvd2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGxhYmVsIHRvIGdldDsKLSBvcHRpb25hbCwgb25seSBvbmUgb2YgPHR0PnZlcnNpb248L3R0PiwgPHR0PmxhYmVsPC90dD4sIG9yIDx0dD5kYXRlPC90dD4KLSBhbGxvd2VkLgotIDxwPgotIE5vdGUgd2UgYXNzdW1lIHRoYXQgaWYgdGhlIHN1cHBsaWVkIHN0cmluZyBoYXMgdGhlIHZhbHVlICJudWxsIiB0aGF0IHNvbWV0aGluZwotIHdlbnQgd3JvbmcgYW5kIHRoYXQgdGhlIHN0cmluZyB2YWx1ZSBnb3QgcG9wdWxhdGVkIGZyb20gYSBudWxsIG9iamVjdC4gVGhpcwotIGhhcHBlbnMgaWYgYSBhbnQgdmFyaWFibGUgaXMgdXNlZCBlLmcuIGxhYmVsPSIke2xhYmVsX3NlcnZlcn0iIHdoZW4gbGFiZWxfc2VydmVyCi0gaGFzIG5vdCBiZWVuIGRlZmluZWQgdG8gYW50IQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImxvY2FscGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPdmVycmlkZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIGdldCB0byB0aGUgc3BlY2lmaWVkIHBhdGg7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBPdmVycmlkZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIGdldCB0byB0aGUgc3BlY2lmaWVkIHBhdGg7IG9wdGlvbmFsLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImxvZ2luIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGxvZ2luIHRvIHVzZSB3aGVuIGFjY2Vzc2luZyBWU1MsIGZvcm1hdHRlZCBhcyAidXNlcm5hbWUscGFzc3dvcmQiOwotIG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgbG9naW4gdG8gdXNlIHdoZW4gYWNjZXNzaW5nIFZTUywgZm9ybWF0dGVkIGFzICJ1c2VybmFtZSxwYXNzd29yZCI7Ci0gb3B0aW9uYWwuCi0gPHA+Ci0gWW91IGNhbiBvbWl0IHRoZSBwYXNzd29yZCBpZiB5b3VyIGRhdGFiYXNlIGlzIG5vdCBwYXNzd29yZCBwcm90ZWN0ZWQuCi0gIGlmIHlvdSBoYXZlIGEgcGFzc3dvcmQgYW5kIG9taXQgaXQsIEFudC9WU1Mgd2lsbCBoYW5nLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InF1aWV0IiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdG8gc3VwcHJlc3Mgb3V0cHV0IHdoZW4gdHJ1ZSA7IGZhbHNlIGJ5IGRlZmF1bHQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEZsYWcgdG8gc3VwcHJlc3Mgb3V0cHV0IHdoZW4gdHJ1ZSA7IGZhbHNlIGJ5IGRlZmF1bHQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVjdXJzaXZlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdG8gdGVsbCB0aGUgdGFzayB0byByZWN1cnNlIGRvd24gdGhlIHRyZWU7Ci0gb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEZsYWcgdG8gdGVsbCB0aGUgdGFzayB0byByZWN1cnNlIGRvd24gdGhlIHRyZWU7Ci0gb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2VydmVycGF0aCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcnNzYWZlLmluaTwvY29kZT4gcmVzaWRlczsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNyc3NhZmUuaW5pPC9jb2RlPiByZXNpZGVzOyBvcHRpb25hbC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzc2RpciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcy5leGU8L2NvZGU+IHJlc2lkZXM7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBkaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3MuZXhlPC9jb2RlPiByZXNpZGVzOyBvcHRpb25hbC4KLSBCeSBkZWZhdWx0IHRoZSB0YXNrIGV4cGVjdHMgaXQgdG8gYmUgaW4gdGhlIFBBVEguCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1ZlcnNpb24gbnVtYmVyIHRvIGdldDsgCi0gb3B0aW9uYWwsIG9ubHkgb25lIG9mIDx0dD52ZXJzaW9uPC90dD4sIDx0dD5sYWJlbDwvdHQ+LCBvciA8dHQ+ZGF0ZTwvdHQ+Ci0gYWxsb3dlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IGEgdmVyc2lvbiBudW1iZXIgdG8gZ2V0OyAKLSBvcHRpb25hbCwgb25seSBvbmUgb2YgPHR0PnZlcnNpb248L3R0PiwgPHR0PmxhYmVsPC90dD4sIG9yIDx0dD5kYXRlPC90dD4KLSBhbGxvd2VkLgotIDxwPgotIE9SSUdJTkFMIENPTU1FTlQgVEhBVCBET0VTIE5PVCBTRUVNIEFUIEFMTCBWQUxJRDoKLSBOb3RlIHdlIGFzc3VtZSB0aGF0IGlmIHRoZSBzdXBwbGllZCBzdHJpbmcgaGFzIHRoZSB2YWx1ZSAibnVsbCIgdGhhdCBzb21ldGhpbmcKLSB3ZW50IHdyb25nIGFuZCB0aGF0IHRoZSBzdHJpbmcgdmFsdWUgZ290IHBvcHVsYXRlZCBmcm9tIGEgbnVsbCBvYmplY3QuIFRoaXMKLSBoYXBwZW5zIGlmIGEgYW50IHZhcmlhYmxlIGlzIHVzZWQgZS5nLiB2ZXJzaW9uPSIke3Zlcl9zZXJ2ZXJ9IiB3aGVuIHZlcl9zZXJ2ZXIKLSBoYXMgbm90IGJlZW4gZGVmaW5lZCB0byBhbnQhCi0gTk8sIGluIHRoaXMgY2FzZSB0aGUgdmVyc2lvbiBzdHJpbmcgaXMgIiR7dmVyX3NlcnZlcn0iLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZzc3BhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTb3VyY2VTYWZlIHBhdGggd2hpY2ggc3BlY2lmaWVzIHRoZSBwcm9qZWN0L2ZpbGUocykgeW91IHdpc2ggdG8gCi0gcGVyZm9ybSB0aGUgYWN0aW9uIG9uOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU291cmNlU2FmZSBwYXRoIHdoaWNoIHNwZWNpZmllcyB0aGUgcHJvamVjdC9maWxlKHMpIHlvdSB3aXNoIHRvIAotIHBlcmZvcm0gdGhlIGFjdGlvbiBvbjsgcmVxdWlyZWQuIFlvdSBzaG91bGQgbm90IHNwZWNpZnkgdGhlIGxlYWRpbmcgZG9sbGFyLXNpZ24gLSAKLSBpdCBpcyBwcmVwZW5kZWQgYnkgQW50IGF1dG9tYXRpY2FsbHkuCi0gPHA+Ci0gQW50IGNhbid0IGNvcGUgd2l0aCBhICckJyBzaWduIGluIGFuIGF0dHJpYnV0ZSBzbyB3ZSBoYXZlIHRvIGFkZCBpdCBoZXJlLgotIEFsc28gd2Ugc3RyaXAgb2ZmIGFueSAndnNzOi8vJyBwcmVmaXggd2hpY2ggaXMgYW4gWE1TIHNwZWNpYWwgYW5kIHNob3VsZCBwcm9iYWJseSBiZSByZW1vdmVkIQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9IndyaXRhYmxlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW01ha2UgZmV0Y2hlZCBmaWxlcyAgd3JpdGFibGU7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBtYWtlIGZldGNoZWQgZmlsZXMgIHdyaXRhYmxlOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0idnNzaGlzdG9yeSIgY2F0ZWdvcnk9InNjbSIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudnNzLk1TVlNTSElTVE9SWSIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGVyZm9ybXMgSGlzdG9yeSBjb21tYW5kcyB0byBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW1BlcmZvcm1zIEhpc3RvcnkgY29tbWFuZHMgdG8gTWljcm9zb2Z0IFZpc3VhbCBTb3VyY2VTYWZlLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGF0ZWZvcm1hdCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Zvcm1hdCBvZiBkYXRlcyBpbiBmcm9tRGF0ZSBhbmQgdG9EYXRlOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgRm9ybWF0IG9mIGRhdGVzIGluIGZyb21EYXRlIGFuZCB0b0RhdGU7IG9wdGlvbmFsLgotIFVzZWQgd2hlbiBjYWxjdWxhdGluZyBkYXRlcyB3aXRoIAotIHRoZSBudW1kYXlzIGF0dHJpYnV0ZS4gCi0gVGhpcyBzdHJpbmcgdXNlcyB0aGUgZm9ybWF0dGluZyBydWxlcyBvZiBTaW1wbGVEYXRlRm9ybWF0LiAKLSAgRGVmYXVsdHMgdG8gRGF0ZUZvcm1hdC5TSE9SVC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmcm9tZGF0ZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1N0YXJ0IERhdGUgZm9yIHRoZSBDb21wYXJpc29uIG9mIHR3byB2ZXJzaW9uczsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgU3RhcnQgRGF0ZSBmb3IgdGhlIENvbXBhcmlzb24gb2YgdHdvIHZlcnNpb25zOyBvcHRpb25hbC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmcm9tbGFiZWwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTdGFydCBMYWJlbDsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgU3RhcnQgTGFiZWw7IG9wdGlvbmFsCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibG9naW4iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbG9naW4gdG8gdXNlIHdoZW4gYWNjZXNzaW5nIFZTUywgZm9ybWF0dGVkIGFzICJ1c2VybmFtZSxwYXNzd29yZCI7Ci0gb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBsb2dpbiB0byB1c2Ugd2hlbiBhY2Nlc3NpbmcgVlNTLCBmb3JtYXR0ZWQgYXMgInVzZXJuYW1lLHBhc3N3b3JkIjsKLSBvcHRpb25hbC4KLSA8cD4KLSBZb3UgY2FuIG9taXQgdGhlIHBhc3N3b3JkIGlmIHlvdXIgZGF0YWJhc2UgaXMgbm90IHBhc3N3b3JkIHByb3RlY3RlZC4KLSAgaWYgeW91IGhhdmUgYSBwYXNzd29yZCBhbmQgb21pdCBpdCwgQW50L1ZTUyB3aWxsIGhhbmcuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibnVtZGF5cyIgdHlwZT0iaW50IgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImludCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTnVtYmVyIG9mIGRheXMgZm9yIGNvbXBhcmlzb247IAotIG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIG51bWJlciBvZiBkYXlzIGZvciBjb21wYXJpc29uOyAKLSBvcHRpb25hbC4KLSA8cD4KLSBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAyIGRheXMuIChtYXliZSkKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdXRwdXQiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPdXRwdXQgZmlsZSBuYW1lIGZvciB0aGUgaGlzdG9yeTsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgb3V0cHV0IGZpbGUgbmFtZSBmb3IgdGhlIGhpc3Rvcnk7IG9wdGlvbmFsLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InJlY3Vyc2l2ZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRvIHRlbGwgdGhlIHRhc2sgdG8gcmVjdXJzZSBkb3duIHRoZSB0cmVlOwotIG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBGbGFnIHRvIHRlbGwgdGhlIHRhc2sgdG8gcmVjdXJzZSBkb3duIHRoZSB0cmVlOwotIG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNlcnZlcnBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3Jzc2FmZS5pbmk8L2NvZGU+IHJlc2lkZXM7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcnNzYWZlLmluaTwvY29kZT4gcmVzaWRlczsgb3B0aW9uYWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3NkaXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3MuZXhlPC9jb2RlPiByZXNpZGVzOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNzLmV4ZTwvY29kZT4gcmVzaWRlczsgb3B0aW9uYWwuCi0gQnkgZGVmYXVsdCB0aGUgdGFzayBleHBlY3RzIGl0IHRvIGJlIGluIHRoZSBQQVRILgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InN0eWxlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC52c3MuTVNWU1NISVNUT1JZLkJyaWVmQ29kZWRpZmZOb2ZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7YnJpZWYmcXVvdDssICZxdW90O2NvZGVkaWZmJnF1b3Q7LCAmcXVvdDtub2ZpbGUmcXVvdDssICZxdW90O2RlZmF1bHQmcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZnkgdGhlIG91dHB1dCBzdHlsZTsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNwZWNpZnkgdGhlIG91dHB1dCBzdHlsZTsgb3B0aW9uYWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idG9kYXRlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRW5kIERhdGUgZm9yIHRoZSBDb21wYXJpc29uIG9mIHR3byB2ZXJzaW9uczsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgRW5kIERhdGUgZm9yIHRoZSBDb21wYXJpc29uIG9mIHR3byB2ZXJzaW9uczsgb3B0aW9uYWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idG9sYWJlbCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0VuZCBMYWJlbCA7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIEVuZCBMYWJlbCA7IG9wdGlvbmFsCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXNlciIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgdGhlIHVzZXIgd2hvc2UgY2hhbmdlcyB3ZSB3b3VsZCBsaWtlIHRvIHNlZTsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIE5hbWUgdGhlIHVzZXIgd2hvc2UgY2hhbmdlcyB3ZSB3b3VsZCBsaWtlIHRvIHNlZTsgb3B0aW9uYWwKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2c3NwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU291cmNlU2FmZSBwYXRoIHdoaWNoIHNwZWNpZmllcyB0aGUgcHJvamVjdC9maWxlKHMpIHlvdSB3aXNoIHRvIAotIHBlcmZvcm0gdGhlIGFjdGlvbiBvbjsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNvdXJjZVNhZmUgcGF0aCB3aGljaCBzcGVjaWZpZXMgdGhlIHByb2plY3QvZmlsZShzKSB5b3Ugd2lzaCB0byAKLSBwZXJmb3JtIHRoZSBhY3Rpb24gb247IHJlcXVpcmVkLiBZb3Ugc2hvdWxkIG5vdCBzcGVjaWZ5IHRoZSBsZWFkaW5nIGRvbGxhci1zaWduIC0gCi0gaXQgaXMgcHJlcGVuZGVkIGJ5IEFudCBhdXRvbWF0aWNhbGx5LgotIDxwPgotIEFudCBjYW4ndCBjb3BlIHdpdGggYSAnJCcgc2lnbiBpbiBhbiBhdHRyaWJ1dGUgc28gd2UgaGF2ZSB0byBhZGQgaXQgaGVyZS4KLSBBbHNvIHdlIHN0cmlwIG9mZiBhbnkgJ3ZzczovLycgcHJlZml4IHdoaWNoIGlzIGFuIFhNUyBzcGVjaWFsIGFuZCBzaG91bGQgcHJvYmFibHkgYmUgcmVtb3ZlZCEKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0idnNzbGFiZWwiIGNhdGVnb3J5PSJzY20iCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnZzcy5NU1ZTU0xBQkVMIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQZXJmb3JtcyBMYWJlbCBjb21tYW5kcyB0byBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW1BlcmZvcm1zIExhYmVsIGNvbW1hbmRzIHRvIE1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZS4KLQotIDxwPgotIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgaW50ZXJwcmV0ZWQ6Ci0gPHRhYmxlIGJvcmRlcj0iMSI+Ci0gICA8dHI+Ci0gICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgotICAgICA8dGg+VmFsdWVzPC90aD4KLSAgICAgPHRoPlJlcXVpcmVkPC90aD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+bG9naW48L3RkPgotICAgICAgPHRkPnVzZXJuYW1lLHBhc3N3b3JkPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPnZzc3BhdGg8L3RkPgotICAgICAgPHRkPlNvdXJjZVNhZmUgcGF0aDwvdGQ+Ci0gICAgICA8dGQ+WWVzPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+c3NkaXI8L3RkPgotICAgICAgPHRkPmRpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcy5leGU8L2NvZGU+IHJlc2lkZXMuIEJ5IGRlZmF1bHQgdGhlIHRhc2sKLSAgICAgIGV4cGVjdHMgaXQgdG8gYmUgaW4gdGhlIFBBVEguPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPmxhYmVsPC90ZD4KLSAgICAgIDx0ZD5BIGxhYmVsIHRvIGFwcGx5IHRvIHRoZSBoaWVyYXJjaHk8L3RkPgotICAgICAgPHRkPlllczwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPnZlcnNpb248L3RkPgotICAgICAgPHRkPkFuIGV4aXN0aW5nIGZpbGUgb3IgcHJvamVjdCB2ZXJzaW9uIHRvIGxhYmVsPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPmF1dG9yZXNwb25zZTwvdGQ+Ci0gICAgICA8dGQ+V2hhdCB0byByZXNwb25kIHdpdGggKHNldHMgdGhlIC1JIG9wdGlvbikuIEJ5IGRlZmF1bHQsIC1JLSBpcwotICAgICAgdXNlZDsgdmFsdWVzIG9mIFkgb3IgTiB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoaXMuPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPmNvbW1lbnQ8L3RkPgotICAgICAgPHRkPlRoZSBjb21tZW50IHRvIHVzZSBmb3IgdGhpcyBsYWJlbC4gRW1wdHkgb3IgJy0nIGZvciBubyBjb21tZW50LjwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPC90cj4KLSA8L3RhYmxlPl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXV0b3Jlc3BvbnNlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hhdCB0byByZXNwb25kIHdpdGggKHNldHMgdGhlIC1JIG9wdGlvbikuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFdoYXQgdG8gcmVzcG9uZCB3aXRoIChzZXRzIHRoZSAtSSBvcHRpb24pLiBCeSBkZWZhdWx0LCAtSS0gaXMKLSB1c2VkOyB2YWx1ZXMgb2YgWSBvciBOIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhpcy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21tZW50IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGNvbW1lbnQgdG8gdXNlIGZvciB0aGlzIGxhYmVsOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGNvbW1lbnQgdG8gdXNlIGZvciB0aGlzIGxhYmVsOyBvcHRpb25hbC4KLSBFbXB0eSBvciAnLScgZm9yIG5vIGNvbW1lbnQuCi0gPHA+Ci0gSWYgdGhpcyBpcyBudWxsIG9yIGVtcHR5LCBpdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggIi0iIHdoaWNoCi0gaXMgd2hhdCBTb3VyY2VTYWZlIHVzZXMgZm9yIGFuIGVtcHR5IGNvbW1lbnQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFiZWwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtMYWJlbCB0byBhcHBseTsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgbGFiZWwgdG8gYXBwbHk7IHJlcXVpcmVkLgotIDxwPgotIE5vdGUgd2UgYXNzdW1lIHRoYXQgaWYgdGhlIHN1cHBsaWVkIHN0cmluZyBoYXMgdGhlIHZhbHVlICJudWxsIiB0aGF0IHNvbWV0aGluZwotIHdlbnQgd3JvbmcgYW5kIHRoYXQgdGhlIHN0cmluZyB2YWx1ZSBnb3QgcG9wdWxhdGVkIGZyb20gYSBudWxsIG9iamVjdC4gVGhpcwotIGhhcHBlbnMgaWYgYSBhbnQgdmFyaWFibGUgaXMgdXNlZCBlLmcuIGxhYmVsPSIke2xhYmVsX3NlcnZlcn0iIHdoZW4gbGFiZWxfc2VydmVyCi0gaGFzIG5vdCBiZWVuIGRlZmluZWQgdG8gYW50IQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImxvZ2luIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGxvZ2luIHRvIHVzZSB3aGVuIGFjY2Vzc2luZyBWU1MsIGZvcm1hdHRlZCBhcyAidXNlcm5hbWUscGFzc3dvcmQiOwotIG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgbG9naW4gdG8gdXNlIHdoZW4gYWNjZXNzaW5nIFZTUywgZm9ybWF0dGVkIGFzICJ1c2VybmFtZSxwYXNzd29yZCI7Ci0gb3B0aW9uYWwuCi0gPHA+Ci0gWW91IGNhbiBvbWl0IHRoZSBwYXNzd29yZCBpZiB5b3VyIGRhdGFiYXNlIGlzIG5vdCBwYXNzd29yZCBwcm90ZWN0ZWQuCi0gIGlmIHlvdSBoYXZlIGEgcGFzc3dvcmQgYW5kIG9taXQgaXQsIEFudC9WU1Mgd2lsbCBoYW5nLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNlcnZlcnBhdGgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3Jzc2FmZS5pbmk8L2NvZGU+IHJlc2lkZXM7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcnNzYWZlLmluaTwvY29kZT4gcmVzaWRlczsgb3B0aW9uYWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3NkaXIiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3MuZXhlPC9jb2RlPiByZXNpZGVzOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNzLmV4ZTwvY29kZT4gcmVzaWRlczsgb3B0aW9uYWwuCi0gQnkgZGVmYXVsdCB0aGUgdGFzayBleHBlY3RzIGl0IHRvIGJlIGluIHRoZSBQQVRILgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIGFuIGV4aXN0aW5nIGZpbGUgb3IgcHJvamVjdCB2ZXJzaW9uIHRvIGxhYmVsOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgTmFtZSBhbiBleGlzdGluZyBmaWxlIG9yIHByb2plY3QgdmVyc2lvbiB0byBsYWJlbDsgb3B0aW9uYWwuCi0gQnkgZGVmYXVsdCB0aGUgY3VycmVudCB2ZXJzaW9uIGlzIGxhYmVsbGVkLgotIDxwPgotIE5vdGUgd2UgYXNzdW1lIHRoYXQgaWYgdGhlIHN1cHBsaWVkIHN0cmluZyBoYXMgdGhlIHZhbHVlICJudWxsIiB0aGF0IHNvbWV0aGluZwotIHdlbnQgd3JvbmcgYW5kIHRoYXQgdGhlIHN0cmluZyB2YWx1ZSBnb3QgcG9wdWxhdGVkIGZyb20gYSBudWxsIG9iamVjdC4gVGhpcwotIGhhcHBlbnMgaWYgYSBhbnQgdmFyaWFibGUgaXMgdXNlZCBlLmcuIHZlcnNpb249IiR7dmVyX3NlcnZlcn0iIHdoZW4gdmVyX3NlcnZlcgotIGhhcyBub3QgYmVlbiBkZWZpbmVkIHRvIGFudCEKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2c3NwYXRoIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU291cmNlU2FmZSBwYXRoIHdoaWNoIHNwZWNpZmllcyB0aGUgcHJvamVjdC9maWxlKHMpIHlvdSB3aXNoIHRvIAotIHBlcmZvcm0gdGhlIGFjdGlvbiBvbjsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNvdXJjZVNhZmUgcGF0aCB3aGljaCBzcGVjaWZpZXMgdGhlIHByb2plY3QvZmlsZShzKSB5b3Ugd2lzaCB0byAKLSBwZXJmb3JtIHRoZSBhY3Rpb24gb247IHJlcXVpcmVkLiBZb3Ugc2hvdWxkIG5vdCBzcGVjaWZ5IHRoZSBsZWFkaW5nIGRvbGxhci1zaWduIC0gCi0gaXQgaXMgcHJlcGVuZGVkIGJ5IEFudCBhdXRvbWF0aWNhbGx5LgotIDxwPgotIEFudCBjYW4ndCBjb3BlIHdpdGggYSAnJCcgc2lnbiBpbiBhbiBhdHRyaWJ1dGUgc28gd2UgaGF2ZSB0byBhZGQgaXQgaGVyZS4KLSBBbHNvIHdlIHN0cmlwIG9mZiBhbnkgJ3ZzczovLycgcHJlZml4IHdoaWNoIGlzIGFuIFhNUyBzcGVjaWFsIGFuZCBzaG91bGQgcHJvYmFibHkgYmUgcmVtb3ZlZCEKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0id2FpdGZvciIgY2F0ZWdvcnk9ImNvbnRyb2wiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLldhaXRGb3IiCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1dhaXQgZm9yIGFuIGV4dGVybmFsIGV2ZW50IHRvIG9jY3VyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtXYWl0IGZvciBhbiBleHRlcm5hbCBldmVudCB0byBvY2N1ci4KLQotIFdhaXQgZm9yIGFuIGV4dGVybmFsIHByb2Nlc3MgdG8gc3RhcnQgb3IgdG8gY29tcGxldGUgc29tZQotIHRhc2suIFRoaXMgaXMgdXNlZnVsIHdpdGggdGhlIDxjb2RlPnBhcmFsbGVsPC9jb2RlPiB0YXNrIHRvCi0gc3luY3Jvbml6ZSB0aGUgZXhlY3V0aW9uIG9mIHRlc3RzIHdpdGggc2VydmVyIHN0YXJ0dXAuCi0KLSBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgY2FuIGJlIHNwZWNpZmllZCBvbiBhIHdhaXRmb3IgdGFzazoKLSA8dWw+Ci0gPGxpPm1heHdhaXQgLSBtYXhpbXVtIGxlbmd0aCBvZiB0aW1lIHRvIHdhaXQgYmVmb3JlIGdpdmluZyB1cDwvbGk+Ci0gPGxpPm1heHdhaXR1bml0IC0gVGhlIHVuaXQgdG8gYmUgdXNlZCB0byBpbnRlcnByZXQgbWF4d2FpdCBhdHRyaWJ1dGU8L2xpPgotIDxsaT5jaGVja2V2ZXJ5IC0gYW1vdW50IG9mIHRpbWUgdG8gc2xlZXAgYmV0d2VlbiBlYWNoIGNoZWNrPC9saT4KLSA8bGk+Y2hlY2tldmVyeXVuaXQgLSBUaGUgdW5pdCB0byBiZSB1c2VkIHRvIGludGVycHJldCBjaGVja2V2ZXJ5IGF0dHJpYnV0ZTwvbGk+Ci0gPGxpPnRpbWVvdXRwcm9wZXJ0eSAtIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byBzZXQgaWYgbWF4d2FpdCBoYXMgYmVlbiBleGNlZWRlZC48L2xpPgotIDwvdWw+Ci0KLSBUaGUgbWF4d2FpdHVuaXQgYW5kIGNoZWNrZXZlcnl1bml0IGFyZSBhbGxvd2VkIHRvIGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0gbWlsbGVzb25kLCBzZWNvbmQsIG1pbnV0ZSwgaG91ciwgZGF5IGFuZCB3ZWVrLiBUaGUgZGVmYXVsdCBpcyBtaWxsaXNlY29uZC5dXT4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8c3RydWN0dXJlPgotCi0gICAgPGF0dHJpYnV0ZXM+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNoZWNrZXZlcnkiIHR5cGU9ImxvbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0ibG9uZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGltZSBiZXR3ZWVuIGVhY2ggY2hlY2suXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgdGltZSBiZXR3ZWVuIGVhY2ggY2hlY2sKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjaGVja2V2ZXJ5dW5pdCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuV2FpdEZvci5Vbml0IgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O21pbGxpc2Vjb25kJnF1b3Q7LCAmcXVvdDtzZWNvbmQmcXVvdDssICZxdW90O21pbnV0ZSZxdW90OywgJnF1b3Q7aG91ciZxdW90OywgJnF1b3Q7ZGF5JnF1b3Q7LCAmcXVvdDt3ZWVrJnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDaGVjayBldmVyeSB0aW1lIHVuaXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgY2hlY2sgZXZlcnkgdGltZSB1bml0Ci0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWF4d2FpdCIgdHlwZT0ibG9uZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJsb25nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtNYXhpbXVtIGxlbmd0aCBvZiB0aW1lIHRvIHdhaXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGltZSB0byB3YWl0Ci0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibWF4d2FpdHVuaXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLldhaXRGb3IuVW5pdCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSImcXVvdDttaWxsaXNlY29uZCZxdW90OywgJnF1b3Q7c2Vjb25kJnF1b3Q7LCAmcXVvdDttaW51dGUmcXVvdDssICZxdW90O2hvdXImcXVvdDssICZxdW90O2RheSZxdW90OywgJnF1b3Q7d2VlayZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTWF4IHdhaXQgdGltZSB1bml0Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIG1heCB3YWl0IHRpbWUgdW5pdAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InRpbWVvdXRwcm9wZXJ0eSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgdGhlIHByb3BlcnR5IHRvIHNldCBhZnRlciBhIHRpbWVvdXQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIE5hbWUgdGhlIHByb3BlcnR5IHRvIHNldCBhZnRlciBhIHRpbWVvdXQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJhbmQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5BbmQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhbiAmbHQ7YW5kJmd0OyBjb25kaXRpb24gImNvbnRhaW5lciIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCBhbiAmbHQ7YW5kJmd0OyBjb25kaXRpb24gImNvbnRhaW5lciIuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImF2YWlsYWJsZSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQXZhaWxhYmxlIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYW4gJmx0O2F2YWlsYWJsZSZndDsgY29uZGl0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGQgYW4gJmx0O2F2YWlsYWJsZSZndDsgY29uZGl0aW9uLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJjaGVja3N1bSIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ2hlY2tzdW0iCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhbiAmbHQ7Y2hlY2tzdW0mZ3Q7IGNvbmRpdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkIGFuICZsdDtjaGVja3N1bSZndDsgY29uZGl0aW9uLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJjb250YWlucyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkNvbnRhaW5zIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSAmbHQ7Y29udGFpbnMmZ3Q7IGNvbmRpdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkIGEgJmx0O2NvbnRhaW5zJmd0OyBjb25kaXRpb24uXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImVxdWFscyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkVxdWFscyIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGFuICZsdDtlcXVhbHMmZ3Q7IGNvbmRpdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkIGFuICZsdDtlcXVhbHMmZ3Q7IGNvbmRpdGlvbi5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNtYXRjaCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkZpbGVzTWF0Y2giCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhICZsdDtmaWxlc21hdGNoJmd0OyBjb25kaXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCBhICZsdDtmaWxlc21hdGNoJmd0OyBjb25kaXRpb24uXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9Imh0dHAiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5IdHRwIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYW4gJmx0O2h0dHAmZ3Q7IGNvbmRpdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkIGFuICZsdDtodHRwJmd0OyBjb25kaXRpb24uXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImlzZmFsc2UiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5Jc0ZhbHNlIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSAmbHQ7aXNmYWxzZSZndDsgY29uZGl0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGQgYSAmbHQ7aXNmYWxzZSZndDsgY29uZGl0aW9uLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJpc3NldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLklzU2V0IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYW4gJmx0O2lzc2V0Jmd0OyBjb25kaXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCBhbiAmbHQ7aXNzZXQmZ3Q7IGNvbmRpdGlvbi5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iaXN0cnVlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uSXNUcnVlIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYSAmbHQ7aXN0cnVlJmd0OyBjb25kaXRpb24uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCBhICZsdDtpc3RydWUmZ3Q7IGNvbmRpdGlvbi5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0ibm90IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uTm90IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYW4gJmx0O25vdCZndDsgY29uZGl0aW9uICJjb250YWluZXIiLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGQgYW4gJmx0O25vdCZndDsgY29uZGl0aW9uICJjb250YWluZXIiLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJvciIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9yIgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSIiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgYW4gJmx0O29yJmd0OyBjb25kaXRpb24gImNvbnRhaW5lciIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCBhbiAmbHQ7b3ImZ3Q7IGNvbmRpdGlvbiAiY29udGFpbmVyIi5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0ib3MiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5PcyIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGFuICZsdDtvcyZndDsgY29uZGl0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGQgYW4gJmx0O29zJmd0OyBjb25kaXRpb24uXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9InNvY2tldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLlNvY2tldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGEgJmx0O3NvY2tldCZndDsgY29uZGl0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGQgYSAmbHQ7c29ja2V0Jmd0OyBjb25kaXRpb24uXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9InVwdG9kYXRlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5VcFRvRGF0ZSIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGFuICZsdDt1cHRvZGF0ZSZndDsgY29uZGl0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGQgYW4gJmx0O3VwdG9kYXRlJmd0OyBjb25kaXRpb24uXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0id2FyIiBjYXRlZ29yeT0icGFja2FnaW5nIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5XYXIiCi0gICAgICBtYXRjaGluZ1Rhc2s9InRydWUiPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBbiBleHRlbnNpb24gb2YgJmx0O2phciZndDsgdG8gY3JlYXRlIGEgV0FSIGFyY2hpdmUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0FuIGV4dGVuc2lvbiBvZiAmbHQ7amFyJmd0OyB0byBjcmVhdGUgYSBXQVIgYXJjaGl2ZS4KLSBDb250YWlucyBzcGVjaWFsIHRyZWF0bWVudCBmb3IgZmlsZXMgdGhhdCBzaG91bGQgZW5kIHVwIGluIHRoZQotIDxjb2RlPldFQi1JTkYvbGliPC9jb2RlPiwgPGNvZGU+V0VCLUlORi9jbGFzc2VzPC9jb2RlPiBvcgotIDxjb2RlPldFQi1JTkY8L2NvZGU+IGRpcmVjdG9yaWVzIG9mIHRoZSBXZWIgQXBwbGljYXRpb24gQXJjaGl2ZS48L3A+Ci0gPHA+KFRoZSBXYXIgdGFzayBpcyBhIHNob3J0Y3V0IGZvciBzcGVjaWZ5aW5nIHRoZSBwYXJ0aWN1bGFyIGxheW91dCBvZiBhIFdBUiBmaWxlLiAKLSBUaGUgc2FtZSB0aGluZyBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IHVzaW5nIHRoZSA8aT5wcmVmaXg8L2k+IGFuZCA8aT5mdWxscGF0aDwvaT4KLSBhdHRyaWJ1dGVzIG9mIHppcGZpbGVzZXRzIGluIGEgWmlwIG9yIEphciB0YXNrLik8L3A+Ci0gPHA+VGhlIGV4dGVuZGVkIHppcGZpbGVzZXQgZWxlbWVudCBmcm9tIHRoZSB6aXAgdGFzayAod2l0aCBhdHRyaWJ1dGVzIDxpPnByZWZpeDwvaT4sIDxpPmZ1bGxwYXRoPC9pPiwgYW5kIDxpPnNyYzwvaT4pIGlzIGF2YWlsYWJsZSBpbiB0aGUgV2FyIHRhc2suPC9wPl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYmFzZWRpciIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0RpcmVjdG9yeSBmcm9tIHdoaWNoIHRvIGFyY2hpdmUgZmlsZXM7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBEaXJlY3RvcnkgZnJvbSB3aGljaCB0byBhcmNoaXZlIGZpbGVzOyBvcHRpb25hbC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb21wcmVzcyIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXaGV0aGVyIHdlIHdhbnQgdG8gY29tcHJlc3MgdGhlIGZpbGVzIG9yIG9ubHkgc3RvcmUgdGhlbTsKLSBvcHRpb25hbCwgZGVmYXVsdD10cnVlOy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgV2hldGhlciB3ZSB3YW50IHRvIGNvbXByZXNzIHRoZSBmaWxlcyBvciBvbmx5IHN0b3JlIHRoZW07Ci0gb3B0aW9uYWwsIGRlZmF1bHQ9dHJ1ZTsKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXN0ZmlsZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBmaWxlIHRvIGNyZWF0ZTsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBmaWxlIHRvIGNyZWF0ZTsgcmVxdWlyZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZHVwbGljYXRlIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5aaXAuRHVwbGljYXRlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IiZxdW90O2FkZCZxdW90OywgJnF1b3Q7cHJlc2VydmUmcXVvdDssICZxdW90O2ZhaWwmcXVvdDsiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldHMgYmVoYXZpb3IgZm9yIHdoZW4gYSBkdXBsaWNhdGUgZmlsZSBpcyBhYm91dCB0byBiZSBhZGRlZCAtCi0gb25lIG9mIDxjb2RlPmtlZXA8L2NvZGU+LCA8Y29kZT5za2lwPC9jb2RlPiBvciA8Y29kZT5vdmVyd3JpdGU8L2NvZGU+Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXRzIGJlaGF2aW9yIGZvciB3aGVuIGEgZHVwbGljYXRlIGZpbGUgaXMgYWJvdXQgdG8gYmUgYWRkZWQgLQotIG9uZSBvZiA8Y29kZT5rZWVwPC9jb2RlPiwgPGNvZGU+c2tpcDwvY29kZT4gb3IgPGNvZGU+b3ZlcndyaXRlPC9jb2RlPi4KLSBQb3NzaWJsZSB2YWx1ZXMgYXJlOiA8Y29kZT5rZWVwPC9jb2RlPiAoa2VlcCBib3RoCi0gb2YgdGhlIGZpbGVzKTsgPGNvZGU+c2tpcDwvY29kZT4gKGtlZXAgdGhlIGZpcnN0IHZlcnNpb24KLSBvZiB0aGUgZmlsZSBmb3VuZCk7IDxjb2RlPm92ZXJ3cml0ZTwvY29kZT4gb3ZlcndyaXRlIHRoZSBmaWxlCi0gd2l0aCB0aGUgbmV3IGZpbGUKLSBEZWZhdWx0IGZvciB6aXAgdGFza3MgaXMgPGNvZGU+a2VlcDwvY29kZT4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbmNvZGluZyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0VuY29kaW5nIHRvIHVzZSBmb3IgZmlsZW5hbWVzLCBkZWZhdWx0cyB0byB0aGUgcGxhdGZvcm0ncwotIGRlZmF1bHQgZW5jb2RpbmcuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEVuY29kaW5nIHRvIHVzZSBmb3IgZmlsZW5hbWVzLCBkZWZhdWx0cyB0byB0aGUgcGxhdGZvcm0ncwotIGRlZmF1bHQgZW5jb2RpbmcuCi0KLSA8cD5Gb3IgYSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcyBzZWUgPGEKLSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkay8xLjIvZG9jcy9ndWlkZS9pbnRlcm5hdC9lbmNvZGluZy5kb2MuaHRtbCI+aHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qZGsvMS4yL2RvY3MvZ3VpZGUvaW50ZXJuYXQvZW5jb2RpbmcuZG9jLmh0bWw8L2E+LjwvcD4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlc29ubHkiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbSWYgdHJ1ZSwgZW11bGF0ZSBTdW4ncyBqYXIgdXRpbGl0eSBieSBub3QgYWRkaW5nIHBhcmVudCBkaXJlY3RvcmllczsKLSBvcHRpb25hbCwgZGVmYXVsdHMgdG8gZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIElmIHRydWUsIGVtdWxhdGUgU3VuJ3MgamFyIHV0aWxpdHkgYnkgbm90IGFkZGluZyBwYXJlbnQgZGlyZWN0b3JpZXM7Ci0gb3B0aW9uYWwsIGRlZmF1bHRzIHRvIGZhbHNlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImluZGV4IiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NldCB3aGV0aGVyIG9yIG5vdCB0byBjcmVhdGUgYW4gaW5kZXggbGlzdCBmb3IgY2xhc3Nlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHdoZXRoZXIgb3Igbm90IHRvIGNyZWF0ZSBhbiBpbmRleCBsaXN0IGZvciBjbGFzc2VzLgotIFRoaXMgbWF5IHNwZWVkIHVwIGNsYXNzbG9hZGluZyBpbiBzb21lIGNhc2VzLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Im1hbmlmZXN0IiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIG1hbmlmZXN0IGZpbGUgdG8gdXNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgbWFuaWZlc3QgZmlsZSB0byB1c2UuIFRoaXMgY2FuIGJlIGVpdGhlciB0aGUgbG9jYXRpb24gb2YgYSBtYW5pZmVzdCwKLSBvciB0aGUgbmFtZSBvZiBhIGphciBhZGRlZCB0aHJvdWdoIGEgZmlsZXNldC4gSWYgaXRzIHRoZSBuYW1lIG9mIGFuIGFkZGVkCi0gamFyLCB0aGUgdGFzayBleHBlY3RzIHRoZSBtYW5pZmVzdCB0byBiZSBpbiB0aGUgamFyIGF0IE1FVEEtSU5GL01BTklGRVNULk1GLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InVwZGF0ZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCB1cGRhdGVzIGFuIGV4aXN0aW5nIGZpbGUsIG90aGVyd2lzZSBvdmVyd3JpdGUKLSBhbnkgZXhpc3Rpbmcgb25lOyBvcHRpb25hbCBkZWZhdWx0cyB0byBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgdXBkYXRlcyBhbiBleGlzdGluZyBmaWxlLCBvdGhlcndpc2Ugb3ZlcndyaXRlCi0gYW55IGV4aXN0aW5nIG9uZTsgb3B0aW9uYWwgZGVmYXVsdHMgdG8gZmFsc2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0id2VieG1sIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVwbG95bWVudCBkZXNjcmlwdG9yIHRvIHVzZSAoV0VCLUlORi93ZWIueG1sKTsKLSByZXF1aXJlZCB1bmxlc3MgPHR0PnVwZGF0ZT10cnVlPC90dD4uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIHNldCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRvIHVzZSAoV0VCLUlORi93ZWIueG1sKTsKLSByZXF1aXJlZCB1bmxlc3MgPHR0PnVwZGF0ZT10cnVlPC90dD4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3aGVuZW1wdHkiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlppcC5XaGVuRW1wdHkiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7ZmFpbCZxdW90OywgJnF1b3Q7c2tpcCZxdW90OywgJnF1b3Q7Y3JlYXRlJnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIGJlaGF2aW9yIG9mIHRoZSB0YXNrIHdoZW4gbm8gZmlsZXMgbWF0Y2guXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgYmVoYXZpb3Igb2YgdGhlIHRhc2sgd2hlbiBubyBmaWxlcyBtYXRjaC4KLSBQb3NzaWJsZSB2YWx1ZXMgYXJlOiA8Y29kZT5mYWlsPC9jb2RlPiAodGhyb3cgYW4gZXhjZXB0aW9uCi0gYW5kIGhhbHQgdGhlIGJ1aWxkKTsgPGNvZGU+c2tpcDwvY29kZT4gKGRvIG5vdCBjcmVhdGUKLSBhbnkgYXJjaGl2ZSwgYnV0IGlzc3VlIGEgd2FybmluZyk7IDxjb2RlPmNyZWF0ZTwvY29kZT4KLSAobWFrZSBhbiBhcmNoaXZlIHdpdGggbm8gZW50cmllcykuCi0gRGVmYXVsdCBmb3IgemlwIHRhc2tzIGlzIDxjb2RlPnNraXA8L2NvZGU+OwotIGZvciBqYXIgdGFza3MsIDxjb2RlPmNyZWF0ZTwvY29kZT4uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJjbGFzc2VzIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5aaXBGaWxlU2V0IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJaaXBGaWxlc2V0IgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkIGZpbGVzIHVuZGVyIFdFQi1JTkYvY2xhc3Nlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbYWRkIGZpbGVzIHVuZGVyIFdFQi1JTkYvY2xhc3Nlc11dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJtYW5pZmVzdCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWFuaWZlc3QiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FsbG93cyB0aGUgbWFuaWZlc3QgZm9yIHRoZSBhcmNoaXZlIGZpbGUgdG8gYmUgcHJvdmlkZWQgaW5saW5lCi0gaW4gdGhlIGJ1aWxkZmlsZSByYXRoZXIgdGhhbiBpbiBhbiBleHRlcm5hbCBmaWxlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBbGxvd3MgdGhlIG1hbmlmZXN0IGZvciB0aGUgYXJjaGl2ZSBmaWxlIHRvIGJlIHByb3ZpZGVkIGlubGluZQotIGluIHRoZSBidWlsZGZpbGUgcmF0aGVyIHRoYW4gaW4gYW4gZXh0ZXJuYWwgZmlsZS5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZmlsZXMuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZmlsZXMuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImxpYiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWmlwRmlsZVNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iWmlwRmlsZXNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBmaWxlcyB1bmRlciBXRUItSU5GL2xpYi8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW2FkZCBmaWxlcyB1bmRlciBXRUItSU5GL2xpYi9dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0ibWV0YWluZiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWmlwRmlsZVNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iWmlwRmlsZXNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSB6aXBmaWxlc2V0IHRvIGluY2x1ZGUgaW4gdGhlIE1FVEEtSU5GIGRpcmVjdG9yeS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHppcGZpbGVzZXQgdG8gaW5jbHVkZSBpbiB0aGUgTUVUQS1JTkYgZGlyZWN0b3J5Ll1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJ3ZWJpbmYiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlppcEZpbGVTZXQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IlppcEZpbGVzZXQiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGaWxlcyB0byBhZGQgdW5kZXIgV0VCLUlORjsuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW2ZpbGVzIHRvIGFkZCB1bmRlciBXRUItSU5GO11dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJ6aXBncm91cGZpbGVzZXQiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGVzZXQiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRzIGEgZ3JvdXAgb2YgemlwIGZpbGVzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGRzIGEgZ3JvdXAgb2YgemlwIGZpbGVzLl1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJ6aXBmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5aaXBGaWxlU2V0IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJaaXBGaWxlc2V0IgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyB0aGF0IGNhbiBiZQotIHJlYWQgZnJvbSBhbiBhcmNoaXZlIGFuZCBiZSBnaXZlbiBhIHByZWZpeC9mdWxscGF0aC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcyB0aGF0IGNhbiBiZQotIHJlYWQgZnJvbSBhbiBhcmNoaXZlIGFuZCBiZSBnaXZlbiBhIHByZWZpeC9mdWxscGF0aC5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJ3bGpzcGMiIGNhdGVnb3J5PSJvdGhlciIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanNwLldMSnNwYyIKLSAgICAgIG1hdGNoaW5nVGFzaz0idHJ1ZSI+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1ByZWNvbXBpbGVzIEpTUCdzIHVzaW5nIFdlYkxvZ2ljJ3MgSlNQIGNvbXBpbGVyICh3ZWJsb2dpYy5qc3BjKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbUHJlY29tcGlsZXMgSlNQJ3MgdXNpbmcgV2ViTG9naWMncyBKU1AgY29tcGlsZXIgKHdlYmxvZ2ljLmpzcGMpLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3QiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEaXJlY3RvcnkgY29udGFpbmluZyB0aGUgc291cmNlIGpzcCdzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBzb3VyY2UganNwJ3MKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYWNrYWdlIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUGFja2FnZSB1bmRlciB3aGljaCB0aGUgY29tcGlsZWQgY2xhc3NlcyBnby5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBwYWNrYWdlIHVuZGVyIHdoaWNoIHRoZSBjb21waWxlZCBjbGFzc2VzIGdvCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3JjIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBqc3Ancy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgc291cmNlIGpzcCdzCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtNYXliZSBjcmVhdGVzIGEgbmVzdGVkIGNsYXNzcGF0aCBlbGVtZW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtNYXliZSBjcmVhdGVzIGEgbmVzdGVkIGNsYXNzcGF0aCBlbGVtZW50Ll1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9IndscnVuIiBjYXRlZ29yeT0ib3RoZXIiCi0gICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYi5XTFJ1biIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3RhcnRzIGEgV2ViTG9naWMgc2VydmVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtTdGFydHMgYSBXZWJMb2dpYyBzZXJ2ZXIuCi0gQSBudW1iZXIgb2YgcGFyYW1ldGVycyBhcmUgdXNlZCB0byBjb250cm9sIHRoZSBvcGVyYXRpb24gb2YgdGhlIHdlYmxvZ2ljIGluc3RhbmNlLiBOb3RlIHRoYXQgdGhlIHRhc2ssCi0gYW5kIGhlbmNlIGFudCwgd2lsbCBub3QgY29tcGxldGUgdW50aWwgdGhlIHdlYmxvZ2ljIGluc3RhbmNlIGlzIHN0b3BwZWQuPC9wPl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXJncyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZGl0aW9uYWwgYXJndW1lbnQgc3RyaW5nIHBhc3NlZCB0byB0aGUgV2VibG9naWMgaW5zdGFuY2U7Ci0gb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEFkZGl0aW9uYWwgYXJndW1lbnQgc3RyaW5nIHBhc3NlZCB0byB0aGUgV2VibG9naWMgaW5zdGFuY2U7Ci0gb3B0aW9uYWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYmVhaG9tZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBsb2NhdGlvbiBvZiB0aGUgQkVBIEhvbWU7IGltcGxpY2l0bHkKLSBzZWxlY3RzIFdlYmxvZ2ljIDYuMDsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBsb2NhdGlvbiBvZiB0aGUgQkVBIEhvbWU7IGltcGxpY2l0bHkKLSBzZWxlY3RzIFdlYmxvZ2ljIDYuMDsgb3B0aW9uYWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NwYXRoIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCB3aXRoIHRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSB0aGF0IHJ1bnMgdGhlIFdlYmxvZ2ljCi0gU2VydmVyOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIHdpdGggdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lIHRoYXQgcnVucyB0aGUgV2VibG9naWMKLSBTZXJ2ZXI7IHJlcXVpcmVkLiBQcmlvciB0byBXZWJsb2dpYyA2LjAsIHRoaXMgaXMgdHlwaWNhbGx5IHNldCB0byB0aGUgV2VibG9naWMKLSBib290IGNsYXNzcGF0aC4gVW5kZXIgV2VibG9naWMgNi4wIHRoaXMgc2hvdWxkIGluY2x1ZGUgYWxsIHRoZQotIHdlYmxvZ2ljIGphcnMKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb21haW4iIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtEb21haW4gdG8gcnVuIGluOyByZXF1aXJlZCBmb3IgV0w2LjAuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgRG9tYWluIHRvIHJ1biBpbjsgcmVxdWlyZWQgZm9yIFdMNi4wCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaG9tZSIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBsb2NhdGlvbiB3aGVyZSB3ZWJsb2dpYyBsaXZlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGxvY2F0aW9uIHdoZXJlIHdlYmxvZ2ljIGxpdmVzLgotIFJlcXVpcmVkLiBUaGlzIGlzIHRoZSBhYnNvbHV0ZSBsb2NhdGlvbiwgbm90IHJlbGF0aXZlIHRvCi0gIEJFQSBob21lLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Imp2bWFyZ3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSB3ZWJsb2dpYyBKVk0uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgd2VibG9naWMgSlZNCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBuYW1lIG9mIHRoZSB3ZWJsb2dpYyBzZXJ2ZXIgd2l0aGluIHRoZSB3ZWJsb2dpYyBob21lIHdoaWNoIGlzIHRvIGJlIHJ1bi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIHdlYmxvZ2ljIHNlcnZlciB3aXRoaW4gdGhlIHdlYmxvZ2ljIGhvbWUgd2hpY2ggaXMgdG8gYmUgcnVuLgotIE9wdGlvbmEsIGRlZmF1bHRzIHRvICZxdW90O215c2VydmVyJnF1b3Q7Ci0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGtwYXNzd29yZCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1ByaXZhdGUga2V5IHBhc3N3b3JkIHNvIHRoZSBzZXJ2ZXIgY2FuIGRlY3J5cHQgdGhlIFNTTCBwcml2YXRlIGtleSBmaWxlOwotIG9wdGlvbmFsIGFuZCBvbmx5IGFwcGxpY2FibGUgdG8gV0w2LjAuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgcHJpdmF0ZSBrZXkgcGFzc3dvcmQgc28gdGhlIHNlcnZlciBjYW4gZGVjcnlwdCB0aGUgU1NMIHByaXZhdGUga2V5IGZpbGU7Ci0gb3B0aW9uYWwgYW5kIG9ubHkgYXBwbGljYWJsZSB0byBXTDYuMC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwYXNzd29yZCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW01hbmFnZW1lbnQgcGFzc3dvcmQgb2YgdGhlIHNlcnZlcjsKLSBvcHRpb25hbCBhbmQgb25seSBhcHBsaWNhYmxlIHRvIFdMNi4wLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIG1hbmFnZW1lbnQgcGFzc3dvcmQgb2YgdGhlIHNlcnZlcjsKLSBvcHRpb25hbCBhbmQgb25seSBhcHBsaWNhYmxlIHRvIFdMNi4wLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InBvbGljeSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBuYW1lIG9mIHRoZSBzZWN1cml0eSBwb2xpY3kgZmlsZSB3aXRoaW4gdGhlIHdlYmxvZ2ljIGhvbWUgZGlyZWN0b3J5IHRoYXQKLSBpcyB0byBiZSB1c2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgc2VjdXJpdHkgcG9saWN5IGZpbGUgd2l0aGluIHRoZSB3ZWJsb2dpYyBob21lIGRpcmVjdG9yeSB0aGF0Ci0gaXMgdG8gYmUgdXNlZC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgcG9saWN5IGZpbGUgPGNvZGU+d2VibG9naWMucG9saWN5PC9jb2RlPgotIGlzIHVzZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icHJvcGVydGllcyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1RoZSBuYW1lIG9mIHRoZSBzZXJ2ZXIncyBwcm9wZXJ0aWVzIGZpbGUgd2l0aGluIHRoZSB3ZWJsb2dpYyBob21lIGRpcmVjdG9yeQotIHVzZWQgdG8gY29udHJvbCB0aGUgd2VibG9naWMgaW5zdGFuY2U7Ci0gcmVxdWlyZWQgZm9yIFdMNC41LjEuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBzZXJ2ZXIncyBwcm9wZXJ0aWVzIGZpbGUgd2l0aGluIHRoZSB3ZWJsb2dpYyBob21lIGRpcmVjdG9yeQotIHVzZWQgdG8gY29udHJvbCB0aGUgd2VibG9naWMgaW5zdGFuY2U7Ci0gcmVxdWlyZWQgZm9yIFdMNC41LjEKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VybmFtZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW01hbmFnZW1lbnQgdXNlcm5hbWUgdG8gcnVuIHRoZSBzZXJ2ZXI7Ci0gb3B0aW9uYWwgYW5kIG9ubHkgYXBwbGljYWJsZSB0byBXTDYuMC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBtYW5hZ2VtZW50IHVzZXJuYW1lIHRvIHJ1biB0aGUgc2VydmVyOwotIG9wdGlvbmFsIGFuZCBvbmx5IGFwcGxpY2FibGUgdG8gV0w2LjAuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0id2VibG9naWNtYWluY2xhc3MiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIG9mIHRoZSBtYWluIGNsYXNzIGZvciB3ZWJsb2dpYzsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIG5hbWUgb2YgdGhlIG1haW4gY2xhc3MgZm9yIHdlYmxvZ2ljOyBvcHRpb25hbC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3bGNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJQYXRoIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtXZWJsb2dpYyBjbGFzc3BhdGggdXNlZCBieSB0aGUgV2VibG9naWMgU2VydmVyOwotIG9wdGlvbmFsLCBhbmQgb25seSBhcHBsaWNhYmxlIHRvIFdMNC41LjEKLQotIFRoZSB3ZWJsb2dpYyBjbGFzc3BhdGggaXMgdXNlZCBieSB3ZWJsb2dpYyB0byBzdXBwb3J0IGR5bmFtaWMgY2xhc3MgbG9hZGluZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSB3ZWJsb2dpYyBjbGFzc3BhdGggdXNlZCBieSB0aGUgV2VibG9naWMgU2VydmVyOwotIG9wdGlvbmFsLCBhbmQgb25seSBhcHBsaWNhYmxlIHRvIFdMNC41LjEKLQotIFRoZSB3ZWJsb2dpYyBjbGFzc3BhdGggaXMgdXNlZCBieSB3ZWJsb2dpYyB0byBzdXBwb3J0IGR5bmFtaWMgY2xhc3MgbG9hZGluZy4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9ImNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCB0aGUgY2xhc3NwYXRoIGZvciB0aGUgdXNlciBjbGFzc2VzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtBZGQgdGhlIGNsYXNzcGF0aCBmb3IgdGhlIHVzZXIgY2xhc3Nlc11dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJ3bGNsYXNzcGF0aCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0dldCB0aGUgY2xhc3NwYXRoIHRvIHRoZSB3ZWJsb2dpYyBjbGFzc3BhdGhzLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtHZXQgdGhlIGNsYXNzcGF0aCB0byB0aGUgd2VibG9naWMgY2xhc3NwYXRoc11dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9Indsc3RvcCIgY2F0ZWdvcnk9Im90aGVyIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamIuV0xTdG9wIgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTaHV0cyBkb3duIGEgV2ViTG9naWMgc2VydmVyLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVtTaHV0cyBkb3duIGEgV2ViTG9naWMgc2VydmVyLgotIFRvIHNodXQgZG93biBhbiBpbnN0YW5jZSB5b3UgbXVzdCBzdXBwbHkgYm90aCBhIHVzZXJuYW1lIGFuZAotIGEgcGFzc3dvcmQuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiZWFob21lIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGxvY2F0aW9uIG9mIHRoZSBCRUEgSG9tZTsgaW1wbGljaXRseQotIHNlbGVjdHMgV2VibG9naWMgNi4wIHNodXRkb3duOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGxvY2F0aW9uIG9mIHRoZSBCRUEgSG9tZTsgaW1wbGljaXRseQotIHNlbGVjdHMgV2VibG9naWMgNi4wIHNodXRkb3duOyBvcHRpb25hbC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIHdpdGggdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lIHRoYXQgcnVucyB0aGUgV2VibG9naWMKLSBTaHV0ZG93biBjb21tYW5kOy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIHdpdGggdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lIHRoYXQgcnVucyB0aGUgV2VibG9naWMKLSBTaHV0ZG93biBjb21tYW5kOwotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlbGF5IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVsYXkgKGluIHNlY29uZHMpIGJlZm9yZSBzaHV0dGluZyBkb3duIHRoZSBzZXJ2ZXI7Ci0gb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgZGVsYXkgKGluIHNlY29uZHMpIGJlZm9yZSBzaHV0dGluZyBkb3duIHRoZSBzZXJ2ZXI7Ci0gb3B0aW9uYWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFzc3dvcmQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcGFzc3dvcmQgZm9yIHRoZSBhY2NvdW50IHNwZWNpZmllZCBpbiB0aGUKLSB1c2VyIHBhcmFtZXRlcjsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBwYXNzd29yZCBmb3IgdGhlIGFjY291bnQgc3BlY2lmaWVkIGluIHRoZQotIHVzZXIgcGFyYW1ldGVyOyByZXF1aXJlZAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InVybCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1VSTCB0byB3aGljaCB0aGUgd2VibG9naWMgc2VydmVyIGlzIGxpc3RlbmluZwotIGZvciBUMyBjb25uZWN0aW9uczsgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgVVJMIHRvIHdoaWNoIHRoZSB3ZWJsb2dpYyBzZXJ2ZXIgaXMgbGlzdGVuaW5nCi0gZm9yIFQzIGNvbm5lY3Rpb25zOyByZXF1aXJlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1c2VyIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIHVzZXJuYW1lIG9mIHRoZSBhY2NvdW50IHdoaWNoIHdpbGwgYmUgdXNlZCB0byBzaHV0ZG93biB0aGUgc2VydmVyOwotIHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgdXNlcm5hbWUgb2YgdGhlIGFjY291bnQgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHNodXRkb3duIHRoZSBzZXJ2ZXI7Ci0gcmVxdWlyZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgd2l0aCB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgdGhhdCBydW5zIHRoZSBXZWJsb2dpYwotIFNodXRkb3duIGNvbW1hbmQ7Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtUaGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgd2l0aCB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgdGhhdCBydW5zIHRoZSBXZWJsb2dpYwotIFNodXRkb3duIGNvbW1hbmQ7XV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0id3NkbHRvZG90bmV0IiBjYXRlZ29yeT0iZG90bmV0IgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kb3RuZXQuV3NkbFRvRG90bmV0IgotICAgICAgPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDb252ZXJ0cyBhIFdTREwgZmlsZSBvciBVUkwgcmVzb3VyY2UgaW50byBhIC5ORVQgbGFuZ3VhZ2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgPGRlc2NyaXB0aW9uPgotICAgIDwhW0NEQVRBW0NvbnZlcnRzIGEgV1NETCBmaWxlIG9yIFVSTCByZXNvdXJjZSBpbnRvIGEgLk5FVCBsYW5ndWFnZS4KLQotIFNlZSAiQ3JlYXRpbmcgYW4gWE1MIFdlYiBTZXJ2aWNlIFByb3h5IiwgIndzZGwuZXhlIiBkb2NzIGluCi0gdGhlIGZyYW1ld29yayBTREsgZG9jdW1lbnRhdGlvbl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdGZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIG9mIHRoZSBmaWxlIHRvIGdlbmVyYXRlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBOYW1lIG9mIHRoZSBmaWxlIHRvIGdlbmVyYXRlLiBSZXF1aXJlZAotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImV4dHJhb3B0aW9ucyIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FueSBleHRyYSBXU0RMLkVYRSBvcHRpb25zIHdoaWNoIGFyZW4ndCBleHBsaWNpdGx5Ci0gIHN1cHBvcnRlZCBieSB0aGUgYW50IHdyYXBwZXIgdGFzazsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIEFueSBleHRyYSBXU0RMLkVYRSBvcHRpb25zIHdoaWNoIGFyZW4ndCBleHBsaWNpdGx5Ci0gIHN1cHBvcnRlZCBieSB0aGUgYW50IHdyYXBwZXIgdGFzazsgb3B0aW9uYWwKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWlsb25lcnJvciIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTaG91bGQgZmFpbHVyZSBoYWx0IHRoZSBidWlsZD8uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNob3VsZCBmYWlsdXJlIGhhbHQgdGhlIGJ1aWxkPyBvcHRpb25hbCwgZGVmYXVsdD10cnVlCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFuZ3VhZ2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtMYW5ndWFnZTsgb25lIG9mICJDUyIsICJKUyIsIG9yICJWQiIKLSBvcHRpb25hbCwgZGVmYXVsdCBpcyBDUyBmb3IgQyMgc291cmNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBzZXQgdGhlIGxhbmd1YWdlOyBvbmUgb2YgIkNTIiwgIkpTIiwgb3IgIlZCIgotIG9wdGlvbmFsLCBkZWZhdWx0IGlzIENTIGZvciBDIyBzb3VyY2UKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lc3BhY2UgdG8gcGxhY2UgIHRoZSBzb3VyY2UgaW4uCi0gb3B0aW9uYWw7IGRlZmF1bHQgIiIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIG5hbWVzcGFjZSB0byBwbGFjZSAgdGhlIHNvdXJjZSBpbi4KLSBvcHRpb25hbDsgZGVmYXVsdCAiIgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNlcnZlciIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRvIGVuYWJsZSBzZXJ2ZXIgc2lkZSBjb2RlIGdlbmVyYXRpb247Ci0gb3B0aW9uYWwsIGRlZmF1bHQ9ZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIGZsYWcgdG8gZW5hYmxlIHNlcnZlciBzaWRlIGNvZGUgZ2VuZXJhdGlvbjsKLSBvcHRpb25hbCwgZGVmYXVsdD1mYWxzZQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9InNyY2ZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgbG9jYWwgV1NETCBmaWxlIHRvIHBhcnNlOyBlaXRoZXIgdXJsIG9yIHNyY0ZpbGUgaXMgcmVxdWlyZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFRoZSBsb2NhbCBXU0RMIGZpbGUgdG8gcGFyc2U7IGVpdGhlciB1cmwgb3Igc3JjRmlsZSBpcyByZXF1aXJlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ1cmwiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtVUkwgdG8gZmV0Y2guXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgdGhlIFVSTCB0byBmZXRjaC4gRmV0Y2hpbmcgaXMgYnkgd3NkbC5leGU7IEFudCBwcm94eSBzZXR0aW5ncwotIGFyZSBpZ25vcmVkOyBlaXRoZXIgdXJsIG9yIHNyY0ZpbGUgaXMgcmVxdWlyZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgPC9lbGVtZW50cz4KLQotICA8L3N0cnVjdHVyZT4KLQotPC90YXNrPgotCi0KLTx0YXNrIG5hbWU9InhtbHByb3BlcnR5IiBjYXRlZ29yeT0ieG1sIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5YbWxQcm9wZXJ0eSIKLSAgICAgID4KLQotICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbTG9hZHMgcHJvcGVydHkgdmFsdWVzIGZyb20gYSB2YWxpZCBYTUwgZmlsZSwgZ2VuZXJhdGluZyB0aGUgcHJvcGVydHkgbmFtZXMgZnJvbSB0aGUgZmlsZSdzIGVsZW1lbnQgYW5kIGF0dHJpYnV0ZSBuYW1lcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbTG9hZHMgcHJvcGVydHkgdmFsdWVzIGZyb20gYSB2YWxpZCBYTUwgZmlsZSwKLSBnZW5lcmF0aW5nIHRoZSBwcm9wZXJ0eSBuYW1lcyBmcm9tIHRoZSBmaWxlJ3MgZWxlbWVudCBhbmQgYXR0cmlidXRlIG5hbWVzLgotCi0gRXhhbXBsZToKLSA8cHJlPgotICAgJmx0O3Jvb3QtdGFnIG15YXR0cj0idHJ1ZSImZ3Q7Ci0gICAgICZsdDtpbm5lci10YWcgc29tZWF0dHI9InZhbCImZ3Q7VGV4dCZsdDsvaW5uZXItdGFnJmd0OwotICAgICAmbHQ7YTImZ3Q7Jmx0O2EzJmd0OyZsdDthNCZndDtmYWxzZSZsdDsvYTQmZ3Q7Jmx0Oy9hMyZndDsmbHQ7L2EyJmd0OwotICAgJmx0Oy9yb290LXRhZyZndDsKLTwvcHJlPgotIHRoaXMgZ2VuZXJhdGVzCi0gPHByZT4KLSAgcm9vdC10YWcobXlhdHRyKT10cnVlCi0gIHJvb3QtdGFnLmlubmVyLXRhZz1UZXh0Ci0gIHJvb3QtdGFnLmlubmVyLXRhZyhzb21lYXR0cik9dmFsCi0gIHJvb3QtdGFnLmEyLmEzLmE0PWZhbHNlCi0gPC9wcmU+XV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb2xsYXBzZWF0dHJpYnV0ZXMiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRmxhZyB0byB0cmVhdCBhdHRyaWJ1dGVzIGFzIG5lc3RlZCBlbGVtZW50czsKLSBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgZmxhZyB0byB0cmVhdCBhdHRyaWJ1dGVzIGFzIG5lc3RlZCBlbGVtZW50czsKLSBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgWE1MIGZpbGUgdG8gcGFyc2U7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBUaGUgWE1MIGZpbGUgdG8gcGFyc2U7IHJlcXVpcmVkLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImtlZXByb290IiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0ZsYWcgdG8gaW5jbHVkZSB0aGUgeG1sIHJvb3QgdGFnIGFzIGEgCi0gZmlyc3QgdmFsdWUgaW4gdGhlIHByb3BlcnR5IG5hbWU7IG9wdGlvbmFsLCAKLSBkZWZhdWx0IGlzIHRydWUuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIGZsYWcgdG8gaW5jbHVkZSB0aGUgeG1sIHJvb3QgdGFnIGFzIGEgCi0gZmlyc3QgdmFsdWUgaW4gdGhlIHByb3BlcnR5IG5hbWU7IG9wdGlvbmFsLCAKLSBkZWZhdWx0IGlzIHRydWUKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtUaGUgcHJlZml4IHRvIHByZXBlbmQgdG8gZWFjaCBwcm9wZXJ0eS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgdGhlIHByZWZpeCB0byBwcmVwZW5kIHRvIGVhY2ggcHJvcGVydHkKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWxpZGF0ZSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtGbGFnIHRvIHZhbGlkYXRlIHRoZSBYTUwgZmlsZTsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIGZsYWcgdG8gdmFsaWRhdGUgdGhlIFhNTCBmaWxlOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZQotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgIDwvZWxlbWVudHM+Ci0KLSAgPC9zdHJ1Y3R1cmU+Ci0KLTwvdGFzaz4KLQotCi08dGFzayBuYW1lPSJ4bWx2YWxpZGF0ZSIgY2F0ZWdvcnk9Im90aGVyIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5YTUxWYWxpZGF0ZVRhc2siCi0gICAgICA+Ci0KLSAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NoZWNrcyBYTUwgZmlsZXMgYXJlIHZhbGlkIChvciBvbmx5IHdlbGwgZm9ybWVkKS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbQ2hlY2tzIFhNTCBmaWxlcyBhcmUgdmFsaWQgKG9yIG9ubHkgd2VsbCBmb3JtZWQpLiBUaGUKLSB0YXNrIHVzZXMgdGhlIFNBWDIgcGFyc2VyIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IEpBWFAgYnkgZGVmYXVsdAotIChwcm9iYWJseSB0aGUgb25lIHRoYXQgaXMgdXNlZCBieSBBbnQgaXRzZWxmKSwgYnV0IG9uZSBjYW4gc3BlY2lmeSBhbnkKLSBTQVgxLzIgcGFyc2VyIGlmIG5lZWRlZF1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NuYW1lIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmeSB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgU0FYIHBhcnNlciB0byBiZSB1c2VkLiAob3B0aW9uYWwpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTcGVjaWZ5IHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBTQVggcGFyc2VyIHRvIGJlIHVzZWQuIChvcHRpb25hbCkKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmeSB0aGUgY2xhc3NwYXRoIHRvIGJlIHNlYXJjaGVkIHRvIGxvYWQgdGhlIHBhcnNlciAob3B0aW9uYWwpLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTcGVjaWZ5IHRoZSBjbGFzc3BhdGggdG8gYmUgc2VhcmNoZWQgdG8gbG9hZCB0aGUgcGFyc2VyIChvcHRpb25hbCkKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGhyZWYiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJSZWZlcmVuY2UiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXJlIHRvIGZpbmQgdGhlIHBhcnNlciBjbGFzczsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFdoZXJlIHRvIGZpbmQgdGhlIHBhcnNlciBjbGFzczsgb3B0aW9uYWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFpbG9uZXJyb3IiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmeSBob3cgcGFyc2VyIGVycm9yIGFyZSB0byBiZSBoYW5kbGVkOyAKLSBvcHRpb25hbCwgZGVmYXVsdD10cnVlCi0gPHA+Ci0gSWYgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IChkZWZhdWx0KSwgdGhyb3cgYSBidWlsZEV4Y2VwdGlvbiBpZiB0aGUgcGFyc2VyIHlpZWxkcyBhbiBlcnJvci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU3BlY2lmeSBob3cgcGFyc2VyIGVycm9yIGFyZSB0byBiZSBoYW5kbGVkOyAKLSBvcHRpb25hbCwgZGVmYXVsdD10cnVlCi0gPHA+Ci0gSWYgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IChkZWZhdWx0KSwgdGhyb3cgYSBidWlsZEV4Y2VwdGlvbiBpZiB0aGUgcGFyc2VyIHlpZWxkcyBhbiBlcnJvci4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmeSB0aGUgZmlsZSB0byBiZSBjaGVja2VkOyBvcHRpb25hbC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgc3BlY2lmeSB0aGUgZmlsZSB0byBiZSBjaGVja2VkOyBvcHRpb25hbC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsZW5pZW50IiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZnkgd2hldGhlciB0aGUgcGFyc2VyIHNob3VsZCBiZSB2YWxpZGF0aW5nLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTcGVjaWZ5IHdoZXRoZXIgdGhlIHBhcnNlciBzaG91bGQgYmUgdmFsaWRhdGluZy4gRGVmYXVsdCBpcyA8Y29kZT50cnVlPC9jb2RlPi4KLSA8cD4KLSBJZiBzZXQgdG8gZmFsc2UsIHRoZSB2YWxpZGF0aW9uIHdpbGwgZmFpbCBvbmx5IGlmIHRoZSBwYXJzZWQgZG9jdW1lbnQgaXMgbm90IHdlbGwgZm9ybWVkIFhNTC4KLSA8cD4KLSB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkIGlmIHRoZSBzcGVjaWZpZWQgY2xhc3Mgd2l0aCB7QGxpbmsgI3NldENsYXNzTmFtZShTdHJpbmcpfSBpcyBub3QgYSBTQVgyCi0gWE1MUmVhZGVyLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Indhcm4iIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmeSBob3cgcGFyc2VyIGVycm9yIGFyZSB0byBiZSBoYW5kbGVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTcGVjaWZ5IGhvdyBwYXJzZXIgZXJyb3IgYXJlIHRvIGJlIGhhbmRsZWQuCi0gPHA+Ci0gSWYgc2V0IHRvIDxjb2RlPnRydWU8L3RydWU+IChkZWZhdWx0KSwgbG9nIGEgd2FybiBtZXNzYWdlIGZvciBlYWNoIFNBWCB3YXJuIGV2ZW50LgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgPC9hdHRyaWJ1dGVzPgotCi0gICAgPGVsZW1lbnRzPgotICAgICAgPGVsZW1lbnQgbmFtZT0ieG1sY2F0YWxvZyIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWE1MQ2F0YWxvZyIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iWE1MQ2F0YWxvZyIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZCBhbiBYTUxDYXRhbG9nIGFzIGEgbmVzdGVkIGVsZW1lbnQ7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVthZGQgYW4gWE1MQ2F0YWxvZyBhcyBhIG5lc3RlZCBlbGVtZW50OyBvcHRpb25hbC5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZXNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1NwZWNpZnkgYSBzZXQgb2YgZmlsZSB0byBiZSBjaGVja2VkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtzcGVjaWZ5IGEgc2V0IG9mIGZpbGUgdG8gYmUgY2hlY2tlZF1dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtObyBkZXNjcmlwdGlvbi5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9ImR0ZCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRFRETG9jYXRpb24iCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IiIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0NyZWF0ZSBhIERURCBsb2NhdGlvbiByZWNvcmQ7IG9wdGlvbmFsLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtDcmVhdGUgYSBEVEQgbG9jYXRpb24gcmVjb3JkOyBvcHRpb25hbC4KLSBUaGlzIHN0b3JlcyB0aGUgbG9jYXRpb24gb2YgYSBEVEQuIFRoZSBEVEQgaXMgaWRlbnRpZmllZAotIGJ5IGl0cyBwdWJsaWMgSWQuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0ieHNsdCIgY2F0ZWdvcnk9InhtbCIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuWFNMVFByb2Nlc3MiCi0gICAgICBtYXRjaGluZ1Rhc2s9InRydWUiPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtQcm9jZXNzZXMgYSBzZXQgb2YgWE1MIGRvY3VtZW50cyB2aWEgWFNMVC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbUHJvY2Vzc2VzIGEgc2V0IG9mIFhNTCBkb2N1bWVudHMgdmlhIFhTTFQuIFRoaXMgaXMKLSB1c2VmdWwgZm9yIGJ1aWxkaW5nIHZpZXdzIG9mIFhNTCBiYXNlZCBkb2N1bWVudGF0aW9uLl1dPgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxzdHJ1Y3R1cmU+Ci0KLSAgICA8YXR0cmlidXRlcz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYmFzZWRpciIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Jhc2UgZGlyZWN0b3J5OyAKLSBvcHRpb25hbCwgZGVmYXVsdCBpcyB0aGUgcHJvamVjdCdzIGJhc2VkaXIuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgYmFzZSBkaXJlY3Rvcnk7IAotIG9wdGlvbmFsLCBkZWZhdWx0IGlzIHRoZSBwcm9qZWN0J3MgYmFzZWRpci4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iUGF0aCIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbT3B0aW9uYWwgY2xhc3NwYXRoIHRvIHRoZSBYU0wgcHJvY2Vzc29yLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBTZXQgdGhlIG9wdGlvbmFsIGNsYXNzcGF0aCB0byB0aGUgWFNMIHByb2Nlc3NvcgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzcGF0aHJlZiIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlJlZmVyZW5jZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbUmVmZXJlbmNlIHRvIGFuIG9wdGlvbmFsIGNsYXNzcGF0aCB0byB0aGUgWFNMIHByb2Nlc3Nvci5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSByZWZlcmVuY2UgdG8gYW4gb3B0aW9uYWwgY2xhc3NwYXRoIHRvIHRoZSBYU0wgcHJvY2Vzc29yCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVzdGRpciIgdHlwZT0iamF2YS5pby5GaWxlIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IkZpbGUiIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0Rlc3RpbmF0aW9uIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBYU0wgcmVzdWx0Ci0gZmlsZXMgc2hvdWxkIGJlIGNvcGllZCB0bzsgCi0gcmVxdWlyZWQsIHVubGVzcyA8dHQ+aW48L3R0PiBhbmQgPHR0Pm91dDwvdHQ+IGFyZQotIHNwZWNpZmllZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgWFNMIHJlc3VsdAotIGZpbGVzIHNob3VsZCBiZSBjb3BpZWQgdG87IAotIHJlcXVpcmVkLCB1bmxlc3MgPHR0PmluPC90dD4gYW5kIDx0dD5vdXQ8L3R0PiBhcmUKLSBzcGVjaWZpZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXh0ZW5zaW9uIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGVzaXJlZCBmaWxlIGV4dGVuc2lvbiB0byBiZSB1c2VkIGZvciB0aGUgdGFyZ2V0OwotIG9wdGlvbmFsLCBkZWZhdWx0IGlzIGh0bWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB0aGUgZGVzaXJlZCBmaWxlIGV4dGVuc2lvbiB0byBiZSB1c2VkIGZvciB0aGUgdGFyZ2V0OwotIG9wdGlvbmFsLCBkZWZhdWx0IGlzIGh0bWwuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZm9yY2UiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0IHdoZXRoZXIgdG8gY2hlY2sgZGVwZW5kZW5jaWVzLCBvciBhbHdheXMgZ2VuZXJhdGU7Ci0gb3B0aW9uYWwsIGRlZmF1bHQgaXMgZmFsc2UuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGNoZWNrIGRlcGVuZGVuY2llcywgb3IgYWx3YXlzIGdlbmVyYXRlOwotIG9wdGlvbmFsLCBkZWZhdWx0IGlzIGZhbHNlLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImluIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU3BlY2lmaWVzIGEgc2luZ2xlIFhNTCBkb2N1bWVudCB0byBiZSBzdHlsZWQuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIHNwZWNpZmllcyBhIHNpbmdsZSBYTUwgZG9jdW1lbnQgdG8gYmUgc3R5bGVkLiBTaG91bGQgYmUgdXNlZCAKLSB3aXRoIHRoZSA8dHQ+b3V0PC90dD4gYXR0cmlidXRlOyA7IHJlcXVpcmVkIGlmIDx0dD5vdXQ8L3R0PiBpcyBzZXQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJvdXQiIHR5cGU9ImphdmEuaW8uRmlsZSIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTcGVjaWZpZXMgdGhlIG91dHB1dCBuYW1lIGZvciB0aGUgc3R5bGVkIHJlc3VsdCBmcm9tIHRoZSAKLSA8dHQ+aW48L3R0PiBhdHRyaWJ1dGU7IHJlcXVpcmVkIGlmIDx0dD5pbjwvdHQ+IGlzIHNldC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU3BlY2lmaWVzIHRoZSBvdXRwdXQgbmFtZSBmb3IgdGhlIHN0eWxlZCByZXN1bHQgZnJvbSB0aGUgCi0gPHR0PmluPC90dD4gYXR0cmlidXRlOyByZXF1aXJlZCBpZiA8dHQ+aW48L3R0PiBpcyBzZXQKLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcm9jZXNzb3IiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iU3RyaW5nIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtOYW1lIG9mIHRoZSBYU0wgcHJvY2Vzc29yIHRvIHVzZTsgb3B0aW9uYWwsIGRlZmF1bHQgdHJheC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgU2V0IHRoZSBuYW1lIG9mIHRoZSBYU0wgcHJvY2Vzc29yIHRvIHVzZTsgb3B0aW9uYWwsIGRlZmF1bHQgdHJheC4KLSBPdGhlciB2YWx1ZXMgYXJlICJ4YWxhbiIgZm9yIFhhbGFuMSBhbmQgInhzbHAiIGZvciBYU0w6UCwgdGhvdWdoIHRoZQotIGxhdGVyIGlzIHN0cm9uZ2x5IGRlcHJlY2F0ZWQuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic2NhbmluY2x1ZGVkZGlyZWN0b3JpZXMiIHR5cGU9ImJvb2xlYW4iCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iYm9vbGVhbiIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbV2hldGhlciB0byBzdHlsZSBhbGwgZmlsZXMgaW4gdGhlIGluY2x1ZGVkIGRpcmVjdG9yaWVzIGFzIHdlbGw7Ci0gb3B0aW9uYWwsIGRlZmF1bHQgaXMgdHJ1ZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgV2hldGhlciB0byBzdHlsZSBhbGwgZmlsZXMgaW4gdGhlIGluY2x1ZGVkIGRpcmVjdG9yaWVzIGFzIHdlbGw7Ci0gb3B0aW9uYWwsIGRlZmF1bHQgaXMgdHJ1ZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdHlsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJTdHJpbmciIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW05hbWUgb2YgdGhlIHN0eWxlc2hlZXQgdG8gdXNlIC0gZ2l2ZW4gZWl0aGVyIHJlbGF0aXZlCi0gdG8gdGhlIHByb2plY3QncyBiYXNlZGlyIG9yIGFzIGFuIGFic29sdXRlIHBhdGg7IHJlcXVpcmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBOYW1lIG9mIHRoZSBzdHlsZXNoZWV0IHRvIHVzZSAtIGdpdmVuIGVpdGhlciByZWxhdGl2ZQotIHRvIHRoZSBwcm9qZWN0J3MgYmFzZWRpciBvciBhcyBhbiBhYnNvbHV0ZSBwYXRoOyByZXF1aXJlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgIDwvYXR0cmlidXRlcz4KLQotICAgIDxlbGVtZW50cz4KLSAgICAgIDxlbGVtZW50IG5hbWU9InhtbGNhdGFsb2ciIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlhNTENhdGFsb2ciCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IlhNTENhdGFsb2ciCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtBZGQgdGhlIGNhdGFsb2cgdG8gb3VyIGludGVybmFsIGNhdGFsb2cuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZCB0aGUgY2F0YWxvZyB0byBvdXIgaW50ZXJuYWwgY2F0YWxvZ11dPgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9lbGVtZW50PgotCi0gICAgICA8ZWxlbWVudCBuYW1lPSJjbGFzc3BhdGgiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgiCi0gICAgICAgICAgICAgICBicmllZlR5cGU9IlBhdGgiCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtPcHRpb25hbCBjbGFzc3BhdGggdG8gdGhlIFhTTCBwcm9jZXNzb3IuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW1NldCB0aGUgb3B0aW9uYWwgY2xhc3NwYXRoIHRvIHRoZSBYU0wgcHJvY2Vzc29yXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9Im91dHB1dHByb3BlcnR5IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5YU0xUUHJvY2Vzcy5PdXRwdXRQcm9wZXJ0eSIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGFuIG91dHB1dCBwcm9wZXJ0eSB0byBiZSBjb25maWd1cmVkLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYW4gb3V0cHV0IHByb3BlcnR5IHRvIGJlIGNvbmZpZ3VyZWQuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICAgIDxlbGVtZW50IG5hbWU9InBhcmFtIiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5YU0xUUHJvY2Vzcy5QYXJhbSIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iIgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQ3JlYXRlIGFuIGluc3RhbmNlIG9mIGFuIFhTTCBwYXJhbWV0ZXIgZm9yIGNvbmZpZ3VyYXRpb24gYnkgQW50Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICA8IVtDREFUQVtDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYW4gWFNMIHBhcmFtZXRlciBmb3IgY29uZmlndXJhdGlvbiBieSBBbnQuXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci0KLQotPHRhc2sgbmFtZT0iemlwIiBjYXRlZ29yeT0icGFja2FnaW5nIgotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5aaXAiCi0gICAgICBtYXRjaGluZ1Rhc2s9InRydWUiPgotCi0gIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtDcmVhdGUgYSBaaXAgZmlsZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbQ3JlYXRlIGEgWmlwIGZpbGUuXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPHN0cnVjdHVyZT4KLQotICAgIDxhdHRyaWJ1dGVzPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJiYXNlZGlyIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRGlyZWN0b3J5IGZyb20gd2hpY2ggdG8gYXJjaGl2ZSBmaWxlczsgb3B0aW9uYWwuXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIERpcmVjdG9yeSBmcm9tIHdoaWNoIHRvIGFyY2hpdmUgZmlsZXM7IG9wdGlvbmFsLgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImNvbXByZXNzIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW1doZXRoZXIgd2Ugd2FudCB0byBjb21wcmVzcyB0aGUgZmlsZXMgb3Igb25seSBzdG9yZSB0aGVtOwotIG9wdGlvbmFsLCBkZWZhdWx0PXRydWU7Ll1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBXaGV0aGVyIHdlIHdhbnQgdG8gY29tcHJlc3MgdGhlIGZpbGVzIG9yIG9ubHkgc3RvcmUgdGhlbTsKLSBvcHRpb25hbCwgZGVmYXVsdD10cnVlOwotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc3RmaWxlIiB0eXBlPSJqYXZhLmlvLkZpbGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iRmlsZSIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbVGhlIGZpbGUgdG8gY3JlYXRlOyByZXF1aXJlZC5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgVGhlIGZpbGUgdG8gY3JlYXRlOyByZXF1aXJlZC4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkdXBsaWNhdGUiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlppcC5EdXBsaWNhdGUiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7YWRkJnF1b3Q7LCAmcXVvdDtwcmVzZXJ2ZSZxdW90OywgJnF1b3Q7ZmFpbCZxdW90OyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbU2V0cyBiZWhhdmlvciBmb3Igd2hlbiBhIGR1cGxpY2F0ZSBmaWxlIGlzIGFib3V0IHRvIGJlIGFkZGVkIC0KLSBvbmUgb2YgPGNvZGU+a2VlcDwvY29kZT4sIDxjb2RlPnNraXA8L2NvZGU+IG9yIDxjb2RlPm92ZXJ3cml0ZTwvY29kZT4uXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgYmVoYXZpb3IgZm9yIHdoZW4gYSBkdXBsaWNhdGUgZmlsZSBpcyBhYm91dCB0byBiZSBhZGRlZCAtCi0gb25lIG9mIDxjb2RlPmtlZXA8L2NvZGU+LCA8Y29kZT5za2lwPC9jb2RlPiBvciA8Y29kZT5vdmVyd3JpdGU8L2NvZGU+LgotIFBvc3NpYmxlIHZhbHVlcyBhcmU6IDxjb2RlPmtlZXA8L2NvZGU+IChrZWVwIGJvdGgKLSBvZiB0aGUgZmlsZXMpOyA8Y29kZT5za2lwPC9jb2RlPiAoa2VlcCB0aGUgZmlyc3QgdmVyc2lvbgotIG9mIHRoZSBmaWxlIGZvdW5kKTsgPGNvZGU+b3ZlcndyaXRlPC9jb2RlPiBvdmVyd3JpdGUgdGhlIGZpbGUKLSB3aXRoIHRoZSBuZXcgZmlsZQotIERlZmF1bHQgZm9yIHppcCB0YXNrcyBpcyA8Y29kZT5rZWVwPC9jb2RlPgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImVuY29kaW5nIiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9IlN0cmluZyIgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbRW5jb2RpbmcgdG8gdXNlIGZvciBmaWxlbmFtZXMsIGRlZmF1bHRzIHRvIHRoZSBwbGF0Zm9ybSdzCi0gZGVmYXVsdCBlbmNvZGluZy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgRW5jb2RpbmcgdG8gdXNlIGZvciBmaWxlbmFtZXMsIGRlZmF1bHRzIHRvIHRoZSBwbGF0Zm9ybSdzCi0gZGVmYXVsdCBlbmNvZGluZy4KLQotIDxwPkZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIHNlZSA8YQotIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrLzEuMi9kb2NzL2d1aWRlL2ludGVybmF0L2VuY29kaW5nLmRvYy5odG1sIj5odHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkay8xLjIvZG9jcy9ndWlkZS9pbnRlcm5hdC9lbmNvZGluZy5kb2MuaHRtbDwvYT4uPC9wPgotICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGVzb25seSIgdHlwZT0iYm9vbGVhbiIKLSAgICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJib29sZWFuIiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtJZiB0cnVlLCBlbXVsYXRlIFN1bidzIGphciB1dGlsaXR5IGJ5IG5vdCBhZGRpbmcgcGFyZW50IGRpcmVjdG9yaWVzOwotIG9wdGlvbmFsLCBkZWZhdWx0cyB0byBmYWxzZS5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgSWYgdHJ1ZSwgZW11bGF0ZSBTdW4ncyBqYXIgdXRpbGl0eSBieSBub3QgYWRkaW5nIHBhcmVudCBkaXJlY3RvcmllczsKLSBvcHRpb25hbCwgZGVmYXVsdHMgdG8gZmFsc2UuCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXBkYXRlIiB0eXBlPSJib29sZWFuIgotICAgICAgICAgICAgICAgICBicmllZlR5cGU9ImJvb2xlYW4iIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRydWUsIHVwZGF0ZXMgYW4gZXhpc3RpbmcgZmlsZSwgb3RoZXJ3aXNlIG92ZXJ3cml0ZQotIGFueSBleGlzdGluZyBvbmU7IG9wdGlvbmFsIGRlZmF1bHRzIHRvIGZhbHNlLl1dPjwvc2hvcnQtZGVzY3JpcHRpb24+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBJZiB0cnVlLCB1cGRhdGVzIGFuIGV4aXN0aW5nIGZpbGUsIG90aGVyd2lzZSBvdmVyd3JpdGUKLSBhbnkgZXhpc3Rpbmcgb25lOyBvcHRpb25hbCBkZWZhdWx0cyB0byBmYWxzZS4KLSAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3aGVuZW1wdHkiIHR5cGU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlppcC5XaGVuRW1wdHkiCi0gICAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iJnF1b3Q7ZmFpbCZxdW90OywgJnF1b3Q7c2tpcCZxdW90OywgJnF1b3Q7Y3JlYXRlJnF1b3Q7IiByZXF1aXJlZD0iTk9UREVGSU5FRCI+Ci0gICAgICAgIDxzaG9ydC1kZXNjcmlwdGlvbj48IVtDREFUQVtTZXRzIGJlaGF2aW9yIG9mIHRoZSB0YXNrIHdoZW4gbm8gZmlsZXMgbWF0Y2guXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIFNldHMgYmVoYXZpb3Igb2YgdGhlIHRhc2sgd2hlbiBubyBmaWxlcyBtYXRjaC4KLSBQb3NzaWJsZSB2YWx1ZXMgYXJlOiA8Y29kZT5mYWlsPC9jb2RlPiAodGhyb3cgYW4gZXhjZXB0aW9uCi0gYW5kIGhhbHQgdGhlIGJ1aWxkKTsgPGNvZGU+c2tpcDwvY29kZT4gKGRvIG5vdCBjcmVhdGUKLSBhbnkgYXJjaGl2ZSwgYnV0IGlzc3VlIGEgd2FybmluZyk7IDxjb2RlPmNyZWF0ZTwvY29kZT4KLSAobWFrZSBhbiBhcmNoaXZlIHdpdGggbm8gZW50cmllcykuCi0gRGVmYXVsdCBmb3IgemlwIHRhc2tzIGlzIDxjb2RlPnNraXA8L2NvZGU+OwotIGZvciBqYXIgdGFza3MsIDxjb2RlPmNyZWF0ZTwvY29kZT4uCi0gICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2F0dHJpYnV0ZT4KLSAgICA8L2F0dHJpYnV0ZXM+Ci0KLSAgICA8ZWxlbWVudHM+Ci0gICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIHNldCBvZiBmaWxlcy5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iemlwZ3JvdXBmaWxlc2V0IiB0eXBlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0IgotICAgICAgICAgICAgICAgYnJpZWZUeXBlPSJGaWxlc2V0IgotICAgICAgICAgICAgICAgcmVxdWlyZWQ9Ik5PVERFRklORUQiPgotICAgICAgICA8c2hvcnQtZGVzY3JpcHRpb24+PCFbQ0RBVEFbQWRkcyBhIGdyb3VwIG9mIHppcCBmaWxlcy5dXT48L3Nob3J0LWRlc2NyaXB0aW9uPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPCFbQ0RBVEFbQWRkcyBhIGdyb3VwIG9mIHppcCBmaWxlcy5dXT4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZWxlbWVudD4KLQotICAgICAgPGVsZW1lbnQgbmFtZT0iemlwZmlsZXNldCIgdHlwZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWmlwRmlsZVNldCIKLSAgICAgICAgICAgICAgIGJyaWVmVHlwZT0iWmlwRmlsZXNldCIKLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJOT1RERUZJTkVEIj4KLSAgICAgICAgPHNob3J0LWRlc2NyaXB0aW9uPjwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZmlsZXMgdGhhdCBjYW4gYmUKLSByZWFkIGZyb20gYW4gYXJjaGl2ZSBhbmQgYmUgZ2l2ZW4gYSBwcmVmaXgvZnVsbHBhdGguXV0+PC9zaG9ydC1kZXNjcmlwdGlvbj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIDwhW0NEQVRBW0FkZHMgYSBzZXQgb2YgZmlsZXMgdGhhdCBjYW4gYmUKLSByZWFkIGZyb20gYW4gYXJjaGl2ZSBhbmQgYmUgZ2l2ZW4gYSBwcmVmaXgvZnVsbHBhdGguXV0+Ci0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2VsZW1lbnQ+Ci0KLSAgICA8L2VsZW1lbnRzPgotCi0gIDwvc3RydWN0dXJlPgotCi08L3Rhc2s+Ci08L3Rhc2tzPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yIENvbnRlbnQgQXNzaXN0IERldi90YXNrcy54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3IgQ29udGVudCBBc3Npc3QgRGV2L3Rhc2tzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI2ZjA0ZS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3IgQ29udGVudCBBc3Npc3QgRGV2L3Rhc2tzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxUQVNLUz4KLQk8VEFTSyBOQU1FPSJhbnQiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7UnVucyBBbnQgb24gYSBzdXBwbGllZCBidWlsZGZpbGUuIFRoaXMgY2FuIGJlIHVzZWQgdG8gYnVpbGQgc3VicHJvamVjdHMuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7V2hlbiB0aGUgJmx0O2kmZ3Q7YW50ZmlsZSZsdDsvaSZndDsgYXR0cmlidXRlIGlzIG9taXR0ZWQsIHRoZSBmaWxlICZhbXA7cXVvdDtidWlsZC54bWwmYW1wO3F1b3Q7Ci1pbiB0aGUgc3VwcGxpZWQgZGlyZWN0b3J5ICgmbHQ7aSZndDtkaXImbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSkgaXMgdXNlZC4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtJZiBubyB0YXJnZXQgYXR0cmlidXRlIGlzIHN1cHBsaWVkLCB0aGUgZGVmYXVsdCB0YXJnZXQgb2YgdGhlIG5ldyBwcm9qZWN0IGlzCi11c2VkLiZsdDsvcCZndDsKLSZsdDtwJmd0O0J5IGRlZmF1bHQsIGFsbCBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGUgY3VycmVudCBwcm9qZWN0IHdpbGwgYmUKLWF2YWlsYWJsZSBpbiB0aGUgbmV3IHByb2plY3QuICAgQWx0ZXJuYXRpdmVseSwgeW91IGNhbgotc2V0IHRoZSAmbHQ7aSZndDtpbmhlcml0QWxsJmx0Oy9pJmd0OyBhdHRyaWJ1dGUgdG8gJmx0O2NvZGUmZ3Q7ZmFsc2UmbHQ7L2NvZGUmZ3Q7IGFuZCBvbmx5Ci0mYW1wO3F1b3Q7dXNlciZhbXA7cXVvdDsgcHJvcGVydGllcyAoaS5lLiwgdGhvc2UgcGFzc2VkIG9uIHRoZSBjb21tYW5kLWxpbmUpCi13aWxsIGJlIHBhc3NlZCB0byB0aGUgbmV3IHByb2plY3QuICBJbiBlaXRoZXIgY2FzZSwgdGhlIHNldCBvZgotcHJvcGVydGllcyBwYXNzZWQgdG8gdGhlIG5ldyBwcm9qZWN0IHdpbGwgb3ZlcnJpZGUgdGhlIHByb3BlcnRpZXMgdGhhdCAKLWFyZSBzZXQgaW4gdGhlIG5ldyBwcm9qZWN0IChTZWUgYWxzbyB0aGUgJmx0O2EgaHJlZj0mcXVvdDtwcm9wZXJ0eS5odG1sJnF1b3Q7Jmd0O3Byb3BlcnR5IHRhc2smbHQ7L2EmZ3Q7KS4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtZb3UgY2FuIGFsc28gc2V0IHByb3BlcnRpZXMgaW4gdGhlIG5ldyBwcm9qZWN0IGZyb20gdGhlIG9sZCBwcm9qZWN0IGJ5Ci11c2luZyBuZXN0ZWQgcHJvcGVydHkgdGFncy4gVGhlc2UgcHJvcGVydGllcyBhcmUgYWx3YXlzIHBhc3NlZCByZWdhcmRsZXNzIG9mIHRoZQotc2V0dGluZyBvZiAmbHQ7aSZndDtpbmhlcml0QWxsJmx0Oy9pJmd0Oy4gIFRoaXMgYWxsb3dzIHlvdSB0byBwYXJhbWV0ZXJpemUgeW91ciBzdWJwcm9qZWN0cy4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtSZWZlcmVuY2VzIHRvIGRhdGEgdHlwZXMgY2FuIGFsc28gYmUgcGFzc2VkIHRvIHRoZSBuZXcgcHJvamVjdCwgYnV0Ci1ieSBkZWZhdWx0IHRoZXkgYXJlIG5vdC4gIElmIHlvdSBzZXQgdGhlIGluaGVyaXRyZWZzIGF0dHJpYnV0ZSB0bwotdHJ1ZSwgYWxsIHJlZmVyZW5jZXMgd2lsbCBiZSBjb3BpZWQsIGJ1dCB0aGV5IHdpbGwgbm90IG92ZXJyaWRlCi1yZWZlcmVuY2VzIGRlZmluZWQgaW4gdGhlIG5ldyBwcm9qZWN0LiZsdDsvcCZndDsKLSZsdDtwJmd0O05lc3RlZCAmbHQ7YSBocmVmPSZxdW90OyNyZWZlcmVuY2UmcXVvdDsmZ3Q7Jmx0O2kmZ3Q7JmFtcDtsdDtyZWZlcmVuY2UmYW1wO2d0OyZsdDsvaSZndDsmbHQ7L2EmZ3Q7IGVsZW1lbnRzCi1jYW4gYWxzbyBiZSB1c2VkIHRvIGNvcHkgcmVmZXJlbmNlcyBmcm9tIHRoZSBjYWxsaW5nIHByb2plY3QgdG8gdGhlCi1uZXcgcHJvamVjdCwgb3B0aW9uYWxseSB1bmRlciBhIGRpZmZlcmVudCBpZC4gIFJlZmVyZW5jZXMgdGFrZW4gZnJvbQotbmVzdGVkIGVsZW1lbnRzIHdpbGwgb3ZlcnJpZGUgZXhpc3RpbmcgcmVmZXJlbmNlcyBpbiB0aGUgbmV3Ci1wcm9qZWN0LiZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0iYW50ZmlsZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj50aGUgYnVpbGRmaWxlIHRvIHVzZS4gRGVmYXVsdHMgdG8mcXVvdDtidWlsZC54bWwmcXVvdDsuICBUaGlzIGZpbGUgaXMgZXhwZWN0ZWQgdG8gYmUgYSBmaWxlbmFtZXJlbGF0aXZlIHRvIHRoZSBkaXIgYXR0cmlidXRlIGdpdmVuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkaXIiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGRpcmVjdG9yeSB0byB1c2UgYXMgYSBiYXNlZGlyIGZvciB0aGUgbmV3IEFudCBwcm9qZWN0LiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBwcm9qZWN0J3MgYmFzZWRpciwgdW5sZXNzaW5oZXJpdGFsbCBoYXMgYmVlbiBzZXQgdG8gZmFsc2UsIGluIHdoaWNoIGNhc2UgaXQgZG9lc24ndGhhdmUgYSBkZWZhdWx0IHZhbHVlLiAgVGhpcyB3aWxsIG92ZXJyaWRlIHRoZSBiYXNlZGlyc2V0dGluZyBvZiB0aGUgY2FsbGVkIHByb2plY3Q8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InRhcmdldCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj50aGUgdGFyZ2V0IG9mIHRoZSBuZXcgQW50IHByb2plY3QgdGhhdCBzaG91bGQgYmUgZXhlY3V0ZWQuRGVmYXVsdHMgdG8gdGhlIG5ldyBwcm9qZWN0J3MgZGVmYXVsdCB0YXJnZXQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im91dHB1dCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5GaWxlbmFtZSB0byB3cml0ZSB0aGUgYW50IG91dHB1dCB0by4gIFRoaXMgaXNyZWxhdGl2ZSB0byB0aGUgdmFsdWUgb2YgdGhlIGRpciBhdHRyaWJ1dGUgaWYgaXQgaGFzIGJlZW4gc2V0IG9ydG8gdGhlIGJhc2UgZGlyZWN0b3J5IG9mIHRoZSBjdXJyZW50IHByb2plY3Qgb3RoZXJ3aXNlLjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5oZXJpdGFsbCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5JZiB0cnVlLCBwYXNzIGFsbCBwcm9wZXJ0aWVzIHRvIHRoZW5ldyBBbnQgcHJvamVjdC4gIERlZmF1bHRzIHRvIHRydWU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImluaGVyaXRyZWZzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPklmIHRydWUsIHBhc3MgYWxsIHJlZmVyZW5jZXMgdG8gdGhlbmV3IEFudCBwcm9qZWN0LiAgRGVmYXVsdHMgdG8gZmFsc2U8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0iYW50Y2FsbCI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtDYWxsIGFub3RoZXIgdGFyZ2V0IHdpdGhpbiB0aGUgc2FtZSBidWlsZC1maWxlIG9wdGlvbmFsbHkgc3BlY2lmeWluZyBzb21lCi1wcm9wZXJ0aWVzIChwYXJhbSdzIGluIHRoaXMgY29udGV4dCkmbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtCeSBkZWZhdWx0LCBhbGwgb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGN1cnJlbnQgcHJvamVjdCB3aWxsIGJlCi1hdmFpbGFibGUgaW4gdGhlIG5ldyBwcm9qZWN0LiAgIEFsdGVybmF0aXZlbHksIHlvdSBjYW4KLXNldCB0aGUgJmx0O2kmZ3Q7aW5oZXJpdEFsbCZsdDsvaSZndDsgYXR0cmlidXRlIHRvICZsdDtjb2RlJmd0O2ZhbHNlJmx0Oy9jb2RlJmd0OyBhbmQgb25seQotJmFtcDtxdW90O3VzZXImYW1wO3F1b3Q7IHByb3BlcnRpZXMgKGkuZS4sIHRob3NlIHBhc3NlZCBvbiB0aGUgY29tbWFuZC1saW5lKQotd2lsbCBiZSBwYXNzZWQgdG8gdGhlIG5ldyBwcm9qZWN0LiAgSW4gZWl0aGVyIGNhc2UsIHRoZSBzZXQgb2YKLXByb3BlcnRpZXMgcGFzc2VkIHRvIHRoZSBuZXcgcHJvamVjdCB3aWxsIG92ZXJyaWRlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgCi1hcmUgc2V0IGluIHRoZSBuZXcgcHJvamVjdCAoU2VlIGFsc28gdGhlICZsdDthIGhyZWY9JnF1b3Q7cHJvcGVydHkuaHRtbCZxdW90OyZndDtwcm9wZXJ0eSB0YXNrJmx0Oy9hJmd0OykuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7WW91IGNhbiBhbHNvIHNldCBwcm9wZXJ0aWVzIGluIHRoZSBuZXcgcHJvamVjdCBmcm9tIHRoZSBvbGQgcHJvamVjdCBieQotdXNpbmcgbmVzdGVkIHBhcmFtIHRhZ3MuIFRoZXNlIHByb3BlcnRpZXMgYXJlIGFsd2F5cyBwYXNzZWQgcmVnYXJkbGVzcyBvZiB0aGUKLXNldHRpbmcgb2YgJmx0O2kmZ3Q7aW5oZXJpdEFsbCZsdDsvaSZndDsuICBUaGlzIGFsbG93cyB5b3UgdG8gcGFyYW1ldGVyaXplIHlvdXIgc3VicHJvamVjdHMuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7TmVzdGVkICZsdDthIGhyZWY9JnF1b3Q7I3JlZmVyZW5jZSZxdW90OyZndDsmbHQ7aSZndDsmYW1wO2x0O3JlZmVyZW5jZSZhbXA7Z3Q7Jmx0Oy9pJmd0OyZsdDsvYSZndDsgZWxlbWVudHMgY2FuCi1iZSB1c2VkIHRvIGNvcHkgcmVmZXJlbmNlcyBmcm9tIHRoZSBjYWxsaW5nIHByb2plY3QgdG8gdGhlIG5ldwotcHJvamVjdCwgb3B0aW9uYWxseSB1bmRlciBhIGRpZmZlcmVudCBpZC4gIFJlZmVyZW5jZXMgdGFrZW4gZnJvbQotbmVzdGVkIGVsZW1lbnRzIHdpbGwgb3ZlcnJpZGUgZXhpc3RpbmcgcmVmZXJlbmNlcyBpbiB0aGUgbmV3Ci1wcm9qZWN0LiZsdDsvcCZndDsKLSZsdDtwJmd0OwotV2hlbiBhIHRhcmdldCBpcyBpbnZva2VkIGJ5IGFudGNhbGwsIGFsbCBvZiBpdHMgZGVwZW5kZW50IHRhcmdldHMgd2lsbAotYWxzbyBiZSBjYWxsZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIGFueSBuZXcgcGFyYW1ldGVycy4gRm9yIGV4YW1wbGUuIGlmCi10aGUgdGFyZ2V0ICZhbXA7cXVvdDtkb1NvbWV0aGluZ0Vsc2UmYW1wO3F1b3Q7IGRlcGVuZGVkIG9uIHRoZSB0YXJnZXQgJmFtcDtxdW90O2luaXQmYW1wO3F1b3Q7LCB0aGVuIHRoZSAKLSZsdDtpJmd0O2FudGNhbGwmbHQ7L2kmZ3Q7IG9mICZhbXA7cXVvdDtkb1NvbWV0aGluZ0Vsc2UmYW1wO3F1b3Q7IHdpbGwgY2FsbCAmYW1wO3F1b3Q7aW5pdCZhbXA7cXVvdDsgZHVyaW5nIHRoZSBjYWxsLiAKLU9mIGNvdXJzZSwgYW55IHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGUgYW50Y2FsbCB0YXNrIG9yIGluaGVyaXRlZCBmcm9tIHRoZSBjYWxsaW5nIHRhcmdldCAKLXdpbGwgYmUgZml4ZWQgYW5kIG5vdCBvdmVycmlkYWJsZSBpbiB0aGUgaW5pdCB0YXNrIC1vciBpbmRlZWQgaW4gdGhlICZhbXA7cXVvdDtkb1NvbWV0aGluZ0Vsc2UmYW1wO3F1b3Q7IHRhc2suICAKLSZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0idGFyZ2V0IiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj5UaGUgdGFyZ2V0IHRvIGV4ZWN1dGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImluaGVyaXRhbGwiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+SWYgdHJ1ZSwgcGFzcyBhbGwgcHJvcGVydGllcyB0byB0aGUgbmV3IEFudHByb2plY3QuICBEZWZhdWx0cyB0byB0cnVlLjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5oZXJpdHJlZnMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+SWYgdHJ1ZSwgcGFzcyBhbGwgcmVmZXJlbmNlcyB0byB0aGVuZXcgQW50IHByb2plY3QuICBEZWZhdWx0cyB0byBmYWxzZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJhbnRzdHJ1Y3R1cmUiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7R2VuZXJhdGVzIGEgRFREIGZvciBBbnQgYnVpbGRmaWxlcyB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbgotYWJvdXQgYWxsIHRhc2tzIGN1cnJlbnRseSBrbm93biB0byBBbnQuJmx0Oy9wJmd0OyAKLSZsdDtwJmd0O05vdGUgdGhhdCB0aGUgRFREIGdlbmVyYXRlZCBieSB0aGlzIHRhc2sgaXMgaW5jb21wbGV0ZSwgeW91IGNhbgotYWx3YXlzIGFkZCBYTUwgZW50aXRpZXMgdXNpbmcgJmx0O2EKLWhyZWY9JnF1b3Q7dGFza2RlZi5odG1sJnF1b3Q7Jmd0OyZsdDtjb2RlJmd0OyZhbXA7bHQ7dGFza2RlZiZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyZsdDsvYSZndDsgb3IgJmx0O2EKLWhyZWY9JnF1b3Q7dHlwZWRlZi5odG1sJnF1b3Q7Jmd0OyZsdDtjb2RlJmd0OyZhbXA7bHQ7dHlwZWRlZiZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyZsdDsvYSZndDsuIFNlZSAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LnNkdi5mci9wYWdlcy9jYXNhL2h0bWwvYW50LWR0ZC5lbi5odG1sJnF1b3Q7Ci10YXJnZXQ9JnF1b3Q7X3RvcCZxdW90OyZndDtoZXJlJmx0Oy9hJmd0OyBmb3IgYSB3YXkgdG8gZ2V0IGFyb3VuZCB0aGlzIHByb2JsZW0uJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7VGhpcyB0YXNrIGRvZXNuJ3Qga25vdyBhYm91dCByZXF1aXJlZCBhdHRyaWJ1dGVzLCBhbGwgd2lsbCBiZQotbGlzdGVkIGFzICZsdDtjb2RlJmd0OyNJTVBMSUVEJmx0Oy9jb2RlJmd0Oy4mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9Im91dHB1dCIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+ZmlsZSB0byB3cml0ZSB0aGUgRFREIHRvPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9ImFwcGx5Ij4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0V4ZWN1dGVzIGEgc3lzdGVtIGNvbW1hbmQuIFdoZW4gdGhlICZsdDtpJmd0O29zJmx0Oy9pJmd0OyBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCB0aGVuCi10aGUgY29tbWFuZCBpcyBvbmx5IGV4ZWN1dGVkIHdoZW4gQW50IGlzIHJ1biBvbiBvbmUgb2YgdGhlIHNwZWNpZmllZCBvcGVyYXRpbmcKLXN5c3RlbXMuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7VGhlIGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyBvZiBhIG51bWJlciBvZiAmbHQ7YQotaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sJnF1b3Q7Jmd0O0ZpbGVTZXQmbHQ7L2EmZ3Q7cyBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cwotdG8gdGhlIHN5c3RlbSBjb21tYW5kLiZsdDsvcCZndDsKLSZsdDtwJmd0O0lmIHlvdSBzcGVjaWZ5IGEgbmVzdGVkICZsdDthCi1ocmVmPSZxdW90Oy4uL0NvcmVUeXBlcy9tYXBwZXIuaHRtbCZxdW90OyZndDttYXBwZXImbHQ7L2EmZ3Q7IGFuZCB0aGUgJmx0O2kmZ3Q7ZGVzdCZsdDsvaSZndDsgYXR0cmlidXRlLAotdGhlIHRpbWVzdGFtcCBvZiBlYWNoIHNvdXJjZSBmaWxlIGlzIGNvbXBhcmVkIHRvIHRoZSB0aW1lc3RhbXAgb2YgYQotdGFyZ2V0IGZpbGUgd2hpY2ggaXMgZGVmaW5lZCBieSB0aGUgbmVzdGVkIG1hcHBlciBlbGVtZW50IGFuZCBzZWFyY2hlZAotZm9yIGluIHRoZSBnaXZlbiBkZXN0LiZsdDsvcCZndDsKLSZsdDtwJmd0O0F0IGxlYXN0IG9uZSBmaWxlc2V0IGlzIHJlcXVpcmVkLCBhbmQgeW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuCi1vbmUgbWFwcGVyLiZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0iZXhlY3V0YWJsZSIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGNvbW1hbmQgdG8gZXhlY3V0ZSB3aXRob3V0IGFueSBjb21tYW5kIGxpbmVhcmd1bWVudHM8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImRlc3QiIFJFUVVJUkVEPSJ5ZXMsIGlmIHlvdSBzcGVjaWZ5IGEgbmVzdGVkIG1hcHBlciI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgJmx0O2FwcGx5Jmd0OyBleHBlY3RzIHRoZSB0YXJnZXQgZmlsZXMgd2lsbCBiZSBwbGFjZWQgYnkgdGhlIGNvbW1hbmQsIHdoZW4gaXQgaXMgZXhlY3V0ZWQuIDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZGlyIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGNvbW1hbmQgc2hvdWxkIGJlIGV4ZWN1dGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJyZWxhdGl2ZSIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0IGlzIGZhbHNlIj4KLQkJCTxERVNDUklQVElPTj53aGV0aGVyIHRoZSBmaWxlbmFtZXMgc2hvdWxkIGJlIHBhc3NlZCBvbiB0aGVjb21tYW5kIGxpbmUgYXMgYWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aG5hbWVzIChyZWxhdGl2ZSB0byB0aGViYXNlIGRpcmVjdG9yeSBvZiB0aGUgY29ycmVzcG9uZGluZyBmaWxlc2V0IGZvciBzb3VyY2UgZmlsZXMgb3J0aGUgZGVzdCBhdHRyaWJ1dGUgZm9yIHRhcmdldCBmaWxlcyk8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im9zIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmxpc3Qgb2YgT3BlcmF0aW5nIFN5c3RlbXMgb24gd2hpY2ggdGhlIGNvbW1hbmQgbWF5IGJlZXhlY3V0ZWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im91dHB1dCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj50aGUgZmlsZSB0byB3aGljaCB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kIHNob3VsZCBiZXJlZGlyZWN0ZWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im91dHB1dHByb3BlcnR5IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgcHJvcGVydHkgaW4gd2hpY2ggdGhlIG91dHB1dCBvZiB0aGUgY29tbWFuZCBzaG91bGQgYmUgc3RvcmVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ0aW1lb3V0IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlN0b3AgdGhlIGNvbW1hbmQgaWYgaXQgZG9lc24ndCBmaW5pc2ggd2l0aGluIHRoZXNwZWNpZmllZCB0aW1lIChnaXZlbiBpbiBtaWxsaXNlY29uZHMpPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJmYWlsb25lcnJvciIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TdG9wIHRoZSBidWlsZHByb2Nlc3MgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBhcmV0dXJuY29kZSBvdGhlciB0aGFuIDA8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InNraXBlbXB0eWZpbGVzZXRzIiBSRVFVSVJFRD0ibm8sIGRlZmF1bHQgaXMgZmFsc2UiPgotCQkJPERFU0NSSVBUSU9OPkRvbid0IHJ1biB0aGUgY29tbWFuZCwgaWYgbm8gc291cmNlIGZpbGVzIGhhdmViZWVuIGZvdW5kIG9yIGFyZSBuZXdlciB0aGFuIHRoZWlyIGNvcnJlc3BvbmRpbmcgdGFyZ2V0ZmlsZXM8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InBhcmFsbGVsIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlJ1biB0aGUgY29tbWFuZCBvbmx5IG9uY2UsIGFwcGVuZGluZyBhbGwgZmlsZXMgYXNhcmd1bWVudHMuIElmIGZhbHNlLCBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgb25jZSBmb3IgZXZlcnkgZmlsZS4gRGVmYXVsdHMgdG8gZmFsc2UuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ0eXBlIiBSRVFVSVJFRD0ibm8sIGRlZmF1bHQgaXMgZmlsZSI+Ci0JCQk8REVTQ1JJUFRJT04+T25lIG9mIGZpbGUsIGRpciBvcmJvdGguIElmIHNldCB0byBmaWxlLCBvbmx5IHRoZSBuYW1lcyBvZiBwbGFpbmZpbGVzIHdpbGwgYmUgc2VudCB0byB0aGUgY29tbWFuZC4gSWYgc2V0IHRvIGRpciwgb25seXRoZSBuYW1lcyBvZiBkaXJlY3RvcmllcyBhcmUgY29uc2lkZXJlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibmV3ZW52aXJvbm1lbnQiIFJFUVVJUkVEPSJubywgZGVmYXVsdCBpcyBmYWxzZSI+Ci0JCQk8REVTQ1JJUFRJT04+RG8gbm90IHByb3BhZ2F0ZSBvbGQgZW52aXJvbm1lbnQgd2hlbiBuZXcgZW52aXJvbm1lbnR2YXJpYWJsZXMgYXJlIHNwZWNpZmllZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idm1sYXVuY2hlciIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0IGlzIHRydWUiPgotCQkJPERFU0NSSVBUSU9OPlJ1biBjb21tYW5kIHVzaW5nIHRoZSBKYXZhIFZNJ3MgZXhlY3V0aW9uIGZhY2lsaXRpZXN3aGVyZSBhdmFpbGFibGUuIElmIHNldCB0byBmYWxzZSB0aGUgdW5kZXJseWluZyBPUydzIHNoZWxsLGVpdGhlciBkaXJlY3RseSBvciB0aHJvdWdoIHRoZSBhbnRSdW4gc2NyaXB0cywgd2lsbCBiZSB1c2VkLlVuZGVyIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMsIHRoaXMgZ2l2ZXMgYWNjZXNzIHRvIGZhY2lsaXRpZXNub3Qgbm9ybWFsbHkgYXZhaWxhYmxlIHRocm91Z2ggdGhlIFZNIGluY2x1ZGluZywgdW5kZXIgV2luZG93cyxiZWluZyBhYmxlIHRvIGV4ZWN1dGUgc2NyaXB0cywgcmF0aGVyIHRoYW4gdGhlaXIgYXNzb2NpYXRlZGludGVycHJldGVyLiAgSWYgeW91IHdhbnQgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGVleGVjdXRhYmxlIGFzIGEgcmVsYXRpdmUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IGdpdmVuIGJ5IHRoZWRpciBhdHRyaWJ1dGUsIGl0IG1heSBiZWNvbWUgbmVjZXNzYXJ5IHRvIHNldCB2bWxhdW5jaGVyIHRvZmFsc2UgYXMgd2VsbDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJhdmFpbGFibGUiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7U2V0cyBhIHByb3BlcnR5IGlmIGEgcmVzb3VyY2UgaXMgYXZhaWxhYmxlIGF0IHJ1bnRpbWUuIFRoaXMgcmVzb3VyY2UgY2FuIGJlIGEKLWZpbGUsIGEgZGlyZWN0b3J5LCBhIGNsYXNzIGluIHRoZSBjbGFzc3BhdGgsIG9yIGEgSlZNIHN5c3RlbSByZXNvdXJjZS4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtJZiB0aGUgcmVzb3VyY2UgaXMgcHJlc2VudCwgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHNldCB0byB0cnVlIGJ5Ci1kZWZhdWx0OyBvdGhlcndpc2UsIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc2V0LiBZb3UgY2FuIHNldCB0aGUgdmFsdWUgdG8KLXNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IGJ5IHNwZWNpZnlpbmcgdGhlICZsdDtjb2RlJmd0O3ZhbHVlJmx0Oy9jb2RlJmd0OyBhdHRyaWJ1dGUuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Tm9ybWFsbHksIHRoaXMgdGFzayBpcyB1c2VkIHRvIHNldCBwcm9wZXJ0aWVzIHRoYXQgYXJlIHVzZWZ1bCB0byBhdm9pZCB0YXJnZXQKLWV4ZWN1dGlvbiBkZXBlbmRpbmcgb24gc3lzdGVtIHBhcmFtZXRlcnMuJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJwcm9wZXJ0eSIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idmFsdWUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIHZhbHVlIHRvIHNldCB0aGUgcHJvcGVydHkgdG8uIERlZmF1bHRzIHRvICZxdW90O3RydWUmcXVvdDs8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNsYXNzbmFtZSIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGNsYXNzIHRvIGxvb2sgZm9yIGluIHRoZSBjbGFzc3BhdGg8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZpbGUiIFJFUVVJUkVEPSIiPgotCQkJPERFU0NSSVBUSU9OPlRoZSBmaWxlIHRvIGxvb2sgZm9yPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJyZXNvdXJjZSIgUkVRVUlSRUQ9IiI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIHJlc291cmNlIHRvIGxvb2sgZm9yIGluIHRoZSBKVk08L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNsYXNzcGF0aCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5UaGUgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvb2tpbmcgdXAgY2xhc3NuYW1lIG9yIHJlc291cmNlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJmaWxlcGF0aCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5UaGUgcGF0aCB0byB1c2Ugd2hlbiBsb29raW5nIHVwIGZpbGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNsYXNzcGF0aHJlZiIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5UaGUgY2xhc3NwYXRoIHRvIHVzZSwgZ2l2ZW4gYXMgYSByZWZlcmVuY2UgdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ0eXBlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlRoZSB0eXBlIG9mIGZpbGUgdG8gbG9vayBmb3IsIGVpdGhlciBhIGRpcmVjdG9yeSAodHlwZT0mcXVvdDtkaXImcXVvdDspIG9yIGEgZmlsZSh0eXBlPSZxdW90O2ZpbGUmcXVvdDspLiBJZiBub3Qgc2V0LCB0aGUgcHJvcGVydHkgd2lsbCBiZSBzZXQgaWYgdGhlIG5hbWUgc3BlY2lmaWVkIGluIHRoZSBmaWxlYXR0cmlidXRlIGV4aXN0cyBhcyBlaXRoZXIgYSBmaWxlIG9yIGEgZGlyZWN0b3J5PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJpZ25vcmVzeXN0ZW1jbGFzc2VzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPklnbm9yZSBBbnQncyBydW50aW1lIGNsYXNzZXMsIHVzaW5nIG9ubHkgdGhlIHNwZWNpZmllZGNsYXNzcGF0aC4gIE9ubHkgYWZmZWN0cyB0aGUgJnF1b3Q7Y2xhc3NuYW1lJnF1b3Q7IGF0dHJpYnV0ZS4gIERlZmF1bHRzIHRvICZxdW90O2ZhbHNlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9ImJhc2VuYW1lIj4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0OwotVGFzayB0byBkZXRlcm1pbmUgdGhlIGJhc2VuYW1lIG9mIGEgc3BlY2lmaWVkIGZpbGUsIG9wdGlvbmFsbHkgbWludXMgYQotc3BlY2lmaWVkIHN1ZmZpeC4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotV2hlbiB0aGlzIHRhc2sgZXhlY3V0ZXMsIGl0IHdpbGwgc2V0IHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgdG8gdGhlCi12YWx1ZSBvZiB0aGUgbGFzdCBwYXRoIGVsZW1lbnQgb2YgdGhlIHNwZWNpZmllZCBmaWxlLiBJZiAmbHQ7Y29kZSZndDtmaWxlJmx0Oy9jb2RlJmd0OyBpcyBhCi1kaXJlY3RvcnksIHRoZSBiYXNlbmFtZSB3aWxsIGJlIHRoZSBsYXN0IGRpcmVjdG9yeSBlbGVtZW50LiBJZgotJmx0O2NvZGUmZ3Q7ZmlsZSZsdDsvY29kZSZndDsgaXMgYSBmdWxsLXBhdGgsIHJlbGF0aXZlLXBhdGgsIG9yIHNpbXBsZSBmaWxlbmFtZSwKLXRoZSBiYXNlbmFtZSB3aWxsIGJlIHRoZSBzaW1wbGUgZmlsZSBuYW1lLCB3aXRob3V0IGFueSBkaXJlY3RvcnkgZWxlbWVudHMuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsgCi08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9ImZpbGUiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPlRoZSBwYXRoIHRvIHRha2UgdGhlIGJhc2VuYW1lIG9mPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJwcm9wZXJ0eSIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ic3VmZml4IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlRoZSBzdWZmaXggdG8gcmVtb3ZlIGZyb20gdGhlIHJlc3VsdGluZyBiYXNlbmFtZShzcGVjaWZpZWQgZWl0aGVyIHdpdGggb3Igd2l0aG91dCB0aGUgJnF1b3Q7LiZxdW90Oyk8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0iYnVpbGRudW1iZXIiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7VGhpcyBpcyBhIGJhc2ljIHRhc2sgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjayBidWlsZCBudW1iZXJzLiZsdDsvcCZndDsKLSZsdDtwJmd0O0l0IHdpbGwgZmlyc3QgYXR0ZW1wdCB0byByZWFkIGEgYnVpbGQgbnVtYmVyIGZyb20gYSBmaWxlIChieSBkZWZhdWx0LAotJmx0O2NvZGUmZ3Q7YnVpbGQubnVtYmVyJmx0Oy9jb2RlJmd0OyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkpLCB0aGVuCi1zZXQgdGhlIHByb3BlcnR5ICZsdDtjb2RlJmd0O2J1aWxkLm51bWJlciZsdDsvY29kZSZndDsgdG8gdGhlIHZhbHVlIHRoYXQgd2FzIHJlYWQgaW4KLShvciB0byAmbHQ7Y29kZSZndDswJmx0Oy9jb2RlJmd0OywgaWYgbm8gc3VjaCB2YWx1ZSkuIEl0IHdpbGwgdGhlbiBpbmNyZW1lbnQgdGhlCi1udW1iZXIgYnkgb25lIGFuZCB3cml0ZSBpdCBiYWNrIG91dCB0byB0aGUgZmlsZS4KLShTZWUgdGhlCi0mbHQ7YSBocmVmPSZxdW90Oy4uL09wdGlvbmFsVGFza3MvcHJvcGVydHlmaWxlLmh0bWwmcXVvdDsmZ3Q7UHJvcGVydHlGaWxlJmx0Oy9hJmd0OyB0YXNrCi1pZiB5b3UgbmVlZCBmaW5lciBjb250cm9sIG92ZXIgdGhpbmdzIHN1Y2ggYXMgdGhlIHByb3BlcnR5IG5hbWUgb3IKLXRoZSBudW1iZXIgZm9ybWF0LikKLSZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0iZmlsZSIgUkVRVUlSRUQ9Im5vOyBkZWZhdWx0cyB0byAmcXVvdDtidWlsZC5udW1iZXImcXVvdDsiPgotCQkJPERFU0NSSVBUSU9OPlRoZSBmaWxlIHRvIHJlYWQgYW5kIHdyaXRlIHRoZSBidWlsZCBudW1iZXIgZnJvbS90bzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJjaGFuZ2Vsb2ciPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7R2VuZXJhdGVzIGFuIFhNTC1mb3JtYXR0ZWQgcmVwb3J0IGZpbGUgb2YgdGhlIGNoYW5nZSBsb2dzIHJlY29yZGVkIGluIGEKLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5jdnNob21lLm9yZy8mcXVvdDsgdGFyZ2V0PSZxdW90O190b3AmcXVvdDsmZ3Q7Q1ZTJmx0Oy9hJmd0OyByZXBvc2l0b3J5LiAmbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9ImRpciIgUkVRVUlSRUQ9Im5vOyBkZWZhdWx0cyB0byAke2Jhc2VkaXJ9LiI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHRvIHJ1biB0aGUgQ1ZTIGxvZ2NvbW1hbmQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImRlc3RmaWxlIiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj5UaGUgZmlsZSBpbiB3aGljaCB0byB3cml0ZSB0aGUgY2hhbmdlIGxvZyByZXBvcnQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InVzZXJzZmlsZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5Qcm9wZXJ0eSBmaWxlIHRoYXQgY29udGFpbnMgbmFtZS12YWx1ZSBwYWlycyBtYXBwaW5ndXNlciBJRHMgYW5kIG5hbWVzIHRoYXQgc2hvdWxkIGJlIHVzZWQgaW4gdGhlIHJlcG9ydCBpbiBwbGFjZSBvZnRoZSB1c2VyIElEPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkYXlzaW5wYXN0IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlNldHMgdGhlIG51bWJlciBvZiBkYXlzIGludG8gdGhlIHBhc3QgZm9yIHdoaWNoIHRoZWNoYW5nZSBsb2cgaW5mb3JtYXRpb24gc2hvdWxkIGJlIHJldHJpZXZlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ic3RhcnQiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGVhcmxpZXN0IGRhdGUgZnJvbSB3aGljaCBjaGFuZ2UgbG9ncyBhcmUgdG8gYmVpbmNsdWRlZCBpbiB0aGUgcmVwb3J0PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJlbmQiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGxhdGVzdCBkYXRlIHRvIHdoaWNoIGNoYW5nZSBsb2dzIGFyZSB0byBiZWluY2x1ZGVkIGluIHRoZSByZXBvcnQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0iY2hlY2tzdW0iPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7Ci1HZW5lcmF0ZXMgY2hlY2tzdW0gZm9yIGZpbGVzLiAgVGhpcyB0YXNrIGNhbiBhbHNvIGJlIHVzZWQgdG8KLXBlcmZvcm0gY2hlY2tzdW0gdmVyaWZpY2F0aW9ucy4KLSZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0iZmlsZSIgUkVRVUlSRUQ9Im9uZSBvZiBlaXRoZXIgZmlsZSBvcgotICAgICBhdCBsZWFzdCBvbmUgbmVzdGVkIGZpbGVzZXQgZWxlbWVudC4iPgotCQkJPERFU0NSSVBUSU9OPlRoZSBmaWxlIHRvIGdlbmVyYXRlIGNoZWNrc3VtIGZvcjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iYWxnb3JpdGhtIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlNwZWNpZmllcyB0aGUgYWxnb3JpdGhtIHRvIGJlIHVzZWQgdG9jb21wdXRlIHRoZSBjaGVja3N1bS4gRGVmYXVsdHMgdG8gJnF1b3Q7TUQ1JnF1b3Q7Lk90aGVyIHBvcHVsYXIgYWxnb3JpdGhtcyBsaWtlICZxdW90O1NIQSZxdW90OyBtYXkgYmUgdXNlZGFzIHdlbGwuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJwcm92aWRlciIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TcGVjaWZpZXMgdGhlIHByb3ZpZGVyIG9mIHRoZSBhbGdvcml0aG08L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZpbGVleHQiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGdlbmVyYXRlZCBjaGVja3N1bSBmaWxlJ3MgbmFtZSB3aWxsIGJlIHRoZW9yaWdpbmFsIGZpbGVuYW1lIHdpdGggJnF1b3Q7LiZxdW90OyBhbmQgZmlsZWV4dCBhZGRlZCB0byBpdC5EZWZhdWx0cyB0byB0aGUgYWxnb3JpdGhtIG5hbWUgYmVpbmcgdXNlZC48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InByb3BlcnR5IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgc2V0d2l0aCB0aGUgZ2VuZXJhdGVkIGNoZWNrc3VtIHZhbHVlLiAgVGhpcyBjYW5ub3QgYmUgc3BlY2lmaWVkd2hlbiBmaWxlZXh0IGlzIGJlaW5nIHVzZWQgb3Igd2hlbiB0aGUgbnVtYmVyIG9mIGZpbGVzZm9yIHdoaWNoIGNoZWNrc3VtcyBpcyB0byBiZSBnZW5lcmF0ZWQgaXMgZ3JlYXRlciB0aGFuIDEuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJmb3JjZW92ZXJ3cml0ZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5PdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMgZXZlbiBpZiB0aGUgZGVzdGluYXRpb25maWxlcyBhcmUgbmV3ZXIuIERlZmF1bHRzIHRvICZxdW90O25vJnF1b3Q7PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ2ZXJpZnlwcm9wZXJ0eSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNldHdpdGggJnF1b3Q7dHJ1ZSZxdW90OyBvciAmcXVvdDtmYWxzZSZxdW90OyBkZXBlbmRpbmcgdXBvbiB3aGV0aGVydGhlIGdlbmVyYXRlZCBjaGVja3N1bSBtYXRjaGVzIHRoZSBleGlzdGluZyBjaGVja3N1bS4gIFdoZW50aGlzIGlzIHNldCwgdGhlIGdlbmVyYXRlZCBjaGVja3N1bSBpcyBub3Qgd3JpdHRlbiB0byBhIGZpbGUgb3Jwcm9wZXJ0eSwgYnV0IHJhdGhlciwgdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUgb3IgcHJvcGVydHkgaXMgdXNlZCB0b2NoZWNrIGFnYWluc3QgdGhlIGdlbmVyYXRlZCBjaGVja3N1bS48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InJlYWRidWZmZXJzaXplIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlRoZSBzaXplIG9mIHRoZSBidWZmZXIgKWluIGJ5dGVzKSB0byB1c2Ugd2hlbnJlYWRpbmcgYSBmaWxlLiBEZWZhdWx0cyB0byAmcXVvdDs4MTkyJnF1b3Q7IC0geW91IG1heSBnZXQgYWJldHRlciBwZXJmb3JtYW5jZSBvbiBiaWcgZmlsZXMgaWYgeW91IGluY3JlYXNlIHRoaXMgdmFsdWU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0iY2htb2QiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7Q2hhbmdlcyB0aGUgcGVybWlzc2lvbnMgb2YgYSBmaWxlIG9yIGFsbCBmaWxlcyBpbnNpZGUgc3BlY2lmaWVkIGRpcmVjdG9yaWVzLiBSaWdodCBub3cgaXQgaGFzIGVmZmVjdCBvbmx5IHVuZGVyIFVuaXguCi1UaGUgcGVybWlzc2lvbnMgYXJlIGFsc28gVU5JWCBzdHlsZSwgbGlrZSB0aGUgYXJndW1lbnQgZm9yIHRoZSBjaG1vZCBjb21tYW5kLiZsdDsvcCZndDsKLSZsdDtwJmd0O1NlZSB0aGUgc2VjdGlvbiBvbiAmbHQ7YSBocmVmPSZxdW90Oy4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyZxdW90OyZndDtkaXJlY3RvcnkgYmFzZWQKLXRhc2tzJmx0Oy9hJmd0Oywgb24gaG93IHRoZSBpbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvCi13cml0ZSBwYXR0ZXJucy4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtUaGlzIHRhc2sgaG9sZHMgYW4gaW1wbGljaXQgJmx0O2EgaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sJnF1b3Q7Jmd0O0ZpbGVTZXQmbHQ7L2EmZ3Q7IGFuZAotc3VwcG9ydHMgYWxsIG9mIEZpbGVTZXQncyBhdHRyaWJ1dGVzIGFuZCBuZXN0ZWQgZWxlbWVudHMKLWRpcmVjdGx5LiBNb3JlIEZpbGVTZXRzIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcgbmVzdGVkCi0mbHQ7Y29kZSZndDsmYW1wO2x0O2ZpbGVzZXQmYW1wO2d0OyZsdDsvY29kZSZndDsgZWxlbWVudHMuJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJmaWxlIiBSRVFVSVJFRD0iZXhhY3RseSBvbmUgb2YgdGhlIHR3byBvciBuZXN0ZWQgJmx0O2ZpbGVzZXQmZ3Q7IGVsZW1lbnRzLiI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGZpbGUgb3Igc2luZ2xlIGRpcmVjdG9yeSBvZiB3aGljaCB0aGUgcGVybWlzc2lvbnMgbXVzdCBiZSBjaGFuZ2VkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkaXIiIFJFUVVJUkVEPSIiPgotCQkJPERFU0NSSVBUSU9OPnRoZSBkaXJlY3Rvcnkgd2hpY2ggaG9sZHMgdGhlIGZpbGVzIHdob3NlIHBlcm1pc3Npb25zIG11c3QgYmUgY2hhbmdlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0icGVybSIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIG5ldyBwZXJtaXNzaW9uczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZWluY2x1ZGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJleGNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlZXhjbHVkZWQuIE5vIGZpbGVzIChleGNlcHQgZGVmYXVsdCBleGNsdWRlcykgYXJlIGV4Y2x1ZGVkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZGVmYXVsdGV4Y2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90KCZxdW90O3llcyZxdW90Oy8mcXVvdDtubyZxdW90OykuIERlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbiBvbWl0dGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJwYXJhbGxlbCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5wcm9jZXNzIGFsbCBzcGVjaWZpZWQgZmlsZXMgdXNpbmcgYSBzaW5nbGVjaG1vZCBjb21tYW5kLiBEZWZhdWx0cyB0byB0cnVlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ0eXBlIiBSRVFVSVJFRD0ibm8sIGRlZmF1bHQgaXMgZmlsZSI+Ci0JCQk8REVTQ1JJUFRJT04+T25lIG9mIGZpbGUsIGRpciBvcmJvdGguIElmIHNldCB0byBmaWxlLCBvbmx5IHRoZSBwZXJtaXNzaW9ucyBvZnBsYWluIGZpbGVzIGFyZSBnb2luZyB0byBiZSBjaGFuZ2VkLiBJZiBzZXQgdG8gZGlyLCBvbmx5dGhlIGRpcmVjdG9yaWVzIGFyZSBjb25zaWRlcmVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9ImNvbmNhdCI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDsKLUNvbmNhdGVuYXRlcyBhIGZpbGUsIG9yIGEgc2VyaWVzIG9mIGZpbGVzLCB0byBhIHNpbmdsZSBmaWxlIG9yCi10aGUgY29uc29sZS4gVGhlIGRlc3RpbmF0aW9uIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGlmIGl0IGRvZXMKLW5vdCBleGlzdCwgdGhvdWdoIHRoZSB0aGUgJmx0O3ZhciZndDthcHBlbmQmbHQ7L3ZhciZndDsgYXR0cmlidXRlIG1heSBiZQotdXNlZCB0byBhbHRlciB0aGlzIGJlaGF2aW9yLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0mbHQ7YSBocmVmPSZxdW90Oy4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwmcXVvdDsmZ3Q7RmlsZVNldCZsdDsvYSZndDtzIGFuZC9vciAmbHQ7YQotaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvZmlsZWxpc3QuaHRtbCZxdW90OyZndDtGaWxlTGlzdCZsdDsvYSZndDtzIGFyZSB1c2VkIHRvCi1zZWxlY3Qgd2hpY2ggZmlsZXMgYXJlIHRvIGJlIGNvbmNhdGVuYXRlZC4gVGhlcmUgaXMgbm8KLXNpbmd1bGFyICdmaWxlJyBhdHRyaWJ1dGUgdG8gc3BlY2lmeSBhIHNpbmdsZSBmaWxlIHRvIGNhdCAtLSBhCi1maWxlc2V0IG9yIGZpbGVsaXN0IG11c3QgYWxzbyBiZSB1c2VkIGluIHRoZXNlIGNhc2VzLgotJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJkZXN0ZmlsZSIgUkVRVUlSRUQ9Im5vCi0gCSAgIj4KLQkJCTxERVNDUklQVElPTj5UaGUgZGVzdGluYXRpb24gZmlsZSBmb3IgdGhlIGNvbmNhdGVuYXRlZCBzdHJlYW0uSWYgbm90IHNwZWNpZmllZCB0aGUgY29uc29sZSB3aWxsIGJlIHVzZWQgaW5zdGVhZC48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImFwcGVuZCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIGZpbGUgc3BlY2lmaWVkIGJ5ICdkZXN0ZmlsZSdzaG91bGQgYmUgb3ZlcndyaXR0ZW4uIERlZmF1bHRzIHRvICZxdW90O25vJnF1b3Q7LjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZW5jb2RpbmciIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U3BlY2lmaWVzIHRoZSBlbmNvZGluZyBmb3IgdGhlIGlucHV0IGZpbGVzLiBQbGVhc2Ugc2VlIGh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamRrLzEuMi9kb2NzL2d1aWRlL2ludGVybmF0L2VuY29kaW5nLmRvYy5odG1sZm9yIGEgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMuIERlZmF1bHRzIHRvIHRoZSBwbGF0Zm9ybSdzZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9ImNvbmRpdGlvbiI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtTZXRzIGEgcHJvcGVydHkgaWYgYSBjZXJ0YWluIGNvbmRpdGlvbiBob2xkcyB0cnVlIC0gdGhpcyBpcyBhCi1nZW5lcmFsaXphdGlvbiBvZiAmbHQ7YSBocmVmPSZxdW90O2F2YWlsYWJsZS5odG1sJnF1b3Q7Jmd0O0F2YWlsYWJsZSZsdDsvYSZndDsgYW5kICZsdDthCi1ocmVmPSZxdW90O3VwdG9kYXRlLmh0bWwmcXVvdDsmZ3Q7VXB0b2RhdGUmbHQ7L2EmZ3Q7LiZsdDsvcCZndDsKLSZsdDtwJmd0O0lmIHRoZSBjb25kaXRpb24gaG9sZHMgdHJ1ZSwgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHNldCB0byB0cnVlIGJ5Ci1kZWZhdWx0OyBvdGhlcndpc2UsIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc2V0LiBZb3UgY2FuIHNldCB0aGUgdmFsdWUgdG8KLXNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IGJ5IHNwZWNpZnlpbmcgdGhlICZsdDtjb2RlJmd0O3ZhbHVlJmx0Oy9jb2RlJmd0OwotYXR0cmlidXRlLiZsdDsvcCZndDsKLSZsdDtwJmd0O0NvbmRpdGlvbnMgYXJlIHNwZWNpZmllZCBhcyAmbHQ7YSBocmVmPSZxdW90OyNuZXN0ZWQmcXVvdDsmZ3Q7bmVzdGVkIGVsZW1lbnRzJmx0Oy9hJmd0OywKLXlvdSBtdXN0IHNwZWNpZnkgZXhhY3RseSBvbmUgY29uZGl0aW9uLiZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0icHJvcGVydHkiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPlRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InZhbHVlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlRoZSB2YWx1ZSB0byBzZXQgdGhlIHByb3BlcnR5IHRvLiBEZWZhdWx0cyB0byZxdW90O3RydWUmcXVvdDs8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0iY29uZGl0aW9ucyI+Ci0JCTxERVNDUklQVElPTj48L0RFU0NSSVBUSU9OPgk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0iY29weSI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtDb3BpZXMgYSBmaWxlIG9yIEZpbGVTZXQgdG8gYSBuZXcgZmlsZSBvciBkaXJlY3RvcnkuICBCeSBkZWZhdWx0LCBmaWxlcyBhcmUKLW9ubHkgY29waWVkIGlmIHRoZSBzb3VyY2UgZmlsZSBpcyBuZXdlciB0aGFuIHRoZSBkZXN0aW5hdGlvbiBmaWxlLAotb3Igd2hlbiB0aGUgZGVzdGluYXRpb24gZmlsZSBkb2VzIG5vdCBleGlzdC4gIEhvd2V2ZXIsIHlvdSBjYW4gZXhwbGljaXRseQotb3ZlcndyaXRlIGZpbGVzIHdpdGggdGhlICZsdDtjb2RlJmd0O292ZXJ3cml0ZSZsdDsvY29kZSZndDsgYXR0cmlidXRlLiZsdDsvcCZndDsKLSZsdDtwJmd0OyZsdDthIGhyZWY9JnF1b3Q7Li4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCZxdW90OyZndDtGaWxlU2V0Jmx0Oy9hJmd0O3MgYXJlIHVzZWQgdG8gc2VsZWN0IGEKLXNldCBvZiBmaWxlcyB0byBjb3B5LgotVG8gdXNlIGEgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtmaWxlc2V0JmFtcDtndDsmbHQ7L2NvZGUmZ3Q7LCB0aGUgJmx0O2NvZGUmZ3Q7dG9kaXImbHQ7L2NvZGUmZ3Q7IGF0dHJpYnV0ZQotbXVzdCBiZSBzZXQuJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJmaWxlIiBSRVFVSVJFRD0ieWVzLCB1bmxlc3MgYSBuZXN0ZWQKLSAgICAgJmx0O2ZpbGVzZXQmZ3Q7IGVsZW1lbnQgaXMgdXNlZC4iPgotCQkJPERFU0NSSVBUSU9OPlRoZSBmaWxlIHRvIGNvcHk8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InByZXNlcnZlbGFzdG1vZGlmaWVkIiBSRVFVSVJFRD0ibm87IGRlZmF1bHRzIHRvIGZhbHNlLiI+Ci0JCQk8REVTQ1JJUFRJT04+R2l2ZSB0aGUgY29waWVkIGZpbGVzIHRoZSBzYW1lIGxhc3QgbW9kaWZpZWR0aW1lIGFzIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuKE5vdGU6IElnbm9yZWQgb24gSmF2YSAxLjE8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InRvZmlsZSIgUkVRVUlSRUQ9IndpdGggdGhlIGZpbGUKLSAgICAgICBhdHRyaWJ1dGUsIGVpdGhlciB0b2ZpbGUgb3IgdG9kaXIgY2FuIGJlIHVzZWQuCi0gICAgICAgd2l0aCBuZXN0ZWQgJmx0O2ZpbGVzZXQmZ3Q7IGVsZW1lbnRzLCBpZiB0aGUgc2V0IG9mIGZpbGVzCi0gICAgICAgaXMgZ3JlYXRlciB0aGFuIDEsIG9yIGlmIG9ubHkgdGhlIGRpciBhdHRyaWJ1dGUgaXMKLSAgICAgICBzcGVjaWZpZWQgaW4gdGhlICZsdDtmaWxlc2V0Jmd0Oywgb3IgaWYgdGhlCi0gICAgICAgZmlsZSBhdHRyaWJ1dGUgaXMgYWxzbyBzcGVjaWZpZWQsIHRoZW4gb25seQotICAgICAgIHRvZGlyIGlzIGFsbG93ZWQuIj4KLQkJCTxERVNDUklQVElPTj5UaGUgZmlsZSB0byBjb3B5IHRvPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ0b2RpciIgUkVRVUlSRUQ9IiI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGRpcmVjdG9yeSB0byBjb3B5IHRvPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJvdmVyd3JpdGUiIFJFUVVJUkVEPSJubzsgZGVmYXVsdHMgdG8gZmFsc2UuIj4KLQkJCTxERVNDUklQVElPTj5PdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMgZXZlbiBpZiB0aGUgZGVzdGluYXRpb25maWxlcyBhcmUgbmV3ZXI8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZpbHRlcmluZyIgUkVRVUlSRUQ9Im5vOyBkZWZhdWx0cyB0byBmYWxzZS4iPgotCQkJPERFU0NSSVBUSU9OPkluZGljYXRlcyB3aGV0aGVyIHRva2VuIGZpbHRlcmluZyB1c2luZyB0aGUgZ2xvYmFsYnVpbGQtZmlsZSBmaWx0ZXJzIHNob3VsZCB0YWtlIHBsYWNlIGR1cmluZyB0aGUgY29weS5Ob3RlOiBOZXN0ZWQgJmx0O2ZpbHRlcnNldCZndDsgZWxlbWVudHMgd2lsbGFsd2F5cyBiZSB1c2VkLCBldmVuIGlmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBzcGVjaWZpZWQsIG9yIGl0cyB2YWx1ZSBpc2ZhbHNlIChubywgb3Igb2ZmKTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZmxhdHRlbiIgUkVRVUlSRUQ9Im5vOyBkZWZhdWx0cyB0byBmYWxzZS4iPgotCQkJPERFU0NSSVBUSU9OPklnbm9yZSB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBvZiB0aGUgc291cmNlIGZpbGVzLGFuZCBjb3B5IGFsbCBmaWxlcyBpbnRvIHRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5IHRoZSB0b2RpcmF0dHJpYnV0ZS4gIE5vdGUgdGhhdCB5b3UgY2FuIGFjaGlldmUgdGhlIHNhbWUgZWZmZWN0IGJ5IHVzaW5nIGFmbGF0dGVuIG1hcHBlcjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZWVtcHR5ZGlycyIgUkVRVUlSRUQ9Im5vOyBkZWZhdWx0cyB0byB0cnVlLiI+Ci0JCQk8REVTQ1JJUFRJT04+Q29weSBhbnkgZW1wdHkgZGlyZWN0b3JpZXMgaW5jbHVkZWQgaW4gdGhlIEZpbGVTZXQocykuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJmYWlsb25lcnJvciIgUkVRVUlSRUQ9Im5vOyBkZWZhdWx0cyB0byB0cnVlLiI+Ci0JCQk8REVTQ1JJUFRJT04+TG9nIGEgd2FybmluZyBtZXNzYWdlLCBidXQgZG8gbm90IHN0b3AgdGhlIGJ1aWxkLHdoZW4gdGhlIGZpbGUgdG8gY29weSBkb2VzIG5vdCBleGlzdC5Pbmx5IG1lYW5pbmdmdWwgd2hlbiBjb3B5aW5nIGEgc2luZ2xlIGZpbGUuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ2ZXJib3NlIiBSRVFVSVJFRD0ibm87IGRlZmF1bHRzIHRvIGZhbHNlLiI+Ci0JCQk8REVTQ1JJUFRJT04+TG9nIHRoZSBmaWxlcyB0aGF0IGFyZSBiZWluZyBjb3BpZWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0iY29weWRpciI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtDb3BpZXMgYSBkaXJlY3RvcnkgdHJlZSBmcm9tIHRoZSBzb3VyY2UgdG8gdGhlIGRlc3RpbmF0aW9uLiZsdDsvcCZndDsKLSZsdDtwJmd0O0l0IGlzIHBvc3NpYmxlIHRvIHJlZmluZSB0aGUgc2V0IG9mIGZpbGVzIHRoYXQgYXJlIGJlaW5nIGNvcGllZC4gVGhpcyBjYW4gYmUKLWRvbmUgd2l0aCB0aGUgJmx0O2kmZ3Q7aW5jbHVkZXMmbHQ7L2kmZ3Q7LCAmbHQ7aSZndDtpbmNsdWRlc2ZpbGUmbHQ7L2kmZ3Q7LCAmbHQ7aSZndDtleGNsdWRlcyZsdDsvaSZndDssICZsdDtpJmd0O2V4Y2x1ZGVzZmlsZSZsdDsvaSZndDsgYW5kICZsdDtpJmd0O2RlZmF1bHRleGNsdWRlcyZsdDsvaSZndDsKLWF0dHJpYnV0ZXMuIFdpdGggdGhlICZsdDtpJmd0O2luY2x1ZGVzJmx0Oy9pJmd0OyBvciAmbHQ7aSZndDtpbmNsdWRlc2ZpbGUmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSB5b3Ugc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8KLWhhdmUgaW5jbHVkZWQgYnkgdXNpbmcgcGF0dGVybnMuIFRoZSAmbHQ7aSZndDtleGNsdWRlJmx0Oy9pJmd0OyBvciAmbHQ7aSZndDtleGNsdWRlc2ZpbGUmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHNwZWNpZnkKLXRoZSBmaWxlcyB5b3Ugd2FudCB0byBoYXZlIGV4Y2x1ZGVkLiBUaGlzIGlzIGFsc28gZG9uZSB3aXRoIHBhdHRlcm5zLiBBbmQKLWZpbmFsbHkgd2l0aCB0aGUgJmx0O2kmZ3Q7ZGVmYXVsdGV4Y2x1ZGVzJmx0Oy9pJmd0OyBhdHRyaWJ1dGUsIHlvdSBjYW4gc3BlY2lmeSB3aGV0aGVyIHlvdQotd2FudCB0byB1c2UgZGVmYXVsdCBleGNsdXNpb25zIG9yIG5vdC4gU2VlIHRoZSBzZWN0aW9uIG9uICZsdDthCi1ocmVmPSZxdW90Oy4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyZxdW90OyZndDtkaXJlY3RvcnkgYmFzZWQgdGFza3MmbHQ7L2EmZ3Q7LCBvbiBob3cgdGhlCi1pbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvIHdyaXRlIHBhdHRlcm5zLiZsdDsvcCZndDsKLSZsdDtwJmd0O1RoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCAmbHQ7YSBocmVmPSZxdW90Oy4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwmcXVvdDsmZ3Q7RmlsZVNldCZsdDsvYSZndDsgYW5kCi1zdXBwb3J0cyBhbGwgYXR0cmlidXRlcyBvZiAmbHQ7Y29kZSZndDsmYW1wO2x0O2ZpbGVzZXQmYW1wO2d0OyZsdDsvY29kZSZndDsKLSgmbHQ7Y29kZSZndDtkaXImbHQ7L2NvZGUmZ3Q7IGJlY29tZXMgJmx0O2NvZGUmZ3Q7c3JjJmx0Oy9jb2RlJmd0OykgYXMgd2VsbCBhcyB0aGUgbmVzdGVkCi0mbHQ7Y29kZSZndDsmYW1wO2x0O2luY2x1ZGUmYW1wO2d0OyZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0OyZhbXA7bHQ7ZXhjbHVkZSZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyBhbmQKLSZsdDtjb2RlJmd0OyZhbXA7bHQ7cGF0dGVybnNldCZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyBlbGVtZW50cy4mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9InNyYyIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGRpcmVjdG9yeSB0byBjb3B5PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkZXN0IiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj50aGUgZGlyZWN0b3J5IHRvIGNvcHkgdG88L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmVpbmNsdWRlZC4gQWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzZmlsZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXN0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZWV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImV4Y2x1ZGVzZmlsZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXN0YWtlbiB0byBiZSBhbiBleGNsdWRlIHBhdHRlcjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZGVmYXVsdGV4Y2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90KCZxdW90O3llcyZxdW90Oy8mcXVvdDtubyZxdW90OykuIERlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbiBvbWl0dGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJmaWx0ZXJpbmciIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+aW5kaWNhdGVzIHdoZXRoZXIgdG9rZW4gZmlsdGVyaW5nIHNob3VsZCB0YWtlIHBsYWNlIGR1cmluZ3RoZSBjb3A8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZsYXR0ZW4iIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+aWdub3JlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgb2Ygc291cmNlIGRpcmVjdG9yeSxjb3B5IGFsbCBmaWxlcyBpbnRvIGEgc2luZ2xlIGRpcmVjdG9yeSwgc3BlY2lmaWVkIGJ5IHRoZSBkZXN0YXR0cmlidXRlIChkZWZhdWx0IGlzIGZhbHNlKTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZm9yY2VvdmVyd3JpdGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+b3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzIGV2ZW4gaWYgdGhlIGRlc3RpbmF0aW9uZmlsZXMgYXJlIG5ld2VyIChkZWZhdWx0IGlzIGZhbHNlKTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJjb3B5ZmlsZSI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtDb3BpZXMgYSBmaWxlIGZyb20gdGhlIHNvdXJjZSB0byB0aGUgZGVzdGluYXRpb24uIFRoZSBmaWxlIGlzIG9ubHkgY29waWVkIGlmCi10aGUgc291cmNlIGZpbGUgaXMgbmV3ZXIgdGhhbiB0aGUgZGVzdGluYXRpb24gZmlsZSwgb3Igd2hlbiB0aGUgZGVzdGluYXRpb24gZmlsZQotZG9lcyBub3QgZXhpc3QuJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJzcmMiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPnRoZSBmaWxlbmFtZSBvZiB0aGUgZmlsZSB0byBjb3B5PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkZXN0IiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj50aGUgZmlsZW5hbWUgb2YgdGhlIGZpbGUgd2hlcmUgdG8gY29weSB0bzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZmlsdGVyaW5nIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmluZGljYXRlcyB3aGV0aGVyIHRva2VuIGZpbHRlcmluZyBzaG91bGQgdGFrZSBwbGFjZSBkdXJpbmd0aGUgY29wPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJmb3JjZW92ZXJ3cml0ZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5vdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMgZXZlbiBpZiB0aGUgZGVzdGluYXRpb25maWxlcyBhcmUgbmV3ZXIgKGRlZmF1bHQgaXMgZmFsc2UpPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9ImN2cyI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtIYW5kbGVzIHBhY2thZ2VzL21vZHVsZXMgcmV0cmlldmVkIGZyb20gYQotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmN2c2hvbWUub3JnLyZxdW90OyB0YXJnZXQ9JnF1b3Q7X3RvcCZxdW90OyZndDtDVlMmbHQ7L2EmZ3Q7IHJlcG9zaXRvcnkuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7V2hlbiBkb2luZyBhdXRvbWF0ZWQgYnVpbGRzLCB0aGUgJmx0O2EgaHJlZj0mcXVvdDtnZXQuaHRtbCZxdW90OyZndDtnZXQgdGFzayZsdDsvYSZndDsgc2hvdWxkIGJlCi1wcmVmZXJyZWQgb3ZlciB0aGUgJmx0O2kmZ3Q7Y2hlY2tvdXQmbHQ7L2kmZ3Q7IGNvbW1hbmQsIGJlY2F1c2Ugb2Ygc3BlZWQuJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJjb21tYW5kIiBSRVFVSVJFRD0ibm8sIGRlZmF1bHQgJnF1b3Q7Y2hlY2tvdXQmcXVvdDsuIj4KLQkJCTxERVNDUklQVElPTj50aGUgQ1ZTIGNvbW1hbmQgdG8gZXhlY3V0ZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY29tcHJlc3Npb24iIFJFUVVJUkVEPSJuby4gZGVmYXVsdHMgdG8gZmFsc2UuIj4KLQkJCTxERVNDUklQVElPTj50cnVlIG9yIGZhbHNlIC0gaWYgc2V0dG8gdHJ1ZSwgdGhpcyBpcyB0aGUgc2FtZSBhcyBjb21wcmVzc2lvbmxldmVsPSZxdW90OzM8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNvbXByZXNzaW9ubGV2ZWwiIFJFUVVJUkVEPSJuby4gZGVmYXVsdHMgdG8gbm8gY29tcHJlc3Npb24uIj4KLQkJCTxERVNDUklQVElPTj5BIG51bWJlciBiZXR3ZWVuIDEgYW5kIDkgKGNvcnJlc3BvbmRpbmcgdG9wb3NzaWJsZSB2YWx1ZXMgZm9yIENWUycgLXojIGFyZ3VtZW50KS4gQW55b3RoZXIgdmFsdWUgaXMgdHJlYXRlZCBhcyBjb21wcmVzc2lvbj0mcXVvdDtmYWxzZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY3Zzcm9vdCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj50aGUgQ1ZTUk9PVCB2YXJpYWJsZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY3ZzcnNoIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBDVlNfUlNIIHZhcmlhYmxlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkZXN0IiBSRVFVSVJFRD0ibm8sIGRlZmF1bHQgaXMgcHJvamVjdCdzIGJhc2VkaXIuIj4KLQkJCTxERVNDUklQVElPTj50aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBjaGVja2VkIG91dCBmaWxlcyBzaG91bGQgYmUgcGxhY2VkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJwYWNrYWdlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBwYWNrYWdlL21vZHVsZSB0byBjaGVjayBvdXQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InRhZyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj50aGUgdGFnIG9mIHRoZSBwYWNrYWdlL21vZHVsZSB0byBjaGVjayBvdXQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImRhdGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VXNlIHRoZSBtb3N0IHJlY2VudCByZXZpc2lvbiBubyBsYXRlciB0aGFuIHRoZSBnaXZlbiBkYXQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InF1aWV0IiBSRVFVSVJFRD0ibm8sIGRlZmF1bHQgJnF1b3Q7ZmFsc2UmcXVvdDsiPgotCQkJPERFU0NSSVBUSU9OPnN1cHByZXNzIGluZm9ybWF0aW9uYWwgbWVzc2FnZXM8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im5vZXhlYyIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0IHRvICZxdW90O2ZhbHNlJnF1b3Q7Ij4KLQkJCTxERVNDUklQVElPTj5yZXBvcnQgb25seSwgZG9uJ3QgY2hhbmdlIGFueSBmaWxlczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ib3V0cHV0IiBSRVFVSVJFRD0ibm8sIGRlZmF1bHQgb3V0cHV0IHRvIGFudCBsb2cgYXMgbXNnX2luZm8uIj4KLQkJCTxERVNDUklQVElPTj50aGUgZmlsZSB0byBkaXJlY3Qgc3RhbmRhcmQgb3V0cHV0IGZyb20gdGhlIGNvbW1hbmQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImVycm9yIiBSRVFVSVJFRD0ibm8sIGRlZmF1bHQgZXJyb3IgdG8gYW50IGxvZyBhcyBtc2dfd2Fybi4iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBmaWxlIHRvIGRpcmVjdCBzdGFuZGFyZCBlcnJvciBmcm9tIHRoZSBjb21tYW5kPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJhcHBlbmQiIFJFUVVJUkVEPSJubywgZGVmYXVsdCB0byAmcXVvdDtmYWxzZSZxdW90Oy4iPgotCQkJPERFU0NSSVBUSU9OPndoZXRoZXIgdG8gYXBwZW5kIG91dHB1dC9lcnJvciB3aGVuIHJlZGlyZWN0aW5nIHRvIGEgZmlsZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0icG9ydCIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0IHBvcnQgMjQwMS4iPgotCQkJPERFU0NSSVBUSU9OPlBvcnQgdXNlZCBieSBDVlMgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgc2VydmVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJwYXNzZmlsZSIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0IGZpbGUgfi8uY3ZzcGFzcy4iPgotCQkJPERFU0NSSVBUSU9OPlBhc3N3b3JkIGZpbGUgdG8gcmVhZCBwYXNzd29yZHMgZnJvbTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZmFpbG9uZXJyb3IiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U3RvcCB0aGUgYnVpbGQgcHJvY2VzcyBpZiB0aGUgY29tbWFuZCBleGl0cyB3aXRoIGFyZXR1cm4gY29kZSBvdGhlciB0aGFuIDAuIERlZmF1bHRzIHRvIGZhbHM8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0iY3ZzcGFzcyI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtBZGRzIGVudHJpZXMgdG8gYSAuY3ZzcGFzcyBmaWxlLiBBZGRpbmcgZW50cmllcyB0byB0aGlzIGZpbGUgaGFzIHRoZSBzYW1lIGFmZmVjdCBhcyBhIGN2cyBsb2dpbiBjb21tYW5kLiZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0iY3Zzcm9vdCIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIENWUyByZXBvc2l0b3J5IHRvIGFkZCBhbiBlbnRyeSBmb3I8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InBhc3N3b3JkIiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj5QYXNzd29yZCB0byBiZSBhZGRlZCB0byB0aGUgcGFzc3dvcmQgZmlsZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0icGFzc2ZpbGUiIFJFUVVJUkVEPSJubywgZGVmYXVsdCBpcyB+Ly5jdnNwYXNzLiI+Ci0JCQk8REVTQ1JJUFRJT04+UGFzc3dvcmQgZmlsZSB0byBhZGQgdGhlIGVudHJ5IHRvPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9ImN2c3RhZ2RpZmYiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7R2VuZXJhdGVzIGFuIFhNTC1mb3JtYXR0ZWQgcmVwb3J0IGZpbGUgb2YgdGhlIGNoYW5nZXMgYmV0d2VlbiB0d28gdGFncyBvciBkYXRlcyByZWNvcmRlZCBpbiBhCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuY3ZzaG9tZS5vcmcvJnF1b3Q7IHRhcmdldD0mcXVvdDtfdG9wJnF1b3Q7Jmd0O0NWUyZsdDsvYSZndDsgcmVwb3NpdG9yeS4gJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJzdGFydHRhZyIgUkVRVUlSRUQ9ImV4YWN0bHkgb25lIG9mIHRoZSB0d28uIj4KLQkJCTxERVNDUklQVElPTj5UaGUgZWFybGllc3QgdGFnIGZyb20gd2hpY2ggZGlmZnMgYXJlIHRvIGJlaW5jbHVkZWQgaW4gdGhlIHJlcG9ydDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ic3RhcnRkYXRlIiBSRVFVSVJFRD0iIj4KLQkJCTxERVNDUklQVElPTj5UaGUgZWFybGllc3QgZGF0ZSBmcm9tIHdoaWNoIGRpZmZzIGFyZSB0byBiZWluY2x1ZGVkIGluIHRoZSByZXBvcnQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImVuZHRhZyIgUkVRVUlSRUQ9ImV4YWN0bHkgb25lIG9mIHRoZSB0d28uIj4KLQkJCTxERVNDUklQVElPTj5UaGUgbGF0ZXN0IHRhZyBmcm9tIHdoaWNoIGRpZmZzIGFyZSB0byBiZWluY2x1ZGVkIGluIHRoZSByZXBvcnQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImVuZGRhdGUiIFJFUVVJUkVEPSIiPgotCQkJPERFU0NSSVBUSU9OPlRoZSBsYXRlc3QgZGF0ZSBmcm9tIHdoaWNoIGRpZmZzIGFyZSB0byBiZWluY2x1ZGVkIGluIHRoZSByZXBvcnQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImRlc3RmaWxlIiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj5UaGUgZmlsZSBpbiB3aGljaCB0byB3cml0ZSB0aGUgZGlmZiByZXBvcnQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InJvb3RkaXIiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+Um9vdCBkaXJlY3RvcnkgZm9yIHRoZSBwYWNrYWdlLCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcGFja2FnZSBuYW1lPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9ImRlbGV0ZSI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtEZWxldGVzIGEgc2luZ2xlIGZpbGUsIGEgc3BlY2lmaWVkIGRpcmVjdG9yeSBhbmQgYWxsIGl0cyBmaWxlcyBhbmQKLXN1YmRpcmVjdG9yaWVzLCBvciBhIHNldCBvZiBmaWxlcyBzcGVjaWZpZWQgYnkgb25lIG9yIG1vcmUKLSZsdDthIGhyZWY9JnF1b3Q7Li4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCZxdW90OyZndDtGaWxlU2V0Jmx0Oy9hJmd0O3MuCi1XaGVuIHNwZWNpZnlpbmcgYSBzZXQgb2YgZmlsZXMsIGVtcHR5IGRpcmVjdG9yaWVzIGFyZSAmbHQ7aSZndDtub3QmbHQ7L2kmZ3Q7IHJlbW92ZWQgYnkKLWRlZmF1bHQuCi1UbyByZW1vdmUgZW1wdHkgZGlyZWN0b3JpZXMsIHVzZSB0aGUgJmx0O2NvZGUmZ3Q7aW5jbHVkZUVtcHR5RGlycyZsdDsvY29kZSZndDsgYXR0cmlidXRlLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1JZiB5b3UgdXNlIHRoaXMgdGFzayB0byBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIGNyZWF0ZWQgYnkgZWRpdG9ycwotYW5kIGl0IGRvZXNuJ3Qgc2VlbSB0byB3b3JrLCByZWFkIHVwIG9uIHRoZSAKLSZsdDthIGhyZWY9JnF1b3Q7Li4vZGlydGFza3MuaHRtbCNkZWZhdWx0ZXhjbHVkZXMmcXVvdDsmZ3Q7ZGVmYXVsdCBleGNsdXNpb24gc2V0Jmx0Oy9hJmd0OwotaW4gJmx0O3N0cm9uZyZndDtEaXJlY3RvcnktYmFzZWQgVGFza3MmbHQ7L3N0cm9uZyZndDssIGFuZCBzZWUgdGhlCi0mbHQ7Y29kZSZndDtkZWZhdWx0ZXhjbHVkZXMmbHQ7L2NvZGUmZ3Q7IGF0dHJpYnV0ZSBiZWxvdy4KLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0iZmlsZSIgUkVRVUlSRUQ9ImF0IGxlYXN0IG9uZSBvZiB0aGUgdHdvLAotICAgICAgdW5sZXNzIGEgJmx0O2ZpbGVzZXQmZ3Q7IGlzIHNwZWNpZmllZC4iPgotCQkJPERFU0NSSVBUSU9OPlRoZSBmaWxlIHRvIGRlbGV0ZSwgc3BlY2lmaWVkIGFzIGVpdGhlciB0aGUgc2ltcGxlZmlsZW5hbWUgKGlmIHRoZSBmaWxlIGV4aXN0cyBpbiB0aGUgY3VycmVudCBiYXNlIGRpcmVjdG9yeSksIGFyZWxhdGl2ZS1wYXRoIGZpbGVuYW1lLCBvciBhIGZ1bGwtcGF0aCBmaWxlbmFtZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZGlyIiBSRVFVSVJFRD0iIj4KLQkJCTxERVNDUklQVElPTj5UaGUgZGlyZWN0b3J5IHRvIGRlbGV0ZSwgaW5jbHVkaW5nIGFsbCBpdHMgZmlsZXMgYW5kc3ViZGlyZWN0b3JpZXNOb3RlOiBkaXIgaXMgbm90IHVzZWR0byBzcGVjaWZ5IGEgZGlyZWN0b3J5IG5hbWUgZm9yIGZpbGU7IGZpbGVhbmQgZGlyIGFyZSBpbmRlcGVuZGVudCBvZiBlYWNoIG90aGVyV0FSTklORzogRG8gbm90IHNldCBkaXIgdG8mcXVvdDsuJnF1b3Q7LCAmcXVvdDske2Jhc2VkaXJ9JnF1b3Q7LG9yIHRoZSBmdWxsLXBhdGhuYW1lIGVxdWl2YWxlbnQgdW5sZXNzIHlvdSB0cnVseSBpbnRlbmQgdG9yZWN1cnNpdmVseSByZW1vdmUgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBiYXNlIGRpcmVjdG9yeShhbmQgdGhlIGJhc2UgZGlyZWN0b3J5IGl0c2VsZiwgaWYgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgd29ya2luZ2RpcmVjdG9yeSk8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InZlcmJvc2UiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U2hvdyB0aGUgbmFtZSBvZiBlYWNoIGRlbGV0ZWQgZmlsZSgmcXVvdDt0cnVlJnF1b3Q7LyZxdW90O2ZhbHNlJnF1b3Q7KS5EZWZhdWx0IGlzICZxdW90O2ZhbHNlJnF1b3Q7IHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0icXVpZXQiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+SWYgdGhlIHNwZWNpZmllZCBmaWxlIG9yIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCxkbyBub3QgZGlzcGxheSBhIGRpYWdub3N0aWMgbWVzc2FnZSAodW5sZXNzIEFudGhhcyBiZWVuIGludm9rZWQgd2l0aCB0aGUgJmFtcDsjeDIwMTE7dmVyYm9zZSBvciZhbXA7I3gyMDExO2RlYnVnIHN3aXRjaGVzKSBvciBtb2RpZnkgdGhlIGV4aXQgc3RhdHVzIHRvcmVmbGVjdCBhbiBlcnJvci5XaGVuIHNldCB0byAmcXVvdDt0cnVlJnF1b3Q7LCBpZiBhIGZpbGUgb3IgZGlyZWN0b3J5IGNhbm5vdCBiZSBkZWxldGVkLG5vIGVycm9yIGlzIHJlcG9ydGVkLiBUaGlzIHNldHRpbmcgZW11bGF0ZXMgdGhlIC1mIG9wdGlvbiB0byB0aGUgVW5peCBybSBjb21tYW5kLkRlZmF1bHQgaXMgJnF1b3Q7ZmFsc2UmcXVvdDsuU2V0dGluZyB0aGlzIHRvICZxdW90O3RydWUmcXVvdDsgaW1wbGllcyBzZXR0aW5nZmFpbG9uZXJyb3IgdG8gJnF1b3Q7ZmFsc2UmcXVvdDsuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJmYWlsb25lcnJvciIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5Db250cm9scyB3aGV0aGVyIGFuIGVycm9yIChzdWNoIGFzIGEgZmFpbHVyZSB0byBkZWxldGUgYSBmaWxlKXN0b3BzIHRoZSBidWlsZCBvciBpcyBtZXJlbHkgcmVwb3J0ZWQgdG8gdGhlIHNjcmVlbi5Pbmx5IHJlbGV2YW50IGlmIHF1aWV0IGlzICZxdW90O2ZhbHNlJnF1b3Q7LkRlZmF1bHQgaXMgJnF1b3Q7dHJ1ZSZxdW90Oy48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVlbXB0eWRpcnMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U2V0IHRvICZxdW90O3RydWUmcXVvdDsgdG8gZGVsZXRlIGVtcHR5IGRpcmVjdG9yaWVzIHdoZW51c2luZyBmaWxlc2V0cy4gIERlZmF1bHQgaXMgJnF1b3Q7ZmFsc2UmcXVvdDs8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkRlcHJlY2F0ZWQuICBVc2UgJmx0O2ZpbGVzZXQmZ3Q7LkNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZmZpbGVzIHRoYXQgbXVzdCBiZSBkZWxldGVkLiBBbGwgZmlsZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnlzcGVjaWZpZWQgaW4gZGlyLjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkRlcHJlY2F0ZWQuICBVc2UgJmx0O2ZpbGVzZXQmZ3Q7LlRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mdGhpcyBmaWxlIGlzIHRha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJleGNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5EZXByZWNhdGVkLiAgVXNlICZsdDtmaWxlc2V0Jmd0Oy5Db21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2ZmaWxlcyB0aGF0IG11c3QgYmUgZXhjbHVkZWQgZnJvbSB0aGUgZGVsZXRpb24gbGlzdC5BbGwgZmlsZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGluIGRpci5ObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImV4Y2x1ZGVzZmlsZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5EZXByZWNhdGVkLiAgVXNlICZsdDtmaWxlc2V0Jmd0Oy5UaGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZnRoaXMgZmlsZSBpcyB0YWtlbiB0byBiZSBhbiBleGNsdWRlIHBhdHRlcjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZGVmYXVsdGV4Y2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXNzaG91bGQgYmUgdXNlZCBvciBub3QgKCZxdW90O3llcyZxdW90Oy8mcXVvdDtubyZxdW90OykuRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0iZGVsdHJlZSI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtEZWxldGVzIGEgZGlyZWN0b3J5IHdpdGggYWxsIGl0cyBmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMuJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJkaXIiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPnRoZSBkaXJlY3RvcnkgdG8gZGVsZXRlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9ImRlcGVuZHNldCI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDsKLVRoZSBkZXBlbmRzZXQgdGFzayBjb21wYXJlcyBhIHNldCBvZiBzb3VyY2UgZmlsZXMgd2l0aCBhIHNldCBvZiB0YXJnZXQKLWZpbGVzLiAgSWYgYW55IG9mIHRoZSBzb3VyY2UgZmlsZXMgaXMgbW9yZSByZWNlbnQgdGhhbiBhbnkgb2YKLXRoZSB0YXJnZXQgZmlsZXMsIGFsbCBvZiB0aGUgdGFyZ2V0IGZpbGVzIGFyZSByZW1vdmVkLiAgCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLVNvdXJjZSBmaWxlcyBhbmQgdGFyZ2V0IGZpbGVzIGFyZSBzcGVjaWZpZWQgdmlhIG5lc3RlZCAmbHQ7YQotaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sJnF1b3Q7Jmd0O0ZpbGVTZXRzJmx0Oy9hJmd0OyBhbmQvb3IgbmVzdGVkICZsdDthCi1ocmVmPSZxdW90Oy4uL0NvcmVUeXBlcy9maWxlbGlzdC5odG1sJnF1b3Q7Jmd0O0ZpbGVMaXN0cyZsdDsvYSZndDsuICBBcmJpdHJhcmlseSBtYW55Ci1zb3VyY2UgYW5kIHRhcmdldCBmaWxlc2V0cy9maWxlbGlzdHMgbWF5IGJlIHNwZWNpZmllZCwgYnV0IGF0IAotbGVhc3Qgb25lIGZpbGVsaXN0L2ZpbGVzZXQgaXMgcmVxdWlyZWQgZm9yIGJvdGggc291cmNlcyBhbmQgdGFyZ2V0cy4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotVXNlIGEgRmlsZVNldCB3aGVuIHlvdSB3YW50IHRvIHVzZSB3aWxkY2FyZCBpbmNsdWRlIG9yIGV4Y2x1ZGUKLXBhdHRlcm5zIGFuZCBkb24ndCBjYXJlIGFib3V0IG1pc3NpbmcgZmlsZXMuICBVc2UgYSBGaWxlTGlzdCB3aGVuIHlvdQotd2FudCB0byBjb25zaWRlciB0aGUgbm9uLWV4aXN0ZW5jZSBvZiBhIGZpbGUgYXMgaWYgaXQgd2VyZSBvdXQgb2YKLWRhdGUuICBJZiB0aGVyZSBhcmUgYW55IG5vbi1leGlzdGluZyBmaWxlcyBpbiBhbnkgc291cmNlIG9yIHRhcmdldAotRmlsZUxpc3QsIGFsbCB0YXJnZXQgZmlsZXMgd2lsbCBiZSByZW1vdmVkLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1EZXBlbmRTZXQgaXMgdXNlZnVsIHRvIGNhcHR1cmUgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIG5vdCBvciBjYW5ub3QgYmUKLWRldGVybWluZWQgYWxnb3JpdGhtaWNhbGx5LiAgRm9yIGV4YW1wbGUsIHRoZSAmYW1wO2x0O3N0eWxlJmFtcDtndDsgdGFzayBvbmx5Ci1jb21wYXJlcyB0aGUgc291cmNlIFhNTCBmaWxlIGFuZCBYU0xUIHN0eWxlc2hlZXQgYWdhaW5zdCB0aGUgdGFyZ2V0Ci1maWxlIHRvIGRldGVybWluZWQgd2hldGhlciB0byByZXN0eWxlIHRoZSBzb3VyY2UuICBVc2luZyBkZXBlbmRzZXQgeW91Ci1jYW4gZXh0ZW5kIHRoaXMgZGVwZW5kZW5jeSBjaGVja2luZyB0byBpbmNsdWRlIGEgRFREIG9yIFhTRCBmaWxlIGFzCi13ZWxsIGFzIG90aGVyIHN0eWxlc2hlZXRzIGltcG9ydGVkIGJ5IHRoZSBtYWluIHN0eWxlc2hlZXQuCi0mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0iZGlybmFtZSI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDsKLVRhc2sgdG8gZGV0ZXJtaW5lIHRoZSBkaXJlY3RvcnkgcGF0aCBvZiBhIHNwZWNpZmllZCBmaWxlLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7IAotV2hlbiB0aGlzIHRhc2sgZXhlY3V0ZXMsIGl0IHdpbGwgc2V0IHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgdG8gdGhlCi12YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGZpbGUgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCB0aGUgbGFzdCBwYXRoCi1lbGVtZW50LiBJZiB0aGUgc3BlY2lmaWVkIGZpbGUgaXMgYSBwYXRoIHRoYXQgZW5kcyBpbiBhIGZpbGVuYW1lLAotdGhlIGZpbGVuYW1lIHdpbGwgYmUgZHJvcHBlZC4gSWYgdGhlIHNwZWNpZmllZCBmaWxlIGlzIGp1c3QgYSBmaWxlbmFtZSwKLXRoZSBkaXJlY3Rvcnkgd2lsbCBiZSB0aGUgY3VycmVudCBkaXJlY3RvcnkuCi0mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9ImZpbGUiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPlRoZSBwYXRoIHRvIHRha2UgdGhlIGRpcm5hbWUgb2Y8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InByb3BlcnR5IiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj5UaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9ImVhciI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtBbiBleHRlbnNpb24gb2YgdGhlICZsdDthIGhyZWY9JnF1b3Q7amFyLmh0bWwmcXVvdDsmZ3Q7SmFyJmx0Oy9hJmd0OyB0YXNrIHdpdGggc3BlY2lhbAotdHJlYXRtZW50IGZvciBmaWxlcyB0aGF0IHNob3VsZCBlbmQgdXAgaW4gYW4gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBhcmNoaXZlLiZsdDsvcCZndDsKLSZsdDtwJmd0OyhUaGUgRWFyIHRhc2sgaXMgYSBzaG9ydGN1dCBmb3Igc3BlY2lmeWluZyB0aGUgcGFydGljdWxhciBsYXlvdXQgb2YgYSBFQVIgZmlsZS4gCi1UaGUgc2FtZSB0aGluZyBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IHVzaW5nIHRoZSAmbHQ7aSZndDtwcmVmaXgmbHQ7L2kmZ3Q7IGFuZCAmbHQ7aSZndDtmdWxscGF0aCZsdDsvaSZndDsKLWF0dHJpYnV0ZXMgb2YgemlwZmlsZXNldHMgaW4gYSBaaXAgb3IgSmFyIHRhc2suKSZsdDsvcCZndDsKLSZsdDtwJmd0O1RoZSBleHRlbmRlZCB6aXBmaWxlc2V0IGVsZW1lbnQgZnJvbSB0aGUgemlwIHRhc2sgKHdpdGggYXR0cmlidXRlcyAmbHQ7aSZndDtwcmVmaXgmbHQ7L2kmZ3Q7LCAmbHQ7aSZndDtmdWxscGF0aCZsdDsvaSZndDssIGFuZCAmbHQ7aSZndDtzcmMmbHQ7L2kmZ3Q7KSBpcyBhdmFpbGFibGUgaW4gdGhlIEVhciB0YXNrLiZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0iZGVzdGZpbGUiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPnRoZSBFQVIgZmlsZSB0byBjcmVhdGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImFwcHhtbCIgUkVRVUlSRUQ9InllcywgdW5sZXNzIHVwZGF0ZSBpcyBzZXQgdG8gdHJ1ZSI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0byB1c2UgKE1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCk8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImJhc2VkaXIiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHRvIGphciB0aGUgZmlsZXM8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNvbXByZXNzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPk5vdCBvbmx5IHN0b3JlIGRhdGEgYnV0IGFsc28gY29tcHJlc3MgdGhlbSwgZGVmYXVsdHMgdG8gdHJ1PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJlbmNvZGluZyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5UaGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIHVzZSBmb3IgZmlsZW5hbWVzaW5zaWRlIHRoZSBhcmNoaXZlLiAgRGVmYXVsdHMgdG8gVVRGOC4gSXQgaXMgbm90cmVjb21tZW5kZWQgdG8gY2hhbmdlIHRoaXMgdmFsdWUgYXMgdGhlIGNyZWF0ZWQgYXJjaGl2ZSB3aWxsIG1vc3RsaWtlbHkgYmUgdW5yZWFkYWJsZSBmb3IgSmF2YSBvdGhlcndpc2U8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZpbGVzb25seSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TdG9yZSBvbmx5IGZpbGUgZW50cmllcywgZGVmYXVsdHMgdG8gZmFsczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZWluY2x1ZGVkLiBBbGwgZmlsZXMgYXJlIGluY2x1ZGVkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpc3Rha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJleGNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlZXhjbHVkZWQuIE5vIGZpbGVzIChleGNlcHQgZGVmYXVsdCBleGNsdWRlcykgYXJlIGV4Y2x1ZGVkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpc3Rha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkZWZhdWx0ZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+aW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im1hbmlmZXN0IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBtYW5pZmVzdCBmaWxlIHRvIHVzZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idXBkYXRlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmluZGljYXRlcyB3aGV0aGVyIHRvIHVwZGF0ZSBvciBvdmVyd3JpdGV0aGUgZGVzdGluYXRpb24gZmlsZSBpZiBpdCBhbHJlYWR5IGV4aXN0czwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZHVwbGljYXRlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmJlaGF2aW9yIHdoZW4gYSBkdXBsaWNhdGUgZmlsZSBpcyBmb3VuZC4gIFZhbGlkIHZhbHVlcyBhcmUgJnF1b3Q7YWRkJnF1b3Q7LCAmcXVvdDtwcmVzZXJ2ZSZxdW90OywgYW5kICZxdW90O2ZhaWwmcXVvdDsuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAmcXVvdDthZGQmcXVvdDsuIDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJlY2hvIj4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0VjaG9lcyBhIG1lc3NhZ2UgdG8gdGhlIGN1cnJlbnQgbG9nZ2VycyBhbmQgbGlzdGVuZXJzIHdoaWNoCi1tZWFucyAmbHQ7dHQmZ3Q7U3lzdGVtLm91dCZsdDsvdHQmZ3Q7IHVubGVzcyBvdmVycmlkZGVuLiBBICZsdDt0dCZndDtsZXZlbCZsdDsvdHQmZ3Q7Ci1jYW4gYmUgc3BlY2lmaWVkLCB3aGljaCBjb250cm9scyBhdCB3aGF0IGxvZ2dpbmcgbGV2ZWwgdGhlIG1lc3NhZ2UgaXMKLWZpbHRlcmVkIGF0LiAKLSZsdDtwJmd0OyAKLVRoZSB0YXNrIGNhbiBhbHNvIGVjaG8gdG8gYSBmaWxlLCBpbiB3aGljaCBjYXNlIHRoZSBvcHRpb24gdG8gYXBwZW5kIHJhdGhlcgotdGhhbiBvdmVyd3JpdGUgdGhlIGZpbGUgaXMgYXZhaWxhYmxlLCBhbmQgdGhlICZsdDt0dCZndDtsZXZlbCZsdDsvdHQmZ3Q7IG9wdGlvbiBpcyAKLWlnbm9yZWQmbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9Im1lc3NhZ2UiIFJFUVVJUkVEPSJ5ZXMsIHVubGVzcyBkYXRhIGlzIGluY2x1ZGVkIGluIGEKLSAgICAgICBjaGFyYWN0ZXIgc2VjdGlvbiB3aXRoaW4gdGhpcyBlbGVtZW50LiI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIG1lc3NhZ2UgdG8gZWNobzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZmlsZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj50aGUgZmlsZSB0byB3cml0ZSB0aGUgbWVzc2FnZSB0bzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iYXBwZW5kIiBSRVFVSVJFRD0ibm8gLSBkZWZhdWx0IGlzIGZhbHNlLiI+Ci0JCQk8REVTQ1JJUFRJT04+QXBwZW5kIHRvIGFuIGV4aXN0aW5nIGZpbGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImxldmVsIiBSRVFVSVJFRD0ibm8gLSBkZWZhdWx0IGlzICZxdW90O3dhcm5pbmcmcXVvdDsuIj4KLQkJCTxERVNDUklQVElPTj5Db250cm9sIHRoZSBsZXZlbCBhdCB3aGljaCB0aGlzIG1lc3NhZ2UgaXMgcmVwb3J0ZWQuT25lIG9mICZxdW90O2Vycm9yJnF1b3Q7LCAmcXVvdDt3YXJuaW5nJnF1b3Q7LCAmcXVvdDtpbmZvJnF1b3Q7LCAmcXVvdDt2ZXJib3NlJnF1b3Q7LCAmcXVvdDtkZWJ1ZzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJleGVjIj4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0V4ZWN1dGVzIGEgc3lzdGVtIGNvbW1hbmQuIFdoZW4gdGhlICZsdDtpJmd0O29zJmx0Oy9pJmd0OyBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCB0aGVuCi10aGUgY29tbWFuZCBpcyBvbmx5IGV4ZWN1dGVkIHdoZW4gQW50IGlzIHJ1biBvbiBvbmUgb2YgdGhlIHNwZWNpZmllZCBvcGVyYXRpbmcKLXN5c3RlbXMuJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJjb21tYW5kIiBSRVFVSVJFRD0iZXhhY3RseSBvbmUgb2YgdGhlIHR3by4iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBjb21tYW5kIHRvIGV4ZWN1dGUgd2l0aCBhbGwgY29tbWFuZCBsaW5lYXJndW1lbnRzLiBkZXByZWNhdGVkLCB1c2UgZXhlY3V0YWJsZSBhbmQgbmVzdGVkJmx0O2FyZyZndDsgZWxlbWVudHMgaW5zdGVhZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZXhlY3V0YWJsZSIgUkVRVUlSRUQ9IiI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGNvbW1hbmQgdG8gZXhlY3V0ZSB3aXRob3V0IGFueSBjb21tYW5kIGxpbmVhcmd1bWVudHM8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImRpciIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj50aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBjb21tYW5kIHNob3VsZCBiZSBleGVjdXRlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ib3MiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+bGlzdCBvZiBPcGVyYXRpbmcgU3lzdGVtcyBvbiB3aGljaCB0aGUgY29tbWFuZCBtYXkgYmVleGVjdXRlZC4gSWYgdGhlIGN1cnJlbnQgT1MncyBuYW1lIGlzIGNvbnRhaW5lZCBpbiB0aGlzIGxpc3QsIHRoZSBjb21tYW5kIHdpbGxiZSBleGVjdXRlZC4gVGhlIE9TJ3MgbmFtZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBKYXZhIFZpcnR1YWwgbWFjaGluZSBhbmQgaXMgc2V0aW4gdGhlICZxdW90O29zLm5hbWUmcXVvdDsgc3lzdGVtIHByb3BlcnR5PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJvdXRwdXQiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGZpbGUgdG8gd2hpY2ggdGhlIG91dHB1dCBvZiB0aGUgY29tbWFuZCBzaG91bGQgYmVyZWRpcmVjdGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJhcHBlbmQiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+d2hldGhlciBvdXRwdXQgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIG9yIG92ZXJ3cml0ZWFuIGV4aXN0aW5nIGZpbGUuICBEZWZhdWx0cyB0byBmYWxzZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ib3V0cHV0cHJvcGVydHkiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSBpbiB3aGljaCB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kIHNob3VsZCBiZSBzdG9yZWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InJlc3VsdHByb3BlcnR5IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgcHJvcGVydHkgaW4gd2hpY2ggdGhlIHJldHVybiBjb2RlIG9mIHRoZSBjb21tYW5kIHNob3VsZCBiZSBzdG9yZWQuIE9ubHkgb2YgaW50ZXJlc3QgaWYgZmFpbG9uZXJyb3I9ZmFsczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idGltZW91dCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TdG9wIHRoZSBjb21tYW5kIGlmIGl0IGRvZXNuJ3QgZmluaXNoIHdpdGhpbiB0aGVzcGVjaWZpZWQgdGltZSAoZ2l2ZW4gaW4gbWlsbGlzZWNvbmRzKTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZmFpbG9uZXJyb3IiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U3RvcCB0aGUgYnVpbGRwcm9jZXNzIGlmIHRoZSBjb21tYW5kIGV4aXRzIHdpdGggYXJldHVybmNvZGUgb3RoZXIgdGhhbiAwLiBEZWZhdWx0cyB0byBmYWxzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJmYWlsaWZleGVjdXRpb25mYWlscyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TdG9wIHRoZSBidWlsZCBpZiB3ZSBjYW4ndCBzdGFydCB0aGUgcHJvZ3JhbS5EZWZhdWx0cyB0byB0cnVlLjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibmV3ZW52aXJvbm1lbnQiIFJFUVVJUkVEPSJubywgZGVmYXVsdCBpcyBmYWxzZSI+Ci0JCQk8REVTQ1JJUFRJT04+RG8gbm90IHByb3BhZ2F0ZSBvbGQgZW52aXJvbm1lbnQgd2hlbiBuZXcgZW52aXJvbm1lbnR2YXJpYWJsZXMgYXJlIHNwZWNpZmllZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idm1sYXVuY2hlciIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0IGlzIHRydWUiPgotCQkJPERFU0NSSVBUSU9OPlJ1biBjb21tYW5kIHVzaW5nIHRoZSBKYXZhIFZNJ3MgZXhlY3V0aW9uIGZhY2lsaXRpZXN3aGVyZSBhdmFpbGFibGUuIElmIHNldCB0byBmYWxzZSB0aGUgdW5kZXJseWluZyBPUydzIHNoZWxsLGVpdGhlciBkaXJlY3RseSBvciB0aHJvdWdoIHRoZSBhbnRSdW4gc2NyaXB0cywgd2lsbCBiZSB1c2VkLlVuZGVyIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMsIHRoaXMgZ2l2ZXMgYWNjZXNzIHRvIGZhY2lsaXRpZXNub3Qgbm9ybWFsbHkgYXZhaWxhYmxlIHRocm91Z2ggdGhlIFZNIGluY2x1ZGluZywgdW5kZXIgV2luZG93cyxiZWluZyBhYmxlIHRvIGV4ZWN1dGUgc2NyaXB0cywgcmF0aGVyIHRoYW4gdGhlaXIgYXNzb2NpYXRlZGludGVycHJldGVyLiAgSWYgeW91IHdhbnQgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGVleGVjdXRhYmxlIGFzIGEgcmVsYXRpdmUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IGdpdmVuIGJ5IHRoZWRpciBhdHRyaWJ1dGUsIGl0IG1heSBiZWNvbWUgbmVjZXNzYXJ5IHRvIHNldCB2bWxhdW5jaGVyIHRvZmFsc2UgYXMgd2VsbDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJmYWlsIj4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0V4aXRzIHRoZSBjdXJyZW50IGJ1aWxkIChqdXN0IHRocm93aW5nIGEgQnVpbGRFeGNlcHRpb24pLCBvcHRpb25hbGx5IHByaW50aW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7VGhlIG1lc3NhZ2Ugb2YgdGhlIEV4Y2VwdGlvbiBjYW4gYmUgc2V0IHZpYSB0aGUgbWVzc2FnZSBhdHRyaWJ1dGUKLW9yIGNoYXJhY3RlciBkYXRhIG5lc3RlZCBpbnRvIHRoZSBlbGVtZW50LiZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0ibWVzc2FnZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5BIG1lc3NhZ2UgZ2l2aW5nIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gd2h5IHRoZSBidWlsZCBleGl0ZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaWYiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+T25seSBmYWlsIGlmIGEgcHJvcGVydHkgb2YgdGhlIGdpdmVuIG5hbWUgZXhpc3RzaW4gdGhlIGN1cnJlbnQgcHJvamVjPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ1bmxlc3MiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+T25seSBmYWlsIGlmIGEgcHJvcGVydHkgb2YgdGhlIGdpdmVuIG5hbWUgZG9lc24ndGV4aXN0IGluIHRoZSBjdXJyZW50IHByb2plYzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJmaWx0ZXIiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7U2V0cyBhIHRva2VuIGZpbHRlciBmb3IgdGhpcyBwcm9qZWN0IG9yIHJlYWQgbXVsdGlwbGUgdG9rZW4gZmlsdGVyIGZyb20KLWFuIGlucHV0IGZpbGUgYW5kIHNldHMgdGhlc2UgYXMgZmlsdGVycy4KLVRva2VuIGZpbHRlcnMgYXJlIHVzZWQgYnkgYWxsIHRhc2tzIHRoYXQgcGVyZm9ybSBmaWxlIGNvcHlpbmcgb3BlcmF0aW9ucwotdGhyb3VnaCB0aGUgUHJvamVjdCBjb21tb2RpdHkgbWV0aG9kcy4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtOb3RlIDE6IHRoZSB0b2tlbiBzdHJpbmcgbXVzdCBub3QgY29udGFpbiB0aGUgc2VwYXJhdG9ycyBjaGFycyAoQCkuJmx0O2JyJmd0OwotTm90ZSAyOiBFaXRoZXIgdG9rZW4gYW5kIHZhbHVlIGF0dHJpYnV0ZXMgbXVzdCBiZSBwcm92aWRlZCwgb3Igb25seSB0aGUKLWZpbHRlcnNmaWxlIGF0dHJpYnV0ZS4mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9InRva2VuIiBSRVFVSVJFRD0ieWVzKiI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIHRva2VuIHN0cmluZyB3aXRob3V0IDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idmFsdWUiIFJFUVVJUkVEPSJ5ZXMqIj4KLQkJCTxERVNDUklQVElPTj50aGUgc3RyaW5nIHRoYXQgc2hvdWxkIGJlIHB1dCB0byByZXBsYWNlIHRoZSB0b2tlbiB3aGVuIHRoZSBmaWxlIGlzIGNvcGllPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJmaWx0ZXJzZmlsZSIgUkVRVUlSRUQ9InllcyoiPgotCQkJPERFU0NSSVBUSU9OPlRoZSBmaWxlIGZyb20gd2hpY2ggdGhlIGZpbHRlcnMgbXVzdCBiZSByZWFkLiBUaGlzIGZpbGUgbXVzdCBiZSBhIGZvcm1hdHRlZCBhcyBhIHByb3BlcnR5IGZpbGUuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9ImZpeGNybGYiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7Ci1BZGp1c3RzIGEgdGV4dCBmaWxlIHRvIGxvY2FsIGNvbnZlbnRpb25zLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1UaGUgc2V0IG9mIGZpbGVzIHRvIGJlIGFkanVzdGVkIGNhbiBiZSByZWZpbmVkIHdpdGggdGhlCi0mbHQ7aSZndDtpbmNsdWRlcyZsdDsvaSZndDssICZsdDtpJmd0O2luY2x1ZGVzZmlsZSZsdDsvaSZndDssICZsdDtpJmd0O2V4Y2x1ZGVzJmx0Oy9pJmd0OywKLSZsdDtpJmd0O2V4Y2x1ZGVzZmlsZSZsdDsvaSZndDsgYW5kICZsdDtpJmd0O2RlZmF1bHRleGNsdWRlcyZsdDsvaSZndDsKLWF0dHJpYnV0ZXMuIFBhdHRlcm5zIHByb3ZpZGVkIHRocm91Z2ggdGhlICZsdDtpJmd0O2luY2x1ZGVzJmx0Oy9pJmd0OyBvcgotJmx0O2kmZ3Q7aW5jbHVkZXNmaWxlJmx0Oy9pJmd0OyBhdHRyaWJ1dGVzIHNwZWNpZnkgZmlsZXMgdG8gYmUKLWluY2x1ZGVkLiBQYXR0ZXJucyBwcm92aWRlZCB0aHJvdWdoIHRoZSAmbHQ7aSZndDtleGNsdWRlJmx0Oy9pJmd0OyBvcgotJmx0O2kmZ3Q7ZXhjbHVkZXNmaWxlJmx0Oy9pJmd0OyBhdHRyaWJ1dGUgc3BlY2lmeSBmaWxlcyB0byBiZQotZXhjbHVkZWQuIEFkZGl0aW9uYWxseSwgZGVmYXVsdCBleGNsdXNpb25zIGNhbiBiZSBzcGVjaWZpZWQgd2l0aAotdGhlICZsdDtpJmd0O2RlZmF1bHRleGNsdWRlcyZsdDsvaSZndDsgYXR0cmlidXRlLiBTZWUgdGhlIHNlY3Rpb24gb24gJmx0O2EKLWhyZWY9JnF1b3Q7Li4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzJnF1b3Q7Jmd0O2RpcmVjdG9yeSBiYXNlZAotdGFza3MmbHQ7L2EmZ3Q7LCBmb3IgZGV0YWlscyBvZiBmaWxlIGluY2x1c2lvbi9leGNsdXNpb24gcGF0dGVybnMKLWFuZCB0aGVpciB1c2FnZS4KLSZsdDsvcCZndDsKLSZsdDtwJmd0O1RoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCAmbHQ7YSBocmVmPSZxdW90Oy4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwmcXVvdDsmZ3Q7RmlsZVNldCZsdDsvYSZndDsgYW5kCi1zdXBwb3J0cyBhbGwgYXR0cmlidXRlcyBvZiAmbHQ7Y29kZSZndDsmYW1wO2x0O2ZpbGVzZXQmYW1wO2d0OyZsdDsvY29kZSZndDsKLSgmbHQ7Y29kZSZndDtkaXImbHQ7L2NvZGUmZ3Q7IGJlY29tZXMgJmx0O2NvZGUmZ3Q7c3JjZGlyJmx0Oy9jb2RlJmd0OykgYXMgd2VsbCBhcyB0aGUgbmVzdGVkCi0mbHQ7Y29kZSZndDsmYW1wO2x0O2luY2x1ZGUmYW1wO2d0OyZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0OyZhbXA7bHQ7ZXhjbHVkZSZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyBhbmQKLSZsdDtjb2RlJmd0OyZhbXA7bHQ7cGF0dGVybnNldCZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyBlbGVtZW50cy4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLVRoZSBvdXRwdXQgZmlsZSBpcyBvbmx5IHdyaXR0ZW4gaWYgaXQgaXMgYSBuZXcgZmlsZSwgb3IgaWYgaXQKLWRpZmZlcnMgZnJvbSB0aGUgZXhpc3RpbmcgZmlsZS4gIFRoaXMgcHJldmVudHMgc3B1cmlvdXMKLXJlYnVpbGRzIGJhc2VkIG9uIHVuY2hhbmdlZCBmaWxlcyB3aGljaCBoYXZlIGJlZW4gcmVnZW5lcmF0ZWQKLWJ5IHRoaXMgdGFzay4KLSZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0ic3JjZGlyIiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj5XaGVyZSB0byBmaW5kIHRoZSBmaWxlcyB0byBiZSBmaXhlZCB1cDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZGVzdGRpciIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5XaGVyZSB0byBwbGFjZSB0aGUgY29ycmVjdGVkIGZpbGVzLiAgRGVmYXVsdHMgdG9zcmNEaXIgKHJlcGxhY2luZyB0aGUgb3JpZ2luYWwgZmlsZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZWluY2x1ZGVkLiBBbGwgZmlsZXMgYXJlIGluY2x1ZGVkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpc3Rha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJleGNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlZXhjbHVkZWQuIE5vIGZpbGVzIChleGNlcHQgZGVmYXVsdCBleGNsdWRlcykgYXJlIGV4Y2x1ZGVkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpc3Rha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkZWZhdWx0ZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+aW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImVvbCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TcGVjaWZpZXMgaG93IGVuZC1vZi1saW5lIChFT0wpIGNoYXJhY3RlcnMgYXJlIHRvIGJlaGFuZGxlZC4gIFRoZSBFT0wgY2hhcmFjdGVycyBhcmUgQ1IsIExGIGFuZCB0aGUgcGFpciBDUkxGLlZhbGlkIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eSBhcmU6YXNpczogbGVhdmUgRU9MIGNoYXJhY3RlcnMgYWxvbmVjcjogY29udmVydCBhbGwgRU9McyB0byBhIHNpbmdsZSBDUmxmOiBjb252ZXJ0IGFsbCBFT0xzIHRvIGEgc2luZ2xlIExGY3JsZjogY29udmVydCBhbGwgRU9McyB0byB0aGUgcGFpciBDUkxGRGVmYXVsdCBpcyBiYXNlZCBvbiB0aGUgcGxhdGZvcm0gb24gd2hpY2ggeW91IGFyZSBydW5uaW5ndGhpcyB0YXNrLiAgRm9yIFVuaXggcGxhdGZvcm1zLCB0aGUgZGVmYXVsdCBpcyAmcXVvdDtsZiZxdW90Oy5Gb3IgRE9TIGJhc2VkIHN5c3RlbXMgKGluY2x1ZGluZyBXaW5kb3dzKSwgdGhlIGRlZmF1bHQgaXMmcXVvdDtjcmxmJnF1b3Q7LiAgRm9yIE1hYyBPUywgdGhlIGRlZmF1bHQgaXMgJnF1b3Q7Y3ImcXVvdDsuVGhpcyBpcyB0aGUgcHJlZmVycmVkIG1ldGhvZCBmb3Igc3BlY2lmeWluZyBFT0wuICBUaGUmcXVvdDtjciZxdW90OyBhdHRyaWJ1dGUgKHNlZSBiZWxvdykgaXNub3cgZGVwcmVjYXRlZC5OLkIuOiBPbmUgc3BlY2lhbCBjYXNlIGlzIHJlY29nbml6ZWQuIFRoZSB0aHJlZWNoYXJhY3RlcnMgQ1ItQ1ItTEYgYXJlIHJlZ2FyZGVkIGFzIGEgc2luZ2xlIEVPTC5Vbmxlc3MgdGhpcyBwcm9wZXJ0eSBpcyBzcGVjaWZpZWQgYXMgJnF1b3Q7YXNpcyZxdW90Oyx0aGlzIHNlcXVlbmNlIHdpbGwgYmUgY29udmVydGVkIGludG8gdGhlIHNwZWNpZmllZCBFT0x0eXBlLjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY3IiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+RGVwcmVjYXRlZC4gU3BlY2lmaWVzIGhvdyBDUiBjaGFyYWN0ZXJzIGFyZXRvIGJlIGhhbmRsZWQgYXQgZW5kLW9mLWxpbmUgKEVPTCkuICBWYWxpZCB2YWx1ZXMgZm9yIHRoaXNwcm9wZXJ0eSBhcmU6YXNpczogbGVhdmUgRU9MIGNoYXJhY3RlcnMgYWxvbmUuYWRkOiBhZGQgYSBDUiBiZWZvcmUgYW55IHNpbmdsZSBMRiBjaGFyYWN0ZXJzLiBUaGVpbnRlbnQgaXMgdG8gY29udmVydCBhbGwgRU9McyB0byB0aGUgcGFpciBDUkxGLnJlbW92ZTogcmVtb3ZlIGFsbCBDUnMgZnJvbSB0aGUgZmlsZS4gIFRoZSBpbnRlbnQgaXN0byBjb252ZXJ0IGFsbCBFT0xzIHRvIGEgc2luZ2xlIExGLkRlZmF1bHQgaXMgYmFzZWQgb24gdGhlIHBsYXRmb3JtIG9uIHdoaWNoIHlvdSBhcmUgcnVubmluZ3RoaXMgdGFzay4gIEZvciBVbml4IHBsYXRmb3JtcywgdGhlIGRlZmF1bHQgaXMgJnF1b3Q7cmVtb3ZlJnF1b3Q7LkZvciBET1MgYmFzZWQgc3lzdGVtcyAoaW5jbHVkaW5nIFdpbmRvd3MpLCB0aGUgZGVmYXVsdCBpcyZxdW90O2FkZCZxdW90Oy5OLkIuOiBPbmUgc3BlY2lhbCBjYXNlIGlzIHJlY29nbml6ZWQuIFRoZSB0aHJlZWNoYXJhY3RlcnMgQ1ItQ1ItTEYgYXJlIHJlZ2FyZGVkIGFzIGEgc2luZ2xlIEVPTC5Vbmxlc3MgdGhpcyBwcm9wZXJ0eSBpcyBzcGVjaWZpZWQgYXMgJnF1b3Q7YXNpcyZxdW90Oyx0aGlzIHNlcXVlbmNlIHdpbGwgYmUgY29udmVydGVkIGludG8gdGhlIHNwZWNpZmllZCBFT0x0eXBlLjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iamF2YWZpbGVzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlVzZWQgb25seSBpbiBhc3NvY2lhdGlvbiB3aXRoIHRoZSZxdW90O3RhYiZxdW90OyBhdHRyaWJ1dGUgKHNlZSBiZWxvdyksIHRoaXNib29sZWFuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZmlsZXNldCBpcyBhIHNldG9mIGphdmEgc291cmNlIGZpbGVzKCZxdW90O3llcyZxdW90Oy8mcXVvdDtubyZxdW90OykuIERlZmF1bHRzIHRvJnF1b3Q7bm8mcXVvdDsuICBTZWUgbm90ZXMgaW4gc2VjdGlvbiBvbiAmcXVvdDt0YWImcXVvdDsuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ0YWIiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U3BlY2lmaWVzIGhvdyB0YWIgY2hhcmFjdGVycyBhcmUgdG8gYmUgaGFuZGxlZC4gIFZhbGlkdmFsdWVzIGZvciB0aGlzIHByb3BlcnR5IGFyZTphZGQ6IGNvbnZlcnQgc2VxdWVuY2VzIG9mIHNwYWNlcyB3aGljaCBzcGFuIGEgdGFiIHN0b3AgdG8gdGFic2FzaXM6IGxlYXZlIHRhYiBhbmQgc3BhY2UgY2hhcmFjdGVycyBhbG9uZXJlbW92ZTogY29udmVydCB0YWJzIHRvIHNwYWNlc0RlZmF1bHQgZm9yIHRoaXMgcGFyYW1ldGVyIGlzICZxdW90O2FzaXMmcXVvdDsuTi5CLjogV2hlbiB0aGUgYXR0cmlidXRlJnF1b3Q7amF2YWZpbGVzJnF1b3Q7IChzZWUgYWJvdmUpIGlzJnF1b3Q7dHJ1ZSZxdW90OywgbGl0ZXJhbCBUQUIgY2hhcmFjdGVycyBvY2N1cnJpbmd3aXRoaW4gSmF2YSBzdHJpbmcgb3IgY2hhcmFjdGVyIGNvbnN0YW50cyBhcmUgbmV2ZXJtb2RpZmllZC4gIFRoaXMgZnVuY3Rpb25hbGl0eSBhbHNvIHJlcXVpcmVzIHRoZXJlY29nbml0aW9uIG9mIEphdmEtc3R5bGUgY29tbWVudHMuTi5CLjogVGhlcmUgaXMgYW4gaW5jb21wYXRpYmlsaXR5IGJldHdlZW4gdGhpc2FuZCB0aGUgcHJldmlvdXMgdmVyc2lvbiBpbiB0aGUgaGFuZGxpbmcgb2Ygd2hpdGVzcGFjZSBhdCB0aGUgZW5kIG9mIGxpbmVzLiAgVGhpcyB2ZXJzaW9uIGRvZXNub3QgcmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2Ugb24gbGluZXMuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ0YWJsZW5ndGgiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VEFCIGNoYXJhY3RlciBpbnRlcnZhbC4gVmFsaWQgdmFsdWVzIGFyZSBiZXR3ZWVuMiBhbmQgODAgaW5jbHVzaXZlLiAgVGhlIGRlZmF1bHQgZm9yIHRoaXMgcGFyYW1ldGVyIGlzIDg8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImVvZiIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TcGVjaWZpZXMgaG93IERPUyBlbmQgb2YgZmlsZSAoY29udHJvbC1aKSBjaGFyYWN0ZXJzIGFyZXRvIGJlIGhhbmRsZWQuICBWYWxpZCB2YWx1ZXMgZm9yIHRoaXMgcHJvcGVydHkgYXJlOmFkZDogZW5zdXJlIHRoYXQgdGhlcmUgaXMgYW4gRU9GIGNoYXJhY3RlciBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlYXNpczogbGVhdmUgRU9GIGNoYXJhY3RlcnMgYWxvbmVyZW1vdmU6IHJlbW92ZSBhbnkgRU9GIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kRGVmYXVsdCBpcyBiYXNlZCBvbiB0aGUgcGxhdGZvcm0gb24gd2hpY2ggeW91IGFyZSBydW5uaW5nIHRoaXMgdGFzay5Gb3IgVW5peCBwbGF0Zm9ybXMsIHRoZSBkZWZhdWx0IGlzIHJlbW92ZS4gIEZvciBET1MgYmFzZWQgc3lzdGVtcyhpbmNsdWRpbmcgV2luZG93cyksIHRoZSBkZWZhdWx0IGlzIGFzaXMuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJlbmNvZGluZyIgUkVRVUlSRUQ9Im5vIC0gZGVmYXVsdHMgdG8gZGVmYXVsdCBqdm0gZW5jb2RpbmciPgotCQkJPERFU0NSSVBUSU9OPlRoZSBlbmNvZGluZyBvZiB0aGUgZmlsZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJnZW5rZXkiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7R2VuZXJhdGVzIGEga2V5IGluIGtleXN0b3JlLiBUaGlzIHRhc2sgbmVlZHMgSmF2YTEuMiBvciBsYXRlciZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0iYWxpYXMiIFJFUVVJUkVEPSJ5ZXMuIj4KLQkJCTxERVNDUklQVElPTj50aGUgYWxpYXMgdG8gYWRkIHVuZGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InN0b3JlcGFzcyIgUkVRVUlSRUQ9Inllcy4iPgotCQkJPERFU0NSSVBUSU9OPnBhc3N3b3JkIGZvciBrZXlzdG9yZSBpbnRlZ3JpdHkuIE11c3RiZSBhdCBsZWFzdCA2IGNoYXJhY3RlcnMgbG9uPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJrZXlzdG9yZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5rZXlzdG9yZSBsb2NhdGlvPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzdG9yZXR5cGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+a2V5c3RvcmUgdHlwPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJrZXlwYXNzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnBhc3N3b3JkIGZvciBwcml2YXRlIGtleSAoaWYgZGlmZmVyZW50PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzaWdhbGciIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGFsZ29yaXRobSB0byB1c2UgaW4gc2lnbmluPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJrZXlhbGciIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIG1ldGhvZCB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIG5hbWUtdmFsdWUgcGFpPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ2ZXJib3NlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPih0cnVlIHwgZmFsc2UpIHZlcmJvc2Ugb3V0cHV0IHdoZW4gc2lnbmluPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkbmFtZSIgUkVRVUlSRUQ9InllcyBpZiBkbmFtZSBlbGVtZW50IHVuc3BlY2lmaWVkIj4KLQkJCTxERVNDUklQVElPTj5UaGUgZGlzdGluZ3Vpc2hlZCBuYW1lIGZvciBlbnRpdDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idmFsaWRpdHkiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+KGludGVnZXIpIGluZGljYXRlcyBob3cgbWFueSBkYXlzIGNlcnRpZmljYXRlIGlzIHZhbGk8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImtleXNpemUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+KGludGVnZXIpIGluZGljYXRlcyB0aGUgc2l6ZSBvZiBrZXkgZ2VuZXJhdGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0iZ2V0Ij4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0dldHMgYSBmaWxlIGZyb20gYSBVUkwuIFdoZW4gdGhlIHZlcmJvc2Ugb3B0aW9uIGlzICZhbXA7cXVvdDtvbiZhbXA7cXVvdDssIHRoaXMgdGFzawotZGlzcGxheXMgYSAnLicgZm9yIGV2ZXJ5IDEwMCBLYiByZXRyaWV2ZWQuIEFueSBVUkwgc2NoZW1hIHN1cHBvcnRlZCBieQotdGhlIHJ1bnRpbWUgaXMgdmFsaWQgaGVyZSwgaW5jbHVkaW5nIGh0dHA6LCBmdHA6IGFuZCBqYXI6OyAKLWh0dHBzOiBpcyBvbmx5IHZhbGlkIGlmIHRoZSBhcHByb3ByaWF0ZSBzdXBwb3J0IGlzIGFkZGVkIHRvIHRoZSBwcmUtMS40IEphdmEKLXJ1bnRpbWVzLiAKLSZsdDsvcCZndDsKLSZsdDtwJmd0O1RoaXMgdGFzayBzaG91bGQgYmUgcHJlZmVycmVkIGFib3ZlIHRoZSAmbHQ7YSBocmVmPSZxdW90O2N2cy5odG1sJnF1b3Q7Jmd0O0NWUyB0YXNrJmx0Oy9hJmd0OyB3aGVuCi1mZXRjaGluZyByZW1vdGUgY29udGVudC4gQ1ZTIGlzIHNpZ25pZmljYW50bHkgc2xvd2VyIHRoYW4gbG9hZGluZyBhIGNvbXByZXNzZWQKLWFyY2hpdmUgY29tcGFyZWQgdG8gaHR0cC9mdHAuJmx0Oy9wJmd0OwotVGhlICZsdDtpJmd0O3VzZXRpbWVzdGFtcCZsdDsvaSZndDsgb3B0aW9uIGVuYWJsZXMgeW91IHRvIGNvbnRyb2wgZG93bmxvYWRzIHNvIHRoYXQgdGhlIHJlbW90ZSBmaWxlIGlzCi1vbmx5IGZldGNoZWQgaWYgbmV3ZXIgdGhhbiB0aGUgbG9jYWwgY29weS4gSWYgdGhlcmUgaXMgbm8gbG9jYWwgY29weSwgdGhlIGRvd25sb2FkIGFsd2F5cyB0YWtlcyAKLXBsYWNlLiBXaGVuIGEgZmlsZSBpcyBkb3dubG9hZGVkLCB0aGUgdGltZXN0YW1wIG9mIHRoZSBkb3dubG9hZGVkIGZpbGUgaXMgc2V0IHRvIHRoZSByZW1vdGUgdGltZXN0YW1wLAotaWYgIHRoZSBKVk0gaXMgSmF2YTEuMiBvciBsYXRlci4gCi1OQjogVGhpcyB0aW1lc3RhbXAgZmFjaWxpdHkgb25seSB3b3JrcyBvbiBkb3dubG9hZHMgdXNpbmcgdGhlIEhUVFAgcHJvdG9jb2wuIAotJmx0O3AmZ3Q7Ci1BIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBjYW4gYmUgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIGJhc2ljICdzbGlnaHRseSBlbmNvZGVkCi1wbGFpbiB0ZXh0JyBhdXRoZW50aWNhdGlvbiBpcyB1c2VkLiBUaGlzIGlzIG9ubHkgYSBzZWN1cmUgYXV0aGVudGljYXRpb24KLW1lY2hhbmlzbSBvdmVyIGFuIEhUVFBTIGxpbmsuCi0mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9InNyYyIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIFVSTCBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIGEgZmlsZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZGVzdCIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGZpbGUgd2hlcmUgdG8gc3RvcmUgdGhlIHJldHJpZXZlZCBmaWxlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ2ZXJib3NlIiBSRVFVSVJFRD0ibm87IGRlZmF1bHQgJnF1b3Q7ZmFsc2UmcXVvdDsiPgotCQkJPERFU0NSSVBUSU9OPnNob3cgdmVyYm9zZSBwcm9ncmVzcyBpbmZvcm1hdGlvbiAoJnF1b3Q7b24mcXVvdDsvJnF1b3Q7b2ZmJnF1b3Q7KTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaWdub3JlZXJyb3JzIiBSRVFVSVJFRD0ibm87IGRlZmF1bHQgJnF1b3Q7ZmFsc2UmcXVvdDsiPgotCQkJPERFU0NSSVBUSU9OPkxvZyBlcnJvcnMgYnV0IGRvbid0IHRyZWF0IGFzIGZhdGFsPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ1c2V0aW1lc3RhbXAiIFJFUVVJUkVEPSJubzsgZGVmYXVsdCAmcXVvdDtmYWxzZSZxdW90OyI+Ci0JCQk8REVTQ1JJUFRJT04+Y29uZGl0aW9uYWxseSBkb3dubG9hZCBhIGZpbGUgYmFzZWQgb24gdGhlIHRpbWVzdGFtcCBvZiB0aGVsb2NhbCBjb3B5LiBIVFRQIG9ubDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idXNlcm5hbWUiIFJFUVVJUkVEPSJpZiBwYXNzd29yZCBpcyBzZXQiPgotCQkJPERFU0NSSVBUSU9OPnVzZXJuYW1lIGZvciAnQkFTSUMnIGh0dHAgYXV0aGVudGljYXRpbzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0icGFzc3dvcmQiIFJFUVVJUkVEPSJpZiB1c2VybmFtZSBpcyBzZXQiPgotCQkJPERFU0NSSVBUSU9OPnBhc3N3b3JkOiByZXF1aXJlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJpbnB1dCI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtBbGxvd3MgdXNlciBpbnRlcmFjdGlvbiBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MgYnkgcHJvbXB0aW5nIGZvcgotaW5wdXQuICBUbyBkbyBzbywgaXQgdXNlcyB0aGUgY29uZmlndXJlZCAKLSZsdDthIGhyZWY9JnF1b3Q7Li4vaW5wdXRoYW5kbGVyLmh0bWwmcXVvdDsmZ3Q7SW5wdXRIYW5kbGVyJmx0Oy9hJmd0Oy4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtUaGUgcHJvbXB0IGNhbiBiZSBzZXQgdmlhIHRoZSBtZXNzYWdlIGF0dHJpYnV0ZSBvciBhcyBjaGFyYWN0ZXIKLWRhdGEgbmVzdGVkIGludG8gdGhlIGVsZW1lbnQuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7T3B0aW5vbmFsbHkgYSBzZXQgb2YgdmFsaWQgaW1wdXQgYXJndW1lbnRzIGNhbiBiZSBkZWZpbmVkIHZpYSB0aGUKLXZhbGlkYXJncyBhdHRyaWJ1dGUuIElucHV0IHRhc2sgd2lsbCBubyBhY2NlcHQgdmFsdWUgdGhhdCBkb24ndCBtYXRjaAotb25lIG9mIHRoZSBwcmVkZWZpbmVkLiZsdDsvcCZndDsKLSZsdDtwJmd0O09wdGlvbmFsbHkgYSBwcm9wZXJ0eSBjYW4gYmUgY3JlYXRlZCBmcm9tIHRoZSB2YWx1ZSBlbnRlcmVkIGJ5IHRoZQotdXNlci4gVGhpcyBwcm9wZXJ0eSBjYW4gdGhlbiBiZSB1c2VkIGR1cmluZyB0aGUgZm9sbG93aW5nIGJ1aWxkCi1ydW4uIElucHV0IGJlaGF2ZXMgYWNjb3JkaW5nIHRvICZsdDthIGhyZWY9JnF1b3Q7cHJvcGVydHkuaHRtbCZxdW90OyZndDtwcm9wZXJ0eQotdGFzayZsdDsvYSZndDsgd2hpY2ggbWVhbnMgdGhhdCBleGlzdGluZyBwcm9wZXJ0aWVzIGNhbm5vdCBiZSBvdmVycmlkZW4uJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJtZXNzYWdlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBNZXNzYWdlIHdoaWNoIGdldHMgZGlzcGxheWVkIHRvIHRoZSB1c2VyZHVyaW5nIHRoZSBidWlsZCBydW48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InZhbGlkYXJncyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5jb21tYSBzZXBhcmF0ZWQgU3RyaW5nIGNvbnRhaW5pbmcgdmFsaWQgaW5wdXRhcmd1bWVudHMuIElmIHNldCwgaW5wdXQgdGFzayB3aWxsIHJlamVjdCBhbnkgaW5wdXQgbm90IGRlZmluZWRoZXJlLiAgVmFsaWRhcmdzIGFyZSBjb21wYXJlZCBjYXNlIHNlbnNpdGl2ZS4gSWYgeW91IHdhbnQgJ2EnIGFuZCdBJyB0byBiZSBhY2NlcHRlZCB5b3Ugd2lsbCBuZWVkIHRvIGRlZmluZSBib3RoIGFyZ3VtZW50cyB3aXRoaW52YWxpZGFyZ3M8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImFkZHByb3BlcnR5IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgcHJvcGVydHkgdG8gYmUgY3JlYXRlZCBmcm9taW5wdXQuIEJlaGF2aW91ciBpcyBlcXVhbCB0byBwcm9wZXJ0eXRhc2sgd2hpY2ggbWVhbnMgdGhhdCBleGlzdGluZyBwcm9wZXJ0aWVzIGNhbm5vdCBiZW92ZXJyaWRlbjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJqYXIiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7SmFycyBhIHNldCBvZiBmaWxlcy4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtUaGUgJmx0O2kmZ3Q7YmFzZWRpciZsdDsvaSZndDsgYXR0cmlidXRlIGlzIHRoZSByZWZlcmVuY2UgZGlyZWN0b3J5IGZyb20gd2hlcmUgdG8gamFyLiZsdDsvcCZndDsKLSZsdDtwJmd0O05vdGUgdGhhdCBmaWxlIHBlcm1pc3Npb25zIHdpbGwgbm90IGJlIHN0b3JlZCBpbiB0aGUgcmVzdWx0aW5nIGphcmZpbGUuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7SXQgaXMgcG9zc2libGUgdG8gcmVmaW5lIHRoZSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgYmVpbmcgamFycmVkLiBUaGlzIGNhbiBiZQotZG9uZSB3aXRoIHRoZSAmbHQ7aSZndDtpbmNsdWRlcyZsdDsvaSZndDssICZsdDtpJmd0O2luY2x1ZGVzZmlsZSZsdDsvaSZndDssICZsdDtpJmd0O2V4Y2x1ZGVzJmx0Oy9pJmd0OywgJmx0O2kmZ3Q7ZXhjbHVkZXNmaWxlJmx0Oy9pJmd0OyBhbmQgJmx0O2kmZ3Q7ZGVmYXVsdGV4Y2x1ZGVzJmx0Oy9pJmd0OwotYXR0cmlidXRlcy4gV2l0aCB0aGUgJmx0O2kmZ3Q7aW5jbHVkZXMmbHQ7L2kmZ3Q7IG9yICZsdDtpJmd0O2luY2x1ZGVzZmlsZSZsdDsvaSZndDsgYXR0cmlidXRlIHlvdSBzcGVjaWZ5IHRoZSBmaWxlcyB5b3Ugd2FudCB0bwotaGF2ZSBpbmNsdWRlZCBieSB1c2luZyBwYXR0ZXJucy4gVGhlICZsdDtpJmd0O2V4Y2x1ZGUmbHQ7L2kmZ3Q7IG9yICZsdDtpJmd0O2V4Y2x1ZGVzZmlsZSZsdDsvaSZndDsgYXR0cmlidXRlIGlzIHVzZWQgdG8gc3BlY2lmeQotdGhlIGZpbGVzIHlvdSB3YW50IHRvIGhhdmUgZXhjbHVkZWQuIFRoaXMgaXMgYWxzbyBkb25lIHdpdGggcGF0dGVybnMuIEFuZAotZmluYWxseSB3aXRoIHRoZSAmbHQ7aSZndDtkZWZhdWx0ZXhjbHVkZXMmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSwgeW91IGNhbiBzcGVjaWZ5IHdoZXRoZXIgeW91Ci13YW50IHRvIHVzZSBkZWZhdWx0IGV4Y2x1c2lvbnMgb3Igbm90LiBTZWUgdGhlIHNlY3Rpb24gb24gJmx0O2EKLWhyZWY9JnF1b3Q7Li4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzJnF1b3Q7Jmd0O2RpcmVjdG9yeSBiYXNlZCB0YXNrcyZsdDsvYSZndDssIG9uIGhvdyB0aGUKLWluY2x1c2lvbi9leGNsdXNpb24gb2YgZmlsZXMgd29ya3MsIGFuZCBob3cgdG8gd3JpdGUgcGF0dGVybnMuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7VGhpcyB0YXNrIGZvcm1zIGFuIGltcGxpY2l0ICZsdDthIGhyZWY9JnF1b3Q7Li4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCZxdW90OyZndDtGaWxlU2V0Jmx0Oy9hJmd0OyBhbmQKLXN1cHBvcnRzIGFsbCBhdHRyaWJ1dGVzIG9mICZsdDtjb2RlJmd0OyZhbXA7bHQ7ZmlsZXNldCZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OwotKCZsdDtjb2RlJmd0O2RpciZsdDsvY29kZSZndDsgYmVjb21lcyAmbHQ7Y29kZSZndDtiYXNlZGlyJmx0Oy9jb2RlJmd0OykgYXMgd2VsbCBhcyB0aGUgbmVzdGVkCi0mbHQ7Y29kZSZndDsmYW1wO2x0O2luY2x1ZGUmYW1wO2d0OyZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0OyZhbXA7bHQ7ZXhjbHVkZSZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyBhbmQKLSZsdDtjb2RlJmd0OyZhbXA7bHQ7cGF0dGVybnNldCZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyBlbGVtZW50cy4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtZb3UgY2FuIGFsc28gdXNlIG5lc3RlZCBmaWxlIHNldHMgZm9yIG1vcmUgZmxleGliaWxpdHksIGFuZCBzcGVjaWZ5Ci1tdWx0aXBsZSBvbmVzIHRvIG1lcmdlIHRvZ2V0aGVyIGRpZmZlcmVudCB0cmVlcyBvZiBmaWxlcyBpbnRvIG9uZSBKQVIuCi1UaGUgZXh0ZW5kZWQgZmlsZXNldCBhbmQgZ3JvdXBmaWxlc2V0IGF0dHJpYnV0ZXMgZnJvbSB0aGUgemlwIHRhc2sgYXJlCi1hbHNvIGF2YWlsYWJsZSBpbiB0aGUgamFyIHRhc2suCi1TZWUgdGhlICZsdDthIGhyZWY9JnF1b3Q7emlwLmh0bWwmcXVvdDsmZ3Q7WmlwJmx0Oy9hJmd0OyB0YXNrIGZvciBtb3JlIGRldGFpbHMgYW5kIGV4YW1wbGVzLiZsdDsvcCZndDsKLSZsdDtwJmd0O0lmIHRoZSBtYW5pZmVzdCBpcyBvbWl0dGVkLCBhIHNpbXBsZSBvbmUgd2lsbCBiZSBzdXBwbGllZCBieSBBbnQuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7VGhlICZsdDtjb2RlJmd0O3VwZGF0ZSZsdDsvY29kZSZndDsgcGFyYW1ldGVyIGNvbnRyb2xzIHdoYXQgaGFwcGVucyBpZiB0aGUKLUpBUiBmaWxlIGFscmVhZHkgZXhpc3RzLiBXaGVuIHNldCB0byAmbHQ7Y29kZSZndDt5ZXMmbHQ7L2NvZGUmZ3Q7LCB0aGUgSkFSIGZpbGUgaXMKLXVwZGF0ZWQgd2l0aCB0aGUgZmlsZXMgc3BlY2lmaWVkLiBXaGVuIHNldCB0byAmbHQ7Y29kZSZndDtubyZsdDsvY29kZSZndDsgKHRoZQotZGVmYXVsdCkgdGhlIEpBUiBmaWxlIGlzIG92ZXJ3cml0dGVuLiBBbiBleGFtcGxlIHVzZSBvZiB0aGlzIGlzCi1wcm92aWRlZCBpbiB0aGUgJmx0O2EgaHJlZj0mcXVvdDt6aXAuaHRtbCZxdW90OyZndDtaaXAgdGFzayBkb2N1bWVudGF0aW9uJmx0Oy9hJmd0Oy4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsoVGhlIEphciB0YXNrIGlzIGEgc2hvcnRjdXQgZm9yIHNwZWNpZnlpbmcgdGhlIG1hbmlmZXN0IGZpbGUgb2YgYSBKQVIgZmlsZS4KLVRoZSBzYW1lIHRoaW5nIGNhbiBiZSBhY2NvbXBsaXNoZWQgYnkgdXNpbmcgdGhlICZsdDtpJmd0O2Z1bGxwYXRoJmx0Oy9pJmd0OwotYXR0cmlidXRlIG9mIGEgemlwZmlsZXNldCBpbiBhIFppcCB0YXNrLiBUaGUgb25lIGRpZmZlcmVuY2UgaXMgdGhhdCBpZiB0aGUKLSZsdDtpJmd0O21hbmlmZXN0Jmx0Oy9pJmd0OyBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCwgdGhlIEphciB0YXNrIHdpbGwKLWluY2x1ZGUgYW4gZW1wdHkgb25lIGZvciB5b3UuKSZsdDsvcCZndDsKLSZsdDtwJmd0O01hbmlmZXN0cyBhcmUgcHJvY2Vzc2VkIGJ5IHRoZSBKYXIgdGFzayBhY2NvcmRpbmcgdG8gdGhlCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy9ndWlkZS9qYXIvamFyLmh0bWwmcXVvdDsmZ3Q7SmFyIGZpbGUgc3BlY2lmaWNhdGlvbi4mbHQ7L2EmZ3Q7Ci1Ob3RlIGluIHBhcnRpY3VsYXIgdGhhdCB0aGlzIG1heSByZXN1bHQgaW4gbWFuaWZlc3QgbGluZXMgZ3JlYXRlciB0aGFuIDcyIGJ5dGVzCi1iZWluZyB3cmFwcGVkIGFuZCBjb250aW51ZWQgb24gdGhlIG5leHQgbGluZS4KLSZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0iZGVzdGZpbGUiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPnRoZSBKQVIgZmlsZSB0byBjcmVhdGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImJhc2VkaXIiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHRvIGphciB0aGUgZmlsZXM8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNvbXByZXNzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPk5vdCBvbmx5IHN0b3JlIGRhdGEgYnV0IGFsc28gY29tcHJlc3MgdGhlbSwgZGVmYXVsdHMgdG8gdHJ1PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJlbmNvZGluZyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5UaGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIHVzZSBmb3IgZmlsZW5hbWVzaW5zaWRlIHRoZSBhcmNoaXZlLiAgRGVmYXVsdHMgdG8gVVRGOC4gSXQgaXMgbm90cmVjb21tZW5kZWQgdG8gY2hhbmdlIHRoaXMgdmFsdWUgYXMgdGhlIGNyZWF0ZWQgYXJjaGl2ZSB3aWxsIG1vc3RsaWtlbHkgYmUgdW5yZWFkYWJsZSBmb3IgSmF2YSBvdGhlcndpc2U8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZpbGVzb25seSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TdG9yZSBvbmx5IGZpbGUgZW50cmllcywgZGVmYXVsdHMgdG8gZmFsczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZWluY2x1ZGVkLiBBbGwgZmlsZXMgYXJlIGluY2x1ZGVkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpc3Rha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJleGNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlZXhjbHVkZWQuIE5vIGZpbGVzIChleGNlcHQgZGVmYXVsdCBleGNsdWRlcykgYXJlIGV4Y2x1ZGVkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpc3Rha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkZWZhdWx0ZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+aW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im1hbmlmZXN0IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBtYW5pZmVzdCBmaWxlIHRvIHVzZS4gIFRoaXMgY2FuIGJlIGVpdGhlciB0aGUgbG9jYXRpb24gb2YgYSBtYW5pZmVzdCwgb3IgdGhlIG5hbWUgb2YgYSBqYXIgYWRkZWQgdGhyb3VnaCBhIGZpbGVzZXQuICBJZiBpdHMgdGhlIG5hbWUgb2YgYW4gYWRkZWQgamFyLCB0aGUgdGFzayBleHBlY3RzIHRoZSBtYW5pZmVzdCB0byBiZSBpbiB0aGUgamFyIGF0IE1FVEEtSU5GL01BTklGRVNULk08L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InVwZGF0ZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5pbmRpY2F0ZXMgd2hldGhlciB0byB1cGRhdGUgb3Igb3ZlcndyaXRldGhlIGRlc3RpbmF0aW9uIGZpbGUgaWYgaXQgYWxyZWFkeSBleGlzdHM8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9IndoZW5lbXB0eSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5iZWhhdmlvciB3aGVuIG5vIGZpbGVzIG1hdGNoLiAgVmFsaWQgdmFsdWVzIGFyZSAmcXVvdDtmYWlsJnF1b3Q7LCAmcXVvdDtza2lwJnF1b3Q7LCBhbmQgJnF1b3Q7Y3JlYXRlJnF1b3Q7LiAgRGVmYXVsdCBpcyAmcXVvdDtza2lwJnF1b3Q7PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkdXBsaWNhdGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+YmVoYXZpb3Igd2hlbiBhIGR1cGxpY2F0ZSBmaWxlIGlzIGZvdW5kLiAgVmFsaWQgdmFsdWVzIGFyZSAmcXVvdDthZGQmcXVvdDssICZxdW90O3ByZXNlcnZlJnF1b3Q7LCBhbmQgJnF1b3Q7ZmFpbCZxdW90Oy4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzICZxdW90O2FkZCZxdW90Oy4gPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJpbmRleCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj53aGV0aGVyIHRvIGNyZWF0ZSBhbiBpbmRleCBsaXN0IHRvIHNwZWVkIHVwIGNsYXNzbG9hZGluZy4gIFRoaXMgaXMgYSBKREsgMS4zKyBzcGVjaWZpYyBmZWF0dXJlLiAgRGVmYXVsdHMgdG8gZmFsc2UuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9ImphdmEiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7RXhlY3V0ZXMgYSBKYXZhIGNsYXNzIHdpdGhpbiB0aGUgcnVubmluZyAoQW50KSBWTSBvciBmb3JrcyBhbm90aGVyIFZNIGlmCi1zcGVjaWZpZWQuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1JZiBvZGQgdGhpbmdzIGdvIHdyb25nIHdoZW4geW91IHJ1biB0aGlzIHRhc2ssIHNldCBmb3JrPSZxdW90O3RydWUmcXVvdDsgdG8gdXNlIGEgbmV3Ci1KVk0uCi08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9ImNsYXNzbmFtZSIgUkVRVUlSRUQ9ImVpdGhlciBqYXIgb3IgY2xhc3NuYW1lIj4KLQkJCTxERVNDUklQVElPTj50aGUgSmF2YSBjbGFzcyB0byBleGVjdXRlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJqYXIiIFJFUVVJUkVEPSJlaXRoZXIgamFyIG9yIGNsYXNzbmFtZSI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGxvY2F0aW9uIG9mIHRoZSBqYXIgZmlsZSB0byBleGVjdXRlIChtdXN0IGhhdmUgYSBNYWluLUNsYXNzIGVudHJ5IGluIHRoZSBtYW5pZmVzdCkuIEZvcmsgbXVzdCBiZSBzZXQgdG8gdHJ1ZSBpZiB0aGlzIG9wdGlvbiBpcyBzZWxlY3RlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iYXJncyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj50aGUgYXJndW1lbnRzIGZvciB0aGUgY2xhc3MgdGhhdCBpc2V4ZWN1dGVkLiBkZXByZWNhdGVkLCB1c2UgbmVzdGVkICZsdDthcmcmZ3Q7ZWxlbWVudHMgaW5zdGVhZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY2xhc3NwYXRoIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBjbGFzc3BhdGggdG8gdXNlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJjbGFzc3BhdGhyZWYiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGNsYXNzcGF0aCB0byB1c2UsIGdpdmVuIGFzIHJlZmVyZW5jZSB0byBhIFBBVEggZGVmaW5lZCBlbHNld2hlcmU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZvcmsiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+aWYgZW5hYmxlZCB0cmlnZ2VycyB0aGUgY2xhc3MgZXhlY3V0aW9uIGluIGFub3RoZXIgVk0oZGlzYWJsZWQgYnkgZGVmYXVsdDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ianZtIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBjb21tYW5kIHVzZWQgdG8gaW52b2tlIHRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSxkZWZhdWx0IGlzICdqYXZhJy4gIFRoZSBjb21tYW5kIGlzIHJlc29sdmVkIGJ5IGphdmEubGFuZy5SdW50aW1lLmV4ZWMoKS5JZ25vcmVkIGlmIGZvcmsgaXMgZGlzYWJsZWQuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJqdm1hcmdzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgZm9ya2VkIFZNIChpZ25vcmVkaWYgZm9yayBpcyBkaXNhYmxlZCkuIGRlcHJlY2F0ZWQsIHVzZSBuZXN0ZWQmbHQ7anZtYXJnJmd0OyBlbGVtZW50cyBpbnN0ZWFkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJtYXhtZW1vcnkiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+TWF4IGFtb3VudCBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgdG8gdGhlIGZvcmtlZCBWTShpZ25vcmVkIGlmIGZvcmsgaXMgZGlzYWJsZWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZhaWxvbmVycm9yIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlN0b3AgdGhlIGJ1aWxkcHJvY2VzcyBpZiB0aGUgY29tbWFuZCBleGl0cyB3aXRoIGFyZXR1cm5jb2RlIG90aGVyIHRoYW4gMC4gRGVmYXVsdCBpcyAmcXVvdDtmYWxzZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZGlyIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlRoZSBkaXJlY3RvcnkgdG8gaW52b2tlIHRoZSBWTSBpbi4gIChpZ25vcmVkIGlmZm9yayBpcyBkaXNhYmxlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ib3V0cHV0IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPk5hbWUgb2YgYSBmaWxlIHRvIHdyaXRlIHRoZSBvdXRwdXQgdG88L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImFwcGVuZCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj53aGV0aGVyIG91dHB1dCBzaG91bGQgYmUgYXBwZW5kZWQgdG8gb3Igb3ZlcndyaXRlYW4gZXhpc3RpbmcgZmlsZS4gIERlZmF1bHRzIHRvIGZhbHNlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJuZXdlbnZpcm9ubWVudCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5EbyBub3QgcHJvcGFnYXRlIG9sZCBlbnZpcm9ubWVudCB3aGVuIG5ld2Vudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc3BlY2lmaWVkLiBEZWZhdWx0IGlzICZxdW90O2ZhbHNlJnF1b3Q7KGlnbm9yZWQgaWYgZm9yayBpcyBkaXNhYmxlZCk8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InRpbWVvdXQiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U3RvcCB0aGUgY29tbWFuZCBpZiBpdCBkb2Vzbid0IGZpbmlzaCB3aXRoaW4gdGhlc3BlY2lmaWVkIHRpbWUgKGdpdmVuIGluIG1pbGxpc2Vjb25kcykuICBJdCBpcyBoaWdobHlyZWNvbW1lbmRlZCB0byB1c2UgdGhpcyBmZWF0dXJlIG9ubHkgaWYgZm9yayBpcyBlbmFibGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9ImphdmFjIj4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0NvbXBpbGVzIGEgSmF2YSBzb3VyY2UgdHJlZS4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaXJlY3Rvcnkgd2lsbCBiZSByZWN1cnNpdmVseSBzY2FubmVkIGZvciBKYXZhCi1zb3VyY2UgZmlsZXMgdG8gY29tcGlsZS4gT25seSBKYXZhIGZpbGVzIHRoYXQgaGF2ZSBubyBjb3JyZXNwb25kaW5nCi0mbHQ7Y29kZSZndDsuY2xhc3MmbHQ7L2NvZGUmZ3Q7IGZpbGUKLW9yIHdoZXJlIHRoZSBjbGFzcyBmaWxlIGlzIG9sZGVyIHRoYW4gdGhlCi0mbHQ7Y29kZSZndDsuamF2YSZsdDsvY29kZSZndDsgZmlsZSB3aWxsIGJlIGNvbXBpbGVkLiZsdDsvcCZndDsKLSZsdDtwJmd0O05vdGU6IEFudCB1c2VzIG9ubHkgdGhlIG5hbWVzIG9mIHRoZSBzb3VyY2UgYW5kIGNsYXNzIGZpbGVzIHRvIGZpbmQKLXRoZSBjbGFzc2VzIHRoYXQgbmVlZCBhIHJlYnVpbGQuIEl0IHdpbGwgbm90IHNjYW4gdGhlIHNvdXJjZSBhbmQgdGhlcmVmb3JlCi13aWxsIGhhdmUgbm8ga25vd2xlZGdlIGFib3V0IG5lc3RlZCBjbGFzc2VzLCBjbGFzc2VzIHRoYXQgYXJlIG5hbWVkIGRpZmZlcmVudAotZnJvbSB0aGUgc291cmNlIGZpbGUsIGFuZCBzbyBvbi4gU2VlIHRoZQotJmx0O2EgaHJlZj0mcXVvdDsuLi9PcHRpb25hbFRhc2tzL2RlcGVuZC5odG1sJnF1b3Q7Jmd0OyZsdDtjb2RlJmd0OyZhbXA7bHQ7ZGVwZW5kJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7Jmx0Oy9hJmd0OyB0YXNrCi1mb3IgZGVwZW5kZW5jeSBjaGVja2luZyBiYXNlZCBvbiBvdGhlciB0aGFuIGp1c3QKLWV4aXN0ZW5jZS9tb2RpZmljYXRpb24gdGltZXMuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7V2hlbiB0aGUgc291cmNlIGZpbGVzIGFyZSBwYXJ0IG9mIGEgcGFja2FnZSwgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgb2YKLXRoZSBzb3VyY2UgdHJlZSBzaG91bGQgZm9sbG93IHRoZSBwYWNrYWdlCi1oaWVyYXJjaHkuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7SXQgaXMgcG9zc2libGUgdG8gcmVmaW5lIHRoZSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgYmVpbmcgY29tcGlsZWQuCi1UaGlzIGNhbiBiZSBkb25lIHdpdGggdGhlICZsdDtjb2RlJmd0O2luY2x1ZGVzJmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7aW5jbHVkZXNmaWxlJmx0Oy9jb2RlJmd0OywKLSZsdDtjb2RlJmd0O2V4Y2x1ZGVzJmx0Oy9jb2RlJmd0OywgYW5kICZsdDtjb2RlJmd0O2V4Y2x1ZGVzZmlsZSZsdDsvY29kZSZndDsKLWF0dHJpYnV0ZXMuIFdpdGggdGhlICZsdDtjb2RlJmd0O2luY2x1ZGVzJmx0Oy9jb2RlJmd0OyBvcgotJmx0O2NvZGUmZ3Q7aW5jbHVkZXNmaWxlJmx0Oy9jb2RlJmd0OyBhdHRyaWJ1dGUsIHlvdSBzcGVjaWZ5IHRoZSBmaWxlcyB5b3Ugd2FudCB0bwotaGF2ZSBpbmNsdWRlZC4KLVRoZSAmbHQ7Y29kZSZndDtleGNsdWRlJmx0Oy9jb2RlJmd0OyBvciAmbHQ7Y29kZSZndDtleGNsdWRlc2ZpbGUmbHQ7L2NvZGUmZ3Q7IGF0dHJpYnV0ZSBpcyB1c2VkCi10byBzcGVjaWZ5Ci10aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBleGNsdWRlZC4gSW4gYm90aCBjYXNlcywgdGhlIGxpc3Qgb2YgZmlsZXMgCi1jYW4gYmUgc3BlY2lmaWVkIGJ5IGVpdGhlciB0aGUgZmlsZW5hbWUsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3Rvcnkocykgc3BlY2lmaWVkCi1pbiB0aGUgJmx0O2NvZGUmZ3Q7c3JjZGlyJmx0Oy9jb2RlJmd0OyBhdHRyaWJ1dGUgb3IgbmVzdGVkICZsdDtjb2RlJmd0OyZhbXA7bHQ7c3JjJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7Ci1lbGVtZW50KHMpLCBvciBieSB1c2luZyB3aWxkY2FyZCBwYXR0ZXJucy4gU2VlIHRoZSBzZWN0aW9uIG9uCi0mbHQ7YSBocmVmPSZxdW90Oy4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyZxdW90OyZndDtkaXJlY3RvcnktYmFzZWQgdGFza3MmbHQ7L2EmZ3Q7LAotZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0aGUKLWluY2x1c2lvbi9leGNsdXNpb24gb2YgZmlsZXMgd29ya3MsIGFuZCBob3cgdG8gd3JpdGUgd2lsZGNhcmQgcGF0dGVybnMuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7SXQgaXMgcG9zc2libGUgdG8gdXNlIGRpZmZlcmVudCBjb21waWxlcnMuIFRoaXMgY2FuIGJlIHNwZWNpZmllZCBieQotZWl0aGVyIHNldHRpbmcgdGhlIGdsb2JhbCAmbHQ7Y29kZSZndDtidWlsZC5jb21waWxlciZsdDsvY29kZSZndDsgcHJvcGVydHksIHdoaWNoIHdpbGwKLWFmZmVjdCBhbGwgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtqYXZhYyZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyB0YXNrcyB0aHJvdWdob3V0IHRoZSBidWlsZCwgb3IgYnkKLXNldHRpbmcgdGhlICZsdDtjb2RlJmd0O2NvbXBpbGVyJmx0Oy9jb2RlJmd0OyBhdHRyaWJ1dGUsIHNwZWNpZmljIHRvIHRoZSBjdXJyZW50Ci0mbHQ7Y29kZSZndDsmYW1wO2x0O2phdmFjJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7IHRhc2suCi0mbHQ7YSBuYW1lPSZxdW90O2NvbXBpbGVydmFsdWVzJnF1b3Q7Jmd0O1ZhbGlkIHZhbHVlcyBmb3IgZWl0aGVyIHRoZQotJmx0O2NvZGUmZ3Q7YnVpbGQuY29tcGlsZXImbHQ7L2NvZGUmZ3Q7IHByb3BlcnR5IG9yIHRoZSAmbHQ7Y29kZSZndDtjb21waWxlciZsdDsvY29kZSZndDsKLWF0dHJpYnV0ZSBhcmU6Jmx0Oy9hJmd0OyZsdDsvcCZndDsKLSZsdDt1bCZndDsKLSZsdDtsaSZndDsmbHQ7Y29kZSZndDtjbGFzc2ljJmx0Oy9jb2RlJmd0OyAodGhlIHN0YW5kYXJkIGNvbXBpbGVyIG9mIEpESyAxLjEvMS4yKSAmYW1wO25kYXNoOwotJmx0O2NvZGUmZ3Q7amF2YWMxLjEmbHQ7L2NvZGUmZ3Q7IGFuZAotJmx0O2NvZGUmZ3Q7amF2YWMxLjImbHQ7L2NvZGUmZ3Q7IGNhbiBiZSB1c2VkIGFzIGFsaWFzZXMuJmx0Oy9saSZndDsKLSZsdDtsaSZndDsmbHQ7Y29kZSZndDttb2Rlcm4mbHQ7L2NvZGUmZ3Q7ICh0aGUgc3RhbmRhcmQgY29tcGlsZXIgb2YgSkRLIDEuMy8xLjQpICZhbXA7bmRhc2g7Ci0mbHQ7Y29kZSZndDtqYXZhYzEuMyZsdDsvY29kZSZndDsgYW5kCi0mbHQ7Y29kZSZndDtqYXZhYzEuNCZsdDsvY29kZSZndDsgY2FuIGJlIHVzZWQgYXMgYWxpYXNlcy4mbHQ7L2xpJmd0OwotJmx0O2xpJmd0OyZsdDtjb2RlJmd0O2ppa2VzJmx0Oy9jb2RlJmd0OyAodGhlICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2ppa2VzLyZxdW90OyB0YXJnZXQ9JnF1b3Q7X3RvcCZxdW90OyZndDtKaWtlcyZsdDsvYSZndDsKLWNvbXBpbGVyKS4mbHQ7L2xpJmd0OwotJmx0O2xpJmd0OyZsdDtjb2RlJmd0O2p2YyZsdDsvY29kZSZndDsgKHRoZSBDb21tYW5kLUxpbmUgQ29tcGlsZXIgZnJvbSBNaWNyb3NvZnQncyBTREsKLWZvciBKYXZhIC8gVmlzdWFsIEorKykgJmFtcDtuZGFzaDsgJmx0O2NvZGUmZ3Q7bWljcm9zb2Z0Jmx0Oy9jb2RlJmd0OyBjYW4gYmUgdXNlZAotYXMgYW4gYWxpYXMuJmx0Oy9saSZndDsKLSZsdDtsaSZndDsmbHQ7Y29kZSZndDtramMmbHQ7L2NvZGUmZ3Q7ICh0aGUgJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmRtcy5hdC9rb3BpLyZxdW90OyB0YXJnZXQ9JnF1b3Q7X3RvcCZxdW90OyZndDtrb3BpJmx0Oy9hJmd0OwotY29tcGlsZXIpLiZsdDsvbGkmZ3Q7Ci0mbHQ7bGkmZ3Q7Jmx0O2NvZGUmZ3Q7Z2NqJmx0Oy9jb2RlJmd0OyAodGhlIGdjaiBjb21waWxlciBmcm9tIGdjYykuJmx0Oy9saSZndDsKLSZsdDtsaSZndDsmbHQ7Y29kZSZndDtzaiZsdDsvY29kZSZndDsgKFN5bWFudGVjIGphdmEgY29tcGlsZXIpICZhbXA7bmRhc2g7Ci0mbHQ7Y29kZSZndDtzeW1hbnRlYyZsdDsvY29kZSZndDsgY2FuIGJlIHVzZWQgYXMgYW4gYWxpYXMuJmx0Oy9saSZndDsKLSZsdDtsaSZndDsmbHQ7Y29kZSZndDtleHRKYXZhYyZsdDsvY29kZSZndDsgKHJ1biBlaXRoZXIgbW9kZXJuIG9yIGNsYXNzaWMgaW4gYSBKVk0gb2YKLWl0cyBvd24pLiZsdDsvbGkmZ3Q7Ci0mbHQ7L3VsJmd0OwotJmx0O3AmZ3Q7VGhlIGRlZmF1bHQgaXMgJmx0O2NvZGUmZ3Q7amF2YWMxLngmbHQ7L2NvZGUmZ3Q7IHdpdGggJmx0O2NvZGUmZ3Q7eCZsdDsvY29kZSZndDsgZGVwZW5kaW5nCi1vbiB0aGUgSkRLIHZlcnNpb24geW91IHVzZSB3aGlsZSB5b3UgYXJlIHJ1bm5pbmcgQW50LgotSWYgeW91IHdpc2ggdG8gdXNlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGludGVyZmFjZSB0aGFuIHRob3NlCi1zdXBwbGllZCwgeW91IGNhbiB3cml0ZSBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgQ29tcGlsZXJBZGFwdGVyIGludGVyZmFjZQotKCZsdDtjb2RlJmd0O3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzJmx0Oy9jb2RlJmd0OykuIFN1cHBseSB0aGUgZnVsbAotY2xhc3NuYW1lIGluIHRoZSAmbHQ7Y29kZSZndDtidWlsZC5jb21waWxlciZsdDsvY29kZSZndDsgcHJvcGVydHkgb3IgdGhlCi0mbHQ7Y29kZSZndDtjb21waWxlciZsdDsvY29kZSZndDsgYXR0cmlidXRlLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7VGhlIGZvcmsgYXR0cmlidXRlIG92ZXJyaWRlcyB0aGUgJmx0O2NvZGUmZ3Q7YnVpbGQuY29tcGlsZXImbHQ7L2NvZGUmZ3Q7IHByb3BlcnR5Ci1vciAmbHQ7Y29kZSZndDtjb21waWxlciZsdDsvY29kZSZndDsgYXR0cmlidXRlIHNldHRpbmcgYW5kCi1leHBlY3RzIGEgSkRLMS4xIG9yIGhpZ2hlciB0byBiZSBzZXQgaW4gJmx0O2NvZGUmZ3Q7SkFWQV9IT01FJmx0Oy9jb2RlJmd0Oy4KLSZsdDsvcCZndDsKLSZsdDtwJmd0O1lvdSBjYW4gYWxzbyB1c2UgdGhlICZsdDtjb2RlJmd0O2NvbXBpbGVyJmx0Oy9jb2RlJmd0OyBhdHRyaWJ1dGUgdG8gdGVsbCBBbnQKLXdoaWNoIEpESyB2ZXJzaW9uIGl0IHNoYWxsIGFzc3VtZSB3aGVuIGl0IHB1dHMgdG9nZXRoZXIgdGhlIGNvbW1hbmQKLWxpbmUgc3dpdGNoZXMgLSBldmVuIGlmIHlvdSBzZXQgJmx0O2NvZGUmZ3Q7Zm9yaz0mYW1wO3F1b3Q7dHJ1ZSZhbXA7cXVvdDsmbHQ7L2NvZGUmZ3Q7LgotVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gcnVuIHRoZSBjb21waWxlciBvZiBKREsgMS4xIHdoaWxlIHlvdQotY3VycmVudCBKREsgaXMgMS4yKy4gIElmIHlvdSB1c2UKLSZsdDtjb2RlJmd0O2NvbXBpbGVyPSZhbXA7cXVvdDtqYXZhYzEuMSZhbXA7cXVvdDsmbHQ7L2NvZGUmZ3Q7IGFuZCAoZm9yIGV4YW1wbGUpCi0mbHQ7Y29kZSZndDtkZXBlbmQ9JmFtcDtxdW90O3RydWUmYW1wO3F1b3Q7Jmx0Oy9jb2RlJmd0OyBBbnQgd2lsbCB1c2UgdGhlIGNvbW1hbmQgbGluZQotc3dpdGNoICZsdDtjb2RlJmd0Oy1kZXBlbmQmbHQ7L2NvZGUmZ3Q7IGluc3RlYWQgb2YgJmx0O2NvZGUmZ3Q7LVhkZXBlbmQmbHQ7L2NvZGUmZ3Q7LiZsdDsvcCZndDsKLSZsdDtwJmd0O1RoaXMgdGFzayB3aWxsIGRyb3AgYWxsIGVudHJpZXMgdGhhdCBwb2ludCB0byBub24tZXhpc3RlbnQKLWZpbGVzL2RpcmVjdG9yaWVzIGZyb20gdGhlIGNsYXNzcGF0aCBpdCBwYXNzZXMgdG8gdGhlIGNvbXBpbGVyLiZsdDsvcCZndDsKLSZsdDtwJmd0OyZsdDtzdHJvbmcmZ3Q7V2luZG93cyBOb3RlOiZsdDsvc3Ryb25nJmd0O1doZW4gdGhlIG1vZGVybiBjb21waWxlciBpcyB1c2VkCi1pbiB1bmZvcmtlZCBtb2RlIG9uIFdpbmRvd3MsIGl0IGxvY2tzIHVwIHRoZSBmaWxlcyBwcmVzZW50IGluIHRoZQotY2xhc3NwYXRoIG9mIHRoZSAmbHQ7Y29kZSZndDsmYW1wO2x0O2phdmFjJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7IHRhc2ssIGFuZCBkb2VzIG5vdCByZWxlYXNlIHRoZW0uCi1UaGUgc2lkZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGRlbGV0ZSBvciBtb3ZlCi10aG9zZSBmaWxlcyBsYXRlciBvbiBpbiB0aGUgYnVpbGQuICBUaGUgd29ya2Fyb3VuZCBpcyB0byBmb3JrIHdoZW4KLWludm9raW5nIHRoZSBjb21waWxlci4mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9InNyY2RpciIgUkVRVUlSRUQ9InllcywgdW5sZXNzIG5lc3RlZCAmbHQ7c3JjJmd0OyBlbGVtZW50cyBhcmUgcHJlc2VudC4iPgotCQkJPERFU0NSSVBUSU9OPkxvY2F0aW9uIG9mIHRoZSBqYXZhIGZpbGVzLiAoU2VlIHRoZW5vdGUgYmVsb3cuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkZXN0ZGlyIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkxvY2F0aW9uIHRvIHN0b3JlIHRoZSBjbGFzcyBmaWxlczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+Q29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGZpbGVzIChtYXkgYmUgc3BlY2lmaWVkIHVzaW5nd2lsZGNhcmQgcGF0dGVybnMpIHRoYXQgbXVzdCBiZWluY2x1ZGVkOyBhbGwgLmphdmEgZmlsZXMgYXJlIGluY2x1ZGVkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBmaWxlcyB0b2luY2x1ZGUgKG1heSBiZSBzcGVjaWZpZWQgdXNpbmcgd2lsZGNhcmQgcGF0dGVybnMpPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJleGNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5Db21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgZmlsZXMgKG1heSBiZSBzcGVjaWZpZWQgdXNpbmd3aWxkY2FyZCBwYXR0ZXJucykgdGhhdCBtdXN0IGJlIGV4Y2x1ZGVkOyBubyBmaWxlcyAoZXhjZXB0IGRlZmF1bHRleGNsdWRlcykgYXJlIGV4Y2x1ZGVkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBmaWxlcyB0b2V4Y2x1ZGUgKG1heSBiZSBzcGVjaWZpZWQgdXNpbmcgd2lsZGNhcmQgcGF0dGVybnMpPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJjbGFzc3BhdGgiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGNsYXNzcGF0aCB0byB1c2U8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InNvdXJjZXBhdGgiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIHNvdXJjZXBhdGggdG8gdXNlOyBkZWZhdWx0cyB0byB0aGUgdmFsdWUgb2YgdGhlIHNyY2RpciBhdHRyaWJ1dGUgKG9yIG5lc3RlZCAmbHQ7c3JjJmd0OyBlbGVtZW50cykuVG8gc3VwcHJlc3MgdGhlIHNvdXJjZXBhdGggc3dpdGNoLCB1c2Ugc291cmNlcGF0aD0mcXVvdDsmcXVvdDs8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImJvb3RjbGFzc3BhdGgiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+TG9jYXRpb24gb2YgYm9vdHN0cmFwIGNsYXNzIGZpbGVzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJjbGFzc3BhdGhyZWYiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGNsYXNzcGF0aCB0byB1c2UsIGdpdmVuIGFzIGFyZWZlcmVuY2UgdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzb3VyY2VwYXRocmVmIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlRoZSBzb3VyY2VwYXRoIHRvIHVzZSwgZ2l2ZW4gYXMgYXJlZmVyZW5jZSB0byBhIHBhdGggZGVmaW5lZCBlbHNld2hlcmU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImJvb3RjbGFzc3BhdGhyZWYiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+TG9jYXRpb24gb2YgYm9vdHN0cmFwIGNsYXNzIGZpbGVzLCBnaXZlbiBhcyBhcmVmZXJlbmNlIHRvIGEgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZXh0ZGlycyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5Mb2NhdGlvbiBvZiBpbnN0YWxsZWQgZXh0ZW5zaW9uczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZW5jb2RpbmciIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+RW5jb2Rpbmcgb2Ygc291cmNlIGZpbGVzLiAoTm90ZTogZ2NqIGRvZXNuJ3Qgc3VwcG9ydHRoaXMgb3B0aW9uIHlldC48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im5vd2FybiIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5JbmRpY2F0ZXMgd2hldGhlciB0aGUgLW5vd2FybiBzd2l0Y2hzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBjb21waWxlcjsgZGVmYXVsdHMgdG8gb2ZmPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkZWJ1ZyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5JbmRpY2F0ZXMgd2hldGhlciBzb3VyY2Ugc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGggZGVidWdpbmZvcm1hdGlvbjsgZGVmYXVsdHMgdG8gb2ZmPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkZWJ1Z2xldmVsIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPktleXdvcmQgbGlzdCB0byBiZSBhcHBlbmRlZCB0byB0aGUgLWdjb21tYW5kLWxpbmUgc3dpdGNoLiAgVGhpcyB3aWxsIGJlIGlnbm9yZWQgYnkgYWxsIGltcGxlbWVudGF0aW9ucyBleGNlcHRtb2Rlcm4gYW5kIGNsYXNzaWModmVyICZndDs9IDEuMikuTGVnYWwgdmFsdWVzIGFyZSBub25lIG9yIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlZm9sbG93aW5nIGtleXdvcmRzOmxpbmVzLCB2YXJzLCBhbmQgc291cmNlLklmIGRlYnVnbGV2ZWwgaXMgbm90IHNwZWNpZmllZCwgYnkgZGVmYXVsdCw6bm9uZSB3aWxsIGJlYXBwZW5kZWQgdG8gLWcuICBJZiBkZWJ1ZyBpcyBub3QgdHVybmVkIG9uLHRoaXMgYXR0cmlidXRlIHdpbGwgYmUgaWdub3JlZC48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im9wdGltaXplIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkluZGljYXRlcyB3aGV0aGVyIHNvdXJjZSBzaG91bGQgYmUgY29tcGlsZWQgd2l0aG9wdGltaXphdGlvbjsgZGVmYXVsdHMgdG8gb2ZmPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkZXByZWNhdGlvbiIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5JbmRpY2F0ZXMgd2hldGhlciBzb3VyY2Ugc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGhkZXByZWNhdGlvbiBpbmZvcm1hdGlvbjsgZGVmYXVsdHMgdG8gb2ZmPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ0YXJnZXQiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+R2VuZXJhdGUgY2xhc3MgZmlsZXMgZm9yIHNwZWNpZmljIFZNIHZlcnNpb24oZS5nLiwgMS4xIG9yIDEuMikuIE5vdGUgdGhhdCB0aGVkZWZhdWx0IHZhbHVlIGRlcGVuZHMgb24gdGhlIEpWTSB0aGF0IGlzIHJ1bm5pbmcgQW50LiAgSW5wYXJ0aWN1bGFyLCBpZiB5b3UgdXNlIEpESyAxLjQgdGhlIGdlbmVyYXRlZCBjbGFzc2VzIHdpbGwgbm90IGJldXNhYmxlIGZvciBhIDEuMSBKYXZhIFZNIHVubGVzcyB5b3UgZXhwbGljaXRseSBzZXQgdGhpcyBhdHRyaWJ1dGV0byB0aGUgdmFsdWUgMS4xICh3aGljaCBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgSkRLIDEuMSB0bzEuMyk8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InZlcmJvc2UiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+QXNrcyB0aGUgY29tcGlsZXIgZm9yIHZlcmJvc2Ugb3V0cHV0PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkZXBlbmQiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+RW5hYmxlcyBkZXBlbmRlbmN5LXRyYWNraW5nZm9yIGNvbXBpbGVycyB0aGF0IHN1cHBvcnQgdGhpcyAoamlrZXMgYW5kY2xhc3NpYyk8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVhbnRydW50aW1lIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPldoZXRoZXIgdG8gaW5jbHVkZSB0aGUgQW50IHJ1bi10aW1lIGxpYnJhcmllcyBpbiB0aGVjbGFzc3BhdGg7IGRlZmF1bHRzIHRvIHllczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZWphdmFydW50aW1lIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPldoZXRoZXIgdG8gaW5jbHVkZSB0aGUgZGVmYXVsdCBydW4tdGltZWxpYnJhcmllcyBmcm9tIHRoZSBleGVjdXRpbmcgVk0gaW4gdGhlIGNsYXNzcGF0aDtkZWZhdWx0cyB0byB5ZXM8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZvcmsiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+V2hldGhlciB0byBleGVjdXRlIGphdmFjIHVzaW5nIHRoZUpESyBjb21waWxlciBleHRlcm5hbGx5OyBkZWZhdWx0cyB0byBubzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZXhlY3V0YWJsZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5Db21wbGV0ZSBwYXRoIHRvIHRoZSBqYXZhY2V4ZWN1dGFibGUgdG8gdXNlIGluIGNhc2Ugb2YgZm9yaz0mcXVvdDt5ZXMmcXVvdDsuRGVmYXVsdHMgdG8gdGhlIGNvbXBpbGVyIG9mIHRoZSBKYXZhIHZlcnNpb24gdGhhdCBpcyBjdXJyZW50bHlydW5uaW5nIEFudC4gIElnbm9yZWQgaWYgZm9yaz0mcXVvdDtubzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibWVtb3J5aW5pdGlhbHNpemUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciB0aGUgdW5kZXJseWluZyBWTSxpZiBqYXZhYyBpcyBydW4gZXh0ZXJuYWxseTsgaWdub3JlZCBvdGhlcndpc2UuIERlZmF1bHRzdG8gdGhlIHN0YW5kYXJkIFZNIG1lbW9yeSBzZXR0aW5nLihFeGFtcGxlczogODM4ODYwODAsIDgxOTIwaywgb3I4MG08L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im1lbW9yeW1heGltdW1zaXplIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG1lbW9yeSBmb3IgdGhlIHVuZGVybHlpbmcgVk0saWYgamF2YWMgaXMgcnVuIGV4dGVybmFsbHk7IGlnbm9yZWQgb3RoZXJ3aXNlLiBEZWZhdWx0c3RvIHRoZSBzdGFuZGFyZCBWTSBtZW1vcnkgc2V0dGluZy4oRXhhbXBsZXM6IDgzODg2MDgwLCA4MTkyMGssIG9yODBtPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJmYWlsb25lcnJvciIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5JbmRpY2F0ZXMgd2hldGhlciB0aGUgYnVpbGQgd2lsbCBjb250aW51ZSBldmVuIGlmIHRoZXJlIGFyZSBjb21waWxhdGlvbiBlcnJvcnM7IGRlZmF1bHRzIHRvIHRydWUuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzb3VyY2UiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VmFsdWUgb2YgdGhlIC1zb3VyY2UgY29tbWFuZC1saW5lc3dpdGNoOyB3aWxsIGJlIGlnbm9yZWQgYnkgYWxsIGltcGxlbWVudGF0aW9ucyBleGNlcHRqYXZhYzEuNCAob3IgbW9kZXJuIHdoZW4gQW50IGlzIG5vdHJ1bm5pbmcgaW4gYSAxLjMgVk0pIGFuZCBqaWtlc0lmIHlvdSB1c2UgdGhpc2F0dHJpYnV0ZSB0b2dldGhlciB3aXRoIGppa2VzLCB5b3UgbXVzdCBtYWtlIHN1cmV0aGF0IHlvdXIgdmVyc2lvbiBvZiBqaWtlcyBzdXBwb3J0cyB0aGUgLXNvdXJjZXN3aXRjaExlZ2FsIHZhbHVlcyBhcmUgMS4zIGFuZCAxLjQmYW1wO25kYXNoOyBieSBkZWZhdWx0LCBubyAtc291cmNlIGFyZ3VtZW50IHdpbGwgYmUgdXNlZGF0IGFsbDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY29tcGlsZXIiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIHRvIHVzZS5JZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3Qgc2V0LCB0aGUgdmFsdWUgb2YgdGhlYnVpbGQuY29tcGlsZXIgcHJvcGVydHksIGlmIHNldCwgd2lsbCBiZSB1c2VkLk90aGVyd2lzZSwgdGhlIGRlZmF1bHQgY29tcGlsZXIgZm9yIHRoZSBjdXJyZW50IFZNIHdpbGwgYmUgdXNlZC4oU2VlIHRoZSBhYm92ZSBsaXN0IG9mIHZhbGlkY29tcGlsZXJzLjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibGlzdGZpbGVzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkluZGljYXRlcyB3aGV0aGVyIHRoZSBzb3VyY2UgZmlsZXMgdG8gYmUgY29tcGlsZWQgd2lsbGJlIGxpc3RlZDsgZGVmYXVsdHMgdG8gbm88L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0iamF2YWRvYyI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtHZW5lcmF0ZXMgY29kZSBkb2N1bWVudGF0aW9uIHVzaW5nIHRoZSBqYXZhZG9jIHRvb2wuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7VGhlIHNvdXJjZSBkaXJlY3Rvcnkgd2lsbCBiZSByZWN1cnNpdmVseSBzY2FubmVkIGZvciBKYXZhIHNvdXJjZSBmaWxlcyB0byBwcm9jZXNzCi1idXQgb25seSB0aG9zZSBtYXRjaGluZyB0aGUgaW5jbHVzaW9uIHJ1bGVzLCBhbmQgbm90IG1hdGNoaW5nIHRoZSBleGNsdXNpb25zIHJ1bGVzCi13aWxsIGJlIHBhc3NlZCB0byB0aGUgamF2YWRvYyB0b29sLiBUaGlzCi1hbGxvd3Mgd2lsZGNhcmRzIHRvIGJlIHVzZWQgdG8gY2hvb3NlIGJldHdlZW4gcGFja2FnZSBuYW1lcywgcmVkdWNpbmcgdmVyYm9zaXR5Ci1hbmQgbWFuYWdlbWVudCBjb3N0cyBvdmVyIHRpbWUuIFRoaXMgdGFzaywgaG93ZXZlciwgaGFzIG5vIG5vdGlvbiBvZgotJmFtcDtxdW90O2NoYW5nZWQmYW1wO3F1b3Q7IGZpbGVzLCB1bmxpa2UgdGhlICZsdDthIGhyZWY9JnF1b3Q7amF2YWMuaHRtbCZxdW90OyZndDtqYXZhYyZsdDsvYSZndDsgdGFzay4gVGhpcyBtZWFucwotYWxsIHBhY2thZ2VzIHdpbGwgYmUgcHJvY2Vzc2VkIGVhY2ggdGltZSB0aGlzIHRhc2sgaXMgcnVuLiBJbiBnZW5lcmFsLCBob3dldmVyLAotdGhpcyB0YXNrIGlzIHVzZWQgbXVjaCBsZXNzIGZyZXF1ZW50bHkuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7VGhpcyB0YXNrIHdvcmtzIHNlYW1sZXNzbHkgYmV0d2VlbiBkaWZmZXJlbnQgamF2YWRvYyB2ZXJzaW9ucyAoMS4xLAotMS4yIGFuZCAxLjQpLCB3aXRoIHRoZSBvYnZpb3VzIHJlc3RyaWN0aW9uIHRoYXQgdGhlIDEuMiBhdHRyaWJ1dGVzCi13aWxsIGJlIGlnbm9yZWQgaWYgcnVuIGluIGEgMS4xIFZNLiZsdDsvcCZndDsKLSZsdDtwJmd0O05PVEU6IHNpbmNlIGphdmFkb2MgY2FsbHMgU3lzdGVtLmV4aXQoKSwgamF2YWRvYyBjYW5ub3QgYmUgcnVuIGluc2lkZSB0aGUKLXNhbWUgVk0gYXMgYW50IHdpdGhvdXQgYnJlYWtpbmcgZnVuY3Rpb25hbGl0eS4gRm9yIHRoaXMgcmVhc29uLCB0aGlzIHRhc2sgCi1hbHdheXMgZm9ya3MgdGhlIFZNLiBUaGlzIG92ZXJoZWFkIGlzIG5vdCBzaWduaWZpY2FudCBzaW5jZSBqYXZhZG9jIGlzIG5vcm1hbGx5IGEgaGVhdnkKLWFwcGxpY2F0aW9uIGFuZCB3aWxsIGJlIGNhbGxlZCBpbmZyZXF1ZW50bHkuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Tk9URTogdGhlIHBhY2thZ2VsaXN0IGF0dHJpYnV0ZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGxpc3Qgb2YgcGFja2FnZXMgdG8gCi1kb2N1bWVudCBvdXRzaWRlIG9mIHRoZSBBbnQgZmlsZS4gSXQncyBhIG11Y2ggYmV0dGVyIHByYWN0aWNlIHRvIGluY2x1ZGUgZXZlcnl0aGluZyAKLWluc2lkZSB0aGUgYnVpbGQueG1sIGZpbGUuIFRoaXMgb3B0aW9uIHdhcyBhZGRlZCBpbiBvcmRlciB0byBtYWtlIGl0IGVhc2llciB0byAKLW1pZ3JhdGUgZnJvbSByZWd1bGFyIG1ha2VmaWxlcywgd2hlcmUgeW91IHdvdWxkIHVzZSB0aGlzIG9wdGlvbiBvZiBqYXZhZG9jLiAKLVRoZSBwYWNrYWdlcyBsaXN0ZWQgaW4gcGFja2FnZWxpc3QgYXJlIG5vdCBjaGVja2VkLCBzbyB0aGUgdGFzayBwZXJmb3JtcyBldmVuIAotaWYgc29tZSBwYWNrYWdlcyBhcmUgbWlzc2luZyBvciBicm9rZW4uIFVzZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2lzaCB0byBjb252ZXJ0IGZyb20gCi1hbiBleGlzdGluZyBtYWtlZmlsZS4gT25jZSB0aGluZ3MgYXJlIHJ1bm5pbmcgeW91IHNob3VsZCB0aGVuIHN3aXRjaCB0byB0aGUgcmVndWxhciAKLW5vdGF0aW9uLiAmbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsmbHQ7aSZndDsmbHQ7YiZndDtERVBSRUNBVElPTjombHQ7L2ImZ3Q7IHRoZSBqYXZhZG9jMiB0YXNrIHNpbXBseSBwb2ludHMgdG8gdGhlIGphdmFkb2MgdGFzayBhbmQgaXQncwotdGhlcmUgZm9yIGJhY2sgY29tcGF0aWJpbGl0eSByZWFzb25zLiBTaW5jZSB0aGlzIHRhc2sgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZQotdmVyc2lvbnMsIHlvdSBhcmUgc3Ryb25nbHkgZW5jb3VyYWdlZCB0byB1c2UgJmx0O2EgaHJlZj0mcXVvdDtqYXZhZG9jLmh0bWwmcXVvdDsmZ3Q7amF2YWRvYyZsdDsvYSZndDsKLWluc3RlYWQuJmx0Oy9pJmd0OyZsdDsvcCZndDsKLSZsdDtwJmd0O0luIHRoZSB0YWJsZSBiZWxvdywgMS4xIG1lYW5zIGF2YWlsYWJsZSBpZiB5b3VyIGN1cnJlbnQgSmF2YSBWTSBpcwotYSAxLjEgVk0sIDEuMiBmb3IgZWl0aGVyIDEuMiBvciAxLjMgYW5kIDEuNCBmb3IgYSAxLjQgSmF2YSBWTS4gIDEuMisKLW1lYW5zIGFueSBWTSBvZiBhdCBsZWFzdCB2ZXJzaW9uIDEuMi4mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9InNvdXJjZXBhdGgiIFJFUVVJUkVEPSJhdCBsZWFzdCBvbmUgb2YgdGhlIHRocmVlIG9yIG5lc3RlZAotICAgICAmbHQ7c291cmNlcGF0aCZndDssICZsdDtmaWxlc2V0Jmd0OyBvcgotICAgICAmbHQ7cGFja2FnZXNldCZndDsiPgotCQkJPERFU0NSSVBUSU9OPlNwZWNpZnkgd2hlcmUgdG8gZmluZCBzb3VyY2UgZmlsZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ic291cmNlcGF0aHJlZiIgUkVRVUlSRUQ9IiI+Ci0JCQk8REVTQ1JJUFRJT04+U3BlY2lmeSB3aGVyZSB0byBmaW5kIHNvdXJjZSBmaWxlcyBieSByZWZlcmVuY2UgdG8gYSBQQVRIIGRlZmluZWQgZWxzZXdoZXJlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzb3VyY2VmaWxlcyIgUkVRVUlSRUQ9IiI+Ci0JCQk8REVTQ1JJUFRJT04+Q29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygc291cmNlIGZpbGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImRlc3RkaXIiIFJFUVVJUkVEPSJ5ZXMsIHVubGVzcyBhIGRvY2xldCBoYXMgYmVlbiBzcGVjaWZpZWQuIj4KLQkJCTxERVNDUklQVElPTj5EZXN0aW5hdGlvbiBkaXJlY3RvcnkgZm9yIG91dHB1dCBmaWxlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJtYXhtZW1vcnkiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+TWF4IGFtb3VudCBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgdG8gdGhlIGphdmFkb2MgVjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0icGFja2FnZW5hbWVzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHBhY2thZ2UgZmlsZXMgKHdpdGggdGVybWluYXRpbmd3aWxkY2FyZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0icGFja2FnZWxpc3QiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIG5hbWUgb2YgYSBmaWxlIGNvbnRhaW5pbmcgdGhlIHBhY2thZ2VzIHRvIHByb2NlczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY2xhc3NwYXRoIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlNwZWNpZnkgd2hlcmUgdG8gZmluZCB1c2VyIGNsYXNzIGZpbGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImJvb3RjbGFzc3BhdGgiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+T3ZlcnJpZGUgbG9jYXRpb24gb2YgY2xhc3MgZmlsZXMgbG9hZGVkIGJ5IHRoZSBib290c3RyYXBjbGFzcyBsb2FkZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY2xhc3NwYXRocmVmIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlNwZWNpZnkgd2hlcmUgdG8gZmluZCB1c2VyIGNsYXNzIGZpbGVzIGJ5IHJlZmVyZW5jZSB0byBhIFBBVEggZGVmaW5lZCBlbHNld2hlcmU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImJvb3RjbGFzc3BhdGhyZWYiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+T3ZlcnJpZGUgbG9jYXRpb24gb2YgY2xhc3MgZmlsZXMgbG9hZGVkIGJ5IHRoZWJvb3RzdHJhcCBjbGFzcyBsb2FkZXIgYnkgcmVmZXJlbmNlIHRvIGFQQVRIIGRlZmluZWQgZWxzZXdoZXJlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJleHRkaXJzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPk92ZXJyaWRlIGxvY2F0aW9uIG9mIGluc3RhbGxlZCBleHRlbnNpb248L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im92ZXJ2aWV3IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlJlYWQgb3ZlcnZpZXcgZG9jdW1lbnRhdGlvbiBmcm9tIEhUTUwgZmlsPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJhY2Nlc3MiIFJFUVVJUkVEPSJubyAoZGVmYXVsdCBwcm90ZWN0ZWQpIj4KLQkJCTxERVNDUklQVElPTj5BY2Nlc3MgbW9kZTogb25lIG9mIHB1YmxpYywgcHJvdGVjdGVkLHBhY2thZ2UsIG9yIHByaXZhdDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0icHVibGljIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlNob3cgb25seSBwdWJsaWMgY2xhc3NlcyBhbmQgbWVtYmVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJwcm90ZWN0ZWQiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U2hvdyBwcm90ZWN0ZWQvcHVibGljIGNsYXNzZXMgYW5kIG1lbWJlcnMgKGRlZmF1bHQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InBhY2thZ2UiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U2hvdyBwYWNrYWdlL3Byb3RlY3RlZC9wdWJsaWMgY2xhc3NlcyBhbmQgbWVtYmVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJwcml2YXRlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlNob3cgYWxsIGNsYXNzZXMgYW5kIG1lbWJlcjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ib2xkIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkdlbmVyYXRlIG91dHB1dCB1c2luZyBKREsgMS4xIGVtdWxhdGluZyBkb2NsZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idmVyYm9zZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5PdXRwdXQgbWVzc2FnZXMgYWJvdXQgd2hhdCBKYXZhZG9jIGlzIGRvaW48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImxvY2FsZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5Mb2NhbGUgdG8gYmUgdXNlZCwgZS5nLiBlbl9VUyBvciBlbl9VU19XSTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZW5jb2RpbmciIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U291cmNlIGZpbGUgZW5jb2RpbmcgbmFtPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ2ZXJzaW9uIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkluY2x1ZGUgQHZlcnNpb24gcGFyYWdyYXBoPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ1c2UiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+Q3JlYXRlIGNsYXNzIGFuZCBwYWNrYWdlIHVzYWdlIHBhZ2U8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImF1dGhvciIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5JbmNsdWRlIEBhdXRob3IgcGFyYWdyYXBoPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzcGxpdGluZGV4IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlNwbGl0IGluZGV4IGludG8gb25lIGZpbGUgcGVyIGxldHRlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ3aW5kb3d0aXRsZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5Ccm93c2VyIHdpbmRvdyB0aXRsZSBmb3IgdGhlIGRvY3VtZW50YXRpb24gKHRleHQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImRvY3RpdGxlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkluY2x1ZGUgdGl0bGUgZm9yIHRoZSBwYWNrYWdlIGluZGV4KGZpcnN0KSBwYWdlIChodG1sLWNvZGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImhlYWRlciIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5JbmNsdWRlIGhlYWRlciB0ZXh0IGZvciBlYWNoIHBhZ2UgKGh0bWwtY29kZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZm9vdGVyIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkluY2x1ZGUgZm9vdGVyIHRleHQgZm9yIGVhY2ggcGFnZSAoaHRtbC1jb2RlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJib3R0b20iIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+SW5jbHVkZSBib3R0b20gdGV4dCBmb3IgZWFjaCBwYWdlIChodG1sLWNvZGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImxpbmsiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+Q3JlYXRlIGxpbmtzIHRvIGphdmFkb2Mgb3V0cHV0IGF0IHRoZSBnaXZlbiBVUjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibGlua29mZmxpbmUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+TGluayB0byBkb2NzIGF0ICZsdDt1cmwmZ3Q7IHVzaW5nIHBhY2thZ2UgbGlzdCBhdCZsdDt1cmwyJmd0OyAtIHNlcGFyYXRlIHRoZSBVUkxzIGJ5IHVzaW5nIGEgc3BhY2UgY2hhcmFjdGVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJncm91cCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5Hcm91cCBzcGVjaWZpZWQgcGFja2FnZXMgdG9nZXRoZXIgaW4gb3ZlcnZpZXdwYWdlLiAgVGhlIGZvcm1hdCBpcyBhcyBkZXNjcmliZWQgYmVsb3c8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im5vZGVwcmVjYXRlZCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5EbyBub3QgaW5jbHVkZSBAZGVwcmVjYXRlZCBpbmZvcm1hdGlvPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJub2RlcHJlY2F0ZWRsaXN0IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkRvIG5vdCBnZW5lcmF0ZSBkZXByZWNhdGVkIGxpczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibm90cmVlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkRvIG5vdCBnZW5lcmF0ZSBjbGFzcyBoaWVyYXJjaDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibm9pbmRleCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5EbyBub3QgZ2VuZXJhdGUgaW5kZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibm9oZWxwIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkRvIG5vdCBnZW5lcmF0ZSBoZWxwIGxpbjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibm9uYXZiYXIiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+RG8gbm90IGdlbmVyYXRlIG5hdmlnYXRpb24gYmE8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InNlcmlhbHdhcm4iIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+R2VuZXJhdGUgd2FybmluZyBhYm91dCBAc2VyaWFsIHRhPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJoZWxwZmlsZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TcGVjaWZpZXMgdGhlIEhUTUwgaGVscCBmaWxlIHRvIHVzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzdHlsZXNoZWV0ZmlsZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TcGVjaWZpZXMgdGhlIENTUyBzdHlsZXNoZWV0IHRvIHVzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJjaGFyc2V0IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkNoYXJzZXQgZm9yIGNyb3NzLXBsYXRmb3JtIHZpZXdpbmcgb2YgZ2VuZXJhdGVkZG9jdW1lbnRhdGlvPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkb2NlbmNvZGluZyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5PdXRwdXQgZmlsZSBlbmNvZGluZyBuYW08L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImRvY2xldCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TcGVjaWZpZXMgdGhlIGNsYXNzIGZpbGUgdGhhdCBzdGFydHMgdGhlIGRvY2xldCB1c2VkIGluIGdlbmVyYXRpbmcgdGhlIGRvY3VtZW50YXRpb248L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImRvY2xldHBhdGgiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U3BlY2lmaWVzIHRoZSBwYXRoIHRvIHRoZSBkb2NsZXQgY2xhc3MgZmlsZSB0aGF0IGlzIHNwZWNpZmllZCB3aXRoIHRoZSAtZG9jbGV0IG9wdGlvbjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZG9jbGV0cGF0aHJlZiIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TcGVjaWZpZXMgdGhlIHBhdGggdG8gdGhlIGRvY2xldCBjbGFzcyBmaWxlIHRoYXRpcyBzcGVjaWZpZWQgd2l0aCB0aGUgLWRvY2xldCBvcHRpb24gYnkgcmVmZXJlbmNlIHRvIGEgUEFUSCBkZWZpbmVkIGVsc2V3aGVyZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iYWRkaXRpb25hbHBhcmFtIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkxldHMgeW91IGFkZCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gdGhlIGphdmFkb2Njb21tYW5kIGxpbmUuIFVzZWZ1bCBmb3IgZG9jbGV0cy4gUGFyYW1ldGVycyBjb250YWluaW5nc3BhY2VzIG5lZWQgdG8gYmUgcXVvdGVkIHVzaW5nICZhbXA7cXVvdDs8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZhaWxvbmVycm9yIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlN0b3AgdGhlIGJ1aWxkcHJvY2VzcyBpZiB0aGUgY29tbWFuZCBleGl0cyB3aXRoIGFyZXR1cm5jb2RlIG90aGVyIHRoYW4gMDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXBhY2thZ2VuYW1lcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5jb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBwYWNrYWdlcyB5b3UgZG9uJ3Qgd2FudGRvY3MgZm9yPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkZWZhdWx0ZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+aW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCh5ZXMgfCBubyk7IGRlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbiBvbWl0dGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ1c2VleHRlcm5hbGZpbGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+aW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNvdXJjZWZpbGUgbmFtZSBzcGVjaWZpZWRpbiBzcmNmaWxlcyBvciBhcyBuZXN0ZWQgc291cmNlIGVsZW1lbnRzIHNob3VsZCBiZSB3cml0dGVuIHRvIGF0ZW1wb3JhcnkgZmlsZSB0byBtYWtlIHRoZSBjb21tYW5kIGxpbmUgc2hvcnRlci4gQWxzbyBhcHBsaWVzIHRvdGhlIHBhY2thZ2UgbmFtZXMgc3BlY2lmaWVkIHZpYSB0aGUgcGFja2FnZW5hbWVzIGF0dHJpYnV0ZSBvcm5lc3RlZCBwYWNrYWdlIGVsZW1lbnRzLih5ZXMgfCBubykuIERlZmF1bHQgaXMgbm88L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InNvdXJjZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5OZWNlc3NhcnkgdG8gZW5hYmxlIGphdmFkb2MgdG8gaGFuZGxlIGFzc2VydGlvbnNwcmVzZW50IGluIEoyU0UgdiAxLjQgc291cmNlIGNvZGUuIFNldCB0aGlzIHRvICZxdW90OzEuNCZxdW90OyB0b2RvY3VtZW50cyBjb2RlIHRoYXQgY29tcGlsZXMgdXNpbmcgJnF1b3Q7amF2YWMgLXNvdXJjZTEuNCZxdW90Oy4gIFdpbGwgYmUgaWdub3JlZCBpZiB5b3UgdXNlIGEgY3VzdG9tZG9jbGV0PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9ImxvYWRmaWxlIj4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0OwotTG9hZCBhIHRleHQgZmlsZSBpbnRvIGEgc2luZ2xlIHByb3BlcnR5LiBVbmxlc3MgYW4gZW5jb2RpbmcgaXMgc3BlY2lmaWVkLAotdGhlIGVuY29kaW5nIG9mIHRoZSBjdXJyZW50IGxvY2FsZSBpcyB1c2VkLgotJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJzcmNmaWxlIiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj5zb3VyY2UgZmlsPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJwcm9wZXJ0eSIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+cHJvcGVydHkgdG8gc2F2ZSB0PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJlbmNvZGluZyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5lbmNvZGluZyB0byB1c2Ugd2hlbiBsb2FkaW5nIHRoZSBmaWw8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZhaWxvbmVycm9yIiBSRVFVSVJFRD0ibm8sIGRlZmF1bHQgJnF1b3Q7dHJ1ZSZxdW90OyI+Ci0JCQk8REVTQ1JJUFRJT04+V2hldGhlciB0byBoYWx0IHRoZSBidWlsZCBvbiBmYWlsdXI8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0ibG9hZHByb3BlcnRpZXMiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7Ci1Mb2FkIGEgZmlsZSdzIGNvbnRlbnRzIGFzIEFudCBwcm9wZXJ0aWVzLiAgVGhpcyBpcyBlcXVpdmFsZW50Ci10byAmYW1wO2x0O3Byb3BlcnR5IGZpbGU9JmFtcDtxdW90Oy4uLiZhbXA7cXVvdDsvJmFtcDtndDsgZXhjZXB0IHRoYXQgaXQKLXN1cHBvcnRzIG5lc3RlZCAmYW1wO2x0O2ZpbHRlcmNoYWluJmFtcDtndDsgZWxlbWVudHMgYW5kIGl0IGNhbm5vdCBiZQotc3BlY2lmaWVkIG91dHNpZGUgYSB0YXJnZXQuCi0mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9InNyY2ZpbGUiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPnNvdXJjZSBmaWw8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImVuY29kaW5nIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmVuY29kaW5nIHRvIHVzZSB3aGVuIGxvYWRpbmcgdGhlIGZpbDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJtYWlsIj4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0EgdGFzayB0byBzZW5kIFNNVFAgZW1haWwuIFRoaXMgdGFzayBjYW4gc2VuZCBtYWlsIHVzaW5nIGVpdGhlciBwbGFpbgotdGV4dCwgVVUgZW5jb2RpbmcsIG9yIE1JTUUgZm9ybWF0IG1haWwsIGRlcGVuZGluZyBvbiB3aGF0IGlzIGF2YWlsYWJsZS4KLUF0dGFjaG1lbnRzIG1heSBiZSBzZW50IHVzaW5nIG5lc3RlZAotJmx0O2EgaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sJnF1b3Q7Jmd0O2ZpbGVzZXQmbHQ7L2EmZ3Q7IGVsZW1lbnRzLiZsdDsvcCZndDsKLSZsdDtwJmd0OyZsdDtzdHJvbmcmZ3Q7Tm90ZTombHQ7L3N0cm9uZyZndDsgVGhpcyB0YXNrIG1heSBkZXBlbmQgb24gZXh0ZXJuYWwgbGlicmFyaWVzCi10aGF0IGFyZSBub3QgaW5jbHVkZWQKLWluIHRoZSBBbnQgZGlzdHJpYnV0aW9uLiAgU2VlICZsdDthIGhyZWY9JnF1b3Q7Li4vaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMmcXVvdDsmZ3Q7Ci1MaWJyYXJ5IERlcGVuZGVuY2llcyZsdDsvYSZndDsgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9ImZyb20iIFJFUVVJUkVEPSJlaXRoZXIgYSBmcm9tIGF0dHJpYnV0ZSwgb3IgYSAmbHQ7ZnJvbSZndDsKLSAgICAgZWxlbWVudC4iPgotCQkJPERFU0NSSVBUSU9OPkVtYWlsIGFkZHJlc3Mgb2Ygc2VuZGVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ0b2xpc3QiIFJFUVVJUkVEPSJhdCBsZWFzdCBvbmUgb2YgdGhlc2UsIG9yIHRoZQotICAgICAgICBlcXVpdmFsZW50IGVsZW1lbnRzLiI+Ci0JCQk8REVTQ1JJUFRJT04+Q29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVjaXBpZW50czwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY2NsaXN0IiBSRVFVSVJFRD0iIj4KLQkJCTxERVNDUklQVElPTj5Db21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZWNpcGllbnRzIHRvIGNhcmJvbiBjb3A8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImJjY2xpc3QiIFJFUVVJUkVEPSIiPgotCQkJPERFU0NSSVBUSU9OPkNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlY2lwaWVudHMgdG8gY2FyYm9uIGNvcDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibWVzc2FnZSIgUkVRVUlSRUQ9Im9uZSBvZiB0aGVzZSBvciBhCi0gICAgICZsdDttZXNzYWdlJmd0OyBlbGVtZW50LiI+Ci0JCQk8REVTQ1JJUFRJT04+TWVzc2FnZSB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZSBlbWFpbDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibWVzc2FnZWZpbGUiIFJFUVVJUkVEPSIiPgotCQkJPERFU0NSSVBUSU9OPkZpbGUgdG8gc2VuZCBhcyB0aGUgYm9keSBvZiB0aGUgZW1haWwuIFByb3BlcnR5dmFsdWVzIGluIHRoZSBmaWxlIHdpbGwgYmUgZXhwYW5kZWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im1lc3NhZ2VtaW1ldHlwZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5UaGUgY29udGVudCB0eXBlIG9mIHRoZSBtZXNzYWdlLiAgVGhlIGRlZmF1bHQgaXN0ZXh0L3BsYWluPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJmaWxlcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5GaWxlcyB0byBzZW5kIGFzIGF0dGFjaG1lbnRzIHRvIHRoZSBlbWFpbC4gIFNlcGFyYXRlIG11bHRpcGxlZmlsZSBuYW1lcyB1c2luZyBhIGNvbW1hLiAgWW91IGNhbiBhbHNvIHVzZSAmbHQ7ZmlsZXNldCZndDtlbGVtZW50cyB0byBzcGVjaWZ5IGZpbGVzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJmYWlsb25lcnJvciIgUkVRVUlSRUQ9Im5vLiI+Ci0JCQk8REVTQ1JJUFRJT04+ZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRvIGhhbHQgdGhlIGJ1aWxkIG9uYW55IGVycm9yLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZWZpbGVuYW1lcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5JbmNsdWRlIGZpbGVuYW1lKHMpIGJlZm9yZSBmaWxlIGNvbnRlbnRzLlZhbGlkIG9ubHkgd2hlbiB0aGUgcGxhaW4gZW5jb2RpbmcgaXMgdXNlZC4gIFRoZSBkZWZhdWx0dmFsdWUgaXMgZmFsc2U8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im1haWxob3N0IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkhvc3QgbmFtZSBvZiB0aGUgU01UUCBzZXJ2ZXIuICBUaGUgZGVmYXVsdCB2YWx1ZSBpc2xvY2FsaG9zdDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibWFpbHBvcnQiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VENQIHBvcnQgb2YgdGhlIFNNVFAgc2VydmVyLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgMjU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImVuY29kaW5nIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlNwZWNpZmllcyB0aGUgZW5jb2RpbmcgdG8gdXNlIGZvciB0aGUgY29udGVudCBvZiB0aGUgZW1haWwuVmFsdWVzIGFyZSBtaW1lLCB1dSwgcGxhaW4sIG9yYXV0by4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGF1dG88L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InN1YmplY3QiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+RW1haWwgc3ViamVjdCBsaW5lPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9Im1hbmlmZXN0Ij4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0NyZWF0ZXMgYSBtYW5pZmVzdCBmaWxlLiZsdDsvcCZndDsKLSZsdDtwJmd0O1RoaXMgdGFzayBjYW4gYmUgdXNlZCB0byB3cml0ZSBhIE1hbmlmZXN0IGZpbGUsIG9wdGlvbmFsbHkKLXJlcGxhY2luZyBvciB1cGRhdGluZyBhbiBleGlzdGluZyBmaWxlLiZsdDsvcCZndDsKLSZsdDtwJmd0O01hbmlmZXN0cyBhcmUgcHJvY2Vzc2VkIGFjY29yZGluZyB0byB0aGUgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy9ndWlkZS9qYXIvamFyLmh0bWwmcXVvdDsmZ3Q7SmFyCi1maWxlIHNwZWNpZmljYXRpb24uJmx0Oy9hJmd0Oy4gU3BlY2lmaWNhbGx5LCBhIG1hbmlmZXN0IGVsZW1lbnQgY29uc2lzdHMgb2YKLWEgc2V0IG9mIGF0dHJpYnV0ZXMgYW5kIHNlY3Rpb25zLiBUaGVzZSBzZWN0aW9ucyBpbiB0dXJuIG1heSBjb250YWluCi1hdHRyaWJ1dGVzLiBOb3RlIGluIHBhcnRpY3VsYXIgdGhhdCB0aGlzIG1heSByZXN1bHQgaW4gbWFuaWZlc3QgbGluZXMKLWdyZWF0ZXIgdGhhbiA3MiBieXRlcyBiZWluZyB3cmFwcGVkIGFuZCBjb250aW51ZWQgb24gdGhlIG5leHQKLWxpbmUuJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJmaWxlIiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj50aGUgbWFuaWZlc3QtZmlsZSB0byBjcmVhdGUvdXBkYXRlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJtb2RlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPk9uZSBvZiAmcXVvdDt1cGRhdGUmcXVvdDsgb3IgJnF1b3Q7cmVwbGFjZSZxdW90OywgZGVmYXVsdCBpcyAmcXVvdDtyZXBsYWNlJnF1b3Q7PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9Im1rZGlyIj4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0NyZWF0ZXMgYSBkaXJlY3RvcnkuIEFsc28gbm9uLWV4aXN0ZW50IHBhcmVudCBkaXJlY3RvcmllcyBhcmUgY3JlYXRlZCwgd2hlbgotbmVjZXNzYXJ5LiZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0iZGlyIiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj50aGUgZGlyZWN0b3J5IHRvIGNyZWF0ZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJtb3ZlIj4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O01vdmVzIGEgZmlsZSB0byBhIG5ldyBmaWxlIG9yIGRpcmVjdG9yeSwgb3Igc2V0cyBvZiBmaWxlcyB0bwotYSBuZXcgZGlyZWN0b3J5LiAgQnkgZGVmYXVsdCwgdGhlCi1kZXN0aW5hdGlvbiBmaWxlIGlzIG92ZXJ3cml0dGVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLiAgV2hlbiAmbHQ7dmFyJmd0O292ZXJ3cml0ZSZsdDsvdmFyJmd0OyBpcwotdHVybmVkIG9mZiwgdGhlbiBmaWxlcyBhcmUgb25seSBtb3ZlZCBpZiB0aGUgc291cmNlIGZpbGUgaXMgbmV3ZXIgdGhhbgotdGhlIGRlc3RpbmF0aW9uIGZpbGUsIG9yIHdoZW4gdGhlIGRlc3RpbmF0aW9uIGZpbGUgZG9lcyBub3QgZXhpc3QuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Jmx0O2EgaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sJnF1b3Q7Jmd0O0ZpbGVTZXQmbHQ7L2EmZ3Q7cyBhcmUgdXNlZCB0byBzZWxlY3Qgc2V0cyBvZiBmaWxlcwotdG8gbW92ZSB0byB0aGUgJmx0O3ZhciZndDt0b2RpciZsdDsvdmFyJmd0OyBkaXJlY3RvcnkuJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJmaWxlIiBSRVFVSVJFRD0ib25lIG9mIGZpbGUgb3IKLSAgICAgIGF0IGxlYXN0IG9uZSBuZXN0ZWQgZmlsZXNldCBlbGVtZW50Ij4KLQkJCTxERVNDUklQVElPTj50aGUgZmlsZSB0byBtb3Y8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InRvZmlsZSIgUkVRVUlSRUQ9IndpdGggdGhlIGZpbGUgYXR0cmlidXRlLAotICAgICBlaXRoZXIgdG9maWxlIG9yIHRvZGlyIGNhbiBiZSB1c2VkLiAgd2l0aCBuZXN0ZWQgZmlsZXNldHMsCi0gICAgIGlmIHRoZSBmaWxlc2V0IHNpemUgaXMgZ3JlYXRlciB0aGFuIDEgb3IgaWYgdGhlIG9ubHkgZW50cnkgaW4gdGhlIGZpbGVzZXQgaXMgYQotICAgICBkaXJlY3Rvcnkgb3IgaWYgdGhlIGZpbGUgYXR0cmlidXRlIGlzIGFscmVhZHkgc3BlY2lmaWVkLCBvbmx5Ci0gICAgIHRvZGlyIGlzIGFsbG93ZWQiPgotCQkJPERFU0NSSVBUSU9OPnRoZSBmaWxlIHRvIG1vdmUgdDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idG9kaXIiIFJFUVVJUkVEPSIiPgotCQkJPERFU0NSSVBUSU9OPnRoZSBkaXJlY3RvcnkgdG8gbW92ZSB0PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJvdmVyd3JpdGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+b3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzIGV2ZW4gaWYgdGhlIGRlc3RpbmF0aW9uZmlsZXMgYXJlIG5ld2VyIChkZWZhdWx0IGlzICZxdW90O3RydWUmcXVvdDs8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZpbHRlcmluZyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5pbmRpY2F0ZXMgd2hldGhlciB0b2tlbiBmaWx0ZXJpbmcgc2hvdWxkIHRha2UgcGxhY2UgZHVyaW5ndGhlIG1vdmUuICBTZWUgdGhlIGZpbHRlciB0YXNrIGZvciBhIGRlc2NyaXB0aW9uIG9maG93IGZpbHRlcnMgd29yazwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZmxhdHRlbiIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5pZ25vcmUgZGlyZWN0b3J5IHN0cnVjdHVyZSBvZiBzb3VyY2UgZGlyZWN0b3J5LGNvcHkgYWxsIGZpbGVzIGludG8gYSBzaW5nbGUgZGlyZWN0b3J5LCBzcGVjaWZpZWQgYnkgdGhlIHRvZGlyYXR0cmlidXRlIChkZWZhdWx0IGlzICZxdW90O2ZhbHNlJnF1b3Q7KS5Ob3RlIHRoYXQgeW91IGNhbiBhY2hpZXZlIHRoZXNhbWUgZWZmZWN0IGJ5IHVzaW5nIGEgZmxhdHRlbiBtYXBwZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZWVtcHR5ZGlycyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5Db3B5IGVtcHR5IGRpcmVjdG9yaWVzIGluY2x1ZGVkIHdpdGggdGhlIG5lc3RlZCBGaWxlU2V0KHMpLkRlZmF1bHRzIHRvICZxdW90O3llcyZxdW90OzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJwYXJhbGxlbCI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtQYXJhbGxlbCBpcyBhIGNvbnRhaW5lciB0YXNrIC0gaXQgY2FuIGNvbnRhaW4gb3RoZXIgQW50IHRhc2tzLiBFYWNoIG5lc3RlZAotdGFzayB3aXRoaW4gdGhlIHBhcmFsbGVsIHRhc2sgd2lsbCBiZSBleGVjdXRlZCBpbiBpdHMgb3duIHRocmVhZC4gJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7UGFyYWxsZWwgdGFza3MgaGF2ZSBhIG51bWJlciBvZiB1c2VzIGluIGFuIEFudCBidWlsZGZpbGUgaW5jbHVkaW5nOiZsdDsvcCZndDsKLSZsdDt1bCZndDsKLSZsdDtsaSZndDtUYWtpbmcgYWR2YW50YWdlIG9mIGF2YWlsYWJsZSBwcm9jZXNzaW5nIHJlc291cmNlcyB0byByZWR1Y2UgYnVpbGQgdGltZSZsdDsvbGkmZ3Q7Ci0mbHQ7bGkmZ3Q7VGVzdGluZyBzZXJ2ZXJzLCB3aGVyZSB0aGUgc2VydmVyIGNhbiBiZSBydW4gaW4gb25lIHRocmVhZCBhbmQgdGhlIHRlc3QKLWhhcm5lc3MgaXMgcnVuIGluIGFub3RoZXIgdGhyZWFkLiZsdDsvbGkmZ3Q7Ci0mbHQ7L3VsJmd0OwotJmx0O3AmZ3Q7Q2FyZSBtdXN0IGJlIHRha2VuIHdoZW4gdXNpbmcgbXVsdGl0aHJlYWRpbmcgdG8gZW5zdXJlIHRoZSB0YXNrcyB3aXRoaW4gdGhlCi10aHJlYWRzIGRvIG5vdCBpbnRlcmFjdC4gRm9yIGV4YW1wbGUsIHR3byBqYXZhYyBjb21waWxlIHRhc2tzIHdoaWNoIHdyaXRlIAotY2xhc3NlcyBpbnRvIHRoZSBzYW1lIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBtYXkgaW50ZXJhY3Qgd2hlcmUgb25lIHRyaWVzIHRvCi1yZWFkIGEgY2xhc3MgZm9yIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gd2hpbGUgdGhlIG90aGVyIHRhc2sgaXMgd3JpdGluZyB0aGUgCi1jbGFzcyBmaWxlLiBCZSBzdXJlIHRvIGF2b2lkIHRoZXNlIHR5cGVzIG9mIGludGVyYWN0aW9ucyB3aXRoaW4gYSAKLSZhbXA7bHQ7cGFyYWxsZWwmYW1wO2d0OyB0YXNrJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7VGhlIHBhcmFsbGVsIHRhc2sgaGFzIG5vIGF0dHJpYnV0ZXMgYW5kIGRvZXMgbm90IHN1cHBvcnQgYW55IG5lc3RlZCAKLWVsZW1lbnRzIGFwYXJ0IGZyb20gQW50IHRhc2tzLiBBbnkgdmFsaWQgQW50IHRhc2sgbWF5IGJlIGVtYmVkZGVkIHdpdGhpbiBhIAotcGFyYWxsZWwgdGFzaywgaW5jbHVkaW5nIG90aGVyIHBhcmFsbGVsIHRhc2tzLiZsdDsvcCZndDsKLSZsdDtwJmd0O05vdGUgdGhhdCB3aGlsZSB0aGUgdGFza3Mgd2l0aGluIHRoZSBwYXJhbGxlbCB0YXNrIGFyZSBiZWluZyBydW4sIHRoZSBtYWluIAotdGhyZWFkIHdpbGwgYmUgYmxvY2tlZCB3YWl0aW5nIGZvciBhbGwgdGhlIGNoaWxkIHRocmVhZHMgdG8gY29tcGxldGUuJmx0Oy9wJmd0OyAgCi0mbHQ7cCZndDtJZiBhbnkgb2YgdGhlIHRhc2tzIHdpdGhpbiB0aGUgJmFtcDtsdDtwYXJhbGxlbCZhbXA7Z3Q7IHRhc2sgZmFpbHMsIHRoZSByZW1haW5pbmcgCi10YXNrcyBpbiBvdGhlciB0aHJlYWRzIHdpbGwgY29udGludWUgdG8gcnVuIHVudGlsIGFsbCB0aHJlYWRzIGhhdmUgY29tcGxldGVkLiAKLUluIHRoaXMgc2l0dWF0aW9uLCB0aGUgcGFyYWxsZWwgdGFzayB3aWxsIGFsc28gZmFpbC4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtUaGUgcGFyYWxsZWwgdGFzayBtYXkgYmUgY29tYmluZWQgd2l0aCB0aGUgJmx0O2EgaHJlZj0mcXVvdDtzZXF1ZW50aWFsLmh0bWwmcXVvdDsmZ3Q7Ci1zZXF1ZW50aWFsJmx0Oy9hJmd0OyB0YXNrIHRvIGRlZmluZSBzZXF1ZW5jZXMgb2YgdGFza3MgdG8gYmUgZXhlY3V0ZWQgb24gZWFjaCB0aHJlYWQKLXdpdGhpbiB0aGUgcGFyYWxsZWwgYmxvY2smbHQ7L3AmZ3Q7Ci0mbHQ7aDMmZ3Q7RXhhbXBsZXMmbHQ7L2gzJmd0OwotJmx0O3ByZSZndDsKLSZhbXA7bHQ7cGFyYWxsZWwmYW1wO2d0OwotJmFtcDtsdDt3bHJ1biAuLi4gJmFtcDtndDsKLSZhbXA7bHQ7c2VxdWVudGlhbCZhbXA7Z3Q7Ci0mYW1wO2x0O3NsZWVwIHNlY29uZHM9JmFtcDtxdW90OzMwJmFtcDtxdW90Oy8mYW1wO2d0OwotJmFtcDtsdDtqdW5pdCAuLi4gJmFtcDtndDsKLSZhbXA7bHQ7d2xzdG9wLyZhbXA7Z3Q7Ci0mYW1wO2x0Oy9zZXF1ZW50aWFsJmFtcDtndDsKLSZhbXA7bHQ7L3BhcmFsbGVsJmFtcDtndDsKLSZsdDsvcHJlJmd0OwotJmx0O3AmZ3Q7VGhpcyBleGFtcGxlIHJlcHJlc2VudHMgYSB0eXBpY2FsIHBhdHRlcm4gZm9yIHRlc3RpbmcgYSBzZXJ2ZXIgYXBwbGljYXRpb24uIAotSW4gb25lIHRocmVhZCB0aGUgc2VydmVyIGlzIHN0YXJ0ZWQgKHRoZSB3bHJ1biB0YXNrKS4gVGhlIG90aGVyIHRocmVhZCBjb25zaXN0cyAKLW9mIGEgdGhyZWUgdGFza3Mgd2hpY2ggYXJlIHBlcmZvcm1lZCBpbiBzZXF1ZW5jZS4gVGhlIHNsZWVwIHRhc2sgaXMgdXNlZCB0byAKLWdpdmUgdGhlIHNlcnZlciB0aW1lIHRvIGNvbWUgdXAuIEFub3RoZXIgdGFzayB3aGljaCBpcyBjYXBhYmxlIG9mIHZhbGlkYXRpbmcgCi10aGF0IHRoZSBzZXJ2ZXIgaXMgYXZhaWxhYmxlIGNvdWxkIGJlIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIHNsZWVwIHRhc2suIFRoZSAKLXRlc3QgaGFybmVzcyBpcyB0aGVuIHJ1bi4gT25jZSB0aGUgdGVzdHMgYXJlIGNvbXBsZXRlLCB0aGUgc2VydmVyIGlzIHN0b3BwZWQgCi0odXNpbmcgd2xzdG9wIGluIHRoaXMgZXhhbXBsZSksIGFsbG93aW5nIGJvdGggdGhyZWFkcyB0byBjb21wbGV0ZS4gVGhlIAotcGFyYWxsZWwgdGFzayB3aWxsIGFsc28gY29tcGxldGUgYXQgdGhpcyB0aW1lIGFuZCB0aGUgYnVpbGQgd2lsbCB0aGVuIAotY29udGludWUuJmx0Oy9wJmd0OwotJmx0O3ByZSZndDsKLSZhbXA7bHQ7cGFyYWxsZWwmYW1wO2d0OwotJmFtcDtsdDtqYXZhYyAuLi4mYW1wO2d0OyAmYW1wO2x0OyEtLSBjb21waWxlciBzZXJ2bGV0IGNvZGUgLS0mYW1wO2d0OwotJmFtcDtsdDt3bGpzcGMgLi4uJmFtcDtndDsgJmFtcDtsdDshLS0gcHJlY29tcGlsZSBKU1BzIC0tJmFtcDtndDsKLSZhbXA7bHQ7L3BhcmFsbGVsJmFtcDtndDsKLSZsdDsvcHJlJmd0OwotJmx0O3AmZ3Q7VGhpcyBleGFtcGxlIHNob3dzIHR3byBpbmRlcGVuZGVudCB0YXNrcyBiZWluZyBydW4gdG8gYWNoaWV2ZSBiZXR0ZXIgCi1yZXNvdXJjZSB1dGlsaXphdGlvbiBkdXJpbmcgdGhlIGJ1aWxkLiBJbiB0aGlzIGluc3RhbmNlLCBzb21lIHNlcnZsZXRzIGFyZSBiZWluZwotY29tcGlsZWQgaW4gb25lIHRoZWFkIGFuZCBhIHNldCBvZiBKU1BzIGlzIGJlaW5nIHByZWNvbXBpbGVkIGluIGFub3RoZXIuIEFzIAotbm90ZWQgYWJvdmUsIHlvdSBuZWVkIHRvIGJlIGNhcmVmdWwgdGhhdCB0aGUgdHdvIHRhc2tzIGFyZSBpbmRlcGVuZGVudCwgYm90aCBpbiAKLXRlcm1zIG9mIHRoZWlyIGRlcGVuZGVuY2llcyBhbmQgaW4gdGVybXMgb2YgdGhlaXIgcG90ZW50aWFsIGludGVyYWN0aW9ucyBpbgotQW50J3MgZXh0ZXJuYWwgZW52aXJvbm1lbnQuJmx0Oy9wJmd0OwotJmx0O2hyJmd0OwotJmx0O3AgYWxpZ249JnF1b3Q7Y2VudGVyJnF1b3Q7Jmd0O0NvcHlyaWdodCAmYW1wO2NvcHk7IDIwMDEtMjAwMiBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gQWxsIHJpZ2h0cwotUmVzZXJ2ZWQuJmx0Oy9wJmd0OwotJmx0Oy9ib2R5Jmd0OwotJmx0Oy9odG1sJmd0OwotPC9ERVNDUklQVElPTj4JPC9UQVNLPgotCTxUQVNLIE5BTUU9InBhdGNoIj4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0FwcGxpZXMgYSBkaWZmIGZpbGUgdG8gb3JpZ2luYWxzLiA7IHJlcXVpcmVzICZxdW90O3BhdGNoJnF1b3Q7IHRvIGJlCi1vbiB0aGUgZXhlY3V0aW9uIHBhdGguICAmbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9InBhdGNoZmlsZSIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGZpbGUgdGhhdCBpbmNsdWRlcyB0aGUgZGlmZiBvdXRwdTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ib3JpZ2luYWxmaWxlIiBSRVFVSVJFRD0ibm8sIHRyaWVzIHRvIGd1ZXNzIGl0IGZyb20gdGhlIGRpZmYgCi0gICAgICAgZmlsZSI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGZpbGUgdG8gcGF0YzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iYmFja3VwcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5LZWVwIGJhY2t1cHMgb2YgdGhlIHVucGF0Y2hlZCBmaWxlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJxdWlldCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5Xb3JrIHNpbGVudGx5IHVubGVzcyBhbiBlcnJvciBvY2N1cjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0icmV2ZXJzZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5Bc3N1bWUgcGF0Y2ggd2FzIGNyZWF0ZWQgd2l0aCBvbGQgYW5kIG5ldyBmaWxlcyBzd2FwcGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJpZ25vcmV3aGl0ZXNwYWNlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPklnbm9yZSB3aGl0ZXNwYWNlIGRpZmZlcmVuY2VzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzdHJpcCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TdHJpcCB0aGUgc21hbGxlc3QgcHJlZml4IGNvbnRhaW5pbmcgbnVtIGxlYWRpbmcgc2xhc2hlcyBmcm9tIGZpbGVuYW1lczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZGlyIiBSRVFVSVJFRD0ibm8sIGRlZmF1bHQgaXMgdGhlIHByb2plY3QncyBiYXNlZGlyLiI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0byBydW4gdGhlIHBhdGNoIGNvbW1hbmQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0icGF0aGNvbnZlcnQiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7Q29udmVydHMgYSBuZXN0ZWQgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtwYXRoJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7IG9yIHJlZmVyZW5jZSB0byBhIFBhdGgsCi1GaWxlU2V0LCBEaXJTZXQsIG9yIEZpbGVMaXN0IGludG8gYSBwYXRoCi1mb3JtIGZvciBhIHBhcnRpY3VsYXIgcGxhdGZvcm0sIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiBhIGdpdmVuIHByb3BlcnR5LgotSXQgY2FuIGFsc28gYmUgdXNlZCB3aGVuIHlvdSBuZWVkCi10byBjb252ZXJ0IGEgUGF0aCwgRmlsZVNldCwgb3IgRGlyU2V0IGludG8gYSBsaXN0LCBzZXBhcmF0ZWQgYnkgYSBnaXZlbgotY2hhcmFjdGVyLCBzdWNoIGFzIGEgY29tbWEgb3Igc3BhY2UsIG9yLCBjb252ZXJzZWx5LCB0byBjb252ZXJ0IGEgbGlzdAotb2YgZmlsZXMgaW4gYSBGaWxlTGlzdCBpbnRvIGEgcGF0aC4KLSZsdDsvcCZndDsKLSZsdDtwJmd0O05lc3RlZCAmbHQ7Y29kZSZndDsmYW1wO2x0O21hcCZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyBlbGVtZW50cyBjYW4gYmUgc3BlY2lmaWVkIHRvIG1hcCBXaW5kb3dzCi1kcml2ZSBsZXR0ZXJzIHRvIFVuaXggcGF0aHMsIGFuZCB2aWNlLXZlcnNhLiZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0idGFyZ2V0b3MiIFJFUVVJUkVEPSJ5ZXMsIHVubGVzcyBwYXRoc2VwIGFuZC9vcgotICAgICAgICBkaXJzZXAgYXJlIHNwZWNpZmllZC4KLSAgICAgIj4KLQkJCTxERVNDUklQVElPTj5UaGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4gIE11c3QgYmUgb25lIG9mICd1bml4JywgJ3dpbmRvd3MnLCAnbmV0d2FyZScgb3IgJ29zLzInLlRoaXMgaXMgYSBzaG9ydGhhbmQgbWVjaGFuaXNtIGZvciBzcGVjaWZ5aW5nIGJvdGhwYXRoc2VwIGFuZCBkaXJzZXBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQgYXJjaGl0ZWN0dXJlLjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZGlyc2VwIiBSRVFVSVJFRD0ibm8sIGRlZmF1bHRzIHRvIGN1cnJlbnQganZtIGZpbGUuc2VwYXJhdG9yIj4KLQkJCTxERVNDUklQVElPTj5UaGUgY2hhcmFjdGVyKHMpIHRvIHVzZSBhcyB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvciBpbiB0aGVnZW5lcmF0ZWQgcGF0aHMuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJwYXRoc2VwIiBSRVFVSVJFRD0ibm8sIGRlZmF1bHRzIHRvIGN1cnJlbnQganZtIGZpbGUucGF0aHNlcGFyYXRvciI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGNoYXJhY3RlcihzKSB0byB1c2UgYXMgdGhlIHBhdGgtZWxlbWVudCBzZXBhcmF0b3IgaW4gdGhlZ2VuZXJhdGVkIHBhdGhzLjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0icHJvcGVydHkiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPlRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBpbiB3aGljaCB0byBwbGFjZSB0aGUgY29udmVydGVkIHBhdGg8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InJlZmlkIiBSRVFVSVJFRD0ibm87IGlmIG9taXR0ZWQsIGEgbmVzdGVkCi0gICAgICAgICAmbHQ7cGF0aCZndDsgZWxlbWVudCBtdXN0IGJlIHN1cHBsaWVkLiI+Ci0JCQk8REVTQ1JJUFRJT04+V2hhdCB0byBjb252ZXJ0LCBnaXZlbiBhcyBhcmVmZXJlbmNlIHRvIGEmbHQ7cGF0aCZndDssICZsdDtmaWxlc2V0Jmd0OywmbHQ7ZGlyc2V0Jmd0Oywgb3IgJmx0O2ZpbGVzZXQmZ3Q7ZGVmaW5lZCBlbHNld2hlcjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ic2V0b25lbXB0eSIgUkVRVUlSRUQ9Im5vOyBkZWZhdWx0IGlzICZxdW90O3RydWUmcXVvdDsuCi0gICAiPgotCQkJPERFU0NSSVBUSU9OPlNob3VsZCB0aGUgcHJvcGVydHkgYmUgc2V0LCBldmVuIGlmIHRoZSByZXN1bHRpcyB0aGUgZW1wdHkgc3RyaW5nPzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJwcm9wZXJ0eSI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtTZXRzIGEgcHJvcGVydHkgKGJ5IG5hbWUgYW5kIHZhbHVlKSwgb3Igc2V0IG9mIHByb3BlcnRpZXMgKGZyb20gZmlsZSBvcgotcmVzb3VyY2UpIGluIHRoZSBwcm9qZWN0LiAgUHJvcGVydGllcyBhcmUgY2FzZSBzZW5zaXRpdmUuJmx0Oy9wJmd0OwotUHJvcGVydGllcyBhcmUgaW1tdXRhYmxlOiB3aG9ldmVyIHNldHMgYSBwcm9wZXJ0eSBmaXJzdCBmcmVlemVzIGl0IGZvciB0aGUKLXJlc3Qgb2YgdGhlIGJ1aWxkOyB0aGV5IGFyZSBtb3N0IGRlZmluYXRlbHkgbm90IHZhcmlhYmxlLiAKLSZsdDtwJmd0O1RoZXJlIGFyZSBmaXZlIHdheXMgdG8gc2V0IHByb3BlcnRpZXM6Jmx0Oy9wJmd0OwotJmx0O3VsJmd0OwotJmx0O2xpJmd0O0J5IHN1cHBseWluZyBib3RoIHRoZSAmbHQ7aSZndDtuYW1lJmx0Oy9pJmd0OyBhbmQgJmx0O2kmZ3Q7dmFsdWUmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZS4mbHQ7L2xpJmd0OwotJmx0O2xpJmd0O0J5IHN1cHBseWluZyBib3RoIHRoZSAmbHQ7aSZndDtuYW1lJmx0Oy9pJmd0OyBhbmQgJmx0O2kmZ3Q7cmVmaWQmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZS4mbHQ7L2xpJmd0OwotJmx0O2xpJmd0O0J5IHNldHRpbmcgdGhlICZsdDtpJmd0O2ZpbGUmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSB3aXRoIHRoZSBmaWxlbmFtZSBvZiB0aGUgcHJvcGVydHkKLWZpbGUgdG8gbG9hZC4gVGhpcyBwcm9wZXJ0eSBmaWxlIGhhcyB0aGUgZm9ybWF0IGFzIGRlZmluZWQgYnkgdGhlIGZpbGUgdXNlZAotaW4gdGhlIGNsYXNzIGphdmEudXRpbC5Qcm9wZXJ0aWVzLiZsdDsvbGkmZ3Q7Ci0mbHQ7bGkmZ3Q7Qnkgc2V0dGluZyB0aGUgJmx0O2kmZ3Q7cmVzb3VyY2UmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSB3aXRoIHRoZSByZXNvdXJjZSBuYW1lIG9mIHRoZQotcHJvcGVydHkgZmlsZSB0byBsb2FkLiBUaGlzIHByb3BlcnR5IGZpbGUgaGFzIHRoZSBmb3JtYXQgYXMgZGVmaW5lZCBieSB0aGUKLWZpbGUgdXNlZCBpbiB0aGUgY2xhc3MgamF2YS51dGlsLlByb3BlcnRpZXMuJmx0Oy9saSZndDsKLSZsdDtsaSZndDtCeSBzZXR0aW5nIHRoZSAmbHQ7aSZndDtlbnZpcm9ubWVudCZsdDsvaSZndDsgYXR0cmlidXRlIHdpdGggYSBwcmVmaXggdG8gdXNlLgotUHJvcGVydGllcyB3aWxsIGJlIGRlZmluZWQgZm9yIGV2ZXJ5IGVudmlyb25tZW50IHZhcmlhYmxlIGJ5Ci1wcmVmaXhpbmcgdGhlIHN1cHBsaWVkIG5hbWUgYW5kIGEgcGVyaW9kIHRvIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZS4mbHQ7L2xpJmd0OwotJmx0Oy91bCZndDsKLSZsdDtwJmd0O0FsdGhvdWdoIGNvbWJpbmF0aW9ucyBvZiB0aGVzZSB3YXlzIGFyZSBwb3NzaWJsZSwgb25seSBvbmUgc2hvdWxkIGJlIHVzZWQKLWF0IGEgdGltZS4gUHJvYmxlbXMgbWlnaHQgb2NjdXIgd2l0aCB0aGUgb3JkZXIgaW4gd2hpY2ggcHJvcGVydGllcyBhcmUgc2V0LCBmb3IKLWluc3RhbmNlLiZsdDsvcCZndDsKLSZsdDtwJmd0O1RoZSB2YWx1ZSBwYXJ0IG9mIHRoZSBwcm9wZXJ0aWVzIGJlaW5nIHNldCwgbWlnaHQgY29udGFpbiByZWZlcmVuY2VzIHRvIG90aGVyCi1wcm9wZXJ0aWVzLiBUaGVzZSByZWZlcmVuY2VzIGFyZSByZXNvbHZlZCBhdCB0aGUgdGltZSB0aGVzZSBwcm9wZXJ0aWVzIGFyZSBzZXQuCi1UaGlzIGFsc28gaG9sZHMgZm9yIHByb3BlcnRpZXMgbG9hZGVkIGZyb20gYSBwcm9wZXJ0eSBmaWxlLiZsdDsvcCZndDsKLSZsdDtwJmd0O0EgbGlzdCBvZiBwcmVkZWZpbmVkIHByb3BlcnRpZXMgY2FuIGJlIGZvdW5kICZsdDthCi1ocmVmPSZxdW90Oy4uL3VzaW5nLmh0bWwjYnVpbHQtaW4tcHJvcHMmcXVvdDsmZ3Q7aGVyZSZsdDsvYSZndDsuJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJuYW1lIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InZhbHVlIiBSRVFVSVJFRD0ib25lIG9mIHRoZXNlLCB3aGVuIHVzaW5nIHRoZQotICAgICAgICBuYW1lIGF0dHJpYnV0ZSI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibG9jYXRpb24iIFJFUVVJUkVEPSIiPgotCQkJPERFU0NSSVBUSU9OPlNldHMgdGhlIHByb3BlcnR5IHRvIHRoZSBhYnNvbHV0ZSBmaWxlbmFtZSBvZiB0aGVnaXZlbiBmaWxlLiBJZiB0aGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgaXMgYW4gYWJzb2x1dGUgcGF0aCwgaXRpcyBsZWZ0IHVuY2hhbmdlZCAod2l0aCAvIGFuZCBcIGNoYXJhY3RlcnMgY29udmVydGVkIHRvIHRoZWN1cnJlbnQgcGxhdGZvcm1zIGNvbnZlbnRpb25zKS4gT3RoZXJ3aXNlIGl0IGlzIHRha2VuIGFzIGEgcGF0aHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0J3MgYmFzZWRpciBhbmQgZXhwYW5kZWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InJlZmlkIiBSRVFVSVJFRD0iIj4KLQkJCTxERVNDUklQVElPTj5SZWZlcmVuY2UgdG8gYW4gb2JqZWN0ZGVmaW5lZCBlbHNld2hlcmUuIE9ubHkgeWllbGRzIHJlYXNvbmFibGUgcmVzdWx0cyBmb3IgcmVmZXJlbmNlc3RvIFBBVEggbGlrZSBzdHJ1Y3R1cmVzIG9yIHByb3BlcnRpZXM8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InJlc291cmNlIiBSRVFVSVJFRD0ib25lIG9mIHRoZXNlLCB3aGVuCi0gICAgICAgbm90IHVzaW5nIHRoZSBuYW1lIGF0dHJpYnV0ZSI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIHJlc291cmNlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZpbGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZpbGUiIFJFUVVJUkVEPSIiPgotCQkJPERFU0NSSVBUSU9OPnRoZSBmaWxlbmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZSA8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImVudmlyb25tZW50IiBSRVFVSVJFRD0iIj4KLQkJCTxERVNDUklQVElPTj50aGUgcHJlZml4IHRvIHVzZSB3aGVuIHJldHJpZXZpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBUaHVzaWYgeW91IHNwZWNpZnkgZW52aXJvbm1lbnQ9JnF1b3Q7bXllbnYmcXVvdDsgeW91IHdpbGwgYmUgYWJsZSB0byBhY2Nlc3MgT1Mtc3BlY2lmaWMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHZpYSBwcm9wZXJ0eSBuYW1lcyAmcXVvdDtteWVudi5QQVRIJnF1b3Q7IG9yICZxdW90O215ZW52LlRFUk0mcXVvdDsuIE5vdGUgdGhhdCBpZiB5b3Ugc3VwcGx5IGEgcHJvcGVydHkgbmFtZSB3aXRoIGEgZmluYWwgJnF1b3Q7LiZxdW90OyBpdCB3aWxsIG5vdCBiZSBkb3VibGVkLiBpZSBlbnZpcm9ubWVudD0mcXVvdDtteWVudi4mcXVvdDsgd2lsbCBzdGlsbCBhbGxvdyBhY2Nlc3Mgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRocm91Z2ggJnF1b3Q7bXllbnYuUEFUSCZxdW90OyBhbmQgJnF1b3Q7bXllbnYuVEVSTSZxdW90Oy4gVGhpcyBmdW5jdGlvbmFsaXR5IGlzIGN1cnJlbnRseSBvbmx5IGltcGxlbWVudGVkIG9uIHNlbGVjdCBwbGF0Zm9ybXMuIEZlZWwgZnJlZSB0byBzZW5kIHBhdGNoZXMgdG8gaW5jcmVhc2UgdGhlIG51bWJlciBvZiBwbGF0Zm9ybXN0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgc3VwcG9ydGVkIG9uIDspTm90ZSBhbHNvIHRoYXQgcHJvcGVydGllcyBhcmUgY2FzZSBzZW5zaXRpdmUsIGV2ZW4gaWYgdGhlZW52aXJvbm1lbnQgdmFyaWFibGVzIG9uIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSBhcmUgbm90LCBlLmcuIGl0d2lsbCBiZSAke2Vudi5QYXRofSBub3QgJHtlbnYuUEFUSH0gb24gV2luZG93cyAyMDAwPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJjbGFzc3BhdGgiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiBsb29raW5nIHVwIGEgcmVzb3VyY2U8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNsYXNzcGF0aHJlZiIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj50aGUgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvb2tpbmcgdXAgYSByZXNvdXJjZSxnaXZlbiBhcyByZWZlcmVuY2UgdG8gYSAmbHQ7cGF0aCZndDsgZGVmaW5lZGVsc2V3aGVyZS48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InByZWZpeCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5QcmVmaXggdG8gYXBwbHkgdG8gcHJvcGVydGllcyBsb2FkZWQgdXNpbmcgZmlsZW9yIHJlc291cmNlLiBBICZxdW90Oy4mcXVvdDsgaXMgYXBwZW5kZWQgdG8gdGhlIHByZWZpeCBpZiBub3Qgc3BlY2lmaWVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9InJlY29yZGVyIj4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0EgcmVjb3JkZXIgaXMgYSBsaXN0ZW5lciB0byB0aGUgY3VycmVudCBidWlsZCBwcm9jZXNzIHRoYXQgcmVjb3JkcyB0aGUKLW91dHB1dCB0byBhIGZpbGUuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7U2V2ZXJhbCByZWNvcmRlcnMgY2FuIGV4aXN0IGF0IHRoZSBzYW1lIHRpbWUuICBFYWNoIHJlY29yZGVyIGlzCi1hc3NvY2lhdGVkIHdpdGggYSBmaWxlLiAgVGhlIGZpbGVuYW1lIGlzIHVzZWQgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IKLXRoZSByZWNvcmRlcnMuICBUaGUgZmlyc3QgY2FsbCB0byB0aGUgcmVjb3JkZXIgdGFzayB3aXRoIGFuIHVudXNlZCBmaWxlbmFtZQotd2lsbCBjcmVhdGUgYSByZWNvcmRlciAodXNpbmcgdGhlIHBhcmFtZXRlcnMgcHJvdmlkZWQpIGFuZCBhZGQgaXQgdG8gdGhlCi1saXN0ZW5lcnMgb2YgdGhlIGJ1aWxkLiAgQWxsIHN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHJlY29yZGVyIHRhc2sgdXNpbmcKLXRoaXMgZmlsZW5hbWUgd2lsbCBtb2RpZnkgdGhhdCByZWNvcmRlcnMgc3RhdGUgKHJlY29yZGluZyBvciBub3QpIG9yIG90aGVyCi1wcm9wZXJ0aWVzIChsaWtlIGxvZ2dpbmcgbGV2ZWwpLiZsdDsvcCZndDsKLSZsdDtwJmd0O1NvbWUgdGVjaG5pY2FsIGlzc3VlczogdGhlIGZpbGUncyBwcmludCBzdHJlYW0gaXMgZmx1c2hlZCBmb3IgJmFtcDtxdW90O2ZpbmlzaGVkJmFtcDtxdW90OwotZXZlbnRzIChidWlsZEZpbmlzaGVkLCB0YXJnZXRGaW5pc2hlZCBhbmQgdGFza0ZpbmlzaGVkKSwgYW5kIGlzIGNsb3NlZCBvbgotYSBidWlsZEZpbmlzaGVkIGV2ZW50LiZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0ibmFtZSIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhpcyBsb2dnZXIgaXMgYXNzb2NpYXRlZCB3aXRoPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJhY3Rpb24iIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhpcyB0ZWxscyB0aGUgbG9nZ2VyIHdoYXQgdG8gZG86IHNob3VsZCBpdCBzdGFydHJlY29yZGluZyBvciBzdG9wPyAgVGhlIGZpcnN0IHRpbWUgdGhhdCB0aGUgcmVjb3JkZXIgdGFzayBpcyBjYWxsZWQgZm9ydGhpcyBsb2dmaWxlLCBhbmQgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHByb3ZpZGVkLCB0aGVuIHRoZSBkZWZhdWx0Zm9yIHRoaXMgYXR0cmlidXRlIGlzICZxdW90O3N0YXJ0JnF1b3Q7LiAgSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHByb3ZpZGVkIG9uc3Vic2VxdWVudCBjYWxscywgdGhlbiB0aGUgc3RhdGUgcmVtYWlucyBhcyBwcmV2aW91cy5bVmFsdWVzID0ge3N0YXJ0fHN0b3B9LCBEZWZhdWx0ID0gbm8gc3RhdGUgY2hhbmdlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJhcHBlbmQiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U2hvdWxkIHRoZSByZWNvcmRlciBhcHBlbmQgdG8gYSBmaWxlLCBvciBjcmVhdGUgYSBuZXdvbmU/IFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIHRoZSBmaXJzdCB0aW1lIHRoaXMgdGFzayBpcyBjYWxsZWQgZm9ydGhpcyBmaWxlLiAgW1ZhbHVlcyA9IHt5ZXN8bm99LCBEZWZhdWx0PXllczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZW1hY3Ntb2RlIiBSRVFVSVJFRD0ibm8sIGRlZmF1bHQgaXMgZmFsc2UiPgotCQkJPERFU0NSSVBUSU9OPlJlbW92ZXMgW3Rhc2tdIGJhbm5lcnMgbGlrZSBBbnQncy1lbWFjcyBjb21tYW5kIGxpbmUgc3dpdGNoIGlmIHNldCB0b3RydWU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImxvZ2xldmVsIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkF0IHdoYXQgbG9nZ2luZyBsZXZlbCBzaG91bGQgdGhpcyByZWNvcmRlciBpbnN0YW5jZXJlY29yZCB0bz8gIFRoaXMgaXMgbm90IGEgb25jZSBvbmx5IHBhcmFtZXRlciAobGlrZSBhcHBlbmRpcykgLS0geW91IGNhbiBpbmNyZWFzZSBvciBkZWNyZWFzZSB0aGUgbG9nZ2luZyBsZXZlbCBhcyB0aGUgYnVpbGQgcHJvY2Vzc2NvbnRpbnVlcy4gIFtWYWx1ZXM9IHtlcnJvcnx3YXJufGluZm98dmVyYm9zZXxkZWJ1Z30sIERlZmF1bHQgPSBubyBjaGFuZ2VdPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9InJlbmFtZSI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtSZW5hbWVzIGEgZ2l2ZW4gZmlsZS4mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9InNyYyIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+ZmlsZSB0byByZW5hbWU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImRlc3QiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPm5ldyBuYW1lIG9mIHRoZSBmaWxlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJyZXBsYWNlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkVuYWJsZSByZXBsYWNpbmcgb2YgZXhpc3RpbmcgZmlsZSAoZGVmYXVsdDogb24pPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9InJlcGxhY2UiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7UmVwbGFjZSBpcyBhIGRpcmVjdG9yeSBiYXNlZCB0YXNrIGZvciByZXBsYWNpbmcgdGhlIG9jY3VycmVuY2Ugb2YgYSBnaXZlbiBzdHJpbmcgd2l0aCBhbm90aGVyIHN0cmluZyAKLWluIHNlbGVjdGVkIGZpbGUuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7SWYgeW91IHdhbnQgdG8gcmVwbGFjZSBhIHRleHQgdGhhdCBjcm9zc2VzIGxpbmUgYm91bmRhcmllcywgeW91Ci1tdXN0IHVzZSBhIG5lc3RlZCAmbHQ7Y29kZSZndDsmYW1wO2x0O3JlcGxhY2V0b2tlbiZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyBlbGVtZW50LiZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0iZmlsZSIgUkVRVUlSRUQ9ImV4YWN0bHkgb25lIG9mIHRoZSB0d28uIj4KLQkJCTxERVNDUklQVElPTj5maWxlIGZvciB3aGljaCB0aGUgdG9rZW4gc2hvdWxkIGJlIHJlcGxhY2VkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkaXIiIFJFUVVJUkVEPSIiPgotCQkJPERFU0NSSVBUSU9OPlRoZSBiYXNlIGRpcmVjdG9yeSB0byB1c2Ugd2hlbiByZXBsYWNpbmcgYSB0b2tlbiBpbiBtdWx0aXBsZSBmaWxlczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZW5jb2RpbmciIFJFUVVJUkVEPSJubyAtIGRlZmF1bHRzIHRvIGRlZmF1bHQganZtIGVuY29kaW5nIj4KLQkJCTxERVNDUklQVElPTj5UaGUgZW5jb2Rpbmcgb2YgdGhlIGZpbGVzIHVwb24gd2hpY2ggcmVwbGFjZSBvcGVyYXRlczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idG9rZW4iIFJFUVVJUkVEPSJ5ZXMsIHVubGVzcyBhIG5lc3RlZAotICAgICByZXBsYWNldG9rZW4gZWxlbWVudCBvciB0aGUgcmVwbGFjZWZpbHRlcmZpbGUKLSAgICAgYXR0cmlidXRlIGlzIHVzZWQuIj4KLQkJCTxERVNDUklQVElPTj50aGUgdG9rZW4gd2hpY2ggbXVzdCBiZSByZXBsYWNlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idmFsdWUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHRva2VuLiBXaGVuIG9taXR0ZWQsIGFuIGVtcHR5IHN0cmluZygmcXVvdDsmcXVvdDspIGlzIHVzZWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InN1bW1hcnkiIFJFUVVJUkVEPSJubywgYnkgZGVmYXVsdCBubyBzdW1tYXJ5IGlzIHByb2R1Y2VkIj4KLQkJCTxERVNDUklQVElPTj5JbmRpY2F0ZXMgd2hldGhlciBhIHN1bW1hcnkgb2YgdGhlIHJlcGxhY2Ugb3BlcmF0aW9uIHNob3VsZCBiZSBwcm9kdWNlZCwgZGV0YWlsaW5nIGhvdyBtYW55IHRva2VuIG9jY3VycmVuY2VzIGFuZCBmaWxlcyB3ZXJlIHByb2Nlc3NlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0icHJvcGVydHlmaWxlIiBSRVFVSVJFRD0ieWVzIG9ubHkgaWYgcHJvcGVydHkgYXR0cmlidXRlIG9mICZsdDtyZXBsYWNlZmlsdGVyJmd0OyBpcyB1c2VkLiI+Ci0JCQk8REVTQ1JJUFRJT04+dmFsaWQgcHJvcGVydHkgZmlsZSBmcm9tIHdoaWNoIHByb3BlcnRpZXMgc3BlY2lmaWVkIHVzaW5nIG5lc3RlZCAmbHQ7cmVwbGFjZWZpbHRlciZndDsgZWxlbWVudHMgYXJlIGRyYXduPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJyZXBsYWNlZmlsdGVyZmlsZSIgUkVRVUlSRUQ9Im5vLiI+Ci0JCQk8REVTQ1JJUFRJT04+dmFsaWQgcHJvcGVydHkgZmlsZS4gIEVhY2ggcHJvcGVydHkgd2lsbCBiZXRyZWF0ZWQgYXMgYSByZXBsYWNlZmlsdGVyIHdoZXJlIHRva2VuIGlzIHRoZSBuYW1lIG9mdGhlIHByb3BlcnR5IGFuZCB2YWx1ZSBpcyB0aGUgcHJvcGVydGllcyB2YWx1ZS48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmVpbmNsdWRlZC4gQWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzZmlsZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXN0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZWV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImV4Y2x1ZGVzZmlsZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXN0YWtlbiB0byBiZSBhbiBleGNsdWRlIHBhdHRlcjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZGVmYXVsdGV4Y2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90KCZxdW90O3llcyZxdW90Oy8mcXVvdDtubyZxdW90OykuIERlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbiBvbWl0dGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9InJtaWMiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7UnVucyB0aGUgcm1pYyBjb21waWxlciBmb3IgYSBjZXJ0YWluIGNsYXNzLiZsdDsvcCZndDsKLSZsdDtwJmd0O1JtaWMgY2FuIGJlIHJ1biBvbiBhIHNpbmdsZSBjbGFzcyAoYXMgc3BlY2lmaWVkIHdpdGggdGhlIGNsYXNzbmFtZQotYXR0cmlidXRlKSBvciBhIG51bWJlciBvZiBjbGFzc2VzIGF0IG9uY2UgKGFsbCBjbGFzc2VzIGJlbG93IGJhc2UgdGhhdAotYXJlIG5laXRoZXIgX1N0dWIgbm9yIF9Ta2VsIGNsYXNzZXMpLiAgSWYgeW91IHdhbnQgdG8gcm1pYyBhIHNpbmdsZQotY2xhc3MgYW5kIHRoaXMgY2xhc3MgaXMgYSBjbGFzcyBuZXN0ZWQgaW50byBhbm90aGVyIGNsYXNzLCB5b3UgaGF2ZSB0bwotc3BlY2lmeSB0aGUgY2xhc3NuYW1lIGluIHRoZSBmb3JtICZsdDtjb2RlJmd0O091dGVyJCRJbm5lciZsdDsvY29kZSZndDsgaW5zdGVhZCBvZgotJmx0O2NvZGUmZ3Q7T3V0ZXIuSW5uZXImbHQ7L2NvZGUmZ3Q7LiZsdDsvcCZndDsKLSZsdDtwJmd0O0l0IGlzIHBvc3NpYmxlIHRvIHJlZmluZSB0aGUgc2V0IG9mIGZpbGVzIHRoYXQgYXJlIGJlaW5nIHJtaWNlZC4gVGhpcyBjYW4gYmUKLWRvbmUgd2l0aCB0aGUgJmx0O2kmZ3Q7aW5jbHVkZXMmbHQ7L2kmZ3Q7LCAmbHQ7aSZndDtpbmNsdWRlc2ZpbGUmbHQ7L2kmZ3Q7LCAmbHQ7aSZndDtleGNsdWRlcyZsdDsvaSZndDssICZsdDtpJmd0O2V4Y2x1ZGVzZmlsZSZsdDsvaSZndDsgYW5kICZsdDtpJmd0O2RlZmF1bHRleGNsdWRlcyZsdDsvaSZndDsKLWF0dHJpYnV0ZXMuIFdpdGggdGhlICZsdDtpJmd0O2luY2x1ZGVzJmx0Oy9pJmd0OyBvciAmbHQ7aSZndDtpbmNsdWRlc2ZpbGUmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSB5b3Ugc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8KLWhhdmUgaW5jbHVkZWQgYnkgdXNpbmcgcGF0dGVybnMuIFRoZSAmbHQ7aSZndDtleGNsdWRlJmx0Oy9pJmd0OyBvciAmbHQ7aSZndDtleGNsdWRlc2ZpbGUmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHNwZWNpZnkKLXRoZSBmaWxlcyB5b3Ugd2FudCB0byBoYXZlIGV4Y2x1ZGVkLiBUaGlzIGlzIGFsc28gZG9uZSB3aXRoIHBhdHRlcm5zLiBBbmQKLWZpbmFsbHkgd2l0aCB0aGUgJmx0O2kmZ3Q7ZGVmYXVsdGV4Y2x1ZGVzJmx0Oy9pJmd0OyBhdHRyaWJ1dGUsIHlvdSBjYW4gc3BlY2lmeSB3aGV0aGVyIHlvdQotd2FudCB0byB1c2UgZGVmYXVsdCBleGNsdXNpb25zIG9yIG5vdC4gU2VlIHRoZSBzZWN0aW9uIG9uICZsdDthCi1ocmVmPSZxdW90Oy4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyZxdW90OyZndDtkaXJlY3RvcnkgYmFzZWQgdGFza3MmbHQ7L2EmZ3Q7LCBvbiBob3cgdGhlCi1pbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvIHdyaXRlIHBhdHRlcm5zLiZsdDsvcCZndDsKLSZsdDtwJmd0O1RoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCAmbHQ7YSBocmVmPSZxdW90Oy4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwmcXVvdDsmZ3Q7RmlsZVNldCZsdDsvYSZndDsgYW5kCi1zdXBwb3J0cyBhbGwgYXR0cmlidXRlcyBvZiAmbHQ7Y29kZSZndDsmYW1wO2x0O2ZpbGVzZXQmYW1wO2d0OyZsdDsvY29kZSZndDsKLSgmbHQ7Y29kZSZndDtkaXImbHQ7L2NvZGUmZ3Q7IGJlY29tZXMgJmx0O2NvZGUmZ3Q7YmFzZSZsdDsvY29kZSZndDspIGFzIHdlbGwgYXMgdGhlIG5lc3RlZAotJmx0O2NvZGUmZ3Q7JmFtcDtsdDtpbmNsdWRlJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDsmYW1wO2x0O2V4Y2x1ZGUmYW1wO2d0OyZsdDsvY29kZSZndDsgYW5kCi0mbHQ7Y29kZSZndDsmYW1wO2x0O3BhdHRlcm5zZXQmYW1wO2d0OyZsdDsvY29kZSZndDsgZWxlbWVudHMuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7SXQgaXMgcG9zc2libGUgdG8gdXNlIGRpZmZlcmVudCBjb21waWxlcnMuIFRoaXMgY2FuIGJlIHNlbGVjdGVkCi13aXRoIHRoZSAmYW1wO3F1b3Q7YnVpbGQucm1pYyZhbXA7cXVvdDsgcHJvcGVydHkgb3IgdGhlICZsdDtjb2RlJmd0O2NvbXBpbGVyJmx0Oy9jb2RlJmd0OwotYXR0cmlidXRlLiAmbHQ7YSBuYW1lPSZxdW90O2NvbXBpbGVydmFsdWVzJnF1b3Q7Jmd0O1RoZXJlIGFyZSB0aHJlZSBjaG9pY2VzJmx0Oy9hJmd0OzombHQ7L3AmZ3Q7Ci0mbHQ7dWwmZ3Q7Ci0mbHQ7bGkmZ3Q7c3VuICh0aGUgc3RhbmRhcmQgY29tcGlsZXIgb2YgdGhlIEpESykmbHQ7L2xpJmd0OwotJmx0O2xpJmd0O2thZmZlICh0aGUgc3RhbmRhcmQgY29tcGlsZXIgb2YgJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmthZmZlLm9yZyZxdW90OyB0YXJnZXQ9JnF1b3Q7X3RvcCZxdW90OyZndDtLYWZmZSZsdDsvYSZndDspJmx0Oy9saSZndDsKLSZsdDtsaSZndDt3ZWJsb2dpYyZsdDsvbGkmZ3Q7Ci0mbHQ7L3VsJmd0OwotJmx0O3AmZ3Q7VGhlICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL2Rpb25lLnpjdS5jei9+dG9tYW40MC9taW5pUk1JLyZxdW90OyZndDttaW5pUk1JJmx0Oy9hJmd0OwotcHJvamVjdCBjb250YWlucyBhIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHRhc2sgYXMgd2VsbCwKLXBsZWFzZSBjb25zdWx0IG1pbmlSTUkncyBkb2N1bWVudGF0aW9uIHRvIGxlYXJuIGhvdyB0byB1c2UgaXQuJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJiYXNlIiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj50aGUgbG9jYXRpb24gdG8gc3RvcmUgdGhlIGNvbXBpbGVkIGZpbGVzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJjbGFzc25hbWUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGNsYXNzIGZvciB3aGljaCB0byBydW4gcm1pYzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZmlsdGVyaW5nIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmluZGljYXRlcyB3aGV0aGVyIHRva2VuIGZpbHRlcmluZyBzaG91bGQgdGFrZSBwbGFjPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzb3VyY2ViYXNlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlBhc3MgdGhlICZxdW90Oy1rZWVwZ2VuZXJhdGVkJnF1b3Q7IGZsYWcgdG8gcm1pYyBhbmRtb3ZlIHRoZSBnZW5lcmF0ZWQgc291cmNlIGZpbGUgdG8gdGhlIGJhc2UgZGlyZWN0b3J5PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzdHVidmVyc2lvbiIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TcGVjaWZ5IHRoZSBKREsgdmVyc2lvbiBmb3IgdGhlIGdlbmVyYXRlZCBzdHViIGNvZGUuU3BlY2lmeSAmcXVvdDsxLjEmcXVvdDsgdG8gcGFzcyB0aGUgJnF1b3Q7LXYxLjEmcXVvdDsgb3B0aW9uIHRvIHJtaWM8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNsYXNzcGF0aCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5UaGUgY2xhc3NwYXRoIHRvIHVzZSBkdXJpbmcgY29tcGlsYXRpbzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY2xhc3NwYXRocmVmIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlRoZSBjbGFzc3BhdGggdG8gdXNlIGR1cmluZyBjb21waWxhdGlvbiwgZ2l2ZW4gYXMgcmVmZXJlbmNlIHRvIGEgUEFUSCBkZWZpbmVkIGVsc2V3aGVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJpbmNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlaW5jbHVkZWQuIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJpbmNsdWRlc2ZpbGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXI8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImV4Y2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmVleGNsdWRlZC4gTm8gZmlsZXMgKGV4Y2VwdCBkZWZhdWx0IGV4Y2x1ZGVzKSBhcmUgZXhjbHVkZWQgd2hlbiBvbWl0dGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJleGNsdWRlc2ZpbGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXI8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImRlZmF1bHRleGNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkIG9yIG5vdCgmcXVvdDt5ZXMmcXVvdDsvJnF1b3Q7bm8mcXVvdDspLiBEZWZhdWx0IGV4Y2x1ZGVzIGFyZSB1c2VkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idmVyaWZ5IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmNoZWNrIHRoYXQgY2xhc3NlcyBpbXBsZW1lbnQgUmVtb3RlIGJlZm9yZSBoYW5kaW5nIHRoZW0gdG8gcm1pYyAoZGVmYXVsdCBpcyBmYWxzZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaWlvcCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5pbmRpY2F0ZXMgdGhhdCBwb3J0YWJsZSAoUk1JL0lJT1ApIHN0dWJzIHNob3VsZCBiZSBnZW5lcmF0ZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaWlvcG9wdHMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+YWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIElJT1AgY2xhc3MgZ2VuZXJhdGlvPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJpZGwiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+aW5kaWNhdGVzIHRoYXQgSURMIG91dHB1dCBmaWxlcyBzaG91bGQgYmUgZ2VuZXJhdGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImlkbG9wdHMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+YWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIElETCBmaWxlIGdlbmVyYXRpbzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZGVidWciIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+Z2VuZXJhdGUgZGVidWcgaW5mbyAocGFzc2VzIC1nIHRvIHJtaWMpLiBEZWZhdWx0cyB0byBmYWxzZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZWFudHJ1bnRpbWUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+d2hldGhlciB0byBpbmNsdWRlIHRoZSBBbnQgcnVuLXRpbWUgbGlicmFyaWVzO2RlZmF1bHRzIHRvIHllczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZWphdmFydW50aW1lIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPndoZXRoZXIgdG8gaW5jbHVkZSB0aGUgZGVmYXVsdCBydW4tdGltZWxpYnJhcmllcyBmcm9tIHRoZSBleGVjdXRpbmcgVk07IGRlZmF1bHRzIHRvIG5vPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJleHRkaXJzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmxvY2F0aW9uIG9mIGluc3RhbGxlZCBleHRlbnNpb25zPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJjb21waWxlciIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5UaGUgY29tcGlsZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlLklmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBzZXQsIHRoZSB2YWx1ZSBvZiB0aGVidWlsZC5ybWljIHByb3BlcnR5LCBpZiBzZXQsIHdpbGwgYmUgdXNlZC5PdGhlcndpc2UsIHRoZSBkZWZhdWx0IGNvbXBpbGVyIGZvciB0aGUgY3VycmVudCBWTSB3aWxsIGJlIHVzZWQuKFNlZSB0aGUgYWJvdmUgbGlzdCBvZiB2YWxpZGNvbXBpbGVycy48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0ic2VxdWVudGlhbCI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtTZXF1ZW50aWFsIGlzIGEgY29udGFpbmVyIHRhc2sgLSBpdCBjYW4gY29udGFpbiBvdGhlciBBbnQgdGFza3MuIFRoZSBuZXN0ZWQgCi10YXNrcyBhcmUgc2ltcGx5IGV4ZWN1dGVkIGluIHNlcXVlbmNlLiBTZXF1ZW50aWFsJ3MgcHJpbWFyeSB1c2UgaXMgdG8gc3VwcG9ydCAKLXRoZSBzZXF1ZW50aWFsIGV4ZWN1dGlvbiBvZiBhIHN1YnNldCBvZiB0YXNrcyB3aXRoaW4gdGhlIAotJmx0O2EgaHJlZj0mcXVvdDtwYXJhbGxlbC5odG1sJnF1b3Q7Jmd0O3BhcmFsbGVsJmx0Oy9hJmd0OyB0YXNrJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7VGhlIHNlcXVlbnRpYWwgdGFzayBoYXMgbm8gYXR0cmlidXRlcyBhbmQgZG9lcyBub3Qgc3VwcG9ydCBhbnkgbmVzdGVkIAotZWxlbWVudHMgYXBhcnQgZnJvbSBBbnQgdGFza3MuIEFueSB2YWxpZCBBbnQgdGFzayBtYXkgYmUgZW1iZWRkZWQgd2l0aGluIHRoZSAKLXNlcXVlbnRpYWwgdGFzay4mbHQ7L3AmZ3Q7Ci0mbHQ7aDMmZ3Q7RXhhbXBsZSZsdDsvaDMmZ3Q7Ci0mbHQ7cHJlJmd0OwotJmFtcDtsdDtwYXJhbGxlbCZhbXA7Z3Q7Ci0mYW1wO2x0O3dscnVuIC4uLiAmYW1wO2d0OwotJmFtcDtsdDtzZXF1ZW50aWFsJmFtcDtndDsKLSZhbXA7bHQ7c2xlZXAgc2Vjb25kcz0mYW1wO3F1b3Q7MzAmYW1wO3F1b3Q7LyZhbXA7Z3Q7Ci0mYW1wO2x0O2p1bml0IC4uLiAmYW1wO2d0OwotJmFtcDtsdDt3bHN0b3AvJmFtcDtndDsKLSZhbXA7bHQ7L3NlcXVlbnRpYWwmYW1wO2d0OwotJmFtcDtsdDsvcGFyYWxsZWwmYW1wO2d0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7cCZndDtUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRoZSBzZXF1ZW50aWFsIHRhc2sgaXMgdXNlZCB0byBleGVjdXRlIHRocmVlIHRhc2tzIGluCi1zZXF1ZW5jZSwgd2hpbGUgYW5vdGhlciB0YXNrIGlzIGJlaW5nIGV4ZWN1dGVkIGluIGEgc2VwYXJhdGUgdGhyZWFkLiAmbHQ7L3AmZ3Q7Ci0mbHQ7aHImZ3Q7Ci0mbHQ7cCBhbGlnbj0mcXVvdDtjZW50ZXImcXVvdDsmZ3Q7Q29weXJpZ2h0ICZhbXA7Y29weTsgMjAwMS0yMDAyIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzCi1SZXNlcnZlZC4mbHQ7L3AmZ3Q7Ci0mbHQ7L2JvZHkmZ3Q7Ci0mbHQ7L2h0bWwmZ3Q7Ci08L0RFU0NSSVBUSU9OPgk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0ic2lnbmphciI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtTaWducyBqYXIgb3IgemlwIGZpbGVzIHdpdGggdGhlIGphdmFzaWduIGNvbW1hbmQgbGluZSB0b29sLiBUaGUKLXRvb2wgZGV0YWlsZWQgZGVwZW5kZW5jeSBjaGVja2luZzogZmlsZXMgYXJlIG9ubHkgc2lnbmVkIGlmIHRoZXkKLWFyZSBub3Qgc2lnbmVkLiBUaGUgJmx0O3R0Jmd0O3NpZ25qYXImbHQ7L3R0Jmd0OyBhdHRyaWJ1dGUgY2FuIHBvaW50IHRvIHRoZSBmaWxlIHRvCi1nZW5lcmF0ZTsgaWYgdGhpcyBmaWxlIGV4aXN0cyB0aGVuCi1pdHMgbW9kaWZpY2F0aW9uIGRhdGUgaXMgdXNlZCBhcyBhIGN1ZSBhcyB0byB3aGV0aGVyIHRvIHJlc2lnbiBhbnkgSkFSIGZpbGUuCi0mbHQ7YnImZ3Q7ICAKLSZsdDtzdHJvbmcmZ3Q7Tm90ZTombHQ7L3N0cm9uZyZndDsgUmVxdWlyZXMgSmF2YSAxLjIgb3IgbGF0ZXIuICZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0iamFyIiBSRVFVSVJFRD0ieWVzLiI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGphciBmaWxlIHRvIHNpZzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iYWxpYXMiIFJFUVVJUkVEPSJ5ZXMuIj4KLQkJCTxERVNDUklQVElPTj50aGUgYWxpYXMgdG8gc2lnbiB1bmRlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzdG9yZXBhc3MiIFJFUVVJUkVEPSJ5ZXMuIj4KLQkJCTxERVNDUklQVElPTj5wYXNzd29yZCBmb3Iga2V5c3RvcmUgaW50ZWdyaXR5PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJrZXlzdG9yZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5rZXlzdG9yZSBsb2NhdGlvPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzdG9yZXR5cGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+a2V5c3RvcmUgdHlwPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJrZXlwYXNzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnBhc3N3b3JkIGZvciBwcml2YXRlIGtleSAoaWYgZGlmZmVyZW50PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzaWdmaWxlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPm5hbWUgb2YgLlNGLy5EU0EgZmlsPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzaWduZWRqYXIiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+bmFtZSBvZiBzaWduZWQgSkFSIGZpbDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idmVyYm9zZSIgUkVRVUlSRUQ9Im5vOyBkZWZhdWx0IGZhbHNlIj4KLQkJCTxERVNDUklQVElPTj4odHJ1ZSB8IGZhbHNlKSB2ZXJib3NlIG91dHB1dCB3aGVuIHNpZ25pbjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW50ZXJuYWxzZiIgUkVRVUlSRUQ9Im5vOyBkZWZhdWx0IGZhbHNlIj4KLQkJCTxERVNDUklQVElPTj4odHJ1ZSB8IGZhbHNlKSBpbmNsdWRlIHRoZSAuU0YgZmlsZSBpbnNpZGUgdGhlIHNpZ25hdHVyZWJsb2M8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InNlY3Rpb25zb25seSIgUkVRVUlSRUQ9Im5vOyBkZWZhdWx0IGZhbHNlIj4KLQkJCTxERVNDUklQVElPTj4odHJ1ZSB8IGZhbHNlKSBkb24ndCBjb21wdXRlIGhhc2ggb2YgZW50aXJlIG1hbmlmZXM8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImxhenkiIFJFUVVJUkVEPSJubzsgZGVmYXVsdCBmYWxzZSI+Ci0JCQk8REVTQ1JJUFRJT04+ZmxhZyB0byBjb250cm9sIHdoZXRoZXIgdGhlIHByZXNlbmNlIG9mIGEgc2lnbmF0dXJlZmlsZSBtZWFucyBhIEpBUiBpcyBzaWduZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJzbGVlcCI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDsgQSB0YXNrIGZvciBzbGVlcGluZyBhIHNob3J0IHBlcmlvZCBvZiB0aW1lLCB1c2VmdWwgd2hlbiBhIGJ1aWxkIG9yIGRlcGxveW1lbnQgCi1wcm9jZXNzIHJlcXVpcmVzIGFuIGludGVydmFsIGJldHdlZW4gdGFza3MuJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJob3VycyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5ob3VycyB0byB0byBhZGQgdG8gdGhlIHNsZWVwIHRpbTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibWludXRlcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5taW51dGVzIHRvIGFkZCB0byB0aGUgc2xlZXAgdGltPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzZWNvbmRzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnNlY29uZHMgdG8gYWRkIHRvIHRoZSBzbGVlcCB0aW08L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im1pbGxpc2Vjb25kcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5taWxsaXNlY29uZHMgdG8gYWRkIHRvIHRoZSBzbGVlcCB0aW08L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZhaWxvbmVycm9yIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmZsYWcgY29udHJvbGxpbmcgd2hldGhlciB0byBicmVhayB0aGUgYnVpbGQgb24gYW4gZXJyb3IuIDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJzcWwiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7RXhlY3V0ZXMgYSBzZXJpZXMgb2YgU1FMIHN0YXRlbWVudHMgdmlhIEpEQkMgdG8gYSBkYXRhYmFzZS4gU3RhdGVtZW50cyBjYW4gCi1laXRoZXIgYmUgcmVhZCBpbiBmcm9tIGEgdGV4dCBmaWxlIHVzaW5nIHRoZSAmbHQ7aSZndDtzcmMmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSBvciBmcm9tIAotYmV0d2VlbiB0aGUgZW5jbG9zaW5nIFNRTCB0YWdzLiZsdDsvcCZndDsKLSZsdDtwJmd0O011bHRpcGxlIHN0YXRlbWVudHMgY2FuIGJlIHByb3ZpZGVkLCBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucyAob3IgdGhlIAotZGVmaW5lZCAmbHQ7aSZndDtkZWxpbWl0ZXImbHQ7L2kmZ3Q7KS4gSW5kaXZpZHVhbCBsaW5lcyB3aXRoaW4gdGhlIHN0YXRlbWVudHMgY2FuIGJlIAotY29tbWVudGVkIHVzaW5nIGVpdGhlciAtLSwgLy8gb3IgUkVNIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZS4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtUaGUgJmx0O2kmZ3Q7YXV0b2NvbW1pdCZsdDsvaSZndDsgYXR0cmlidXRlIHNwZWNpZmllcyB3aGV0aGVyIGF1dG8tY29tbWl0IHNob3VsZCBiZSAKLXR1cm5lZCBvbiBvciBvZmYgd2hpbHN0IGV4ZWN1dGluZyB0aGUgc3RhdGVtZW50cy4gSWYgYXV0by1jb21taXQgaXMgdHVybmVkIAotb24gZWFjaCBzdGF0ZW1lbnQgd2lsbCBiZSBleGVjdXRlZCBhbmQgY29tbWl0dGVkLiBJZiBpdCBpcyB0dXJuZWQgb2ZmIHRoZSAKLXN0YXRlbWVudHMgd2lsbCBhbGwgYmUgZXhlY3V0ZWQgYXMgb25lIHRyYW5zYWN0aW9uLiZsdDsvcCZndDsKLSZsdDtwJmd0O1RoZSAmbHQ7aSZndDtvbmVycm9yJmx0Oy9pJmd0OyBhdHRyaWJ1dGUgc3BlY2lmaWVzIGhvdyB0byBwcm9jZWVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzIAotZHVyaW5nIHRoZSBleGVjdXRpb24gb2Ygb25lIG9mIHRoZSBzdGF0ZW1lbnRzLiAKLVRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOiAmbHQ7YiZndDtjb250aW51ZSZsdDsvYiZndDsgZXhlY3V0aW9uLCBvbmx5IHNob3cgdGhlIGVycm9yOwotJmx0O2ImZ3Q7c3RvcCZsdDsvYiZndDsgZXhlY3V0aW9uIGFuZCBjb21taXQgdHJhbnNhY3Rpb247Ci1hbmQgJmx0O2ImZ3Q7YWJvcnQmbHQ7L2ImZ3Q7IGV4ZWN1dGlvbiBhbmQgdHJhbnNhY3Rpb24gYW5kIGZhaWwgdGFzay4mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9ImRyaXZlciIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+Q2xhc3MgbmFtZSBvZiB0aGUgamRiYyBkcml2ZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idXJsIiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj5EYXRhYmFzZSBjb25uZWN0aW9uIHVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ1c2VyaWQiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPkRhdGFiYXNlIHVzZXIgbmFtPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJwYXNzd29yZCIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+RGF0YWJhc2UgcGFzc3dvcjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ic3JjIiBSRVFVSVJFRD0ieWVzLCB1bmxlc3Mgc3RhdGVtZW50cyBlbmNsb3NlZCB3aXRoaW4gdGFncyI+Ci0JCQk8REVTQ1JJUFRJT04+RmlsZSBjb250YWluaW5nIFNRTCBzdGF0ZW1lbnQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImVuY29kaW5nIiBSRVFVSVJFRD0ibm8gLSBkZWZhdWx0cyB0byBkZWZhdWx0IGp2bSBlbmNvZGluZyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGVuY29kaW5nIG9mIHRoZSBmaWxlcyBjb250YWluaW5nIFNRTCBzdGF0ZW1lbnQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImRlbGltaXRlciIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0ICZxdW90OzsmcXVvdDsiPgotCQkJPERFU0NSSVBUSU9OPlN0cmluZyB0aGF0IHNlcGFyYXRlcyBTUUwgc3RhdGVtZW50PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJhdXRvY29tbWl0IiBSRVFVSVJFRD0ibm8sIGRlZmF1bHQgJnF1b3Q7ZmFsc2UmcXVvdDsiPgotCQkJPERFU0NSSVBUSU9OPkF1dG8gY29tbWl0IGZsYWcgZm9yIGRhdGFiYXNlIGNvbm5lY3Rpb24gKGRlZmF1bHQgZmFsc2U8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InByaW50IiBSRVFVSVJFRD0ibm8sIGRlZmF1bHQgJnF1b3Q7ZmFsc2UmcXVvdDsiPgotCQkJPERFU0NSSVBUSU9OPlByaW50IHJlc3VsdCBzZXRzIGZyb20gdGhlIHN0YXRlbWVudHMgKGRlZmF1bHQgZmFsc2U8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InNob3doZWFkZXJzIiBSRVFVSVJFRD0ibm8sIGRlZmF1bHQgJnF1b3Q7dHJ1ZSZxdW90OyI+Ci0JCQk8REVTQ1JJUFRJT04+UHJpbnQgaGVhZGVycyBmb3IgcmVzdWx0IHNldHMgZnJvbSB0aGUgc3RhdGVtZW50cyAoZGVmYXVsdCB0cnVlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJvdXRwdXQiIFJFUVVJUkVEPSJubyAocHJpbnQgdG8gc3lzdGVtLm91dCBieSBkZWZhdWx0KSI+Ci0JCQk8REVTQ1JJUFRJT04+T3V0cHV0IGZpbGUgZm9yIHJlc3VsdCBzZXRzIChkZWZhdWx0cyB0byBTeXN0ZW0ub3V0PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJhcHBlbmQiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+d2hldGhlciBvdXRwdXQgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIG9yIG92ZXJ3cml0ZWFuIGV4aXN0aW5nIGZpbGUuICBEZWZhdWx0cyB0byBmYWxzZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY2xhc3NwYXRoIiBSRVFVSVJFRD0ibm8gKHVzZSBzeXN0ZW0gY2xhc3NwYXRoKSI+Ci0JCQk8REVTQ1JJUFRJT04+Q2xhc3NwYXRoIHVzZWQgdG8gbG9hZCBkcml2ZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY2xhc3NwYXRocmVmIiBSRVFVSVJFRD0ibm8gKHVzZSBzeXN0ZW0gY2xhc3NwYXRoKSI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGNsYXNzcGF0aCB0byB1c2UsIGdpdmVuIGFzIGEgcmVmZXJlbmNlIHRvIGEgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ib25lcnJvciIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0ICZxdW90O2Fib3J0JnF1b3Q7Ij4KLQkJCTxERVNDUklQVElPTj5BY3Rpb24gdG8gcGVyZm9ybSB3aGVuIHN0YXRlbWVudCBmYWlsczogY29udGludWUsIHN0b3AsIGFib3I8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InJkYm1zIiBSRVFVSVJFRD0ibm8gKG5vIHJlc3RyaWN0aW9uKSI+Ci0JCQk8REVTQ1JJUFRJT04+RXhlY3V0ZSB0YXNrIG9ubHkgaWYgdGhpcyByZGJtPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ2ZXJzaW9uIiBSRVFVSVJFRD0ibm8gKG5vIHJlc3RyaWN0aW9uKSI+Ci0JCQk8REVTQ1JJUFRJT04+RXhlY3V0ZSB0YXNrIG9ubHkgaWYgcmRibXMgdmVyc2lvbiBtYXRjPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJjYWNoaW5nIiBSRVFVSVJFRD0ibm8gKGRlZmF1bHQ9dHJ1ZSkiPgotCQkJPERFU0NSSVBUSU9OPlNob3VsZCB0aGUgdGFzayBjYWNoZSBsb2FkZXJzIGFuZCB0aGUgZHJpdmVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9InRhciI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtDcmVhdGVzIGEgdGFyIGFyY2hpdmUuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7VGhlICZsdDtpJmd0O2Jhc2VkaXImbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSBpcyB0aGUgcmVmZXJlbmNlIGRpcmVjdG9yeSBmcm9tIHdoZXJlIHRvIHRhci4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtUaGlzIHRhc2sgaXMgYSAmbHQ7YSBocmVmPSZxdW90Oy4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyZxdW90OyZndDtkaXJlY3RvcnkgYmFzZWQgdGFzayZsdDsvYSZndDsKLWFuZCwgYXMgc3VjaCwgZm9ybXMgYW4gaW1wbGljaXQgJmx0O2EgaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sJnF1b3Q7Jmd0O0ZpbGVzZXQmbHQ7L2EmZ3Q7LiBUaGlzCi1kZWZpbmVzIHdoaWNoIGZpbGVzLCByZWxhdGl2ZSB0byB0aGUgJmx0O2kmZ3Q7YmFzZWRpciZsdDsvaSZndDssIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlCi1hcmNoaXZlLiBUaGUgdGFyIHRhc2sgc3VwcG9ydHMgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIEZpbGVzZXQgdG8gcmVmaW5lIHRoZQotc2V0IG9mIGZpbGVzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBpbXBsaWNpdCBmaWxlc2V0LiZsdDsvcCZndDsKLSZsdDtwJmd0O0luIGFkZGl0aW9uIHRvIHRoZSBpbXBsaWNpdCBmaWxlc2V0LCB0aGUgdGFyIHRhc2sgc3VwcG9ydHMgbmVzdGVkIGZpbGVzZXRzLiBUaGVzZQotZmlsZXNldHMgYXJlIGV4dGVuZGVkIHRvIGFsbG93IGNvbnRyb2wgb3ZlciB0aGUgYWNjZXNzIG1vZGUsIHVzZXJuYW1lIGFuZCBncm91cG5hbWUKLXRvIGJlIGFwcGxpZWQgdG8gdGhlIHRhciBlbnRyaWVzLiBUaGlzIGlzIHVzZWZ1bCwgZm9yIGV4YW1wbGUsIHdoZW4gcHJlcGFyaW5nIGFyY2hpdmVzIGZvcgotVW5peCBzeXN0ZW1zIHdoZXJlIHNvbWUgZmlsZXMgbmVlZCB0byBoYXZlIGV4ZWN1dGUgcGVybWlzc2lvbi4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtFYXJseSB2ZXJzaW9ucyBvZiB0YXIgZGlkIG5vdCBzdXBwb3J0IHBhdGggbGVuZ3RocyBncmVhdGVyIHRoYW4gMTAwCi1jaGFyYWN0ZXJzLiBNb2Rlcm4gdmVyc2lvbnMgb2YgdGFyIGRvIHNvLCBidXQgaW4gaW5jb21wYXRpYmxlIHdheXMuCi1UaGUgYmVoYXZpb3VyIG9mIHRoZSB0YXIgdGFzayB3aGVuIGl0IGVuY291bnRlcnMgc3VjaCBwYXRocyBpcwotY29udHJvbGxlZCBieSB0aGUgJmx0O2kmZ3Q7bG9uZ2ZpbGUmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZS4KLUlmIHRoZSBsb25nZmlsZSBhdHRyaWJ1dGUgaXMgc2V0IHRvICZsdDtjb2RlJmd0O2ZhaWwmbHQ7L2NvZGUmZ3Q7LCBhbnkgbG9uZyBwYXRocyB3aWxsCi1jYXVzZSB0aGUgdGFyIHRhc2sgdG8gZmFpbC4gIElmIHRoZSBsb25nZmlsZSBhdHRyaWJ1dGUgaXMgc2V0IHRvCi0mbHQ7Y29kZSZndDt0cnVuY2F0ZSZsdDsvY29kZSZndDssIGFueSBsb25nIHBhdGhzIHdpbGwgYmUgdHJ1bmNhdGVkIHRvIHRoZSAxMDAgY2hhcmFjdGVyCi1tYXhpbXVtIGxlbmd0aCBwcmlvciB0byBhZGRpbmcgdG8gdGhlIGFyY2hpdmUuIElmIHRoZSB2YWx1ZSBvZiB0aGUgbG9uZ2ZpbGUKLWF0dHJpYnV0ZSBpcyBzZXQgdG8gJmx0O2NvZGUmZ3Q7b21pdCZsdDsvY29kZSZndDsgdGhlbiBmaWxlcyBjb250YWluaW5nIGxvbmcgcGF0aHMgd2lsbCBiZQotb21pdHRlZCBmcm9tIHRoZSBhcmNoaXZlLiAgRWl0aGVyIG9wdGlvbiBlbnN1cmVzIHRoYXQgdGhlIGFyY2hpdmUgY2FuIGJlCi11bnRhcnJlZCBieSBhbnkgY29tcGxpYW50IHZlcnNpb24gb2YgdGFyLiBJZiB0aGUgbG9zcyBvZiBwYXRoIG9yIGZpbGUKLWluZm9ybWF0aW9uIGlzIG5vdCBhY2NlcHRhYmxlLCBhbmQgaXQgcmFyZWx5IGlzLCBsb25nZmlsZSBtYXkgYmUgc2V0IHRvIHRoZQotdmFsdWUgJmx0O2NvZGUmZ3Q7Z251Jmx0Oy9jb2RlJmd0Oy4gVGhlIHRhciB0YXNrIHdpbGwgdGhlbiBwcm9kdWNlIGEgR05VIHRhciBmaWxlIHdoaWNoCi1jYW4gaGF2ZSBhcmJpdHJhcnkgbGVuZ3RoIHBhdGhzLiBOb3RlIGhvd2V2ZXIsIHRoYXQgdGhlIHJlc3VsdGluZyBhcmNoaXZlIHdpbGwKLW9ubHkgYmUgYWJsZSB0byBiZSB1bnRhcnJlZCB3aXRoIEdOVSB0YXIuICBUaGUgZGVmYXVsdCBmb3IgdGhlIGxvbmdmaWxlCi1hdHRyaWJ1dGUgaXMgJmx0O2NvZGUmZ3Q7d2FybiZsdDsvY29kZSZndDsgd2hpY2ggYmVoYXZlcyBqdXN0IGxpa2UgdGhlIGdudSBvcHRpb24gZXhjZXB0Ci10aGF0IGl0IHByb2R1Y2VzIGEgd2FybmluZyBmb3IgZWFjaCBmaWxlIHBhdGggZW5jb3VudGVyZWQgdGhhdCBkb2VzIG5vdCBtYXRjaAotdGhlIGxpbWl0LiZsdDsvcCZndDsKLSZsdDtwJmd0O1RoaXMgdGFzayBjYW4gcGVyZm9ybSBjb21wcmVzc2lvbiBieSBzZXR0aW5nIHRoZSBjb21wcmVzc2lvbiBhdHRyaWJ1dGUgdG8gJnF1b3Q7Z3ppcCZxdW90Owotb3IgJnF1b3Q7YnppcDImcXVvdDsuJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJkZXN0ZmlsZSIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIHRhci1maWxlIHRvIGNyZWF0ZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iYmFzZWRpciIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj50aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggdG8gdGFyIHRoZSBmaWxlczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibG9uZ2ZpbGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+RGV0ZXJtaW5lcyBob3cgbG9uZyBmaWxlcyAoJmd0OzEwMCBjaGFycykgYXJlIHRvIGJlaGFuZGxlZC4gIEFsbG93YWJsZSB2YWx1ZXMgYXJlICZxdW90O3RydW5jYXRlJnF1b3Q7LCAmcXVvdDtmYWlsJnF1b3Q7LCZxdW90O3dhcm4mcXVvdDssICZxdW90O29taXQmcXVvdDsgYW5kICZxdW90O2dudSZxdW90Oy4gIERlZmF1bHQgaXMmcXVvdDt3YXJuJnF1b3Q7PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJpbmNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlaW5jbHVkZWQuIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJpbmNsdWRlc2ZpbGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXI8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImV4Y2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmVleGNsdWRlZC4gTm8gZmlsZXMgKGV4Y2VwdCBkZWZhdWx0IGV4Y2x1ZGVzKSBhcmUgZXhjbHVkZWQgd2hlbiBvbWl0dGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJleGNsdWRlc2ZpbGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXI8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImRlZmF1bHRleGNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkIG9yIG5vdCgmcXVvdDt5ZXMmcXVvdDsvJnF1b3Q7bm8mcXVvdDspLiBEZWZhdWx0IGV4Y2x1ZGVzIGFyZSB1c2VkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY29tcHJlc3Npb24iIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+Y29tcHJlc3Npb24gbWV0aG9kLiAgQWxsb3dhYmxlIHZhbHVlcyBhcmUgJnF1b3Q7bm9uZSZxdW90OywgJnF1b3Q7Z3ppcCZxdW90OyBhbmQgJnF1b3Q7YnppcDImcXVvdDsuICBEZWZhdWx0IGlzJnF1b3Q7bm9uZSZxdW90OzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJ0YXNrZGVmIj4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0FkZHMgYSB0YXNrIGRlZmluaXRpb24gdG8gdGhlIGN1cnJlbnQgcHJvamVjdCwgc3VjaCB0aGF0IHRoaXMgbmV3IHRhc2sgY2FuIGJlCi11c2VkIGluIHRoZSBjdXJyZW50IHByb2plY3QuIFR3byBhdHRyaWJ1dGVzIGFyZSBuZWVkZWQsIHRoZSBuYW1lIHRoYXQgaWRlbnRpZmllcwotdGhpcyB0YXNrIHVuaXF1ZWx5LCBhbmQgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgY2xhc3MgKGluY2x1ZGluZyB0aGUgcGFja2FnZXMpIHRoYXQKLWltcGxlbWVudHMgdGhpcyB0YXNrLiZsdDsvcCZndDsKLSZsdDtwJmd0O1lvdSBjYW4gYWxzbyBkZWZpbmUgYSBncm91cCBvZiB0YXNrcyBhdCBvbmNlIHVzaW5nIHRoZSBmaWxlIG9yCi1yZXNvdXJjZSBhdHRyaWJ1dGVzLiAgVGhlc2UgYXR0cmlidXRlcyBwb2ludCB0byBmaWxlcyBpbiB0aGUgZm9ybWF0IG9mCi1KYXZhIHByb3BlcnR5IGZpbGVzLiAgRWFjaCBsaW5lIGRlZmluZXMgYSBzaW5nbGUgdGFzayBpbiB0aGUKLWZvcm1hdDombHQ7L3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotdGFza25hbWU9ZnVsbHkucXVhbGlmaWVkLmphdmEuY2xhc3NuYW1lCi0mbHQ7L3ByZSZndDsKLSZsdDtwJmd0O1Rhc2tkZWYgc2hvdWxkIGJlIHVzZWQgdG8gYWRkIHlvdXIgb3duIHRhc2tzIHRvIHRoZSBzeXN0ZW0uIFNlZSBhbHNvICZhbXA7cXVvdDsmbHQ7YQotaHJlZj0mcXVvdDsuLi9kZXZlbG9wLmh0bWwjd3JpdGluZ293bnRhc2smcXVvdDsmZ3Q7V3JpdGluZyB5b3VyIG93biB0YXNrJmx0Oy9hJmd0OyZhbXA7cXVvdDsuJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJuYW1lIiBSRVFVSVJFRD0ieWVzLCB1bmxlc3MgZmlsZSBvciByZXNvdXJjZSBoYXZlCi0gICAgIGJlZW4gc3BlY2lmaWVkLiI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIG5hbWUgb2YgdGhlIHRhczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY2xhc3NuYW1lIiBSRVFVSVJFRD0ieWVzLCB1bmxlc3MgZmlsZSBvciByZXNvdXJjZSBoYXZlCi0gICAgIGJlZW4gc3BlY2lmaWVkLiI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGZ1bGwgY2xhc3MgbmFtZSBpbXBsZW1lbnRpbmcgdGhlIHRhczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZmlsZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5OYW1lIG9mIHRoZSBwcm9wZXJ0eSBmaWxlIHRvIGxvYWR0YXNrbmFtZS9jbGFzc25hbWUgcGFpcnMgZnJvbTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0icmVzb3VyY2UiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+TmFtZSBvZiB0aGUgcHJvcGVydHkgcmVzb3VyY2UgdG8gbG9hZHRhc2tuYW1lL2NsYXNzbmFtZSBwYWlycyBmcm9tPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJjbGFzc3BhdGgiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGNsYXNzcGF0aCB0b3VzZSB3aGVuIGxvb2tpbmcgdXAgY2xhc3NuYW1lIG9ycmVzb3VyY2U8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNsYXNzcGF0aHJlZiIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5SZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggdG91c2Ugd2hlbiBsb29raW5nIHVwIGNsYXNzbmFtZSBvcnJlc291cmNlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJsb2FkZXJyZWYiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIG5hbWUgb2YgdGhlIGxvYWRlciB0aGF0IGlzdXNlZCB0byBsb2FkIHRoZSBjbGFzcywgY29uc3RydWN0ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIGNsYXNzcGF0aC4gVXNlIHRoaXMgdG9hbGxvdyBtdWx0aXBsZSB0YXNrcy90eXBlcyB0byBiZSBsb2FkZWQgd2l0aCB0aGUgc2FtZSBsb2FkZXIsIHNvIHRoZXkgY2FuIGNhbGxlYWNoIG90aGVyLiAoIGludHJvZHVjZWQgaW4gYW50MS41IDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJ0b3VjaCI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtDaGFuZ2VzIHRoZSBtb2RpZmljYXRpb24gdGltZSBvZiBhIGZpbGUgYW5kIHBvc3NpYmx5IGNyZWF0ZXMgaXQgYXQKLXRoZSBzYW1lIHRpbWUuIEluIGFkZGl0aW9uIHRvIHdvcmtpbmcgd2l0aCBhIHNpbmdsZSBmaWxlLCB0aGlzIFRhc2sKLWNhbiBhbHNvIHdvcmsgYSAmbHQ7YSBocmVmPSZxdW90Oy4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwmcXVvdDsmZ3Q7RmlsZXNldCZsdDsvYSZndDsgKHdoaWNoCi1hbHNvIGluY2x1ZGVzIGRpcmVjdG9yaWVzKS4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtGb3IgSkRLIDEuMSBvbmx5IHRoZSBjcmVhdGlvbiBvZiBuZXcgZmlsZXMgd2l0aCBhIG1vZGlmaWNhdGlvbiB0aW1lCi1vZiBub3cgd29ya3MsIGFsbCBvdGhlciBjYXNlcyB3aWxsIGVtaXQgYSB3YXJuaW5nLiZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0iZmlsZSIgUkVRVUlSRUQ9InVubGVzcyBhIG5lc3RlZCBmaWxlc2V0IGVsZW1lbnQKLSAgICAgICAgaGFzIGJlZW4gc3BlY2lmaWVkLiI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIG5hbWUgb2YgdGhlIGZpbDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibWlsbGlzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnNwZWNpZmllcyB0aGUgbmV3IG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRoZSBmaWxlaW4gbWlsbGlzZWNvbmRzIHNpbmNlIG1pZG5pZ2h0IEphbiAxIDE5NzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZGF0ZXRpbWUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+c3BlY2lmaWVzIHRoZSBuZXcgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIGZpbGVpbiB0aGUgZm9ybWF0IE1NL0REL1lZWVkgSEg6TU0gQU1fb3JfUE08L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0idHN0YW1wIj4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O1NldHMgdGhlICZsdDtjb2RlJmd0O0RTVEFNUCZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O1RTVEFNUCZsdDsvY29kZSZndDssIGFuZCAmbHQ7Y29kZSZndDtUT0RBWSZsdDsvY29kZSZndDsKLXByb3BlcnRpZXMgaW4gdGhlIGN1cnJlbnQgcHJvamVjdC4gQnkgZGVmYXVsdCwKLXRoZSAmbHQ7Y29kZSZndDtEU1RBTVAmbHQ7L2NvZGUmZ3Q7IHByb3BlcnR5IGlzIGluIHRoZQotZm9ybWF0ICZhbXA7cXVvdDt5eXl5TU1kZCZhbXA7cXVvdDssICZsdDtjb2RlJmd0O1RTVEFNUCZsdDsvY29kZSZndDsgaXMgaW4gdGhlCi1mb3JtYXQgJmFtcDtxdW90O2hobW0mYW1wO3F1b3Q7LCBhbmQgJmx0O2NvZGUmZ3Q7VE9EQVkmbHQ7L2NvZGUmZ3Q7IGlzIGluIHRoZQotZm9ybWF0ICZhbXA7cXVvdDtNTU1NIGRkIHl5eXkmYW1wO3F1b3Q7LiBVc2UgdGhlIG5lc3RlZCAmYW1wO2x0O2Zvcm1hdCZhbXA7Z3Q7IGVsZW1lbnQKLXRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgZm9ybWF0LiZsdDsvcCZndDsKLSZsdDtwJmd0O1RoZXNlIHByb3BlcnRpZXMgY2FuIGJlIHVzZWQgaW4gdGhlIGJ1aWxkLWZpbGUsIGZvciBpbnN0YW5jZSwgdG8gY3JlYXRlCi10aW1lLXN0YW1wZWQgZmlsZW5hbWVzLCBvciB1c2VkIHRvIHJlcGxhY2UgcGxhY2Vob2xkZXIgdGFncyBpbnNpZGUgZG9jdW1lbnRzCi10byBpbmRpY2F0ZSwgZm9yIGV4YW1wbGUsIHRoZSByZWxlYXNlIGRhdGUuIFRoZSBiZXN0IHBsYWNlIGZvciB0aGlzIHRhc2sgaXMKLXByb2JhYmx5IGluIGFuIGluaXRpYWxpemF0aW9uIHRhcmdldC4mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9InByZWZpeCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5QcmVmaXggdXNlZCBmb3IgYWxsIHByb3BlcnRpZXMgc2V0LiBUaGUgZGVmYXVsdCBpcyBubyBwcmVmaXg8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0idHlwZWRlZiI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtBZGRzIGEgZGF0YSB0eXBlIGRlZmluaXRpb24gdG8gdGhlIGN1cnJlbnQgcHJvamVjdCwgc3VjaCB0aGF0IHRoaXMKLW5ldyB0eXBlIGNhbiBiZSB1c2VkIGluIHRoZSBjdXJyZW50IHByb2plY3QuIFR3byBhdHRyaWJ1dGVzIGFyZQotbmVlZGVkLCB0aGUgbmFtZSB0aGF0IGlkZW50aWZpZXMgdGhpcyBkYXRhIHR5cGUgdW5pcXVlbHksIGFuZCB0aGUgZnVsbAotbmFtZSBvZiB0aGUgY2xhc3MgKGluY2x1ZGluZyB0aGUgcGFja2FnZXMpIHRoYXQgaW1wbGVtZW50cyB0aGlzCi10eXBlLiZsdDsvcCZndDsKLSZsdDtwJmd0O1lvdSBjYW4gYWxzbyBkZWZpbmUgYSBncm91cCBvZiBkYXRhIHR5cGVzIGF0IG9uY2UgdXNpbmcgdGhlIGZpbGUgb3IKLXJlc291cmNlIGF0dHJpYnV0ZXMuICBUaGVzZSBhdHRyaWJ1dGVzIHBvaW50IHRvIGZpbGVzIGluIHRoZSBmb3JtYXQgb2YKLUphdmEgcHJvcGVydHkgZmlsZXMuICBFYWNoIGxpbmUgZGVmaW5lcyBhIHNpbmdsZSBkYXRhIHR5cGUgaW4gdGhlCi1mb3JtYXQ6Jmx0Oy9wJmd0OwotJmx0O3ByZSZndDsKLXR5cGVuYW1lPWZ1bGx5LnF1YWxpZmllZC5qYXZhLmNsYXNzbmFtZQotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7cCZndDtUeXBlZGVmIHNob3VsZCBiZSB1c2VkIHRvIGFkZCB5b3VyIG93biB0eXBlcyB0byB0aGUgc3lzdGVtLiBEYXRhCi10eXBlcyBhcmUgdGhpbmdzIGxpa2UgJmx0O2EgaHJlZj0mcXVvdDsuLi91c2luZy5odG1sI3BhdGgmcXVvdDsmZ3Q7cGF0aHMmbHQ7L2EmZ3Q7IG9yICZsdDthCi1ocmVmPSZxdW90Oy4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwmcXVvdDsmZ3Q7ZmlsZXNldHMmbHQ7L2EmZ3Q7IHRoYXQgY2FuIGJlIGRlZmluZWQgYXQKLXRoZSBwcm9qZWN0IGxldmVsIGFuZCByZWZlcmVuY2VkIHZpYSB0aGVpciBJRCBhdHRyaWJ1dGUuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Q3VzdG9tIGRhdGEgdHlwZXMgdXN1YWxseSBuZWVkIGN1c3RvbSB0YXNrcyB0byBwdXQgdGhlbSB0byBnb29kIHVzZS4mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9Im5hbWUiIFJFUVVJUkVEPSJ5ZXMsIHVubGVzcyBmaWxlIG9yIHJlc291cmNlIGhhdmUKLSAgICAgYmVlbiBzcGVjaWZpZWQuIj4KLQkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiB0aGUgZGF0YSB0eXA8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNsYXNzbmFtZSIgUkVRVUlSRUQ9InllcywgdW5sZXNzIGZpbGUgb3IgcmVzb3VyY2UgaGF2ZQotICAgICBiZWVuIHNwZWNpZmllZC4iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBmdWxsIGNsYXNzIG5hbWUgaW1wbGVtZW50aW5nIHRoZSBkYXRhIHR5cDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZmlsZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5OYW1lIG9mIHRoZSBwcm9wZXJ0eSBmaWxlIHRvIGxvYWR0eXBlbmFtZS9jbGFzc25hbWUgcGFpcnMgZnJvbTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0icmVzb3VyY2UiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+TmFtZSBvZiB0aGUgcHJvcGVydHkgcmVzb3VyY2UgdG8gbG9hZHR5cGVuYW1lL2NsYXNzbmFtZSBwYWlycyBmcm9tPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJjbGFzc3BhdGgiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGNsYXNzcGF0aCB0b3VzZSB3aGVuIGxvb2tpbmcgdXAgY2xhc3NuYW1lPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJsb2FkZXJyZWYiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIG5hbWUgb2YgdGhlIGxvYWRlciB0aGF0IGlzdXNlZCB0byBsb2FkIHRoZSBjbGFzcywgY29uc3RydWN0ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIGNsYXNzcGF0aC4gVXNlIHRoaXMgdG9hbGxvdyBtdWx0aXBsZSB0YXNrcy90eXBlcyB0byBiZSBsb2FkZWQgd2l0aCB0aGUgc2FtZSBsb2FkZXIsIHNvIHRoZXkgY2FuIGNhbGxlYWNoIG90aGVyLiAoIGludHJvZHVjZWQgaW4gYW50MS41IDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJ1bnppcCI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtVbnppcHMgYSB6aXAtLCB3YXItLCB0YXItIG9yIGphcmZpbGUuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Rm9yIEpESyAxLjEgJmFtcDtxdW90O2xhc3QgbW9kaWZpZWQgdGltZSZhbXA7cXVvdDsgZmllbGQgaXMgc2V0IHRvIGN1cnJlbnQgdGltZSBpbnN0ZWFkIG9mIGJlaW5nCi1jYXJyaWVkIGZyb20gdGhlIGFyY2hpdmUgZmlsZS4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsmbHQ7YSBocmVmPSZxdW90Oy4uL0NvcmVUeXBlcy9wYXR0ZXJuc2V0Lmh0bWwmcXVvdDsmZ3Q7UGF0dGVyblNldCZsdDsvYSZndDtzIGFyZSB1c2VkIHRvIHNlbGVjdCBmaWxlcyB0byBleHRyYWN0Ci0mbHQ7SSZndDtmcm9tJmx0Oy9JJmd0OyB0aGUgYXJjaGl2ZS4gIElmIG5vIHBhdHRlcm5zZXQgaXMgdXNlZCwgYWxsIGZpbGVzIGFyZSBleHRyYWN0ZWQuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsmbHQ7YSBocmVmPSZxdW90Oy4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwmcXVvdDsmZ3Q7RmlsZVNldCZsdDsvYSZndDtzIG1heSBiZSB1c2VkIHVzZWQgdG8gc2VsZWN0IGFyY2hpdmVkIGZpbGVzCi10byBwZXJmb3JtIHVuYXJjaGl2YWwgdXBvbi4KLSZsdDsvcCZndDsKLSZsdDtwJmd0O0ZpbGUgcGVybWlzc2lvbnMgd2lsbCBub3QgYmUgcmVzdG9yZWQgb24gZXh0cmFjdGVkIGZpbGVzLiZsdDsvcCZndDsKLSZsdDtwJmd0O1RoZSB1bnRhciB0YXNrIHJlY29nbml6ZXMgdGhlIGxvbmcgcGF0aG5hbWUgZW50cmllcyB1c2VkIGJ5IEdOVSB0YXIuJmx0O3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9InNyYyIgUkVRVUlSRUQ9InllcywgaWYgZmlsZXNldHMgYXJlIG5vdCB1c2VkLiI+Ci0JCQk8REVTQ1JJUFRJT04+YXJjaGl2ZSBmaWxlIHRvIGV4cGFuZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZGVzdCIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+ZGlyZWN0b3J5IHdoZXJlIHRvIHN0b3JlIHRoZSBleHBhbmRlZCBmaWxlczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ib3ZlcndyaXRlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPk92ZXJ3cml0ZSBmaWxlcywgZXZlbiBpZiB0aGV5IGFyZSBuZXdlciB0aGFuIHRoZWNvcnJlc3BvbmRpbmcgZW50cmllcyBpbiB0aGUgYXJjaGl2ZSAodHJ1ZSBvciBmYWxzZSwgZGVmYXVsdCBpc3RydWUpPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJjb21wcmVzc2lvbiIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5jb21wcmVzc2lvbiBtZXRob2QgZm9yIHVudGFyLiAgQWxsb3dhYmxlIHZhbHVlcyBhcmUmcXVvdDtub25lJnF1b3Q7LCAmcXVvdDtnemlwJnF1b3Q7IGFuZCAmcXVvdDtiemlwMiZxdW90Oy4gIERlZmF1bHQgaXMmcXVvdDtub25lJnF1b3Q7PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9InVwdG9kYXRlIj4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O1NldHMgYSBwcm9wZXJ0eSBpZiBhIHRhcmdldCBmaWxlIG9yIHNldCBvZiB0YXJnZXQgZmlsZXMgaXMgbW9yZSB1cC10by1kYXRlCi10aGFuIGEgc291cmNlIGZpbGUgb3Igc2V0IG9mIHNvdXJjZSBmaWxlcy4gQSBzaW5nbGUgc291cmNlIGZpbGUgaXMgc3BlY2lmaWVkCi11c2luZyB0aGUgJmx0O2NvZGUmZ3Q7c3JjZmlsZSZsdDsvY29kZSZndDsgYXR0cmlidXRlLiBBIHNldCBvZiBzb3VyY2UgZmlsZXMgaXMgc3BlY2lmaWVkCi11c2luZyB0aGUgbmVzdGVkICZsdDtjb2RlJmd0OyZhbXA7bHQ7c3JjZmlsZXMmYW1wO2d0OyZsdDsvY29kZSZndDsKLWVsZW1lbnRzLiBUaGVzZSBhcmUgJmx0O2EgaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sJnF1b3Q7Jmd0O0ZpbGVTZXQmbHQ7L2EmZ3Q7cywKLXdoZXJlYXMgbXVsdGlwbGUgdGFyZ2V0IGZpbGVzIGFyZSBzcGVjaWZpZWQgdXNpbmcgYSBuZXN0ZWQKLSZsdDthIGhyZWY9JnF1b3Q7Li4vQ29yZVR5cGVzL21hcHBlci5odG1sJnF1b3Q7Jmd0OyZsdDtjb2RlJmd0OyZhbXA7bHQ7bWFwcGVyJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7Jmx0Oy9hJmd0OyBlbGVtZW50LiZsdDsvcCZndDsKLSZsdDtwJmd0O0J5IGRlZmF1bHQsIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaXMgc2V0IHRvICZsdDtjb2RlJmd0O3RydWUmbHQ7L2NvZGUmZ3Q7IGlmCi10aGUgdGltZXN0YW1wIG9mIHRoZSB0YXJnZXQgZmlsZShzKSBpcyBtb3JlIHJlY2VudCB0aGFuIHRoZSB0aW1lc3RhbXAgb2YKLXRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBmaWxlKHMpLiBZb3UgY2FuIHNldCB0aGUgdmFsdWUgdG8gc29tZXRoaW5nIG90aGVyCi10aGFuIHRoZSBkZWZhdWx0IGJ5IHNwZWNpZnlpbmcgdGhlICZsdDtjb2RlJmd0O3ZhbHVlJmx0Oy9jb2RlJmd0OyBhdHRyaWJ1dGUuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7SWYgYSAmbHQ7Y29kZSZndDsmYW1wO2x0O3NyY2ZpbGVzJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7IGVsZW1lbnQgaXMgdXNlZCwgd2l0aG91dCBhbHNvIHNwZWNpZnlpbmcKLWEgJmx0O2NvZGUmZ3Q7JmFtcDtsdDttYXBwZXImYW1wO2d0OyZsdDsvY29kZSZndDsgZWxlbWVudCwgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gdXNlIGEKLSZsdDthIGhyZWY9JnF1b3Q7Li4vQ29yZVR5cGVzL21hcHBlci5odG1sI21lcmdlLW1hcHBlciZxdW90OyZndDttZXJnZSBtYXBwZXImbHQ7L2EmZ3Q7LCB3aXRoIHRoZQotJmx0O2NvZGUmZ3Q7dG8mbHQ7L2NvZGUmZ3Q7IGF0dHJpYnV0ZSBzZXQgdG8gdGhlIHZhbHVlIG9mIHRoZQotJmx0O2NvZGUmZ3Q7dGFyZ2V0ZmlsZSZsdDsvY29kZSZndDsgYXR0cmlidXRlLiZsdDsvcCZndDsKLSZsdDtwJmd0O05vcm1hbGx5LCB0aGlzIHRhc2sgaXMgdXNlZCB0byBzZXQgcHJvcGVydGllcyB0aGF0IGFyZSB1c2VmdWwgdG8gYXZvaWQKLXRhcmdldCBleGVjdXRpb24gZGVwZW5kaW5nIG9uIHRoZSByZWxhdGl2ZSBhZ2Ugb2YgdGhlIHNwZWNpZmllZCBmaWxlcy4mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9InByb3BlcnR5IiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj5UaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ2YWx1ZSIgUkVRVUlSRUQ9Im5vOyBkZWZhdWx0cyB0byB0cnVlLiI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIHZhbHVlIHRvIHNldCB0aGUgcHJvcGVydHkgdG88L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InNyY2ZpbGUiIFJFUVVJUkVEPSJ5ZXMsIHVubGVzcyBhIG5lc3RlZAotICAgICAgICZsdDtzcmNmaWxlcyZndDsgZWxlbWVudCBpcyBwcmVzZW50LiI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGZpbGUgdG8gY2hlY2sgYWdhaW5zdCB0aGUgdGFyZ2V0IGZpbGUocyk8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InRhcmdldGZpbGUiIFJFUVVJUkVEPSJ5ZXMsIHVubGVzcyBhIG5lc3RlZAotICAgICAgICZsdDttYXBwZXImZ3Q7IGVsZW1lbnQgaXMgcHJlc2VudC4iPgotCQkJPERFU0NSSVBUSU9OPlRoZSBmaWxlIGZvciB3aGljaCB3ZSB3YW50IHRvIGRldGVybWluZSB0aGUgc3RhdHVzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9IndhaXRmb3IiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7QmxvY2tzIGV4ZWN1dGlvbiB1bnRpbCBhIHNldCBvZiBzcGVjaWZpZWQgY29uZGl0aW9ucyBiZWNvbWUgdHJ1ZS4gVGhpcyBpcyBpbnRlbmRlZAotdG8gYmUgdXNlZCB3aXRoIHRoZSAmbHQ7YSBocmVmPSZxdW90O3BhcmFsbGVsLmh0bWwmcXVvdDsmZ3Q7cGFyYWxsZWwmbHQ7L2EmZ3Q7IHRhc2sgdG8KLXN5bmNocm9uaXplIGEgc2V0IG9mIHByb2Nlc3Nlcy4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtUaGUgY29uZGl0aW9ucyB0byB3YWl0IGZvciBhcmUgZGVmaW5lZCBpbiAmbHQ7YSBocmVmPSZxdW90O3dhaXRmb3IuaHRtbCNuZXN0ZWQmcXVvdDsmZ3Q7bmVzdGVkIGVsZW1lbnRzJmx0Oy9hJmd0OywKLWlmIG11bHRpcGxlIGNvbmRpdGlvbnMgYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgdGFzayB3aWxsIHdhaXQgdW50aWwgYWxsIGNvbmRpdGlvbnMgYXJlIHRydWUuLiZsdDsvcCZndDsKLSZsdDtwJmd0OyZsdDsvcCZndDsKLSZsdDtwJmd0O0lmIGJvdGggbWF4d2FpdCBhbmQgbWF4d2FpdHVuaXQgYXJlIG5vdCBzcGVjaWZpZWQsIHRoZSBtYXh3YWl0IGlzIDMgbWludXRlcyAoMTgwMDAwIG1pbGxpc2Vjb25kcykuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7SWYgdGhlICZsdDtjb2RlJmd0O3RpbWVvdXRwcm9wZXJ0eSZsdDsvY29kZSZndDsgYXR0cmlidXRlIGhhcyBiZWVuIHNldCwgYQotcHJvcGVydHkgb2YgdGhhdCBuYW1lIHdpbGwgYmUgY3JlYXRlZCBpZiB0aGUgY29uZGl0aW9uIGRpZG4ndCBjb21lCi10cnVlIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHRpbWUuJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJtYXh3YWl0IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIHRvIHdhaXQgZm9yIGFsbCB0aGUgcmVxdWlyZWQgY29uZGl0aW9uc3RvIGJlY29tZSB0cnVlIGJlZm9yZSBmYWlsaW5nIHRoZSB0YXNrLiBEZWZhdWx0cyB0byAxODAwMDAgbWF4d2FpdHVuaXRzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJtYXh3YWl0dW5pdCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5UaGUgdW5pdCBvZiB0aW1lIHRoYXQgbXVzdCBiZSB1c2VkIHRvIGludGVycHJldCB0aGUgdmFsdWUgb2YgdGhlbWF4d2FpdCBhdHRyaWJ1dGUuICBEZWZhdWx0cyB0byBtaWxsaXNlY29uZC5WYWxpZCBWYWx1ZXMgYXJlbWlsbGlzZWNvbmRzZWNvbmRtaW51dGVob3VyZGF5d2VlazwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY2hlY2tldmVyeSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5UaGUgYW1vdW50IG9mIHRpbWUgdG8gd2FpdCBiZXR3ZWVuIGVhY2ggdGVzdCBvZiB0aGUgY29uZGl0aW9ucy5EZWZhdWx0cyB0byA1MDAgY2hlY2tldmVyeXVuaXRzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJjaGVja2V2ZXJ5dW5pdCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5UaGUgdW5pdCBvZiB0aW1lIHRoYXQgbXVzdCBiZSB1c2VkIHRvIGludGVycHJldCB0aGUgdmFsdWUgb2YgdGhlY2hlY2tldmVyeSBhdHRyaWJ1dGUuICBEZWZhdWx0cyB0byBtaWxsaXNlY29uZC5WYWxpZCBWYWx1ZXMgYXJlbWlsbGlzZWNvbmRzZWNvbmRtaW51dGVob3VyZGF5d2VlazwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idGltZW91dHByb3BlcnR5IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQgaWYgbWF4d2FpdCBoYXNiZWVuIGV4Y2VlZGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9IndhciI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtBbiBleHRlbnNpb24gb2YgdGhlICZsdDthIGhyZWY9JnF1b3Q7amFyLmh0bWwmcXVvdDsmZ3Q7SmFyJmx0Oy9hJmd0OyB0YXNrIHdpdGggc3BlY2lhbAotdHJlYXRtZW50IGZvciBmaWxlcyB0aGF0IHNob3VsZCBlbmQgdXAgaW4gdGhlCi0mbHQ7Y29kZSZndDtXRUItSU5GL2xpYiZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O1dFQi1JTkYvY2xhc3NlcyZsdDsvY29kZSZndDsgb3IKLSZsdDtjb2RlJmd0O1dFQi1JTkYmbHQ7L2NvZGUmZ3Q7IGRpcmVjdG9yaWVzIG9mIHRoZSBXZWIgQXBwbGljYXRpb24gQXJjaGl2ZS4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsoVGhlIFdhciB0YXNrIGlzIGEgc2hvcnRjdXQgZm9yIHNwZWNpZnlpbmcgdGhlIHBhcnRpY3VsYXIgbGF5b3V0IG9mIGEgV0FSIGZpbGUuIAotVGhlIHNhbWUgdGhpbmcgY2FuIGJlIGFjY29tcGxpc2hlZCBieSB1c2luZyB0aGUgJmx0O2kmZ3Q7cHJlZml4Jmx0Oy9pJmd0OyBhbmQgJmx0O2kmZ3Q7ZnVsbHBhdGgmbHQ7L2kmZ3Q7Ci1hdHRyaWJ1dGVzIG9mIHppcGZpbGVzZXRzIGluIGEgWmlwIG9yIEphciB0YXNrLikmbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtUaGUgZXh0ZW5kZWQgemlwZmlsZXNldCBlbGVtZW50IGZyb20gdGhlIHppcCB0YXNrICh3aXRoIGF0dHJpYnV0ZXMgJmx0O2kmZ3Q7cHJlZml4Jmx0Oy9pJmd0OywgJmx0O2kmZ3Q7ZnVsbHBhdGgmbHQ7L2kmZ3Q7LCBhbmQgJmx0O2kmZ3Q7c3JjJmx0Oy9pJmd0OykgaXMgYXZhaWxhYmxlIGluIHRoZSBXYXIgdGFzay4mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9ImRlc3RmaWxlIiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj50aGUgV0FSIGZpbGUgdG8gY3JlYXRlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ3YXJmaWxlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkRlcHJlY2F0ZWQgbmFtZSBvZiB0aGUgZmlsZSB0byBjcmVhdGUtdXNlIGRlc3RmaWxlIGluc3RlYWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9IndlYnhtbCIgUkVRVUlSRUQ9InllcywgdW5sZXNzIHVwZGF0ZSBpcyBzZXQgdG8gdHJ1ZSI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0byB1c2UgKFdFQi1JTkYvd2ViLnhtbCk8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImJhc2VkaXIiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHRvIGphciB0aGUgZmlsZXM8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNvbXByZXNzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPk5vdCBvbmx5IHN0b3JlIGRhdGEgYnV0IGFsc28gY29tcHJlc3MgdGhlbSwgZGVmYXVsdHMgdG8gdHJ1PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJlbmNvZGluZyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5UaGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIHVzZSBmb3IgZmlsZW5hbWVzaW5zaWRlIHRoZSBhcmNoaXZlLiAgRGVmYXVsdHMgdG8gVVRGOC4gSXQgaXMgbm90cmVjb21tZW5kZWQgdG8gY2hhbmdlIHRoaXMgdmFsdWUgYXMgdGhlIGNyZWF0ZWQgYXJjaGl2ZSB3aWxsIG1vc3RsaWtlbHkgYmUgdW5yZWFkYWJsZSBmb3IgSmF2YSBvdGhlcndpc2U8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZpbGVzb25seSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TdG9yZSBvbmx5IGZpbGUgZW50cmllcywgZGVmYXVsdHMgdG8gZmFsczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZWluY2x1ZGVkLiBBbGwgZmlsZXMgYXJlIGluY2x1ZGVkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpc3Rha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJleGNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlZXhjbHVkZWQuIE5vIGZpbGVzIChleGNlcHQgZGVmYXVsdCBleGNsdWRlcykgYXJlIGV4Y2x1ZGVkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpc3Rha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkZWZhdWx0ZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+aW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im1hbmlmZXN0IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBtYW5pZmVzdCBmaWxlIHRvIHVzZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idXBkYXRlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmluZGljYXRlcyB3aGV0aGVyIHRvIHVwZGF0ZSBvciBvdmVyd3JpdGV0aGUgZGVzdGluYXRpb24gZmlsZSBpZiBpdCBhbHJlYWR5IGV4aXN0czwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZHVwbGljYXRlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmJlaGF2aW9yIHdoZW4gYSBkdXBsaWNhdGUgZmlsZSBpcyBmb3VuZC4gIFZhbGlkIHZhbHVlcyBhcmUgJnF1b3Q7YWRkJnF1b3Q7LCAmcXVvdDtwcmVzZXJ2ZSZxdW90OywgYW5kICZxdW90O2ZhaWwmcXVvdDsuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAmcXVvdDthZGQmcXVvdDsuIDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJ4bWxwcm9wZXJ0eSI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDsKLUxvYWRzIHByb3BlcnR5IHZhbHVlcyBmcm9tIGEgdmFsaWQgeG1sIGZpbGUuCi0mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9ImZpbGUiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPlRoZSBYTUwgZmlsZSB0byBwYXJzZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0icHJlZml4IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlRoZSBwcmVmaXggdG8gcHJlcGVuZCB0byBlYWNoIHByb3BlcnQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImtlZXByb290IiBSRVFVSVJFRD0ibm8sIGRlZmF1bHQgaXMgdHJ1ZS4iPgotCQkJPERFU0NSSVBUSU9OPklmIGZhbHNlLCBpdCBkb2Vzbid0IGluY2x1ZGUgdGhlIHhtbCByb290IHRhZyBhcyBhIGZpcnN0dmFsdWUgaW4gdGhlIHByb3BlcnR5IG5hbWU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InZhbGlkYXRlIiBSRVFVSVJFRD0ibm8sIGRlZmF1bHQgaXMgZmFsc2UuIj4KLQkJCTxERVNDUklQVElPTj5JZiB0cnVlLCBpdCBlbmFibGVzIHZhbGlkYXRpb248L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNvbGxhcHNlYXR0cmlidXRlcyIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0IGlzIGZhbHNlLiI+Ci0JCQk8REVTQ1JJUFRJT04+SWYgdHJ1ZSwgaXQgdHJlYXRzIGF0dHJpYnV0ZXMgYXMgbmVzdGVkIGVsZW1lbnRzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9InhzbHQiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7UHJvY2VzcyBhIHNldCBvZiBkb2N1bWVudHMgdmlhIFhTTFQuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7VGhpcyBpcyB1c2VmdWwgZm9yIGJ1aWxkaW5nIHZpZXdzIG9mIFhNTCBiYXNlZCBkb2N1bWVudGF0aW9uLAotb3IgZm9yIGdlbmVyYXRpbmcgY29kZS4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsmbHQ7YiZndDtOb3RlOiZsdDsvYiZndDsgVGhpcyB0YXNrIGRlcGVuZHMgb24gZXh0ZXJuYWwgbGlicmFyaWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUgQW50IGRpc3RyaWJ1dGlvbi4KLVNlZSAmbHQ7YSBocmVmPSZxdW90Oy4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzJnF1b3Q7Jmd0O0xpYnJhcnkgRGVwZW5kZW5jaWVzJmx0Oy9hJmd0OyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtJdCBpcyBwb3NzaWJsZSB0byByZWZpbmUgdGhlIHNldCBvZiBmaWxlcyB0aGF0IGFyZSBiZWluZyBwcm9jZXNzZWQuIFRoaXMgY2FuIGJlCi1kb25lIHdpdGggdGhlICZsdDtpJmd0O2luY2x1ZGVzJmx0Oy9pJmd0OywgJmx0O2kmZ3Q7aW5jbHVkZXNmaWxlJmx0Oy9pJmd0OywgJmx0O2kmZ3Q7ZXhjbHVkZXMmbHQ7L2kmZ3Q7LCAmbHQ7aSZndDtleGNsdWRlc2ZpbGUmbHQ7L2kmZ3Q7IGFuZCAmbHQ7aSZndDtkZWZhdWx0ZXhjbHVkZXMmbHQ7L2kmZ3Q7Ci1hdHRyaWJ1dGVzLiBXaXRoIHRoZSAmbHQ7aSZndDtpbmNsdWRlcyZsdDsvaSZndDsgb3IgJmx0O2kmZ3Q7aW5jbHVkZXNmaWxlJmx0Oy9pJmd0OyBhdHRyaWJ1dGUgeW91IHNwZWNpZnkgdGhlIGZpbGVzIHlvdSB3YW50IHRvCi1oYXZlIGluY2x1ZGVkIGJ5IHVzaW5nIHBhdHRlcm5zLiBUaGUgJmx0O2kmZ3Q7ZXhjbHVkZSZsdDsvaSZndDsgb3IgJmx0O2kmZ3Q7ZXhjbHVkZXNmaWxlJmx0Oy9pJmd0OyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5Ci10aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBleGNsdWRlZC4gVGhpcyBpcyBhbHNvIGRvbmUgd2l0aCBwYXR0ZXJucy4gQW5kCi1maW5hbGx5IHdpdGggdGhlICZsdDtpJmd0O2RlZmF1bHRleGNsdWRlcyZsdDsvaSZndDsgYXR0cmlidXRlLCB5b3UgY2FuIHNwZWNpZnkgd2hldGhlciB5b3UKLXdhbnQgdG8gdXNlIGRlZmF1bHQgZXhjbHVzaW9ucyBvciBub3QuIFNlZSB0aGUgc2VjdGlvbiBvbiAmbHQ7YQotaHJlZj0mcXVvdDsuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MmcXVvdDsmZ3Q7ZGlyZWN0b3J5IGJhc2VkIHRhc2tzJmx0Oy9hJmd0Oywgb24gaG93IHRoZQotaW5jbHVzaW9uL2V4Y2x1c2lvbiBvZiBmaWxlcyB3b3JrcywgYW5kIGhvdyB0byB3cml0ZSBwYXR0ZXJucy4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtUaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgJmx0O2EgaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sJnF1b3Q7Jmd0O0ZpbGVTZXQmbHQ7L2EmZ3Q7IGFuZCBzdXBwb3J0cyBhbGwKLWF0dHJpYnV0ZXMgb2YgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtmaWxlc2V0JmFtcDtndDsmbHQ7L2NvZGUmZ3Q7ICgmbHQ7Y29kZSZndDtkaXImbHQ7L2NvZGUmZ3Q7IGJlY29tZXMgJmx0O2NvZGUmZ3Q7YmFzZWRpciZsdDsvY29kZSZndDspCi1hcyB3ZWxsIGFzIHRoZSBuZXN0ZWQgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtpbmNsdWRlJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDsmYW1wO2x0O2V4Y2x1ZGUmYW1wO2d0OyZsdDsvY29kZSZndDsKLWFuZCAmbHQ7Y29kZSZndDsmYW1wO2x0O3BhdHRlcm5zZXQmYW1wO2d0OyZsdDsvY29kZSZndDsgZWxlbWVudHMuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7VGhpcyB0YXNrIHN1cHBvcnRzIHRoZSB1c2Ugb2YgYSBuZXN0ZWQgJmFtcDtsdDtwYXJhbSZhbXA7Z3Q7IGVsZW1lbnQgd2hpY2ggaXMgdXNlZCB0byBwYXNzIHZhbHVlcwotdG8gYW4gJmFtcDtsdDt4c2w6cGFyYW0mYW1wO2d0OyBkZWNsYXJhdGlvbi4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtUaGlzIHRhc2sgc3VwcG9ydHMgdGhlIHVzZSBvZiBhIG5lc3RlZCAmbHQ7YSBocmVmPSZxdW90Oy4uL0NvcmVUeXBlcy94bWxjYXRhbG9nLmh0bWwmcXVvdDsmZ3Q7eG1sY2F0YWxvZyZsdDsvYSZndDsKLWVsZW1lbnQgd2hpY2ggaXMgdXNlZCB0byBwZXJmb3JtIEVudGl0eSBhbmQgVVJJIHJlc29sdXRpb24mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsmbHQ7aSZndDsmYW1wO2x0O3N0eWxlJmFtcDtndDsgYW5kICZhbXA7bHQ7eHNsdCZhbXA7Z3Q7IHJlZmVyIHRvIHRoZSBzYW1lIEFudCB0YXNrIGFuZCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkuJmx0Oy9pJmd0OyZsdDsvcCZndDsKLSZsdDtwJmd0O0lmIHlvdSB3YW50IHRvIHVzZSBYYWxhbi1KIDEgb3IgWFNMOlAsIHlvdSBhbHNvIG5lZWQgQW50J3Mgb3B0aW9uYWwuamFyJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJiYXNlZGlyIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPndoZXJlIHRvIGZpbmQgdGhlIHNvdXJjZSBYTUwgZmlsZSwgZGVmYXVsdCBpcyB0aGVwcm9qZWN0J3MgYmFzZWRpcjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZGVzdGRpciIgUkVRVUlSRUQ9InllcywgdW5sZXNzIGluIGFuZCBvdXQgaGF2ZSBiZWVuCi0gICAgICAgc3BlY2lmaWVkLiI+Ci0JCQk8REVTQ1JJUFRJT04+ZGlyZWN0b3J5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSByZXN1bHRzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJleHRlbnNpb24iIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+ZGVzaXJlZCBmaWxlIGV4dGVuc2lvbiB0byBiZSB1c2VkIGZvciB0aGUgdGFyZ2V0cy4gSWYgbm90c3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBpcyAmcXVvdDsuaHRtbCZxdW90OzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ic3R5bGUiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPm5hbWUgb2YgdGhlIHN0eWxlc2hlZXQgdG8gdXNlIC0gZ2l2ZW4gZWl0aGVyIHJlbGF0aXZldG8gdGhlIHByb2plY3QncyBiYXNlZGlyIG9yIGFzIGFuIGFic29sdXRlIHBhdGhERVBSRUNBVEVEIC0gY2FuIGJlIHNwZWNpZmllZCBhcyBhIHBhdGggcmVsYXRpdmV0byB0aGUgYmFzZWRpciBhdHRyaWJ1dGUgb2YgdGhpcyB0YXNrIGFzIHdlbGwuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJjbGFzc3BhdGgiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiBsb29raW5nIHVwIHRoZSBYU0xUcHJvY2Vzc29yPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJjbGFzc3BhdGhyZWYiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGNsYXNzcGF0aCB0byB1c2UsIGdpdmVuIGFzIHJlZmVyZW5jZSB0byBhIHBhdGggZGVmaW5lZCBlbHNld2hlcmU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZvcmNlIiBSRVFVSVJFRD0ibm87IGRlZmF1bHQgaXMgZmFsc2UiPgotCQkJPERFU0NSSVBUSU9OPlJlY3JlYXRlIHRhcmdldCBmaWxlcywgZXZlbiBpZiB0aGV5IGFyZSBuZXdlcnRoYW4gdGhlaXIgY29ycmVzcG9uZGluZyBzb3VyY2UgZmlsZXMgb3IgdGhlIHN0eWxlc2hlZXQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InByb2Nlc3NvciIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5uYW1lIG9mIHRoZSBYU0xUIHByb2Nlc3NvciB0byB1c2UuICBQZXJtaXNzaWJsZSB2YWx1ZXMgYXJlJnF1b3Q7dHJheCZxdW90OyBmb3IgYSBUcmFYIGNvbXBsaWFudCBwcm9jZXNzb3IgKGllIEpBWFAgaW50ZXJmYWNlaW1wbGVtZW50YXRpb24gc3VjaCBhcyBYYWxhbiAyIG9yIFNheG9uKSwmcXVvdDt4c2xwJnF1b3Q7IGZvciB0aGUgWFNMOlAgcHJvY2Vzc29yLCAmcXVvdDt4YWxhbiZxdW90OyBmb3J0aGUgQXBhY2hlIFhNTCBYYWxhbiAodmVyc2lvbiAxKSBwcm9jZXNzb3IgdGhlIG5hbWUgb2YgYW5hcmJpdHJhcnkgWFNMVExpYWlzb24gY2xhc3MuIERlZmF1bHRzIHRvIHRyYXgsIGZvbGxvd2VkIGJ5IHhhbGFuYW5kIHRoZW4geHNscCAoaW4gdGhhdCBvcmRlcikuIFRoZSBmaXJzdCBvbmUgZm91bmQgaW4geW91ciBjbGFzc3BhdGggaXMgdGhlIG9uZSB0aGF0IGlzIHVzZWQuREVQUkVDQVRFRCAtIFhTTDpQIGFuZCB4YWxhbiBhcmUgZGVwcmVjYXRlZCBhbmQgbm9tb3JlIHN1cHBvcnRlZC4uPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJpbmNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlIGluY2x1ZGVkLkFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJpbmNsdWRlc2ZpbGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzIHRha2VuIHRvIGJlYW4gaW5jbHVkZSBwYXR0ZXI8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImV4Y2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUgZXhjbHVkZWQuTm8gZmlsZXMgKGV4Y2VwdCBkZWZhdWx0IGV4Y2x1ZGVzKSBhcmUgZXhjbHVkZWQgd2hlbiBvbWl0dGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJleGNsdWRlc2ZpbGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzIHRha2VuIHRvIGJlYW4gZXhjbHVkZSBwYXR0ZXI8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImRlZmF1bHRleGNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkIG9yIG5vdCgmcXVvdDt5ZXMmcXVvdDsvJnF1b3Q7bm8mcXVvdDspLiBEZWZhdWx0IGV4Y2x1ZGVzIGFyZSB1c2VkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW4iIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+c3BlY2lmaWVzIGEgc2luZ2xlIFhNTCBkb2N1bWVudCB0byBiZSBzdHlsZWQuIFNob3VsZCBiZSB1c2Vkd2l0aCB0aGUgb3V0IGF0dHJpYnV0ZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ib3V0IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnNwZWNpZmllcyB0aGUgb3V0cHV0IG5hbWUgZm9yIHRoZSBzdHlsZWQgcmVzdWx0IGZyb20gdGhlaW4gYXR0cmlidXRlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzY2FuaW5jbHVkZWRkaXJlY3RvcmllcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5JZiBhbnkgZGlyZWN0b3JpZXMgYXJlIG1hdGNoZWQgYnkgdGhlaW5jbHVkZXMvZXhjbHVkZXMgcGF0dGVybnMsIHRyeSB0byB0cmFuc2Zvcm0gYWxsIGZpbGVzIGluIHRoZXNlZGlyZWN0b3JpZXMuICBEZWZhdWx0IGlzIHRydTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJ6aXAiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7Q3JlYXRlcyBhIHppcGZpbGUuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7VGhlICZsdDtpJmd0O2Jhc2VkaXImbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSBpcyB0aGUgcmVmZXJlbmNlIGRpcmVjdG9yeSBmcm9tIHdoZXJlIHRvIHppcC4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtOb3RlIHRoYXQgZmlsZSBwZXJtaXNzaW9ucyB3aWxsIG5vdCBiZSBzdG9yZWQgaW4gdGhlIHJlc3VsdGluZyB6aXBmaWxlLiZsdDsvcCZndDsKLSZsdDtwJmd0O0l0IGlzIHBvc3NpYmxlIHRvIHJlZmluZSB0aGUgc2V0IG9mIGZpbGVzIHRoYXQgYXJlIGJlaW5nIHppcHBlZC4gVGhpcyBjYW4gYmUKLWRvbmUgd2l0aCB0aGUgJmx0O2kmZ3Q7aW5jbHVkZXMmbHQ7L2kmZ3Q7LCAmbHQ7aSZndDtpbmNsdWRlc2ZpbGUmbHQ7L2kmZ3Q7LCAmbHQ7aSZndDtleGNsdWRlcyZsdDsvaSZndDssICZsdDtpJmd0O2V4Y2x1ZGVzZmlsZSZsdDsvaSZndDsgYW5kICZsdDtpJmd0O2RlZmF1bHRleGNsdWRlcyZsdDsvaSZndDsKLWF0dHJpYnV0ZXMuIFdpdGggdGhlICZsdDtpJmd0O2luY2x1ZGVzJmx0Oy9pJmd0OyBvciAmbHQ7aSZndDtpbmNsdWRlc2ZpbGUmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSB5b3Ugc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8KLWhhdmUgaW5jbHVkZWQgYnkgdXNpbmcgcGF0dGVybnMuIFRoZSAmbHQ7aSZndDtleGNsdWRlJmx0Oy9pJmd0OyBvciAmbHQ7aSZndDtleGNsdWRlc2ZpbGUmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHNwZWNpZnkKLXRoZSBmaWxlcyB5b3Ugd2FudCB0byBoYXZlIGV4Y2x1ZGVkLiBUaGlzIGlzIGFsc28gZG9uZSB3aXRoIHBhdHRlcm5zLiBBbmQKLWZpbmFsbHkgd2l0aCB0aGUgJmx0O2kmZ3Q7ZGVmYXVsdGV4Y2x1ZGVzJmx0Oy9pJmd0OyBhdHRyaWJ1dGUsIHlvdSBjYW4gc3BlY2lmeSB3aGV0aGVyIHlvdQotd2FudCB0byB1c2UgZGVmYXVsdCBleGNsdXNpb25zIG9yIG5vdC4gU2VlIHRoZSBzZWN0aW9uIG9uICZsdDthCi1ocmVmPSZxdW90Oy4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyZxdW90OyZndDtkaXJlY3RvcnkgYmFzZWQgdGFza3MmbHQ7L2EmZ3Q7LCBvbiBob3cgdGhlCi1pbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvIHdyaXRlIHBhdHRlcm5zLiAmbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtUaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgJmx0O2EgaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sJnF1b3Q7Jmd0O0ZpbGVTZXQmbHQ7L2EmZ3Q7IGFuZAotc3VwcG9ydHMgYWxsIGF0dHJpYnV0ZXMgb2YgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtmaWxlc2V0JmFtcDtndDsmbHQ7L2NvZGUmZ3Q7Ci0oJmx0O2NvZGUmZ3Q7ZGlyJmx0Oy9jb2RlJmd0OyBiZWNvbWVzICZsdDtjb2RlJmd0O2Jhc2VkaXImbHQ7L2NvZGUmZ3Q7KSBhcyB3ZWxsIGFzIHRoZSBuZXN0ZWQKLSZsdDtjb2RlJmd0OyZhbXA7bHQ7aW5jbHVkZSZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtleGNsdWRlJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7IGFuZAotJmx0O2NvZGUmZ3Q7JmFtcDtsdDtwYXR0ZXJuc2V0JmFtcDtndDsmbHQ7L2NvZGUmZ3Q7IGVsZW1lbnRzLiZsdDsvcCZndDsKLSZsdDtwJmd0O09yLCB5b3UgbWF5IHBsYWNlIHdpdGhpbiBpdCBuZXN0ZWQgZmlsZSBzZXRzLCBvciByZWZlcmVuY2VzIHRvIGZpbGUgc2V0cy4KLUluIHRoaXMgY2FzZSAmbHQ7Y29kZSZndDtiYXNlZGlyJmx0Oy9jb2RlJmd0OyBpcyBvcHRpb25hbDsgdGhlIGltcGxpY2l0IGZpbGUgc2V0IGlzICZsdDtpJmd0O29ubHkgdXNlZCZsdDsvaSZndDsKLWlmICZsdDtjb2RlJmd0O2Jhc2VkaXImbHQ7L2NvZGUmZ3Q7IGlzIHNldC4gWW91IG1heSB1c2UgYW55IG1peHR1cmUgb2YgdGhlIGltcGxpY2l0IGZpbGUgc2V0Ci0od2l0aCAmbHQ7Y29kZSZndDtiYXNlZGlyJmx0Oy9jb2RlJmd0OyBzZXQsIGFuZCBvcHRpb25hbCBhdHRyaWJ1dGVzIGxpa2UgJmx0O2NvZGUmZ3Q7aW5jbHVkZXMmbHQ7L2NvZGUmZ3Q7Ci1hbmQgb3B0aW9uYWwgc3ViZWxlbWVudHMgbGlrZSAmbHQ7Y29kZSZndDsmYW1wO2x0O2luY2x1ZGUmYW1wO2d0OyZsdDsvY29kZSZndDspOyBleHBsaWNpdCBuZXN0ZWQKLSZsdDtjb2RlJmd0OyZhbXA7bHQ7ZmlsZXNldCZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyBlbGVtZW50cyBzbyBsb25nIGFzIGF0IGxlYXN0IG9uZSBmaWxlc2V0IHRvdGFsIGlzIHNwZWNpZmllZC4gVGhlIFpJUCBmaWxlIHdpbGwKLW9ubHkgcmVmbGVjdCB0aGUgcmVsYXRpdmUgcGF0aHMgb2YgZmlsZXMgJmx0O2kmZ3Q7d2l0aGluJmx0Oy9pJmd0OyBlYWNoIGZpbGVzZXQuIFRoZSBaaXAgdGFzayBhbmQgaXRzIGRlcml2YXRpdmVzIGtub3cgYSBzcGVjaWFsIGZvcm0gb2YgYSBmaWxlc2V0IG5hbWVkIHppcGZpbGVzZXQgdGhhdCBoYXMgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIChkZXNjcmliZWQgYmVsb3cpLiAmbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtUaGUgWmlwIHRhc2sgYWxzbyBzdXBwb3J0cyB0aGUgbWVyZ2luZyBvZiBtdWx0aXBsZSB6aXAgZmlsZXMgaW50byB0aGUgemlwIGZpbGUuIAotVGhpcyBpcyBwb3NzaWJsZSB0aHJvdWdoIGVpdGhlciB0aGUgJmx0O2kmZ3Q7c3JjJmx0Oy9pJmd0OyBhdHRyaWJ1dGUgb2YgYW55IG5lc3RlZCBmaWxlc2V0cyAKLW9yIGJ5IHVzaW5nIHRoZSBzcGVjaWFsIG5lc3RlZCBmaWxlc2V0ICZsdDtpJmd0O3ppcGdyb3VwZmlsZXNldCZsdDsvaSZndDsuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7VGhlICZsdDtjb2RlJmd0O3VwZGF0ZSZsdDsvY29kZSZndDsgcGFyYW1ldGVyIGNvbnRyb2xzIHdoYXQgaGFwcGVucyBpZiB0aGUKLVpJUCBmaWxlIGFscmVhZHkgZXhpc3RzLiBXaGVuIHNldCB0byAmbHQ7Y29kZSZndDt5ZXMmbHQ7L2NvZGUmZ3Q7LCB0aGUgWklQIGZpbGUgaXMKLXVwZGF0ZWQgd2l0aCB0aGUgZmlsZXMgc3BlY2lmaWVkLiAoTmV3IGZpbGVzIGFyZSBhZGRlZDsgb2xkIGZpbGVzIGFyZQotcmVwbGFjZWQgd2l0aCB0aGUgbmV3IHZlcnNpb25zLikgV2hlbiBzZXQgdG8gJmx0O2NvZGUmZ3Q7bm8mbHQ7L2NvZGUmZ3Q7ICh0aGUKLWRlZmF1bHQpIHRoZSBaSVAgZmlsZSBpcyBvdmVyd3JpdHRlbi4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtUaGUgJmx0O2NvZGUmZ3Q7d2hlbmVtcHR5Jmx0Oy9jb2RlJmd0OyBwYXJhbWV0ZXIgY29udHJvbHMgd2hhdCBoYXBwZW5zIHdoZW4gbm8gZmlsZXMgbWF0Y2guCi1JZiAmbHQ7Y29kZSZndDtza2lwJmx0Oy9jb2RlJmd0OyAodGhlIGRlZmF1bHQpLCB0aGUgWklQIGlzIG5vdCBjcmVhdGVkIGFuZCBhIHdhcm5pbmcgaXMgaXNzdWVkLgotSWYgJmx0O2NvZGUmZ3Q7ZmFpbCZsdDsvY29kZSZndDssIHRoZSBaSVAgaXMgbm90IGNyZWF0ZWQgYW5kIHRoZSBidWlsZCBpcyBoYWx0ZWQgd2l0aCBhbiBlcnJvci4KLUlmICZsdDtjb2RlJmd0O2NyZWF0ZSZsdDsvY29kZSZndDssIGFuIGVtcHR5IFpJUCBmaWxlIChleHBsaWNpdGx5IHplcm8gZW50cmllcykgaXMgY3JlYXRlZCwKLXdoaWNoIHNob3VsZCBiZSByZWNvZ25pemVkIGFzIHN1Y2ggYnkgY29tcGxpYW50IFpJUCBtYW5pcHVsYXRpb24gdG9vbHMuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7VGhpcyB0YXNrIHdpbGwgbm93IHVzZSB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZwotZm9yIGZpbGVuYW1lcyAtIHRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBjb21tYW5kIGxpbmUgWklQIHRvb2xzLAotYnV0IGNhdXNlcyBwcm9ibGVtcyBpZiB5b3UgdHJ5IHRvIG9wZW4gdGhlbSBmcm9tIHdpdGhpbiBKYXZhIGFuZCB5b3VyCi1maWxlbmFtZXMgY29udGFpbiBub24gVVMtQVNDSUkgY2hhcmFjdGVycy4gVXNlIHRoZSBlbmNvZGluZyBhdHRyaWJ1dGUKLWFuZCBzZXQgaXQgdG8gVVRGOCB0byBjcmVhdGUgemlwIGZpbGVzIHRoYXQgY2FuIHNhZmVseSBiZSByZWFkIGJ5Ci1KYXZhLiZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0iZGVzdGZpbGUiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPnRoZSB6aXAtZmlsZSB0byBjcmVhdGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InppcGZpbGUiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPnRoZSBkZXByZWNhdGVkIG9sZCBuYW1lIG9mIGRlc3RmaWxlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJiYXNlZGlyIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCB0byB6aXAgdGhlIGZpbGVzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJjb21wcmVzcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5Ob3Qgb25seSBzdG9yZSBkYXRhIGJ1dCBhbHNvIGNvbXByZXNzIHRoZW0sIGRlZmF1bHRzIHRvIHRydTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZW5jb2RpbmciIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lc2luc2lkZSB0aGUgemlwIGZpbGUuICBGb3IgYSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcyBzZWUgaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qZGsvMS4yL2RvY3MvZ3VpZGUvaW50ZXJuYXQvZW5jb2RpbmcuZG9jLmh0bWwuRGVmYXVsdHMgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2Rpbmc8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZpbGVzb25seSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TdG9yZSBvbmx5IGZpbGUgZW50cmllcywgZGVmYXVsdHMgdG8gZmFsczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZWluY2x1ZGVkLiBBbGwgZmlsZXMgYXJlIGluY2x1ZGVkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpc3Rha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJleGNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlZXhjbHVkZWQuIE5vIGZpbGVzIChleGNlcHQgZGVmYXVsdCBleGNsdWRlcykgYXJlIGV4Y2x1ZGVkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpc3Rha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkZWZhdWx0ZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+aW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InVwZGF0ZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5pbmRpY2F0ZXMgd2hldGhlciB0byB1cGRhdGUgb3Igb3ZlcndyaXRldGhlIGRlc3RpbmF0aW9uIGZpbGUgaWYgaXQgYWxyZWFkeSBleGlzdHM8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9IndoZW5lbXB0eSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5iZWhhdmlvciB3aGVuIG5vIGZpbGVzIG1hdGNoLiAgVmFsaWQgdmFsdWVzIGFyZSAmcXVvdDtmYWlsJnF1b3Q7LCAmcXVvdDtza2lwJnF1b3Q7LCBhbmQgJnF1b3Q7Y3JlYXRlJnF1b3Q7LiAgRGVmYXVsdCBpcyAmcXVvdDtza2lwJnF1b3Q7PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkdXBsaWNhdGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+YmVoYXZpb3Igd2hlbiBhIGR1cGxpY2F0ZSBmaWxlIGlzIGZvdW5kLiAgVmFsaWQgdmFsdWVzIGFyZSAmcXVvdDthZGQmcXVvdDssICZxdW90O3ByZXNlcnZlJnF1b3Q7LCBhbmQgJnF1b3Q7ZmFpbCZxdW90Oy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgJnF1b3Q7YWRkJnF1b3Q7LiA8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0iYW50bHIiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7Ci1JbnZva2VzIHRoZSAmbHQ7YSBIUkVGPSZxdW90O2h0dHA6Ly93d3cuYW50bHIub3JnLyZxdW90OyB0YXJnZXQ9JnF1b3Q7X3RvcCZxdW90OyZndDtBTlRMUiZsdDsvYSZndDsgVHJhbnNsYXRvciBnZW5lcmF0b3IKLW9uIGEgZ3JhbW1hciBmaWxlLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1UbyB1c2UgdGhlIEFOVExSIHRhc2ssIHNldCB0aGUgJmx0O2kmZ3Q7dGFyZ2V0Jmx0Oy9pJmd0OyBhdHRyaWJ1dGUgdG8gdGhlIG5hbWUgb2YgdGhlCi1ncmFtbWFyIGZpbGUgdG8gcHJvY2Vzcy4gIE9wdGlvbmFsbHksIHlvdSBjYW4gYWxzbyBzZXQgdGhlCi0mbHQ7aSZndDtvdXRwdXRkaXJlY3RvcnkmbHQ7L2kmZ3Q7IHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgZmlsZSB0byBhIHNwZWNpZmljIGRpcmVjdG9yeS4KLU90aGVyd2lzZSBBTlRMUiB3cml0ZXMgdGhlIGdlbmVyYXRlZCBmaWxlcyB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcKLXRoZSBncmFtbWFyIGZpbGUuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLVRoaXMgdGFzayBvbmx5IGludm9rZXMgQU5UTFIgaWYgdGhlIGdyYW1tYXIgZmlsZSBpcyBuZXdlciB0aGFuIHRoZSBnZW5lcmF0ZWQKLWZpbGVzLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0mbHQ7aSZndDsKLVRvIHN1Y2Nlc3NmdWxseSBydW4gQU5UTFIsIHlvdXIgYmVzdCBvcHRpb24gaXMgcHJvYmFibHkgdG8gYnVpbGQgdGhlIHdob2xlCi1qYXIgd2l0aCB0aGUgcHJvdmlkZWQgc2NyaXB0ICZsdDtiJmd0O21rYWxsamFyJmx0Oy9iJmd0OyBhbmQgZHJvcCB0aGUgcmVzdWx0aW5nIGphciAoYWJvdXQgMzAwS0IpCi1pbnRvICR7YW50LmhvbWV9L2xpYi4gRHJvcHBpbmcgdGhlIGRlZmF1bHQgamFyICg3MEtCKSBpcyBwcm9iYWJseSBub3QgZW5vdWdoCi1mb3IgbW9zdCBuZWVkcyBhbmQgeW91ciBvbmx5IG9wdGlvbiB3aWxsIGJlIHRvIGFkZCBBTlRMUiBob21lIGRpcmVjdG9yeQotdG8geW91ciBjbGFzc3BhdGggYXMgZGVzY3JpYmVkIGluIEFOVExSICZsdDt0dCZndDtpbnN0YWxsLmh0bWwmbHQ7L3R0Jmd0OyBkb2N1bWVudC4KLSZsdDsvaSZndDsKLSZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0idGFyZ2V0IiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj5UaGUgZ3JhbW1hciBmaWxlIHRvIHByb2Nlc3M8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im91dHB1dGRpcmVjdG9yeSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5UaGUgZGlyZWN0b3J5IHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMgdG8uICBJZiBub3Qgc2V0LCB0aGUgZmlsZXNhcmUgd3JpdHRlbiB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGdyYW1tYXIgZmlsZS48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImdsaWIiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+QW4gb3B0aW9uYWwgc3VwZXIgZ3JhbW1hciBmaWxlIHRoYXQgdGhlIHRhcmdldCBncmFtbWFyIG92ZXJyaWRlcy4gIFRoaXNmZWF0dXJlIGlzIG9ubHkgbmVlZGVkIGZvciBhZHZhbmNlZCB2b2NhYnVsYXJpZXMuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkZWJ1ZyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5XaGVuIHNldCB0byAmcXVvdDt5ZXMmcXVvdDssIHRoaXMgZmxhZyBhZGRzIGNvZGUgdG8gdGhlIGdlbmVyYXRlZCBwYXJzZXIgdGhhdCB3aWxsbGF1bmNoIHRoZSBQYXJzZVZpZXcgZGVidWdnZXIgdXBvbiBpbnZvY2F0aW9uLiAgVGhlIGRlZmF1bHQgaXMgJnF1b3Q7bm8mcXVvdDsuTm90ZTogUGFyc2VWaWV3IGlzIGEgc2VwYXJhdGUgY29tcG9uZW50IHRoYXQgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIG9yIHlvdXJncmFtbWFyIHdpbGwgaGF2ZSBjb21waWxhdGlvbiBlcnJvcnMuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJodG1sIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkVtaXQgYW4gaHRtbCB2ZXJzaW9uIG9mIHRoZSBncmFtbWFyIHdpdGggaHlwZXJsaW5rZWQgYWN0aW9ucy48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImRpYWdub3N0aWMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+R2VuZXJhdGVzIGEgdGV4dCBmaWxlIHdpdGggZGVidWdnaW5nIGluZm9tYXRpb24gYmFzZWQgb24gdGhlIHRhcmdldCBncmFtbWFyLjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idHJhY2UiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+Rm9yY2VzIGFsbCBydWxlcyB0byBjYWxsIHRyYWNlSW4vdHJhY2VPdXQgaWYgc2V0IHRvICZxdW90O3llcyZxdW90Oy5UaGUgZGVmYXVsdCBpcyAmcXVvdDtubyZxdW90Oy48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InRyYWNlcGFyc2VyIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPk9ubHkgZm9yY2VzIHBhcnNlciBydWxlcyB0byBjYWxsIHRyYWNlSW4vdHJhY2VPdXQgaWYgc2V0IHRvICZxdW90O3llcyZxdW90Oy5UaGUgZGVmYXVsdCBpcyAmcXVvdDtubyZxdW90Oy48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InRyYWNlbGV4ZXIiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+T25seSBmb3JjZXMgbGV4ZXIgcnVsZXMgdG8gY2FsbCB0cmFjZUluL3RyYWNlT3V0IGlmIHNldCB0byAmcXVvdDt5ZXMmcXVvdDsuVGhlIGRlZmF1bHQgaXMgJnF1b3Q7bm8mcXVvdDsuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ0cmFjZXRyZWV3YWxrZXIiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+T25seSBmb3JjZXMgdHJlZSB3YWxrZXIgcnVsZXMgdG8gY2FsbCB0cmFjZUluL3RyYWNlT3V0IGlmIHNldCB0byZxdW90O3llcyZxdW90Oy4gIFRoZSBkZWZhdWx0IGlzICZxdW90O25vJnF1b3Q7LjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZGlyIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlRoZSBkaXJlY3RvcnkgdG8gaW52b2tlIHRoZSBWTSBpbi48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0iYm9ybGFuZGdlbmVyYXRlY2xpZW50Ij4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O1RoZSBCb3JsYW5kR2VuZXJhdGVDbGllbnQgaXMgYSB0YXNrIGRlZGljYXRlZCB0byBCb3JsYW5kIEFwcGxpY2F0aW9uIFNlcnZlcgotdiA0LjUuIEl0IG9mZmVycyB0byBnZW5lcmF0ZSB0aGUgY2xpZW50IGphciBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gYW4gZWpiIGphcgotZmlsZS4mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9ImVqYmphciIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+ZWpiIGphciBmaWw8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImRlYnVnIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPklmIHRydWUsIHR1cm4gb24gdGhlIGRlYnVnIG1vZGUgZm9yIGVhY2ggYm9ybGFuZHRvb2xzIChqYXZhMmlpb3AsIGlhc3Rvb2wgLi4uKSBkZWZhdWx0ID0gZmFsczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY2xpZW50amFyIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmNsaWVudCBqYXIgZmlsZSBuYW1lLiBJZiBtaXNzaW5nIHRoZSBjbGllbnQgamFyZmlsZSBuYW1lIGlzIGJ1aWxkIHVzaW5nIHRoZSBlamJqYXIgZmlsZSBuYW1lOiBlamJqYXIgPSBoZWxsb2JlYW4tZWpiLmphcj0mZ3Q7IGhlbGxvYmVhbi1lamJjbGllbnQuamE8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im1vZGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+Y2hvb3NlIHRoZSBjb21tYW5kIGxhdW5jaGluZyBtb2RlLiBUd28gdmFsdWVzOmphdmEgb3IgZm9yay4gZGVmYXVsdCA9IGZvcmsuIGphdmEgaXMgbm90IHN1cHBvcnRlZCBmb3IgdmVyc2lvbj01LlBvc3NpYmlsaXR5IHRvIHNwZWNpZnkgYSBjbGFzc3BhdGg8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InZlcnNpb24iIFJFUVVJUkVEPSJubywgZGVmYXVsdHMgdG8gNCI+Ci0JCQk8REVTQ1JJUFRJT04+c2V0IHRoZSBCb3JsYW5kIEFwcGxpY2F0aW9uIFZlcnNpb24uNCBtZWFucyBCLkEuUyAoQm9ybGFuZCBBcHBsaWNhdGlvbiBTZXJ2ZXIgNC54KTUgbWVhbnMgQi5FLlMgKEJvcmxhbmQgQXBwbGljYXRpb24gU2VydmVyIDUueCk8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0iY2FiIj4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O1RoZSBjYWIgdGFzayBjcmVhdGVzIE1pY3Jvc29mdCBjYWIgYXJjaGl2ZSBmaWxlcy4gIEl0IGlzIGludm9rZWQKLXNpbWlsYXIgdG8gdGhlICZsdDthIGhyZWY9JnF1b3Q7Li4vQ29yZVRhc2tzL2phci5odG1sJnF1b3Q7Jmd0O2phciZsdDsvYSZndDsgb3IgJmx0O2EgaHJlZj0mcXVvdDsuLi9Db3JlVGFza3MvemlwLmh0bWwmcXVvdDsmZ3Q7emlwJmx0Oy9hJmd0OyB0YXNrcy4KLVRoaXMgdGFzayB3aWxsIHdvcmsgb24gV2luZG93cyB1c2luZyB0aGUgZXh0ZXJuYWwgY2FiYXJjIHRvb2wgKHByb3ZpZGVkIGJ5IE1pY3Jvc29mdCkKLXdoaWNoIG11c3QgYmUgbG9jYXRlZCBpbiB5b3VyIGV4ZWN1dGFibGUgcGF0aC4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtUbyB1c2UgdGhpcyB0YXNrIG9uIG90aGVyIHBsYXRmb3JtcyB5b3UgbmVlZCB0byBkb3dubG9hZCBhbmQgY29tcGlsZSBsaWJjYWJpbmV0IGZyb20KLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3RyaWxsLmNpcy5mb3JkaGFtLmVkdS9+YmFyYmFjaGEvY2FiaW5ldF9saWJyYXJ5LyZxdW90OyZndDsKLWh0dHA6Ly90cmlsbC5jaXMuZm9yZGhhbS5lZHUvfmJhcmJhY2hhL2NhYmluZXRfbGlicmFyeS8mbHQ7L2EmZ3Q7LiZsdDsvcCZndDsKLSZsdDtwJmd0O1NlZSB0aGUgc2VjdGlvbiBvbiAmbHQ7YSBocmVmPSZxdW90Oy4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyZxdW90OyZndDtkaXJlY3RvcnkgYmFzZWQKLXRhc2tzJmx0Oy9hJmd0Oywgb24gaG93IHRoZSBpbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvCi13cml0ZSBwYXR0ZXJucy4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtUaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgJmx0O2EgaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sJnF1b3Q7Jmd0O0ZpbGVTZXQmbHQ7L2EmZ3Q7IGFuZAotc3VwcG9ydHMgYWxsIGF0dHJpYnV0ZXMgb2YgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtmaWxlc2V0JmFtcDtndDsmbHQ7L2NvZGUmZ3Q7Ci0oJmx0O2NvZGUmZ3Q7ZGlyJmx0Oy9jb2RlJmd0OyBiZWNvbWVzICZsdDtjb2RlJmd0O2Jhc2VkaXImbHQ7L2NvZGUmZ3Q7KSBhcyB3ZWxsIGFzIHRoZSBuZXN0ZWQKLSZsdDtjb2RlJmd0OyZhbXA7bHQ7aW5jbHVkZSZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtleGNsdWRlJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7IGFuZAotJmx0O2NvZGUmZ3Q7JmFtcDtsdDtwYXR0ZXJuc2V0JmFtcDtndDsmbHQ7L2NvZGUmZ3Q7IGVsZW1lbnRzLiZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0iY2FiZmlsZSIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIG5hbWUgb2YgdGhlIGNhYiBmaWxlIHRvIGNyZWF0ZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iYmFzZWRpciIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGRpcmVjdG9yeSB0byBzdGFydCBhcmNoaXZpbmcgZmlsZXMgZnJvbTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idmVyYm9zZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5zZXQgdG8gJnF1b3Q7eWVzJnF1b3Q7IGlmIHlvdSB3YW50IHRvIHNlZSB0aGUgb3V0cHV0IGZyb210aGUgY2FiYXJjIHRvb2wuICBkZWZhdWx0cyB0byAmcXVvdDtubyZxdW90OzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY29tcHJlc3MiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+c2V0IHRvICZxdW90O25vJnF1b3Q7IHRvIHN0b3JlIGZpbGVzIHdpdGhvdXQgY29tcHJlc3NpbmcuZGVmYXVsdHMgdG8gJnF1b3Q7eWVzJnF1b3Q7PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJvcHRpb25zIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnVzZSB0byBzZXQgYWRkaXRpb25hbCBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3J0aGUgY2FiYXJjIHRvb2wuICBzaG91bGQgbm90IG5vcm1hbGx5IGJlIG5lY2Vzc2FyeTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXRtdXN0IGJlIGluY2x1ZGVkLiBBbGwgZmlsZXMgYXJlIGluY2x1ZGVkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpc3Rha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJleGNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdG11c3QgYmUgZXhjbHVkZWQuIE5vIGZpbGVzIChleGNlcHQgZGVmYXVsdCBleGNsdWRlcykgYXJlIGV4Y2x1ZGVkd2hlbiBvbWl0dGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJleGNsdWRlc2ZpbGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXI8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImRlZmF1bHRleGNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2Vkb3Igbm90ICgmcXVvdDt5ZXMmcXVvdDsvJnF1b3Q7bm8mcXVvdDspLiBEZWZhdWx0IGV4Y2x1ZGVzIGFyZSB1c2VkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJkZXBlbmQiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7Ci1UaGUgZGVwZW5kIHRhc2sgd29ya3MgYnkgZGV0ZXJtaW5pbmcgd2hpY2ggY2xhc3NlcyBhcmUgb3V0IG9mIGRhdGUgd2l0aAotcmVzcGVjdCB0byB0aGVpciBzb3VyY2UgYW5kIHRoZW4gcmVtb3ZpbmcgdGhlIGNsYXNzIGZpbGVzIG9mIGFueSBvdGhlcgotY2xhc3NlcyB3aGljaCBkZXBlbmQgb24gdGhlIG91dC1vZi1kYXRlIGNsYXNzZXMuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsgVG8gZGV0ZXJtaW5lIHRoZSBjbGFzcyBkZXBlbmRlbmNpZXMsIHRoZSBkZXBlbmQgdGFzayBhbmFseXNlcyB0aGUgY2xhc3MgCi1maWxlcyBvZiBhbGwgY2xhc3MgZmlsZXMgcGFzc2VkIHRvIGl0LiBEZXBlbmQgZG9lcyBub3QgcGFyc2UgeW91ciBzb3VyY2UgY29kZSBpbiAKLWFueSB3YXkgYnV0IHJlbGllcyB1cG9uIHRoZSBjbGFzcyByZWZlcmVuY2VzIGVuY29kZWQgaW50byB0aGUgY2xhc3MgZmlsZXMgYnkgdGhlIAotY29tcGlsZXIuIFRoaXMgaXMgZ2VuZXJhbGx5IGZhc3RlciB0aGFuIHBhcnNpbmcgdGhlIEphdmEgc291cmNlLiZsdDsvcCZndDsKLSZsdDtwJmd0OwotVG8gbGVhcm4gbW9yZSBhYm91dCBob3cgdGhpcyBpbmZvcm1hdGlvbiBpcyBvYnRhaW5lZCBmcm9tIHRoZSBjbGFzcyBmaWxlcywgCi1wbGVhc2UgcmVmZXIgdG8gJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3Mvdm1zcGVjLyZxdW90OyZndDt0aGUgSmF2YSAKLVZpcnR1YWwgTWFjaGluZSBTcGVjaWZpY2F0aW9uJmx0Oy9hJmd0OwotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7IFNpbmNlIGEgY2xhc3MnIGRlcGVuZGVuY2llcyBvbmx5IGNoYW5nZSB3aGVuIHRoZSBjbGFzcyBpdHNlbGYgY2hhbmdlcywgdGhlIAotZGVwZW5kIHRhc2sgaXMgYWJsZSB0byBjYWNoZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uLiBPbmx5IHRob3NlIGNsYXNzIGZpbGVzIAotd2hpY2ggaGF2ZSBjaGFuZ2VkIHdpbGwgaGF2ZSB0aGVpciBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIHJlLWFuYWx5c2VkLiBOb3RlIHRoYXQgCi1pZiB5b3UgY2hhbmdlIGEgY2xhc3MnIGRlcGVuZGVuY2llcyBieSBjaGFuZ2luZyB0aGUgc291cmNlLCBpdCB3aWxsIGJlIAotcmVjb21waWxlZCBhbnl3YXkuIFlvdSBjYW4gZXhhbWluZSB0aGUgZGVwZW5kZW5jeSBmaWxlcyBjcmVhdGVkIHRvIHVuZGVyc3RhbmQgCi10aGUgIGRlcGVuZGVuY2llcyBvZiB5b3VyIGNsYXNzZXMuIFBsZWFzZSBkbyBub3QgcmVseSwgaG93ZXZlciwgb24gdGhlIGZvcm1hdCBvZiAKLXRoZSBpbmZvcm1hdGlvbiwgYXMgaXQgbWF5IGNoYW5nZSBpbiBhIGxhdGVyIHJlbGVhc2UuICZsdDsvcCZndDsKLSZsdDtwJmd0OyBPbmNlIGRlcGVuZCBkaXNjb3ZlcnMgYWxsIG9mIHRoZSBjbGFzcyBkZXBlbmRlbmNpZXMsIGl0ICZhbXA7cXVvdDtpbnZlcnRzJmFtcDtxdW90OyAKLXRoaXMgcmVsYXRpb24gdG8gZGV0ZXJtaW5lLCBmb3IgZWFjaCBjbGFzcywgd2hpY2ggb3RoZXIgY2xhc3NlcyBhcmUgZGVwZW5kZW50IAotdXBvbiBpdC4gVGhpcyAmYW1wO3F1b3Q7YWZmZWN0cyZhbXA7cXVvdDsgbGlzdCBpcyB1c2VkIHRvIGRpc2NvdmVyIHdoaWNoIGNsYXNzZXMgYXJlIAotaW52YWxpZGF0ZWQgYnkgdGhlIG91dCBvZiBkYXRlIGNsYXNzLiBUaGUgY2xhc3MgZmlsZXMgb2YgdGhlIGludmFsaWRhdGVkIAotY2xhc3NlcyBhcmUgcmVtb3ZlZCwgdHJpZ2dlcmluZyB0aGUgY29tcGlsYXRpb24gb2YgdGhlIGFmZmVjdGVkIGNsYXNzZXMuICZsdDsvcCZndDsKLSZsdDtwJmd0OyBUaGUgZGVwZW5kIHRhc2sgc3VwcG9ydHMgYW4gYXR0cmlidXRlLCAmYW1wO3F1b3Q7Y2xvc3VyZSZhbXA7cXVvdDsgd2hpY2ggY29udHJvbHMgCi13aGV0aGVyIGRlcGVuZCB3aWxsIG9ubHkgY29uc2lkZXIgZGlyZWN0IGNsYXNzLWNsYXNzIHJlbGF0aW9uc2hpcHMgb3Igd2hldGhlciBpdCAKLXdpbGwgYWxzbyBjb25zaWRlciB0cmFuc2l0aXZlLCBpbmRpcmVjdCByZWxhdGlvbnNoaXBzLiBGb3IgZXhhbXBsZSwgc2F5IHRoZXJlIAotYXJlIHRocmVlIGNsYXNzZXMsIEEsIHdoaWNoIGRlcGVuZHMgb24gQiwgd2hpY2ggaW4tdHVybiBkZXBlbmQgb24gQy4gTm93IHNheSAKLXRoYXQgY2xhc3MgQyBpcyBvdXQgb2YgZGF0ZS4gV2l0aG91dCBjbG9zdXJlLCBvbmx5IGNsYXNzIEIgd291bGQgYmUgcmVtb3ZlZCBieSAKLWRlcGVuZC4gV2l0aCBjbG9zdXJlIHNldCwgY2xhc3MgQSB3b3VsZCBhbHNvIGJlIHJlbW92ZWQuIE5vcm1hbGx5IGRpcmVjdCAKLXJlbGF0aW9uc2hpcHMgYXJlIHN1ZmZpY2llbnQgLSBpdCBpcyB1bnVzdWFsIGZvciBhIGNsYXNzIHRvIGRlcGVuZCBvbiBhbm90aGVyIAotd2l0aG91dCBoYXZpbmcgYSBkaXJlY3QgcmVsYXRpb25zaGlwLiBXaXRoIGNsb3N1cmUgc2V0LCB5b3Ugd2lsbCBub3RpY2UgdGhhdCAKLWRlcGVuZCB0eXBpY2FsbHkgcmVtb3ZlcyBmYXIgbW9yZSBjbGFzcyBmaWxlcy4gJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7VGhlIGNsYXNzcGF0aCBhdHRyaWJ1dGUgZm9yICZsdDtjb2RlJmd0OyZhbXA7bHQ7ZGVwZW5kJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7IGlzIG9wdGlvbmFsLiBJZiBpdCBpcyBwcmVzZW50LCAKLWRlcGVuZCB3aWxsIGNoZWNrIGNsYXNzIGRlcGVuZGVuY2llcyBhZ2FpbnN0IGNsYXNzZXMgYW5kIGphcnMgb24gdGhpcyBjbGFzc3BhdGguCi1BbnkgY2xhc3NlcyB3aGljaCBkZXBlbmQgb24gYW4gZWxlbWVudCBmcm9tIHRoaXMgY2xhc3NwYXRoIGFuZCB3aGljaCBhcmUgb2xkZXIgCi10aGFuIHRoYXQgZWxlbWVudCB3aWxsIGJlIGRlbGV0ZWQuIEEgdHlwaWNhbCBleGFtcGxlIHdoZXJlIHlvdSB3b3VsZCB1c2UgdGhpcyAKLWZhY2lsaXR5IHdvdWxkIGJlIHdoZXJlIHlvdSBhcmUgYnVpbGRpbmcgYSB1dGlsaXR5IGphciBhbmQgd2FudCB0byBtYWtlIHN1cmUgCi1jbGFzc2VzIHdoaWNoIGFyZSBvdXQgb2YgZGF0ZSB3aXRoIHJlc3BlY3QgdG8gdGhpcyBqYXIgYXJlIHJlYnVpbHQuIFlvdSBzaG91bGQKLSZsdDtiJmd0O25vdCZsdDsvYiZndDsgaW5jbHVkZSBqYXJzIGluIHRoaXMgY2xhc3NwYXRoIHdoaWNoIHlvdSBkbyBub3QgZXhwZWN0IHRvIGNoYW5nZSwgCi1zdWNoIGFzIHRoZSBKREsgcnVudGltZSBqYXIgb3IgdGhpcmQgcGFydHkgamFycywgc2luY2UgZG9pbmcgc28gd2lsbCBqdXN0IHNsb3cgCi1kb3duIHRoZSBkZXBlbmRlbmN5IGNoZWNrLiBUaGlzIG1lYW5zIHRoYXQgaWYgeW91IGRvIHVzZSBhIGNsYXNzcGF0aCBmb3IgdGhlIAotZGVwZW5kIHRhc2sgaXQgbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBjbGFzc3BhdGggbmVjZXNzYXJ5IHRvIGFjdHVhbGx5IAotY29tcGlsZSB5b3VyIGNvZGUuJmx0Oy9wJmd0OwotJmx0O2gzJmd0O1BlcmZvcm1hbmNlJmx0Oy9oMyZndDsgCi0mbHQ7cCZndDsgVGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBkZXBlbmQgdGFzayBpcyBkZXBlbmRlbnQgb24gYSAKLW51bWJlciBvZiBmYWN0b3JzIHN1Y2ggYXMgY2xhc3MgcmVsYXRpb25zaGlwIGNvbXBsZXhpdHkgYW5kIGhvdyBtYW55IGNsYXNzIGZpbGVzIAotYXJlIG91dCBvZiBkYXRlLiBUaGUgZGVjaXNpb24gYWJvdXQgd2hldGhlciBpdCBpcyBjaGVhcGVyIHRvIGp1c3QgcmVjb21waWxlIGFsbCAKLWNsYXNzZXMgb3IgdG8gdXNlIHRoZSBkZXBlbmQgdGFzayB3aWxsIGRlcGVuZCBvbiB0aGUgc2l6ZSBvZiB5b3VyIHByb2plY3QgYW5kIAotaG93IGludGVycmVsYXRlZCB5b3VyIGNsYXNzZXMgYXJlLiAmbHQ7L3AmZ3Q7Ci0mbHQ7aDMmZ3Q7TGltaXRhdGlvbnMmbHQ7L2gzJmd0OwotJmx0O3AmZ3Q7IFRoZXJlIGFyZSBzb21lIHNvdXJjZSBkZXBlbmRlbmNpZXMgd2hpY2ggZGVwZW5kIHdpbGwgbm90IGRldGVjdC4gJmx0Oy9wJmd0OwotJmx0O3VsJmd0OwotJmx0O2xpJmd0O0lmIHRoZSBKYXZhIGNvbXBpbGVyIG9wdGltaXplcyBhd2F5IGEgY2xhc3MgcmVsYXRpb25zaGlwLCAKLXRoZXJlIGNhbiBiZSBhIHNvdXJjZSBkZXBlbmRlbmN5IHdpdGhvdXQgYSBjbGFzcyBkZXBlbmRlbmN5LiAmbHQ7L2xpJmd0OwotJmx0O2xpJmd0O05vbiBwdWJsaWMgY2xhc3NlcyBjYXVzZSB0d28gcHJvYmxlbXMuIEZpcnN0bHkgZGVwZW5kIGNhbm5vdCByZWxhdGUKLXRoZSBjbGFzcyBmaWxlIHRvIGEgc291cmNlIGZpbGUuIEluIHRoZSBmdXR1cmUgdGhpcyBtYXkgYmUgYWRkcmVzc2VkCi11c2luZyB0aGUgc291cmNlIGZpbGUgYXR0cmlidXRlIGluIHRoZSBjbGFzc2ZpbGUuIFNlY29uZGx5LCBuZWl0aGVyIAotZGVwZW5kIG5vciB0aGUgY29tcGlsZXIgdGFza3MgY2FuIGRldGVjdCB3aGVuIGEgbm9uIHB1YmxpYyBjbGFzcyBpcwotbWlzc2luZy4gSW5uZXIgY2xhc3NlcyBhcmUgaGFuZGxlZCBieSB0aGUgZGVwZW5kIHRhc2suJmx0Oy9saSZndDsKLSZsdDsvdWwmZ3Q7Ci1UaGUgbW9zdCBvYnZpb3VzIGV4YW1wbGUgb2YgdGhlc2UgbGltaXRhdGlvbnMgaXMgdGhhdCB0aGUgdGFzayBjYW4ndCB0ZWxsCi13aGljaCBjbGFzc2VzIHRvIHJlY29tcGlsZSB3aGVuIGEgY29uc3RhbnQgcHJpbWl0aXZlIGRhdGEgdHlwZSBleHBvcnRlZCAKLWJ5IG90aGVyIGNsYXNzZXMgaXMgY2hhbmdlZC4gRm9yIGV4YW1wbGUsIGEgY2hhbmdlIGluIHRoZSBkZWZpbml0aW9uIG9mCi1zb21ldGhpbmcgbGlrZQotJmx0O3ByZSZndDsKLXB1YmxpYyBmaW5hbCBjbGFzcyBDb25zdGFudHMgewotcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIERFQlVHPWZhbHNlOwotfQotJmx0Oy9wcmUmZ3Q7IHdpbGwgbm90IGJlIHBpY2tlZCB1cCBieSBvdGhlciBjbGFzc2VzLgotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJzcmNkaXIiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPlRoaXMgaXMgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgc291cmNlIGV4aXN0cy4gZGVwZW5kd2lsbCBleGFtaW5lIHRoaXMgdG8gZGV0ZXJtaW5lIHdoaWNoIGNsYXNzZXMgYXJlIG91dCBvZiBkYXRlLiBJZiB5b3UgdXNlIG11bHRpcGxlc291cmNlIGRpcmVjdG9yaWVzIHlvdSBjYW4gcGFzcyB0aGlzIGF0dHJpYnV0ZSBhIHBhdGggb2Ygc291cmNlIGRpcmVjdG9yaWVzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkZXN0ZGlyIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlRoaXMgaXMgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBjbGFzcyBmaWxlcyB3aGljaHdpbGwgYmUgYW5hbHlzZWQuIElmIHRoaXMgaXMgbm90IHByZXNlbnQsIHRoZSBzcmNkaXIgaXMgdXNlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY2FjaGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhpcyBpcyBhIGRpcmVjdG9yeSBpbiB3aGljaCBkZXBlbmQgY2FuIHN0b3JlIGFuZHJldHJpZXZlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24uIElmIHRoaXMgaXMgbm90IHByZXNlbnQsIGRlcGVuZCB3aWxsIG5vdHVzZSBhIGNhY2hlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJjbG9zdXJlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlRoaXMgYXR0cmlidXRlIGNvbnRyb2xzIHdoZXRoZXIgZGVwZW5kIG9ubHkgcmVtb3Zlc2NsYXNzZXMgd2hpY2ggZGlyZWN0bHkgZGVwZW5kIG9uIG91dCBvZiBkYXRlIGNsYXNzZXMuIElmIHRoaXMgaXMgc2V0IHRvIHRydWUsZGVwZW5kIHdpbGwgdHJhdmVyc2UgdGhlIGNsYXNzIGRlcGVuZGVuY3kgZ3JhcGggZGVsZXRpbmcgYWxsIGFmZmVjdGVkY2xhc3Nlcy4gRGVmYXVsdHMgdG8gZmFsczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZHVtcCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5JZiB0cnVlIHRoZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgZGVidWcgbGV2ZWwgbG9nPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJjbGFzc3BhdGgiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGNsYXNzcGF0aCBjb250YWluZyBqYXJzIGFuZCBjbGFzc2VzIGZvciB3aGljaCAmbHQ7ZGVwZW5kJmd0OyBzaG91bGQgYWxzb2NoZWNrIGRlcGVuZGVuY2llPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9ImVjaG9wcm9wZXJ0aWVzIj4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0Rpc3BsYXlzIGFsbCB0aGUgY3VycmVudCBwcm9wZXJ0aWVzIGluIHRoZSBwcm9qZWN0LiAgVGhlIG91dHB1dCBjYW4gYmUKLXNlbnQgdG8gYSBmaWxlIGlmIGRlc2lyZWQuIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGEgc3Vic2V0IG9mIHByb3BlcnRpZXMKLXRvIHNhdmUgYnkgbmFtaW5nIGEgcHJlZml4OiBvbmx5IHByb3BlcnRpZXMgc3RhcnRpbmcgd2l0aCB0aGlzCi1wcmVmaXggd2lsbCBiZSBzYXZlZC4gVGhpcyB0YXNrIGNhbiBiZSB1c2VkIGFzIGEgc29tZXdoYXQgY29udHJpdmVkCi1tZWFucyBvZiByZXR1cm5pbmcgZGF0YSBmcm9tIGFuICZsdDt0dCZndDsmYW1wO2x0O2FudCZhbXA7Z3Q7Jmx0Oy90dCZndDsgaW52b2NhdGlvbiwKLWJ1dCBpcyByZWFsbHkgZm9yIGRlYnVnZ2luZyBidWlsZGZpbGVzLiZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0iZGVzdGZpbGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+SWYgc3BlY2lmaWVkLCB0aGUgdmFsdWUgaW5kaWNhdGVzIHRoZSBuYW1lIG9mIHRoZWZpbGUgdG8gc2VuZCB0aGUgb3V0cHV0IG9mIHRoZSBzdGF0ZW1lbnQgdG8uICBUaGUgZ2VuZXJhdGVkIG91dHB1dCBmaWxlaXMgY29tcGF0aWJsZSBmb3IgbG9hZGluZyBieSBhbnkgSmF2YSBhcHBsaWNhdGlvbiBhcyBhIHByb3BlcnR5IGZpbGUuSWYgbm90IHNwZWNpZmllZCwgdGhlbiB0aGUgb3V0cHV0IHdpbGwgZ28gdG8gdGhlIEFudCBsb2c8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InByZWZpeCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5hIHByZWZpeCB3aGljaCBpcyB1c2VkIHRvIGZpbHRlciB0aGUgcHJvcGVydGllc29ubHkgdGhvc2UgcHJvcGVydGllcyBzdGFydGluZyB3aXRoIHRoaXMgcHJlZml4IHdpbGwgYmUgZWNob2VkLjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZmFpbG9uZXJyb3IiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+QnkgZGVmYXVsdCwgdGhlICZxdW90O2ZhaWxvbmVycm9yJnF1b3Q7IGF0dHJpYnV0ZSBpcyBlbmFibGVkLklmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB3cml0aW5nIHRoZSBwcm9wZXJ0aWVzIHRvIGEgZmlsZSwgYW5kIHRoaXNhdHRyaWJ1dGUgaXMgZW5hYmxlZCwgdGhlbiBhIEJ1aWxkRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLCBjYXVzaW5nIHRoZWJ1aWxkIHRvIGZhaWwuICBJZiBkaXNhYmxlZCwgdGhlbiBJTyBlcnJvcnMgd2lsbCBiZSByZXBvcnRlZCBhcyBhIGxvZ3N0YXRlbWVudCwgYW5kIHRoZSBidWlsZCB3aWxsIGNvbnRpbnVlIHdpdGhvdXQgZmFpbHVyZSBmcm9tIHRoaXMgdGFzazwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJmdHAiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7VGhlIGZ0cCB0YXNrIGltcGxlbWVudHMgYSBiYXNpYyBGVFAgY2xpZW50IHRoYXQgY2FuIHNlbmQsIHJlY2VpdmUsCi1saXN0LCBkZWxldGUgZmlsZXMsIGFuZCBjcmVhdGUgZGlyZWN0b3JpZXMuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBhbmQgZXhhbXBsZXMgb2YgaG93Ci10byBwZXJmb3JtIGVhY2ggdGFzay4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsmbHQ7YiZndDtOb3RlOiZsdDsvYiZndDsgVGhpcyB0YXNrIGRlcGVuZHMgb24gZXh0ZXJuYWwgbGlicmFyaWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUgQW50IGRpc3RyaWJ1dGlvbi4KLVNlZSAmbHQ7YSBocmVmPSZxdW90Oy4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzJnF1b3Q7Jmd0O0xpYnJhcnkgRGVwZW5kZW5jaWVzJmx0Oy9hJmd0OyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtUaGUgZnRwIHRhc2sgbWFrZXMgbm8gYXR0ZW1wdCB0byBkZXRlcm1pbmUgd2hhdCBmaWxlIHN5c3RlbSBzeW50YXggaXMKLXJlcXVpcmVkIGJ5IHRoZSByZW1vdGUgc2VydmVyLCBhbmQgZGVmYXVsdHMgdG8gVW5peCBzdGFuZGFyZHMuCi0mbHQ7aSZndDtyZW1vdGVkaXImbHQ7L2kmZ3Q7IG11c3QgYmUgc3BlY2lmaWVkIGluIHRoZSBleGFjdCBzeW50YXggcmVxdWlyZWQgYnkgdGhlIGZ0cAotc2VydmVyLiBJZiB0aGUgdXN1YWwgVW5peCBjb252ZW50aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgc2VydmVyLAotJmx0O2kmZ3Q7c2VwYXJhdG9yJmx0Oy9pJmd0OyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGZpbGUgc2VwYXJhdG9yIHRoYXQgc2hvdWxkIGJlIHVzZWQKLWluc3RlYWQuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7U2VlIHRoZSBzZWN0aW9uIG9uICZsdDthIGhyZWY9JnF1b3Q7Li4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzJnF1b3Q7Jmd0O2RpcmVjdG9yeSBiYXNlZAotdGFza3MmbHQ7L2EmZ3Q7LCBvbiBob3cgdGhlIGluY2x1c2lvbi9leGNsdXNpb24gb2YgZmlsZXMgd29ya3MsIGFuZCBob3cgdG8KLXdyaXRlIHBhdHRlcm5zLiZsdDsvcCZndDsKLSZsdDtwJmd0OwotJmx0O2ImZ3Q7V2FybmluZzogJmx0Oy9iJmd0OyBmb3IgdGhlIGdldCBhbmQgZGVsZXRlIGFjdGlvbnMgdG8gd29yayBwcm9wZXJseSAKLXdpdGggYSBXaW5kb3dzIDIwMDAgZnRwIHNlcnZlciwgaXQgbmVlZHMgdG8gYmUgY29uZmlndXJlZCB0byBnZW5lcmF0ZQotVW5peCBzdHlsZSBsaXN0aW5ncywgYW5kIG5vdCB0aGUgZGVmYXVsdCBNUy1ET1MgbGlzdGluZy4gT3Igc29tZW9uZSBuZWVkcyB0byB3cml0ZQotdGhlIGNvZGUgdG8gcGFyc2UgTVMtRE9TIGxpc3RpbmdzIC1hbnkgdGFrZXJzPwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJzZXJ2ZXIiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPnRoZSBhZGRyZXNzIG9mIHRoZSByZW1vdGUgZnRwIHNlcnZlcjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0icG9ydCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj50aGUgcG9ydCBudW1iZXIgb2YgdGhlIHJlbW90ZSBmdHAgc2VydmVyLkRlZmF1bHRzIHRvIHBvcnQgMjE8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InVzZXJpZCIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGxvZ2luIGlkIHRvIHVzZSBvbiB0aGUgZnRwIHNlcnZlcjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0icGFzc3dvcmQiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPnRoZSBsb2dpbiBwYXNzd29yZCB0byB1c2Ugb24gdGhlIGZ0cCBzZXJ2ZXI8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InJlbW90ZWRpciIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj50aGUgZGlyZWN0b3J5IHRvIHdoaWNoIHRvIHVwbG9hZCBmaWxlcyBvbiB0aGUgZnRwIHNlcnZlcjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iYWN0aW9uIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBmdHAgYWN0aW9uIHRvIHBlcmZvcm0sIGRlZmF1bHRpbmcgdG8gJnF1b3Q7c2VuZCZxdW90Oy4gIEN1cnJlbnRseSBzdXBwb3J0cyAmcXVvdDtwdXQmcXVvdDssICZxdW90O2dldCZxdW90OywmcXVvdDtkZWwmcXVvdDssICZxdW90O2xpc3QmcXVvdDssICZxdW90O2NobW9kJnF1b3Q7IGFuZCAmcXVvdDtta2RpciZxdW90OzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iYmluYXJ5IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnNlbGVjdHMgYmluYXJ5LW1vZGUgKCZxdW90O3llcyZxdW90Oykgb3IgdGV4dC1tb2RlICgmcXVvdDtubyZxdW90OykgdHJhbnNmZXJzLiAgRGVmYXVsdHMgdG8gJnF1b3Q7eWVzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJwYXNzaXZlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnNlbGVjdHMgcGFzc2l2ZS1tb2RlICgmcXVvdDt5ZXMmcXVvdDspIHRyYW5zZmVycy4gIERlZmF1bHRzIHRvICZxdW90O25vPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ2ZXJib3NlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmRpc3BsYXlzIGluZm9ybWF0aW9uIG9uIGVhY2ggZmlsZSB0cmFuc2ZlcnJlZCBpZiBzZXQgdG8gJnF1b3Q7eWVzJnF1b3Q7LiBEZWZhdWx0cyB0byAmcXVvdDtubyZxdW90OzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZGVwZW5kcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj50cmFuc2ZlcnMgb25seSBuZXcgb3IgY2hhbmdlZCBmaWxlcyBpZiBzZXQgdG8gJnF1b3Q7eWVzJnF1b3Q7LiBEZWZhdWx0cyB0byAmcXVvdDtubyZxdW90OzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibmV3ZXIiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+YSBzeW5vbnltIGZvciBkZXBlbmRzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzZXBhcmF0b3IiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+c2V0cyB0aGUgZmlsZSBzZXBhcmF0b3IgdXNlZCBvbiB0aGUgZnRwIHNlcnZlci5EZWZhdWx0cyB0byAmcXVvdDsvJnF1b3Q7PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ1bWFzayIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5zZXRzIHRoZSBkZWZhdWx0IGZpbGUgcGVybWlzc2lvbnMgZm9yIG5ldyBmaWxlcyx1bml4IG9ubHk8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNobW9kIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnNldHMgb3IgY2hhbmdlcyBmaWxlIHBlcm1pc3Npb25zIGZvciBuZXcgb3IgZXhpc3RpbmcgZmlsZXMsdW5peCBvbmx5LiBJZiB1c2VkIHdpdGggYSBwdXQgYWN0aW9uLCBjaG1vZCB3aWxsIGJlIGlzc3VlZCBmb3IgZWFjaCBmaWxlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJsaXN0aW5nIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBmaWxlIHRvIHdyaXRlIHJlc3VsdHMgb2YgdGhlICZxdW90O2xpc3QmcXVvdDsgYWN0aW9uLlJlcXVpcmVkIGZvciB0aGUgJnF1b3Q7bGlzdCZxdW90OyBhY3Rpb24sIGlnbm9yZWQgb3RoZXJ3aXNlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJpZ25vcmVub25jcml0aWNhbGVycm9ycyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5mbGFnIHdoaWNoIHBlcm1pdHMgdGhlIHRhc2sgdG8gaWdub3JlIHNvbWUgbm9uLWZhdGFsIGVycm9yY29kZXMgc2VudCBieSBzb21lIHNlcnZlcnMgZHVyaW5nIGRpcmVjdG9yeSBjcmVhdGlvbjogd3UtZnRwIGluIHBhcnRpY3VsYXIuRGVmYXVsdDogZmFsczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ic2tpcGZhaWxlZHRyYW5zZmVycyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5mbGFnIHdoaWNoIGVuYWJsZXMgdW5zdWNjZXNzZnVsIGZpbGUgcHV0LCBkZWxldGVhbmQgZ2V0IG9wZXJhdGlvbnMgdG8gYmUgc2tpcHBlZCB3aXRoIGEgd2FybmluZyBhbmQgdGhlcmVtYWluZGVyIG9mIHRoZSBmaWxlcyBzdGlsbCB0cmFuc2ZlcnJlZC4gRGVmYXVsdDogZmFsczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJpY29udHJhY3QiPgotCQk8REVTQ1JJUFRJT04+Jmx0O1AmZ3Q7Ci1JbnN0cnVtZW50cyBKYXZhIGNsYXNzZXMgd2l0aCAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cucmVsaWFibGUtc3lzdGVtcy5jb20vdG9vbHMvJnF1b3Q7Jmd0O2lDb250cmFjdCZsdDsvYSZndDsKLURCQyBwcmVwcm9jZXNzb3IuJmx0O2JyJmd0OwotVGhlIHRhc2sgY2FuIGdlbmVyYXRlIGEgcHJvcGVydGllcyBmaWxlIGZvciAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly9ob21lLnNvbC5uby9+aGVsbGVzb3kvaWNwbHVzLmh0bWwmcXVvdDsmZ3Q7aUNvbnRyb2wmbHQ7L2EmZ3Q7LAotYSBncmFwaGljYWwgdXNlciBpbnRlcmZhY2UgdGhhdCBsZXRzIHlvdSB0dXJuIG9uL29mZiBhc3NlcnRpb25zLiBpQ29udHJvbCBnZW5lcmF0ZXMgYSBjb250cm9sIGZpbGUgdGhhdCB5b3UgY2FuIHJlZmVyIHRvCi1mcm9tIHRoaXMgdGFzayB1c2luZyB0aGUgY29udHJvbGZpbGUgYXR0cmlidXRlLgotJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJzcmNkaXIiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPkxvY2F0aW9uIG9mIHRoZSBqYXZhIGZpbGVzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJpbnN0cnVtZW50ZGlyIiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj5JbmRpY2F0ZXMgd2hlcmUgdGhlIGluc3RydW1lbnRlZCBzb3VyY2UgZmlsZXMgc2hvdWxkIGdvPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJyZXBvc2l0b3J5ZGlyIiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj5JbmRpY2F0ZXMgd2hlcmUgdGhlIHJlcG9zaXRvcnkgc291cmNlIGZpbGVzIHNob3VsZCBnbzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iYnVpbGRkaXIiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+SW5kaWNhdGVzIHdoZXJlIHRoZSBjb21waWxlZCBpbnN0cnVtZW50ZWQgY2xhc3NlcyBzaG91bGQgZ28uRGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIGluc3RydW1lbnRkaXIuTk9URTogRG9uJ3QgdXNlIHRoZSBzYW1lIGRpcmVjdG9yeSBmb3IgY29tcGlsZWQgaW5zdHJ1bWVudGVkIGNsYXNzZXNhbmQgdW5pbnN0cnVtZW50ZWQgY2xhc3Nlcy4gSXQgd2lsbCBicmVhayB0aGUgZGVwZW5kZW5jeSBjaGVja2luZy4gKENsYXNzZXMgd2lsbG5vdCBiZSByZWluc3RydW1lbnRlZCBpZiB5b3UgY2hhbmdlIHRoZW0pPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJyZXBvc2l0b3J5YnVpbGRkaXIiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+SW5kaWNhdGVzIHdoZXJlIHRoZSBjb21waWxlZCByZXBvc2l0b3J5IGNsYXNzZXMgc2hvdWxkIGdvLkRlZmF1bHRzIHRvIHRoZSB2YWx1ZSBvZiByZXBvc2l0b3J5ZGlyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJwcmUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+SW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIGluc3RydW1lbnQgZm9yIHByZWNvbmRpdGlvbnMuRGVmYXVsdHMgdG8gdHJ1ZSB1bmxlc3MgY29udHJvbGZpbGUgaXMgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIGl0ZGVmYXVsdHMgdG8gZmFsc2U8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InBvc3QiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+SW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIGluc3RydW1lbnQgZm9yIHBvc3Rjb25kaXRpb25zLkRlZmF1bHRzIHRvIHRydWUgdW5sZXNzIGNvbnRyb2xmaWxlIGlzIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSBpdGRlZmF1bHRzIHRvIGZhbHNlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJpbnZhcmlhbnQiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+SW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIGluc3RydW1lbnQgZm9yIGludmFyaWFudHMuRGVmYXVsdHMgdG8gdHJ1ZSB1bmxlc3MgY29udHJvbGZpbGUgaXMgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIGl0ZGVmYXVsdHMgdG8gZmFsc2U8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZhaWx0aHJvd2FibGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGZ1bGwgbmFtZSBvZiB0aGUgVGhyb3dhYmxlIChFeGNlcHRpb24pIHRoYXQgc2hvdWxkIGJldGhyb3duIHdoZW4gYW4gYXNzZXJ0aW9uIGlzIHZpb2xhdGVkLiBEZWZhdWx0cyB0byBqYXZhLmxhbmcuRXJybzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idmVyYm9zaXR5IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkluZGljYXRlcyB0aGUgdmVyYm9zaXR5IGxldmVsIG9mIGlDb250cmFjdC4gQW55IGNvbWJpbmF0aW9ub2YgZXJyb3IqLHdhcm5pbmcqLG5vdGUqLGluZm8qLHByb2dyZXNzKixkZWJ1ZyogKGNvbW1hIHNlcGFyYXRlZCkgY2FuIGJldXNlZC4gRGVmYXVsdHMgdG8gZXJyb3I8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InF1aWV0IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkluZGljYXRlcyBpZiBpQ29udHJhY3Qgc2hvdWxkIGJlIHF1aWV0LiBUdXJuIGl0IG9mZiBpZiBtYW55IHlvdXIgY2xhc3NlcyBleHRlbmQgdW5pbnN0cnVtZW50ZWQgY2xhc3Nlc2FuZCB5b3UgZG9uJ3Qgd2FudCB3YXJuaW5ncyBhYm91dCB0aGlzLiBEZWZhdWx0cyB0byBmYWxzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ1cGRhdGVpY29udHJvbCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5JZiBzZXQgdG8gdHJ1ZSwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIHByb3BlcnRpZXMgZmlsZSBmb3JpQ29udHJvbCBpbiB0aGUgY3VycmVudCBkaXJlY3Rvcnkgc2hvdWxkIGJlIHVwZGF0ZWQgKG9yIGNyZWF0ZWQgaWYgaXQgZG9lc24ndCBleGlzdCkuRGVmYXVsdHMgdG8gZmFsc2U8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNvbnRyb2xmaWxlIiBSRVFVSVJFRD0ib25seSBpZiB1cGRhdGVpY29udHJvbD10cnVlIj4KLQkJCTxERVNDUklQVElPTj5UaGUgbmFtZSBvZiB0aGUgY29udHJvbCBmaWxlIHRvIHBhc3MgdG8gaUNvbnRyYWN0LiBDb25zaWRlciB1c2luZyBpQ29udHJvbCB0byBnZW5lcmF0ZSB0aGUgZmlsZS5EZWZhdWx0IGlzIG5vdCB0byBwYXNzIGEgZmlsZS48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNsYXNzZGlyIiBSRVFVSVJFRD0ib25seSBpZiB1cGRhdGVpY29udHJvbD10cnVlIj4KLQkJCTxERVNDUklQVElPTj5JbmRpY2F0ZXMgd2hlcmUgY29tcGlsZWQgKHVuaXN0cnVtZW50ZWQpIGNsYXNzZXMgYXJlIGxvY2F0ZWQuVGhpcyBpcyByZXF1aXJlZCBpbiBvcmRlciB0byBwcm9wZXJseSB1cGRhdGUgdGhlIGljb250cm9sLnByb3BlcnRpZXMgZmlsZSwgbm90Zm9yIGluc3RydW1lbnRhdGlvbjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idGFyZ2V0cyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5OYW1lIG9mIHRoZSBmaWxlIHRoYXQgd2lsbCBiZSBnZW5lcmF0ZWQgYnkgdGhpcyB0YXNrLCB3aGljaCBsaXN0cyBhbGwgdGhlY2xhc3NlcyB0aGF0IGlDb250cmFjdCB3aWxsIGluc3RydW1lbnQuIElmIHNwZWNpZmllZCwgdGhlIGZpbGUgd2lsbCBub3QgYmUgZGVsZXRlZCBhZnRlciBleGVjdXRpb24uSWYgbm90IHNwZWNpZmllZCwgYSBmaWxlIHdpbGwgc3RpbGwgYmUgY3JlYXRlZCwgYnV0IGl0IHdpbGwgYmUgZGVsZXRlZCBhZnRlciBleGVjdXRpb248L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0iamFybGliLWF2YWlsYWJsZSI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtDaGVjayB3aGV0aGVyIGFuIGV4dGVuc2lvbiBpcyBwcmVzZW50IGluIGEgZmlsZXNldCBvciBhbiBleHRlbnNpb25TZXQuCi1JZiB0aGUgZXh0ZW5zaW9uIGlzIHByZXNlbnQgdGhlbiBhIHByb3BlcnR5IGlzIHNldC4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtOb3RlIHRoYXQgdGhpcyB0YXNrCi13b3JrcyB3aXRoIGV4dGVuc2lvbnMgYXMgZGVmaW5lZCBieSB0aGUgJnF1b3Q7T3B0aW9uYWwgUGFja2FnZSZxdW90OyBzcGVjaWZpY2F0aW9uLgotRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3B0aW9uYWwgcGFja2FnZXMsIHNlZSB0aGUgZG9jdW1lbnQKLSZsdDtlbSZndDtPcHRpb25hbCBQYWNrYWdlIFZlcnNpb25pbmcmbHQ7L2VtJmd0OyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBidW5kbGUgZm9yIHlvdXIKLUphdmEyIFN0YW5kYXJkIEVkaXRpb24gcGFja2FnZSwgaW4gZmlsZQotJmx0O2NvZGUmZ3Q7Z3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWwmbHQ7L2NvZGUmZ3Q7IG9yIG9ubGluZSBhdAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWwmcXVvdDsmZ3Q7Ci1odHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWwmbHQ7L2EmZ3Q7LiZsdDsvcCZndDsKLSZsdDtwJmd0O1NlZSB0aGUgRXh0ZW5zaW9uIGFuZCBFeHRlbnNpb25TZXQgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBkZXRhaWxzJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJwcm9wZXJ0eSIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIG5hbWUgb2YgcHJvcGVydHkgdG8gc2V0IGlmIGV4dGVuc2lvbnMgaXMgYXZhaWxhYmxlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJmaWxlIiBSRVFVSVJFRD0ibm8sIG9uZSBvZiBmaWxlLCBuZXN0ZWQKLSAgICAgZXh0ZW5zaW9uc2V0IG9yIG5lc3RlZCBmaWxlc2V0IG11c3QgYmUgcHJlc2VudC4iPgotCQkJPERFU0NSSVBUSU9OPlRoZSBmaWxlIHRvIGNoZWNrIGZvciBleHRlbnNpbzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJqYXJsaWItZGlzcGxheSI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtEaXNwbGF5IHRoZSAmcXVvdDtPcHRpb25hbCBQYWNrYWdlJnF1b3Q7IGFuZCAmcXVvdDtQYWNrYWdlIFNwZWNpZmljYXRpb24mcXVvdDsgaW5mb3JtYXRpb24KLWNvbnRhaW5lZCB3aXRoaW4gdGhlIHNwZWNpZmllZCBqYXJzLiZsdDsvcCZndDsKLSZsdDtwJmd0O05vdGUgdGhhdCB0aGlzIHRhc2sKLXdvcmtzIHdpdGggZXh0ZW5zaW9ucyBhcyBkZWZpbmVkIGJ5IHRoZSAmcXVvdDtPcHRpb25hbCBQYWNrYWdlJnF1b3Q7IHNwZWNpZmljYXRpb24uCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvcHRpb25hbCBwYWNrYWdlcywgc2VlIHRoZSBkb2N1bWVudAotJmx0O2VtJmd0O09wdGlvbmFsIFBhY2thZ2UgVmVyc2lvbmluZyZsdDsvZW0mZ3Q7IGluIHRoZSBkb2N1bWVudGF0aW9uIGJ1bmRsZSBmb3IgeW91cgotSmF2YTIgU3RhbmRhcmQgRWRpdGlvbiBwYWNrYWdlLCBpbiBmaWxlCi0mbHQ7Y29kZSZndDtndWlkZS9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbCZsdDsvY29kZSZndDsgb3Igb25saW5lIGF0Ci0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy9ndWlkZS9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbCZxdW90OyZndDsKLWh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy9ndWlkZS9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbCZsdDsvYSZndDsuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7U2VlIHRoZSBFeHRlbnNpb24gYW5kIEV4dGVuc2lvblNldCBkb2N1bWVudGF0aW9uIGZvciBmdXJ0aGVyIGRldGFpbHMmbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9ImZpbGUiIFJFUVVJUkVEPSJubywgYnV0IG9uZSBvZiBmaWxlIG9yIGZpbGVzZXQgbXVzdCBiZQotICAgICBwcmVzZW50LiI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGZpbGUgdG8gZGlzcGxheSBleHRlbnNpb24gaW5mb3JtYXRpb24gYWJvdXQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0iamFybGliLW1hbmlmZXN0Ij4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O1Rhc2sgdG8gZ2VuZXJhdGUgYSBtYW5pZmVzdCB0aGF0IGRlY2xhcmVzIGFsbCB0aGUgZGVwZW5kZW5jaWVzCi1pbiBtYW5pZmVzdC4gVGhlIGRlcGVuZGVuY2llcyBhcmUgZGV0ZXJtaW5lZCBieSBsb29raW5nIGluIHRoZQotc3BlY2lmaWVkIHBhdGggYW5kIHNlYXJjaGluZyBmb3IgRXh0ZW5zaW9uIC8gJnF1b3Q7T3B0aW9uYWwgUGFja2FnZSZxdW90Owotc3BlY2lmaWNhdGlvbnMgaW4gdGhlIG1hbmlmZXN0cyBvZiB0aGUgamFycy4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtOb3RlIHRoYXQgdGhpcyB0YXNrCi13b3JrcyB3aXRoIGV4dGVuc2lvbnMgYXMgZGVmaW5lZCBieSB0aGUgJnF1b3Q7T3B0aW9uYWwgUGFja2FnZSZxdW90OyBzcGVjaWZpY2F0aW9uLgotRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3B0aW9uYWwgcGFja2FnZXMsIHNlZSB0aGUgZG9jdW1lbnQKLSZsdDtlbSZndDtPcHRpb25hbCBQYWNrYWdlIFZlcnNpb25pbmcmbHQ7L2VtJmd0OyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBidW5kbGUgZm9yIHlvdXIKLUphdmEyIFN0YW5kYXJkIEVkaXRpb24gcGFja2FnZSwgaW4gZmlsZQotJmx0O2NvZGUmZ3Q7Z3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWwmbHQ7L2NvZGUmZ3Q7IG9yIG9ubGluZSBhdAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWwmcXVvdDsmZ3Q7Ci1odHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWwmbHQ7L2EmZ3Q7LiZsdDsvcCZndDsKLSZsdDtwJmd0O1NlZSB0aGUgRXh0ZW5zaW9uIGFuZCBFeHRlbnNpb25TZXQgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBkZXRhaWxzJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJkZXN0ZmlsZSIgUkVRVUlSRUQ9Inllcy4iPgotCQkJPERFU0NSSVBUSU9OPlRoZSBmaWxlIHRvIGdlbmVyYXRlIE1hbmlmZXN0IGludDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJqYXJsaWItcmVzb2x2ZSI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtUcnkgdG8gbG9jYXRlIGEgamFyIHRvIHNhdGlzZnkgYW4gZXh0ZW5zaW9uIGFuZCBwbGFjZQotbG9jYXRpb24gb2YgamFyIGludG8gcHJvcGVydHkuIFRoZSB0YXNrIGFsbG93cyB5b3UgdG8KLWFkZCBhIG51bWJlciBvZiByZXNvbHZlcnMgdGhhdCBhcmUgY2FwYWJsZSBvZiBsb2NhdGluZyBhCi1saWJyYXJ5IGZvciBhIHNwZWNpZmMgZXh0ZW5zaW9uLiBFYWNoIHJlc29sdmVyIHdpbGwgYmUgYXR0ZW1wdGVkCi1pbiBzcGVjaWZpZWQgb3JkZXIgdW50aWwgbGlicmFyeSBpcyBmb3VuZCBvciBubyByZXNvbHZlcnMgYXJlIGxlZnQuCi1JZiBubyByZXNvbHZlcnMgYXJlIGxlZnQgYW5kIGZhaWxPbkVycm9yIGlzIHRydWUgdGhlbiBhIEJ1aWxkRXhjZXB0aW9uCi13aWxsIGJlIHRocm93bi4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtOb3RlIHRoYXQgdGhpcyB0YXNrCi13b3JrcyB3aXRoIGV4dGVuc2lvbnMgYXMgZGVmaW5lZCBieSB0aGUgJnF1b3Q7T3B0aW9uYWwgUGFja2FnZSZxdW90OyBzcGVjaWZpY2F0aW9uLgotRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3B0aW9uYWwgcGFja2FnZXMsIHNlZSB0aGUgZG9jdW1lbnQKLSZsdDtlbSZndDtPcHRpb25hbCBQYWNrYWdlIFZlcnNpb25pbmcmbHQ7L2VtJmd0OyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBidW5kbGUgZm9yIHlvdXIKLUphdmEyIFN0YW5kYXJkIEVkaXRpb24gcGFja2FnZSwgaW4gZmlsZQotJmx0O2NvZGUmZ3Q7Z3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWwmbHQ7L2NvZGUmZ3Q7IG9yIG9ubGluZSBhdAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWwmcXVvdDsmZ3Q7Ci1odHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWwmbHQ7L2EmZ3Q7LiZsdDsvcCZndDsKLSZsdDtwJmd0O1NlZSB0aGUgRXh0ZW5zaW9uIGFuZCBFeHRlbnNpb25TZXQgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBkZXRhaWxzJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJwcm9wZXJ0eSIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIG5hbWUgb2YgcHJvcGVydHkgdG8gc2V0IHRvIGxpYnJhcnkgbG9jYXRpb248L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZhaWxvbmVycm9yIiBSRVFVSVJFRD0ibm8sIGRlZmF1bHRzIHRvIHRydWUuIj4KLQkJCTxERVNDUklQVElPTj5UcnVlIGlmIGZhaWx1cmUgdG8gbG9jYXRlIGxpYnJhcnkgc2hvdWxkIHJlc3VsdCBpbiBidWlsZCBleGNlcHRpb248L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNoZWNrZXh0ZW5zaW9uIiBSRVFVSVJFRD0ibm8sIGRlZmF1bHRzIHRvIHRydWUuIj4KLQkJCTxERVNDUklQVElPTj5UcnVlIGlmIGxpYnJhcnlzIHJldHVybmVkIGJ5IG5lc3RlZCByZXNvbHZlcnMgc2hvdWxkIGJlIGNoZWNrZWQgdG8gc2VlIGlmdGhleSBzdXBwbHkgZXh0ZW5zaW9uPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9ImphdmFjYyI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDsKLUludm9rZXMgdGhlICZsdDthIEhSRUY9JnF1b3Q7aHR0cDovL3d3dy53ZWJnYWluLmNvbS9wcm9kdWN0cy9qYXZhX2NjLyZxdW90OyB0YXJnZXQ9JnF1b3Q7X3RvcCZxdW90OyZndDtKYXZhQ0MmbHQ7L2EmZ3Q7IGNvbXBpbGVyIAotY29tcGlsZXIgb24gYSBncmFtbWFyIGZpbGUuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLVRvIHVzZSB0aGUgamF2YWNjIHRhc2ssIHNldCB0aGUgJmx0O2kmZ3Q7dGFyZ2V0Jmx0Oy9pJmd0OyBhdHRyaWJ1dGUgdG8gdGhlIG5hbWUgb2YgdGhlIAotZ3JhbW1hciBmaWxlIHRvIHByb2Nlc3MuICBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIAotdGhlIEphdmFDQyBpbnN0YWxsYXRpb24gdXNpbmcgdGhlICZsdDtpJmd0O2phdmFjY2hvbWUmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSwgc28gdGhhdCBhbnQgCi1jYW4gZmluZCB0aGUgSmF2YUNDIGNsYXNzZXMuICBPcHRpb25hbGx5LCB5b3UgY2FuIGFsc28gc2V0IHRoZSAKLSZsdDtpJmd0O291dHB1dGRpcmVjdG9yeSZsdDsvaSZndDsgdG8gd3JpdGUgdGhlIGdlbmVyYXRlZCBmaWxlIHRvIGEgc3BlY2lmaWMgZGlyZWN0b3J5LgotT3RoZXJ3aXNlIGphdmFjYyB3cml0ZXMgdGhlIGdlbmVyYXRlZCBmaWxlcyB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcKLXRoZSBncmFtbWFyIGZpbGUuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLVRoaXMgdGFzayBvbmx5IGludm9rZXMgSmF2YUNDIGlmIHRoZSBncmFtbWFyIGZpbGUgaXMgbmV3ZXIgdGhhbiB0aGUgZ2VuZXJhdGVkIAotSmF2YSBmaWxlcy4gIGphdmFjYyBhc3N1bWVzIHRoYXQgdGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHBhcnNlcgotaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgdGhlIGdyYW1tYXIgZmlsZSwgaWdub3JpbmcgdGhlIC5qai4KLUlmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCB0aGUgamF2YWNjIHRhc2sgd2lsbCBzdGlsbCB3b3JrLCBidXQgaXQgd2lsbCBhbHdheXMgCi1nZW5lcmF0ZSB0aGUgb3V0cHV0IGZpbGVzLgotJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJ0YXJnZXQiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPlRoZSBncmFtbWFyIGZpbGUgdG8gcHJvY2VzczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iamF2YWNjaG9tZSIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBKYXZhQ0MgZGlzdHJpYnV0aW9uPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJvdXRwdXRkaXJlY3RvcnkiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGRpcmVjdG9yeSB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIHRvLiAgSWYgbm90IHNldCwgdGhlIGZpbGVzYXJlIHdyaXR0ZW4gdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBncmFtbWFyIGZpbGUuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJidWlsZHBhcnNlciIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TZXRzIHRoZSBCVUlMRF9QQVJTRVIgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb248L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImJ1aWxkdG9rZW5tYW5hZ2VyIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlNldHMgdGhlIEJVSUxEX1RPS0VOX01BTkFHRVIgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb248L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNhY2hldG9rZW5zIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlNldHMgdGhlIENBQ0hFX1RPS0VOUyBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY2hvaWNlYW1iaWd1aXR5Y2hlY2siIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U2V0cyB0aGUgQ0hPSUNFX0FNQklHVUlUWV9DSEVDSyBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYW4gaW50ZWdlciBvcHRpb248L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNvbW1vbnRva2VuYWN0aW9uIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlNldHMgdGhlIENPTU1PTl9UT0tFTl9BQ1RJT04gZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb248L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImRlYnVnbG9va2FoZWFkIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlNldHMgdGhlIERFQlVHX0xPT0tBSEVBRCBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZGVidWdwYXJzZXIiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U2V0cyB0aGUgREVCVUdfUEFSU0VSIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkZWJ1Z3Rva2VubWFuYWdlciIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TZXRzIHRoZSBERUJVR19UT0tFTl9NQU5BR0VSIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJlcnJvcnJlcG9ydGluZyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TZXRzIHRoZSBFUlJPUl9SRVBPUlRJTkcgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb248L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZvcmNlbGFjaGVjayIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TZXRzIHRoZSBGT1JDRV9MQV9DSEVDSyBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaWdub3JlY2FzZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TZXRzIHRoZSBJR05PUkVfQ0FTRSBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iamF2YXVuaWNvZGVlc2NhcGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U2V0cyB0aGUgSkFWQV9VTklDT0RFX0VTQ0FQRSBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibG9va2FoZWFkIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlNldHMgdGhlIExPT0tBSEVBRCBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYW4gaW50ZWdlciBvcHRpb248L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im9wdGltaXpldG9rZW5tYW5hZ2VyIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlNldHMgdGhlIE9QVElNSVpFX1RPS0VOX01BTkFHRVIgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb248L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im90aGVyYW1iaWd1aXR5Y2hlY2siIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U2V0cyB0aGUgT1RIRVJfQU1CSUdVSVRZX0NIRUNLIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhbiBpbnRlZ2VyIG9wdGlvbjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ic2FuaXR5Y2hlY2siIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U2V0cyB0aGUgU0FOSVRZX0NIRUNLIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzdGF0aWMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U2V0cyB0aGUgU1RBVElDIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ1bmljb2RlaW5wdXQiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U2V0cyB0aGUgVU5JQ09ERV9JTlBVVCBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idXNlcmNoYXJzdHJlYW0iIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U2V0cyB0aGUgVVNFUl9DSEFSX1NUUkVBTSBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idXNlcnRva2VubWFuYWdlciIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TZXRzIHRoZSBVU0VSX1RPS0VOX01BTkFHRVIgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb248L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0iamF2YWgiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7R2VuZXJhdGVzIEpOSSBoZWFkZXJzIGZyb20gYSBKYXZhIGNsYXNzLiZsdDsvcCZndDsKLSZsdDtwJmd0OyBXaGVuIHRoaXMgdGFzayBleGVjdXRlcywgaXQgd2lsbCBnZW5lcmF0ZSB0aGUgQyBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlcyB0aGF0Ci1hcmUgbmVlZGVkIHRvIGltcGxlbWVudCBuYXRpdmUgbWV0aG9kcy4gSk5JIG9wZXJhdGVzIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbgotd2hldGhlciAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy90b29sZG9jcy93aW4zMi9qYXZhaC5odG1sJnF1b3Q7Jmd0O0pESzEuMiZsdDsvYSZndDsKLShvciBsYXRlcikgb3IgJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkay8xLjEvZG9jcy90b29sZG9jcy93aW4zMi9qYXZhaC5odG1sJnF1b3Q7Jmd0O3ByZS1KREsxLjImbHQ7L2EmZ3Q7Ci1zeXN0ZW1zIGFyZSB1c2VkLiZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0iY2xhc3MiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPnRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MgKG9yIGNsYXNzZXMsc2VwYXJhdGVkIGJ5IGNvbW1hczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ib3V0cHV0ZmlsZSIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+Y29uY2F0ZW5hdGVzIHRoZSByZXN1bHRpbmcgaGVhZGVyIG9yIHNvdXJjZSBmaWxlcyBmb3IgYWxsIHRoZSBjbGFzc2VzIGxpc3RlZCBpbnRvIHRoaXMgZmlsPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkZXN0ZGlyIiBSRVFVSVJFRD0iIj4KLQkJCTxERVNDUklQVElPTj5zZXRzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgamF2YWggc2F2ZXMgdGhlIGhlYWRlciBmaWxlcyBvciB0aGVzdHViIGZpbGVzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJmb3JjZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5zcGVjaWZpZXMgdGhhdCBvdXRwdXQgZmlsZXMgc2hvdWxkIGFsd2F5cyBiZSB3cml0dGVuIChKREsxLjIgb25seTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ib2xkIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnNwZWNpZmllcyB0aGF0IG9sZCBKREsxLjAtc3R5bGUgaGVhZGVyIGZpbGVzIHNob3VsZCBiZSBnZW5lcmF0ZWQob3RoZXJ3aXNlIG91dHB1dCBmaWxlIGNvbnRhaW4gSk5JLXN0eWxlIG5hdGl2ZSBtZXRob2QgICAgICBmdW5jdGlvbiBwcm90b3R5cGVzKSAoSkRLMS4yIG9ubHk8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InN0dWJzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmdlbmVyYXRlIEMgZGVjbGFyYXRpb25zIGZyb20gdGhlIEphdmEgb2JqZWN0IGZpbGUgKHVzZWQgd2l0aCBvbGQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InZlcmJvc2UiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+Y2F1c2VzIEphdmFoIHRvIHByaW50IGEgbWVzc2FnZSBjb25jZXJuaW5nIHRoZSBzdGF0dXMgICAgIG9mIHRoZSBnZW5lcmF0ZWQgZmlsZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY2xhc3NwYXRoIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBjbGFzc3BhdGggdG8gdXNlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJib290Y2xhc3NwYXRoIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmxvY2F0aW9uIG9mIGJvb3RzdHJhcCBjbGFzcyBmaWxlczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZXh0ZGlycyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5sb2NhdGlvbiBvZiBpbnN0YWxsZWQgZXh0ZW5zaW9uczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJqZGVwZW5kIj4KLQkJPERFU0NSSVBUSU9OPiZsdDtQJmd0O0ludm9rZXMgdGhlICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5jbGFya3dhcmUuY29tL3NvZnR3YXJlL0pEZXBlbmQuaHRtbCZxdW90OyZndDtKRGVwZW5kJmx0Oy9hJmd0OyBwYXJzZXIuJmx0Oy9QJmd0OwotJmx0O1AmZ3Q7VGhpcyBwYXJzZXIgJmFtcDtxdW90O3RyYXZlcnNlcyBhIHNldCBvZiBKYXZhIHNvdXJjZSBmaWxlIGRpcmVjdG9yaWVzIGFuZCBnZW5lcmF0ZXMgZGVzaWduIHF1YWxpdHkgbWV0cmljcyBmb3IgZWFjaCBKYXZhIHBhY2thZ2UmYW1wO3F1b3Q7LgotSXQgYWxsb3dzIHRvICZhbXA7cXVvdDthdXRvbWF0aWNhbGx5IG1lYXN1cmUgdGhlIHF1YWxpdHkgb2YgYSBkZXNpZ24gaW4gdGVybXMgb2YgaXRzIGV4dGVuc2liaWxpdHksIHJldXNhYmlsaXR5LCBhbmQgbWFpbnRhaW5hYmlsaXR5IHRvCi1lZmZlY3RpdmVseSBtYW5hZ2UgYW5kIGNvbnRyb2wgcGFja2FnZSBkZXBlbmRlbmNpZXMuJmFtcDtxdW90OyZsdDsvUCZndDsKLSZsdDtwJmd0O1NvdXJjZSBmaWxlIGRpcmVjdG9yaWVzIGFyZSBkZWZpbmVkIGJ5IG5lc3RlZCAmbHQ7Y29kZSZndDsmYW1wO2x0O3NvdXJjZXNwYXRoJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7LCBzZWUgJmx0O2EgaHJlZj0mcXVvdDsjbmVzdGVkJnF1b3Q7Jmd0O25lc3RlZCBlbGVtZW50cyZsdDsvYSZndDsuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7T3B0aW9uYWxseSwgeW91IGNhbiBhbHNvIHNldCB0aGUgJmx0O2NvZGUmZ3Q7b3V0cHV0ZmlsZSZsdDsvY29kZSZndDsgbmFtZSB3aGVyZSB0aGUgb3V0cHV0IGlzIHN0b3JlZC4gQnkgZGVmYXVsdCB0aGUgdGFzayB3cml0ZXMgaXRzIHJlcG9ydCB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LiZsdDsvUCZndDsKLSZsdDtwJmd0OyBUaGUgdGFzayByZXF1aXJlcyBhdCBsZWFzdCB0aGUgSkRlcGVuZCAxLjIgdmVyc2lvbi4gJmx0Oy9wJmd0OwotJmx0O1AmZ3Q7Tm90ZTogd2hlcmVhcyB0aGUgSkRlcGVuZCB0b29sIGNhbiBiZSBjdXN0b21pemVkIHRvIGV4Y2x1ZGUgc29tZSBwYWNrYWdlcywgdGhlIGN1cnJlbnQgamRlcGVuZCBBbmQgVGFzayBkb2VzIG5vdCBoYXZlIHBhcmFtZXRlcnMgdG8gYWxsb3cgdGhlc2UgZXhjbHVzaW9ucy4gUmVhZCBKRGVwZW5kIHNwZWNpZmljIGRvY3VtZW50YXRpb24gZm9yIHRoYXQgcHVycG9zZS4mbHQ7L1AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9Im91dHB1dGZpbGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIG91dHB1dCBmaWxlIG5hbWUuIElmIG5vdCBzZXQsIHRoZSBvdXRwdXQgaXMgcHJpbnRlZCBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJmb3JtYXQiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGZvcm1hdCB0byB3cml0ZSB0aGUgb3V0cHV0IGluLiBUaGUgZGVmYXVsdCBpcyAmcXVvdDt0ZXh0JnF1b3Q7LCB0aGUgYWx0ZXJuYXRpdmUgaXMgJnF1b3Q7eG1sPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJmb3JrIiBSRVFVSVJFRD0ibm8sIGRlZmF1bHQgaXMgJnF1b3Q7b2ZmJnF1b3Q7Ij4KLQkJCTxERVNDUklQVElPTj5SdW4gdGhlIHRlc3RzIGluIGEgc2VwYXJhdGUgVk08L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImhhbHRvbmVycm9yIiBSRVFVSVJFRD0ibm8sIGRlZmF1bHQgaXMgJnF1b3Q7b2ZmJnF1b3Q7Ij4KLQkJCTxERVNDUklQVElPTj5TdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGpkZXBlbmQgYW5hbHlzaXM8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InRpbWVvdXQiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+Q2FuY2VsIHRoZSBvcGVyYXRpb24gaWYgaXQgZG9lc24ndCBmaW5pc2ggaW4gdGhlIGdpdmVuIHRpbWUgKG1lYXN1cmVkIGluIG1pbGxpc2Vjb25kcykuIChJZ25vcmVkIGlmIGZvcmsgaXMgZGlzYWJsZWQuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJqdm0iIFJFUVVJUkVEPSJubywgZGVmYXVsdCAmcXVvdDtqYXZhJnF1b3Q7Ij4KLQkJCTxERVNDUklQVElPTj5UaGUgY29tbWFuZCB1c2VkIHRvIGludm9rZSB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUsIGRlZmF1bHQgaXMgJ2phdmEnLiBUaGUgY29tbWFuZCBpcyByZXNvbHZlZCBieSBqYXZhLmxhbmcuUnVudGltZS5leGVjKCkuIChJZ25vcmVkIGlmIGZvcmsgaXMgZGlzYWJsZWQuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkaXIiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGRpcmVjdG9yeSB0byBpbnZva2UgdGhlIFZNIGluLiAoSWdub3JlZCBpZiBmb3JrIGlzIGRpc2FibGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJjbGFzc3BhdGhyZWYiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGNsYXNzcGF0aCB0byB1c2UsIGdpdmVuIGFzIHJlZmVyZW5jZSB0byBhIFBBVEggZGVmaW5lZCBlbHNld2hlcmU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0iamp0cmVlIj4KLQkJPERFU0NSSVBUSU9OPkludm9rZXMgdGhlICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy53ZWJnYWluLmNvbS9wcm9kdWN0cy9qYXZhX2NjLyZxdW90OyZndDtKSlRyZWUmbHQ7L2EmZ3Q7IHByZXByb2Nlc3NvcgotZm9yIHRoZSBKYXZhQ0MgY29tcGlsZXIgY29tcGlsZXIuIEl0IGluc2VydHMgcGFyc2UgdHJlZSBidWlsZGluZyBhY3Rpb25zCi1hdCB2YXJpb3VzIHBsYWNlcyBpbiB0aGUgSmF2YUNDIHNvdXJjZSB0aGF0IGl0IGdlbmVyYXRlcy4gVGhlIG91dHB1dCBvZgotSkpUcmVlIGlzIHJ1biB0aHJvdWdoIEphdmFDQyB0byBjcmVhdGUgdGhlIHBhcnNlci4KLSZsdDtwJmd0O1RvIHVzZSB0aGUgamp0cmVlIHRhc2ssIHNldCB0aGUgJmx0O2kmZ3Q7dGFyZ2V0Jmx0Oy9pJmd0OyBhdHRyaWJ1dGUgdG8gdGhlIG5hbWUKLW9mIHRoZSBqanRyZWUgZ3JhbW1hciBmaWxlIHRvIHByb2Nlc3MuIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5Ci1jb250YWluaW5nIHRoZSBKYXZhQ0MgaW5zdGFsbGF0aW9uIHVzaW5nIHRoZSAmbHQ7aSZndDtqYXZhY2Nob21lJmx0Oy9pJmd0OyBhdHRyaWJ1dGUsCi1zbyB0aGF0IGFudCBjYW4gZmluZCB0aGUgSmF2YUNDIGNsYXNzZXMuIE9wdGlvbmFsbHksIHlvdSBjYW4gYWxzbyBzZXQgdGhlCi0mbHQ7aSZndDtvdXRwdXRkaXJlY3RvcnkmbHQ7L2kmZ3Q7Ci10byB3cml0ZSB0aGUgZ2VuZXJhdGVkIGZpbGUgdG8gYSBzcGVjaWZpYyBkaXJlY3RvcnkuIE90aGVyd2lzZSBqanRyZWUgd3JpdGVzCi10aGUgZ2VuZXJhdGVkIEphdmFDQyBncmFtbWFyIGZpbGUgdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBKSlRyZWUKLWdyYW1tYXIgZmlsZS4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtUaGlzIHRhc2sgb25seSBpbnZva2VzIEpKVHJlZSBpZiB0aGUgZ3JhbW1hciBmaWxlIGlzIG5ld2VyIHRoYW4gdGhlCi1nZW5lcmF0ZWQgSmF2YUNDIGZpbGUuJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJ0YXJnZXQiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPlRoZSBqanRyZWUgZ3JhbW1hciBmaWxlIHRvIHByb2Nlc3M8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImphdmFjY2hvbWUiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPlRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgSmF2YUNDIGRpc3RyaWJ1dGlvbjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ib3V0cHV0ZGlyZWN0b3J5IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlRoZSBkaXJlY3RvcnkgdG8gd3JpdGUgdGhlIGdlbmVyYXRlZCBmaWxlIHRvLiBJZiBub3Qgc2V0LHRoZSBmaWxlcyBhcmUgd3JpdHRlbiB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGdyYW1tYXIgZmlsZS48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImJ1aWxkbm9kZWZpbGVzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlNldHMgdGhlIEJVSUxEX05PREVfRklMRVMgZ3JhbW1hciBvcHRpb24uIFRoaXMgaXMgYSBib29sZWFub3B0aW9uPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJtdWx0aSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TZXRzIHRoZSBNVUxUSSBncmFtbWFyIG9wdGlvbi4gVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJub2RlZGVmYXVsdHZvaWQiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U2V0cyB0aGUgTk9ERV9ERUZBVUxUX1ZPSUQgZ3JhbW1hciBvcHRpb24uIFRoaXMgaXMgYSBib29sZWFub3B0aW9uPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJub2RlZmFjdG9yeSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TZXRzIHRoZSBOT0RFX0ZBQ1RPUlkgZ3JhbW1hciBvcHRpb24uIFRoaXMgaXMgYm9vbGVhbiBvcHRpb248L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im5vZGVzY29wZWhvb2siIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U2V0cyB0aGUgTk9ERV9TQ09QRV9IT09LIGdyYW1tYXIgb3B0aW9uLiBUaGlzIGlzIGEgYm9vbGVhbm9wdGlvbjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibm9kZXVzZXNwYXJzZXIiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U2V0cyB0aGUgTk9ERV9VU0VTX1BBUlNFUiBncmFtbWFyIG9wdGlvbi4gVGhpcyBpcyBhIGJvb2xlYW5vcHRpb248L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InN0YXRpYyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TZXRzIHRoZSBTVEFUSUMgZ3JhbW1hciBvcHRpb24uIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idmlzaXRvciIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TZXRzIHRoZSBWSVNJVE9SIGdyYW1tYXIgb3B0aW9uLiBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb248L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im5vZGVwYWNrYWdlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlNldHMgdGhlIE5PREVfUEFDS0FHRSBncmFtbWFyIG9wdGlvbi4gVGhpcyBpcyBhIHN0cmluZyBvcHRpb248L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InZpc2l0b3JleGNlcHRpb24iIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U2V0cyB0aGUgVklTSVRPUl9FWENFUFRJT04gZ3JhbW1hciBvcHRpb24uIFRoaXMgaXMgYSBzdHJpbmdvcHRpb248L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im5vZGVwcmVmaXgiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U2V0cyB0aGUgTk9ERV9QUkVGSVggZ3JhbW1hciBvcHRpb24uIFRoaXMgaXMgYSBzdHJpbmcgb3B0aW9uPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9ImpsaW5rIj4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0xpbmtzIGVudHJpZXMgZnJvbSBzdWItYnVpbGRzIGFuZCBsaWJyYXJpZXMuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7VGhlIGpsaW5rIHRhc2sgY2FuIGJlIHVzZWQgdG8gYnVpbGQgamFyIGFuZCB6aXAgZmlsZXMsIHNpbWlsYXIgdG8gCi10aGUgJmx0O2kmZ3Q7amFyJmx0Oy9pJmd0OyB0YXNrLgotSG93ZXZlciwgamxpbmsgcHJvdmlkZXMgb3B0aW9ucyBmb3IgY29udHJvbGxpbmcgdGhlIHdheSBlbnRyaWVzIGZyb20gCi1pbnB1dCBmaWxlcwotYXJlIGFkZGVkIHRvIHRoZSBvdXRwdXQgZmlsZS4gU3BlY2lmaWNhbGx5LCBjYXBhYmlsaXRpZXMgZm9yIG1lcmdpbmcgCi1lbnRyaWVzIGZyb20KLW11bHRpcGxlIHppcCBvciBqYXIgZmlsZXMgaXMgYXZhaWxhYmxlLiZsdDsvcCZndDsKLSZsdDtwJmd0O0lmIGEgbWVyZ2VmaWxlIGlzIHNwZWNpZmllZCBkaXJlY3RseSAoZWcuIGF0IHRoZSB0b3AgbGV2ZWwgb2YgYSAKLSZsdDtpJmd0O21lcmdlZmlsZXMmbHQ7L2kmZ3Q7Ci1wYXRoZWxlbWVudCkgJmx0O2kmZ3Q7YW5kJmx0Oy9pJmd0OyB0aGUgbWVyZ2VmaWxlIGVuZHMgaW4gJmFtcDtxdW90Oy56aXAmYW1wO3F1b3Q7IG9yIAotJmFtcDtxdW90Oy5qYXImYW1wO3F1b3Q7LAotZW50cmllcyBpbiB0aGUgbWVyZ2VmaWxlIHdpbGwgYmUgbWVyZ2VkIGludG8gdGhlIG91dGZpbGUuIEEgZmlsZSB3aXRoIAotYW55IG90aGVyIGV4dGVuc2lvbgotd2lsbCBiZSBhZGRlZCB0byB0aGUgb3V0cHV0IGZpbGUsIGV2ZW4gaWYgaXQgaXMgc3BlY2lmaWVkIGluIHRoZSAKLW1lcmdlZmlsZXMgZWxlbWVudC4KLURpcmVjdG9yaWVzIHNwZWNpZmllZCBpbiBlaXRoZXIgdGhlIG1lcmdlZmlsZXMgb3IgYWRkZmlsZXMgZWxlbWVudCAKLWFyZSBhZGRlZCB0byB0aGUKLW91dHB1dCBmaWxlIGFzIHlvdSB3b3VsZCBleHBlY3Q6IGFsbCBmaWxlcyBpbiBzdWJkaXJlY3RvcmllcyBhcmUgCi1yZWN1cnNpdmVseSBhZGRlZCB0bwotdGhlIG91dHB1dCBmaWxlIHdpdGggYXBwcm9wcmlhdGUgcHJlZml4ZXMgaW4gdGhlIG91dHB1dCBmaWxlIAotKHdpdGhvdXQgbWVyZ2luZykuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLUluIHRoZSBjYXNlIHdoZXJlIGR1cGxpY2F0ZSBlbnRyaWVzIGFuZC9vciBmaWxlcyBhcmUgZm91bmQgYW1vbmcgdGhlIAotZmlsZXMgdG8gYmUgbWVyZ2VkIG9yCi1hZGRlZCwgamxpbmsgbWVyZ2VzIG9yIGFkZHMgdGhlIGZpcnN0IGVudHJ5IGFuZCBpZ25vcmVzIGFsbCBzdWJzZXF1ZW50IGVudHJpZXMuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLWpsaW5rIGlnbm9yZXMgTUVUQS1JTkYgZGlyZWN0b3JpZXMgaW4gbWVyZ2VmaWxlcy4gVXNlcnMgc2hvdWxkIHN1cHBseSB0aGVpcgotb3duIG1hbmlmZXN0IGluZm9ybWF0aW9uIGZvciB0aGUgb3V0cHV0IGZpbGUuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtJdCBpcyBwb3NzaWJsZSB0byByZWZpbmUgdGhlIHNldCBvZiBmaWxlcyB0aGF0IGFyZSBiZWluZyBqbGlua2VkLiAKLVRoaXMgY2FuIGJlCi1kb25lIHdpdGggdGhlICZsdDtpJmd0O2luY2x1ZGVzJmx0Oy9pJmd0OywgJmx0O2kmZ3Q7aW5jbHVkZXNmaWxlJmx0Oy9pJmd0OywgJmx0O2kmZ3Q7ZXhjbHVkZXMmbHQ7L2kmZ3Q7LCAKLSZsdDtpJmd0O2V4Y2x1ZGVzZmlsZSZsdDsvaSZndDssCi1hbmQgJmx0O2kmZ3Q7ZGVmYXVsdGV4Y2x1ZGVzJmx0Oy9pJmd0OyBhdHRyaWJ1dGVzIG9uIHRoZSAmbHQ7aSZndDthZGRmaWxlcyZsdDsvaSZndDsgYW5kIAotJmx0O2kmZ3Q7bWVyZ2VmaWxlcyZsdDsvaSZndDsKLW5lc3RlZCBlbGVtZW50cy4gV2l0aCB0aGUgJmx0O2kmZ3Q7aW5jbHVkZXMmbHQ7L2kmZ3Q7IG9yICZsdDtpJmd0O2luY2x1ZGVzZmlsZSZsdDsvaSZndDsKLWF0dHJpYnV0ZSB5b3Ugc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBpbmNsdWRlZCBieSB1c2luZyBwYXR0ZXJucy4KLVRoZSAmbHQ7aSZndDtleGNsdWRlJmx0Oy9pJmd0OyBvciAmbHQ7aSZndDtleGNsdWRlc2ZpbGUmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHNwZWNpZnkKLXRoZSBmaWxlcyB5b3Ugd2FudCB0byBoYXZlIGV4Y2x1ZGVkLiBUaGlzIGlzIGFsc28gZG9uZSB3aXRoIHBhdHRlcm5zLiBBbmQKLWZpbmFsbHkgd2l0aCB0aGUgJmx0O2kmZ3Q7ZGVmYXVsdGV4Y2x1ZGVzJmx0Oy9pJmd0OyBhdHRyaWJ1dGUsIHlvdSBjYW4gc3BlY2lmeSB3aGV0aGVyIHlvdQotd2FudCB0byB1c2UgZGVmYXVsdCBleGNsdXNpb25zIG9yIG5vdC4gU2VlIHRoZSBzZWN0aW9uIG9uICZsdDthCi1ocmVmPSZxdW90Oy4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyZxdW90OyZndDtkaXJlY3RvcnkgYmFzZWQgdGFza3MmbHQ7L2EmZ3Q7LCBvbiBob3cgdGhlCi1pbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvIHdyaXRlIHBhdHRlcm5zLiBUaGUgcGF0dGVybnMgYXJlCi1yZWxhdGl2ZSB0byB0aGUgJmx0O2kmZ3Q7YmFzZSZsdDsvaSZndDsgZGlyZWN0b3J5LiZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0ib3V0ZmlsZSIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIHBhdGggb2YgdGhlIG91dHB1dCBmaWxlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJjb21wcmVzcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj53aGV0aGVyIG9yIG5vdCB0aGUgb3V0cHV0IHNob3VsZCBiZSBjb21wcmVzc2VkLiB0cnVlLHllcywgb3Igb24gcmVzdWx0IGluIGNvbXByZXNzZWQgb3V0cHV0LklmIG9taXR0ZWQsIG91dHB1dCB3aWxsIGJlIHVuY29tcHJlc3NlZCAoaW5mbGF0ZWQpPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJtZXJnZWZpbGVzIiBSRVFVSVJFRD0iYXQgbGVhc3Qgb25lIG9mIAotIG1lcmdlZmlsZXMgb3IgYWRkZmlsZXMiPgotCQkJPERFU0NSSVBUSU9OPmZpbGVzIHRvIGJlIG1lcmdlZCBpbnRvIHRoZSBvdXRwdXQsIGlmIHBvc3NpYmxlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJhZGRmaWxlcyIgUkVRVUlSRUQ9IiI+Ci0JCQk8REVTQ1JJUFRJT04+ZmlsZXMgdG8gYmUgYWRkZWQgdG8gdGhlIG91dHB1dDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJqc3BjIj4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0OyBBbnQgdGFzayB0byBydW4gdGhlIEpTUCBjb21waWxlciBhbmQgdHVybiBKU1AgcGFnZXMgaW50byBKYXZhIHNvdXJjZS4KLSZsdDtwJmd0OwotSXQgY2FuIGJlIHVzZWQgdG8gcHJlY29tcGlsZSBKU1AgcGFnZXMgZm9yIGZhc3QgaW5pdGlhbCBpbnZvY2F0aW9uCi1vZiBKU1AgcGFnZXMsIGRlcGxveW1lbnQgb24gYSBzZXJ2ZXIgd2l0aG91dCB0aGUgZnVsbCBKREsgaW5zdGFsbGVkLAotb3Igc2ltcGx5IHRvIHN5bnRheCBjaGVjayB0aGUgcGFnZXMgd2l0aG91dCBkZXBsb3lpbmcgdGhlbS4KLUluIG1vc3QgY2FzZXMsIGEgamF2YWMgdGFzayBpcyB1c3VhbGx5IHRoZSBuZXh0IHN0YWdlIGluIHRoZSBidWlsZCBwcm9jZXNzLgotVGhlIHRhc2sgZG9lcyBiYXNpYyBkZXBlbmRlbmN5IGNoZWNraW5nIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmVjb21waWxhdGlvbiAtdGhpcwotY2hlY2tpbmcgY29tcGFyZXMgc291cmNlIGFuZCBkZXN0aW5hdGlvbiB0aW1lc3RhbXBzLCBhbmQgZG9lcyBub3QgZmFjdG9yCi1pbiBjbGFzcyBvciB0YWdsaWIgZGVwZW5kZW5jaWVzLCBvciAmYW1wO2x0O2pzcDppbmNsdWRlJmFtcDtndDsgcmVmZXJlbmNlcy4KLSZsdDtwJmd0OwotQnkgZGVmYXVsdCB0aGUgdGFzayB1c2VzIHRoZSBKYXNwZXIgSlNQIGNvbXBpbGVyLiBUaGlzCi1tZWFucyB0aGUgdGFzayBuZWVkcyBqYXNwZXIuamFyIGFuZCBqYXNwZXItcnVudGltZS5qYXIsIHdoaWNoIGNvbWUgd2l0aAotYnVpbGRzIG9mIFRvbWNhdCA0L0NhdGFsaW5hIGZyb20gdGhlCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdG9tY2F0LyZxdW90OyZndDtKYWthcnRhIFRvbWNhdCBwcm9qZWN0Jmx0Oy9hJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJkZXN0ZGlyIiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj5XaGVyZSB0byBwbGFjZSB0aGUgZ2VuZXJhdGVkIGZpbGVzLiBUaGV5IGFyZSBsb2NhdGVkdW5kZXIgaGVyZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHBhY2thZ2UgbmFtZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ic3JjZGlyIiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj5XaGVyZSB0byBsb29rIGZvciBzb3VyY2UganNwIGZpbGVzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ2ZXJib3NlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlRoZSB2ZXJib3NpdHkgaW50ZWdlciB0byBwYXNzIHRvIHRoZSBjb21waWxlci4gRGVmYXVsdD0mcXVvdDswPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJwYWNrYWdlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPk5hbWUgb2YgdGhlIGRlc3RpbmF0aW9uIHBhY2thZ2UgZm9yIGdlbmVyYXRlZCBqYXZhY2xhc3NlczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY29tcGlsZXIiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+Y2xhc3MgbmFtZSBvZiBhIEpTUCBjb21waWxlciBhZGFwdGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImllcGx1Z2luIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkphdmEgUGx1Z2luIGNsYXNzaWQgZm9yIEludGVybmV0IEV4cGxvcmVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJtYXBwZWQiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+KGJvb2xlYW4pIEdlbmVyYXRlIHNlcGFyYXRlIHdyaXRlKCkgY2FsbHMgZm9yIGVhY2ggSFRNTGxpbmUgaW4gdGhlIEpTUDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY2xhc3NwYXRoIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlRoZSBjbGFzc3BhdGggdG8gdXNlIHRvIHJ1biB0aGUganNwIGNvbXBpbGVyLlRoaXMgY2FuIGFsc28gYmUgc3BlY2lmaWVkYnkgdGhlIG5lc3RlZCBlbGVtZW50IGNsYXNzcGF0aFBhdGgpPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJjbGFzc3BhdGhyZWYiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+QSBSZWZlcmVuY2UuIEFzcGVyIGNsYXNzcGF0PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJmYWlsb25lcnJvciIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5mbGFnIHRvIGNvbnRyb2wgYWN0aW9uIG9uIGNvbXBpbGUgZmFpbHVyZXM6IGRlZmF1bHQ9eWU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InVyaWJhc2UiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIHVyaSBjb250ZXh0IG9mIHJlbGF0aXZlIFVSSXJlZmVyZW5jZXMgaW4gdGhlIEpTUCBwYWdlcy4gSWYgaXQgZG9lcyBub3RleGlzdCB0aGVuIGl0IGlzIGRlcml2ZWQgZnJvbSB0aGUgbG9jYXRpb24gb2YgdGhlIGZpbGVyZWxhdGl2ZSB0byB0aGUgZGVjbGFyZWQgb3IgZGVyaXZlZCB2YWx1ZSBvZiB1cmlyb290LjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idXJpcm9vdCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5UaGUgcm9vdCBkaXJlY3RvcnkgdGhhdCB1cmkgZmlsZXMgc2hvdWxkIGJlIHJlc29sdmVkYWdhaW5zdC48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNvbXBpbGVyIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkNsYXNzIG5hbWUgb2YganNwIGNvbXBpbGVyIGFkYXB0ZXIgdG8gdXNlLiAgRGVmYXVsdHMgdG90aGUgc3RhbmRhcmQgYWRhcHRlciBmb3IgSmFzcGVyLjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY29tcGlsZXJjbGFzc3BhdGgiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGNsYXNzcGF0aCB1c2VkIHRvIGZpbmQgdGhlIGNvbXBpbGVyIGFkYXB0ZXIgc3BlY2lmaWVkYnkgdGhlIGNvbXBpbGVyIGF0dHJpYnV0ZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJqdW5pdCI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtUaGlzIHRhc2sgcnVucyB0ZXN0cyBmcm9tIHRoZSBKVW5pdCB0ZXN0aW5nIGZyYW1ld29yay4gVGhlIGxhdGVzdAotdmVyc2lvbiBvZiB0aGUgZnJhbWV3b3JrIGNhbiBiZSBmb3VuZCBhdAotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3Lmp1bml0Lm9yZyZxdW90OyZndDtodHRwOi8vd3d3Lmp1bml0Lm9yZyZsdDsvYSZndDsuCi1UaGlzIHRhc2sgaGFzIGJlZW4gdGVzdGVkIHdpdGggSlVuaXQgMy4wIHVwIHRvIEpVbml0IDMuOC4xOyBpdCB3b24ndAotd29yayB3aXRoIHZlcnNpb25zIHByaW9yIHRvIEpVbml0IDMuMC4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsmbHQ7c3Ryb25nJmd0O05vdGU6Jmx0Oy9zdHJvbmcmZ3Q7IFRoaXMgdGFzayBkZXBlbmRzIG9uIGV4dGVybmFsIGxpYnJhcmllcyBub3QgaW5jbHVkZWQKLWluIHRoZSBBbnQgZGlzdHJpYnV0aW9uLiAgU2VlICZsdDthIGhyZWY9JnF1b3Q7Li4vaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMmcXVvdDsmZ3Q7Ci1MaWJyYXJ5IERlcGVuZGVuY2llcyZsdDsvYSZndDsgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSZsdDtzdHJvbmcmZ3Q7Tm90ZSZsdDsvc3Ryb25nJmd0OzoKLVlvdSBtdXN0IGhhdmUgJmx0O2NvZGUmZ3Q7anVuaXQuamFyJmx0Oy9jb2RlJmd0OyBhbmQgdGhlIGNsYXNzIGZpbGVzIGZvciB0aGUKLSZsdDtjb2RlJmd0OyZhbXA7bHQ7anVuaXQmYW1wO2d0OyZsdDsvY29kZSZndDsgdGFzayBpbiB0aGUgc2FtZSBjbGFzc3BhdGguCi1Zb3UgY2FuIGRvIG9uZSBvZjoKLSZsdDtvbCZndDsKLSZsdDtsaSZndDsKLVB1dCBib3RoICZsdDtjb2RlJmd0O2p1bml0LmphciZsdDsvY29kZSZndDsgYW5kIHRoZSBvcHRpb25hbCB0YXNrcyBqYXIgZmlsZSBpbgotJmx0O2NvZGUmZ3Q7QU5UX0hPTUUvbGliJmx0Oy9jb2RlJmd0Oy4KLSZsdDsvbGkmZ3Q7Ci0mbHQ7bGkmZ3Q7Ci1EbyBub3QgcHV0IGVpdGhlciBpbiAmbHQ7Y29kZSZndDtBTlRfSE9NRS9saWImbHQ7L2NvZGUmZ3Q7LCBhbmQgaW5zdGVhZAotaW5jbHVkZSB0aGVpciBsb2NhdGlvbnMgaW4geW91ciAmbHQ7Y29kZSZndDtDTEFTU1BBVEgmbHQ7L2NvZGUmZ3Q7IGVudmlyb25tZW50IHZhcmlhYmxlLgotJmx0Oy9saSZndDsKLSZsdDtsaSZndDsKLURvIG5laXRoZXIgb2YgdGhlIGFib3ZlLCBhbmQgaW5zdGVhZCwgc3BlY2lmeSB0aGVpciBsb2NhdGlvbnMgdXNpbmcKLWEgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtjbGFzc3BhdGgmYW1wO2d0OyZsdDsvY29kZSZndDsgZWxlbWVudCBpbiB0aGUgYnVpbGRmaWxlLgotU2VlICZsdDthIGhyZWY9JnF1b3Q7Li4vLi4vZmFxLmh0bWwjZGVsZWdhdGluZy1jbGFzc2xvYWRlciZxdW90OyB0YXJnZXQ9JnF1b3Q7X3RvcCZxdW90OyZndDt0aGUKLUZBUSZsdDsvYSZndDsgZm9yIGRldGFpbHMuCi0mbHQ7L29sJmd0OwotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7VGVzdHMgYXJlIGRlZmluZWQgYnkgbmVzdGVkICZsdDtjb2RlJmd0O3Rlc3QmbHQ7L2NvZGUmZ3Q7IG9yCi0mbHQ7Y29kZSZndDtiYXRjaHRlc3QmbHQ7L2NvZGUmZ3Q7IHRhZ3MgKHNlZSAmbHQ7YSBocmVmPSZxdW90OyNuZXN0ZWQmcXVvdDsmZ3Q7bmVzdGVkCi1lbGVtZW50cyZsdDsvYSZndDspLiZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0icHJpbnRzdW1tYXJ5IiBSRVFVSVJFRD0ibm87IGRlZmF1bHQgaXMgb2ZmLiI+Ci0JCQk8REVTQ1JJUFRJT04+UHJpbnQgb25lLWxpbmUgc3RhdGlzdGljcyBmb3IgZWFjaCB0ZXN0Y2FzZS4gQ2FudGFrZSB0aGUgdmFsdWVzIG9uLG9mZiwgYW5kd2l0aE91dEFuZEVyci53aXRoT3V0QW5kRXJyIGlzIHRoZSBzYW1lYXMgb24gYnV0IGFsc28gaW5jbHVkZXMgdGhlIG91dHB1dCBvZiB0aGUgdGVzdGFzIHdyaXR0ZW4gdG8gU3lzdGVtLm91dCBhbmQgU3lzdGVtLmVycjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZm9yayIgUkVRVUlSRUQ9Im5vOyBkZWZhdWx0IGlzIG9mZi4iPgotCQkJPERFU0NSSVBUSU9OPlJ1biB0aGUgdGVzdHMgaW4gYSBzZXBhcmF0ZSBWTTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaGFsdG9uZXJyb3IiIFJFUVVJUkVEPSJubzsgZGVmYXVsdCBpcyBvZmYuIj4KLQkJCTxERVNDUklQVElPTj5TdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIHRlc3RydW48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImVycm9ycHJvcGVydHkiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byBzZXQgaW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJoYWx0b25mYWlsdXJlIiBSRVFVSVJFRD0ibm87IGRlZmF1bHQgaXMgb2ZmLiI+Ci0JCQk8REVTQ1JJUFRJT04+U3RvcCB0aGUgYnVpbGQgcHJvY2VzcyBpZiBhIHRlc3QgZmFpbHMgKGVycm9ycyBhcmVjb25zaWRlcmVkIGZhaWx1cmVzIGFzIHdlbGwpPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJmYWlsdXJlcHJvcGVydHkiIFJFUVVJUkVEPSJuby4iPgotCQkJPERFU0NSSVBUSU9OPlRoZSBuYW1lIG9mIGEgcHJvcGVydHkgdG8gc2V0IGluIHRoZSBldmVudCBvZiBhIGZhaWx1cmUoZXJyb3JzIGFyZSBjb25zaWRlcmVkIGZhaWx1cmVzIGFzIHdlbGwpPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJmaWx0ZXJ0cmFjZSIgUkVRVUlSRUQ9Im5vOyBkZWZhdWx0IGlzIG9uLiI+Ci0JCQk8REVTQ1JJUFRJT04+RmlsdGVyIG91dCBKdW5pdCBhbmQgQW50IHN0YWNrIGZyYW1lcyBmcm9tIGVycm9yIGFuZCBmYWlsdXJlIHN0YWNrIHRyYWNlczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idGltZW91dCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5DYW5jZWwgdGhlIGluZGl2aWR1YWwgdGVzdHMgaWYgdGhleSBkb24ndCBmaW5pc2hpbiB0aGUgZ2l2ZW4gdGltZSAobWVhc3VyZWQgaW4gbWlsbGlzZWNvbmRzKS4gIElnbm9yZWQgaWZmb3JrIGlzIGRpc2FibGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJtYXhtZW1vcnkiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+TWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIHRvIHRoZSBmb3JrZWQgVk0uSWdub3JlZCBpZiBmb3JrIGlzIGRpc2FibGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJqdm0iIFJFUVVJUkVEPSJubzsgZGVmYXVsdCBpcyBqYXZhLiI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGNvbW1hbmQgdXNlZCB0byBpbnZva2UgdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lLGRlZmF1bHQgaXMgJ2phdmEnLiAgVGhlIGNvbW1hbmQgaXMgcmVzb2x2ZWQgYnlqYXZhLmxhbmcuUnVudGltZS5leGVjKCkuSWdub3JlZCBpZiBmb3JrIGlzIGRpc2FibGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkaXIiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0byBpbnZva2UgdGhlIFZNLiBJZ25vcmVkIGlmZm9yayBpcyBkaXNhYmxlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibmV3ZW52aXJvbm1lbnQiIFJFUVVJUkVEPSJubzsgZGVmYXVsdCBpcyBmYWxzZS4iPgotCQkJPERFU0NSSVBUSU9OPkRvIG5vdCBwcm9wYWdhdGUgdGhlIG9sZCBlbnZpcm9ubWVudCB3aGVuIG5ld2Vudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc3BlY2lmaWVkLiBJZ25vcmVkIGlmIGZvcmsgaXNkaXNhYmxlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZWFudHJ1bnRpbWUiIFJFUVVJUkVEPSJubzsgZGVmYXVsdCBpcyB0cnVlLiI+Ci0JCQk8REVTQ1JJUFRJT04+SW1wbGljaXRseSBhZGQgdGhlIEFudCBjbGFzc2VzIHJlcXVpcmVkIHRvIHJ1bnRoZSB0ZXN0cyBhbmQgSlVuaXQgdG8gdGhlIGNsYXNzcGF0aCBpbiBmb3JrZWQgbW9kZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ic2hvd291dHB1dCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TZW5kIGFueSBvdXRwdXQgZ2VuZXJhdGVkIGJ5IHRlc3RzIHRvIEFudCdzbG9nZ2luZyBzeXN0ZW0gYXMgd2VsbCBhcyB0byB0aGUgZm9ybWF0dGVycy4gIEJ5IGRlZmF1bHQgb25seSB0aGVmb3JtYXR0ZXJzIHJlY2VpdmUgdGhlIG91dHB1dDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJtYXVkaXQiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7Ci1JbnZva2VzIHRoZSBNZXRhbWF0YSBBdWRpdC8gV2ViZ2FpbiBRdWFsaXR5IEFuYWx5emVyIG9uIGEgc2V0IG9mIEphdmEgZmlsZXMuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSZsdDtpJmd0O21hdWRpdCZsdDsvaSZndDsgcGVyZm9ybXMgc3RhdGljIGFuYWx5c2lzIG9mIHRoZSBKYXZhIHNvdXJjZSBjb2RlIGFuZCBieXRlIGNvZGUgZmlsZXMgdG8gZmluZCBhbmQgcmVwb3J0Ci1lcnJvcnMgb2Ygc3R5bGUgYW5kIHBvdGVudGlhbCBwcm9ibGVtcyByZWxhdGVkIHRvIHBlcmZvcm1hbmNlLCBtYWludGVuYW5jZSBhbmQgcm9idXN0bmVzcy4KLS4gIEFzIGEgY29udmVuaWVuY2UsIGEgc3R5bGVzaGVldCBpcyBnaXZlbiBpbiAmbHQ7dHQmZ3Q7ZXRjJmx0Oy90dCZndDsgZGlyZWN0b3J5LCBzbyB0aGF0IGFuIEhUTUwgcmVwb3J0IGNhbiBiZSBnZW5lcmF0ZWQgZnJvbSB0aGUgWE1MIGZpbGUuCi0mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9InRvZmlsZSIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIFhNTCBmaWxlIHRvIHdoaWNoIHRoZSBBdWRpdCByZXN1bHQgc2hvdWxkIGJlIHdyaXR0ZW4gdG88L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im1ldGFtYXRhaG9tZSIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGhvbWUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIE1ldGFtYXRhIGRpc3RyaWJ1dGlvbjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZml4IiBSRVFVSVJFRD0ibm8uZGVmYXVsdCB0byBmYWxzZS4iPgotCQkJPERFU0NSSVBUSU9OPkF1dG9tYXRpY2FsbHkgZml4IGNlcnRhaW4gZXJyb3JzICh0aG9zZSBtYXJrZWQgYXMgZml4YWJsZSBpbiB0aGUgbWFudWFsKS48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Imxpc3QiIFJFUVVJUkVEPSJuby4gZGVmYXVsdCB0byBmYWxzZS4iPgotCQkJPERFU0NSSVBUSU9OPkNyZWF0ZXMgbGlzdGluZyBmaWxlIGZvciBlYWNoIGF1ZGl0ZWQgZmlsZS4gQSAubWF1ZGl0IGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQgaW4gdGhlc2FtZSBsb2NhdGlvbiBhcyB0aGUgc291cmNlIGZpbGUuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ1bnVzZWQiIFJFUVVJUkVEPSJuby4gZGVmYXVsdCB0byBmYWxzZS4iPgotCQkJPERFU0NSSVBUSU9OPkZpbmRzIGRlY2xhcmF0aW9ucyB1bnVzZWQgaW4gc2VhcmNoIHBhdGhzLiBJdCB3aWxsIGxvb2sgZm9yIHVudXNlZCBnbG9iYWwgZGVjbGFyYXRpb25zaW4gdGhlIHNvdXJjZSBjb2RlIHdpdGhpbiBhIHVzZSBkb21haW4gc3BlY2lmaWVkIGJ5IHRoZSBzZWFyY2hwYXRoIGVsZW1lbnQuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJtYXhtZW1vcnkiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+U2V0IHRoZSBtYXhpbXVtIG1lbW9yeSBmb3IgdGhlIEpWTS4gdGhpcyBpcyBhIGNvbnZlbmllbnR3YXkgdG8gc2V0IHRoZSAtbXggb3IgLVhteCBhcmd1bWVudDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJtaW1lbWFpbCI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtTZW5kcyBTTVRQIG1haWwgd2l0aCBNSU1FIGF0dGFjaG1lbnRzLgotJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2phdmFtYWlsL2luZGV4Lmh0bWwmcXVvdDsmZ3Q7SmF2YU1haWwmbHQ7L2EmZ3Q7Ci1hbmQgJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2phdmFiZWFucy9nbGFzZ293L2phZi5odG1sJnF1b3Q7Jmd0O0phdmEKLUFjdGl2YXRpb24gRnJhbWV3b3JrJmx0Oy9hJmd0OyBhcmUgcmVxdWlyZWQgZm9yIHRoaXMgdGFzay4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtNdWx0aXBsZSBmaWxlcyBjYW4gYmUgYXR0YWNoZWQgdXNpbmcgJmx0O2EgaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMvZmlsZXNldC5odG1sJnF1b3Q7Jmd0O0ZpbGVTZXRzLiZsdDsvYSZndDsmbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9Im1lc3NhZ2UiIFJFUVVJUkVEPSJubywgYnV0IG9ubHkgb25lIG9mIG9mICdtZXNzYWdlJyBvcgotICAgICAgICdtZXNzYWdlZmlsZScgbWF5IGJlIHNwZWNpZmllZC4gaWYgbm90IHNwZWNpZmllZCwgYSBmaWxlc2V0IG11c3QgYmUKLSAgICAgICBwcm92aWRlZC4iPgotCQkJPERFU0NSSVBUSU9OPlRoZSBtZXNzYWdlIGJvZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibWVzc2FnZWZpbGUiIFJFUVVJUkVEPSIiPgotCQkJPERFU0NSSVBUSU9OPkEgZmlsZW5hbWUgdG8gcmVhZCBhbmQgdXNlZCBhcyB0aGUgbWVzc2FnZSBib2Q8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im1lc3NhZ2VtaW1ldHlwZSIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0cyB0byAmcXVvdDt0ZXh0L3BsYWluJnF1b3Q7Ij4KLQkJCTxERVNDUklQVElPTj5NSU1FIHR5cGUgdG8gdXNlIGZvciAnbWVzc2FnZScgb3IgJ21lc3NhZ2VGaWxlJyB3aGVuYXR0YWNoZWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InRvbGlzdCIgUkVRVUlSRUQ9InllcywgYXQgbGVhc3Qgb25lIG9mICd0b2xpc3QnLCAnY2NsaXN0JywKLSAgICAgICBvciAnYmNjbGlzdCcgbXVzdCBiZSBzcGVjaWZpZWQuIj4KLQkJCTxERVNDUklQVElPTj5Db21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBUbzogcmVjaXBpZW50PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJjY2xpc3QiIFJFUVVJUkVEPSIiPgotCQkJPERFU0NSSVBUSU9OPkNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIENDOiByZWNpcGllbnQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImJjY2xpc3QiIFJFUVVJUkVEPSIiPgotCQkJPERFU0NSSVBUSU9OPkNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIEJDQzogcmVjaXBpZW50PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJtYWlsaG9zdCIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0IHRvICZxdW90O2xvY2FsaG9zdCZxdW90OyI+Ci0JCQk8REVTQ1JJUFRJT04+SG9zdCBuYW1lIG9mIHRoZSBtYWlsIHNlcnZlcjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ic3ViamVjdCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5FbWFpbCBzdWJqZWN0IGxpbmU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZyb20iIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPkVtYWlsIGFkZHJlc3Mgb2Ygc2VuZGVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJmYWlsb25lcnJvciIgUkVRVUlSRUQ9Im5vLCBkZWZhdWx0IHRvICZxdW90O3RydWUmcXVvdDsiPgotCQkJPERFU0NSSVBUSU9OPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgYW4gZXJyb3Igb2NjdXJzIHNlbmRpbmcgdGhlZS1tYWlsPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9Im1tZXRyaWNzIj4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0OwotSW52b2tlcyB0aGUgTWV0YW1hdGEgTWV0cmljcyAvIFdlYkdhaW4gUXVhbGl0eSBBbmFseXplciBzb3VyY2UgY29kZSAKLWFuYWx5emVyIG9uIGEgc2V0IG9mIEphdmEgZmlsZXMuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSZsdDtpJmd0O21tZXRyaWNzJmx0Oy9pJmd0OyB3aWxsIGNvbXB1dGUgdGhlIG1ldHJpY3Mgb2YgYSBzZXQgb2YgSmF2YSBmaWxlcyBhbmQgd3JpdGUgdGhlIHJlc3VsdHMgdG8gYW4gWE1MCi1maWxlLiBBcyBhIGNvbnZlbmllbmNlLCBhIHN0eWxlc2hlZXQgaXMgZ2l2ZW4gaW4gJmx0O3R0Jmd0O2V0YyZsdDsvdHQmZ3Q7IGRpcmVjdG9yeSwgc28gdGhhdCBhbiBIVE1MIHJlcG9ydCBjYW4gYmUgZ2VuZXJhdGVkIGZyb20gdGhlIFhNTCBmaWxlLgotJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJtZXRhbWF0YWhvbWUiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPlRoZSBob21lIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBNZXRhbWF0YSBkaXN0cmlidXRpb248L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InRvZmlsZSIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIFhNTCB3ZXJlIHRoZSByZXN1bHRpbmcgbWV0cmljcyB3aWxsIGJlIHdyaXR0ZW4gdG88L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImdyYW51bGFyaXR5IiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj5NZXRyaWNzIGdyYW51bGFyaXR5IG9mIHRoZSBzb3VyY2UgZmlsZXMuIE11c3QgYmUgZWl0aGVyZmlsZXMgKGNvbXBpbGF0aW9uLXVuaXRzKSwgdHlwZXMgKHR5cGVzIGFuZCBjb21waWxhdGlvbi11bml0cykgb3IgbWV0aG9kcyhtZXRob2RzLCB0eXBlcyBhbmQgY29tcGlsYXRpb24tdW5pdHMpLjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibWF4bWVtb3J5IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlNldCB0aGUgbWF4aW11bSBtZW1vcnkgZm9yIHRoZSBKVk0uIHRoaXMgaXMgYSBjb252ZW5pZW50d2F5IHRvIHNldCB0aGUgLW14IG9yIC1YbXggYXJndW1lbnQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0ibXBhcnNlIj4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0OwotSW52b2tlcyB0aGUgTWV0YW1hdGEgJmx0O2EgSFJFRj0mcXVvdDtodHRwOi8vd3d3Lm1ldGFtYXRhLmNvbS9wYXJzZS5odG1sJnF1b3Q7Jmd0O01QYXJzZSZsdDsvYSZndDsgY29tcGlsZXIgCi1jb21waWxlciBvbiBhIGdyYW1tYXIgZmlsZS4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotVG8gdXNlIHRoZSAmbHQ7aSZndDttcGFyc2UmbHQ7L2kmZ3Q7IHRhc2ssIHNldCB0aGUgJmx0O2kmZ3Q7dGFyZ2V0Jmx0Oy9pJmd0OyBhdHRyaWJ1dGUgdG8gdGhlIG5hbWUgb2YgdGhlIAotZ3JhbW1hciBmaWxlIHRvIHByb2Nlc3MuICBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIAotdGhlIE1ldGFtYXRhIGluc3RhbGxhdGlvbiB1c2luZyB0aGUgJmx0O2kmZ3Q7bWV0YW1hdGFob21lJmx0Oy9pJmd0OyBhdHRyaWJ1dGUsIHNvIHRoYXQgQW50IAotY2FuIGZpbmQgdGhlIE1QYXJzZSBjbGFzc2VzLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1UaGlzIHRhc2sgb25seSBpbnZva2VzIE1QYXJzZSBpZiB0aGUgZ3JhbW1hciBmaWxlIGlzIG5ld2VyIHRoYW4gdGhlIGdlbmVyYXRlZCAKLUphdmEgZmlsZXMuIE1QYXJzZSBhc3N1bWVzIHRoYXQgdGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHBhcnNlcgotaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgdGhlIGdyYW1tYXIgZmlsZSwgbGVzcyB0aGUgLmpqIGV4dGVuc2lvbi4KLSZsdDsvcCZndDsKLSZsdDtwJmd0O0ZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IE1QYXJzZSwgcGxlYXNlIGNvbnN1bHQgdGhlIG9ubGluZSBtYW51YWwgYXZhaWxhYmxlICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL2Rvd25sb2FkLm1ldGFtYXRhLmNvbS9wYXJzZS5wZGYmcXVvdDsmZ3Q7aGVyZSZsdDsvYSZndDsKLShQREYpCi0mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9InRhcmdldCIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIC5qaiBncmFtbWFyIGZpbGUgdG8gcHJvY2Vzcy4gSXQgd2lsbCBvbmx5IGJlIHByb2Nlc3NlZGlmIHRoZSBncmFtbWFyIGlzIG5ld2VyIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgLmphdmEgZmlsZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibWV0YW1hdGFob21lIiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj5UaGUgaG9tZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgTWV0YW1hdGEgZGlzdHJpYnV0aW9uPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ2ZXJib3NlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkVuYWJsZSBhbGwgbWVzc2FnZXM8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImRlYnVncGFyc2VyIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkVuYWJsZXMgcGFyc2VyIGRlYnVnZ2luZzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZGVidWdzY2FubmVyIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkVuYWJsZXMgc2Nhbm5lciBkZWJ1Z2dpbmc8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNsZWFudXAiIFJFUVVJUkVEPSJuby4gZGVmYXVsdCB0byBmYWxzZSI+Ci0JCQk8REVTQ1JJUFRJT04+UmVtb3ZlIHRoZSBpbnRlcm1lZGlhdGUgU3VuSmF2YUNDIGZpbGUgY3JlYXRlZCBkdXJpbmcgdGhlIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBncmFtbWFyIGZpbGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9Im1heG1lbW9yeSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5TZXQgdGhlIG1heGltdW0gbWVtb3J5IGZvciB0aGUgSlZNLiB0aGlzIGlzIGEgY29udmVuaWVudHdheSB0byBzZXQgdGhlIC1teCBvciAtWG14IGFyZ3VtZW50PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9Im5hdGl2ZTJhc2NpaSI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDsKLUNvbnZlcnRzIGZpbGVzIGZyb20gbmF0aXZlIGVuY29kaW5ncyB0byBBU0NJSSB3aXRoIGVzY2FwZWQgVW5pY29kZS4KLUEgY29tbW9uIHVzYWdlIGlzIHRvIGNvbnZlcnQgc291cmNlIGZpbGVzIG1haW50YWluZWQgaW4gYSBuYXRpdmUKLW9wZXJhdGluZyBzeXN0ZW0gZW5jb2RpbmcsIHRvIEFTQ0lJIHByaW9yIHRvIGNvbXBpbGF0aW9uLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1GaWxlcyBpbiB0aGUgZGlyZWN0b3J5ICZsdDtlbSZndDtzcmMmbHQ7L2VtJmd0OwotYXJlIGNvbnZlcnRlZCBmcm9tIGEgbmF0aXZlIGVuY29kaW5nIHRvIEFTQ0lJLgotQnkgZGVmYXVsdCwgYWxsIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgYXJlIGNvbnZlcnRlZC4KLUhvd2V2ZXIsIGNvbnZlcnNpb24gbWF5IGJlIGxpbWl0ZWQgdG8gc2VsZWN0ZWQgZmlsZXMgdXNpbmcKLSZsdDtlbSZndDtpbmNsdWRlcyZsdDsvZW0mZ3Q7IGFuZCAmbHQ7ZW0mZ3Q7ZXhjbHVkZXMmbHQ7L2VtJmd0OyBhdHRyaWJ1dGVzLgotRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gZmlsZSBtYXRjaGluZyBwYXR0ZXJucywKLXNlZSB0aGUgc2VjdGlvbiBvbgotJmx0O2EgaHJlZj0mcXVvdDsuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MmcXVvdDsmZ3Q7ZGlyZWN0b3J5IGJhc2VkIHRhc2tzJmx0Oy9hJmd0Oy4KLUlmIG5vICZsdDtlbSZndDtlbmNvZGluZyZsdDsvZW0mZ3Q7IGlzIHNwZWNpZmllZCwKLXRoZSBkZWZhdWx0IGVuY29kaW5nIGZvciB0aGUgSlZNIGlzIHVzZWQuCi1JZiAmbHQ7ZW0mZ3Q7ZXh0Jmx0Oy9lbSZndDsgaXMgc3BlY2lmaWVkLCB0aGVuIG91dHB1dCBmaWxlcyBhcmUgcmVuYW1lZAotdG8gdXNlIGl0IGFzIGEgbmV3IGV4dGVuc2lvbi4KLU1vcmUgc29waGlzdGljYXRlZCBmaWxlIG5hbWUgdHJhbnNsYXRpb25zIGNhbiBiZSBhY2hpZXZlZCB1c2luZyBhIG5lc3RlZAotJmx0O2VtJmd0OyZhbXA7bHQ7bWFwcGVyJmFtcDtndDsmbHQ7L2VtJmd0OyBlbGVtZW50LiBCeSBkZWZhdWx0IGFuCi0mbHQ7YSBocmVmPSZxdW90Oy4uL0NvcmVUeXBlcy9tYXBwZXIuaHRtbCNpZGVudGl0eS1tYXBwZXImcXVvdDsmZ3Q7aWRlbnRpdHkgbWFwcGVyJmx0Oy9hJmd0OyB3aWxsIGJlIHVzZWQuCi1JZiAmbHQ7ZW0mZ3Q7ZGVzdCZsdDsvZW0mZ3Q7IGFuZCAmbHQ7ZW0mZ3Q7c3JjJmx0Oy9lbSZndDsgcG9pbnQgdG8gdGhlIHNhbWUgZGlyZWN0b3J5LAotdGhlICZsdDtlbSZndDtleHQmbHQ7L2VtJmd0OyBhdHRyaWJ1dGUgb3IgYSBuZXN0ZWQgJmx0O2VtJmd0OyZhbXA7bHQ7bWFwcGVyJmFtcDtndDsmbHQ7L2VtJmd0OwotaXMgcmVxdWlyZWQuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLVRoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCAmbHQ7YSBocmVmPSZxdW90Oy4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwmcXVvdDsmZ3Q7RmlsZSBTZXQmbHQ7L2EmZ3Q7LAotYW5kIHN1cHBvcnRzIGFsbCBhdHRyaWJ1dGVzIG9mICZsdDtjb2RlJmd0OyZhbXA7bHQ7ZmlsZXNldCZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OwotKCZsdDtjb2RlJmd0O2RpciZsdDsvY29kZSZndDsgYmVjb21lcyAmbHQ7Y29kZSZndDtzcmMmbHQ7L2NvZGUmZ3Q7KSBhcyB3ZWxsIGFzCi1uZXN0ZWQgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtpbmNsdWRlJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDsmYW1wO2x0O2V4Y2x1ZGUmYW1wO2d0OyZsdDsvY29kZSZndDssCi1hbmQgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtwYXR0ZXJuc2V0JmFtcDtndDsmbHQ7L2NvZGUmZ3Q7IGVsZW1lbnRzLgotJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJyZXZlcnNlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlJldmVyc2UgdGhlIHNlbnNlIG9mIHRoZSBjb252ZXJzaW9uLGkuZS4gY29udmVydCBmcm9tIEFTQ0lJIHRvIG5hdGl2PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJlbmNvZGluZyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5UaGUgbmF0aXZlIGVuY29kaW5nIHRoZSBmaWxlcyBhcmUgaW4oZGVmYXVsdCBpcyB0aGUgZGVmYXVsdCBlbmNvZGluZyBmb3IgdGhlIEpWTTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ic3JjIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlRoZSBkaXJlY3RvcnkgdG8gZmluZCBmaWxlcyBpbiAoZGVmYXVsdCBpcyBiYXNlZGlyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkZXN0IiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj5UaGUgZGlyZWN0b3J5IHRvIG91dHB1dCBmaWxlIHQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImV4dCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5GaWxlIGV4dGVuc2lvbiB0byB1c2UgaW4gcmVuYW1pbmcgb3V0cHV0IGZpbGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImRlZmF1bHRleGNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkIG9yIG5vdCgmcXVvdDt5ZXMmcXVvdDsvJnF1b3Q7bm8mcXVvdDspLkRlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbiBvbWl0dGVkLjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZWluY2x1ZGVkLiBBbGwgZmlsZXMgYXJlIGluY2x1ZGVkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iaW5jbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpc3Rha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJleGNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlIGV4Y2x1ZGVkLk5vIGZpbGVzIChleGNlcHQgZGVmYXVsdCBleGNsdWRlcykgYXJlIGV4Y2x1ZGVkIHdoZW4gb21pdHRlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpc3Rha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9Im5ldHJleHhjIj4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0NvbXBpbGVzIGEgJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vbmV0cmV4eCZxdW90OyB0YXJnZXQ9JnF1b3Q7X3RvcCZxdW90OyZndDtOZXRSZXh4Jmx0Oy9hJmd0Owotc291cmNlIHRyZWUgd2l0aGluIHRoZSBydW5uaW5nIChBbnQpIFZNLiZsdDsvcCZndDsKLSZsdDtwJmd0O1RoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSB3aWxsIGJlIHJlY3Vyc2l2ZWx5IHNjYW5uZWQgZm9yCi1OZXRSZXh4IHNvdXJjZSBmaWxlcyB0byBjb21waWxlLiAgT25seSBOZXRSZXh4IGZpbGVzIHRoYXQgaGF2ZSBubyBjb3JyZXNwb25kaW5nCi1jbGFzcyBmaWxlIG9yIHdoZXJlIHRoZSBjbGFzcyBmaWxlIGlzIG9sZGVyIHRoYW4gdGhlIGphdmEgZmlsZSB3aWxsIGJlIGNvbXBpbGVkLiZsdDsvcCZndDsKLSZsdDtwJmd0O0ZpbGVzIGluIHRoZSBzb3VyY2UgdHJlZSBhcmUgY29waWVkIHRvIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnksCi1hbGxvd2luZyBzdXBwb3J0IGZpbGVzIHRvIGJlIGxvY2F0ZWQgcHJvcGVybHkgaW4gdGhlIGNsYXNzcGF0aC4gVGhlIHNvdXJjZQotZmlsZXMgYXJlIGNvcGllZCBiZWNhdXNlIHRoZSBOZXRSZXh4IGNvbXBpbGVyIGNhbm5vdCBwcm9kdWNlIGNsYXNzIGZpbGVzIGluIGEKLXNwZWNpZmljIGRpcmVjdG9yeSB2aWEgcGFyYW1ldGVycyZsdDsvcCZndDsKLSZsdDtwJmd0O1RoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIG9mIHRoZSBzb3VyY2UgdHJlZSBzaG91bGQgZm9sbG93IHRoZSBwYWNrYWdlCi1oaWVyYXJjaHkuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7SXQgaXMgcG9zc2libGUgdG8gcmVmaW5lIHRoZSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgYmVpbmcgY29tcGlsZWQvY29waWVkLgotVGhpcyBjYW4gYmUgZG9uZSB3aXRoIHRoZSAmbHQ7aSZndDtpbmNsdWRlcyZsdDsvaSZndDssICZsdDtpJmd0O2luY2x1ZGVzZmlsZSZsdDsvaSZndDssICZsdDtpJmd0O2V4Y2x1ZGVzJmx0Oy9pJmd0OywgJmx0O2kmZ3Q7ZXhjbHVkZXNmaWxlJmx0Oy9pJmd0OyBhbmQKLSZsdDtpJmd0O2RlZmF1bHRleGNsdWRlcyZsdDsvaSZndDsgYXR0cmlidXRlcy4gV2l0aCB0aGUgJmx0O2kmZ3Q7aW5jbHVkZXMmbHQ7L2kmZ3Q7IG9yICZsdDtpJmd0O2luY2x1ZGVzZmlsZSZsdDsvaSZndDsgYXR0cmlidXRlIHlvdQotc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBpbmNsdWRlZCBieSB1c2luZyBwYXR0ZXJucy4gVGhlCi0mbHQ7aSZndDtleGNsdWRlJmx0Oy9pJmd0OyBvciAmbHQ7aSZndDtleGNsdWRlc2ZpbGUmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGVzIHlvdSB3YW50IHRvIGhhdmUKLWV4Y2x1ZGVkLiAgVGhpcyBpcyBhbHNvIGRvbmUgd2l0aCBwYXR0ZXJucy4gIEFuZCBmaW5hbGx5IHdpdGggdGhlCi0mbHQ7aSZndDtkZWZhdWx0ZXhjbHVkZXMmbHQ7L2kmZ3Q7IGF0dHJpYnV0ZSwgeW91IGNhbiBzcGVjaWZ5IHdoZXRoZXIgeW91Ci13YW50IHRvIHVzZSBkZWZhdWx0IGV4Y2x1c2lvbnMgb3Igbm90LiBTZWUgdGhlIHNlY3Rpb24gb24gJmx0O2EKLWhyZWY9JnF1b3Q7Li4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzJnF1b3Q7Jmd0O2RpcmVjdG9yeSBiYXNlZCB0YXNrcyZsdDsvYSZndDssIG9uIGhvdyB0aGUKLWluY2x1c2lvbi9leGNsdXNpb24gb2YgZmlsZXMgd29ya3MsIGFuZCBob3cgdG8gd3JpdGUgcGF0dGVybnMuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7VGhpcyB0YXNrIGZvcm1zIGFuIGltcGxpY2l0ICZsdDthIGhyZWY9JnF1b3Q7Li4vQ29yZVR5cGVzL2ZpbGVzZXQuaHRtbCZxdW90OyZndDtGaWxlU2V0Jmx0Oy9hJmd0OyBhbmQKLXN1cHBvcnRzIGFsbCBhdHRyaWJ1dGVzIG9mICZsdDtjb2RlJmd0OyZhbXA7bHQ7ZmlsZXNldCZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OwotKCZsdDtjb2RlJmd0O2RpciZsdDsvY29kZSZndDsgYmVjb21lcyAmbHQ7Y29kZSZndDtzcmNkaXImbHQ7L2NvZGUmZ3Q7KSBhcyB3ZWxsIGFzIHRoZSBuZXN0ZWQKLSZsdDtjb2RlJmd0OyZhbXA7bHQ7aW5jbHVkZSZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OywgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtleGNsdWRlJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7IGFuZAotJmx0O2NvZGUmZ3Q7JmFtcDtsdDtwYXR0ZXJuc2V0JmFtcDtndDsmbHQ7L2NvZGUmZ3Q7IGVsZW1lbnRzLiZsdDsvcCZndDsKLSZsdDtwJmd0O0FsbCBwcm9wZXJ0aWVzIGV4Y2VwdCBjbGFzc3BhdGgsIHNyY2RpciBhbmQgZGVzdERpciBhcmUgYWxzbyBhdmFpbGFibGUgYXMgcHJvcGVydGllcyBpbiB0aGUgZm9ybQotJmx0O2NvZGUmZ3Q7YW50Lm5ldHJleHhjLiZsdDtpJmd0O2F0dHJpYnV0ZW5hbWUmbHQ7L2kmZ3Q7Jmx0Oy9jb2RlJmd0OywgZWcuJmx0O2JyJmd0OwotJmx0O2NvZGUmZ3Q7JmFtcDtsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O2FudC5uZXRyZXh4Yy52ZXJib3NlJnF1b3Q7IHZhbHVlPSZxdW90O25vdmVyYm9zZSZxdW90Oy8mYW1wO2d0OyZsdDsvY29kZSZndDsmbHQ7YnImZ3Q7Ci1vciBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYXMmbHQ7YnImZ3Q7Ci0mbHQ7Y29kZSZndDthbnQgLURhbnQubmV0cmV4eGMudmVyYm9zZT1ub3ZlcmJvc2UgLi4uJmx0Oy9jb2RlJmd0OwotJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJiaW5hcnkiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+V2hldGhlciBsaXRlcmFscyBhcmUgdHJlYXRlZCBhcyB0aGUgamF2YSBiaW5hcnl0eXBlIHJhdGhlciB0aGFuIHRoZSBOZXRSZXh4IHR5cGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNsYXNzcGF0aCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5UaGUgY2xhc3NwYXRoIHRvIHVzZSBkdXJpbmcgY29tcGlsYXRpbzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY29tbWVudHMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+V2hldGhlciBjb21tZW50cyBhcmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlZ2VuZXJhdGVkIGphdmEgc291cmM8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNvbXBhY3QiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+V2hldGhlciBlcnJvciBtZXNzYWdlcyBjb21lIG91dCBpbiBjb21wYWN0IG9ydmVyYm9zZSBmb3JtYXQuIERlZmF1bHQgaXMgdGhlIGNvbXBhY3QgZm9ybWF0PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJjb21waWxlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPldoZXRoZXIgdGhlIE5ldFJleHggY29tcGlsZXIgc2hvdWxkIGNvbXBpbGUgdGhlZ2VuZXJhdGVkIGphdmEgY29kPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJjb25zb2xlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPldoZXRoZXIgb3Igbm90IG1lc3NhZ2VzIHNob3VsZCBiZSBkaXNwbGF5ZWQgb24gdGhlJ2NvbnNvbGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNyb3NzcmVmIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPldoZXRoZXIgdmFyaWFibGUgY3Jvc3MgcmVmZXJlbmNlcyBhcmUgZ2VuZXJhdGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImRlY2ltYWwiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+V2hldGhlciBkZWNpbWFsIGFyaXRobWV0aWMgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZU5ldFJleHggY29kPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJkZWZhdWx0ZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+aW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVub21pdHRlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZGVzdGRpciIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBOZXRSZXh4c291cmNlIGZpbGVzIHNob3VsZCBiZSBjb3BpZWQgYW5kIHRoZW4gY29tcGlsZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZGlhZyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5XaGV0aGVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGUgaXNnZW5lcmF0ZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZWV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVub21pdHRlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZXhjbHVkZXNmaWxlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpc3Rha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJleHBsaWNpdCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5XaGV0aGVyIHZhcmlhYmxlcyBtdXN0IGJlIGRlY2xhcmVkIGV4cGxpY2l0bHliZWZvcmUgdXM8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZvcm1hdCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5XaGV0aGVyIHRoZSBnZW5lcmF0ZWQgamF2YSBjb2RlIGlzIGZvcm1hdHRlZCBuaWNlbHlvciBsZWZ0IHRvIG1hdGNoIE5ldFJleHggbGluZSBudW1iZXJzIGZvciBjYWxsIHN0YWNrIGRlYnVnZ2luPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJpbmNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlaW5jbHVkZWQuIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJpbmNsdWRlc2ZpbGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXI8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImphdmEiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+V2hldGhlciB0aGUgZ2VuZXJhdGVkIGphdmEgY29kZSBpcyBwcm9kdWNlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJrZWVwIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlNldHMgd2hldGhlciB0aGUgZ2VuZXJhdGVkIGphdmEgc291cmNlIGZpbGUgc2hvdWxkIGJlIGtlcHRhZnRlciBjb21waWxhdGlvbi4gVGhlIGdlbmVyYXRlZCBmaWxlcyB3aWxsIGhhdmUgYW4gZXh0ZW5zaW9uIG9mLmphdmEua2VlcCwgbm90IC5qYXY8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImxvZ28iIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+V2hldGhlciB0aGUgY29tcGlsZXIgdGV4dCBsb2dvIGlzIGRpc3BsYXllZCB3aGVuY29tcGlsaW48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InJlcGxhY2UiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+V2hldGhlciB0aGUgZ2VuZXJhdGVkIC5qYXZhIGZpbGUgc2hvdWxkIGJlIHJlcGxhY2Vkd2hlbiBjb21waWxpbjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ic2F2ZWxvZyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5XaGV0aGVyIHRoZSBjb21waWxlciBtZXNzYWdlcyB3aWxsIGJlIHdyaXR0ZW4gdG9OZXRSZXh4Qy5sb2cgYXMgd2VsbCBhcyB0byB0aGUgY29uc29sPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzb3VyY2VkaXIiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGVsbHMgdGhlIE5ldFJleHggY29tcGlsZXIgdG8gc3RvcmUgdGhlIGNsYXNzIGZpbGVzIGluIHRoZXNhbWUgZGlyZWN0b3J5IGFzIHRoZSBzb3VyY2UgZmlsZXMuIFRoZSBhbHRlcm5hdGl2ZSBpcyB0aGUgd29ya2luZ2RpcmVjdG9yPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzcmNkaXIiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPlNldCB0aGUgc291cmNlIGRpciB0byBmaW5kIHRoZSBzb3VyY2UgTmV0UmV4eGZpbGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InN0cmljdGFyZ3MiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGVsbHMgdGhlIE5ldFJleHggY29tcGlsZXIgdGhhdCBtZXRob2QgY2FsbHMgYWx3YXlzbmVlZCBwYXJlbnRoZXNlcywgZXZlbiBpZiBubyBhcmd1bWVudHMgYXJlIG5lZWRlZCwgZS5nLmFTdHJpbmdWYXIuZ2V0Qnl0ZXMgdnMuYVN0cmluZ1Zhci5nZXRCeXRlcyg8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InN0cmljdGFzc2lnbiIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5UZWxscyB0aGUgTmV0UmV4eCBjb21waWxlIHRoYXQgYXNzaWdubWVudHMgbXVzdG1hdGNoIGV4YWN0bHkgb24gdHlwPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzdHJpY3RjYXNlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlNwZWNpZmllcyB3aGV0aGVyIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHNob3VsZCBiZWNhc2Ugc2Vuc2l0aXZlIG9yIG5vPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzdHJpY3RpbXBvcnQiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+V2hldGhlciBjbGFzc2VzIG5lZWQgdG8gYmUgaW1wb3J0ZWQgZXhwbGljaXRseSB1c2luZyBhbmltcG9ydCBzdGF0ZW1lbnQuICBCeSBkZWZhdWx0IHRoZSBOZXRSZXh4IGNvbXBpbGVyIHdpbGxpbXBvcnQgY2VydGFpbiBwYWNrYWdlcyBhdXRvbWF0aWNhbGw8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InN0cmljdHByb3BzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPldoZXRoZXIgbG9jYWwgcHJvcGVydGllcyBuZWVkIHRvIGJlIHF1YWxpZmllZGV4cGxpY2l0bHkgdXNpbmcgdGhpPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzdHJpY3RzaWduYWwiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+V2hldGhlciB0aGUgY29tcGlsZXIgc2hvdWxkIGZvcmNlIGNhdGNoaW5nIG9mZXhjZXB0aW9ucyBieSBleHBsaWNpdGx5IG5hbWVkIHR5cGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InN5bWJvbHMiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+V2hldGhlciBkZWJ1ZyBzeW1ib2xzIHNob3VsZCBiZSBnZW5lcmF0ZWQgaW50byB0aGVjbGFzcyBmaWw8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InRpbWUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+QXNrcyB0aGUgTmV0UmV4eCBjb21waWxlciB0byBwcmludCBjb21waWxhdGlvbnRpbWVzIHRvIHRoZSBjb25zb2w8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InRyYWNlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlR1cm5zIG9uIG9yIG9mZiB0cmFjaW5nIGFuZCBkaXJlY3RzIHRoZSByZXN1bHRhbnR0cmFjZSBvdXRwdTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idXRmOCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5UZWxscyB0aGUgTmV0UmV4eCBjb21waWxlciB0aGF0IHRoZSBzb3VyY2UgaXMgaW4gVVRGPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ2ZXJib3NlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPldoZXRoZXIgbG90cyBvZiB3YXJuaW5ncyBhbmQgZXJyb3IgbWVzc2FnZXMgc2hvdWxkYmUgZ2VuZXJhdGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InN1cHByZXNzbWV0aG9kYXJndW1lbnRub3R1c2VkIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlRlbGxzIHdoZXRoZXIgd2Ugc2hvdWxkIGZpbHRlciBvdXQgdGhlJmFtcDtNZXRob2QgYXJndW1lbnQgbm90IHVzZWQmYW1wOyBtZXNzYWdlcyBpbiBzdHJpY3RhcmdzIG1vZGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InN1cHByZXNzcHJpdmF0ZXByb3BlcnR5bm90dXNlZCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5UZWxscyB3aGV0aGVyIHdlIHNob3VsZCBmaWx0ZXIgb3V0IHRoZSZhbXA7UHJpdmF0ZSBQcm9wZXJ0eSBkZWZpbmVkLCBidXQgbm90IHVzZWQmYW1wOyBtZXNzYWdlcyBpbiBzdHJpY3RhcmdzIG1vZGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InN1cHByZXNzdmFyaWFibGVub3R1c2VkIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlRlbGxzIHdoZXRoZXIgd2Ugc2hvdWxkIGZpbHRlciBvdXQgdGhlJmFtcDtWYXJpYWJsZSBzZXQgYnV0IG5vdCB1c2VkJmFtcDsgbWVzc2FnZXMgaW4gc3RyaWN0YXJncyBtb2RlLlBsZWFzZSBiZSBjYXJlZnVsIHdpdGggdGhpcyBvbmUsIGFzIHlvdSBjYW4gaGlkZSBlcnJvcnMgYmVoaW5kIGl0PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzdXBwcmVzc2V4Y2VwdGlvbm5vdHNpZ25hbGxlZCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5UZWxscyB3aGV0aGVyIHdlIHNob3VsZCBmaWx0ZXIgb3V0IHRoZSZhbXA7RXhjZXB0aW9uIGlzIGRlY2xhcmVkLCBidXQgbm90IHNpZ25hbGxlZCB3aXRoaW4gdGhlIG1ldGhvZCZhbXA7bWVzc2FnZXMgaW4gc3RyaWN0c2lnbmFsIG1vZGU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InN1cHByZXNzZGVwcmVjYXRpb24iIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGVsbHMgd2V0aGVyIHdlIHNob3VsZCBmaWx0ZXIgb3V0IGFueSBkZXByZWNhdGlvbi1tZXNzYWdlc29mIHRoZSBjb21waWxlciBvdXQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0icHZjcyI+Ci0JCTxERVNDUklQVElPTj5UaGUgcHZjcyB0YXNrIGlzIHNldCB0byBwb2ludCBhdCBhIFBWQ1MgcmVwb3NpdG9yeSBhbmQgb3B0aW9uYWxseSBhIHByb2plY3QKLXdpdGhpbiB0aGF0IHJlcG9zaXRvcnksIGFuZCBjYW4gZnJvbSB0aGF0IHNwZWNpZmljYXRpb24gZ2V0IHRoZSBsYXRlc3QKLXZlcnNpb24gb2YgdGhlIGZpbGVzIGNvbnRhaW5lZCBieSB0aGUgcmVwb3NpdG9yeS4KLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0icmVwb3NpdG9yeSIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGxvY2F0aW9uIG9mIHRoZSByZXBvc2l0b3J5IChzZWUgeW91ciBQVkNTbWFudWFsczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0icHZjc3Byb2plY3QiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIHByb2plY3Qgd2l0aGluIHRoZSBQVkNTIHJlcG9zaXRvcnkgdG8gZXh0cmFjdGZpbGVzIGZyb20gKCZxdW90Oy8mcXVvdDsgaXMgcm9vdCBwcm9qZWN0IGFuZCB0aGF0IGlzIGRlZmF1bHQgaWYgdGhpcyBhdHRyaWJ1dGUgaXNuJ3RzcGVjaWZpZWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImxhYmVsIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPk9ubHkgZmlsZXMgbWFya2VkIHdpdGggdGhpcyBsYWJlbCBhcmUgZXh0cmFjdGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJwcm9tb3Rpb25ncm91cCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5Pbmx5IGZpbGVzIHdpdGhpbiB0aGlzIHByb21vdGlvbiBncm91cCBhcmUgZXh0cmFjdGVkLiBVc2luZ2JvdGggdGhlIGxhYmVsIGFuZCB0aGUgcHJvbW90aW9uZ3JvdXAgdGFnIHdpbGwgY2F1c2UgdGhlIGZpbGVzIGluIHRoZXByb21vdGlvbiBncm91cCBhbmQgd2l0aCB0aGF0IGxhYmVsIHRvIGJlIGV4dHJhY3RlZC48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZvcmNlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPklmIHNldCB0byB5ZXMgYWxsIGZpbGVzIHRoYXQgZXhpc3RzIGFuZCBhcmUgd3JpdGFibGUgYXJlIG92ZXJ3cml0dGVuLiBEZWZhdWx0IG5vIGNhdXNlcyB0aGUgZmlsZXMgdGhhdCBhcmUgd3JpdGFibGUgdG8gYmUgaWdub3JlZC4gVGhpcyBzdG9wcyB0aGUgUFZDUyBjb21tYW5kIGdldCB0byBzdG9wIGFza2luZyBxdWVzdGlvbnM8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9IndvcmtzcGFjZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5CeSBzcGVjaWZ5aW5nIGEgd29ya3NwYWNlLCB0aGUgZmlsZXMgYXJlIGV4dHJhY3RlZCB0byB0aGF0IGxvY2F0aW9uLiBBIFBWQ1Mgd29ya3NwYWNlIGlzIGFuYW1lIGZvciBhIGxvY2F0aW9uIG9mIHRoZSB3b3JrZmlsZXMgYW5kIGlzbid0IGFzIHN1Y2ggdGhlIGxvY2F0aW9uIGl0c2VsZi4gWW91IGRlZmluZSB0aGUgbG9jYXRpb24gZm9yIGEgd29ya3NwYWNldXNpbmcgdGhlIFBWQ1MgR1VJIGNsaWVudHMuIElmIHRoaXMgaXNuJ3Qgc3BlY2lmaWVkIHRoZSBkZWZhdWx0IHdvcmtzcGFjZSBmb3IgdGhlIGN1cnJlbnQgdXNlciBpcyB1c2VkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJwdmNzYmluIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPk9uIHNvbWUgc3lzdGVtcyB0aGUgUFZDUyBleGVjdXRhYmxlcyBwY2xpYW5kIGdldCBhcmUgbm90IGZvdW5kIGluIHRoZSBQQVRILiBJbiBzdWNoIGNhc2VzIHRoaXMgYXR0cmlidXRlc2hvdWxkIGJlIHNldCB0byB0aGUgYmluIGRpcmVjdG9yeSBvZiB0aGUgUFZDUyBpbnN0YWxsYXRpb24gY29udGFpbmluZ3RoZSBleGVjdXRhYmxlcyBtZW50aW9uZWQgYmVmb3JlLiBJZiB0aGlzIGF0dHJpYnV0ZSBpc24ndCBzcGVjaWZpZWQgdGhldGFnIGV4cGVjdHMgdGhlIGV4ZWN1dGFibGVzIHRvIGJlIGZvdW5kIHVzaW5nIHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJpZ25vcmVyZXR1cm5jb2RlIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPklmIHNldCB0byB0cnVlIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBleGVjdXRpbmd0aGUgcHZjcyBjb21tYW5kcyBhcmUgaWdub3JlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idXBkYXRlb25seSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5JZiBzZXQgdG8gdHJ1ZSBmaWxlcyBhcmUgZ290dGVuIG9ubHkgaWZuZXdlciB0aGFuIGV4aXN0aW5nIGxvY2FsIGZpbGVzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJmaWxlbmFtZWZvcm1hdCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5UaGUgZm9ybWF0IG9mIHlvdXIgZm9sZGVyIG5hbWVzIGluIGFmb3JtYXQgc3VpdGFibGUgZm9yIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LkRlZmF1bHRzIHRvIHswfS1hcmMoezF9KS4gIFJlcG9zaXRvcmllcyB3aGVyZXRoZSBhcmNoaXZlIGV4dGVuc2lvbiBpcyBub3QgIC1hcmMgc2hvdWxkIHNldHRoaXM8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImxpbmVzdGFydCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5Vc2VkIHRvIHBhcnNlIHRoZSBvdXRwdXQgb2YgdGhlIHBjbGljb21tYW5kLiBJdCBkZWZhdWx0cyB0byAmcXVvdDtQOi4gIFRoZSBwYXJzZXIgYWxyZWFkeWtub3dzIGFib3V0IC8gYW5kIFxcLCB0aGlzIHByb3BlcnR5IGlzIHVzZWZ1bCBpbiBjYXNlcyB3aGVyZSB0aGVyZXBvc2l0b3J5IGlzIGFjY2Vzc2VkIG9uIGEgV2luZG93cyBwbGF0Zm9ybSB2aWEgYSBkcml2ZSBsZXR0ZXJtYXBwaW5nPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9InJlbmFtZWV4dGVuc2lvbnMiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7UmVuYW1lcyBmaWxlcyBpbiB0aGUgJmx0O2NvZGUmZ3Q7c3JjRGlyJmx0Oy9jb2RlJmd0OyBkaXJlY3RvcnkgZW5kaW5nIHdpdGggdGhlCi0mbHQ7Y29kZSZndDtmcm9tRXh0ZW5zaW9uJmx0Oy9jb2RlJmd0OyBzdHJpbmcgc28gdGhhdCB0aGV5IGVuZCB3aXRoIHRoZQotJmx0O2NvZGUmZ3Q7dG9FeHRlbnNpb24mbHQ7L2NvZGUmZ3Q7IHN0cmluZy4gRmlsZXMgYXJlIG9ubHkgcmVwbGFjZWQgaWYKLSZsdDtjb2RlJmd0O3JlcGxhY2UmbHQ7L2NvZGUmZ3Q7IGlzIHRydWUKLSZsdDsvcCZndDsKLSZsdDtwJmd0O1NlZSB0aGUgc2VjdGlvbiBvbgotJmx0O2EgaHJlZj0mcXVvdDsuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MmcXVvdDsmZ3Q7ZGlyZWN0b3J5IGJhc2VkIHRhc2tzJmx0Oy9hJmd0Oywgb24gaG93IHRoZQotaW5jbHVzaW9uL2V4Y2x1c2lvbiBvZiBmaWxlcyB3b3JrcywgYW5kIGhvdyB0byB3cml0ZSBwYXR0ZXJucy4KLVRoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCAmbHQ7YSBocmVmPSZxdW90Oy4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwmcXVvdDsmZ3Q7RmlsZVNldCZsdDsvYSZndDsgYW5kCi1zdXBwb3J0cyBhbGwgYXR0cmlidXRlcyBvZiAmbHQ7Y29kZSZndDsmYW1wO2x0O2ZpbGVzZXQmYW1wO2d0OyZsdDsvY29kZSZndDsKLSgmbHQ7Y29kZSZndDtkaXImbHQ7L2NvZGUmZ3Q7IGJlY29tZXMgJmx0O2NvZGUmZ3Q7c3JjRGlyJmx0Oy9jb2RlJmd0OykgYXMgd2VsbCBhcyB0aGUgbmVzdGVkCi0mbHQ7Y29kZSZndDsmYW1wO2x0O2luY2x1ZGUmYW1wO2d0OyZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0OyZhbXA7bHQ7ZXhjbHVkZSZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyBhbmQKLSZsdDtjb2RlJmd0OyZhbXA7bHQ7cGF0dGVybnNldCZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyBlbGVtZW50cy4mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9ImRlZmF1bHRleGNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkIG9yIG5vdCgmcXVvdDt5ZXMmcXVvdDsvJnF1b3Q7bm8mcXVvdDspLiBEZWZhdWx0IGV4Y2x1ZGVzIGFyZSB1c2VkIHdoZW5vbWl0dGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJleGNsdWRlcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlZXhjbHVkZWQuIE5vIGZpbGVzIChleGNlcHQgZGVmYXVsdCBleGNsdWRlcykgYXJlIGV4Y2x1ZGVkIHdoZW5vbWl0dGVkPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJleGNsdWRlc2ZpbGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXI8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZyb21leHRlbnRpb24iIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPlRoZSBzdHJpbmcgdGhhdCBmaWxlcyBtdXN0IGVuZCBpbiB0byBiZSByZW5hbWU8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmVpbmNsdWRlZC4gQWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImluY2x1ZGVzZmlsZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXN0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0icmVwbGFjZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5XaGV0aGVyIHRoZSBmaWxlIGJlaW5nIHJlbmFtZWQgdG8gc2hvdWxkIGJlcmVwbGFjZWQgaWYgaXQgYWxyZWFkeSBleGlzdDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ic3JjZGlyIiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj5UaGUgc3RhcnRpbmcgZGlyZWN0b3J5IGZvciBmaWxlcyB0byBzZWFyY2ggaTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idG9leHRlbnNpb24iIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPlRoZSBzdHJpbmcgdGhhdCByZW5hbWVkIGZpbGVzIHdpbGwgZW5kIHdpdGggb25jb21wbGV0aW88L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0icmVwbGFjZXJlZ2VleHAiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7UmVwbGFjZVJlZ0V4cCBpcyBhIGRpcmVjdG9yeSBiYXNlZCB0YXNrIGZvciByZXBsYWNpbmcgdGhlCi1vY2N1cnJlbmNlIG9mIGEgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIHdpdGggYSBzdWJzdGl0dXRpb24gcGF0dGVybgotaW4gYSBzZWxlY3RlZCBmaWxlIG9yIHNldCBvZiBmaWxlcy4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDtTaW1pbGFyIHRvICZsdDthIGhyZWY9JnF1b3Q7Li4vQ29yZVR5cGVzL21hcHBlci5odG1sI3JlZ2V4cC1tYXBwZXImcXVvdDsmZ3Q7cmVnZXhwCi10eXBlIG1hcHBlcnMmbHQ7L2EmZ3Q7IHRoaXMgdGFzayBuZWVkcyBhIHN1cHBvcnRpbmcgcmVndWxhciBleHByZXNzaW9uCi1saWJyYXJ5IGFuZCBhbiBpbXBsZW1lbnRhdGlvbiBvZgotJmx0O2NvZGUmZ3Q7b3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuUmVnZXhwJmx0Oy9jb2RlJmd0Oy4gIEFudCBjb21lcyB3aXRoCi1pbXBsZW1lbnRhdGlvbnMgZm9yCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQvZG9jcy9hcGkvamF2YS91dGlsL3JlZ2V4L3BhY2thZ2Utc3VtbWFyeS5odG1sJnF1b3Q7IHRhcmdldD0mcXVvdDtfdG9wJnF1b3Q7Jmd0O3RoZSBqYXZhLnV0aWwucmVnZXggcGFja2FnZSBvZiBKREsgMS40Jmx0Oy9hJmd0OywKLSZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9yZWdleHAvJnF1b3Q7IHRhcmdldD0mcXVvdDtfdG9wJnF1b3Q7Jmd0O2pha2FydGEtcmVnZXhwJmx0Oy9hJmd0OwotYW5kICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9vcm8vJnF1b3Q7IHRhcmdldD0mcXVvdDtfdG9wJnF1b3Q7Jmd0O2pha2FydGEtT1JPJmx0Oy9hJmd0OywKLWJ1dCB5b3Ugd2lsbCBzdGlsbCBuZWVkIHRoZSBsaWJyYXJ5IGl0c2VsZi4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSZsdDtpJmd0OwotVGhlcmUgYXJlIGNyb3NzLXBsYXRmb3JtIGlzc3VlcyBmb3IgbWF0Y2hlcyByZWxhdGVkIHRvIGxpbmUgdGVybWluYXRvci4KLUZvciBleGFtcGxlIGlmIHlvdSB1c2UgJCB0byBhbmNob3IgeW91ciByZWd1bGFyIGV4cHJlc3Npb24gb24gdGhlIGVuZCBvZiBhIGxpbmUKLXRoZSByZXN1bHRzIG1pZ2h0IGJlIHZlcnkgZGlmZmVyZW50IGRlcGVuZGluZyBvbiBib3RoIHlvdXIgcGxhdGZvcm0gYW5kIHRoZSByZWd1bGFyCi1leHByZXNzaW9uIGxpYnJhcnkgeW91IHVzZS4gSXQgaXMgJ2hpZ2hseSByZWNvbW1lbmRlZCcgdGhhdCB5b3UgdGVzdCB5b3VyIHBhdHRlcm4gb24KLWJvdGggVW5peCBhbmQgV2luZG93cyBwbGF0Zm9ybXMgYmVmb3JlIHlvdSByZWx5IG9uIGl0LgotJmx0O3VsJmd0OwotJmx0O2xpJmd0O0pha2FydGEgT3JvIGRlZmluZXMgYSBsaW5lIHRlcm1pbmF0b3IgYXMgJ1xuJyBhbmQgaXMgY29uc2lzdGVudCB3aXRoIFBlcmwuJmx0Oy9saSZndDsKLSZsdDtsaSZndDtKYWthcnRhIFJlZ0V4cCB1c2VzIGEgc3lzdGVtLWRlcGVuZGFudCBsaW5lIHRlcm1pbmF0b3IuJmx0Oy9saSZndDsKLSZsdDtsaSZndDtKREsgMS40IHVzZXMgJ1xuJywgJ1xyXG4nLCAnXHUwMDg1JywgJ1x1MjAyOCcsICdcdTIwMjknIGFzIGEgZGVmYXVsdAotYnV0IGlzIGNvbmZpZ3VyZWQgaW4gdGhlIHdyYXBwZXIgdG8gdXNlIG9ubHkgJ1xuJyAoVU5JWF9MSU5FKSZsdDsvbGkmZ3Q7Ci0mbHQ7L3VsJmd0OwotV2UgJmx0O2ImZ3Q7c3Ryb25nbHkmbHQ7L2ImZ3Q7IHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgSmFrYXJ0YSBPcm8uCi0mbHQ7L2kmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9ImZpbGUiIFJFUVVJUkVEPSJ5ZXMgaWYgbm8gbmVzdGVkICZsdDtmaWxlc2V0Jmd0OyBpcyB1c2VkIj4KLQkJCTxERVNDUklQVElPTj5maWxlIGZvciB3aGljaCB0aGUgcmVndWxhciBleHByZXNzaW9uIHNob3VsZCBiZSByZXBsYWNlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibWF0Y2giIFJFUVVJUkVEPSJ5ZXMsIGlmIG5vIG5lc3RlZCAmbHQ7cmVnZXhwJmd0OyBpcyB1c2VkIj4KLQkJCTxERVNDUklQVElPTj5UaGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gdG8gbWF0Y2ggaW4gdGhlIGZpbGUoczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0icmVwbGFjZSIgUkVRVUlSRUQ9InllcywgaWYgbm8gbmVzdGVkICZsdDtzdWJzdGl0dXRpb24mZ3Q7IGlzIHVzZWQiPgotCQkJPERFU0NSSVBUSU9OPlRoZSBzdWJzdGl0dXRpb24gcGF0dGVybiB0byBwbGFjZSBpbiB0aGUgZmlsZShzKSBpbiBwbGFjZW9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb248L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImZsYWdzIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlRoZSBmbGFncyB0byB1c2Ugd2hlbiBtYXRjaGluZyB0aGUgcmVndWxhciBleHByZXNzaW9uLiAgRm9yIG1vcmVpbmZvcm1hdGlvbiwgY29uc3VsdCB0aGUgUGVybDUgc3ludGFnIDogR2xvYmFsIHJlcGxhY2VtZW50LiAgUmVwbGFjZSBhbGwgb2NjdXJlbmNlcyBmb3VuaSA6IENhc2UgSW5zZW5zaXRpdmUuICBEbyBub3QgY29uc2lkZXIgY2FzZSBpbiB0aGUgbWF0Y20gOiBNdWx0aWxpbmUuICBUcmVhdCB0aGUgc3RyaW5nIGFzIG11bHRpcGxlIGxpbmVzIG9mIGlucHV0LCB1c2luZyAmcXVvdDteJnF1b3Q7IGFuZCAmcXVvdDskJnF1b3Q7IGFzIHRoZSBzdGFydCBvciBlbmQgb2YgYW55IGxpbmUsIHJlc3BlY3RpdmVseSwgcmF0aGVyIHRoYW4gc3RhcnQgb3IgZW5kIG9mIHN0cmluZ3MgOiBTaW5nbGVsaW5lLiAgVHJlYXQgdGhlIHN0cmluZyBhcyBhIHNpbmdsZSBsaW5lIG9mIGlucHV0LCB1c2luZyAmcXVvdDsuJnF1b3Q7IHRvIG1hdGNoIGFueSBjaGFyYWN0ZXIsIGluY2x1ZGluZyBhIG5ld2xpbmUsIHdoaWNoIG5vcm1hbGx5LCBpdCB3b3VsZCBub3QgbWF0Y2g8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImJ5bGluZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5Qcm9jZXNzIHRoZSBmaWxlKHMpIG9uZSBsaW5lIGF0IGEgdGltZSwgZXhlY3V0aW5nIHRoZSByZXBsYWNlbWVudG9uIG9uZSBsaW5lIGF0IGEgdGltZSAodHJ1ZS9mYWxzZSkuICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3V3YW50IHRvIG9ubHkgcmVwbGFjZSB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIGEgcmVndWxhciBleHByZXNzaW9uIG9uZWFjaCBsaW5lLCB3aGljaCBpcyBub3QgZWFzeSB0byBkbyB3aGVuIHByb2Nlc3NpbmcgdGhlIGZpbGUgYXMgYSB3aG9sZS5EZWZhdWx0cyB0byBmYWxzZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJycG0iPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7Ci1BIGJhc2ljIHRhc2sgZm9yIGludm9raW5nIHRoZSBycG0gZXhlY3V0YWJsZSB0byBidWlsZCBhIExpbnV4IGluc3RhbGxhdGlvbgotZmlsZS4gVGhlIHRhc2sgY3VycmVudGx5IG9ubHkgd29ya3Mgb24gTGludXggb3Igb3RoZXIgVW5peCBwbGF0Zm9ybXMKLXdpdGggcnBtIHN1cHBvcnQuCi0mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9InNwZWNmaWxlIiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj5UaGUgbmFtZSBvZiB0aGUgc3BlYyBGaWxlIHRvIGJlIHVzZWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InRvcGRpciIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj50aGlzIGlzIHRoZSBkaXJlY3Rvcnkgd2hpY2ggd2lsbCBoYXZlIHRoZSBleHBlY3RlZHN1YmRpcmVjdG9yaWVzLCBTUEVDUywgU09VUkNFUywgQlVJTEQsIFNSUE1TLiAgSWYgdGhpcyBpc24ndCBzcGVjaWZpZWQsdGhlIGJhc2VEaXIgdmFsdWUgaXMgdXNlZDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY2xlYW5idWlsZGRpciIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5UaGlzIHdpbGwgcmVtb3ZlIHRoZSBnZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIEJVSUxEZGlyZWN0b3J5PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJyZW1vdmVzcGVjIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnRoaXMgd2lsbCByZW1vdmUgdGhlIHNwZWMgZmlsZSBmcm9tIFNQRUM8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InJlbW92ZXNvdXJjZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5GbGFnIChvcHRpb25hbCwgZGVmYXVsdD1mYWxzZSkgdG8gcmVtb3ZlIHRoZSBzb3VyY2VzIGFmdGVyIHRoZSBidWlsZC5TZWUgdGhlIHRoZSAtLXJtc291cmNlICBvcHRpb24gb2YgcnBtYnVpbGQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNvbW1hbmQiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dmVyeSBzaW1pbGFyIGlkZWEgdG8gdGhlIGN2cyB0YXNrLiAgdGhlIGRlZmF1bHQgaXMgJnF1b3Q7LWJiPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJvdXRwdXQvZXJyb3IiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+d2hlcmUgc3RhbmRhcmQgb3V0cHV0IGFuZCBlcnJvciBnPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9InNjcmlwdCI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtFeGVjdXRlIGEgc2NyaXB0IGluIGEgCi0mbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3ctMTI0LmlibS5jb20vZGV2ZWxvcGVyd29ya3MvcHJvamVjdHMvYnNmJnF1b3Q7IHRhcmdldD0mcXVvdDtfdG9wJnF1b3Q7Jmd0O0JTRiZsdDsvYSZndDsgc3VwcG9ydGVkIGxhbmd1YWdlLiZsdDsvcCZndDsKLSZsdDtwJmd0OyZsdDtiJmd0O05vdGU6Jmx0Oy9iJmd0OyBUaGlzIHRhc2sgZGVwZW5kcyBvbiBleHRlcm5hbCBsaWJyYXJpZXMgbm90IGluY2x1ZGVkIGluIHRoZSBBbnQgZGlzdHJpYnV0aW9uLgotU2VlICZsdDthIGhyZWY9JnF1b3Q7Li4vaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMmcXVvdDsmZ3Q7TGlicmFyeSBEZXBlbmRlbmNpZXMmbHQ7L2EmZ3Q7IGZvciBtb3JlIGluZm9ybWF0aW9uLiZsdDsvcCZndDsKLSZsdDtwJmd0O0FsbCBpdGVtcyAodGFza3MsIHRhcmdldHMsIGV0Yykgb2YgdGhlIHJ1bm5pbmcgcHJvamVjdCBhcmUKLWFjY2Vzc2libGUgZnJvbSB0aGUgc2NyaXB0LCB1c2luZyBlaXRoZXIgdGhlaXIgJmx0O2NvZGUmZ3Q7bmFtZSZsdDsvY29kZSZndDsgb3IKLSZsdDtjb2RlJmd0O2lkJmx0Oy9jb2RlJmd0OyBhdHRyaWJ1dGVzIChhcyBsb25nIGFzIHRoZWlyIG5hbWVzIGFyZSBjb25zaWRlcmVkCi12YWxpZCBKYXZhIGlkZW50aWZpZXJzLCB0aGF0IGlzKS4gCi1UaGUgbmFtZSAmcXVvdDtwcm9qZWN0JnF1b3Q7IGlzIGEgcHJlLWRlZmluZWQgcmVmZXJlbmNlIHRvIHRoZSBQcm9qZWN0LCB3aGljaCBjYW4gYmUKLXVzZWQgaW5zdGVhZCBvZiB0aGUgcHJvamVjdCBuYW1lLiZsdDsvcCZndDsKLSZsdDtwJmd0OyZsdDtiJmd0O0JlYW5TaGVsbCB1c2VyczombHQ7L2ImZ3Q7IFRoaXMgdGFzayBub3cgbmF0aXZlbHkgc3VwcG9ydHMgdGhlIEJlYW5TaGVsbAotc2NyaXB0aW5nIGxhbmd1YWdlLCB1c2luZyBsYW5ndWFnZT0mcXVvdDtiZWFuc2hlbGwmcXVvdDsuIFRoZSBCZWFuU2hlbGwgZW5naW5lIGlzCi1zdGlsbCByZXF1aXJlZC4KLSZsdDsvcCZndDsKLSZsdDtwJmd0O1NjcmlwdHMgY2FuIGRvIGFsbW9zdCBhbnl0aGluZyBhIHRhc2sgd3JpdHRlbiBpbiBKYXZhIGNvdWxkIGRvLiZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0ibGFuZ3VhZ2UiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPlRoZSBwcm9ncmFtbWluZyBsYW5ndWFnZSB0aGUgc2NyaXB0IGlzIHdyaXR0ZW4gaW4uTXVzdCBiZSBhIHN1cHBvcnRlZCBCU0YgbGFuZ3VhZzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ic3JjIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlRoZSBsb2NhdGlvbiBvZiB0aGUgc2NyaXB0IGFzIGEgZmlsZSwgaWYgbm90IGlubGluPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9InNlcnZlcmRlcGxveSI+Ci0JCTxERVNDUklQVElPTj4mbHQ7cCZndDtUaGUgJmx0O2NvZGUmZ3Q7c2VydmVyZGVwbG95Jmx0Oy9jb2RlJmd0OyB0YXNrIGlzIHVzZWQgdG8gcnVuIGEgJnF1b3Q7aG90JnF1b3Q7IGRlcGxveW1lbnQgdG9vbCBmb3IKLXZlbmRvci1zcGVjaWZpYyBKMkVFIHNlcnZlci4gVGhlIHRhc2sgcmVxdWlyZXMgbmVzdGVkIGVsZW1lbnRzIHdoaWNoIGRlZmluZQotdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHZlbmRvci1zcGVjaWZpYyBkZXBsb3ltZW50IHRvb2wgYmVpbmcgZXhlY3V0ZWQuCi1WZW5kb3Itc3BlY2lmaWMgZGVwbG95bWVudCB0b29scyBlbGVtZW50cyBtYXkgZW5mb3JjZSBydWxlcyBmb3Igd2hpY2gKLWF0dHJpYnV0ZXMgYXJlIHJlcXVpcmVkLCBkZXBlbmRpbmcgb24gdGhlIHRvb2wuCi0mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9ImFjdGlvbiIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhpcyBpcyB0aGUgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZC4gIEZvciBtb3N0IGNhc2VzIHRoaXN3aWxsIGJlICZxdW90O2RlcGxveSZxdW90Oy4gIFNvbWUgdG9vbHMgc3VwcG9ydCBhZGRpdGlvbmFsIGFjdGlvbnMsIHN1Y2ggYXMgJnF1b3Q7ZGVsZXRlJnF1b3Q7LCAmcXVvdDtsaXN0JnF1b3Q7LCZxdW90O3VuZGVwbG95JnF1b3Q7LCAmcXVvdDt1cGRhdGUmcXVvdDsuLjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ic291cmNlIiBSRVFVSVJFRD0idG9vbCBkZXBlbmRhbnQiPgotCQkJPERFU0NSSVBUSU9OPkEgZnVsbHkgcXVhbGlmaWVkIHBhdGgvZmlsZW5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBkZXBsb3llZC5UaGlzIG1heSBiZSBhbiAuZWFyLCAuamFyLCAud2FyLCBvciBhbnkgb3RoZXIgdHlwZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGUgc2VydmVyLjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJzcGxhc2giPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7VGhpcyB0YXNrIGNyZWF0ZXMgYSBzcGxhc2ggc2NyZWVuLiBUaGUgc3BsYXNoIHNjcmVlbiBpcyBkaXNwbGF5ZWQKLWZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGJ1aWxkIGFuZCBpbmNsdWRlcyBhIGhhbmR5IHByb2dyZXNzIGJhciBhcwotd2VsbC4gVXNlIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHNvdW5kIHRhc2sgdG8gcHJvdmlkZSBpbnRlcmVzdAotd2hpbHN0IHdhaXRpbmcgZm9yIHlvdXIgYnVpbGRzIHRvIGNvbXBsZXRlLi4uJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJpbWFnZXVybCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5BIFVSTCBwb2ludGluZyB0byBhbiBpbWFnZSB0byBkaXNwbGF5PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzaG93ZHVyYXRpb24iIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+SW5pdGlhbCBwZXJpb2QgdG8gcGF1c2UgdGhlIGJ1aWxkIHRvIHNob3cgdGhlc3BsYXNoIGluIG1pbGxpc2Vjb25kczwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJzdHlsZWJvb2siPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7VGhpcyBleGVjdXRlcyB0aGUgYXBhY2hlIFN0eWxlYm9vayBkb2N1bWVudGF0aW9uIGdlbmVyYXRvci4gCi1Vbmxpa2UgdGhlIGNvbW1hbmRsaW5lIHZlcnNpb24gb2YgdGhpcyB0b29sLCBhbGwgdGhyZWUgYXJndW1lbnRzCi1hcmUgcmVxdWlyZWQgdG8gcnVuIHN0eWxlYm9vay4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsmbHQ7YiZndDtOb3RlOiZsdDsvYiZndDsgVGhpcyB0YXNrIGRlcGVuZHMgb24gZXh0ZXJuYWwgbGlicmFyaWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUgQW50IGRpc3RyaWJ1dGlvbi4KLVNlZSAmbHQ7YSBocmVmPSZxdW90Oy4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzJnF1b3Q7Jmd0O0xpYnJhcnkgRGVwZW5kZW5jaWVzJmx0Oy9hJmd0OyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLUJlaW5nIGV4dGVuZGVkIGZyb20gJmFtcDtsdDtKYXZhJmFtcDtndDssIGFsbCB0aGUgcGFyZW50J3MgYXR0cmlidXRlcwotYW5kIG9wdGlvbnMgYXJlIGF2YWlsYWJsZS4gRG8gbm90IHNldCBhbnkgYXBhcnQgZnJvbSB0aGUgJmx0O3R0Jmd0O2NsYXNzcGF0aCZsdDsvdHQmZ3Q7Ci1hcyB0aGV5IGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSB0aGVyZSBpbiBmdXR1cmUuCi0mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9ImJvb2siIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPnRoZSBib29rIHhtbCBmaWxlIHRoYXQgdGhlIGRvY3VtZW50YXRpb24gZ2VuZXJhdGlvbiBzdGFydHMgZnJvbTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ic2tpbmRpcmVjdG9yeSIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSBzdHlsZWJvb2sgc2tpbjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0idGFyZ2V0ZGlyZWN0b3J5IiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj50aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IHdoZXJlIHRoZSBkb2N1bWVudGF0aW9uIGlzIGdlbmVyYXRlZCA8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0idGVsbmV0Ij4KLQkJPERFU0NSSVBUSU9OPlRhc2sgdG8gYXV0b21hdGUgYSByZW1vdGUgdGVsbmV0IHNlc3Npb24uIFRoZSB0YXNrIHVzZXMgCi1uZXN0ZWQgJmx0O3R0Jmd0OyZhbXA7bHQ7cmVhZCZhbXA7Z3Q7Jmx0Oy90dCZndDsgdG8gaW5kaWNhdGUgc3RyaW5ncyB0byB3YWl0IGZvciwgYW5kCi0mbHQ7dHQmZ3Q7JmFtcDtsdDt3cml0ZSZhbXA7Z3Q7Jmx0Oy90dCZndDsgdGFncyB0byBzcGVjaWZ5IHRleHQgdG8gc2VuZC4gIAotJmx0O3AmZ3Q7SWYgeW91IGRvIHNwZWNpZnkgYSB1c2VyaWQgYW5kIHBhc3N3b3JkLCB0aGUgc3lzdGVtIHdpbGwgCi1hc3N1bWUgYSBjb21tb24gdW5peCBwcm9tcHQgdG8gd2FpdCBvbi4gVGhpcyBiZWhhdmlvciBjYW4gYmUgZWFzaWx5IG92ZXItcmlkZGVuLiZsdDsvcCZndDsKLSZsdDtwJmd0OyZsdDtiJmd0O05vdGU6Jmx0Oy9iJmd0OyBUaGlzIHRhc2sgZGVwZW5kcyBvbiBleHRlcm5hbCBsaWJyYXJpZXMgbm90IGluY2x1ZGVkIGluIHRoZSBBbnQgZGlzdHJpYnV0aW9uLgotU2VlICZsdDthIGhyZWY9JnF1b3Q7Li4vaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMmcXVvdDsmZ3Q7TGlicmFyeSBEZXBlbmRlbmNpZXMmbHQ7L2EmZ3Q7IGZvciBtb3JlIGluZm9ybWF0aW9uLiZsdDsvcCZndDsKLTwvREVTQ1JJUFRJT04+Ci0JCTxBVFRSSUJVVEUgTkFNRT0idXNlcmlkIiBSRVFVSVJFRD0ib25seSBpZiBwYXNzd29yZCBpcyBzcGVjaWZpZWQiPgotCQkJPERFU0NSSVBUSU9OPnRoZSBsb2dpbiBpZCB0byB1c2Ugb24gdGhlIHRlbG5ldCBzZXJ2ZXI8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InBhc3N3b3JkIiBSRVFVSVJFRD0ib25seSBpZiB1c2VyaWQgaXMgc3BlY2lmaWVkIj4KLQkJCTxERVNDUklQVElPTj50aGUgbG9naW4gcGFzc3dvcmQgdG8gdXNlIG9uIHRoZSB0ZWxuZXQgc2VydmVyPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzZXJ2ZXIiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPnRoZSBhZGRyZXNzIG9mIHRoZSByZW1vdGUgdGVsbmV0IHNlcnZlcjwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0icG9ydCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj50aGUgcG9ydCBudW1iZXIgb2YgdGhlIHJlbW90ZSB0ZWxuZXQgc2VydmVyLiBEZWZhdWx0cyB0byBwb3J0IDIzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJpbml0aWFsY3IiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+c2VuZCBhIGNyIGFmdGVyIGNvbm5lY3RpbmcgKCZxdW90O3llcyZxdW90OykuIERlZmF1bHRzIHRvICZxdW90O25vJnF1b3Q7PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJ0aW1lb3V0IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPnNldCBhIGRlZmF1bHQgdGltZW91dCB0byB3YWl0IGZvciBhIHJlc3BvbnNlLiBTcGVjaWZpZWQgaW4gc2Vjb25kcy4gRGVmYXVsdCBpcyBubyB0aW1lb3V0PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9InRlc3QiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7VGhpcyBpcyBhIHByaW1pdGl2ZSB0YXNrIHRvIGV4ZWN1dGUgYSB1bml0IHRlc3QgaW4gdGhlIG9yZy5hcGFjaGUudGVzdGxldCBmcmFtZXdvcmsuJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Jmx0O3N0cm9uZyZndDtOb3RlOiZsdDsvc3Ryb25nJmd0OyBUaGlzIHRhc2sgZGVwZW5kcyBvbiBleHRlcm5hbCBsaWJyYXJpZXMgbm90IGluY2x1ZGVkCi1pbiB0aGUgQW50IGRpc3RyaWJ1dGlvbi4gIFNlZSAmbHQ7YSBocmVmPSZxdW90Oy4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzJnF1b3Q7Jmd0OwotTGlicmFyeSBEZXBlbmRlbmNpZXMmbHQ7L2EmZ3Q7IGZvciBtb3JlIGluZm9ybWF0aW9uLgotJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJzaG93c3VjY2VzcyIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5hIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRlc3RzIHNob3VsZCBkaXNwbGF5IGEgbWVzc2FnZSBvbiBzdWNjZXNzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzaG93YmFubmVyIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPmEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgYSBiYW5uZXIgc2hvdWxkIGJlIGRpc3BsYXllZCB3aGVuIHN0YXJ0aW5nIHRlc3RsZXQgZW5naW5lPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJmb3JjZXNob3d0cmFjZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5hIGJvb2xlYW4gaW5kaWNhdGluZyB0aGF0IGEgc3RhY2sgdHJhY2UgaXMgZGlzcGxheWVkIG9uIGFueSBmYWlsdXJlPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJzaG93dHJhY2UiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+YSBib29sZWFuIGluZGljYXRpbmcgdGhhdCBhIHN0YWNrIHRyYWNlIGlzIGRpc3BsYXllZCBvbiBlcnJvciAoYnV0IG5vdCBub3JtYWwgZmFpbHVyZSk8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQk8L1RBU0s+Ci0JPFRBU0sgTkFNRT0idHJhbnNsYXRlIj4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O0lkZW50aWZpZXMga2V5cyBpbiBmaWxlcyBkZWxpbWl0ZWQgYnkgc3BlY2lhbCB0b2tlbnMKLWFuZCB0cmFuc2xhdGVzIHRoZW0gd2l0aCB2YWx1ZXMgcmVhZCBmcm9tIHJlc291cmNlIGJ1bmRsZXMuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLUEgcmVzb3VyY2UgYnVuZGxlIGNvbnRhaW5zIGxvY2FsZS1zcGVjaWZpYyBrZXktdmFsdWUgcGFpcnMuCi1BIHJlc291cmNlIGJ1bmRsZSBpcyBhIGhpZXJhcmNoaWNhbCBzZXQgb2YgcHJvcGVydHkgZmlsZXMuCi1BIGJ1bmRsZSBuYW1lIG1ha2VzIHVwIGl0cyBiYXNlIGZhbWlseSBuYW1lLiAgRWFjaCBmaWxlIHRoYXQKLW1ha2VzIHVwIHRoaXMgYnVuZGxlIGhhcyB0aGlzIG5hbWUgcGx1cyBpdHMgbG9jYWxlLiAgRm9yIGV4YW1wbGUsCi1pZiB0aGUgcmVzb3VyY2UgYnVuZGxlIG5hbWUgaXMgTXlSZXNvdXJjZXMsIHRoZSBmaWxlIHRoYXQgY29udGFpbnMKLUdlcm1hbiB0ZXh0IHdpbGwgdGFrZSB0aGUgbmFtZSBNeVJlc291cmNlc19kZS4gIEluIGFkZGl0aW9uIHRvCi1sYW5ndWFnZSwgY291bnRyeSBhbmQgdmFyaWFudCBhcmUgYWxzbyB1c2VkIHRvIGZvcm0gdGhlIGZpbGVzIGluCi10aGUgYnVuZGxlLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1UaGUgcmVzb3VyY2UgYnVuZGxlIGxvb2t1cCBzZWFyY2hlcyBmb3IgcmVzb3VyY2UgZmlsZXMgd2l0aCB2YXJpb3VzCi1zdWZmaXhlcyBvbiB0aGUgYmFzaXMgb2YgKDEpIHRoZSBkZXNpcmVkIGxvY2FsZSBhbmQgKDIpIHRoZSBkZWZhdWx0Ci1sb2NhbGUgKGJhc2VidW5kbGVuYW1lKSwgaW4gdGhlIGZvbGxvd2luZyBvcmRlciBmcm9tIGxvd2VyLWxldmVsCi0obW9yZSBzcGVjaWZpYykgdG8gcGFyZW50LWxldmVsIChsZXNzIHNwZWNpZmljKToKLSZsdDsvcCZndDsKLSZsdDtwcmUmZ3Q7Ci1iYXNlYnVuZGxlbmFtZSArICZhbXA7cXVvdDtfJmFtcDtxdW90OyArIGxhbmd1YWdlMSArICZhbXA7cXVvdDtfJmFtcDtxdW90OyArIGNvdW50cnkxICsgJmFtcDtxdW90O18mYW1wO3F1b3Q7ICsgdmFyaWFudDEKLWJhc2VidW5kbGVuYW1lICsgJmFtcDtxdW90O18mYW1wO3F1b3Q7ICsgbGFuZ3VhZ2UxICsgJmFtcDtxdW90O18mYW1wO3F1b3Q7ICsgY291bnRyeTEKLWJhc2VidW5kbGVuYW1lICsgJmFtcDtxdW90O18mYW1wO3F1b3Q7ICsgbGFuZ3VhZ2UxCi1iYXNlYnVuZGxlbmFtZQotYmFzZWJ1bmRsZW5hbWUgKyAmYW1wO3F1b3Q7XyZhbXA7cXVvdDsgKyBsYW5ndWFnZTIgKyAmYW1wO3F1b3Q7XyZhbXA7cXVvdDsgKyBjb3VudHJ5MiArICZhbXA7cXVvdDtfJmFtcDtxdW90OyArIHZhcmlhbnQyCi1iYXNlYnVuZGxlbmFtZSArICZhbXA7cXVvdDtfJmFtcDtxdW90OyArIGxhbmd1YWdlMiArICZhbXA7cXVvdDtfJmFtcDtxdW90OyArIGNvdW50cnkyCi1iYXNlYnVuZGxlbmFtZSArICZhbXA7cXVvdDtfJmFtcDtxdW90OyArIGxhbmd1YWdlMgotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7cCZndDsKLVRoZSBmaWxlIG5hbWVzIGdlbmVyYXRlZCB0aHVzIGFyZSBhcHBlbmRlZCB3aXRoIHRoZSBzdHJpbmcgJmFtcDtxdW90Oy5wcm9wZXJ0aWVzJmFtcDtxdW90OwotdG8gbWFrZSB1cCB0aGUgZmlsZSBuYW1lcyB0aGF0IGFyZSB0byBiZSB1c2VkLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci1GaWxlIGVuY29kaW5nIGlzIHN1cHBvcnRlZC4gIFRoZSBlbmNvZGluZyBzY2hlbWUgb2YgdGhlIHNvdXJjZSBmaWxlcywKLWRlc3RpbmF0aW9uIGZpbGVzIGFuZCB0aGUgYnVuZGxlIGZpbGVzIGNhbiBiZSBzcGVjaWZpZWQuCi1EZXN0aW5hdGlvbiBmaWxlcyBjYW4gYmUgZXhsaWNpdGx5IG92ZXJ3cml0dGVuIHVzaW5nIHRoZQotJmx0O3ZhciZndDtmb3JjZW92ZXJ3cml0ZSZsdDsvdmFyJmd0OyBhdHRyaWJ1dGUuICBJZiAmbHQ7dmFyJmd0O2ZvcmNlb3ZlcndyaXRlJmx0Oy92YXImZ3Q7Ci1pcyBmYWxzZSwgdGhlIGRlc3RpbmF0aW9uIGZpbGUgaXMgb3ZlcndyaXR0ZW4gb25seSBpZiBlaXRoZXIgdGhlCi1zb3VyY2UgZmlsZSBvciBhbnkgb2YgdGhlIGZpbGVzIHRoYXQgbWFrZSB1cCB0aGUgYnVuZGxlIGhhdmUgYmVlbgotbW9kaWZpZWQgYWZ0ZXIgdGhlIGRlc3RpbmF0aW9uIGZpbGUgd2FzIGxhc3QgbW9kaWZpZWQuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsmbHQ7YSBocmVmPSZxdW90Oy4uL0NvcmVUeXBlcy9maWxlc2V0Lmh0bWwmcXVvdDsmZ3Q7RmlsZVNldCZsdDsvYSZndDtzIGFyZSB1c2VkIHRvIHNlbGVjdCBmaWxlcyB0bwotdHJhbnNsYXRlLgotJmx0Oy9wJmd0OwotPC9ERVNDUklQVElPTj4KLQkJPEFUVFJJQlVURSBOQU1FPSJ0b2RpciIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+RGVzdGluYXRpb24gZGlyZWN0b3J5IHdoZXJlIGRlc3RpbmF0aW9uIGZpbGVzIGFyZXRvIGJlIGNyZWF0ZWQ8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InN0YXJ0dG9rZW4iIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPlRoZSBzdGFydGluZyB0b2tlbiB0byBpZGVudGlmeSBrZXlzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJlbmR0b2tlbiIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+VGhlIGVuZGluZyB0b2tlbiB0byBpZGVudGlmeSBrZXlzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJidW5kbGUiIFJFUVVJUkVEPSJ5ZXMiPgotCQkJPERFU0NSSVBUSU9OPkZhbWlseSBuYW1lIG9mIHJlc291cmNlIGJ1bmRsZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iYnVuZGxlbGFuZ3VhZ2UiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+TG9jYWxlIHNwZWNpZmljIGxhbmd1YWdlIG9mIHJlc291cmNlIGJ1bmRsZS4gIERlZmF1bHRzIHRvZGVmYXVsdCBsb2NhbGUncyBsYW5ndWFnZS48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImJ1bmRsZWNvdW50cnkiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+TG9jYWxlIHNwZWNpZmljIGNvdW50cnkgb2YgcmVzb3VyY2UgYnVuZGxlLiAgRGVmYXVsdHMgdG9kZWZhdWx0IGxvY2FsZSdzIGNvdW50cnkuPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJidW5kbGV2YXJpYW50IiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkxvY2FsZSBzcGVjaWZpYyB2YXJpYW50IG9mIHJlc291cmNlIGJ1bmRsZS4gIERlZmF1bHRzIHRvdGhlIGRlZmF1bHQgdmFyaWFudCBvZiB0aGUgY291bnRyeSBhbmQgbGFuZ3VhZ2UgYmVpbmcgdXNlZC48L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9InNyY2VuY29kaW5nIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPlNvdXJjZSBmaWxlIGVuY29kaW5nIHNjaGVtZS4gIERlZmF1bHRzIHRvc3lzdGVtIGRlZmF1bHQgZmlsZSBlbmNvZGluZzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZGVzdGVuY29kaW5nIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPkRlc3RpbmF0aW9uIGZpbGUgZW5jb2Rpbmcgc2NoZW1lLiAgRGVmYXVsdHMgdG9zb3VyY2UgZmlsZSBlbmNvZGluZzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iYnVuZGxlZW5jb2RpbmciIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+UmVzb3VyY2UgQnVuZGxlIGZpbGUgZW5jb2Rpbmcgc2NoZW1lLiAgRGVmYXVsdHMgdG9zb3VyY2UgZmlsZSBlbmNvZGluZzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZm9yY2VvdmVyd3JpdGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+T3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzIGV2ZW4gaWYgdGhlIGRlc3RpbmF0aW9uZmlsZXMgYXJlIG5ld2VyLiBEZWZhdWx0cyB0byAmcXVvdDtubyZxdW90OzwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCTwvVEFTSz4KLQk8VEFTSyBOQU1FPSJ3bGpzcGMiPgotCQk8REVTQ1JJUFRJT04+Jmx0O3AmZ3Q7Q2xhc3MgdG8gcHJlY29tcGlsZSBKU1AncyB1c2luZyB3ZWJsb2dpYydzIGpzcCBjb21waWxlciAod2VibG9naWMuanNwYykmbHQ7L3AmZ3Q7Ci1UZXN0ZWQgb25seSBvbiBXZWJsb2dpYyA0LjUuMSAtIE5UNC4wIGFuZCBTb2xhcmlzIDUuNyw1LjgmbHQ7YnImZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9InNyYyIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+b290IG9mIHNvdXJjZSB0cmVlIGZvciBKU1AsIGllLCB0aGUgZG9jdW1lbnQgcm9vdCBmb3IgeW91ciB3ZWJsb2dpYyBzZXJ2ZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iZGVzdCIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+cm9vdCBvZiBkZXN0aW5hdGlvbiBkaXJlY3RvcnksIHdoYXQgeW91IGhhdmUgc2V0IGFzIFdvcmtpbmdEaXIgaW4gdGhlIHdlYmxvZ2ljIHByb3BlcnRpZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0icGFja2FnZSIgUkVRVUlSRUQ9InllcyI+Ci0JCQk8REVTQ1JJUFRJT04+c3RhcnQgcGFja2FnZSBuYW1lIHVuZGVyIHdoaWNoIHlvdXIgSlNQJ3Mgd291bGQgYmUgY29tcGlsZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY2xhc3NwYXRoIiBSRVFVSVJFRD0ieWVzIj4KLQkJCTxERVNDUklQVElPTj5DbGFzcyBwYXRoIHRvIHVzZSB3aGVuIGNvbXBpbGluZyBqc3AnPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotCTxUQVNLIE5BTUU9InhtbHZhbGlkYXRlIj4KLQkJPERFU0NSSVBUSU9OPiZsdDtwJmd0O1RoaXMgdGFzayBjaGVja3MgeG1sIGZpbGVzIGFyZSB2YWxpZCAob3Igb25seSB3ZWxsIGZvcm1lZCkuIFRoZQotdGFzayB1c2VzIHRoZSBTQVgyIHBhcnNlciBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSBKQVhQIGJ5IGRlZmF1bHQKLShwcm9iYWJseSB0aGUgb25lIHRoYXQgaXMgdXNlZCBieSBBbnQgaXRzZWxmKSwgYnV0IG9uZSBjYW4gc3BlY2lmeSBhbnkKLVNBWDEvMiBwYXJzZXIgaWYgbmVlZGVkLiZsdDsvcCZndDsKLSZsdDtwJmd0O1RoaXMgdGFzayBzdXBwb3J0cyB0aGUgdXNlIG9mIG5lc3RlZCAmbHQ7YQotaHJlZj0mcXVvdDsuLi9Db3JlVHlwZXMveG1sY2F0YWxvZy5odG1sJnF1b3Q7Jmd0O3htbGNhdGFsb2cmbHQ7L2EmZ3Q7IGVsZW1lbnRzIGFuZC9vciBuZXN0ZWQKLSZsdDt0dCZndDsmYW1wO2x0O2R0ZCZhbXA7Z3Q7Jmx0Oy90dCZndDsgZWxlbWVudHMgd2hpY2ggYXJlIHVzZWQgdG8gcmVzb2x2ZSBEVERzIGFuZCBlbnRpdGllcy4mbHQ7L3AmZ3Q7Ci08L0RFU0NSSVBUSU9OPgotCQk8QVRUUklCVVRFIE5BTUU9ImZpbGUiIFJFUVVJUkVEPSJubyI+Ci0JCQk8REVTQ1JJUFRJT04+dGhlIGZpbGUocykgeW91IHdhbnQgdG8gY2hlY2suIChvcHRpb25hbGx5IGNhbiB1c2UgYW4gZW1iZWRkZWQgZmlsZXNldDwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0ibGVuaWVudCIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5pZiB0cnVlLCBvbmx5IGNoZWNrIHRoZSB4bWwgZG9jdW1lbnQgaXMgd2VsbCBmb3JtZWQoaWdub3JlZCBpZiB0aGUgc3BlY2lmaWVkIHBhcnNlciBpcyBhcyBTQVgxIHBhcnNlcik8L0RFU0NSSVBUSU9OPgotCQk8L0FUVFJJQlVURT4KLQotCQk8QVRUUklCVVRFIE5BTUU9ImNsYXNzbmFtZSIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj50aGUgcGFyc2VyIHRvIHVzZTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0iY2xhc3NwYXRocmVmIiBSRVFVSVJFRD0ibm8iPgotCQkJPERFU0NSSVBUSU9OPndoZXJlIHRvIGZpbmQgdGhlIHBhcnNlciBjbGFzcy4gT3B0aW9uYWxseSBjYW4gdXNlIGFuIGVtYmVkZGVkIGNsYXNzcGF0aCBlbGVtZW50PC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0KLQkJPEFUVFJJQlVURSBOQU1FPSJmYWlsb25lcnJvciIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5mYWlscyBvbiBhIGVycm9yIGlmIHNldCB0byB0cnVlIChkZWZhdWx0cyB0byB0cnVlKTwvREVTQ1JJUFRJT04+Ci0JCTwvQVRUUklCVVRFPgotCi0JCTxBVFRSSUJVVEUgTkFNRT0id2FybiIgUkVRVUlSRUQ9Im5vIj4KLQkJCTxERVNDUklQVElPTj5sb2cgcGFyc2VyIHdhcm4gZXZlbnRzPC9ERVNDUklQVElPTj4KLQkJPC9BVFRSSUJVVEU+Ci0JPC9UQVNLPgotPC9UQVNLUz4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL0FudERURE1lc3NhZ2VzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9BbnREVERNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODY2OTc1Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL0FudERURE1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBBbnREVERNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuQW50RFRETWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhcnNlcl9YTUxfcGFyc2VyX2RvZXNfbm90X3N1cHBvcnRfRGVjbEhhbmRsZXJfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXJzZXJfRXJyb3JfcGFyc2luZ19YTUxfZG9jdW1lbnRfb3JfRFREXzI7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQW50RFRETWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9BbnREVERNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvQW50RFRETWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFhOWMzNS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9BbnREVERNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1QYXJzZXJfWE1MX3BhcnNlcl9kb2VzX25vdF9zdXBwb3J0X0RlY2xIYW5kbGVyXzE9WE1MIHBhcnNlciBkb2VzIG5vdCBzdXBwb3J0IERlY2xIYW5kbGVyCi1QYXJzZXJfRXJyb3JfcGFyc2luZ19YTUxfZG9jdW1lbnRfb3JfRFREXzI9RXJyb3IgcGFyc2luZyBYTUwgZG9jdW1lbnQgb3IgRFRECmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9JQXRvbS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvSUF0b20uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMzNjMwYS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9JQXRvbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBPYmplY3QgRmFjdG9yeSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICoJCU9iamVjdCBGYWN0b3J5IEluYy4gLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZDsKLQotLyoqCi0gKiBTY2hlbWEgYXRvbSBpbnRlcmZhY2UuCi0gKiBAYXV0aG9yIEJvYiBGb3N0ZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJQXRvbSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEUgPSAxOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgYXRvbSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgYXRvbSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKTsKLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL0lBdHRyaWJ1dGUuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL0lBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZmNzk0My4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9JQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IE9iamVjdCBGYWN0b3J5IEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKgkJT2JqZWN0IEZhY3RvcnkgSW5jLiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkOwotCi0vKioKLSAqIFNjaGVtYSBhdHRyaWJ1dGUgaW50ZXJmYWNlLgotICogQGF1dGhvciBCb2IgRm9zdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUF0dHJpYnV0ZSBleHRlbmRzIElBdG9tIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENEQVRBID0gIkNEQVRBIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIklEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEUkVGID0gIklEUkVGIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEUkVGUyA9ICJJRFJFRlMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk1UT0tFTiA9ICJOTVRPS0VOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5NVE9LRU5TID0gIk5NVE9LRU5TIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWSA9ICJFTlRJVFkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRJRVMgPSAiRU5USVRJRVMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UQVRJT04gPSAiTk9UQVRJT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5VTUVSQVRJT04gPSAiZW51bWVyYXRpb24iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgYXR0cmlidXRlIHR5cGUuIFRoaXMgd2lsbCBiZSBvbmUgb2YgIkNEQVRBIiwgIklEIiwgIklEUkVGIiwKLQkgKiAiSURSRUZTIiwgIk5NVE9LRU4iLCAiTk1UT0tFTlMiLCAiRU5USVRZIiwgIkVOVElUSUVTIiwgIk5PVEFUSU9OIiBvcgotCSAqICJlbnVtZXJhdGlvbiIuIFRoZSB0eXBlIGlzIGludGVybmVkIGFuZCBtYXkgYmUgY29tcGFyZWQgdG8gYSBjb25zdGFudAotCSAqIHdpdGggPT0uIEZvciAiTk9UQVRJT04iIG9yICJlbnVtZXJhdGlvbiIsIDxjb2RlPmdldEVudW0oKTwvY29kZT4gd2lsbAotCSAqIHJldHVybiBhIGxpc3Qgb2YgdmFsdWVzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpOwotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nW10gb3IgbnVsbCBpZiB0eXBlIGlzIG5vdCAiTk9UQVRJT04iIG9yICJFTlVNRVJBVElPTiIuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEVudW0oKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnQgdGhlIGF0dHJpYnV0ZSBpcyBkZWZpbmVkIGluLgotCSAqLwotCXB1YmxpYyBJRWxlbWVudCBnZXRFbGVtZW50KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9yIG51bGwgaWYgbm9uZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBmaXhlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpeGVkKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYXR0cmlidXRlIGlzIHJlcXVpcmVkLCBmYWxzZSBpZiBpdCBpcyBvcHRpb25hbC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlcXVpcmVkKCk7Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9JRGZtLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9JRGZtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OTIzZGYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvSURmbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBPYmplY3QgRmFjdG9yeSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICoJCU9iamVjdCBGYWN0b3J5IEluYy4gLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZDsKLQotLyoqCi0gKiBBIERmbSBpcyBhbiBJTW9kZWwgY29udmVydGVkIHRvIGEgZm9ybSBtb3JlIGFwcHJvcHJpYXRlIGZvcgotICogdmFsaWRhdGlvbi4gVGhlIHdob2xlIHBvaW50IG9mIGEgRGZtIGlzIHRvIHJ1biBmYXN0LgotICogQGF1dGhvciBCb2IgRm9zdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURmbSB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBubyBmdXJ0aGVyIHN5bWJvbHMgYXJlIHJlcXVpcmVkLgotCSAqLwotCWJvb2xlYW4gaXNBY2NlcHRpbmcoKTsKLQkKLQkvKioKLQkgKiBJZiB0aGUgc3ltYm9sIHJlcHJlc2VudGVkIGJ5IG5hbWUgaXMgYWNjZXB0YWJsZSwKLQkgKiByZXR1cm4gdGhlIGRmbSB0byBhcHBseSB0byB0aGUgbmV4dCAoY2hpbGQpIHN5bWJvbC4KLQkgKiBPdGhlcndpc2UsIHJldHVybiBudWxsLgotCSAqLwotCUlEZm0gYWR2YW5jZShTdHJpbmcgbmFtZSk7Ci0JCi0JLyoqCi0JICogSWYgdGhlIHN5bWJvbCByZXByZXNlbnRlZCBieSB0aGUgbmFtZXNwYWNlLG5hbWUgcGFpciBpcyBhY2NlcHRhYmxlLAotCSAqIHJldHVybiB0aGUgZGZtIHRvIGFwcGx5IHRvIHRoZSBuZXh0IChjaGlsZCkgc3ltYm9sLiBPdGhlcndpc2UsIHJldHVybgotCSAqIG51bGwuCi0JICovCi0JSURmbSBhZHZhbmNlKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbG5hbWUpOwotCQotCS8qKgotCSAqIElmIHRoZSBzeW1ib2wgcmVwcmVzZW50ZWQgYnkgbmFtZSBpcyBhY2NlcHRhYmxlCi0JICogdG8gPGNvZGU+YWR2YW5jZSgpPC9jb2RlPgotCSAqIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBhdG9tLgotCSAqIE90aGVyd2lzZSwgcmV0dXJuIG51bGwuCi0JICovCi0JSUF0b20gZ2V0QXRvbShTdHJpbmcgbmFtZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzeW1ib2xzIGZvciB3aGljaCA8Y29kZT5hZHZhbmNlKCk8L2NvZGU+Ci0JICogd2lsbCByZXR1cm4gYSBuZXh0IGRmbS4gSWYgbm8gc3ltYm9scyB3aWxsCi0JICogYWR2YW5jZSB0aGlzIGRmbSBvciBpZiBhbnkgc3ltYm9sIHdpbGwsIHJldHVybnMKLQkgKiBhbiBlbXB0eSBhcnJheS4gVXNlIDxjb2RlPmlzQW55KCk8L2NvZGU+IGFuZAotCSAqIDxjb2RlPmlzRW1wdHkoKTwvY29kZT4gdG8gZGlzYW1iaWd1YXRlIHRoZQotCSAqIGNhc2VzLgotCSAqLwotCVN0cmluZ1tdIGdldEFjY2VwdHMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHN5bWJvbHMgZm9yIHdoaWNoIDxjb2RlPmFkdmFuY2UoKTwvY29kZT4KLQkgKiB3aWxsIHJldHVybiBhIG5leHQgZGZtLiBJZiBubyBzeW1ib2xzIHdpbGwKLQkgKiBhZHZhbmNlIHRoaXMgZGZtIG9yIGlmIGFueSBzeW1ib2wgd2lsbCwgcmV0dXJucwotCSAqIG51bGwuIFVzZSA8Y29kZT5pc0FueSgpPC9jb2RlPiBhbmQKLQkgKiA8Y29kZT5pc0VtcHR5KCk8L2NvZGU+IHRvIGRpc2FtYmlndWF0ZSB0aGUKLQkgKiBjYXNlcy4KLQkgKi8KLQlPYmplY3RbXSBnZXRLZXlzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgZGZtIHdpbGwgYWNjZXB0IGFueSBzeW1ib2wKLQkgKiBhbmQgcmV0dXJuIGl0c2VsZjsgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIFRoaXMgaW50ZXJmYWNlIGtlZXBzIHRoZSBkZm0gZnJvbSBuZWVkaW5nCi0JICogc2NoZW1hIGtub3dsZWRnZSwgYnV0IGEgYmV0dGVyIHdheSB0bwotCSAqIHByb2Nlc3MgYW4gQU5ZIGRmbSBmb3IgZWxlbWVudHMgaXMgdXNlIHRoZSAKLQkgKiBzY2hlbWEgdG8gbG9vayB1cCB0aGUgZWxlbWVudCBhbmQgdXNlIGl0cyAKLQkgKiBkZm0gaW5zdGVhZCBvZiB0aGlzIG9uZS4KLQkgKi8KLQlib29sZWFuIGlzQW55KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgZGZtIHdpbGwgcmVqZWN0IGV2ZXJ5IHN5bWJvbAotCSAqICg8Y29kZT5hZHZhbmNlKCk8L2NvZGU+IHJldHVybnMgbnVsbCk7Ci0JICogZmFsc2Ugb3RoZXJ3aXNlLiBJbmNsdWRlZCBmb3IgY29tcGxldGVuZXNzLAotCSAqIHNvIGV2ZXJ5IGVsZW1lbnQgY2FuIGhhdmUgYSBkZm0sIHJlZ2FyZGxlc3MKLQkgKiBvZiBpdHMgdHlwZS4KLQkgKi8KLQlib29sZWFuIGlzRW1wdHkoKTsKLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL0lFbGVtZW50LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9JRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjMwMzlmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL0lFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IE9iamVjdCBGYWN0b3J5IEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKgkJT2JqZWN0IEZhY3RvcnkgSW5jLiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCQlJQk0gQ29ycG9yYXRpb24gLSBmaXggZm9yIEJ1ZyA0MDk1MQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIElFbGVtZW50IGludGVyZmFjZS4KLSAqIEBhdXRob3IgQm9iIEZvc3RlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFbGVtZW50IGV4dGVuZHMgSUF0b20gewotCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50IGhhcyBiZWVuIHJlZmVyZW5jZWQgaW4gYSBzY2hlbWEgYnV0IGlzIG5vdAotCSAqIHlldCBkZWZpbmVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVW5kZWZpbmVkKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIGVsZW1lbnQgbW9kZWwgaXMgPGNvZGU+IigjUENEQVRBKSI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVGV4dCgpOwotCQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiBlbGVtZW50IG1vZGVsIGlzIEVNUFRZLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgZWxlbWVudCBtb2RlbCBpcyBBTlkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBbnkoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBlbGVtZW50J3MgY29udGVudCBtb2RlbC4gVGhlIGNvbnRlbnQgbW9kZWwgd2lsbCBiZSBlbXB0eQotCSAqIGlmIDxjb2RlPmlzVGV4dCgpPC9jb2RlPiwgPGNvZGU+aXNBbnkoKTwvY29kZT4gb3IgPGNvZGU+aXNFbXB0eSgpPC9jb2RlPi4KLQkgKiBOb3RlIHRoYXQgdGhlIGNvbnRlbnQgbW9kZWwgZGVhbHMgd2l0aCBjaGlsZCBlbGVtZW50cyBvbmx5OyB1c2UKLQkgKiA8Y29kZT5pc01peGVkKCk8L2NvZGU+IHRvIHNlZSBpZiB0ZXh0IGlzIGFsc28gYWxsb3dlZC4KLQkgKi8KLQlwdWJsaWMgSU1vZGVsIGdldENvbnRlbnRNb2RlbCgpOwotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIERGTSBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb250ZW50IG1vZGVsLiBFdmVyeSBlbGVtZW50Ci0JICogaGFzIGEgREZNLgotCSAqLwotCXB1YmxpYyBJRGZtIGdldERmbSgpOwotCQotCS8qKgotCSAqIEByZXR1cm4gTWFwIHdpdGggYXR0cmlidXRlIHFuYW1lIGtleXMgYW5kIElBdHRyIHZhbHVlcy4KLQkgKiBJZiBlbGVtZW50IGhhcyBubyBhdHRyaWJ1dGVzLCB0aGUgbWFwIGlzIGVtcHR5LgotCSAqIE1hcCBtdXN0IG5vdCBiZSBtb2RpZmllZCBieSBjYWxsZXI7IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLAotCSAqIGl0IGlzIG5vdCBhIGNvcHkuCi0JICovCi0JcHVibGljIE1hcCBnZXRBdHRyaWJ1dGVzKCk7Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9JTW9kZWwuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL0lNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWU1YTVjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL0lNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBPYmplY3QgRmFjdG9yeSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICoJCU9iamVjdCBGYWN0b3J5IEluYy4gLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuc2NoZW1hLk5mbTsKLQotCi0vKioKLSAqIENvbnRlbnQgbW9kZWwuCi0gKiBUaGlzIGlzIHRoZSBwcmludGFibGUgdmVyc2lvbiBvZiB0aGUgbW9kZWwuCi0gKiBUaGUgd2Fsa2FibGUgdmVyc2lvbiBpcyB0aGUgSURmbS4KLSAqIEBhdXRob3IgQm9iIEZvc3RlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RlbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTktOT1dOID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVFVRU5DRSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hPSUNFID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRUFGID0gNDsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkJPVU5ERUQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIG9uZSBvZiBTRVFVRU5DRSwgQ0hPSUNFLCBMRUFGCi0JICovCi0JcHVibGljIGludCBnZXRLaW5kKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBvbmUgb2YgMCBvciAxLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWluT2NjdXJzKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBvbmUgb2YgMSBvciBVTkJPVU5ERUQuCi0JICovCi0JcHVibGljIGludCBnZXRNYXhPY2N1cnMoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIGlmIFNFUVVFTkNFIG9yIENIT0lDRSByZXR1cm4gYXJyYXkgb2Ygc3ViLW1vZGVsczsgb3RoZXJ3aXNlCi0JICogdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyBJTW9kZWxbXSBnZXRDb250ZW50cygpOwotCQotCS8qKgotCSAqIEByZXR1cm4gaWYgTEVBRiByZXR1cm4gYXRvbTsgb3RoZXJ3aXNlIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgSUF0b20gZ2V0TGVhZigpOwotCQotCS8qKgotCSAqIEByZXR1cm4gaWYgU0VRVUVOQ0Ugb3IgQ0hPSUNFIHJldHVybiAiLCIgYW5kICJ8IiwgcmVzcGVjdGl2ZWx5OyBvdGhlcndpc2UKLQkgKiB1bmRlZmluZWQuIFVzZWZ1bCB3aGVuIHByaW50aW5nIG1vZGVsLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3BlcmF0b3IoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIG9uZSBvZiAiIiwgIj8iLCAiKiIgb3IgIisiLiBVc2VmdWwgd2hlbiBwcmludGluZyBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllcigpOwotCQotCS8qKgotCSAqIENvbnZlcnQgY29udGVudCBtb2RlbCB0byBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBzdHJpbmdSZXAoKTsKLQkKLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBtb2RlbCB0byBhbiBOZm0gb24gZGVtYW5kLgotCSAqIEByZXR1cm4gTmZtCi0JICovCi0JcHVibGljIE5mbSB0b05mbSgpOwotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvSVNjaGVtYS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvSVNjaGVtYS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWVkMzRkLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL0lTY2hlbWEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDUgT2JqZWN0IEZhY3RvcnkgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqCQlPYmplY3QgRmFjdG9yeSBJbmMuIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVNjaGVtYSB7Ci0KLQkvKioKLQkgKiBGaW5kIGVsZW1lbnQgYnkgbmFtZS4KLQkgKiBAcGFyYW0gcW5hbWUgRWxlbWVudCBuYW1lLgotCSAqIEByZXR1cm4gZWxlbWVudCBvciBudWxsIGlmIG5vIHN1Y2ggZWxlbWVudC4KLQkgKi8KLQlJRWxlbWVudCBnZXRFbGVtZW50KFN0cmluZyBxbmFtZSk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBJRWxlbWVudFtdIG9mIGFsbCB2aXNpYmxlIGVsZW1lbnRzLgotCSAqLwotCUlFbGVtZW50W10gZ2V0RWxlbWVudHMoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIEV4Y2VwdGlvbiB0aHJvd24gYnkgcGFyc2VyIHdoZW4gc2NoZW1hIHdhcyBidWlsdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotCSAqIE5vdGUgdGhhdCB0aGUgZXhjZXB0aW9uIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhlIHNjaGVtYSBpcwotCSAqIGluY29tcGxldGUuCi0JICovCi0JRXhjZXB0aW9uIGdldEVycm9yRXhjZXB0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9QYXJzZUVycm9yLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9QYXJzZUVycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNTc1OWUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvUGFyc2VFcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBPYmplY3QgRmFjdG9yeSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICoJCU9iamVjdCBGYWN0b3J5IEluYy4gLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgkJSUJNIENvcnBvcmF0aW9uIC0gc2VyaWFsIHZlcnNpb24gaWQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkOwotCi0vKioKLSAqIEBhdXRob3IgQm9iIEZvc3RlcgotICovCi1wdWJsaWMgY2xhc3MgUGFyc2VFcnJvciBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUGFyc2VFcnJvci4KLQkgKiBAcGFyYW0gbXNnIE1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgUGFyc2VFcnJvcihTdHJpbmcgbXNnKSB7Ci0JCXN1cGVyKG1zZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvUGFyc2VyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg3NGZlNi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IE9iamVjdCBGYWN0b3J5IEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKgkJT2JqZWN0IEZhY3RvcnkgSW5jLiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLnNjaGVtYS5TY2hlbWFGYWN0b3J5OwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyOwotCi0KLS8qKgotICogU2ltcGxlIHBhcnNlciBmb3IgRFREcy4gUmV0dXJucyBJU2NoZW1hIHJlcHJlc2VudGluZyB0aGUgRFRELgotICogCi0gKiBUbyBwYXJzZSBhIERURCwgeW91IG11c3QgcGFyc2UgYW4gWE1MIGRvY3VtZW50LiBUaGUgPGNvZGU+cGFyc2VEVEQoKTwvY29kZT4KLSAqIG1ldGhvZCBidWlsZHMgYSB0ZW1wb3JhcnkgWE1MIGRvY3VtZW50IGluIG1lbW9yeSB0aGF0IHJlZmVycyB0byBvciBpbmNsdWRlcwotICogdGhlIERURC4KLSAqIAotICogVGhlcmUgaXMgbm8gZGVwZW5kZW5jeSBpbiB0aGlzIHBhY2thZ2Ugb24gYW55IGNvZGUgb3V0c2lkZSB0aGUgcGFja2FnZSBleGNlcHQKLSAqIFhNTFJlYWRlci4KLSAqIAotICogVG8gaGlkZSB0aGUgdW5kZXJseWluZyBwYXJzZXIsIFhNTCBwYXJzZXIgZXhjZXB0aW9ucyBhcmUgd3JhcHBlZCBieSBhCi0gKiBQYXJzZUVycm9yLiBVbmxlc3MgZGVidWdnaW5nLCB0aGUgdHdvIHN0cmluZyBjb25zdGFudHMgYXJlIHN1ZmZpY2llbnQgdG8KLSAqIGRldGVybWluZSB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICogQGF1dGhvciBCb2IgRm9zdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJzZXIgewotCQotCS8qKiBQYXJzZUVycm9yIG1lc3NhZ2Ugd2hlbiBzeXN0ZW0gcGFyc2VyIGRvZXNuJ3QgZG8gdGhlIGpvYiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9TVVBQT1JURUQgPSBBbnREVERNZXNzYWdlcy5QYXJzZXJfWE1MX3BhcnNlcl9kb2VzX25vdF9zdXBwb3J0X0RlY2xIYW5kbGVyXzE7Ci0JLyoqIFBhcnNlRXJyb3IgbWVzc2FnZSBmb3IgYSB3ZWxsLWZvcm1lZCBvciB2YWxpZGF0aW9uIGVycm9yIGluIFhNTCBvciBEVEQuCi0JICogIEN1cnJlbnRseSBub3QgcmV0dXJuZWQuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSU0VfRVJST1IgPSBBbnREVERNZXNzYWdlcy5QYXJzZXJfRXJyb3JfcGFyc2luZ19YTUxfZG9jdW1lbnRfb3JfRFREXzI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSTkFMID0gImludGVybmFsOi8vdXNlcmVhZGVyLm9iamZhYy5jb20iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUGFyc2UgdGhlIFhNTCBkb2N1bWVudCBhdCB0aGUgaW5wdXQgc291cmNlIGFuZCByZXR1cm4gYSBkb2N1bWVudCB3YWxrZXIKLQkgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlIGFueSBkb2N1bWVudCB3aXRoIHRoZSBzYW1lIERURCAoaW50ZXJuYWwgYW5kCi0JICogZXh0ZXJuYWwpIG9yIHByb3ZpZGUgdXNlciBhc3Npc3RhbmNlIGZvciB0aGlzIGRvY3VtZW50LgotCSAqIEBwYXJhbSBpbnB1dFNvdXJjZSBTb3VyY2UgZm9yIFhNTCBkb2N1bWVudCB0byBzdGFydCBEVEQgcGFyc2UuIE11c3QKLQkgKiBjb250YWluIGEgRE9DVFlQRSBkZWNsYXJhdGlvbiB3aXRoIGludGVybmFsIG9yIGV4dGVybmFsIHN1YnNldCwgb3IgYm90aC4KLQkgKiBAcGFyYW0gZW50aXR5UmVzb2x2ZXIgRW50aXR5UmVzb2x2ZXIgb3IgbnVsbC4KLQkgKiBAcmV0dXJuIHNjaGVtYSBmb3IgZG9jdW1lbnQuCi0JICogQHRocm93cyBQYXJzZUVycm9yIGZvciBOT1RfU1VQUE9SVEVEIG9yIFBBUlNFX0VSUk9SLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVNjaGVtYSBwYXJzZShJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSwgRW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIpIHRocm93cyBQYXJzZUVycm9yLCBJT0V4Y2VwdGlvbiB7Ci0JCVhNTFJlYWRlciBwYXJzZXIgPSBudWxsOwotCQlTY2hlbWFGYWN0b3J5IGZhY3RvcnkgPSBuZXcgU2NoZW1hRmFjdG9yeSgpOwotCQl0cnkgewotCQkJcGFyc2VyID0gZ2V0WE1MUmVhZGVyKCk7Ci0JCQlEZWNsSGFuZGxlciBoYW5kbGVyID0gZmFjdG9yeTsKLQkJCXBhcnNlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvZGVjbGFyYXRpb24taGFuZGxlciIsIGhhbmRsZXIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZW50aXR5UmVzb2x2ZXIgIT0gbnVsbCkgewotCQkJCXBhcnNlci5zZXRFbnRpdHlSZXNvbHZlcihlbnRpdHlSZXNvbHZlcik7Ci0JCQl9Ci0JCQlwYXJzZXIucGFyc2UoaW5wdXRTb3VyY2UpOwotCQl9IGNhdGNoIChTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQYXJzZUVycm9yKE5PVF9TVVBQT1JURUQpOwotCQl9IGNhdGNoIChTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFBhcnNlRXJyb3IoTk9UX1NVUFBPUlRFRCk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBEb24ndCBjYXJlIGFib3V0IGVycm9ycyBpbiBYTUwsIHNvIGp1c3QgZmFsbCB0aHJ1LgotCQkJLy8gSWYgcGFyc2UgZmFpbGVkIGluIERURCwgbWF5IGhhdmUgaW5jb21wbGV0ZSBzY2hlbWEsCi0JCQkvLyBidXQgdGhpcyBpcyBiZXR0ZXIgdGhhbiBubyBzY2hlbWEuCi0JCQlmYWN0b3J5LnNldEVycm9yRXhjZXB0aW9uKGUpOwotCQl9Ci0KLQkJcmV0dXJuIGZhY3RvcnkuZ2V0U2NoZW1hKCk7Ci0JfQotCQotCXByaXZhdGUgWE1MUmVhZGVyIGdldFhNTFJlYWRlcigpIHRocm93cyBQYXJzZUVycm9yIHsKLQkJU0FYUGFyc2VyIHBhcnNlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwYXJzZXIgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3U0FYUGFyc2VyKCk7Ci0JCQlyZXR1cm4gcGFyc2VyLmdldFhNTFJlYWRlcigpOwotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQYXJzZUVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQYXJzZUVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBQYXJzZSB0aGUgWE1MIGRvY3VtZW50IGF0IHRoZSBhcmd1bWVudCBVUkwgYW5kIHJldHVybiBhIGRvY3VtZW50IHdhbGtlcgotCSAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgYW55IGRvY3VtZW50IHdpdGggdGhlIHNhbWUgRFREIChpbnRlcm5hbAotCSAqIGFuZCBleHRlcm5hbCkgb3IgcHJvdmlkZSB1c2VyIGFzc2lzdGFuY2UgZm9yIHRoaXMgZG9jdW1lbnQuCi0JICogQHBhcmFtIHVybCBPZiBYTUwgZG9jdW1lbnQgdG8gc3RhcnQgRFREIHBhcnNlLiBNdXN0IGNvbnRhaW4gYSBET0NUWVBFCi0JICogZGVjbGFyYXRpb24gd2l0aCBpbnRlcm5hbCBvciBleHRlcm5hbCBzdWJzZXQsIG9yIGJvdGguCi0JICogQHJldHVybiBJV2Fsa2VyIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhdmVyc2UgZG9jdW1lbnQuCi0JICogQHRocm93cyBQYXJzZUVycm9yIGZvciBOT1RfU1VQUE9SVEVEIG9yIFBBUlNFX0VSUk9SLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVNjaGVtYSBwYXJzZShTdHJpbmcgdXJsKSB0aHJvd3MgUGFyc2VFcnJvciwgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gcGFyc2UobmV3IElucHV0U291cmNlKHVybCksIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBQYXJzZSB0aGUgWE1MIGRvY3VtZW50IHVzaW5nIHRoZSBhcmd1bWVudCByZWFkZXIgYW5kIHJldHVybiBhIGRvY3VtZW50Ci0JICogd2Fsa2VyIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgYW55IGRvY3VtZW50IHdpdGggdGhlIHNhbWUgRFRECi0JICogKGludGVybmFsIGFuZCBleHRlcm5hbCkgb3IgcHJvdmlkZSB1c2VyIGFzc2lzdGFuY2UgZm9yIHRoaXMgZG9jdW1lbnQuCi0JICogQHBhcmFtIHJlYWRlciBSZWFkZXIgZm9yIFhNTCBkb2N1bWVudCB0byBzdGFydCBEVEQgcGFyc2UuIE11c3QgY29udGFpbiBhCi0JICogRE9DVFlQRSBkZWNsYXJhdGlvbiB3aXRoIGludGVybmFsIG9yIGV4dGVybmFsIHN1YnNldCwgb3IgYm90aC4KLQkgKiBAcmV0dXJuIElXYWxrZXIgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmF2ZXJzZSBkb2N1bWVudC4KLQkgKiBAdGhyb3dzIFBhcnNlRXJyb3IgZm9yIE5PVF9TVVBQT1JURUQgb3IgUEFSU0VfRVJST1IuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJU2NoZW1hIHBhcnNlKFJlYWRlciByZWFkZXIpIHRocm93cyBQYXJzZUVycm9yLCBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBwYXJzZShuZXcgSW5wdXRTb3VyY2UocmVhZGVyKSwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFBhcnNlIHRoZSBEVEQgd2l0aCB0aGUgZ2l2ZW4gcHVibGljIGFuZCBzeXN0ZW0gaWRzIGFuZCByZXR1cm4gYSBkb2N1bWVudAotCSAqIHdhbGtlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlIG9yIHByb3ZpZGUgdXNlciBhc3Npc3RhbmNlIGZvciBhbnkKLQkgKiBkb2N1bWVudCB3aXRoIHRoZSBzYW1lIGV4dGVybmFsIERURCBhbmQgbm8gaW50ZXJuYWwgc3Vic2V0LgotCSAqIEBwYXJhbSBwdWIgUFVCTElDIGlkIG9mIERURC4KLQkgKiBAcGFyYW0gc3lzIFNZU1RFTSBpZCBvZiBEVEQuCi0JICogQHBhcmFtIHJvb3QgUGxhdXNpYmxlIHJvb3QgZWxlbWVudCBxbmFtZS4gQW55IG5hbWUgd2lsbCBkbyBidXQgYQotCSAqIG5hbWUgdGhhdCB3aWxsIG5vdCBjYXVzZSBhIHZhbGlkYXRpb24gZXJyb3IgaXMgcHJlZmVycmVkLgotCSAqIEByZXR1cm4gSVdhbGtlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYXZlcnNlIGRvY3VtZW50LgotCSAqIEB0aHJvd3MgUGFyc2VFcnJvciBmb3IgTk9UX1NVUFBPUlRFRCBvciBQQVJTRV9FUlJPUi4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElTY2hlbWEgcGFyc2VEVEQoU3RyaW5nIHB1YiwgU3RyaW5nIHN5cywgU3RyaW5nIHJvb3QpIHRocm93cyBQYXJzZUVycm9yLCBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBwYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IERURFJlYWRlcihwdWIsIHN5cywgcm9vdCkpLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogUGFyc2UgdGhlIERURCBmcm9tIHRoZSByZWFkZXIgYW5kIHJldHVybiBhIGRvY3VtZW50IHdhbGtlciB0aGF0IGNhbiBiZQotCSAqIHVzZWQgdG8gdmFsaWRhdGUgb3IgcHJvdmlkZSB1c2VyIGFzc2lzdGFuY2UgZm9yIGFueSBkb2N1bWVudCB3aXRoIHRoZQotCSAqIHNhbWUgZXh0ZXJuYWwgRFREIGFuZCBubyBpbnRlcm5hbCBzdWJzZXQuCi0JICogQHBhcmFtIHJlYWRlciBSZWFkZXIgZm9yIGV4dGVybmFsIHN1YnNldCBEVEQKLQkgKiBAcGFyYW0gcm9vdCBQbGF1c2libGUgcm9vdCBlbGVtZW50IHFuYW1lLiBBbnkgbmFtZSB3aWxsIGRvIGJ1dCBhCi0JICogbmFtZSB0aGF0IHdpbGwgbm90IGNhdXNlIGEgdmFsaWRhdGlvbiBlcnJvciBpcyBwcmVmZXJyZWQuCi0JICogQHJldHVybiBJU2NoZW1hIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhdmVyc2UgZG9jdW1lbnQuCi0JICogQHRocm93cyBQYXJzZUVycm9yIGZvciBOT1RfU1VQUE9SVEVEIG9yIFBBUlNFX0VSUk9SLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVNjaGVtYSBwYXJzZURURChSZWFkZXIgcmVhZGVyLCBTdHJpbmcgcm9vdCkgdGhyb3dzIFBhcnNlRXJyb3IsIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHBhcnNlKG5ldyBJbnB1dFNvdXJjZShuZXcgRFREUmVhZGVyKElOVEVSTkFMLCBJTlRFUk5BTCwgcm9vdCkpLCBuZXcgRFRERW50aXR5UmVzb2x2ZXIocmVhZGVyKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIERURFJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0JCXByaXZhdGUgUmVhZGVyIGZEZWxlZ2F0ZTsKLQkJCi0JCXB1YmxpYyBEVERSZWFkZXIoU3RyaW5nIHB1YiwgU3RyaW5nIHN5cywgU3RyaW5nIHJvb3QpIHsKLQkJCVN0cmluZyBkb2N1bWVudCA9ICI8IURPQ1RZUEUgIityb290KyIgUFVCTElDICciK3B1YisiJyAnIitzeXMrIic+PCIrcm9vdCsiLz4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJCWZEZWxlZ2F0ZSA9IG5ldyBTdHJpbmdSZWFkZXIoZG9jdW1lbnQpOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHNlZSBqYXZhLmlvLlJlYWRlciNjbG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlmRGVsZWdhdGUuY2xvc2UoKTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmlvLlJlYWRlciNyZWFkKGNoYXJbXSwgaW50LCBpbnQpCi0JCSAqLwotCQlwdWJsaWMgaW50IHJlYWQoY2hhcltdIGNidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gZkRlbGVnYXRlLnJlYWQoY2J1Ziwgb2ZmLCBsZW4pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIERUREVudGl0eVJlc29sdmVyIGltcGxlbWVudHMgRW50aXR5UmVzb2x2ZXIgewotCQlwcml2YXRlIFJlYWRlciByZWFkZXI7Ci0JCXB1YmxpYyBEVERFbnRpdHlSZXNvbHZlcihSZWFkZXIgcmVhZGVyKSB7Ci0JCQl0aGlzLnJlYWRlciA9IHJlYWRlcjsKLQkJfQotCQkvKioKLQkJICogQHNlZSBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlciNyZXNvbHZlRW50aXR5KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCQkJaWYgKHB1YmxpY0lkLmVxdWFscyhJTlRFUk5BTCkgJiYgc3lzdGVtSWQuZXF1YWxzKElOVEVSTkFMKSkKLQkJCQlyZXR1cm4gbmV3IElucHV0U291cmNlKHJlYWRlcik7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvc2NoZW1hL0FudERURFNjaGVtYU1lc3NhZ2VzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9zY2hlbWEvQW50RFREU2NoZW1hTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjViODdmNy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9zY2hlbWEvQW50RFREU2NoZW1hTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuc2NoZW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEFudERURFNjaGVtYU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5zY2hlbWEuQW50RFREU2NoZW1hTWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vZGVsX21vZGVsX21heV9ub3RfYmVfY2hhbmdlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb2RlbF9fX19VTktOT1dOX19fXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmZtUGFyc2VyX0FtYmlndW91czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFGYWN0b3J5X0RvdWJseV9kZWZpbmVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVtYUZhY3RvcnlfU3RhcnRfd2l0aF9sZWZ0X3BhcmVudGhlc2lzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVtYUZhY3RvcnlfRXhwZWN0aW5nX29wZXJhdG9yX29yX3JpZ2h0X3BhcmVudGhlc2lzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVtYUZhY3RvcnlfVW5leHBlY3RlZF9lbmQ7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQW50RFREU2NoZW1hTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9zY2hlbWEvQW50RFREU2NoZW1hTWVzc2FnZXMucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3NjaGVtYS9BbnREVERTY2hlbWFNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWYwZDljLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3NjaGVtYS9BbnREVERTY2hlbWFNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1Nb2RlbF9tb2RlbF9tYXlfbm90X2JlX2NoYW5nZWQ9bW9kZWwgbWF5IG5vdCBiZSBjaGFuZ2VkIG9uY2UgaXRzIGNvbnRlbnRzIGhhdmUgYmVlbiByZXF1ZXN0ZWQKLU1vZGVsX19fX1VOS05PV05fX19fMj08VU5LTk9XTj4KLU5mbVBhcnNlcl9BbWJpZ3VvdXM9QW1iaWd1b3VzIGNvbnRlbnQgbW9kZWwgc3RhcnRpbmcgd2l0aCB7MH0KLVNjaGVtYUZhY3RvcnlfRG91Ymx5X2RlZmluZWQ9RWxlbWVudCB7MH0gaXMgZG91Ymx5IGRlZmluZWQKLVNjaGVtYUZhY3RvcnlfU3RhcnRfd2l0aF9sZWZ0X3BhcmVudGhlc2lzPUVsZW1lbnQgezB9IG1vZGVsIGRvZXMgbm90IHN0YXJ0IHdpdGggbGVmdCBwYXJlbnRoZXNpcwotU2NoZW1hRmFjdG9yeV9FeHBlY3Rpbmdfb3BlcmF0b3Jfb3JfcmlnaHRfcGFyZW50aGVzaXM9RXhwZWN0aW5nIG9wZXJhdG9yIG9yIHJpZ2h0IHBhcmVudGhlc2lzIGluIGVsZW1lbnQgezB9IG1vZGVsIHsxfQotU2NoZW1hRmFjdG9yeV9VbmV4cGVjdGVkX2VuZD1VbmV4cGVjdGVkIGVuZCBvZiBjb250ZW50IG1vZGVsIGZvciBlbGVtZW50IHswfTogezF9CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9zY2hlbWEvQXR0cmlidXRlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9zY2hlbWEvQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljOWMwMjkuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvc2NoZW1hL0F0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDUgT2JqZWN0IEZhY3RvcnkgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqCQlPYmplY3QgRmFjdG9yeSBJbmMuIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuc2NoZW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC4qOwotCi0vKioKLSAqIEF0dHIgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgYXR0cmlidXRlLgotICogQGF1dGhvciBCb2IgRm9zdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGUgZXh0ZW5kcyBBdG9tIGltcGxlbWVudHMgSUF0dHJpYnV0ZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgZlR5cGU7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBmRW51bTsKLQlwcml2YXRlIElFbGVtZW50IGZFbGVtZW50OwotCXByaXZhdGUgU3RyaW5nIGZEZWZhdWx0OwotCXByaXZhdGUgYm9vbGVhbiBmRml4ZWQ7Ci0JcHJpdmF0ZSBib29sZWFuIGZSZXF1aXJlZDsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3Rvci4KLQkgKiBAcGFyYW0gbmFtZSBBdHRyaWJ1dGUgcW5hbWUuCi0JICogQHBhcmFtIGVsZW1lbnQgUGFyZW50IGVsZW1lbnQuCi0JICovCi0JcHVibGljIEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgSUVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihBVFRSSUJVVEUsIG5hbWUpOwotCQlmRWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JQXR0cmlidXRlI2dldFR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklBdHRyaWJ1dGUjZ2V0RW51bSgpCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEVudW0oKSB7Ci0JCXJldHVybiBmRW51bTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JQXR0cmlidXRlI2dldEVsZW1lbnQoKQotCSAqLwotCXB1YmxpYyBJRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZkVsZW1lbnQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuSUF0dHJpYnV0ZSNnZXREZWZhdWx0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBmRGVmYXVsdDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JQXR0cmlidXRlI2lzRml4ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRml4ZWQoKSB7Ci0JCXJldHVybiBmRml4ZWQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuSUF0dHJpYnV0ZSNpc1JlcXVpcmVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlcXVpcmVkKCkgewotCQlyZXR1cm4gZlJlcXVpcmVkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCWZUeXBlID0gdHlwZTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZS4KLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0JCWZEZWZhdWx0ID0gZGVmYXVsdFZhbHVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGVudW1lcmF0aW9uLgotCSAqIEBwYXJhbSBlbnVtZXJhdGlvbiBUaGUgZW51bWVyYXRpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RW51bShTdHJpbmdbXSBlbnVtZXJhdGlvbikgewotCQlmRW51bSA9IGVudW1lcmF0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpeGVkLgotCSAqIEBwYXJhbSBmaXhlZCBUaGUgZml4ZWQgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Rml4ZWQoYm9vbGVhbiBmaXhlZCkgewotCQlmRml4ZWQgPSBmaXhlZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSByZXF1aXJlZC4KLQkgKiBAcGFyYW0gcmVxdWlyZWQgVGhlIHJlcXVpcmVkIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKGJvb2xlYW4gcmVxdWlyZWQpIHsKLQkJZlJlcXVpcmVkID0gcmVxdWlyZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvc2NoZW1hL0RmbS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvc2NoZW1hL0RmbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWVhMGZmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3NjaGVtYS9EZm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IE9iamVjdCBGYWN0b3J5IEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKgkJT2JqZWN0IEZhY3RvcnkgSW5jLiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLnNjaGVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuSUF0b207Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JRGZtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbC5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbC5GYWN0b3J5T2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbC5NYXBIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC51dGlsLlNvcnRlZE1hcDsKLQotCi0vKioKLSAqIERldGVybWluaXN0aWMgZmluaXRlIHN0YXRlIG1hY2hpbmUuCi0gKiBPbmNlIGNvbnN0cnVjdGVkIERGTSBpcyBpbW11dGFibGUgYW5kIGNhbiBiZSB1c2VkIGJ5IG11bHRpcGxlIHRocmVhZHMuCi0gKiBBIERmbSBub2RlIGlzIGVzc2VudGlhbGx5IGFuIGFjY2VwdGluZyBmbGFnIGFuZCBhIGhhc2h0YWJsZSBtYXBwaW5nIGF0b21zIHRvCi0gKiBEZm0gbm9kZXMuIChBbG1vc3Qgb2Ygb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC51dGlsIGlzIGFpbWVkIGF0IHJlZHVjaW5nIHRoZSBzdG9yYWdlCi0gKiBvdmVyaGVhZCBvZiBodW5kcmVkcyBvZiBsaXR0bGUgaGFzaHRhYmxlcy4pCi0gKiBAYXV0aG9yIEJvYiBGb3N0ZXIKLSAqLwotcHVibGljIGNsYXNzIERmbSBleHRlbmRzIE1hcEhvbGRlciBpbXBsZW1lbnRzIElEZm0sIEZhY3RvcnlPYmplY3QgewotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0aW5nOwotCXB1YmxpYyBib29sZWFuIGVtcHR5LCBhbnk7Ci0JcHVibGljIGludCBpZDsKLQlwcml2YXRlIHN0YXRpYyBpbnQgdW5pcXVlID0gMDsKLQlwcml2YXRlIHN0YXRpYyBGYWN0b3J5IGZhY3RvcnkgPSBuZXcgRmFjdG9yeSgpOwotCXByaXZhdGUgRGZtIGZOZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgRGZtIGRmbShib29sZWFuIGFjY2VwdGluZykgewotCQlEZm0gZGZtID0gZnJlZSgpOwotCQlkZm0uYWNjZXB0aW5nID0gYWNjZXB0aW5nOwotCQlyZXR1cm4gZGZtOwotCX0KLQotCXByb3RlY3RlZCBEZm0oKSB7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIERmbSBmcmVlKCkgewotCQlEZm0gZGZtID0gKERmbSkgZmFjdG9yeS5nZXRGcmVlKCk7Ci0JCWlmIChkZm0gPT0gbnVsbCkKLQkJCWRmbSA9IG5ldyBEZm0oKTsKLQkJZGZtLmFjY2VwdGluZyA9IGRmbS5lbXB0eSA9IGRmbS5hbnkgPSBmYWxzZTsKLQkJZGZtLmlkID0gdW5pcXVlKys7Ci0JCXJldHVybiBkZm07Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEZm0gZGZtKElBdG9tIGFjY2VwdCwgRGZtIGZvbGxvdykgewotCQlEZm0gZGZtID0gZnJlZSgpOwotCQlkZm0ua2V5cyA9IG5ldyBPYmplY3RbMV07Ci0JCWRmbS5rZXlzWzBdID0gYWNjZXB0OwotCQlkZm0udmFsdWVzID0gbmV3IE9iamVjdFsxXTsKLQkJZGZtLnZhbHVlc1swXSA9IGZvbGxvdzsKLQkJcmV0dXJuIGRmbTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyZWUoRGZtIGRmbSkgewotCQlkZm0uc2V0S2V5cyhudWxsKTsKLQkJZGZtLnNldFZhbHVlcyhudWxsKTsKLQkJZmFjdG9yeS5zZXRGcmVlKGRmbSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQWNjZXB0aW5nKCkgewotCQlyZXR1cm4gYWNjZXB0aW5nOwotCX0KLQkKLQlwdWJsaWMgSURmbSBhZHZhbmNlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChhbnkpCi0JCQlyZXR1cm4gdGhpczsKLQkJaWYgKGVtcHR5KQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChrZXlzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU29ydGVkTWFwIG1hcCA9IGdldEluZGlyZWN0U3RyaW5nTWFwKHRoaXMpOwotCQlEZm0gZGZtID0gKERmbSkgbWFwLmdldChuYW1lKTsKLQkJZnJlZU1hcChtYXApOwotCQlyZXR1cm4gZGZtOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nW10gZ2V0QWNjZXB0cygpIHsKLQkJaWYgKGtleXMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1trZXlzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGg7IGkrKykgewotCQkJc1tpXSA9IGtleXNbaV0udG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gczsKLQl9Ci0KLQlwdWJsaWMgRGZtW10gZ2V0Rm9sbG93cygpIHsKLQkJaWYgKHZhbHVlcyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBEZm1bMF07Ci0JCURmbVtdIHMgPSBuZXcgRGZtW3ZhbHVlcy5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHZhbHVlcywwLHMsMCx2YWx1ZXMubGVuZ3RoKTsKLQkJcmV0dXJuIHM7Ci0JfQotCi0JcHVibGljIHZvaWQgbWVyZ2UoRGZtIG90aGVyKSB7Ci0JCWFjY2VwdGluZyB8PSBvdGhlci5hY2NlcHRpbmc7Ci0JCVNvcnRlZE1hcCBtYXAgPSBnZXRJbmRpcmVjdFN0cmluZ01hcCh0aGlzKTsKLQkJU29ydGVkTWFwIG90aGVybWFwID0gZ2V0SW5kaXJlY3RTdHJpbmdNYXAob3RoZXIpOwotCQltYXAubWVyZ2Uob3RoZXJtYXApOwotCQlmcmVlTWFwKG1hcCk7Ci0JCWZyZWVNYXAob3RoZXJtYXApOwotCX0KLQkKLQlwdWJsaWMgU29ydGVkTWFwIGdldE1hcCgpIHsKLQkJcmV0dXJuIGdldEluZGlyZWN0U3RyaW5nTWFwKHRoaXMpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLnV0aWwuRmFjdG9yeU9iamVjdCNuZXh0KCkKLQkgKi8KLQlwdWJsaWMgRmFjdG9yeU9iamVjdCBuZXh0KCkgewotCQlyZXR1cm4gZk5leHQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC51dGlsLkZhY3RvcnlPYmplY3QjbmV4dChvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLnV0aWwuRmFjdG9yeU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBuZXh0KEZhY3RvcnlPYmplY3Qgb2JqKSB7Ci0JCWZOZXh0ID0gKERmbSkgb2JqOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuSURmbSNpc0FueSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBbnkoKSB7Ci0JCXJldHVybiBhbnk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JRGZtI2lzRW1wdHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiBlbXB0eTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklEZm0jZ2V0QXRvbShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJQXRvbSBnZXRBdG9tKFN0cmluZyBuYW1lKSB7Ci0JCU9iamVjdFtdIGFsbEtleXMgPSBnZXRLZXlzKCk7Ci0JCWlmIChlbXB0eSB8fCBhbGxLZXlzID09IG51bGwpewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU29ydGVkTWFwIG1hcCA9IGdldEluZGlyZWN0U3RyaW5nTWFwKHRoaXMpOwotCQlpbnQgaW5kZXggPSBtYXAua2V5SW5kZXgobmFtZSk7Ci0JCWlmIChpbmRleCA8IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoSUF0b20pIGFsbEtleXNbaW5kZXhdOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuSURmbSNhZHZhbmNlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElEZm0gYWR2YW5jZShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxuYW1lKSB7Ci0JCS8vIG5vIG5hbWVzcGFjZSBzdXBwb3J0IGhlcmUKLQkJcmV0dXJuIGFkdmFuY2UobG9jYWxuYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvc2NoZW1hL0VsZW1lbnQuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3NjaGVtYS9FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NWJiYzAuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvc2NoZW1hL0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IE9iamVjdCBGYWN0b3J5IEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKgkJT2JqZWN0IEZhY3RvcnkgSW5jLiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCQlJQk0gQ29ycG9yYXRpb24gLSBmaXggZm9yIEJ1ZyA0MDk1MQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuc2NoZW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuSUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklEZm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLlBhcnNlRXJyb3I7Ci0KLXB1YmxpYyBjbGFzcyBFbGVtZW50IGV4dGVuZHMgQXRvbSBpbXBsZW1lbnRzIElFbGVtZW50IHsKLQlwcml2YXRlIGJvb2xlYW4gZlVuZGVmaW5lZCA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIGZUZXh0OwotCXByaXZhdGUgSU1vZGVsIGZNb2RlbDsKLQlwcml2YXRlIE1hcCBmTWFwID0gbmV3IEhhc2hNYXAoNCk7IAotCXByaXZhdGUgRGZtIGZFbGVtZW50RGZtOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gbmFtZSBRTmFtZSBvZiBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBFbGVtZW50KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKEVMRU1FTlQsIG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldCB1bmRlZmluZWQgcHJvcGVydHkuCi0JICogQHBhcmFtIHVuZGVmaW5lZCBGYWxzZSBpZiBkZWZpbmVkOyBvdGhlcndpc2UgdHJ1ZSAoZGVmYXVsdCkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5kZWZpbmVkKGJvb2xlYW4gdW5kZWZpbmVkKSB7Ci0JCWZVbmRlZmluZWQgPSB1bmRlZmluZWQ7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0ZXh0IHByb3BlcnR5LgotCSAqIEBwYXJhbSB0ZXh0IFRydWUgaWYgdGV4dCBvbmx5OyBvdGhlcndpc2UgZmFsc2UgKGRlZmF1bHQpLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoYm9vbGVhbiB0ZXh0KSB7Ci0JCWZUZXh0ID0gdGV4dDsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IG1vZGVsIHByb3BlcnR5LgotCSAqIEBwYXJhbSBtb2RlbCBEZm0gZGVzY3JpYmluZyBjb250ZW50IG1vZGVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRNb2RlbChJTW9kZWwgbW9kZWwpIHsKLQkJZk1vZGVsID0gbW9kZWw7Ci0JfQotCQotCS8qKgotCSAqIEFkZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIGF0dHJpYnV0ZSBtYXAuCi0JICogQHBhcmFtIGF0dHJpYnV0ZSBBdHRyaWJ1dGUgdG8gYWRkLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShJQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlmTWFwLnB1dChhdHRyaWJ1dGUuZ2V0TmFtZSgpLCBhdHRyaWJ1dGUpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuSUVsZW1lbnQjZ2V0QXR0cmlidXRlcygpCi0JICovCi0JcHVibGljIE1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gZk1hcDsKLQl9Ci0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklFbGVtZW50I2lzTWl4ZWQoKQotCSAqLwotCXB1YmxpYyBJTW9kZWwgZ2V0Q29udGVudE1vZGVsKCkgewotCQlyZXR1cm4gZk1vZGVsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JRWxlbWVudCNpc1RleHQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVGV4dCgpIHsKLQkJcmV0dXJuIGZUZXh0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JRWxlbWVudCNpc1VuZGVmaW5lZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVbmRlZmluZWQoKSB7Ci0JCXJldHVybiBmVW5kZWZpbmVkOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JRWxlbWVudCNnZXREZm0oKQotCSAqLwotCXB1YmxpYyBJRGZtIGdldERmbSgpIHsKLQkJRGZtIGRmbSA9IGZFbGVtZW50RGZtOwotCQlpZiAoZGZtID09IG51bGwpIHsKLQkJCWRmbSA9IHBhcnNlRWxlbWVudERmbSgpOwotCQkJZkVsZW1lbnREZm0gPSBkZm07Ci0JCX0KLQkJcmV0dXJuIGRmbTsKLQl9Ci0JCi0JcHJpdmF0ZSBEZm0gcGFyc2VFbGVtZW50RGZtKCkgewotCQlEZm0gZGZtOwotCQlpZiAoZkFueSkgewotCQkJZGZtID0gRGZtLmRmbSh0cnVlKTsKLQkJCWRmbS5hbnkgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKGZFbXB0eSB8fCBmVGV4dCkgewotCQkJZGZtID0gRGZtLmRmbSh0cnVlKTsKLQkJCWRmbS5lbXB0eSA9IHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlkZm0gPSBwYXJzZU1vZGVsKGZNb2RlbCk7Ci0JCX0KLQkJcmV0dXJuIGRmbTsKLQl9Ci0JCi0JcHJpdmF0ZSBEZm0gcGFyc2VNb2RlbChJTW9kZWwgbW9kZWwpIHsKLQkJRGZtIGRmbTsKLQkJTmZtIG5mbSA9IG1vZGVsLnRvTmZtKCk7Ci0JCWlmIChuZm0gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlkZm0gPSBmTmZtUGFyc2VyLnBhcnNlKG5mbSk7Ci0JCQl9IGNhdGNoIChQYXJzZUVycm9yIGUpIHsKLQkJCQkvLz8/PyB0aGlzIHdvdWxkIGJlIHRoZSBwbGFjZSB0byBsb2cgdGhlIGVycm9yCi0JCQkJZGZtID0gRGZtLmRmbShmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlkZm0gPSBEZm0uZGZtKGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gZGZtOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBOZm1QYXJzZXIgZk5mbVBhcnNlciA9IG5ldyBOZm1QYXJzZXIoKTsKLQlwcml2YXRlIGJvb2xlYW4gZkFueTsKLQlwcml2YXRlIGJvb2xlYW4gZkVtcHR5OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklFbGVtZW50I2lzQW55KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FueSgpIHsKLQkJcmV0dXJuIGZBbnk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklFbGVtZW50I2lzRW1wdHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiBmRW1wdHk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYW55LgotCSAqIEBwYXJhbSBhbnkgVGhlIGFueSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbnkoYm9vbGVhbiBhbnkpIHsKLQkJZkFueSA9IGFueTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBlbXB0eS4KLQkgKiBAcGFyYW0gZW1wdHkgVGhlIGVtcHR5IHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVtcHR5KGJvb2xlYW4gZW1wdHkpIHsKLQkJZkVtcHR5ID0gZW1wdHk7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3NjaGVtYS9OZm0uamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3NjaGVtYS9OZm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M5NTk5Yy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9zY2hlbWEvTmZtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBPYmplY3QgRmFjdG9yeSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICoJCU9iamVjdCBGYWN0b3J5IEluYy4gLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklBdG9tOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbC5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbC5GYWN0b3J5T2JqZWN0OwotCi0KLS8qKgotICogTm9uLWRldGVybWluaXN0aWMgZmluaXRlIHN0YXRlIG1hY2hpbmUuCi0gKiBAYXV0aG9yIEJvYiBGb3N0ZXIKLSAqLwotcHVibGljIGNsYXNzIE5mbSBpbXBsZW1lbnRzIEZhY3RvcnlPYmplY3QgewotCXByaXZhdGUgTmZtTm9kZSBzdGFydDsKLQlwcml2YXRlIE5mbU5vZGUgc3RvcDsKLQkKLQlwdWJsaWMgTmZtTm9kZSBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIHN0YXJ0OwotCX0KLQkKLQlwdWJsaWMgTmZtTm9kZSBnZXRTdG9wKCkgewotCQlyZXR1cm4gc3RvcDsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIG5mbSBzdWNoIHRoYXQ6Ci0JICogPHByZT4KLQkgKiBzdGFydCAgc3RvcAotCSAqICAgfCAgICAgIHwKLQkgKiArLS0tKyAgKy0tLSsKLQkgKiB8IHMgfC0+fCAgIHwKLQkgKiArLS0tKyAgKy0tLSsKLQkgKiA8L3ByZT4KLQkgKiBJbiBhbGwgcGljdHVyZXMsIGJveGVzIGFyZSBOZm1Ob2Rlcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBOZm0gbmZtKElBdG9tIHMpIHsKLQkJTmZtIG5mbSA9IGZyZWUoKTsKLQkJbmZtLnN0b3AgPSBOZm1Ob2RlLm5mbU5vZGUoKTsKLQkJbmZtLnN0YXJ0ID0gTmZtTm9kZS5uZm1Ob2RlKHMsIG5mbS5zdG9wKTsKLQkJcmV0dXJuIG5mbTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIG5mbSB0aGF0ICJ3cmFwcyIgYW4gZXhpc3RpbmcgbmZtIHggc3VjaCB0aGF0OgotCSAqIDxwcmU+Ci0JICogc3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcAotCSAqICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotCSAqICstLS0rICArLS0tLS0tLS0tKyAgKy0tLS0tLS0tLSsgICstLS0rCi0JICogfCAgIHwtPnwgeCBzdGFydCB8ICB8IHggc3RvcCAgfC0+fCAgIHwKLQkgKiArLS0tKyAgKy0tLS0tLS0tLSsgICstLS0tLS0tLS0rICArLS0tKwotCSAqIDwvcHJlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIE5mbSBuZm0oTmZtIHgpIHsKLQkJTmZtIG5mbSA9IGZyZWUoKTsKLQkJbmZtLnN0YXJ0ID0gTmZtTm9kZS5uZm1Ob2RlKHguc3RhcnQpOwotCQluZm0uc3RvcCA9IE5mbU5vZGUubmZtTm9kZSgpOwotCQl4LnN0b3AubmV4dDEgPSBuZm0uc3RvcDsKLQkJcmV0dXJuIG5mbTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTmZtIG5mbSgpIHsKLQkJTmZtIG5mbSA9IGZyZWUoKTsKLQkJbmZtLnN0YXJ0ID0gTmZtTm9kZS5uZm1Ob2RlKCk7Ci0JCW5mbS5zdG9wID0gTmZtTm9kZS5uZm1Ob2RlKCk7Ci0JCXJldHVybiBuZm07Ci0JfQotCi0JcHVibGljIHN0YXRpYyBOZm0gZ2V0TmZtKElBdG9tIHMpIHsKLQkJcmV0dXJuIG5mbShzKTsKLQl9Ci0JCi0JLyoqCi0JICogIlN0YXIiIGFuIGV4aXN0aW5nIG5mbSB4LgotCSAqIDxwcmU+Ci0JICogc3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcAotCSAqICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotCSAqICstLS0rICArLS0tLS0tLS0tKyAgKy0tLS0tLS0tLSsgICstLS0rCi0JICogfCAgIHwtPnwgeCBzdGFydCB8ICB8IHggc3RvcCAgfC0+fCAgIHwKLQkgKiArLS0tKyAgKy0tLS0tLS0tLSsgICstLS0tLS0tLS0rICArLS0tKwotCSAqICAgfCAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgfAotCSAqICAgfCAgICAgICAgICstLS0tLTwtLS0tLS0rICAgICAgICAgfAotCSAqICAgKy0tLS0tLT4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCSAqIDwvcHJlPgotCSAqIEZyZWVzIHguCi0JICovCi0JcHVibGljIHN0YXRpYyBOZm0gZ2V0U3RhcihOZm0geCkgewotCQkvLyBNYWtlIHRoZSBiYWNrIGxpbmsKLQkJeC5zdG9wLm5leHQyID0geC5zdGFydDsKLQkJTmZtIHRtcCA9IG5mbSh4KTsKLQkJLy8gTWFrZSB0aGUgZm9yd2FyZCBsaW5rCi0JCXRtcC5zdGFydC5uZXh0MiA9IHRtcC5zdG9wOwotCQlmcmVlKHgpOwotCQlyZXR1cm4gdG1wOwotCX0KLQkKLQkvKioKLQkgKiAiUXVlc3Rpb24iIGFuIGV4aXN0aW5nIG5mbSB4OiB4ID0+IHg/Ci0JICogPHByZT4KLQkgKiBzdGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wCi0JICogICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0JICogKy0tLSsgICstLS0tLS0tLS0rICArLS0tLS0tLS0tKyAgKy0tLSsKLQkgKiB8ICAgfC0+fCB4IHN0YXJ0IHwgIHwgeCBzdG9wICB8LT58ICAgfAotCSAqICstLS0rICArLS0tLS0tLS0tKyAgKy0tLS0tLS0tLSsgICstLS0rCi0JICogICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0JICogICArLS0tLS0tLS0tLS0tLS0tLT4tLS0tLS0tLS0tLS0tLS0rCi0JICogPC9wcmU+Ci0JICogRnJlZXMgeC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5mbSBnZXRRdWVzdGlvbihOZm0geCkgewotCQlOZm0gdG1wID0gbmZtKHgpOwotCQkvLyBNYWtlIHRoZSBmb3J3YXJkIGxpbmsKLQkJdG1wLnN0YXJ0Lm5leHQyID0gdG1wLnN0b3A7Ci0JCWZyZWUoeCk7Ci0JCXJldHVybiB0bXA7Ci0JfQotCi0JLyoqCi0JICogIlBsdXMiIGFuIGV4aXN0aW5nIG5mbSB4IC0+IHgrCi0JICogPHByZT4KLQkgKiBzdGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wCi0JICogICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0JICogKy0tLSsgICstLS0tLS0tLS0rICArLS0tLS0tLS0tKyAgKy0tLSsKLQkgKiB8ICAgfC0+fCB4IHN0YXJ0IHwgIHwgeCBzdG9wICB8LT58ICAgfAotCSAqICstLS0rICArLS0tLS0tLS0tKyAgKy0tLS0tLS0tLSsgICstLS0rCi0JICogICAgICAgICAgICAgfCAgICAgICAgICAgIHwKLQkgKiAgICAgICAgICAgICArLS0tLS08LS0tLS0tKwotCSAqIDwvcHJlPgotCSAqIEZyZWVzIHguCi0JICovCi0JcHVibGljIHN0YXRpYyBOZm0gZ2V0UGx1cyhOZm0geCkgewotCQkvLyBNYWtlIHRoZSBiYWNrIGxpbmsKLQkJeC5zdG9wLm5leHQyID0geC5zdGFydDsKLQkJTmZtIHRtcCA9IG5mbSh4KTsKLQkJZnJlZSh4KTsKLQkJcmV0dXJuIHRtcDsKLQl9Ci0JCi0JLyoqCi0JICogIk9yIiB0d28gZXhpc3RpbmcgbmZtcyB4LHkgLT4geHx5Ci0JICogPHByZT4KLQkgKiBzdGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wCi0JICogICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0JICogKy0tLSsgICstLS0tLS0tLS0rICArLS0tLS0tLS0tKyAgKy0tLSsKLQkgKiB8ICAgfC0+fCB4IHN0YXJ0IHwgIHwgeCBzdG9wICB8LT58ICAgfAotCSAqICstLS0rICArLS0tLS0tLS0tKyAgKy0tLS0tLS0tLSsgICstLS0rCi0JICogICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0JICogICB8ICAgICstLS0tLS0tLS0rICArLS0tLS0tLS0tKyAgICB8Ci0JICogICArLS0tPnwgeSBzdGFydCB8ICB8IHkgc3RvcCAgfC0tPi0rCi0JICogICAgICAgICstLS0tLS0tLS0rICArLS0tLS0tLS0tKwotCSAqIDwvcHJlPgotCSAqIEZyZWVzIHggYW5kIHkuCi0JICovCi0JcHVibGljIHN0YXRpYyBOZm0gZ2V0T3IoTmZtIHgsIE5mbSB5KSB7Ci0JCU5mbSB0bXAgPSBuZm0oKTsKLQkJdG1wLnN0YXJ0Lm5leHQxID0geC5zdGFydDsKLQkJdG1wLnN0YXJ0Lm5leHQyID0geS5zdGFydDsKLQkJeC5zdG9wLm5leHQxID0gdG1wLnN0b3A7Ci0JCXkuc3RvcC5uZXh0MSA9IHRtcC5zdG9wOwotCQlmcmVlKHgpOwotCQlmcmVlKHkpOwotCQlyZXR1cm4gdG1wOwotCX0KLQkKLQkvKioKLQkgKiAiQ29tbWEiIHR3byBleGlzdGluZyBuZm1zIHgseSAtPiB4LHkKLQkgKiAKLQkgKiA8cD5SZS11c2VzIHggc28gdGhhdCB4LnN0b3AgaXMgZmlyc3QKLQkgKiB0cmFuc2Zvcm1lZCB0byB5LnN0YXJ0IGFuZCB0aGVuCi0JICogeC5zdG9wIGlzIHJlc2V0IHRvIHkuc3RvcC4KLQkgKiBUaGlzIGlzIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZS4KLQkgKiA8cHJlPgotCSAqIHggc3RhcnQgICAgICBmb3JtZXIgeCBzdG9wICAgeCBzdG9wCi0JICogICAgIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICB8Ci0JICogKy0tLS0tLS0tLSsgICstLS0tLS0tLS0tKyAgKy0tLS0tLS0tKwotCSAqIHwgeCBzdGFydCB8ICB8IHkgc3RhcnQgIHwtPnwgeSBzdG9wIHwKLQkgKiArLS0tLS0tLS0tKyAgKy0tLS0tLS0tLS0rICArLS0tLS0tLS0rCi0JICogPC9wcmU+Ci0JICogRnJlZXMgeSwgcmV0dXJucyB4IG1vZGlmaWVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTmZtIGdldENvbW1hKE5mbSB4LCBOZm0geSkgewotCQl4LnN0b3AubmV4dDEgPSB5LnN0YXJ0Lm5leHQxOwotCQl4LnN0b3AubmV4dDIgPSB5LnN0YXJ0Lm5leHQyOwotCQl4LnN0b3Auc3ltYm9sID0geS5zdGFydC5zeW1ib2w7Ci0JCXguc3RvcCA9IHkuc3RvcDsKLQkJZnJlZSh5KTsKLQkJcmV0dXJuIHg7Ci0JfQotCQotCS8qKgotCSAqICJ7bWluLCp9IiBhbiBleGlzdGluZyBuZm0geCAtPiB4WzBdLHhbMV0sLi4uLHhbbWluLTFdLHhbbWluXSoKLQkgKiBGcmVlcyB4LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTmZtIGdldFVuYm91bmRlZChOZm0geCwgaW50IG1pbikgewotCQlpZiAobWluID09IDApCi0JCQlyZXR1cm4gZ2V0U3Rhcih4KTsKLQkJaWYgKG1pbiA9PSAxKQotCQkJcmV0dXJuIGdldFBsdXMoeCk7Ci0JCU5mbSBsYXN0MSA9IG5mbSh4KSwgbGFzdDIgPSBuZm0oeCk7Ci0JCWZvciAoaW50IGkgPSAyOyBpIDwgbWluOyBpKyspIHsKLQkJCWxhc3QxID0gZ2V0Q29tbWEobGFzdDEsIGxhc3QyKTsKLQkJCWZyZWUobGFzdDIpOwotCQkJbGFzdDIgPSBuZm0oeCk7Ci0JCX0KLQkJZnJlZSh4KTsKLQkJcmV0dXJuIGdldENvbW1hKGxhc3QxLCBnZXRTdGFyKGxhc3QyKSk7Ci0JfQotCQotCS8qKgotCSAqICJ7bWluLG1heH0iIGFuIGV4aXN0aW5nIG5mbSB4IC0+IHhbMF0seFsxXSwuLi4seFttaW4tMV0seFttaW5dPywuLi4seFttYXgtMV0/Ci0JICogRnJlZXMgb3IgcmV0dXJucyB4LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTmZtIGdldE1pbk1heChOZm0geCwgaW50IG1pbiwgaW50IG1heCkgewotCQlpZiAobWF4ID09IEludGVnZXIuTUFYX1ZBTFVFKQotCQkJcmV0dXJuIGdldFVuYm91bmRlZCh4LCBtaW4pOwotCQlpZiAobWF4ID09IDApIHsKLQkJCWZyZWUoeCk7Ci0JCQlyZXR1cm4gbmZtKChJQXRvbSludWxsKTsKLQkJfQotCQlpZiAobWF4ID09IDEpIHsKLQkJCWlmIChtaW4gPT0gMCkKLQkJCQlyZXR1cm4gZ2V0UXVlc3Rpb24oeCk7Ci0JCQlyZXR1cm4geDsKLQkJfQotCQlOZm0gbGFzdCA9IG51bGw7Ci0JCWludCBpID0gMDsKLQkJZm9yICg7IGkgPCBtaW47IGkrKykgewotCQkJaWYgKGxhc3QgPT0gbnVsbCkKLQkJCQlsYXN0ID0gbmZtKHgpOwotCQkJZWxzZSB7Ci0JCQkJTmZtIHRtcCA9IG5mbSh4KTsKLQkJCQlsYXN0ID0gZ2V0Q29tbWEobGFzdCwgdG1wKTsKLQkJCQlmcmVlKHRtcCk7Ci0JCQl9Ci0JCX0KLQkJZm9yICg7IGkgPCBtYXg7IGkrKykgewotCQkJaWYgKGxhc3QgPT0gbnVsbCkKLQkJCQlsYXN0ID0gZ2V0UXVlc3Rpb24oeCk7Ci0JCQllbHNlIHsKLQkJCQlOZm0gdG1wID0gZ2V0UXVlc3Rpb24oeCk7Ci0JCQkJbGFzdCA9IGdldENvbW1hKGxhc3QsIHRtcCk7Ci0JCQkJZnJlZSh0bXApOwotCQkJCS8vPz8/IHRoaXMgaXMgaW5lZmZpY2llbnQgc2luY2UgdGhlIGZpcnN0IGZhaWx1cmUKLQkJCQkvLyAgICBpbiBhIHNlcXVlbmNlIG9mIHg/LHg/LC4uLix4PyBjYW4gc2tpcCB0bwotCQkJCS8vICAgIHRoZSBlbmQgcmF0aGVyIHRoYW4ga2VlcCB0cnlpbmcgdG8gbWF0Y2ggeAotCQkJfQotCQl9Ci0JCWZyZWUoeCk7Ci0JCXJldHVybiBsYXN0OwotCX0KLQkKLQkvLyBCZWxvdyBoZXJlIGlzIGZhY3Rvcnkgc3R1ZmYKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLnV0aWwuRmFjdG9yeU9iamVjdCNuZXh0KCkKLQkgKi8KLQlwdWJsaWMgRmFjdG9yeU9iamVjdCBuZXh0KCkgewotCQlyZXR1cm4gZk5leHQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbC5GYWN0b3J5T2JqZWN0I25leHQob3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC51dGlsLkZhY3RvcnlPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgbmV4dChGYWN0b3J5T2JqZWN0IG9iaikgewotCQlmTmV4dCA9IChOZm0pIG9iajsKLQl9Ci0JcHJpdmF0ZSBOZm0gZk5leHQ7Ci0JcHJpdmF0ZSBzdGF0aWMgRmFjdG9yeSBmRmFjdG9yeSA9IG5ldyBGYWN0b3J5KCk7Ci0JcHJpdmF0ZSBzdGF0aWMgTmZtIGZyZWUoKSB7Ci0JCU5mbSBuZm0gPSAoTmZtKSBmRmFjdG9yeS5nZXRGcmVlKCk7Ci0JCWlmIChuZm0gPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTmZtKCk7Ci0JCXJldHVybiBuZm07Ci0JfQotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcmVlKE5mbSBuZm0pIHsKLQkJbmZtLnN0YXJ0ID0gbmZtLnN0b3AgPSBudWxsOwotCQlmRmFjdG9yeS5zZXRGcmVlKG5mbSk7Ci0JfQotCXByaXZhdGUgTmZtKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3NjaGVtYS9OZm1Ob2RlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9zY2hlbWEvTmZtTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWQwMTg5Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3NjaGVtYS9OZm1Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBPYmplY3QgRmFjdG9yeSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICoJCU9iamVjdCBGYWN0b3J5IEluYy4gLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5zY2hlbWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklBdG9tOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbC5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbC5GYWN0b3J5T2JqZWN0OwotCi0vKioKLSAqIE5vbi1kZXRlcm1pbmlzdGljIGZpbml0ZSBzdGF0ZSBtYWNoaW5lIG5vZGUuPHA+Ci0gKiAKLSAqIEZvbGxvd2luZyBBaG8gJiBVbGxtYW4sIG5mbSBub2RlcyBjb250YWluIHR3bwotICogdHJhbnNpdGlvbiBsaW5rcy4gVGhlIGdyYXBoIGlzIGNvbnN0cnVjdGVkIHNvCi0gKiB0aGF0IG5vIG5vZGUgcmVxdWlyZXMgbW9yZSB0aGFuIHR3byBsaW5rcy4KLSAqIFRoZXJlIGFyZSBleGFjdGx5IHRoZXNlIGtpbmRzIG9mIG5vZGVzOgotICogPHByZT4KLSAqCQlTeW1ib2wJTmV4dDEJTmV4dDIJTWVhbmluZwotICoJCSAgImEiCSBmd2QJIG51bGwJUmVnZXhwICJhIgotICoJCSAgbnVsbAkgbnVsbAkgbnVsbAlBY2NlcHRpbmcgbm9kZQotICoJCSAgbnVsbAkgZndkMQkgZndkMglTdGFydCBub2RlIG9mID8gYW5kICogcmVnZXhwCi0gKgkJCQkJCQkJZndkMiBwb2ludHMgdG8gc3RvcCBub2RlCi0gKgkJICBudWxsCSBmd2QJIGJrdwlJbnRlcm5hbCBub2RlIG9mICsgYW5kICogcmVnZXhwCi0gKgkJCQkJCQkJZndkIHBvaW50cyB0byBzdG9wIG5vZGUKLSAqCQkJCQkJCQlia3cgcG9pbnRzLCBlLmcuLCBpbiAiYSoiIHRvIHN0YXJ0IG5vZGUgb2YgImEiCi0gKgkJICBudWxsCSBmd2QxCSBmd2QyCVN0YXJ0IG5vZGUgb2YgfCByZWdleHAsIGUuZy4sICJhfGIiLAotICoJCQkJCQkJCWZ3ZCBub2RlcyBwb2ludCB0byBzdGFydCBub2RlcyBvZiAiYSIgYW5kICJiIi4KLSAqCQkgIG51bGwJIGZ3ZAkgbnVsbAlJbnRlcm5hbCBub2RlIG9mIHwuCi0gKgkJCQkJCQkJZndkIHBvaW50cyB0byBzdG9wIG5vZGUuCi0gKiA8L3ByZT4KLSAqIFNlZSBOZm0gZm9yIHBpY3R1cmVzIG9mIGhvdyBub2RlcyBhcmUgdXNlZC4KLSAqIEBhdXRob3IgQm9iIEZvc3RlcgotICovCi1wdWJsaWMgY2xhc3MgTmZtTm9kZSBpbXBsZW1lbnRzIEZhY3RvcnlPYmplY3QgewotCi0JcHVibGljIElBdG9tIHN5bWJvbDsKLQlwdWJsaWMgTmZtTm9kZSBuZXh0MTsKLQlwdWJsaWMgTmZtTm9kZSBuZXh0MjsKLQlwdWJsaWMgRGZtIGRmbTsKLQlwdWJsaWMgaW50IG1hcms7Ci0JCi0JcHJpdmF0ZSBOZm1Ob2RlKCkgewotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE5mbU5vZGUgbmZtTm9kZShJQXRvbSBzeW1ib2wsIE5mbU5vZGUgbmV4dCkgewotCQlOZm1Ob2RlIG5mbSA9IGdldEZyZWUoKTsKLQkJbmZtLnN5bWJvbCA9IHN5bWJvbDsKLQkJbmZtLm5leHQxID0gbmV4dDsKLQkJcmV0dXJuIG5mbTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBOZm1Ob2RlIG5mbU5vZGUoTmZtTm9kZSBuZXh0KSB7Ci0JCU5mbU5vZGUgbmZtID0gZ2V0RnJlZSgpOwotCQluZm0ubmV4dDEgPSBuZXh0OwotCQlyZXR1cm4gbmZtOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE5mbU5vZGUgbmZtTm9kZSgpIHsKLQkJcmV0dXJuIGdldEZyZWUoKTsKLQl9Ci0JCi0JLyoqCi0JICogRnJlZSBhbGwgTmZtTm9kZXMgaW4gdXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcmVlQWxsKCkgewotCQl3aGlsZSAoZlVzZWQgIT0gbnVsbCkgewotCQkJRmFjdG9yeU9iamVjdCBuZm0gPSBmVXNlZDsKLQkJCWZVc2VkID0gbmZtLm5leHQoKTsKLQkJCXNldEZyZWUoKE5mbU5vZGUpbmZtKTsKLQkJfQotCX0KLQkKLQkvLyBCZWxvdyBoZXJlIGlzIGZhY3Rvcnkgc3R1ZmYKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLnV0aWwuRmFjdG9yeU9iamVjdCNuZXh0KCkKLQkgKi8KLQlwdWJsaWMgRmFjdG9yeU9iamVjdCBuZXh0KCkgewotCQlyZXR1cm4gbmV4dDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLnV0aWwuRmFjdG9yeU9iamVjdCNuZXh0KG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbC5GYWN0b3J5T2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG5leHQoRmFjdG9yeU9iamVjdCBvYmopIHsKLQkJbmV4dCA9IChOZm1Ob2RlKSBvYmo7Ci0JfQotCXByaXZhdGUgTmZtTm9kZSBuZXh0OwotCXByaXZhdGUgc3RhdGljIEZhY3RvcnkgZkZhY3RvcnkgPSBuZXcgRmFjdG9yeSgpOwotCXByaXZhdGUgc3RhdGljIEZhY3RvcnlPYmplY3QgZlVzZWQgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIE5mbU5vZGUgZ2V0RnJlZSgpIHsKLQkJTmZtTm9kZSBuZm0gPSAoTmZtTm9kZSkgZkZhY3RvcnkuZ2V0RnJlZSgpOwotCQlpZiAobmZtID09IG51bGwpCi0JCQluZm0gPSBuZXcgTmZtTm9kZSgpOwotCQluZm0ubmV4dChmVXNlZCk7Ci0JCWZVc2VkID0gbmZtOwotCQlyZXR1cm4gbmZtOwotCX0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNldEZyZWUoTmZtTm9kZSBuZm0pIHsKLQkJbmZtLnN5bWJvbCA9IG51bGw7Ci0JCW5mbS5uZXh0MSA9IG5mbS5uZXh0MiA9IG51bGw7Ci0JCW5mbS5kZm0gPSBudWxsOwotCQluZm0ubWFyayA9IDA7Ci0JCWZGYWN0b3J5LnNldEZyZWUobmZtKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9zY2hlbWEvU2NoZW1hLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC9zY2hlbWEvU2NoZW1hLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMzAyOTYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvc2NoZW1hL1NjaGVtYS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBPYmplY3QgRmFjdG9yeSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICoJCU9iamVjdCBGYWN0b3J5IEluYy4gLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5zY2hlbWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuSUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JU2NoZW1hOwotCi0vKioKLSAqIFRoaXMgaXMgYSB2ZXJ5IHNpbXBsZSBzY2hlbWEgc3VpdGFibGUgZm9yIERURHMuCi0gKiBPbmNlIGNvbnN0cnVjdGVkLCBhIHNjaGVtYSBpcyBpbW11dGFibGUgYW5kIGNvdWxkIGJlCi0gKiB1c2VkIGJ5IG11bHRpcGxlIHRocmVhZHMuIEhvd2V2ZXIsIHNpbmNlIGluIGdlbmVyYWwKLSAqIHRoZSBzY2hlbWEgd2lsbCByZWZsZWN0IHRoZSBpbnRlcm5hbCBEVEQgc3Vic2V0LAotICogcmUtdXNlIGZvciBtdWx0aXBsZSBkb2N1bWVudHMgaXMgcHJvYmxlbWF0aWMuCi0gKiBAYXV0aG9yIEJvYiBGb3N0ZXIKLSAqLwotcHVibGljIGNsYXNzIFNjaGVtYSBpbXBsZW1lbnRzIElTY2hlbWEgewotCXByaXZhdGUgSGFzaE1hcCBmRWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBFeGNlcHRpb24gZkVycm9yRXhjZXB0aW9uOwotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JU2NoZW1hI2dldEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUVsZW1lbnQgZ2V0RWxlbWVudChTdHJpbmcgcW5hbWUpIHsKLQkJcmV0dXJuIChJRWxlbWVudCkgZkVsZW1lbnRNYXAuZ2V0KHFuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuSVNjaGVtYSNnZXRFbGVtZW50cygpCi0JICovCi0JcHVibGljIElFbGVtZW50W10gZ2V0RWxlbWVudHMoKSB7Ci0JCXJldHVybiAoSUVsZW1lbnRbXSkgZkVsZW1lbnRNYXAuZW50cnlTZXQoKS50b0FycmF5KG5ldyBJRWxlbWVudFtmRWxlbWVudE1hcC5lbnRyeVNldCgpLnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgYSB2aXNpYmxlIGVsZW1lbnQgdG8gdGhlIHNjaGVtYS4KLQkgKiBAcGFyYW0gZWxlbWVudCBFbGVtZW50IHRvIGFkZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFbGVtZW50KElFbGVtZW50IGVsZW1lbnQpIHsKLQkJZkVsZW1lbnRNYXAucHV0KGVsZW1lbnQuZ2V0TmFtZSgpLCBlbGVtZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZXhjZXB0aW9uIHRocm93biBieSB0aGVuIHBhcnNlciB3aGVuIHRoZSBzY2hlbWEgd2FzIGJ1aWx0LgotCSAqIE5vdGUgdGhhdCB0aGUgZXhjZXB0aW9uIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhlIHNjaGVtYSBpcyBpbmNvbXBsZXRlLgotCSAqIAotCSAqIEBwYXJhbSBlIHRoZSBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFcnJvckV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotCQlmRXJyb3JFeGNlcHRpb24gPSBlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuSVNjaGVtYSNnZXRFcnJvckV4Y2VwdGlvbigpCi0JICovCi0JcHVibGljIEV4Y2VwdGlvbiBnZXRFcnJvckV4Y2VwdGlvbigpIHsKLQkJcmV0dXJuIGZFcnJvckV4Y2VwdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC91dGlsL0FudERURFV0aWxNZXNzYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9BbnREVERVdGlsTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JlOTcxOS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC91dGlsL0FudERURFV0aWxNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBBbnREVERVdGlsTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLnV0aWwuQW50RFREVXRpbE1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0ZWRNYXBfbmV4dF9fX2NhbGxlZF9mb3JfZW1wdHlfYXJyYXlfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0ZWRNYXBfcmVtb3ZlX18wX19faW5fZW1wdHlfbWFwXzI7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQW50RFREVXRpbE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9BbnREVERVdGlsTWVzc2FnZXMucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3V0aWwvQW50RFREVXRpbE1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNjUxY2YuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9BbnREVERVdGlsTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotU29ydGVkTWFwX25leHRfX19jYWxsZWRfZm9yX2VtcHR5X2FycmF5XzE9bmV4dCgpIGNhbGxlZCBmb3IgZW1wdHkgYXJyYXkKLVNvcnRlZE1hcF9yZW1vdmVfXzBfX19pbl9lbXB0eV9tYXBfMj1yZW1vdmUoezB9KSBpbiBlbXB0eSBtYXAKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3V0aWwvRmFjdG9yeS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MTEzYTYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IE9iamVjdCBGYWN0b3J5IEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKgkJT2JqZWN0IEZhY3RvcnkgSW5jLiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2U7Ci0KLS8qKgotICogRmFjdG9yeSBtYWludGFpbnMgYSBmcmVlIGxpc3QgYW5kLCB3aXRoIEZhY3RvcnlPYmplY3QsCi0gKiBzZXJ2ZXMgYXMgYSBiYXNpcyBmb3IgZmFjdG9yaWVzIG9mIGFsbCB0eXBlcy4KLSAqIEZhY3Rvcnkgc2hvdWxkIG9ubHkgYmUgc3ViY2xhc3NlZCBpbiBzaW5nbGV0b24gY2xhc3NlczsKLSAqIGZvciBzdGF0aWMgZmFjdG9yaWVzLCBpdCBtYXkgYmUgaW5zdGFudGlhdGVkIGFzCi0gKiBhIHN0YXRpYyBvYmplY3QuCi0gKiBAYXV0aG9yIEJvYiBGb3N0ZXIKLSAqLwotcHVibGljIGNsYXNzIEZhY3RvcnkgewotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZmlyc3Qgb2JqZWN0IG9uIHRoZSBmcmVlIGxpc3QKLQkgKiBvciBudWxsIGlmIG5vbmUuCi0JICovCi0JcHVibGljIEZhY3RvcnlPYmplY3QgZ2V0RnJlZSgpIHsKLQkJSGVhZCBoZWFkID0gZ2V0SGVhZCgpOwotCQlGYWN0b3J5T2JqZWN0IG9iaiA9IGhlYWQubmV4dDsKLQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQloZWFkLm5leHQgPSBvYmoubmV4dCgpOwotCQkJb2JqLm5leHQobnVsbCk7Ci0JCX0KLQkJcmV0dXJuIG9iajsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIGFuIG9iamVjdCB0byB0aGUgZnJlZSBsaXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZyZWUoRmFjdG9yeU9iamVjdCBvYmopIHsKLQkJSGVhZCBoZWFkID0gZ2V0SGVhZCgpOwotCQlvYmoubmV4dChoZWFkLm5leHQpOwotCQloZWFkLm5leHQgPSBvYmo7Ci0JfQotCQotCXByaXZhdGUgSGVhZCBnZXRIZWFkKCkgewotCQlIZWFkIGhlYWQgPSAoSGVhZCkgZnJlZS5nZXQoKTsKLQkJaWYgKGhlYWQgPT0gbnVsbCkgewotCQkJLy8gaGVhZCBpcyBuZWVkZWQgYmVjYXVzZSB5b3UgY2FuJ3QgY2hhbmdlCi0JCQkvLyB0aGUgcmVmZXJlbnQgb2YgYSBTb2Z0UmVmZXJlbmNlLgotCQkJLy8gV2l0aG91dCBoZWFkLCB3ZSB3b3VsZCBuZWVkIHRvIGNyZWF0ZQotCQkJLy8gYSBuZXcgU29mdFJlZmVyZW5jZSBlYWNoIHRpbWUgd2UgcmVtb3ZlCi0JCQkvLyBhIG1hcCBmcm9tIHRoZSBsaXN0LiBXaXRoIGhlYWQsIGdldHRpbmcKLQkJCS8vIGEgZnJlZSBvYmplY3Qgb25seSBjYXVzZXMgbWVtb3J5IGFsbG9jYXRpb24KLQkJCS8vIHdoZW4gdGhlIGxpc3QgaGFzIGJlZW4gcHJldmlvdXNseSBjb2xsZWN0ZWQuCi0JCQloZWFkID0gbmV3IEhlYWQoKTsKLQkJCWZyZWUgPSBuZXcgU29mdFJlZmVyZW5jZShoZWFkKTsKLQkJfQotCQlyZXR1cm4gaGVhZDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBIZWFkIHsKLQkJcHVibGljIEZhY3RvcnlPYmplY3QgbmV4dDsKLQl9Ci0JcHJpdmF0ZSBTb2Z0UmVmZXJlbmNlIGZyZWUgPSBuZXcgU29mdFJlZmVyZW5jZShuZXcgSGVhZCgpKTsKLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3V0aWwvRmFjdG9yeU9iamVjdC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9GYWN0b3J5T2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3OTk0MjYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9GYWN0b3J5T2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IE9iamVjdCBGYWN0b3J5IEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKgkJT2JqZWN0IEZhY3RvcnkgSW5jLiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLnV0aWw7Ci0KLS8qKgotICogQSBGYWN0b3J5T2JqZWN0IG11c3QgaW1wbGVtZW50IGEgc2ltcGxlIGxpbmtlZCBsaXN0LgotICogQGF1dGhvciBCb2IgRm9zdGVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmFjdG9yeU9iamVjdCB7Ci0KLQlGYWN0b3J5T2JqZWN0IG5leHQoKTsKLQkKLQl2b2lkIG5leHQoRmFjdG9yeU9iamVjdCBvYmopOwotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9JS2V5SG9sZGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC91dGlsL0lLZXlIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIxNGU4OS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC91dGlsL0lLZXlIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDUgT2JqZWN0IEZhY3RvcnkgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqCQlPYmplY3QgRmFjdG9yeSBJbmMuIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIEJvYiBGb3N0ZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJS2V5SG9sZGVyIHsKLQotCU9iamVjdFtdIGdldEtleXMoKTsKLQkKLQl2b2lkIHNldEtleXMoT2JqZWN0W10ga2V5cyk7Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC91dGlsL0lNYXBIb2xkZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3V0aWwvSU1hcEhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmFiMDk0Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3V0aWwvSU1hcEhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBPYmplY3QgRmFjdG9yeSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICoJCU9iamVjdCBGYWN0b3J5IEluYy4gLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC51dGlsOwotCi0vKioKLSAqIEBhdXRob3IgQm9iIEZvc3RlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNYXBIb2xkZXIgZXh0ZW5kcyBJS2V5SG9sZGVyLCBJVmFsdWVIb2xkZXIgewotCi19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC91dGlsL0lWYWx1ZUhvbGRlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9JVmFsdWVIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVmMGIyNi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC91dGlsL0lWYWx1ZUhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBPYmplY3QgRmFjdG9yeSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICoJCU9iamVjdCBGYWN0b3J5IEluYy4gLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC51dGlsOwotCi0vKioKLSAqIEBhdXRob3IgQm9iIEZvc3RlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWYWx1ZUhvbGRlciB7Ci0KLQlPYmplY3RbXSBnZXRWYWx1ZXMoKTsKLQkKLQl2b2lkIHNldFZhbHVlcyhPYmplY3RbXSB2YWx1ZXMpOwotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9NYXBIb2xkZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3V0aWwvTWFwSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmODYyMjMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9NYXBIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDUgT2JqZWN0IEZhY3RvcnkgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqCQlPYmplY3QgRmFjdG9yeSBJbmMuIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIEJvYiBGb3N0ZXIKLSAqLwotcHVibGljIGNsYXNzIE1hcEhvbGRlciBleHRlbmRzIFNvcnRlZE1hcEZhY3RvcnkgaW1wbGVtZW50cyBJTWFwSG9sZGVyIHsKLQotCXB1YmxpYyBPYmplY3RbXSBrZXlzOwotCXB1YmxpYyBPYmplY3RbXSB2YWx1ZXM7Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC51dGlsLklLZXlIb2xkZXIjZ2V0S2V5cygpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEtleXMoKSB7Ci0JCXJldHVybiBrZXlzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbC5JS2V5SG9sZGVyI3NldEtleXMoamF2YS5sYW5nLk9iamVjdFtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEtleXMoT2JqZWN0W10ga2V5cykgewotCQl0aGlzLmtleXMgPSBrZXlzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbC5JVmFsdWVIb2xkZXIjZ2V0VmFsdWVzKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0VmFsdWVzKCkgewotCQlyZXR1cm4gdmFsdWVzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQudXRpbC5JVmFsdWVIb2xkZXIjc2V0VmFsdWVzKGphdmEubGFuZy5PYmplY3RbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZXMoT2JqZWN0W10gdmFsdWVzKSB7Ci0JCXRoaXMudmFsdWVzID0gdmFsdWVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3V0aWwvU29ydGVkTWFwRmFjdG9yeS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9Tb3J0ZWRNYXBGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNzJlOTcuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kdGQvdXRpbC9Tb3J0ZWRNYXBGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA2IE9iamVjdCBGYWN0b3J5IEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKgkJT2JqZWN0IEZhY3RvcnkgSW5jLiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAgSUJNIENvcnBvcmF0aW9uIC0gZml4IGZvciBCdWcgMTEwNjM2Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLS8qKgotICogQ2FuIGJlIGluaGVyaXRlZCBvciB1c2VkIHN0YXRpY2FsbHkuCi0gKiBAYXV0aG9yIEJvYiBGb3N0ZXIKLSAqLwotcHVibGljIGNsYXNzIFNvcnRlZE1hcEZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW5kaXJlY3RTdHJpbmdDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JCS8qKgotCQkgKiBAc2VlIGphdmEudXRpbC5Db21wYXJhdG9yI2NvbXBhcmUoT2JqZWN0LCBPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCXJldHVybiBvMS50b1N0cmluZygpLmNvbXBhcmVUbyhvMi50b1N0cmluZygpKTsKLQkJfQotCX0KLSAgICAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbmRpcmVjdFN0cmluZ0NvbXBhcmF0b3IgZkluZGlyZWN0U3RyaW5nQ29tcCA9IG5ldyBJbmRpcmVjdFN0cmluZ0NvbXBhcmF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBGYWN0b3J5IGZGYWN0b3J5ID0gbmV3IEZhY3RvcnkoKTsKLQotCXB1YmxpYyBzdGF0aWMgU29ydGVkTWFwIGdldE1hcChJTWFwSG9sZGVyIGhvbGRlciwgQ29tcGFyYXRvciBjb21wKSB7Ci0JCVNvcnRlZE1hcCBtYXAgPSAoU29ydGVkTWFwKSBmRmFjdG9yeS5nZXRGcmVlKCk7Ci0JCWlmIChtYXAgPT0gbnVsbCkKLQkJCW1hcCA9IG5ldyBTb3J0ZWRNYXAoKTsKLQkJbWFwLnNldE1hcEhvbGRlcihob2xkZXIpOwotCQltYXAuc2V0Q29tcGFyYXRvcihjb21wKTsKLQkJcmV0dXJuIG1hcDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTb3J0ZWRNYXAgZ2V0SW5kaXJlY3RTdHJpbmdNYXAoSU1hcEhvbGRlciBob2xkZXIpIHsKLQkJcmV0dXJuIGdldE1hcChob2xkZXIsIGZJbmRpcmVjdFN0cmluZ0NvbXApOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJlZU1hcChTb3J0ZWRNYXAgbWFwKSB7Ci0JCW1hcC5zZXRDb21wYXJhdG9yKG51bGwpOwotCQltYXAuc2V0TWFwSG9sZGVyKG51bGwpOwotCQlmRmFjdG9yeS5zZXRGcmVlKG1hcCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3V0aWwvU29ydGVkU2V0LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2R0ZC91dGlsL1NvcnRlZFNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDA3ZmRjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZHRkL3V0aWwvU29ydGVkU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBPYmplY3QgRmFjdG9yeSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICoJCU9iamVjdCBGYWN0b3J5IEluYy4gLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLS8qKgotICogU29ydGVkU2V0IGlzIGEgZmx5d2VpZ2h0IHNldCBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMKLSAqIGFuIGV4dGVybmFsIGFycmF5IHByb3ZpZGVkIGJ5IGEgS2V5SG9sZGVyLgotICogU29ydGVkU2V0IHByb3ZpZGVzIGJvdGggZXF1YWxpdHkvY29tcGFyaXNvbiBvcGVyYXRpb25zCi0gKiBhbmQgaWRlbnRpdHkgb3BlcmF0aW9ucy4KLSAqIEBhdXRob3IgQm9iIEZvc3RlcgotICovCi1wdWJsaWMgY2xhc3MgU29ydGVkU2V0IHsKLQlwcm90ZWN0ZWQgQ29tcGFyYXRvciBmQ29tcDsKLQlwcm90ZWN0ZWQgSUtleUhvbGRlciBmS2V5SG9sZGVyOwotCXByb3RlY3RlZCBTb3J0ZWRTZXQgZk5leHQ7Ci0JCi0JcHVibGljIFNvcnRlZFNldChJS2V5SG9sZGVyIGhvbGRlciwgQ29tcGFyYXRvciBjb21wKSB7Ci0JCWZDb21wID0gY29tcDsKLQkJZktleUhvbGRlciA9IGhvbGRlcjsKLQl9Ci0JLyoqCi0JICogQ29uc3RydWN0b3IuIEEga2V5aG9sZGVyIG11c3QgYmUKLQkgKiBzdXBwbGllZCBieSA8Y29kZT5zZXRLZXlIb2xkZXIoKTwvY29kZT4gcHJpb3Igb3QKLQkgKiA8aT5hbnk8L2k+IG9wZXJhdGlvbnMuCi0JICovCi0JcHVibGljIFNvcnRlZFNldChDb21wYXJhdG9yIGNvbXApIHsKLQkJZkNvbXAgPSBjb21wOwotCX0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvciwgbm8gY29tcGFyYXRvci4gT25seSBpZGVudGl0eSBvcGVyYXRpb25zCi0JICogbWF5IGJlIHBlcmZvcm1lZCBpbiB0aGlzIHNldC4KLQkgKi8KLQlwdWJsaWMgU29ydGVkU2V0KElLZXlIb2xkZXIgaG9sZGVyKSB7Ci0JCWZLZXlIb2xkZXIgPSBob2xkZXI7Ci0JfQotCS8qKgotCSAqIENvbnN0cnVjdG9yLCBubyBjb21wYXJhdG9yLiBPbmx5IGlkZW50aXR5IG9wZXJhdGlvbnMKLQkgKiBtYXkgYmUgcGVyZm9ybWVkIGluIHRoaXMgc2V0LiBBIGtleWhvbGRlciBtdXN0IGJlCi0JICogc3VwcGxpZWQgYnkgPGNvZGU+c2V0S2V5SG9sZGVyKCk8L2NvZGU+IHByaW9yIG90Ci0JICogPGk+YW55PC9pPiBvcGVyYXRpb25zLgotCSAqLwotCXB1YmxpYyBTb3J0ZWRTZXQoKSB7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEtleUhvbGRlcihJS2V5SG9sZGVyIGhvbGRlcikgewotCQlmS2V5SG9sZGVyID0gaG9sZGVyOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRDb21wYXJhdG9yKENvbXBhcmF0b3IgY29tcCkgewotCQlmQ29tcCA9IGNvbXA7Ci0JfQotCS8qKgotCSAqIEFkZCB0byBzZXQgKG5vIGR1cGxpY2F0ZXMgYWxsb3dlZCkuCi0JICogQHBhcmFtIG9iaiBPYmplY3QgdG8gYWRkCi0JICogQHJldHVybiB0cnVlIGlmIG9iamVjdCB3YXMgYWRkZWQ7IGZhbHNlCi0JICogaWYgb2JqZWN0IHdhcyBhbHJlYWR5IGluIHRoZSBzZXQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIGludGVybmFsQWRkKG9iaiwgZmFsc2UpID49IDA7Ci0JfQotCXByb3RlY3RlZCBpbnQgaW50ZXJuYWxBZGQoT2JqZWN0IG9iaiwgYm9vbGVhbiBhbHdheXMpIHsKLQkJT2JqZWN0W10gYXJyYXkgPSBmS2V5SG9sZGVyLmdldEtleXMoKTsKLQkJaWYgKGFycmF5ID09IG51bGwpIHsKLQkJCWFycmF5ID0gbmV3IE9iamVjdFsxXTsKLQkJCWZLZXlIb2xkZXIuc2V0S2V5cyhhcnJheSk7Ci0JCQlhcnJheVswXSA9IG9iajsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWludCBpID0gMDsKLQkJaW50IGNvbXAgPSAtMTsKLQkJCi0JCWZvciAoOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCWlmICgoY29tcCA9IGZDb21wLmNvbXBhcmUob2JqLCBhcnJheVtpXSkpIDw9IDApIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoY29tcCA9PSAwICYmICFhbHdheXMpCi0JCQlyZXR1cm4gLTE7Ci0JCWludGVybmFsQWRkKGksIG9iaik7Ci0JCXJldHVybiBpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbEFkZChpbnQgaSwgT2JqZWN0IG9iaikgewotCQlPYmplY3RbXSBhcnJheSA9IGZLZXlIb2xkZXIuZ2V0S2V5cygpOwotCQlpZiAoYXJyYXkgPT0gbnVsbCkgewotCQkJYXJyYXkgPSBuZXcgT2JqZWN0WzFdOwotCQkJYXJyYXlbMF0gPSBvYmo7Ci0JCQlmS2V5SG9sZGVyLnNldEtleXMoYXJyYXkpOwotCQl9Ci0JCWVsc2UgewotCQkJT2JqZWN0W10gdG1wID0gbmV3IE9iamVjdFthcnJheS5sZW5ndGgrMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LDAsdG1wLDAsaSk7Ci0JCQl0bXBbaV0gPSBvYmo7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LGksdG1wLGkrMSxhcnJheS5sZW5ndGgtaSk7Ci0JCQlmS2V5SG9sZGVyLnNldEtleXModG1wKTsKLQkJfQotCX0KLQkvKioKLQkgKiBBZGQgYWxsb3dpbmcgZHVwbGljYXRlcy4KLQkgKiBAcGFyYW0gb2JqIE9iamVjdCB0byBhZGQKLQkgKiBAcmV0dXJuIGluZGV4IHdoZXJlIG9iamVjdCB3YXMgYWRkZWQgaW4gc29ydGVkIG9yZGVyLgotCSAqLwotCXB1YmxpYyBpbnQgYWRkQWx3YXlzKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIGludGVybmFsQWRkKG9iaiwgdHJ1ZSk7Ci0JfQotCS8qKgotCSAqIEFwcGVuZCwgYSB2YXJpYW50IG9mIGFkZCBhbGxvd2luZyBkdXBsaWNhdGVzIHRoYXQKLQkgKiBhbHdheXMgcHV0cyB0aGUgbmV3IG1lbWJlciBhdCB0aGUgZW5kIG9mIHRoZSBzZXQuCi0JICogU2V0IGNhbiBiZSB1c2VkIHdpdGggaWRlbnRpdHkgb3BlcmF0aW9ucyBvbmx5LgotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZChPYmplY3Qgb2JqKSB7Ci0JCU9iamVjdFtdIGFycmF5ID0gZktleUhvbGRlci5nZXRLZXlzKCk7Ci0JCWludCBsZW4gPSBhcnJheSAhPSBudWxsID8gYXJyYXkubGVuZ3RoIDogMDsKLQkJaW50ZXJuYWxBZGQobGVuLCBvYmopOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBpbmRleE9mKG9iaikgPj0gMDsKLQl9Ci0JcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvYmopIHsKLQkJT2JqZWN0W10gYXJyYXkgPSBmS2V5SG9sZGVyLmdldEtleXMoKTsKLQkJaWYgKGFycmF5ID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCWludCBjb21wID0gZkNvbXAuY29tcGFyZShvYmosIGFycmF5W2ldKTsKLQkJCWlmIChjb21wID09IDApCi0JCQkJcmV0dXJuIGk7Ci0JCQlpZiAoY29tcCA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gY29udGFpbnNJZGVudGl0eShPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBpbmRleE9mKG9iaikgPj0gMDsKLQl9Ci0JcHVibGljIGludCBpbmRleE9mSWRlbnRpdHkoT2JqZWN0IG9iaikgewotCQlPYmplY3RbXSBhcnJheSA9IGZLZXlIb2xkZXIuZ2V0S2V5cygpOwotCQlpZiAoYXJyYXkgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJaWYgKG9iaiA9PSBhcnJheVtpXSkKLQkJCQlyZXR1cm4gaTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAodGhpcyA9PSBvKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmICghKG8gaW5zdGFuY2VvZiBTb3J0ZWRTZXQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTb3J0ZWRTZXQgb3RoZXIgPSAoU29ydGVkU2V0KSBvOwotCQlPYmplY3RbXSBhcnJheSA9IGZLZXlIb2xkZXIuZ2V0S2V5cygpOwotCQlPYmplY3RbXSBvdGhlcmFycmF5ID0gb3RoZXIuZktleUhvbGRlci5nZXRLZXlzKCk7Ci0JCWlmICgoYXJyYXkgPT0gbnVsbCkgIT0gKG90aGVyYXJyYXkgPT0gbnVsbCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChhcnJheSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChhcnJheS5sZW5ndGggIT0gb3RoZXJhcnJheS5sZW5ndGgpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChhcnJheVtpXSAhPSBvdGhlcmFycmF5W2ldKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZXF1YWxzSWRlbnRpZnkoT2JqZWN0IG8pIHsKLQkJaWYgKHRoaXMgPT0gbykKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoIShvIGluc3RhbmNlb2YgU29ydGVkU2V0KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU29ydGVkU2V0IG90aGVyID0gKFNvcnRlZFNldCkgbzsKLQkJT2JqZWN0W10gYXJyYXkgPSBmS2V5SG9sZGVyLmdldEtleXMoKTsKLQkJT2JqZWN0W10gb3RoZXJhcnJheSA9IG90aGVyLmZLZXlIb2xkZXIuZ2V0S2V5cygpOwotCQlpZiAoKGFycmF5ID09IG51bGwpICE9IChvdGhlcmFycmF5ID09IG51bGwpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoYXJyYXkgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoYXJyYXkubGVuZ3RoICE9IG90aGVyYXJyYXkubGVuZ3RoKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZkNvbXAuY29tcGFyZShhcnJheVtpXSwgb3RoZXJhcnJheVtpXSkgIT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyB2b2lkIG1lcmdlKFNvcnRlZFNldCBvdGhlcikgewotCQlPYmplY3RbXSBhcnJheSA9IGZLZXlIb2xkZXIuZ2V0S2V5cygpOwotCQlPYmplY3RbXSBvdGhlcmFycmF5ID0gb3RoZXIuZktleUhvbGRlci5nZXRLZXlzKCk7Ci0JCWlmIChvdGhlcmFycmF5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChhcnJheSA9PSBudWxsKSB7Ci0JCQlhcnJheSA9IG90aGVyYXJyYXk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IGl0aGlzID0gMCwgaW90aGVyID0gMCwgaSA9IDA7Ci0JCWludCBtdGhpcyA9IGFycmF5Lmxlbmd0aCwgbW90aGVyID0gb3RoZXJhcnJheS5sZW5ndGg7Ci0JCU9iamVjdFtdIHRtcCA9IG5ldyBPYmplY3RbbXRoaXMrbW90aGVyXTsKLQkJd2hpbGUgKGl0aGlzIDwgbXRoaXMgJiYgaW90aGVyIDwgbW90aGVyKSB7Ci0JCQlpbnQgY29tcCA9IGZDb21wLmNvbXBhcmUoYXJyYXlbaXRoaXNdLCBvdGhlcmFycmF5W2lvdGhlcl0pOwotCQkJaWYgKGNvbXAgPD0gMCkgewotCQkJCXRtcFtpKytdID0gYXJyYXlbaXRoaXMrK107Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0bXBbaSsrXSA9IG90aGVyYXJyYXlbaW90aGVyKytdOwotCQkJfQotCQl9Ci0JCXdoaWxlIChpdGhpcyA8IG10aGlzKSB7Ci0JCQl0bXBbaSsrXSA9IGFycmF5W2l0aGlzKytdOwotCQl9Ci0JCXdoaWxlIChpb3RoZXIgPCBtb3RoZXIpIHsKLQkJCXRtcFtpKytdID0gb3RoZXJhcnJheVtpb3RoZXIrK107Ci0JCX0KLQl9Ci0JcHVibGljIE9iamVjdFtdIG1lbWJlcnMoKSB7Ci0JCU9iamVjdFtdIGFycmF5ID0gZktleUhvbGRlci5nZXRLZXlzKCk7Ci0JCWlmIChhcnJheSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0JcHVibGljIGludCBzaXplKCkgewotCQlPYmplY3RbXSBhcnJheSA9IGZLZXlIb2xkZXIuZ2V0S2V5cygpOwotCQlyZXR1cm4gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7Ci0JfQotCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaSkgewotCQlPYmplY3RbXSBhcnJheSA9IGZLZXlIb2xkZXIuZ2V0S2V5cygpOwotCQlPYmplY3RbXSB0bXAgPSBuZXcgT2JqZWN0W2FycmF5Lmxlbmd0aC0xXTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwwLHRtcCwwLGkpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LGkrMSx0bXAsaSxhcnJheS5sZW5ndGgtaS0xKTsKLQkJZktleUhvbGRlci5zZXRLZXlzKHRtcCk7Ci0JfQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3Qgb2JqKSB7Ci0JCWludCBpID0gaW5kZXhPZihvYmopOwotCQlpZiAoaSA+PSAwKSB7Ci0JCQlyZW1vdmUoaSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUlkZW50aXR5KE9iamVjdCBvYmopIHsKLQkJaW50IGkgPSBpbmRleE9mSWRlbnRpdHkob2JqKTsKLQkJaWYgKGkgPj0gMCkgewotCQkJcmVtb3ZlKGkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwdWJsaWMgU29ydGVkU2V0IGdldE5leHRTZXQoKSB7Ci0JCXJldHVybiBmTmV4dDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0TmV4dFNldChTb3J0ZWRTZXQgbmV4dCkgewotCQlmTmV4dCA9IG5leHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9BbnRBdXRvRWRpdFN0cmF0ZWd5LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9BbnRBdXRvRWRpdFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjOTk3ZTQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvQW50QXV0b0VkaXRTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5mb3JtYXR0ZXIuWG1sRG9jdW1lbnRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudEVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRGVmYXVsdEluZGVudExpbmVBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvclByZWZlcmVuY2VDb25zdGFudHM7Ci0KLS8qKgotICogQXV0byBlZGl0IHN0cmF0ZWd5IGZvciBBbnQgYnVpbGQgZmlsZXMKLSAqIEN1cnJlbnQgZG9lcyBzcGVjaWFsIGluZGVudGluZy4KLSAqLwotcHVibGljIGNsYXNzIEFudEF1dG9FZGl0U3RyYXRlZ3kgZXh0ZW5kcyBEZWZhdWx0SW5kZW50TGluZUF1dG9FZGl0U3RyYXRlZ3kgewotCQotCXByaXZhdGUgQW50TW9kZWwgZk1vZGVsOwotCXByaXZhdGUgaW50IGZBY2N1bXVsYXRlZENoYW5nZT0gMDsKLQkKLQlwdWJsaWMgQW50QXV0b0VkaXRTdHJhdGVneShBbnRNb2RlbCBtb2RlbCkgewotCQlmTW9kZWw9IG1vZGVsOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBpbmRlbnRhdGlvbiBiYXNlZCBvbiB0aGUgQW50IGVsZW1lbnQgbm9kZSB0aGF0IGNvbnRhaW5zIHRoZSBvZmZzZXQKLQkgKiBvZiB0aGUgZG9jdW1lbnQgY29tbWFuZC4KLQkgKgotCSAqIEBwYXJhbSBkIHRoZSBkb2N1bWVudCB0byB3b3JrIG9uCi0JICogQHBhcmFtIGMgdGhlIGNvbW1hbmQgdG8gZGVhbCB3aXRoCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBhdXRvSW5kZW50QWZ0ZXJOZXdMaW5lKElEb2N1bWVudCBkLCBEb2N1bWVudENvbW1hbmQgYykgewotCQkKLQkJaWYgKGMub2Zmc2V0ID09IC0xIHx8IGQuZ2V0TGVuZ3RoKCkgPT0gMCB8fCBmTW9kZWwuZ2V0UHJvamVjdE5vZGUoZmFsc2UpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaW50IHBvc2l0aW9uPSAoYy5vZmZzZXQgPT0gZC5nZXRMZW5ndGgoKSA/IGMub2Zmc2V0ICAtIDEgOiBjLm9mZnNldCk7Ci0JCUFudEVsZW1lbnROb2RlIG5vZGU9IGZNb2RlbC5nZXRQcm9qZWN0Tm9kZShmYWxzZSkuZ2V0Tm9kZShwb3NpdGlvbiAtIGZBY2N1bXVsYXRlZENoYW5nZSk7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCVN0cmluZ0J1ZmZlciBjb3JyZWN0PSBYbWxEb2N1bWVudEZvcm1hdHRlci5nZXRMZWFkaW5nV2hpdGVzcGFjZShub2RlLmdldE9mZnNldCgpLCBkKTsKLQkJCWlmICghbmV4dE5vZGVJc0VuZFRhZyhjLm9mZnNldCwgZCkpIHsKLQkJCQljb3JyZWN0LmFwcGVuZChYbWxEb2N1bWVudEZvcm1hdHRlci5jcmVhdGVJbmRlbnQoKSk7Ci0JCQl9Ci0JCQlTdHJpbmdCdWZmZXIgYnVmPSBuZXcgU3RyaW5nQnVmZmVyKGMudGV4dCk7Ci0JCQlidWYuYXBwZW5kKGNvcnJlY3QpOwotCQkJZkFjY3VtdWxhdGVkQ2hhbmdlKz0gYnVmLmxlbmd0aCgpOwotCQkJCi0JCQlpbnQgbGluZT0gZC5nZXRMaW5lT2ZPZmZzZXQocG9zaXRpb24pOwotCQkJSVJlZ2lvbiByZWc9IGQuZ2V0TGluZUluZm9ybWF0aW9uKGxpbmUpOwotCQkJaW50IGxpbmVFbmQ9IHJlZy5nZXRPZmZzZXQoKSArIHJlZy5nZXRMZW5ndGgoKTsKLQkJCWludCBjb250ZW50U3RhcnQ9IGZpbmRFbmRPZldoaXRlU3BhY2UoZCwgYy5vZmZzZXQsIGxpbmVFbmQpOwotCQkJCi0JCQljLmxlbmd0aD0gIE1hdGgubWF4KGNvbnRlbnRTdGFydCAtIGMub2Zmc2V0LCAwKTsKLQkJCWMuY2FyZXRPZmZzZXQ9IGMub2Zmc2V0ICsgYnVmLmxlbmd0aCgpOwotCQkJYy5zaGlmdHNDYXJldD0gZmFsc2U7Ci0JCQljLnRleHQ9IGJ1Zi50b1N0cmluZygpOwotCQotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlBbnRVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIG5leHROb2RlSXNFbmRUYWcoaW50IG9mZnNldCwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChvZmZzZXQgKyAxID4gZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQl0cnkgewotCQkJSVJlZ2lvbiBsaW5lUmVnaW9uPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChvZmZzZXQpOwotCQkJb2Zmc2V0PSBmaW5kRW5kT2ZXaGl0ZVNwYWNlKGRvY3VtZW50LCBvZmZzZXQsIGxpbmVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBsaW5lUmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCVN0cmluZyBuZXh0Q2hhcnM9IGRvY3VtZW50LmdldChvZmZzZXQsIDIpLnRyaW0oKTsKLQkJCWlmICgiPC8iLmVxdWFscyhuZXh0Q2hhcnMpIHx8ICIvPiIuZXF1YWxzKG5leHRDaGFycykpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JQXV0b0VkaXRTdHJhdGVneSNjdXN0b21pemVEb2N1bWVudENvbW1hbmQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRDb21tYW5kKQotCSAqLwotCXB1YmxpYyB2b2lkIGN1c3RvbWl6ZURvY3VtZW50Q29tbWFuZChJRG9jdW1lbnQgZCwgRG9jdW1lbnRDb21tYW5kIGMpIHsKLQkJCi0JCWlmIChjLmxlbmd0aCA9PSAwICYmIGMudGV4dCAhPSBudWxsICYmIGlzTGluZURlbGltaXRlcihkLCBjLnRleHQpKSB7Ci0JCQlhdXRvSW5kZW50QWZ0ZXJOZXdMaW5lKGQsIGMpOwotCQl9IGVsc2UgaWYgKGMudGV4dC5sZW5ndGgoKSA+IDEpIHsKLQkJCXNtYXJ0UGFzdGUoZCwgYyk7Ci0JCX0KLQl9Ci0JCi0JIHByaXZhdGUgYm9vbGVhbiBpc0xpbmVEZWxpbWl0ZXIoSURvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgdGV4dCkgewotCQlTdHJpbmdbXSBkZWxpbWl0ZXJzPSBkb2N1bWVudC5nZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCk7Ci0JCWlmIChkZWxpbWl0ZXJzICE9IG51bGwpCi0JCQlyZXR1cm4gVGV4dFV0aWxpdGllcy5lcXVhbHMoZGVsaW1pdGVycywgdGV4dCkgPiAtMTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVjb25jaWxlZCgpIHsKLQkJZkFjY3VtdWxhdGVkQ2hhbmdlPSAwOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc21hcnRQYXN0ZShJRG9jdW1lbnQgZG9jdW1lbnQsIERvY3VtZW50Q29tbWFuZCBjb21tYW5kKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoY29tbWFuZC5vZmZzZXQgPT0gLTEgfHwgZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPT0gMCB8fCBmTW9kZWwuZ2V0UHJvamVjdE5vZGUoZmFsc2UpID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgb3JpZ0NoYW5nZT0gY29tbWFuZC50ZXh0OwotCQkJaW50IHBvc2l0aW9uPSAoY29tbWFuZC5vZmZzZXQgPT0gZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPyBjb21tYW5kLm9mZnNldCAgLSAxIDogY29tbWFuZC5vZmZzZXQpOwotCQkJQW50RWxlbWVudE5vZGUgbm9kZT0gZk1vZGVsLmdldFByb2plY3ROb2RlKGZhbHNlKS5nZXROb2RlKHBvc2l0aW9uIC0gZkFjY3VtdWxhdGVkQ2hhbmdlKTsKLQkJCWlmIChub2RlID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCS8vIGVhdCBhbnkgV1MgYmVmb3JlIHRoZSBpbnNlcnRpb24gdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZQotCQkJaW50IGZpcnN0TGluZT0gMTsgLy8gZG9uJ3QgZm9ybWF0IHRoZSBmaXJzdCBsaW5lIGlmIGl0IGhhcyBvdGhlciBjb250ZW50IGJlZm9yZSBpdAotCQkJSVJlZ2lvbiBsaW5lPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChjb21tYW5kLm9mZnNldCk7Ci0JCQlTdHJpbmcgbm90U2VsZWN0ZWQ9IGRvY3VtZW50LmdldChsaW5lLmdldE9mZnNldCgpLCBjb21tYW5kLm9mZnNldCAtIGxpbmUuZ2V0T2Zmc2V0KCkpOwotCQkJaWYgKG5vdFNlbGVjdGVkLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJY29tbWFuZC5sZW5ndGggKz0gbm90U2VsZWN0ZWQubGVuZ3RoKCk7Ci0JCQkJY29tbWFuZC5vZmZzZXQ9IGxpbmUuZ2V0T2Zmc2V0KCk7Ci0JCQkJZmlyc3RMaW5lPSAwOwotCQkJfQotCQkJCi0JCQkvLyBoYW5kbGUgdGhlIGluZGVudGF0aW9uIGNvbXB1dGF0aW9uIGluc2lkZSBhIHRlbXBvcmFyeSBkb2N1bWVudAotCQkJRG9jdW1lbnQgdGVtcD0gbmV3IERvY3VtZW50KGNvbW1hbmQudGV4dCk7Ci0JCQkKLQkJCS8vIGluZGVudCB0aGUgZmlyc3QgYW5kIHNlY29uZCBsaW5lCi0JCQkvLyBjb21wdXRlIHRoZSByZWxhdGl2ZSBpbmRlbnRhdGlvbiBkaWZmZXJlbmNlIGZyb20gdGhlIHNlY29uZCBsaW5lCi0JCQkvLyAoYXMgdGhlIGZpcnN0IG1pZ2h0IGJlIHBhcnRpYWxseSBzZWxlY3RlZCkgYW5kIHVzZSB0aGUgdmFsdWUgdG8KLQkJCS8vIGluZGVudCBhbGwgb3RoZXIgbGluZXMuCi0JCQlib29sZWFuIGlzSW5kZW50RGV0ZWN0ZWQ9IGZhbHNlOwotCQkJU3RyaW5nQnVmZmVyIGFkZGl0aW9uPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpbnQgaW5zZXJ0TGVuZ3RoPSAwOwotCQkJaW50IGxpbmVzPSB0ZW1wLmdldE51bWJlck9mTGluZXMoKTsKLQkJCWZvciAoaW50IGw9IGZpcnN0TGluZTsgbCA8IGxpbmVzOyBsKyspIHsgLy8gd2UgZG9uJ3QgY2hhbmdlIHRoZSBudW1iZXIgb2YgbGluZXMgd2hpbGUgYWRkaW5nIGluZGVudHMKLQkJCQkKLQkJCQlJUmVnaW9uIHI9IHRlbXAuZ2V0TGluZUluZm9ybWF0aW9uKGwpOwotCQkJCWludCBsaW5lT2Zmc2V0PSByLmdldE9mZnNldCgpOwotCQkJCWludCBsaW5lTGVuZ3RoPSByLmdldExlbmd0aCgpOwotCQkJCQotCQkJCWlmIChsaW5lTGVuZ3RoID09IDApIHsgLy8gZG9uJ3QgbW9kaWZ5IGVtcHR5IGxpbmVzCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAoIWlzSW5kZW50RGV0ZWN0ZWQpewotCQkJCQkKLQkJCQkJLy8gaW5kZW50IHRoZSBmaXJzdCBwYXN0ZWQgbGluZQotCQkJCQlTdHJpbmdCdWZmZXIgY3VycmVudD0gWG1sRG9jdW1lbnRGb3JtYXR0ZXIuZ2V0TGVhZGluZ1doaXRlc3BhY2UobGluZU9mZnNldCwgdGVtcCk7Ci0JCQkJCVN0cmluZ0J1ZmZlciBjb3JyZWN0PSBYbWxEb2N1bWVudEZvcm1hdHRlci5nZXRMZWFkaW5nV2hpdGVzcGFjZShub2RlLmdldE9mZnNldCgpLCBkb2N1bWVudCk7Ci0JCQkJCWNvcnJlY3QuYXBwZW5kKFhtbERvY3VtZW50Rm9ybWF0dGVyLmNyZWF0ZUluZGVudCgpKTsKLQkJCQkJCi0JCQkJCWluc2VydExlbmd0aD0gc3VidHJhY3RJbmRlbnQoY29ycmVjdCwgY3VycmVudCwgYWRkaXRpb24pOwotCQkJCQlpc0luZGVudERldGVjdGVkPSB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCQkvLyByZWxhdGl2ZWx5IGluZGVudCBhbGwgcGFzdGVkIGxpbmVzIAotCQkJCWlmIChpbnNlcnRMZW5ndGggPiAwKSB7Ci0JCQkJCWFkZEluZGVudCh0ZW1wLCBsLCBhZGRpdGlvbik7Ci0JCQkJfSBlbHNlIGlmIChpbnNlcnRMZW5ndGggPCAwKSB7Ci0JCQkJCWN1dEluZGVudCh0ZW1wLCBsLCAtaW5zZXJ0TGVuZ3RoKTsKLQkJCQl9CQotCQkJfQotCQkJCi0JCQkvLyBtb2RpZnkgdGhlIGNvbW1hbmQKLQkJCWlmICghb3JpZ0NoYW5nZS5lcXVhbHModGVtcC5nZXQoKSkpIHsKLQkJCQlmQWNjdW11bGF0ZWRDaGFuZ2UrPSAgdGVtcC5nZXRMZW5ndGgoKTsKLQkJCQljb21tYW5kLnRleHQ9IHRlbXAuZ2V0KCk7Ci0JCQl9Ci0JCQkKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJQW50VUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEluZGVudHMgbGluZSA8Y29kZT5saW5lPC9jb2RlPiBpbiA8Y29kZT5kb2N1bWVudDwvY29kZT4gd2l0aCA8Y29kZT5pbmRlbnQ8L2NvZGU+LgotCSAqIExlYXZlcyBsZWFkaW5nIGNvbW1lbnQgc2lnbnMgYWxvbmUuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50IHRoZSBkb2N1bWVudAotCSAqIEBwYXJhbSBsaW5lIHRoZSBsaW5lCi0JICogQHBhcmFtIGluZGVudCB0aGUgaW5kZW50YXRpb24gdG8gaW5zZXJ0Ci0JICogQHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiBvbiBjb25jdXJyZW50IGRvY3VtZW50IG1vZGlmaWNhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRJbmRlbnQoRG9jdW1lbnQgZG9jdW1lbnQsIGludCBsaW5lLCBDaGFyU2VxdWVuY2UgaW5kZW50KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlJUmVnaW9uIHJlZ2lvbj0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uKGxpbmUpOwotCQlpbnQgaW5zZXJ0PSByZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQotCQkvLyBpbnNlcnQgaW5kZW50Ci0JCWRvY3VtZW50LnJlcGxhY2UoaW5zZXJ0LCAwLCBpbmRlbnQudG9TdHJpbmcoKSk7Ci0JfQotCQotCS8qKgotCSAqIEN1dHMgdGhlIHZpc3VhbCBlcXVpdmFsZW50IG9mIDxjb2RlPnRvRGVsZXRlPC9jb2RlPiBjaGFyYWN0ZXJzIG91dCBvZiB0aGUKLQkgKiBpbmRlbnRhdGlvbiBvZiBsaW5lIDxjb2RlPmxpbmU8L2NvZGU+IGluIDxjb2RlPmRvY3VtZW50PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50Ci0JICogQHBhcmFtIGxpbmUgdGhlIGxpbmUKLQkgKiBAcGFyYW0gdG9EZWxldGUgdGhlIG51bWJlciBvZiBzcGFjZSBlcXVpdmFsZW50cyB0byBkZWxldGUuCi0JICogQHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiBvbiBjb25jdXJyZW50IGRvY3VtZW50IG1vZGlmaWNhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjdXRJbmRlbnQoRG9jdW1lbnQgZG9jdW1lbnQsIGludCBsaW5lLCBpbnQgdG9EZWxldGUpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCUlSZWdpb24gcmVnaW9uPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb24obGluZSk7Ci0JCWludCBmcm9tPSByZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCWludCBlbmRPZmZzZXQ9IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCi0JCWludCB0bz0gZnJvbTsKLQkJd2hpbGUgKHRvRGVsZXRlID4gMCAmJiB0byA8IGVuZE9mZnNldCkgewotCQkJY2hhciBjaD0gZG9jdW1lbnQuZ2V0Q2hhcih0byk7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2gpKQotCQkJCWJyZWFrOwotCQkJdG9EZWxldGUgLT0gY29tcHV0ZVZpc3VhbExlbmd0aChjaCk7Ci0JCQlpZiAodG9EZWxldGUgPj0gMCkgewotCQkJCXRvKys7Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlkb2N1bWVudC5yZXBsYWNlKGZyb20sIHRvIC0gZnJvbSwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZpc3VhbCBsZW5ndGggb2YgYSBnaXZlbiBjaGFyYWN0ZXIgdGFraW5nIGludG8KLQkgKiBhY2NvdW50IHRoZSB2aXN1YWwgdGFidWxhdG9yIGxlbmd0aC4KLQkgKiAKLQkgKiBAcGFyYW0gY2ggdGhlIGNoYXJhY3RlciB0byBtZWFzdXJlCi0JICogQHJldHVybiB0aGUgdmlzdWFsIGxlbmd0aCBvZiA8Y29kZT5jaDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIGludCBjb21wdXRlVmlzdWFsTGVuZ3RoKGNoYXIgY2gpIHsKLQkJaWYgKGNoID09ICdcdCcpIHsKLQkJCXJldHVybiBnZXRWaXN1YWxUYWJMZW5ndGhQcmVmZXJlbmNlKCk7Ci0JCX0gCi0JCQkKLQkJcmV0dXJuIDE7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZpc3VhbCBsZW5ndGggb2YgYSBnaXZlbiA8Y29kZT5DaGFyU2VxdWVuY2U8L2NvZGU+IHRha2luZyBpbnRvCi0JICogYWNjb3VudCB0aGUgdmlzdWFsIHRhYnVsYXRvciBsZW5ndGguCi0JICogCi0JICogQHBhcmFtIHNlcSB0aGUgc3RyaW5nIHRvIG1lYXN1cmUKLQkgKiBAcmV0dXJuIHRoZSB2aXN1YWwgbGVuZ3RoIG9mIDxjb2RlPnNlcTwvY29kZT4KLQkgKi8KLQlwcml2YXRlIGludCBjb21wdXRlVmlzdWFsTGVuZ3RoKENoYXJTZXF1ZW5jZSBzZXEpIHsKLQkJaW50IHNpemU9IDA7Ci0JCWludCB0YWJsZW49IGdldFZpc3VhbFRhYkxlbmd0aFByZWZlcmVuY2UoKTsKLQkJCi0JCWZvciAoaW50IGk9IDA7IGkgPCBzZXEubGVuZ3RoKCk7IGkrKykgewotCQkJY2hhciBjaD0gc2VxLmNoYXJBdChpKTsKLQkJCWlmIChjaCA9PSAnXHQnKSB7Ci0JCQkJc2l6ZSArPSB0YWJsZW4gLSBzaXplICUgdGFibGVuOwotCQkJfSBlbHNlIHsKLQkJCQlzaXplKys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNpemU7Ci0JfQotCQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBpbmRlbnRhdGlvbnMgYW5kIHJldHVybnMgdGhlIGRpZmZlcmVuY2UgaW4KLQkgKiBsZW5ndGggb2YgY3VycmVudCBhbmQgY29ycmVjdC4gSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBwb3NpdGl2ZSwgPGNvZGU+YWRkaXRpb248L2NvZGU+Ci0JICogaXMgaW5pdGlhbGl6ZWQgd2l0aCBhIHN1YnN0cmluZyBvZiB0aGF0IGxlbmd0aCBvZiA8Y29kZT5jb3JyZWN0PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gY29ycmVjdCB0aGUgY29ycmVjdCBpbmRlbnRhdGlvbgotCSAqIEBwYXJhbSBjdXJyZW50IHRoZSBjdXJyZW50IGluZGVudGF0aW9uIChtaWdodCBjb250YWluIG5vbi13aGl0ZXNwYWNlKQotCSAqIEBwYXJhbSBkaWZmZXJlbmNlIGEgc3RyaW5nIGJ1ZmZlciAtIGlmIHRoZSByZXR1cm4gdmFsdWUgaXMgcG9zaXRpdmUsIGl0IHdpbGwgYmUgY2xlYXJlZCBhbmQgc2V0IHRvIHRoZSBzdWJzdHJpbmcgb2YgPGNvZGU+Y3VycmVudDwvY29kZT4gb2YgdGhhdCBsZW5ndGgKLQkgKiBAcmV0dXJuIHRoZSBkaWZmZXJlbmNlIGluIGxlbmd0aCBvZiA8Y29kZT5jb3JyZWN0PC9jb2RlPiBhbmQgPGNvZGU+Y3VycmVudDwvY29kZT4gCi0JICovCi0JcHJpdmF0ZSBpbnQgc3VidHJhY3RJbmRlbnQoQ2hhclNlcXVlbmNlIGNvcnJlY3QsIENoYXJTZXF1ZW5jZSBjdXJyZW50LCBTdHJpbmdCdWZmZXIgZGlmZmVyZW5jZSkgewotCQlpbnQgYzE9IGNvbXB1dGVWaXN1YWxMZW5ndGgoY29ycmVjdCk7Ci0JCWludCBjMj0gY29tcHV0ZVZpc3VhbExlbmd0aChjdXJyZW50KTsKLQkJaW50IGRpZmY9IGMxIC0gYzI7Ci0JCWlmIChkaWZmIDw9IDApIHsKLQkJCXJldHVybiBkaWZmOwotCQl9Ci0JCQotCQlkaWZmZXJlbmNlLnNldExlbmd0aCgwKTsKLQkJaW50IGxlbj0gMCwgaT0gMDsKLQkJd2hpbGUgKGxlbiA8IGRpZmYpIHsKLQkJCWNoYXIgYz0gY29ycmVjdC5jaGFyQXQoaSsrKTsKLQkJCWRpZmZlcmVuY2UuYXBwZW5kKGMpOwotCQkJbGVuICs9IGNvbXB1dGVWaXN1YWxMZW5ndGgoYyk7Ci0JCX0KLQkJCi0JCXJldHVybiBkaWZmOwotCX0KLQkKLQkvKioKLQkgKiBUaGUgcHJlZmVyZW5jZSBzZXR0aW5nIGZvciB0aGUgdmlzdWFsIHRhYnVsYXRvciBkaXNwbGF5LgotCSAqICAKLQkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygc3BhY2VzIGRpc3BsYXllZCBmb3IgYSB0YWJ1bGF0b3IgaW4gdGhlIGVkaXRvcgotCSAqLwotCXByaXZhdGUgaW50IGdldFZpc3VhbFRhYkxlbmd0aFByZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBBbnRVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29tYmluZWRQcmVmZXJlbmNlU3RvcmUoKS5nZXRJbnQoQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfVEFCX1dJRFRIKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9BbnRFZGl0b3JBY3Rpb25Db250cmlidXRvci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvQW50RWRpdG9yQWN0aW9uQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxYWQ4OC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9BbnRFZGl0b3JBY3Rpb25Db250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDggR0VCSVQgR2VzZWxsc2NoYWZ0IGZ1ZXIgRURWLUJlcmF0dW5nCi0gKiB1bmQgSW5mb3JtYXRpay1UZWNobm9sb2dpZW4gbWJILAotICogQmVybGluLCBEdWVzc2VsZG9yZiwgRnJhbmtmdXJ0IChHZXJtYW55KSBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEdFQklUIEdlc2VsbHNjaGFmdCBmdWVyIEVEVi1CZXJhdHVuZyB1bmQgSW5mb3JtYXRpay1UZWNobm9sb2dpZW4gbWJIIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAJICAgSUJNIENvcnBvcmF0aW9uIC0gYnVnIGZpeGVzCi0gKiAgICAgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCAtIGJ1ZyA0MDI1NQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuYWN0aW9ucy5Gb2xkaW5nQWN0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5hY3Rpb25zLk9wZW5EZWNsYXJhdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLmFjdGlvbnMuT3BlbkV4dGVybmFsRG9jQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuYWN0aW9ucy5Ub2dnbGVBdXRvUmVjb25jaWxlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuYWN0aW9ucy5Ub2dnbGVNYXJrT2NjdXJyZW5jZXNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5hY3Rpb25zLlRvZ2dsZVByZXNlbnRhdGlvbkFjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5SZXRhcmdldFRleHRFZGl0b3JBY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuVGV4dEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLmFjdGlvbnMuSUphdmFFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzOwotCi0vKioKLSAqIENvbnRyaWJ1dGVzIGludGVyZXN0aW5nIEFudCBFZGl0b3IgYWN0aW9ucyB0byB0aGUgZGVza3RvcCdzIEVkaXQgbWVudSBhbmQgdGhlIHRvb2xiYXIuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFudEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yIGV4dGVuZHMgVGV4dEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUT0dHTEVfTUFSS19PQ0NVUlJFTkNFU19JRD0gIm9yZy5lY2xpcHNlLmFudC51aS50b2dnbGVNYXJrT2NjdXJyZW5jZXMiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmQ29udGVudEFzc2lzdFByb3Bvc2FsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZkNvbnRlbnRGb3JtYXQ7Ci0JcHJpdmF0ZSBPcGVuRGVjbGFyYXRpb25BY3Rpb24gZk9wZW5EZWNsYXJhdGlvbkFjdGlvbjsKLQlwcml2YXRlIFRvZ2dsZVByZXNlbnRhdGlvbkFjdGlvbiBmVG9nZ2xlUHJlc2VudGF0aW9uOwotCXByaXZhdGUgT3BlbkV4dGVybmFsRG9jQWN0aW9uIGZPcGVuRXh0ZXJuYWxEb2NBY3Rpb247Ci0JcHJpdmF0ZSBUb2dnbGVNYXJrT2NjdXJyZW5jZXNBY3Rpb24gZlRvZ2dsZU1hcmtPY2N1cnJlbmNlc0FjdGlvbjsKLSAgICBwcml2YXRlIFRvZ2dsZUF1dG9SZWNvbmNpbGVBY3Rpb24gZlRvZ2dsZUF1dG9SZWNvbmNpbGVBY3Rpb247Ci0KLQlwdWJsaWMgQW50RWRpdG9yQWN0aW9uQ29udHJpYnV0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IEFudEVkaXRvck1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCWZDb250ZW50QXNzaXN0UHJvcG9zYWwgPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKGJ1bmRsZSwgIkNvbnRlbnRBc3Npc3RQcm9wb3NhbC4iKTsgLy8kTk9OLU5MUy0xJAotCQlmQ29udGVudEFzc2lzdFByb3Bvc2FsLnNldEFjdGlvbkRlZmluaXRpb25JZChJVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuQ09OVEVOVF9BU1NJU1RfUFJPUE9TQUxTKTsKLQkJZkNvbnRlbnRGb3JtYXQgPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKGJ1bmRsZSwgIkNvbnRlbnRGb3JtYXQuIik7IC8vJE5PTi1OTFMtMSQKLQkJZkNvbnRlbnRGb3JtYXQuc2V0QWN0aW9uRGVmaW5pdGlvbklkKElKYXZhRWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5GT1JNQVQpOwotCQlmVG9nZ2xlUHJlc2VudGF0aW9uPSBuZXcgVG9nZ2xlUHJlc2VudGF0aW9uQWN0aW9uKCk7Ci0JCWZUb2dnbGVNYXJrT2NjdXJyZW5jZXNBY3Rpb249IG5ldyBUb2dnbGVNYXJrT2NjdXJyZW5jZXNBY3Rpb24oKTsKLSAgICAgICAgZlRvZ2dsZUF1dG9SZWNvbmNpbGVBY3Rpb249IG5ldyBUb2dnbGVBdXRvUmVjb25jaWxlQWN0aW9uKCk7Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQWN0aW9ucyhBbnRFZGl0b3IgZWRpdG9yKSB7Ci0JCWZPcGVuRGVjbGFyYXRpb25BY3Rpb249IG5ldyBPcGVuRGVjbGFyYXRpb25BY3Rpb24oZWRpdG9yKTsKLQkJZk9wZW5FeHRlcm5hbERvY0FjdGlvbj0gbmV3IE9wZW5FeHRlcm5hbERvY0FjdGlvbihlZGl0b3IpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZG9TZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgcGFydCkgewotCQlzdXBlci5zZXRBY3RpdmVFZGl0b3IocGFydCk7Ci0KLQkJSVRleHRFZGl0b3IgZWRpdG9yPSBudWxsOwotCQlpZiAocGFydCBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQllZGl0b3I9IChJVGV4dEVkaXRvcikgcGFydDsKLQkJfQotCi0JCWZDb250ZW50QXNzaXN0UHJvcG9zYWwuc2V0QWN0aW9uKGdldEFjdGlvbihlZGl0b3IsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkNPTlRFTlRfQVNTSVNUKSk7Ci0JCWZDb250ZW50Rm9ybWF0LnNldEFjdGlvbihnZXRBY3Rpb24oZWRpdG9yLCAiQ29udGVudEZvcm1hdCIpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIEFudEVkaXRvcikgewotCQkgICAgQW50RWRpdG9yIGFudEVkaXRvcj0gKEFudEVkaXRvcikgcGFydDsKLQkJCWlmIChmT3BlbkRlY2xhcmF0aW9uQWN0aW9uID09IG51bGwpIHsKLQkJCQlpbml0aWFsaXplQWN0aW9ucyhhbnRFZGl0b3IpOwotCQkJCWNvbnRyaWJ1dGVUb01lbnUoZ2V0QWN0aW9uQmFycygpLmdldE1lbnVNYW5hZ2VyKCkpOwotCQkJfQotCQkJCi0JCQlGb2xkaW5nQWN0aW9uR3JvdXAgZm9sZGluZ0FjdGlvbnM9IGFudEVkaXRvci5nZXRGb2xkaW5nQWN0aW9uR3JvdXAoKTsKLQkJCWlmIChmb2xkaW5nQWN0aW9ucyAhPSBudWxsKSB7Ci0JCQkJZm9sZGluZ0FjdGlvbnMudXBkYXRlQWN0aW9uQmFycygpOwotCQkJfQotCQkJaWYgKGZPcGVuRGVjbGFyYXRpb25BY3Rpb24gIT0gbnVsbCkgewotCQkJCWZPcGVuRGVjbGFyYXRpb25BY3Rpb24uc2V0RWRpdG9yKGFudEVkaXRvcik7Ci0JCQl9Ci0JCQlpZiAoZk9wZW5FeHRlcm5hbERvY0FjdGlvbiAhPSBudWxsKSB7Ci0JCQkJZk9wZW5FeHRlcm5hbERvY0FjdGlvbi5zZXRBY3RpdmVFZGl0b3IobnVsbCwgYW50RWRpdG9yKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGZUb2dnbGVQcmVzZW50YXRpb24gIT0gbnVsbCkgewotCQkgICAgZlRvZ2dsZVByZXNlbnRhdGlvbi5zZXRFZGl0b3IoZWRpdG9yKTsKLQkJfQotCQlpZiAoZlRvZ2dsZU1hcmtPY2N1cnJlbmNlc0FjdGlvbiAhPSBudWxsKSB7Ci0JCQlmVG9nZ2xlTWFya09jY3VycmVuY2VzQWN0aW9uLnNldEVkaXRvcihlZGl0b3IpOwotCQl9Ci0gICAgICAgIGlmIChmVG9nZ2xlQXV0b1JlY29uY2lsZUFjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmVG9nZ2xlQXV0b1JlY29uY2lsZUFjdGlvbi5zZXRFZGl0b3IoZWRpdG9yKTsKLSAgICAgICAgfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb01lbnUob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCWlmIChmT3BlbkRlY2xhcmF0aW9uQWN0aW9uID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5jb250cmlidXRlVG9NZW51KG1lbnUpOwotCQkKLQkJSU1lbnVNYW5hZ2VyIG5hdmlnYXRlTWVudT0gbWVudS5maW5kTWVudVVzaW5nUGF0aChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fTkFWSUdBVEUpOwotCQlpZiAobmF2aWdhdGVNZW51ICE9IG51bGwpIHsKLQkJCW5hdmlnYXRlTWVudS5hcHBlbmRUb0dyb3VwKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuT1BFTl9FWFQsIGZPcGVuRGVjbGFyYXRpb25BY3Rpb24pOwotCQkJbmF2aWdhdGVNZW51LmFwcGVuZFRvR3JvdXAoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5PUEVOX0VYVCwgZk9wZW5FeHRlcm5hbERvY0FjdGlvbik7Ci0JCQluYXZpZ2F0ZU1lbnUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCX0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjaW5pdChvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFycykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGJhcnMpIHsKLSAgICAgICAgc3VwZXIuaW5pdChiYXJzKTsKLSAgICAgICAgCi0gICAgICAgIElNZW51TWFuYWdlciBtZW51TWFuYWdlcj0gYmFycy5nZXRNZW51TWFuYWdlcigpOwotICAgICAgICBJTWVudU1hbmFnZXIgZWRpdE1lbnU9IG1lbnVNYW5hZ2VyLmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElUKTsKLSAgICAgICAgaWYgKGVkaXRNZW51ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVkaXRNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgICAgICAgICAgZWRpdE1lbnUuYWRkKGZDb250ZW50QXNzaXN0UHJvcG9zYWwpOwotICAgICAgICAgICAgZWRpdE1lbnUuYWRkKGZDb250ZW50Rm9ybWF0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3Ijc2V0QWN0aXZlRWRpdG9yKG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBwYXJ0KSB7Ci0JCWRvU2V0QWN0aXZlRWRpdG9yKHBhcnQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZG9TZXRBY3RpdmVFZGl0b3IobnVsbCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2luaXQob3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnMsIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYmFycywgSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotICAgICAgICBzdXBlci5pbml0KGJhcnMsIHBhZ2UpOwotICAgICAgICBiYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLlRPR0dMRV9TSE9XX1NFTEVDVEVEX0VMRU1FTlRfT05MWSwgZlRvZ2dsZVByZXNlbnRhdGlvbik7Ci0JCWJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihUT0dHTEVfTUFSS19PQ0NVUlJFTkNFU19JRCwgZlRvZ2dsZU1hcmtPY2N1cnJlbmNlc0FjdGlvbik7Ci0gICAgICAgIGJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigib3JnLmVjbGlwc2UuYW50LnVpLnRvZ2dsZUF1dG9SZWNvbmNpbGUiLCBmVG9nZ2xlQXV0b1JlY29uY2lsZUFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9BbnRFZGl0b3JNZXNzYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvQW50RWRpdG9yTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UzYWNmZi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9BbnRFZGl0b3JNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotcHVibGljIGNsYXNzIEFudEVkaXRvck1lc3NhZ2VzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLkFudEVkaXRvck1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgZmdSZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIEFudEVkaXRvck1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmdSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQlyZXR1cm4gZmdSZXNvdXJjZUJ1bmRsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9BbnRFZGl0b3JNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvQW50RWRpdG9yTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYxY2QxNy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9BbnRFZGl0b3JNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEpvaG4tTWFzb24gUC4gU2hhY2tlbGZvcmQgLSBidWcgNDAyNTUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQ29udGVudEFzc2lzdFByb3Bvc2FsLmxhYmVsPUNvbnRlbnQgJkFzc2lzdEBDdHJsK1NwYWNlCi1Db250ZW50QXNzaXN0UHJvcG9zYWwudG9vbHRpcD1Db250ZW50IEFzc2lzdAotQ29udGVudEFzc2lzdFByb3Bvc2FsLmltYWdlPQotQ29udGVudEFzc2lzdFByb3Bvc2FsLmRlc2NyaXB0aW9uPUNvbnRlbnQgQXNzaXN0Ci0KLUNvbnRlbnRGb3JtYXQubGFiZWw9JkZvcm1hdAotQ29udGVudEZvcm1hdC50b29sdGlwPUZvcm1hdCBidWlsZCBmaWxlIHNvdXJjZQotQ29udGVudEZvcm1hdC5pbWFnZT0KLUNvbnRlbnRGb3JtYXQuZGVzY3JpcHRpb249Rm9ybWF0IGJ1aWxkIGZpbGUgc291cmNlCi0KLUFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IuUmVxdWlyZWRfX180PVJlcXVpcmVkOgotQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci4yOD1ObyBhdHRyaWJ1dGUgY29tcGxldGlvbnMgYXZhaWxhYmxlCi1BbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yLjI5PU5vIHRhc2sgY29tcGxldGlvbnMgYXZhaWxhYmxlCi1BbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yLjMwPU5vIHRhc2sgY2xvc2luZyBjb21wbGV0aW9ucyBhdmFpbGFibGUKLUFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IuMzE9Tm8gYXR0cmlidXRlIHZhbHVlIGNvbXBsZXRpb25zIGF2YWlsYWJsZQotQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci4zMj1ObyBwcm9wZXJ0eSBjb21wbGV0aW9ucyBhdmFpbGFibGUKLUFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IuMzM9Tm8gY29tcGxldGlvbnMgYXZhaWxhYmxlCi1BbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yLjM5PUNsb3NpbmcgdGFnCi1BbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yLjU5PURlZmF1bHQ6IHswfQotQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci42MD1ObyBUZW1wbGF0ZSBQcm9wb3NhbHMKLUFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IuNjE9VGVtcGxhdGUgUHJvcG9zYWxzCi1BbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yLjYyPU5vIERlZmF1bHQgUHJvcG9zYWxzCi1BbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yLjYzPVByZXNzICcnezB9JycgdG8gc2hvdyB7MX0KLUFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IuNjQ9Q2xpY2sgdG8gc2hvdyB7MH0KLUFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IuMT1Ob3QgcmVxdWlyZWQKLUFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IuMj1SZXF1aXJlZAotQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci4wPURlZmF1bHQgUHJvcG9zYWxzCi0KLUFudEFubm90YXRpb25Ib3Zlci5tdWx0aXBsZU1hcmtlcnNBdFRoaXNMaW5lPU11bHRpcGxlIG1hcmtlcnMgYXQgdGhpcyBsaW5lCi0KLUFudEVkaXRvci4zPUN1cnJlbnQgdGV4dCBzZWxlY3Rpb24gZG9lcyBub3QgcmVzb2x2ZSB0byBhbiBBbnQgcmVmZXJlbmNlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9BbnRFbGVtZW50SHlwZXJsaW5rLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9BbnRFbGVtZW50SHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNTE4OGQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvQW50RWxlbWVudEh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci0KLXB1YmxpYyBjbGFzcyBBbnRFbGVtZW50SHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0KLSAgICBwcml2YXRlIElSZWdpb24gZlJlZ2lvbj0gbnVsbDsKLSAgICBwcml2YXRlIE9iamVjdCBmTGlua1RhcmdldD0gbnVsbDsKLSAgICBwcml2YXRlIEFudEVkaXRvciBmRWRpdG9yPSBudWxsOwotICAgIAotICAgIHB1YmxpYyBBbnRFbGVtZW50SHlwZXJsaW5rKEFudEVkaXRvciBlZGl0b3IsIElSZWdpb24gcmVnaW9uLCBPYmplY3QgbGlua1RhcmdldCkgewotICAgICAgICAKLSAgICAgICBmUmVnaW9uPSByZWdpb247Ci0gICAgICAgZkxpbmtUYXJnZXQ9IGxpbmtUYXJnZXQ7Ci0gICAgICAgZkVkaXRvcj0gZWRpdG9yOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rUmVnaW9uKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKSB7Ci0gICAgICAgIHJldHVybiBmUmVnaW9uOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRIeXBlcmxpbmtUZXh0KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjb3BlbigpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb3BlbigpIHsKLSAgICAgICAgZkVkaXRvci5vcGVuVGFyZ2V0KGZMaW5rVGFyZ2V0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9BbnRFbGVtZW50SHlwZXJsaW5rRGV0ZWN0b3IuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL0FudEVsZW1lbnRIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzZjMWE2Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL0FudEVsZW1lbnRIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0LlhNTFRleHRIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5BYnN0cmFjdEh5cGVybGlua0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci0KLXB1YmxpYyBjbGFzcyBBbnRFbGVtZW50SHlwZXJsaW5rRGV0ZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdEh5cGVybGlua0RldGVjdG9yIHsKLQotICAgIHByaXZhdGUgQW50RWRpdG9yIGZFZGl0b3I7Ci0gICAgCi0gICAgcHVibGljIEFudEVsZW1lbnRIeXBlcmxpbmtEZXRlY3RvcigpIHsgICAgCi0gICAgfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGlua0RldGVjdG9yI2RldGVjdEh5cGVybGlua3Mob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBJSHlwZXJsaW5rW10gZGV0ZWN0SHlwZXJsaW5rcyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHJlZ2lvbiwgYm9vbGVhbiBjYW5TaG93TXVsdGlwbGVIeXBlcmxpbmtzKSB7Ci0JCSBpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotICAgICAgICB9Ci0JCWZFZGl0b3IgPSAoQW50RWRpdG9yKSBnZXRBZGFwdGVyKEFudEVkaXRvci5jbGFzcyk7Ci0gICAgICAgIHJlZ2lvbj0gWE1MVGV4dEhvdmVyLmdldFJlZ2lvbih0ZXh0Vmlld2VyLCByZWdpb24uZ2V0T2Zmc2V0KCkpOwotICAgICAgICBPYmplY3QgbGlua1RhcmdldD0gZkVkaXRvci5maW5kVGFyZ2V0KHJlZ2lvbik7Ci0JCWlmIChsaW5rVGFyZ2V0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0gICAgICAgIHJldHVybiBuZXcgSUh5cGVybGlua1tdIHtuZXcgQW50RWxlbWVudEh5cGVybGluayhmRWRpdG9yLCByZWdpb24sIGxpbmtUYXJnZXQpfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9BbnRTb3VyY2VWaWV3ZXJJbmZvcm1hdGlvbkNvbnRyb2wuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL0FudFNvdXJjZVZpZXdlckluZm9ybWF0aW9uQ29udHJvbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzZjMDJkLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL0FudFNvdXJjZVZpZXdlckluZm9ybWF0aW9uQ29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50U291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRleHQuQW50RG9jdW1lbnRTZXR1cFBhcnRpY2lwYW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2xFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBBbnRTb3VyY2VWaWV3ZXJJbmZvcm1hdGlvbkNvbnRyb2wgaW1wbGVtZW50cyBJSW5mb3JtYXRpb25Db250cm9sLCBJSW5mb3JtYXRpb25Db250cm9sRXh0ZW5zaW9uLCBEaXNwb3NlTGlzdGVuZXIgewotCS8qKiBUaGUgY29udHJvbCdzIHNoZWxsICovCi0JcHJpdmF0ZSBTaGVsbCBmU2hlbGw7Ci0JCi0JLyoqIFRoZSBjb250cm9sJ3Mgc291cmNlIHZpZXdlciAqLwotCXByaXZhdGUgU291cmNlVmlld2VyIGZWaWV3ZXI7Ci0JCi0JLyoqIFRoZSBjb250cm9sJ3MgdGV4dCB3aWRnZXQgKi8KLQlwcml2YXRlIFN0eWxlZFRleHQgZlRleHQ7Ci0JCi0JcHVibGljIEFudFNvdXJjZVZpZXdlckluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnQpIHsKLQkJR3JpZExheW91dCBsYXlvdXQ7Ci0JCUdyaWREYXRhIGdkOwotCi0JCWZTaGVsbD0gbmV3IFNoZWxsKHBhcmVudCwgU1dULk9OX1RPUCB8IFNXVC5UT09MKTsKLQkJRGlzcGxheSBkaXNwbGF5PSBmU2hlbGwuZ2V0RGlzcGxheSgpOwotCQlmU2hlbGwuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9CTEFDSykpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGU9IGZTaGVsbDsKLQkJbGF5b3V0PSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQ9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aD0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlnZD0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZlZpZXdlcj0gY3JlYXRlVmlld2VyKGNvbXBvc2l0ZSk7Ci0JCQotCQlmVGV4dD0gZlZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWdkPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HIHwgR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZlRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWZUZXh0LnNldEZvcmVncm91bmQocGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19GT1JFR1JPVU5EKSk7Ci0JCWZUZXh0LnNldEJhY2tncm91bmQocGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EKSk7Ci0JCQkKLQkJZlRleHQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUxpc3RlbmVyKCkgewotCQkJCQotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSAgewotCQkJCWlmIChlLmNoYXJhY3RlciA9PSAweDFCKSAvLyBFU0MKLQkJCQkJZlNoZWxsLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCQkKLQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHt9Ci0JCX0pOwotCX0KLQkKLQkKLSAgICBwcml2YXRlIFNvdXJjZVZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgIAlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbmV3IFNvdXJjZVZpZXdlcihwYXJlbnQsIG51bGwsIFNXVC5OT05FKTsKLSAgICAgICAgICAKLQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IEFudFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKTsKLQkJdmlld2VyLmNvbmZpZ3VyZShjb25maWd1cmF0aW9uKTsKLQkJdmlld2VyLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJRm9udCBmb250PSBKRmFjZVJlc291cmNlcy5nZXRGb250KEpGYWNlUmVzb3VyY2VzLlRFWFRfRk9OVCk7Ci0JCXZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuc2V0Rm9udChmb250KTsKLQkJICAgICAgICAKLQkJcmV0dXJuIHZpZXdlcjsKLSAgICB9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sI3NldEluZm9ybWF0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5mb3JtYXRpb24oU3RyaW5nIGNvbnRlbnQpIHsKLQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkgewotCQkJZlZpZXdlci5zZXRJbnB1dChudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoY29udGVudCk7Ci0JCW5ldyBBbnREb2N1bWVudFNldHVwUGFydGljaXBhbnQoKS5zZXR1cChkb2N1bWVudCk7Ci0JCWZWaWV3ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbCNzZXRTaXplQ29uc3RyYWludHMoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2l6ZUNvbnN0cmFpbnRzKGludCBtYXhXaWR0aCwgaW50IG1heEhlaWdodCkgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbCNjb21wdXRlU2l6ZUhpbnQoKQotCSAqLwotCXB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZUhpbnQoKSB7Ci0JCXJldHVybiBmU2hlbGwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2wjc2V0VmlzaWJsZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCWZTaGVsbC5zZXRWaXNpYmxlKHZpc2libGUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbCNzZXRTaXplKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCWZTaGVsbC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbCNzZXRMb2NhdGlvbihvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oUG9pbnQgbG9jYXRpb24pIHsKLQkJUmVjdGFuZ2xlIHRyaW09IGZTaGVsbC5jb21wdXRlVHJpbSgwLCAwLCAwLCAwKTsKLQkJUG9pbnQgdGV4dExvY2F0aW9uPSBmVGV4dC5nZXRMb2NhdGlvbigpOwotCQlsb2NhdGlvbi54ICs9IHRyaW0ueCAtIHRleHRMb2NhdGlvbi54OwotCQlsb2NhdGlvbi55ICs9IHRyaW0ueSAtIHRleHRMb2NhdGlvbi55OwotCQlmU2hlbGwuc2V0TG9jYXRpb24obG9jYXRpb24pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZlNoZWxsICE9IG51bGwgJiYgIWZTaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWZTaGVsbC5kaXNwb3NlKCk7Ci0JCX0gZWxzZSB7Ci0JCQl3aWRnZXREaXNwb3NlZChudWxsKTsKLQkJfQotCQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2wjYWRkRGlzcG9zZUxpc3RlbmVyKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZlNoZWxsLmFkZERpc3Bvc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbCNyZW1vdmVEaXNwb3NlTGlzdGVuZXIob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlmU2hlbGwucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2wjc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgZm9yZWdyb3VuZCkgewotCQlmVGV4dC5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbCNzZXRCYWNrZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBiYWNrZ3JvdW5kKSB7Ci0JCWZUZXh0LnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sI2lzRm9jdXNDb250cm9sKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvY3VzQ29udHJvbCgpIHsKLQkJcmV0dXJuIGZUZXh0LmlzRm9jdXNDb250cm9sKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sI3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJZlNoZWxsLmZvcmNlRm9jdXMoKTsKLQkJZlRleHQuc2V0Rm9jdXMoKTsKLQkJCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sI2FkZEZvY3VzTGlzdGVuZXIob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEZvY3VzTGlzdGVuZXIoRm9jdXNMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlmVGV4dC5hZGRGb2N1c0xpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2wjcmVtb3ZlRm9jdXNMaXN0ZW5lcihvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRm9jdXNMaXN0ZW5lcihGb2N1c0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZUZXh0LnJlbW92ZUZvY3VzTGlzdGVuZXIobGlzdGVuZXIpOwotCQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2xFeHRlbnNpb24jaGFzQ29udGVudHMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NvbnRlbnRzKCkgewotCQlyZXR1cm4gZlRleHQuZ2V0Q2hhckNvdW50KCkgPiAwOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyI3dpZGdldERpc3Bvc2VkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCWZTaGVsbD0gbnVsbDsKLQkJZlRleHQ9IG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL0RlY2F5Q29kZUNvbXBsZXRpb25EYXRhU3RydWN0dXJlc1RocmVhZC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvRGVjYXlDb2RlQ29tcGxldGlvbkRhdGFTdHJ1Y3R1cmVzVGhyZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YTdkYzguLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvRGVjYXlDb2RlQ29tcGxldGlvbkRhdGFTdHJ1Y3R1cmVzVGhyZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudXRpbHMuUHJvamVjdEhlbHBlcjsKLQotCi1wdWJsaWMgY2xhc3MgRGVjYXlDb2RlQ29tcGxldGlvbkRhdGFTdHJ1Y3R1cmVzVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZmdEZWxheT0gNjAwMCAqIDU7IC8vNSBtaW51dGVzIAotCQotCXByaXZhdGUgc3RhdGljIERlY2F5Q29kZUNvbXBsZXRpb25EYXRhU3RydWN0dXJlc1RocmVhZCBmZ0luc3RhbmNlOwotCQotCXB1YmxpYyBzdGF0aWMgRGVjYXlDb2RlQ29tcGxldGlvbkRhdGFTdHJ1Y3R1cmVzVGhyZWFkIGdldERlZmF1bHQoKSB7Ci0JCWlmIChmZ0luc3RhbmNlID09IG51bGwpIHsKLQkJCWZnSW5zdGFuY2U9IG5ldyBEZWNheUNvZGVDb21wbGV0aW9uRGF0YVN0cnVjdHVyZXNUaHJlYWQoKTsKLQkJfQotCQlyZXR1cm4gZmdJbnN0YW5jZTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBiYWNrZ3JvdW5kIHRocmVhZC4gVGhlIHRocmVhZCAKLQkgKiBydW5zIHdpdGggbWluaW1hbCBwcmlvcml0eS4KLQkgKi8KLQlwcml2YXRlIERlY2F5Q29kZUNvbXBsZXRpb25EYXRhU3RydWN0dXJlc1RocmVhZCgpIHsKLQkJc3VwZXIoIkRlY2F5IEFudCBEYXRhIFN0cnVjdHVyZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRQcmlvcml0eShUaHJlYWQuTUlOX1BSSU9SSVRZKTsKLQkJc2V0RGFlbW9uKHRydWUpOwotCQlmZ0luc3RhbmNlPSB0aGlzOwotICAgICAgICBzZXRDb250ZXh0Q2xhc3NMb2FkZXIobnVsbCk7IC8vZG9uJ3QgaG9sZCBvbiB0byBhbnkgY2xhc3MgbG9hZGVycwotCX0KLQkKLQkvKioKLQkgKiBUaGUgYmFja2dyb3VuZCBhY3Rpdml0eSB0aGF0IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSBsYXN0IDxjb2RlPkFudE1vZGVsPC9jb2RlPiBpcyBkaXNwb3NlZC4KLQkgKiBXYWl0cyBmb3IgdGhlIHJlcXVpcmVkIGRlbGF5IGFuZCB0aGVuIG51bGxzIG91dCB0aGUgbWVtb3J5IGV4cGVuc2l2ZSBBbnQgY29kZQotCSAqIGNvbXBsZXRpb24gZGF0YSBzdHJ1Y3R1cmVzIGFuZCByZXNldCB0aGUgUHJvamVjdEhlbHBlci4KLQkgKiBJZiBhbiA8Y29kZT5BbnRNb2RlbDwvY29kZT4gaXMgY3JlYXRlZCBkdXJpbmcgdGhlIHdhaXQsIHRoZSB0aHJlYWQgaXMKLQkgKiBpbnRlcnJ1cHRlZCBhbmQgbm8gbnVsbGluZyBvdXQgb2NjdXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQl0cnkgewotCQkJCXdhaXQoZmdEZWxheSk7Ci0JCQkJQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci5yZXNldENvZGVDb21wbGV0aW9uRGF0YVN0cnVjdHVyZXMoKTsKLSAgICAgICAgICAgICAgICBQcm9qZWN0SGVscGVyLnJlc2V0KCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB4KSB7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2FuY2VscyB0aGUgYmFja2dyb3VuZCB0aHJlYWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNhbmNlbCgpIHsKLQkJaWYgKGZnSW5zdGFuY2UgIT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChmZ0luc3RhbmNlKSB7Ci0JCQkJZmdJbnN0YW5jZS5pbnRlcnJ1cHQoKTsKLQkJCQlmZ0luc3RhbmNlPSBudWxsOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvRWRpdG9yU3luY2hyb25pemVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9FZGl0b3JTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBiYWY5ZC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9FZGl0b3JTeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuSUxpbmtlZE1vZGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkTW9kZU1vZGVsOwotCi0vKioKLSAqIFN5bmNocm9uaXplcyB0aGUgQW50IGVkaXRvciB3aXRoIHRoZSBzdGF0ZSBvZiBpdHMgbGlua2VkIG1vZGUKLSAqIAotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yU3luY2hyb25pemVyIGltcGxlbWVudHMgSUxpbmtlZE1vZGVMaXN0ZW5lciB7Ci0gICAgCi0gICAgcHJpdmF0ZSBmaW5hbCBBbnRFZGl0b3IgZkVkaXRvcjsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZldhc09jY3VycmVuY2VzT247Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBzeW5jaHJvbml6ZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVkaXRvciB0aGUgQW50IGVkaXRvciB0aGF0IHdpbGwgYmUgCi0gICAgICogICAgICAgIHN5bmNob25pemVkIHdpdGggdGhlIGxpbmtlZCBtb2RlCi0gICAgICovCi0gICAgcHVibGljIEVkaXRvclN5bmNocm9uaXplcihBbnRFZGl0b3IgZWRpdG9yKSB7Ci0gICAgICAgIEFzc2VydC5pc0xlZ2FsKGVkaXRvciAhPSBudWxsKTsKLSAgICAgICAgZkVkaXRvcj0gZWRpdG9yOwotICAgICAgICBmV2FzT2NjdXJyZW5jZXNPbj0gZkVkaXRvci5pc01hcmtpbmdPY2N1cnJlbmNlcygpOwotICAgICAgICBmRWRpdG9yLnNldEluTGlua2VkTW9kZSh0cnVlLCBmV2FzT2NjdXJyZW5jZXNPbik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5JTGlua2VkTW9kZUxpc3RlbmVyI2xlZnQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLkxpbmtlZE1vZGVNb2RlbCwgaW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGxlZnQoTGlua2VkTW9kZU1vZGVsIGVudmlyb25tZW50LCBpbnQgZmxhZ3MpIHsKLSAgICAJZkVkaXRvci5zZXRJbkxpbmtlZE1vZGUoZmFsc2UsIGZXYXNPY2N1cnJlbmNlc09uKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLklMaW5rZWRNb2RlTGlzdGVuZXIjc3VzcGVuZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkTW9kZU1vZGVsKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN1c3BlbmQoTGlua2VkTW9kZU1vZGVsIGVudmlyb25tZW50KSB7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5JTGlua2VkTW9kZUxpc3RlbmVyI3Jlc3VtZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkTW9kZU1vZGVsLCBpbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVzdW1lKExpbmtlZE1vZGVNb2RlbCBlbnZpcm9ubWVudCwgaW50IGZsYWdzKSB7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL09jY3VycmVuY2VzRmluZGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9PY2N1cnJlbmNlc0ZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTkwMjZjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL09jY3VycmVuY2VzRmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGV4dC5YTUxUZXh0SG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudEVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotCi1wdWJsaWMgY2xhc3MgT2NjdXJyZW5jZXNGaW5kZXIgewotICAgIAotCXByaXZhdGUgQW50TW9kZWwgZkFudE1vZGVsOwotCXByaXZhdGUgQW50RWRpdG9yIGZFZGl0b3I7Ci0JcHJpdmF0ZSBpbnQgZk9mZnNldDsKLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JCi0JcHVibGljIE9jY3VycmVuY2VzRmluZGVyKEFudEVkaXRvciBlZGl0b3IsIEFudE1vZGVsIG1vZGVsLCBJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQkJZkFudE1vZGVsPSBtb2RlbDsKLQkJZkVkaXRvcj0gZWRpdG9yOwotCQlmRG9jdW1lbnQ9IGRvY3VtZW50OwotCQlmT2Zmc2V0PSBvZmZzZXQ7Ci0JfQotCQotCXB1YmxpYyBMaXN0IHBlcmZvcm0oKSB7Ci0JCWlmIChmT2Zmc2V0ID09IDAgfHwgZkFudE1vZGVsID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlBbnRFbGVtZW50Tm9kZSBjb250YWluZXI9IGZBbnRNb2RlbC5nZXROb2RlKGZPZmZzZXQsIGZhbHNlKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJUmVnaW9uIHJlZ2lvbj0gWE1MVGV4dEhvdmVyLmdldFJlZ2lvbihmRWRpdG9yLmdldFZpZXdlcigpLCBmT2Zmc2V0KTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlpZiAoIWNvbnRhaW5lci5pc1JlZ2lvblBvdGVudGlhbFJlZmVyZW5jZShyZWdpb24pKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJQW50RWxlbWVudE5vZGUgbm9kZTsKLQkJaWYgKGNvbnRhaW5lci5pc0Zyb21EZWNsYXJhdGlvbihyZWdpb24pKSB7Ci0JCQlub2RlPSBjb250YWluZXI7Ci0JCX0gZWxzZSB7Ci0JCQlPYmplY3QgcG90ZW50aWFsTm9kZT0gZkVkaXRvci5maW5kVGFyZ2V0KHJlZ2lvbik7Ci0JCQlpZiAoIShwb3RlbnRpYWxOb2RlIGluc3RhbmNlb2YgQW50RWxlbWVudE5vZGUpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9IAotCQkJbm9kZT0gKEFudEVsZW1lbnROb2RlKSBwb3RlbnRpYWxOb2RlOwotCQl9Ci0JCVN0cmluZyBvY2N1cnJlbmNlc0lkZW50aWZpZXI9IG5vZGUuZ2V0T2NjdXJyZW5jZXNJZGVudGlmaWVyKCk7Ci0JCWlmIChvY2N1cnJlbmNlc0lkZW50aWZpZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTGlzdCBub2Rlcz0gbmV3IEFycmF5TGlzdCgxKTsKLQkJbm9kZXMuYWRkKGZBbnRNb2RlbC5nZXRQcm9qZWN0Tm9kZSgpKTsKLSAgICAgICAgTGlzdCB1c2FnZXM9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdXNhZ2VzLmFkZChub2RlKTsKLQkJc2Nhbk5vZGVzRm9yT2NjdXJyZW5jZXMobm9kZXMsIHVzYWdlcywgb2NjdXJyZW5jZXNJZGVudGlmaWVyKTsKLQkJU3RyaW5nIGlkZW50aWZpZXI7Ci0JCXRyeSB7Ci0JCQlpZGVudGlmaWVyPSBmRG9jdW1lbnQuZ2V0KHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpKTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLSAgICAgICAgaW50IGxlbmd0aD0gaWRlbnRpZmllci5sZW5ndGgoKTsKLSAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCQlMaXN0IHBvc2l0aW9ucz0gbmV3IEFycmF5TGlzdCh1c2FnZXMuc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvciBlYWNoPSB1c2FnZXMuaXRlcmF0b3IoKTsgZWFjaC5oYXNOZXh0KCk7KSB7Ci0JCQlBbnRFbGVtZW50Tm9kZSBjdXJyZW50Tm9kZT0gKEFudEVsZW1lbnROb2RlKWVhY2gubmV4dCgpOwotCQkJTGlzdCBvZmZzZXRzPSBjdXJyZW50Tm9kZS5jb21wdXRlSWRlbnRpZmllck9mZnNldHMoaWRlbnRpZmllcik7Ci0JCQlpZiAob2Zmc2V0cyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvZmZzZXRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCXBvc2l0aW9ucy5hZGQobmV3IFBvc2l0aW9uKCgoSW50ZWdlcilvZmZzZXRzLmdldChpKSkuaW50VmFsdWUoKSwgbGVuZ3RoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCi0JCXJldHVybiBwb3NpdGlvbnM7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzY2FuTm9kZXNGb3JPY2N1cnJlbmNlcyhMaXN0IG5vZGVzLCBMaXN0IHVzYWdlcywgU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJSXRlcmF0b3IgaXRlcj0gbm9kZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlBbnRFbGVtZW50Tm9kZSBub2RlID0gKEFudEVsZW1lbnROb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmICghdXNhZ2VzLmNvbnRhaW5zKG5vZGUpICYmIG5vZGUuY29udGFpbnNPY2N1cnJlbmNlKGlkZW50aWZpZXIpKSB7Ci0JCQkJdXNhZ2VzLmFkZChub2RlKTsJCi0JCQl9Ci0JCQlpZiAobm9kZS5oYXNDaGlsZHJlbigpKSB7Ci0JCQkJc2Nhbk5vZGVzRm9yT2NjdXJyZW5jZXMobm9kZS5nZXRDaGlsZE5vZGVzKCksIHVzYWdlcywgaWRlbnRpZmllcik7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9BbnRFZGl0b3JBY3Rpb25NZXNzYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9BbnRFZGl0b3JBY3Rpb25NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmE3OWYwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL2FjdGlvbnMvQW50RWRpdG9yQWN0aW9uTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5hY3Rpb25zOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotcHVibGljIGNsYXNzIEFudEVkaXRvckFjdGlvbk1lc3NhZ2VzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLmFjdGlvbnMuQW50RWRpdG9yQWN0aW9uTWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBmZ1Jlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQotCXByaXZhdGUgQW50RWRpdG9yQWN0aW9uTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGU7Ci0JfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmdSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL0FudEVkaXRvckFjdGlvbk1lc3NhZ2VzLnByb3BlcnRpZXMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL0FudEVkaXRvckFjdGlvbk1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNTAxZTUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9BbnRFZGl0b3JBY3Rpb25NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCAtIGJ1ZyA0MDI1NQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1PcGVuRGVjbGFyYXRpb25BY3Rpb24uMD0mT3BlbiBEZWNsYXJhdGlvbgotT3BlbkRlY2xhcmF0aW9uQWN0aW9uLjE9T3BlbiBhbiBlZGl0b3Igb24gdGhlIHJlZmVyZW5jZWQgZWxlbWVudAotT3BlbkV4dGVybmFsRG9jQWN0aW9uLjA9T3BlbiBFeHRlcm5hbCBBbnQgRG9jdW1lbnRhdGlvbgotT3BlbkV4dGVybmFsRG9jQWN0aW9uLjE9T3BlbiBFJnh0ZXJuYWwgRG9jdW1lbnRhdGlvbgotT3BlbkV4dGVybmFsRG9jQWN0aW9uLjI9T3BlbnMgYW4gZXh0ZXJuYWwgYnJvd3NlciBvbiB0aGUgcmVmZXJlbmNlZCBBbnQgZWxlbWVudAotCi1Ub2dnbGVQcmVzZW50YXRpb24ubGFiZWw9U2hvdyBTb3VyY2Ugb2YgU2VsZWN0ZWQgRWxlbWVudCBPbmx5Ci1Ub2dnbGVQcmVzZW50YXRpb24udG9vbHRpcD1TaG93IFNvdXJjZSBvZiBTZWxlY3RlZCBFbGVtZW50IE9ubHkKLQotVG9nZ2xlTWFya09jY3VycmVuY2VzQWN0aW9uLmxhYmVsPSBUb2dnbGUgQW50IE1hcmsgT2NjdXJyZW5jZXMKLVRvZ2dsZU1hcmtPY2N1cnJlbmNlc0FjdGlvbi50b29sdGlwPSBUb2dnbGUgQW50IE1hcmsgT2NjdXJyZW5jZXMKLQotVG9nZ2xlQXV0b1JlY29uY2lsZUFjdGlvbi5sYWJlbD0gVG9nZ2xlIEF1dG8gUmVjb25jaWxlCi1Ub2dnbGVBdXRvUmVjb25jaWxlQWN0aW9uLnRvb2x0aXA9IFRvZ2dsZSBBdXRvIHJlY29uY2lsZQotCi1Qcm9qZWN0aW9uLlRvZ2dsZS5sYWJlbD0gJkVuYWJsZSBGb2xkaW5nCi1Qcm9qZWN0aW9uLlRvZ2dsZS50b29sdGlwPSBUb2dnbGVzIEZvbGRpbmcKLVByb2plY3Rpb24uVG9nZ2xlLmRlc2NyaXB0aW9uPSBUb2dnbGVzIGZvbGRpbmcgZm9yIHRoZSBjdXJyZW50IGVkaXRvcgotCi1Qcm9qZWN0aW9uLkV4cGFuZEFsbC5sYWJlbD0gRXhwYW5kICZBbGwKLVByb2plY3Rpb24uRXhwYW5kQWxsLnRvb2x0aXA9IEV4cGFuZHMgQWxsIEZvbGRlZCBSZWdpb25zCi1Qcm9qZWN0aW9uLkV4cGFuZEFsbC5kZXNjcmlwdGlvbj0gRXhwYW5kcyBhbnkgZm9sZGVkIHJlZ2lvbnMgaW4gdGhlIGN1cnJlbnQgZWRpdG9yCi0KLVJ1blRvTGluZUFkYXB0ZXIuMD1FbXB0eSBlZGl0b3IKLVJ1blRvTGluZUFkYXB0ZXIuMT1NaXNzaW5nIGRvY3VtZW50Ci1SdW5Ub0xpbmVBZGFwdGVyLjI9Tm8gZmlsZSBjb3VsZCBiZSBmb3VuZAotUnVuVG9MaW5lQWRhcHRlci4zPVVuYWJsZSB0byBsb2NhdGUgZGVidWcgdGFyZ2V0Ci1SZW5hbWVJbkZpbGVBY3Rpb24uMD1SZSZuYW1lIEluIEZpbGUKLVJlbmFtZUluRmlsZUFjdGlvbi4xPVJlbmFtZXMgYWxsIHJlZmVyZW5jZXMgd2l0aGluIHRoZSBzYW1lIGJ1aWxkZmlsZQotUmVuYW1lSW5GaWxlQWN0aW9uLjI9UmVuYW1lcyBhbGwgcmVmZXJlbmNlcwpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9Gb2xkaW5nQWN0aW9uR3JvdXAuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL2FjdGlvbnMvRm9sZGluZ0FjdGlvbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNzA3ZDkuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9Gb2xkaW5nQWN0aW9uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5JUHJvamVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5JRm9sZGluZ0NvbW1hbmRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRleHRPcGVyYXRpb25BY3Rpb247Ci0KLQotLyoqCi0gKiBHcm91cHMgdGhlIEFudCBmb2xkaW5nIGFjdGlvbnMuCi0gKiAgCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBGb2xkaW5nQWN0aW9uR3JvdXAgZXh0ZW5kcyBBY3Rpb25Hcm91cCB7Ci0JcHJpdmF0ZSBQcm9qZWN0aW9uVmlld2VyIGZWaWV3ZXI7Ci0JCi0JcHJpdmF0ZSBUZXh0T3BlcmF0aW9uQWN0aW9uIGZUb2dnbGU7Ci0JcHJpdmF0ZSBUZXh0T3BlcmF0aW9uQWN0aW9uIGZFeHBhbmQ7Ci0JcHJpdmF0ZSBUZXh0T3BlcmF0aW9uQWN0aW9uIGZDb2xsYXBzZTsKLQlwcml2YXRlIFRleHRPcGVyYXRpb25BY3Rpb24gZkV4cGFuZEFsbDsKLQotCXByaXZhdGUgSVByb2plY3Rpb25MaXN0ZW5lciBmUHJvamVjdGlvbkxpc3RlbmVyOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgcHJvamVjdGlvbiBhY3Rpb24gZ3JvdXAgZm9yIDxjb2RlPmVkaXRvcjwvY29kZT4uIElmIHRoZQotCSAqIHN1cHBsaWVkIHZpZXdlciBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+UHJvamVjdGlvblZpZXdlcjwvY29kZT4sIHRoZQotCSAqIGFjdGlvbiBncm91cCBpcyBkaXNhYmxlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdG9yIHRoZSB0ZXh0IGVkaXRvciB0byBvcGVyYXRlIG9uCi0JICogQHBhcmFtIHZpZXdlciB0aGUgdmlld2VyIG9mIHRoZSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgRm9sZGluZ0FjdGlvbkdyb3VwKElUZXh0RWRpdG9yIGVkaXRvciwgSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBQcm9qZWN0aW9uVmlld2VyKSB7Ci0JCQlmVmlld2VyPSAoUHJvamVjdGlvblZpZXdlcikgdmlld2VyOwotCQkJCi0JCQlmUHJvamVjdGlvbkxpc3RlbmVyPSBuZXcgSVByb2plY3Rpb25MaXN0ZW5lcigpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHByb2plY3Rpb25FbmFibGVkKCkgewotCQkJCQl1cGRhdGUoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBwcm9qZWN0aW9uRGlzYWJsZWQoKSB7Ci0JCQkJCXVwZGF0ZSgpOwotCQkJCX0KLQkJCX07Ci0JCQkKLQkJCWZWaWV3ZXIuYWRkUHJvamVjdGlvbkxpc3RlbmVyKGZQcm9qZWN0aW9uTGlzdGVuZXIpOwotCQkJCi0JCQlmVG9nZ2xlPSBuZXcgVGV4dE9wZXJhdGlvbkFjdGlvbihBbnRFZGl0b3JBY3Rpb25NZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLCAiUHJvamVjdGlvbi5Ub2dnbGUuIiwgZWRpdG9yLCBQcm9qZWN0aW9uVmlld2VyLlRPR0dMRSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZUb2dnbGUuc2V0Q2hlY2tlZCh0cnVlKTsKLQkJCWZUb2dnbGUuc2V0QWN0aW9uRGVmaW5pdGlvbklkKElGb2xkaW5nQ29tbWFuZElkcy5GT0xESU5HX1RPR0dMRSk7Ci0JCQllZGl0b3Iuc2V0QWN0aW9uKCJGb2xkaW5nVG9nZ2xlIiwgZlRvZ2dsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJZkV4cGFuZEFsbD0gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24oQW50RWRpdG9yQWN0aW9uTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKSwgIlByb2plY3Rpb24uRXhwYW5kQWxsLiIsIGVkaXRvciwgUHJvamVjdGlvblZpZXdlci5FWFBBTkRfQUxMLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJZkV4cGFuZEFsbC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSUZvbGRpbmdDb21tYW5kSWRzLkZPTERJTkdfRVhQQU5EX0FMTCk7Ci0JCQllZGl0b3Iuc2V0QWN0aW9uKCJGb2xkaW5nRXhwYW5kQWxsIiwgZkV4cGFuZEFsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJZkV4cGFuZD0gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24oQW50RWRpdG9yQWN0aW9uTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKSwgIlByb2plY3Rpb24uRXhwYW5kLiIsIGVkaXRvciwgUHJvamVjdGlvblZpZXdlci5FWFBBTkQsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQlmRXhwYW5kLnNldEFjdGlvbkRlZmluaXRpb25JZChJRm9sZGluZ0NvbW1hbmRJZHMuRk9MRElOR19FWFBBTkQpOwotCQkJZWRpdG9yLnNldEFjdGlvbigiRm9sZGluZ0V4cGFuZCIsIGZFeHBhbmQpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCWZDb2xsYXBzZT0gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24oQW50RWRpdG9yQWN0aW9uTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKSwgIlByb2plY3Rpb24uQ29sbGFwc2UuIiwgZWRpdG9yLCBQcm9qZWN0aW9uVmlld2VyLkNPTExBUFNFLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJZkNvbGxhcHNlLnNldEFjdGlvbkRlZmluaXRpb25JZChJRm9sZGluZ0NvbW1hbmRJZHMuRk9MRElOR19DT0xMQVBTRSk7Ci0JCQllZGl0b3Iuc2V0QWN0aW9uKCJGb2xkaW5nQ29sbGFwc2UiLCBmQ29sbGFwc2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ3JvdXAgaXMgZW5hYmxlZC4gCi0JICogPHByZT4KLQkgKiBJbnZhcmlhbnQ6IGlzRW5hYmxlZCgpIDw9PiBmVmlld2VyIGFuZCBhbGwgYWN0aW9ucyBhcmUgIT0gbnVsbC4KLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBncm91cCBpcyBlbmFibGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGZWaWV3ZXIgIT0gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uR3JvdXAjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGlzRW5hYmxlZCgpKSB7Ci0JCQlmVmlld2VyLnJlbW92ZVByb2plY3Rpb25MaXN0ZW5lcihmUHJvamVjdGlvbkxpc3RlbmVyKTsKLQkJCWZWaWV3ZXI9IG51bGw7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBhY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpIHsKLQkJaWYgKGlzRW5hYmxlZCgpKSB7Ci0JCQlmVG9nZ2xlLnVwZGF0ZSgpOwotCQkJZlRvZ2dsZS5zZXRDaGVja2VkKGZWaWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpICE9IG51bGwpOwotCQkJZkV4cGFuZC51cGRhdGUoKTsKLQkJCWZFeHBhbmRBbGwudXBkYXRlKCk7Ci0JCQlmQ29sbGFwc2UudXBkYXRlKCk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uR3JvdXAjdXBkYXRlQWN0aW9uQmFycygpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlQWN0aW9uQmFycygpIHsKLQkJdXBkYXRlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9Gb2xkaW5nRXhwYW5kQWxsUnVsZXJBY3Rpb24uamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL2FjdGlvbnMvRm9sZGluZ0V4cGFuZEFsbFJ1bGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZjMwY2YuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9Gb2xkaW5nRXhwYW5kQWxsUnVsZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVZlcnRpY2FsUnVsZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuSUZvbGRpbmdDb21tYW5kSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RSdWxlckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UZXh0T3BlcmF0aW9uQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgRm9sZGluZ0V4cGFuZEFsbFJ1bGVyQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RSdWxlckFjdGlvbkRlbGVnYXRlIHsKLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0UnVsZXJBY3Rpb25EZWxlZ2F0ZSNjcmVhdGVBY3Rpb24ob3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvciwgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVZlcnRpY2FsUnVsZXJJbmZvKQotCSAqLwotCXByb3RlY3RlZCBJQWN0aW9uIGNyZWF0ZUFjdGlvbihJVGV4dEVkaXRvciBlZGl0b3IsIElWZXJ0aWNhbFJ1bGVySW5mbyBydWxlckluZm8pIHsKLQkJVGV4dE9wZXJhdGlvbkFjdGlvbiBhY3Rpb249IG5ldyBUZXh0T3BlcmF0aW9uQWN0aW9uKEFudEVkaXRvckFjdGlvbk1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCksICJQcm9qZWN0aW9uLkV4cGFuZEFsbC4iLCBlZGl0b3IsIFByb2plY3Rpb25WaWV3ZXIuRVhQQU5EX0FMTCwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJYWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChJRm9sZGluZ0NvbW1hbmRJZHMuRk9MRElOR19FWFBBTkRfQUxMKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL0ZvbGRpbmdUb2dnbGVSdWxlckFjdGlvbi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9Gb2xkaW5nVG9nZ2xlUnVsZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQzODY3MS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL0ZvbGRpbmdUb2dnbGVSdWxlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLkFudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVZlcnRpY2FsUnVsZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuSUZvbGRpbmdDb21tYW5kSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RSdWxlckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UZXh0T3BlcmF0aW9uQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgRm9sZGluZ1RvZ2dsZVJ1bGVyQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RSdWxlckFjdGlvbkRlbGVnYXRlIHsKLQotCXByaXZhdGUgSUFjdGlvbiBmVUlBY3Rpb247Ci0JcHJpdmF0ZSBUZXh0T3BlcmF0aW9uQWN0aW9uIGZBY3Rpb247Ci0JcHJpdmF0ZSBJVGV4dEVkaXRvciBmVGV4dEVkaXRvcjsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RSdWxlckFjdGlvbkRlbGVnYXRlI2NyZWF0ZUFjdGlvbihvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yLCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JVmVydGljYWxSdWxlckluZm8pCi0JICovCi0JcHJvdGVjdGVkIElBY3Rpb24gY3JlYXRlQWN0aW9uKElUZXh0RWRpdG9yIGVkaXRvciwgSVZlcnRpY2FsUnVsZXJJbmZvIHJ1bGVySW5mbykgewotCQlmVGV4dEVkaXRvcj0gZWRpdG9yOwotCQlmQWN0aW9uPSBuZXcgVGV4dE9wZXJhdGlvbkFjdGlvbihBbnRFZGl0b3JBY3Rpb25NZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLCAiUHJvamVjdGlvbi5Ub2dnbGUuIiwgZWRpdG9yLCBQcm9qZWN0aW9uVmlld2VyLlRPR0dMRSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJZkFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSUZvbGRpbmdDb21tYW5kSWRzLkZPTERJTkdfVE9HR0xFKTsKLQkJcmV0dXJuIGZBY3Rpb247Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVFZGl0b3Iob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJQWN0aW9uIGNhbGxlckFjdGlvbiwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCWZVSUFjdGlvbj0gY2FsbGVyQWN0aW9uOwotCQlzdXBlci5zZXRBY3RpdmVFZGl0b3IoY2FsbGVyQWN0aW9uLCB0YXJnZXRFZGl0b3IpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lciNtZW51QWJvdXRUb1Nob3cob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdXBkYXRlKCk7Ci0JCXN1cGVyLm1lbnVBYm91dFRvU2hvdyhtYW5hZ2VyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZSgpIHsKLQkJaWYgKGZUZXh0RWRpdG9yIGluc3RhbmNlb2YgQW50RWRpdG9yKSB7Ci0JCQlJU291cmNlVmlld2VyIHZpZXdlcj0gKChBbnRFZGl0b3IpIGZUZXh0RWRpdG9yKS5nZXRWaWV3ZXIoKTsKLQkJCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBQcm9qZWN0aW9uVmlld2VyKSB7Ci0JCQkJYm9vbGVhbiBlbmFibGVkPSAoKFByb2plY3Rpb25WaWV3ZXIpIHZpZXdlcikuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpICE9IG51bGw7Ci0JCQkJZlVJQWN0aW9uLnNldENoZWNrZWQoZW5hYmxlZCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL09wZW5EZWNsYXJhdGlvbkFjdGlvbi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9PcGVuRGVjbGFyYXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUyMmJiZS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL09wZW5EZWNsYXJhdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5BbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLmFjdGlvbnMuSUphdmFFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5hY3Rpb25zLk9wZW5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuY29tbWFuZHMuQWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLklIYW5kbGVyU2VydmljZTsKLQotcHVibGljIGNsYXNzIE9wZW5EZWNsYXJhdGlvbkFjdGlvbiBleHRlbmRzIE9wZW5BY3Rpb24gewotCQotCXByaXZhdGUgQW50RWRpdG9yIGZFZGl0b3I7Ci0JCi0JcHVibGljIE9wZW5EZWNsYXJhdGlvbkFjdGlvbihBbnRFZGl0b3IgYW50RWRpdG9yKSB7Ci0JCXN1cGVyKGFudEVkaXRvci5nZXRTaXRlKCkpOwotCQlmRWRpdG9yPSBhbnRFZGl0b3I7Ci0JCXNldEFjdGlvbkRlZmluaXRpb25JZChJSmF2YUVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuT1BFTl9FRElUT1IpOwotCQlJSGFuZGxlclNlcnZpY2UgaGFuZGxlclNlcnZlcj0gKElIYW5kbGVyU2VydmljZSkgYW50RWRpdG9yLmdldFNpdGUoKS5nZXRTZXJ2aWNlKElIYW5kbGVyU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIGhhbmRsZXJTZXJ2ZXIuYWN0aXZhdGVIYW5kbGVyKElKYXZhRWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5PUEVOX0VESVRPUiwgbmV3IEFjdGlvbkhhbmRsZXIodGhpcykpOwotCi0JCXNldFRleHQoQW50RWRpdG9yQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJPcGVuRGVjbGFyYXRpb25BY3Rpb24uMCIpKTsgIC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oQW50RWRpdG9yQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJPcGVuRGVjbGFyYXRpb25BY3Rpb24uMSIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUb29sVGlwVGV4dChBbnRFZGl0b3JBY3Rpb25NZXNzYWdlcy5nZXRTdHJpbmcoIk9wZW5EZWNsYXJhdGlvbkFjdGlvbi4xIikpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoZkVkaXRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWZFZGl0b3Iub3BlblJlZmVyZW5jZUVsZW1lbnQoKTsJCQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkuYWN0aW9ucy5TZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2V0RW5hYmxlZChmRWRpdG9yICE9IG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRFZGl0b3IoQW50RWRpdG9yIGVkaXRvcikgewotCQlmRWRpdG9yPSBlZGl0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9SZW5hbWVJbkZpbGVBY3Rpb24uamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL2FjdGlvbnMvUmVuYW1lSW5GaWxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOTljNTYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9SZW5hbWVJbkZpbGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuQW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuRWRpdG9yU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuT2NjdXJyZW5jZXNGaW5kZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLmFjdGlvbnMuU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLkxpbmtlZE1vZGVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkTW9kZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5MaW5rZWRQb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkUG9zaXRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IubGluay5FZGl0b3JMaW5rZWRNb2RlVUk7Ci0KLXB1YmxpYyBjbGFzcyBSZW5hbWVJbkZpbGVBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiB7Ci0JCi0JcHJpdmF0ZSBBbnRFZGl0b3IgZkVkaXRvcjsKLQkKLQlwdWJsaWMgUmVuYW1lSW5GaWxlQWN0aW9uKEFudEVkaXRvciBhbnRFZGl0b3IpIHsKLQkJc3VwZXIoYW50RWRpdG9yLmdldFNpdGUoKSk7Ci0JCWZFZGl0b3I9IGFudEVkaXRvcjsKLQkJc2V0VGV4dChBbnRFZGl0b3JBY3Rpb25NZXNzYWdlcy5nZXRTdHJpbmcoIlJlbmFtZUluRmlsZUFjdGlvbi4wIikpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKEFudEVkaXRvckFjdGlvbk1lc3NhZ2VzLmdldFN0cmluZygiUmVuYW1lSW5GaWxlQWN0aW9uLjEiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VG9vbFRpcFRleHQoQW50RWRpdG9yQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJSZW5hbWVJbkZpbGVBY3Rpb24uMiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGZFZGl0b3IgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlJU291cmNlVmlld2VyIHZpZXdlcj0gZkVkaXRvci5nZXRWaWV3ZXIoKTsKLQkJSURvY3VtZW50IGRvY3VtZW50PSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJaW50IG9mZnNldD0gKChJVGV4dFNlbGVjdGlvbilnZXRTZWxlY3Rpb24oKSkuZ2V0T2Zmc2V0KCk7Ci0JCUxpbmtlZFBvc2l0aW9uR3JvdXAgZ3JvdXA9IG5ldyBMaW5rZWRQb3NpdGlvbkdyb3VwKCk7Ci0JCU9jY3VycmVuY2VzRmluZGVyIGZpbmRlcj0gbmV3IE9jY3VycmVuY2VzRmluZGVyKGZFZGl0b3IsIGZFZGl0b3IuZ2V0QW50TW9kZWwoKSwgZG9jdW1lbnQsIG9mZnNldCk7Ci0JCUxpc3QgcG9zaXRpb25zPSBmaW5kZXIucGVyZm9ybSgpOwotCQlpZiAocG9zaXRpb25zID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQotCQlhZGRQb3NpdGlvbnNUb0dyb3VwKG9mZnNldCwgcG9zaXRpb25zLCBkb2N1bWVudCwgZ3JvdXApOwotCQlpZiAoZ3JvdXAuaXNFbXB0eSgpKSB7Ci0JCSAgICByZXR1cm47ICAgICAgICAgCi0gICAgICAgIH0KLQkJdHJ5IHsKLQkJCUxpbmtlZE1vZGVNb2RlbCBtb2RlbD0gbmV3IExpbmtlZE1vZGVNb2RlbCgpOwotCQkJbW9kZWwuYWRkR3JvdXAoZ3JvdXApOwotCQkJbW9kZWwuZm9yY2VJbnN0YWxsKCk7Ci0gICAgICAgICAgICBtb2RlbC5hZGRMaW5raW5nTGlzdGVuZXIobmV3IEVkaXRvclN5bmNocm9uaXplcihmRWRpdG9yKSk7Ci0JCQlMaW5rZWRNb2RlVUkgdWk9IG5ldyBFZGl0b3JMaW5rZWRNb2RlVUkobW9kZWwsIHZpZXdlcik7Ci0JCQl1aS5zZXRFeGl0UG9zaXRpb24odmlld2VyLCBvZmZzZXQsIDAsIEludGVnZXIuTUFYX1ZBTFVFKTsKLQkJCXVpLmVudGVyKCk7Ci0JCQl2aWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShvZmZzZXQsIDApOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlBbnRVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQl9Ci0JCi0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFBvc2l0aW9uc1RvR3JvdXAoaW50IG9mZnNldCwgTGlzdCBwb3NpdGlvbnMsIElEb2N1bWVudCBkb2N1bWVudCwgTGlua2VkUG9zaXRpb25Hcm91cCBncm91cCkgewotICAgICAgICBJdGVyYXRvciBpdGVyPSBwb3NpdGlvbnMuaXRlcmF0b3IoKTsKLSAgICAgICAgaW50IGk9IDA7Ci0gICAgICAgIGludCBqPSAwOwotICAgICAgICBpbnQgZmlyc3RQb3NpdGlvbj0gLTE7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBQb3NpdGlvbiBwb3NpdGlvbiA9IChQb3NpdGlvbikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0UG9zaXRpb24gPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLm92ZXJsYXBzV2l0aChvZmZzZXQsIDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFBvc2l0aW9uPSBpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAuYWRkUG9zaXRpb24obmV3IExpbmtlZFBvc2l0aW9uKGRvY3VtZW50LCBwb3NpdGlvbi5nZXRPZmZzZXQoKSwgcG9zaXRpb24uZ2V0TGVuZ3RoKCksIGorKykpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZ3JvdXAuYWRkUG9zaXRpb24obmV3IExpbmtlZFBvc2l0aW9uKGRvY3VtZW50LCBwb3NpdGlvbi5nZXRPZmZzZXQoKSwgcG9zaXRpb24uZ2V0TGVuZ3RoKCksIGorKykpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaXJzdFBvc2l0aW9uOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQb3NpdGlvbiBwb3NpdGlvbj0gKFBvc2l0aW9uKSBwb3NpdGlvbnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGdyb3VwLmFkZFBvc2l0aW9uKG5ldyBMaW5rZWRQb3NpdGlvbihkb2N1bWVudCwgcG9zaXRpb24uZ2V0T2Zmc2V0KCksIHBvc2l0aW9uLmdldExlbmd0aCgpLCBqKyspKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIEFudFVJUGx1Z2luLmxvZyhiZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLmFjdGlvbnMuU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24jc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldEVuYWJsZWQoZkVkaXRvciAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIEFudCBlZGl0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY3Rpb24KLQkgKiBAcGFyYW0gZWRpdG9yIHRoZSBhbnQgZWRpdG9yIHRvIGRvIHRoZSByZW5hbWVzCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRpdG9yKEFudEVkaXRvciBlZGl0b3IpIHsKLQkJZkVkaXRvcj0gZWRpdG9yOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL1J1blRvTGluZUFkYXB0ZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL2FjdGlvbnMvUnVuVG9MaW5lQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDkwNjEwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL2FjdGlvbnMvUnVuVG9MaW5lQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcuZGVidWcuSUFudERlYnVnQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcuZGVidWcubW9kZWwuQW50RGVidWdFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcuZGVidWcubW9kZWwuQW50TGluZUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSURlYnVnVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVN1c3BlbmRSZXN1bWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JUnVuVG9MaW5lVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuUnVuVG9MaW5lSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotCi0vKioKLSAqIFJ1biB0byBsaW5lIHRhcmdldCBmb3IgdGhlIEFudCBkZWJ1Z2dlcgotICovCi1wdWJsaWMgY2xhc3MgUnVuVG9MaW5lQWRhcHRlciBpbXBsZW1lbnRzIElSdW5Ub0xpbmVUYXJnZXQgewotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVJ1blRvTGluZVRhcmdldCNydW5Ub0xpbmUob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbiwgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3VzcGVuZFJlc3VtZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW5Ub0xpbmUoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24sIElTdXNwZW5kUmVzdW1lIHRhcmdldCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gKElFZGl0b3JQYXJ0KXBhcnQ7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCWlmIChpbnB1dCA9PSBudWxsKSB7Ci0JCQllcnJvck1lc3NhZ2UgPSBBbnRFZGl0b3JBY3Rpb25NZXNzYWdlcy5nZXRTdHJpbmcoIlJ1blRvTGluZUFkYXB0ZXIuMCIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKWVkaXRvclBhcnQ7Ci0JCQlJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlcj0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQ9IHByb3ZpZGVyLmdldERvY3VtZW50KGlucHV0KTsKLQkJCQotCQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCQllcnJvck1lc3NhZ2UgPSBBbnRFZGl0b3JBY3Rpb25NZXNzYWdlcy5nZXRTdHJpbmcoIlJ1blRvTGluZUFkYXB0ZXIuMSIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCQotCQkJCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQlpbnQgbGluZU51bWJlciA9IHRleHRTZWxlY3Rpb24uZ2V0U3RhcnRMaW5lKCkgKyAxOwotCQkJCQotCQkJCUlCcmVha3BvaW50IGJyZWFrcG9pbnQ9IG51bGw7Ci0JCQkJTWFwIGF0dHJpYnV0ZXMgPSBnZXRSdW5Ub0xpbmVBdHRyaWJ1dGVzKCk7Ci0JCQkJSUZpbGUgZmlsZSA9IChJRmlsZSlpbnB1dC5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQkJICAgIGVycm9yTWVzc2FnZT0gQW50RWRpdG9yQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJSdW5Ub0xpbmVBZGFwdGVyLjIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSB7Ci0JCQkJICAgIGJyZWFrcG9pbnQ9IG5ldyBBbnRMaW5lQnJlYWtwb2ludChmaWxlLCBsaW5lTnVtYmVyLCBhdHRyaWJ1dGVzLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnQuc2V0UGVyc2lzdGVkKGZhbHNlKTsKLQkJCQkgICAgZXJyb3JNZXNzYWdlID0gQW50RWRpdG9yQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJSdW5Ub0xpbmVBZGFwdGVyLjMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCSAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJCSAgICAgICAgSURlYnVnVGFyZ2V0IGRlYnVnVGFyZ2V0ID0gKElEZWJ1Z1RhcmdldCkgKChJQWRhcHRhYmxlKXRhcmdldCkuZ2V0QWRhcHRlcihJRGVidWdUYXJnZXQuY2xhc3MpOwotCQkJCSAgICAgICAgaWYgKGRlYnVnVGFyZ2V0ICE9IG51bGwpIHsKLQkJCQkgICAgICAgICAgICBSdW5Ub0xpbmVIYW5kbGVyIGhhbmRsZXIgPSBuZXcgUnVuVG9MaW5lSGFuZGxlcihkZWJ1Z1RhcmdldCwgdGFyZ2V0LCBicmVha3BvaW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLnJ1bihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkgICAgICAgICAgICByZXR1cm47Ci0JCQkJICAgICAgICB9Ci0JCQkJICAgIH0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBbnRVSVBsdWdpbi5nZXRVbmlxdWVJZGVudGlmaWVyKCksIEFudFVJUGx1Z2luLklOVEVSTkFMX0VSUk9SLAotCQkJCWVycm9yTWVzc2FnZSwgbnVsbCkpOwotCX0KLQotICAgIHByaXZhdGUgTWFwIGdldFJ1blRvTGluZUF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIE1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgYXR0cmlidXRlcy5wdXQoSU1hcmtlci5UUkFOU0lFTlQsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIGF0dHJpYnV0ZXMucHV0KElBbnREZWJ1Z0NvbnN0YW50cy5BTlRfUlVOX1RPX0xJTkUsIEJvb2xlYW4uVFJVRSk7Ci0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzOwotICAgIH0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVJ1blRvTGluZVRhcmdldCNjYW5SdW5Ub0xpbmUob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbiwgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JU3VzcGVuZFJlc3VtZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SdW5Ub0xpbmUoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24sIElTdXNwZW5kUmVzdW1lIHRhcmdldCkgewotCSAgICByZXR1cm4gdGFyZ2V0IGluc3RhbmNlb2YgQW50RGVidWdFbGVtZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL2FjdGlvbnMvVG9nZ2xlQXV0b1JlY29uY2lsZUFjdGlvbi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9Ub2dnbGVBdXRvUmVjb25jaWxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OWFhMTUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9Ub2dnbGVBdXRvUmVjb25jaWxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLkFudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLkFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UZXh0RWRpdG9yQWN0aW9uOwotCi0vKioKLSAqIEEgdG9vbGJhciBhY3Rpb24gd2hpY2ggdG9nZ2xlcyB0aGUge0BsaW5rcGxhaW4gb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzI0VESVRPUl9SRUNPTkNJTEUgcHJlZmVyZW5jZX0uCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFRvZ2dsZUF1dG9SZWNvbmNpbGVBY3Rpb24gZXh0ZW5kcyBUZXh0RWRpdG9yQWN0aW9uIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCQkKLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZlN0b3JlOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhbmQgdXBkYXRlcyB0aGUgYWN0aW9uLgotCSAqLwotCXB1YmxpYyBUb2dnbGVBdXRvUmVjb25jaWxlQWN0aW9uKCkgewotCQlzdXBlcihBbnRFZGl0b3JBY3Rpb25NZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLCAiVG9nZ2xlQXV0b1JlY29uY2lsZUFjdGlvbi4iLCBudWxsLCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEFudFVJSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJQW50VUlDb25zdGFudHMuSU1HX1JFRlJFU0gpKTsKLQkJc2V0VG9vbFRpcFRleHQoQW50RWRpdG9yQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJUb2dnbGVBdXRvUmVjb25jaWxlQWN0aW9uLnRvb2x0aXAiKSk7CQkgLy8kTk9OLU5MUy0xJAotCQl1cGRhdGUoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUlUZXh0RWRpdG9yIGVkaXRvcj0gZ2V0VGV4dEVkaXRvcigpOwotICAgICAgICBpZiAoZWRpdG9yIGluc3RhbmNlb2YgQW50RWRpdG9yKSB7Ci0gICAgICAgICAgICBBbnRNb2RlbCBtb2RlbD0gKChBbnRFZGl0b3IpIGVkaXRvcikuZ2V0QW50TW9kZWwoKTsKLSAgICAgICAgICAgIG1vZGVsLnNldFNob3VsZFJlY29uY2lsZShpc0NoZWNrZWQoKSk7Ci0gICAgICAgICAgICBmU3RvcmUuc2V0VmFsdWUoQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfUkVDT05DSUxFLCBpc0NoZWNrZWQoKSk7Ci0gICAgICAgIH0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlI3VwZGF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlJVGV4dEVkaXRvciBlZGl0b3I9IGdldFRleHRFZGl0b3IoKTsKLQkJCi0JCWJvb2xlYW4gY2hlY2tlZD0gZmFsc2U7Ci0JCWJvb2xlYW4gZW5hYmxlZD0gZmFsc2U7Ci0JCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBBbnRFZGl0b3IpIHsKLSAgICAgICAgICAgIEFudE1vZGVsIG1vZGVsPSAoKEFudEVkaXRvcillZGl0b3IpLmdldEFudE1vZGVsKCk7Ci0gICAgICAgICAgICBlbmFibGVkPSAgbW9kZWwgIT0gbnVsbDsKLQkJCWNoZWNrZWQ9IGVuYWJsZWQgJiYgZlN0b3JlLmdldEJvb2xlYW4oQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfUkVDT05DSUxFKTsKLSAgICAgICAgICAgIGlmIChtb2RlbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0U2hvdWxkUmVjb25jaWxlKGNoZWNrZWQpOwotICAgICAgICAgICAgfQotCQl9Ci0JCQkKLQkJc2V0Q2hlY2tlZChjaGVja2VkKTsKLQkJc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIFRleHRFZGl0b3JBY3Rpb24jc2V0RWRpdG9yKElUZXh0RWRpdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRvcihJVGV4dEVkaXRvciBlZGl0b3IpIHsKLQkJCi0JCXN1cGVyLnNldEVkaXRvcihlZGl0b3IpOwotCQkKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQlpZiAoZlN0b3JlID09IG51bGwpIHsKLQkJCQlmU3RvcmU9IEFudFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCQlmU3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChmU3RvcmUgIT0gbnVsbCkgewotCQkJZlN0b3JlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQlmU3RvcmU9IG51bGw7Ci0JCX0KLQkJCi0JCXVwZGF0ZSgpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9SRUNPTkNJTEUpKSB7Ci0JCQlzZXRDaGVja2VkKEJvb2xlYW4udmFsdWVPZihldmVudC5nZXROZXdWYWx1ZSgpLnRvU3RyaW5nKCkpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL1RvZ2dsZU1hcmtPY2N1cnJlbmNlc0FjdGlvbi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvYWN0aW9ucy9Ub2dnbGVNYXJrT2NjdXJyZW5jZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU3OWYwZC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL1RvZ2dsZU1hcmtPY2N1cnJlbmNlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuYWN0aW9uczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuQW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5BbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGV4dEVkaXRvckFjdGlvbjsKLQotCi0vKioKLSAqIEEgdG9vbGJhciBhY3Rpb24gd2hpY2ggdG9nZ2xlcyB0aGUge0BsaW5rcGxhaW4gb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzI0VESVRPUl9NQVJLX09DQ1VSUkVOQ0VTIG1hcmsgb2NjdXJyZW5jZXMgcHJlZmVyZW5jZX0uCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFRvZ2dsZU1hcmtPY2N1cnJlbmNlc0FjdGlvbiBleHRlbmRzIFRleHRFZGl0b3JBY3Rpb24gaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JCQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBmU3RvcmU7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGFuZCB1cGRhdGVzIHRoZSBhY3Rpb24uCi0JICovCi0JcHVibGljIFRvZ2dsZU1hcmtPY2N1cnJlbmNlc0FjdGlvbigpIHsKLQkJc3VwZXIoQW50RWRpdG9yQWN0aW9uTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKSwgIlRvZ2dsZU1hcmtPY2N1cnJlbmNlc0FjdGlvbi4iLCBudWxsLCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEFudFVJSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJQW50VUlDb25zdGFudHMuSU1HX01BUktfT0NDVVJSRU5DRVMpKTsKLQkJc2V0VG9vbFRpcFRleHQoQW50RWRpdG9yQWN0aW9uTWVzc2FnZXMuZ2V0U3RyaW5nKCJUb2dnbGVNYXJrT2NjdXJyZW5jZXNBY3Rpb24udG9vbHRpcCIpKTsJCSAvLyROT04tTkxTLTEkCi0JCXVwZGF0ZSgpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSUFjdGlvbiNhY3Rpb25QZXJmb3JtZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWZTdG9yZS5zZXRWYWx1ZShBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9NQVJLX09DQ1VSUkVOQ0VTLCBpc0NoZWNrZWQoKSk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBUZXh0RWRpdG9yQWN0aW9uI3VwZGF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJSVRleHRFZGl0b3IgZWRpdG9yPSBnZXRUZXh0RWRpdG9yKCk7Ci0JCQotCQlib29sZWFuIGNoZWNrZWQ9IGZhbHNlOwotCQlib29sZWFuIGVuYWJsZWQ9IGZhbHNlOwotCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgQW50RWRpdG9yKSB7Ci0JCQljaGVja2VkPSAoKEFudEVkaXRvcillZGl0b3IpLmlzTWFya2luZ09jY3VycmVuY2VzKCk7Ci0JCQllbmFibGVkPSAoKEFudEVkaXRvcillZGl0b3IpLmdldEFudE1vZGVsKCkgIT0gbnVsbDsKLQkJfQotCQkJCi0JCXNldENoZWNrZWQoY2hlY2tlZCk7Ci0JCXNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBUZXh0RWRpdG9yQWN0aW9uI3NldEVkaXRvcihJVGV4dEVkaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0b3IoSVRleHRFZGl0b3IgZWRpdG9yKSB7Ci0JCQotCQlzdXBlci5zZXRFZGl0b3IoZWRpdG9yKTsKLQkJCi0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCi0JCQlpZiAoZlN0b3JlID09IG51bGwpIHsKLQkJCQlmU3RvcmU9IEFudFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCQlmU3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJCQotCQl9IGVsc2UgaWYgKGZTdG9yZSAhPSBudWxsKSB7Ci0JCQlmU3RvcmUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCWZTdG9yZT0gbnVsbDsKLQkJfQotCQkKLQkJdXBkYXRlKCk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX01BUktfT0NDVVJSRU5DRVMpKQotCQkJc2V0Q2hlY2tlZChCb29sZWFuLnZhbHVlT2YoZXZlbnQuZ2V0TmV3VmFsdWUoKS50b1N0cmluZygpKS5ib29sZWFuVmFsdWUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL2FjdGlvbnMvVG9nZ2xlUHJlc2VudGF0aW9uQWN0aW9uLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9hY3Rpb25zL1RvZ2dsZVByZXNlbnRhdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDY2NmVlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL2FjdGlvbnMvVG9nZ2xlUHJlc2VudGF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLkFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGV4dEVkaXRvckFjdGlvbjsKLQotLyoqCi0gKiBBIHRvb2wgYmFyIGFjdGlvbiB3aGljaCB0b2dnbGVzIHRoZSBwcmVzZW50YXRpb24gbW9kZWwgb2YgdGhlCi0gKiBjb25uZWN0ZWQgdGV4dCBlZGl0b3IuIFRoZSBlZGl0b3Igc2hvd3MgZWl0aGVyIHRoZSBoaWdobGlnaHQgcmFuZ2UKLSAqIG9ubHkgb3IgYWx3YXlzIHRoZSB3aG9sZSBkb2N1bWVudC4KLSAqLwotcHVibGljIGNsYXNzIFRvZ2dsZVByZXNlbnRhdGlvbkFjdGlvbiBleHRlbmRzIFRleHRFZGl0b3JBY3Rpb24gaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JCQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBmU3RvcmU7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGFuZCB1cGRhdGVzIHRoZSBhY3Rpb24uCi0JICovCi0JcHVibGljIFRvZ2dsZVByZXNlbnRhdGlvbkFjdGlvbigpIHsKLQkJc3VwZXIoQW50RWRpdG9yQWN0aW9uTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKSwgIlRvZ2dsZVByZXNlbnRhdGlvbi4iLCBudWxsLCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEFudFVJSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJQW50VUlDb25zdGFudHMuSU1HX1NFR01FTlRfRURJVCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCi0JCUlUZXh0RWRpdG9yIGVkaXRvcj0gZ2V0VGV4dEVkaXRvcigpOwotCQlpZiAoZWRpdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCQkKLQkJSVJlZ2lvbiByZW1lbWJlcmVkPSBlZGl0b3IuZ2V0SGlnaGxpZ2h0UmFuZ2UoKTsKLQkJZWRpdG9yLnJlc2V0SGlnaGxpZ2h0UmFuZ2UoKTsKLQkJCi0JCWJvb2xlYW4gc2hvd0FsbD0gIWVkaXRvci5zaG93c0hpZ2hsaWdodFJhbmdlT25seSgpOwotCQlzZXRDaGVja2VkKHNob3dBbGwpOwotCQkKLQkJZWRpdG9yLnNob3dIaWdobGlnaHRSYW5nZU9ubHkoc2hvd0FsbCk7Ci0JCWlmIChyZW1lbWJlcmVkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVkaXRvci5zZXRIaWdobGlnaHRSYW5nZShyZW1lbWJlcmVkLmdldE9mZnNldCgpLCByZW1lbWJlcmVkLmdldExlbmd0aCgpLCB0cnVlKTsKLSAgICAgICAgfQotCQkKLQkJZlN0b3JlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCWZTdG9yZS5zZXRWYWx1ZShBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSE9XX1NFR01FTlRTLCBzaG93QWxsKTsKLQkJZlN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZSN1cGRhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJSVRleHRFZGl0b3IgZWRpdG9yPSBnZXRUZXh0RWRpdG9yKCk7Ci0JCWJvb2xlYW4gY2hlY2tlZD0gKGVkaXRvciAhPSBudWxsICYmIGVkaXRvci5zaG93c0hpZ2hsaWdodFJhbmdlT25seSgpKTsKLQkJc2V0Q2hlY2tlZChjaGVja2VkKTsKLQkJc2V0RW5hYmxlZChlZGl0b3IgIT0gbnVsbCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGV4dEVkaXRvckFjdGlvbiNzZXRFZGl0b3Iob3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0b3IoSVRleHRFZGl0b3IgZWRpdG9yKSB7Ci0JCQotCQlzdXBlci5zZXRFZGl0b3IoZWRpdG9yKTsKLQkJCi0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCi0JCQlpZiAoZlN0b3JlID09IG51bGwpIHsKLQkJCQlmU3RvcmU9IEFudFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCQlmU3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJCXN5bmNocm9uaXplV2l0aFByZWZlcmVuY2UoZWRpdG9yKTsKLQkJCQotCQl9IGVsc2UgaWYgKGZTdG9yZSAhPSBudWxsKSB7Ci0JCQlmU3RvcmUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCWZTdG9yZT0gbnVsbDsKLQkJfQotCQkKLQkJdXBkYXRlKCk7Ci0JfQotCQotCS8qKgotCSAqIFN5bmNocm9uaXplcyB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgZWRpdG9yIHdpdGggd2hhdCB0aGUgcHJlZmVyZW5jZSBzdG9yZSBpbmRpY2F0ZXMKLQkgKiAKLQkgKiBAcGFyYW0gZWRpdG9yIHRoZSB0ZXh0IGVkaXRvcgotCSAqLwotCXByaXZhdGUgdm9pZCBzeW5jaHJvbml6ZVdpdGhQcmVmZXJlbmNlKElUZXh0RWRpdG9yIGVkaXRvcikgewotCQkKLQkJaWYgKGVkaXRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWJvb2xlYW4gc2hvd1NlZ21lbnRzPSBmU3RvcmUuZ2V0Qm9vbGVhbihBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSE9XX1NFR01FTlRTKTsJCQkKLQkJc2V0Q2hlY2tlZChzaG93U2VnbWVudHMpOwotCQkKLQkJaWYgKGVkaXRvci5zaG93c0hpZ2hsaWdodFJhbmdlT25seSgpICE9IHNob3dTZWdtZW50cykgewotCQkJSVJlZ2lvbiByZW1lbWJlcmVkPSBlZGl0b3IuZ2V0SGlnaGxpZ2h0UmFuZ2UoKTsKLQkJCWVkaXRvci5yZXNldEhpZ2hsaWdodFJhbmdlKCk7Ci0JCQllZGl0b3Iuc2hvd0hpZ2hsaWdodFJhbmdlT25seShzaG93U2VnbWVudHMpOwotCQkJaWYgKHJlbWVtYmVyZWQgIT0gbnVsbCkgewotCQkJCWVkaXRvci5zZXRIaWdobGlnaHRSYW5nZShyZW1lbWJlcmVkLmdldE9mZnNldCgpLCByZW1lbWJlcmVkLmdldExlbmd0aCgpLCB0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2Uob3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NIT1dfU0VHTUVOVFMpKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZVdpdGhQcmVmZXJlbmNlKGdldFRleHRFZGl0b3IoKSk7Ci0gICAgICAgIH0KLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9mb3JtYXR0ZXIvWG1sRG9jdW1lbnRGb3JtYXR0aW5nU3RyYXRlZ3kuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL2Zvcm1hdHRlci9YbWxEb2N1bWVudEZvcm1hdHRpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGNkZDY5Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL2Zvcm1hdHRlci9YbWxEb2N1bWVudEZvcm1hdHRpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBKb2huLU1hc29uIFAuIFNoYWNrZWxmb3JkIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEpvaG4tTWFzb24gUC4gU2hhY2tlbGZvcmQgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAkgICBJQk0gQ29ycG9yYXRpb24gLSBidWcgNTIwNzYKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuZm9ybWF0dGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Db250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklGb3JtYXR0aW5nQ29udGV4dDsKLQotcHVibGljIGNsYXNzIFhtbERvY3VtZW50Rm9ybWF0dGluZ1N0cmF0ZWd5IGV4dGVuZHMgQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5IHsKLSAKLQkvKiogRG9jdW1lbnRzIHRvIGJlIGZvcm1hdHRlZCBieSB0aGlzIHN0cmF0ZWd5ICovCi0JcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0IGZEb2N1bWVudHM9IG5ldyBMaW5rZWRMaXN0KCk7Ci0gICAgCi0JLyoqIGFjY2VzcyB0byB0aGUgcHJlZmVyZW5jZXMgc3RvcmUgKiAqLwotCXByaXZhdGUgRm9ybWF0dGluZ1ByZWZlcmVuY2VzIHByZWZzOyAKLQkKLQlwcml2YXRlIGludCBpbmRlbnQ9IC0xOwotCQotCXB1YmxpYyBYbWxEb2N1bWVudEZvcm1hdHRpbmdTdHJhdGVneSgpIHsKLQkgICAgdGhpcy5wcmVmcyA9IG5ldyBGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKTsKLSAgICB9Ci0gCi0JcHVibGljIFhtbERvY3VtZW50Rm9ybWF0dGluZ1N0cmF0ZWd5KEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBwcmVmcywgaW50IGluZGVudCkgewotCSAgICBBc3NlcnQuaXNOb3ROdWxsKHByZWZzKTsKLQkgICAgdGhpcy5wcmVmcyA9IHByZWZzOwotCSAgICB0aGlzLmluZGVudD0gaW5kZW50OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5JRm9ybWF0dGluZ1N0cmF0ZWd5RXh0ZW5zaW9uI2Zvcm1hdCgpCi0JICovCi0JcHVibGljIHZvaWQgZm9ybWF0KCkgewotIAotICAgICAgICBzdXBlci5mb3JtYXQoKTsKLSAgICAgCWZpbmFsIElEb2N1bWVudCBkb2N1bWVudD0gKElEb2N1bWVudClmRG9jdW1lbnRzLnJlbW92ZUZpcnN0KCk7Ci0JCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JICAgICAgICAvLyBUT0RPIGFsbG93IGZvcm1hdHRpbmcgb2YgcmVnaW9ucywgbm90IGp1c3QgdGhlIGVudGlyZSBkb2N1bWVudDsgYnVnIDc1NjExCi0JICAgICAgICBTdHJpbmcgZG9jdW1lbnRUZXh0ID0gZG9jdW1lbnQuZ2V0KCk7Ci0JICAgICAgICBYbWxEb2N1bWVudEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBuZXcgWG1sRG9jdW1lbnRGb3JtYXR0ZXIoKTsKLQkgICAgICAgIGlmIChpbmRlbnQgIT0gLTEpIHsKLQkgICAgICAgIAlmb3JtYXR0ZXIuc2V0SW5pdGlhbEluZGVudChpbmRlbnQpOwotCSAgICAgICAgfQotICAgICAgICAgICAgZm9ybWF0dGVyLnNldERlZmF1bHRMaW5lRGVsaW1pdGVyKFRleHRVdGlsaXRpZXMuZ2V0RGVmYXVsdExpbmVEZWxpbWl0ZXIoZG9jdW1lbnQpKTsKLQkgICAgICAgIFN0cmluZyBmb3JtYXR0ZWRUZXh0ID0gZm9ybWF0dGVyLmZvcm1hdChkb2N1bWVudFRleHQsIHRoaXMucHJlZnMpOwotCSAgICAgICAgaWYgKGZvcm1hdHRlZFRleHQgIT0gbnVsbCAmJiAhZm9ybWF0dGVkVGV4dC5lcXVhbHMoZG9jdW1lbnRUZXh0KSkgewotCSAgICAgICAgCWRvY3VtZW50LnNldChmb3JtYXR0ZWRUZXh0KTsKLQkgICAgICAgIH0KLQkJfQotICAgICB9Ci0gICAgIAotICAgICAvKgotIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSNmb3JtYXR0ZXJTdGFydHMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUZvcm1hdHRpbmdDb250ZXh0KQotIAkgKi8KLSAJcHVibGljIHZvaWQgZm9ybWF0dGVyU3RhcnRzKGZpbmFsIElGb3JtYXR0aW5nQ29udGV4dCBjb250ZXh0KSB7Ci0gCQlzdXBlci5mb3JtYXR0ZXJTdGFydHMoY29udGV4dCk7Ci0gCQkKLSAJCWZEb2N1bWVudHMuYWRkTGFzdChjb250ZXh0LmdldFByb3BlcnR5KEZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllcy5DT05URVhUX01FRElVTSkpOwotIAl9Ci0KLSAJLyoKLSAJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Db250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3kjZm9ybWF0dGVyU3RvcHMoKQotIAkgKi8KLSAJcHVibGljIHZvaWQgZm9ybWF0dGVyU3RvcHMoKSB7Ci0gCQlzdXBlci5mb3JtYXR0ZXJTdG9wcygpOwotCi0gCQlmRG9jdW1lbnRzLmNsZWFyKCk7Ci0gCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9mb3JtYXR0ZXIvWG1sRWxlbWVudEZvcm1hdHRpbmdTdHJhdGVneS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvZm9ybWF0dGVyL1htbEVsZW1lbnRGb3JtYXR0aW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBjNTM0MS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9mb3JtYXR0ZXIvWG1sRWxlbWVudEZvcm1hdHRpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBKb2huLU1hc29uIFAuIFNoYWNrZWxmb3JkIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAJICAgSUJNIENvcnBvcmF0aW9uIC0gYnVnIDUyMDc2LCBidWcgODQzNDIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuZm9ybWF0dGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlR5cGVkUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5JRm9ybWF0dGluZ0NvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBYbWxFbGVtZW50Rm9ybWF0dGluZ1N0cmF0ZWd5IGV4dGVuZHMgQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5IHsKLQotICAgIC8qKiBhY2Nlc3MgdG8gdGhlIHByZWZlcmVuY2VzIHN0b3JlICogKi8KLSAgICBwcml2YXRlIGZpbmFsIEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBwcmVmczsKLSAgICAKLSAgICAvKiogRG9jdW1lbnRzIHRvIGJlIGZvcm1hdHRlZCBieSB0aGlzIHN0cmF0ZWd5ICovCi0JcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0IGZEb2N1bWVudHM9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JLyoqIFBhcnRpdGlvbnMgdG8gYmUgZm9ybWF0dGVkIGJ5IHRoaXMgc3RyYXRlZ3kgKi8KLQlwcml2YXRlIGZpbmFsIExpbmtlZExpc3QgZlBhcnRpdGlvbnM9IG5ldyBMaW5rZWRMaXN0KCk7Ci0KLSAgICBwdWJsaWMgWG1sRWxlbWVudEZvcm1hdHRpbmdTdHJhdGVneSgpIHsKLSAgICAgICAgdGhpcy5wcmVmcyA9IG5ldyBGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgWG1sRWxlbWVudEZvcm1hdHRpbmdTdHJhdGVneShGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnMpIHsKLSAgICAgICAgQXNzZXJ0LmlzTm90TnVsbChwcmVmcyk7Ci0gICAgICAgIHRoaXMucHJlZnM9cHJlZnM7Ci0gICAgfQotICAgIAotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUZvcm1hdHRpbmdTdHJhdGVneUV4dGVuc2lvbiNmb3JtYXQoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZvcm1hdCgpIHsKLQotICAgICAgICBzdXBlci5mb3JtYXQoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAJZmluYWwgSURvY3VtZW50IGRvY3VtZW50PSAoSURvY3VtZW50KWZEb2N1bWVudHMucmVtb3ZlRmlyc3QoKTsKLQkJZmluYWwgVHlwZWRQb3NpdGlvbiBwYXJ0aXRpb249IChUeXBlZFBvc2l0aW9uKWZQYXJ0aXRpb25zLnJlbW92ZUZpcnN0KCk7Ci0JCQotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCB8fCBwYXJ0aXRpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyBmb3JtYXR0ZWQgPSBmb3JtYXRFbGVtZW50KGRvY3VtZW50LCBwYXJ0aXRpb24pOwotICAgICAgICAgICAgU3RyaW5nIHBhcnRpdGlvblRleHQgPSBkb2N1bWVudC5nZXQocGFydGl0aW9uLmdldE9mZnNldCgpLAotICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb24uZ2V0TGVuZ3RoKCkpOwotCi0gICAgICAgICAgICBpZiAoZm9ybWF0dGVkICE9IG51bGwgJiYgIWZvcm1hdHRlZC5lcXVhbHMocGFydGl0aW9uVGV4dCkpIHsKLSAgICAgICAgICAgICAgICBkb2N1bWVudC5yZXBsYWNlKHBhcnRpdGlvbi5nZXRPZmZzZXQoKSwgcGFydGl0aW9uLmdldExlbmd0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBmb3JtYXRFbGVtZW50KElEb2N1bWVudCBkb2N1bWVudCwgVHlwZWRQb3NpdGlvbiBwYXJ0aXRpb24pCi0gICAgICAgICAgICB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBwYXJ0aXRpb25UZXh0ID0gZG9jdW1lbnQuZ2V0KHBhcnRpdGlvbi5nZXRPZmZzZXQoKSwgcGFydGl0aW9uLmdldExlbmd0aCgpKTsKLQotICAgICAgICBJUmVnaW9uIGxpbmUgPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChwYXJ0aXRpb24uZ2V0T2Zmc2V0KCkpOwotCi0gICAgICAgIGludCBpbmRlbnRMZW5ndGggPSBwYXJ0aXRpb24uZ2V0T2Zmc2V0KCkgLSBsaW5lLmdldE9mZnNldCgpOwotICAgICAgICBTdHJpbmcgbGluZURlbGltaXRlcj0gZG9jdW1lbnQuZ2V0TGluZURlbGltaXRlcihkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQobGluZS5nZXRPZmZzZXQoKSkpOwotICAgICAgICBpZiAobGluZURlbGltaXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsaW5lRGVsaW1pdGVyPSBUZXh0VXRpbGl0aWVzLmdldERlZmF1bHRMaW5lRGVsaW1pdGVyKGRvY3VtZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gWG1sVGFnRm9ybWF0dGVyLmZvcm1hdChwYXJ0aXRpb25UZXh0LCBwcmVmcywgZG9jdW1lbnQuZ2V0KGxpbmUuZ2V0T2Zmc2V0KCksIGluZGVudExlbmd0aCksIGxpbmVEZWxpbWl0ZXIpOwotCi0gICAgfQotCi0gICAgLyoKLSAJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Db250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3kjZm9ybWF0dGVyU3RhcnRzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklGb3JtYXR0aW5nQ29udGV4dCkKLSAJICovCi0gCXB1YmxpYyB2b2lkIGZvcm1hdHRlclN0YXJ0cyhmaW5hbCBJRm9ybWF0dGluZ0NvbnRleHQgY29udGV4dCkgewotIAkJc3VwZXIuZm9ybWF0dGVyU3RhcnRzKGNvbnRleHQpOwotIAkJCi0gCQlmUGFydGl0aW9ucy5hZGRMYXN0KGNvbnRleHQuZ2V0UHJvcGVydHkoRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzLkNPTlRFWFRfUEFSVElUSU9OKSk7Ci0gCQlmRG9jdW1lbnRzLmFkZExhc3QoY29udGV4dC5nZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9NRURJVU0pKTsKLSAJfQotCi0gCS8qCi0gCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5I2Zvcm1hdHRlclN0b3BzKCkKLSAJICovCi0gCXB1YmxpYyB2b2lkIGZvcm1hdHRlclN0b3BzKCkgewotIAkJc3VwZXIuZm9ybWF0dGVyU3RvcHMoKTsKLQotIAkJZlBhcnRpdGlvbnMuY2xlYXIoKTsKLSAJCWZEb2N1bWVudHMuY2xlYXIoKTsKLSAJfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL2Zvcm1hdHRlci9YbWxUYWdGb3JtYXR0ZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL2Zvcm1hdHRlci9YbWxUYWdGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmNGE2OS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9mb3JtYXR0ZXIvWG1sVGFnRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBKb2huLU1hc29uIFAuIFNoYWNrZWxmb3JkIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEpvaG4tTWFzb24gUC4gU2hhY2tlbGZvcmQgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBCdWcgNzM0MTEsIDg0MzQyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3I7Ci1pbXBvcnQgamF2YS50ZXh0LlN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFhtbFRhZ0Zvcm1hdHRlciB7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEF0dHJpYnV0ZVBhaXIgewotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGZBdHRyaWJ1dGU7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIGZWYWx1ZTsKLSAgICAgICAgcHJpdmF0ZSBjaGFyIGZRdW90ZTsKLQotICAgICAgICBwdWJsaWMgQXR0cmlidXRlUGFpcihTdHJpbmcgYXR0cmlidXRlLCBTdHJpbmcgdmFsdWUsIGNoYXIgYXR0cmlidXRlUXVvdGUpIHsKLSAgICAgICAgICAgIGZBdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7Ci0gICAgICAgICAgICBmVmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgICAgIGZRdW90ZT0gYXR0cmlidXRlUXVvdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBmQXR0cmlidXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBmVmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBjaGFyIGdldFF1b3RlKCkgewotICAgICAgICAgICAgcmV0dXJuIGZRdW90ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotICAgIAkKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJcHVibGljIFBhcnNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVGFnIHsKLQotICAgICAgICBwcml2YXRlIExpc3QgZkF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGZDbG9zZWQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZkVsZW1lbnROYW1lOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlLCBTdHJpbmcgdmFsdWUsIGNoYXIgcXVvdGUpIHsKLSAgICAgICAgICAgIGZBdHRyaWJ1dGVzLmFkZChuZXcgQXR0cmlidXRlUGFpcihhdHRyaWJ1dGUsIHZhbHVlLCBxdW90ZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBhdHRyaWJ1dGVDb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBmQXR0cmlidXRlcy5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQXR0cmlidXRlUGFpciBnZXRBdHRyaWJ1dGVQYWlyKGludCBpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKEF0dHJpYnV0ZVBhaXIpIGZBdHRyaWJ1dGVzLmdldChpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5mRWxlbWVudE5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBmQ2xvc2VkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBtaW5pbXVtTGVuZ3RoKCkgewotICAgICAgICAgICAgaW50IGxlbmd0aCA9IDI7IC8vIGZvciB0aGUgPCA+Ci0gICAgICAgICAgICBpZiAodGhpcy5pc0Nsb3NlZCgpKSBsZW5ndGgrKzsgLy8gaWYgd2UgbmVlZCB0byBhZGQgYW4gLz4KLSAgICAgICAgICAgIGxlbmd0aCArPSB0aGlzLmdldEVsZW1lbnROYW1lKCkubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAodGhpcy5hdHRyaWJ1dGVDb3VudCgpID4gMCB8fCB0aGlzLmlzQ2xvc2VkKCkpIGxlbmd0aCsrOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmF0dHJpYnV0ZUNvdW50KCk7IGkrKykgewotICAgICAgICAgICAgICAgIEF0dHJpYnV0ZVBhaXIgYXR0cmlidXRlUGFpciA9IHRoaXMuZ2V0QXR0cmlidXRlUGFpcihpKTsKLSAgICAgICAgICAgICAgICBsZW5ndGggKz0gYXR0cmlidXRlUGFpci5nZXRBdHRyaWJ1dGUoKS5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBsZW5ndGggKz0gYXR0cmlidXRlUGFpci5nZXRWYWx1ZSgpLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgIGxlbmd0aCArPSA0OyAvLyBlcXVhbHMgc2lnbiwgcXVvdGUgY2hhcmFjdGVycyAmIHRyYWlsaW5nIHNwYWNlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGhpcy5hdHRyaWJ1dGVDb3VudCgpID4gMCAmJiAhdGhpcy5pc0Nsb3NlZCgpKSBsZW5ndGgtLTsKLSAgICAgICAgICAgIHJldHVybiBsZW5ndGg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKExpc3QgYXR0cmlidXRlUGFpcikgewotICAgICAgICAgICAgZkF0dHJpYnV0ZXMuY2xlYXIoKTsKLSAgICAgICAgICAgIGZBdHRyaWJ1dGVzLmFkZEFsbChhdHRyaWJ1dGVQYWlyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENsb3NlZChib29sZWFuIGNsb3NlZCkgewotICAgICAgICAgICAgZkNsb3NlZCA9IGNsb3NlZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnROYW1lKFN0cmluZyBlbGVtZW50TmFtZSkgewotICAgICAgICAgICAgZkVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcig1MDApOwotICAgICAgICAgICAgc2IuYXBwZW5kKCc8Jyk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQodGhpcy5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgIGlmICh0aGlzLmF0dHJpYnV0ZUNvdW50KCkgPiAwIHx8IHRoaXMuaXNDbG9zZWQoKSkgc2IuYXBwZW5kKCcgJyk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5hdHRyaWJ1dGVDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGVQYWlyIGF0dHJpYnV0ZVBhaXIgPSB0aGlzLmdldEF0dHJpYnV0ZVBhaXIoaSk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGF0dHJpYnV0ZVBhaXIuZ2V0QXR0cmlidXRlKCkpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnPScpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChhdHRyaWJ1dGVQYWlyLmdldFF1b3RlKCkpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChhdHRyaWJ1dGVQYWlyLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChhdHRyaWJ1dGVQYWlyLmdldFF1b3RlKCkpOwotICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQ2xvc2VkKCkgfHwgaSAhPSB0aGlzLmF0dHJpYnV0ZUNvdW50KCkgLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGhpcy5pc0Nsb3NlZCgpKSBzYi5hcHBlbmQoJy8nKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnPicpOwotICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFRhZ0Zvcm1hdHRlciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgY291bnRDaGFyKGNoYXIgc2VhcmNoQ2hhciwgU3RyaW5nIGluVGFyZ2V0U3RyaW5nKSB7Ci0gICAgICAgICAgICBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvciBpdGVyID0gbmV3IFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yKAotICAgICAgICAgICAgICAgICAgICBpblRhcmdldFN0cmluZyk7Ci0gICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICBpZiAoaXRlci5maXJzdCgpID09IHNlYXJjaENoYXIpIGkrKzsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyLmdldEluZGV4KCkgPCBpdGVyLmdldEVuZEluZGV4KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXRlci5uZXh0KCkgPT0gc2VhcmNoQ2hhcikgewotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGZvcm1hdChUYWcgdGFnLCBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnMsIFN0cmluZyBpbmRlbnQsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB7Ci0gICAgICAgICAgICBpZiAocHJlZnMud3JhcExvbmdUYWdzKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgbGluZVJlcXVpcmVzV3JhcChpbmRlbnQgKyB0YWcudG9TdHJpbmcoKSwgcHJlZnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWF4aW11bUxpbmVXaWR0aCgpLCBwcmVmcy5nZXRUYWJXaWR0aCgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB3cmFwVGFnKHRhZywgcHJlZnMsIGluZGVudCwgbGluZURlbGltaXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGFnLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBsaW5lUmVxdWlyZXNXcmFwKFN0cmluZyBsaW5lLCBpbnQgbGluZVdpZHRoLCBpbnQgdGFiV2lkdGgpIHsKLSAgICAgICAgICAgIHJldHVybiB0YWJFeHBhbmRlZExpbmVXaWR0aChsaW5lLCB0YWJXaWR0aCkgPiBsaW5lV2lkdGg7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHBhcmFtIGxpbmUKLSAgICAgICAgICogICAgICAgICAgICB0aGUgbGluZSBpbiB3aGljaCBzcGFjZXMgYXJlIHRvIGJlIGV4cGFuZGVkCi0gICAgICAgICAqIEBwYXJhbSB0YWJXaWR0aAotICAgICAgICAgKiAgICAgICAgICAgIG51bWJlciBvZiBzcGFjZXMgdG8gc3Vic3RpdHV0ZSBmb3IgYSB0YWIKLSAgICAgICAgICogQHJldHVybiBsZW5ndGggb2YgdGhlIGxpbmUgd2l0aCB0YWJzIGV4cGFuZGVkIHRvIHNwYWNlcwotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIGludCB0YWJFeHBhbmRlZExpbmVXaWR0aChTdHJpbmcgbGluZSwgaW50IHRhYldpZHRoKSB7Ci0gICAgICAgICAgICBpbnQgdGFiQ291bnQgPSBjb3VudENoYXIoJ1x0JywgbGluZSk7Ci0gICAgICAgICAgICByZXR1cm4gKGxpbmUubGVuZ3RoKCkgLSB0YWJDb3VudCkgKyAodGFiQ291bnQgKiB0YWJXaWR0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIHdyYXBUYWcoVGFnIHRhZywgRm9ybWF0dGluZ1ByZWZlcmVuY2VzIHByZWZzLCBTdHJpbmcgaW5kZW50LCBTdHJpbmcgbGluZURlbGltaXRlcikgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigxMDI0KTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnPCcpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHRhZy5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOwotCi0gICAgICAgICAgICBpZiAodGFnLmF0dHJpYnV0ZUNvdW50KCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgQXR0cmlidXRlUGFpciBwYWlyPSB0YWcuZ2V0QXR0cmlidXRlUGFpcigwKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQocGFpci5nZXRBdHRyaWJ1dGUoKSk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCc9Jyk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKHBhaXIuZ2V0UXVvdGUoKSk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKHRhZy5nZXRBdHRyaWJ1dGVQYWlyKDApLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChwYWlyLmdldFF1b3RlKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodGFnLmF0dHJpYnV0ZUNvdW50KCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgY2hhcltdIGV4dHJhSW5kZW50ID0gbmV3IGNoYXJbdGFnLmdldEVsZW1lbnROYW1lKCkubGVuZ3RoKCkgKyAyXTsKLSAgICAgICAgICAgICAgICBBcnJheXMuZmlsbChleHRyYUluZGVudCwgJyAnKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHRhZy5hdHRyaWJ1dGVDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlUGFpciBwYWlyPSB0YWcuZ2V0QXR0cmlidXRlUGFpcihpKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGxpbmVEZWxpbWl0ZXIpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50KTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGV4dHJhSW5kZW50KTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHBhaXIuZ2V0QXR0cmlidXRlKCkpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJz0nKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHBhaXIuZ2V0UXVvdGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChwYWlyLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQocGFpci5nZXRRdW90ZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcmVmcy5hbGlnbkVsZW1lbnRDbG9zZUNoYXIoKSkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChsaW5lRGVsaW1pdGVyKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnLmlzQ2xvc2VkKCkpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRhZy5pc0Nsb3NlZCgpKSBzYi5hcHBlbmQoJy8nKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnPicpOwotICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBpZiBvYmplY3QgY3JlYXRpb24gaXMgYW4gaXNzdWUsIHVzZSBzdGF0aWMgbWV0aG9kcyBvciBhIGZseXdlaWdodAotICAgIC8vIHBhdHRlcm4KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFRhZ1BhcnNlciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZkVsZW1lbnROYW1lOwotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGZQYXJzZVRleHQ7Ci0KLSAgICAgICAgcHJvdGVjdGVkIExpc3QgZ2V0QXR0aWJ1dGVzKFN0cmluZyBlbGVtZW50VGV4dCkKLSAgICAgICAgICAgICAgICB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotCi0gICAgICAgICAgICBjbGFzcyBNb2RlIHsKLSAgICAgICAgICAgICAgICBwcml2YXRlIGludCBtb2RlOwotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZU5hbWVTZWFyY2hpbmcoKSB7bW9kZSA9IDA7fQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZU5hbWVGb3VuZCgpIHttb2RlID0gMTt9Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlVmFsdWVTZWFyY2hpbmcoKSB7bW9kZSA9IDI7fQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVZhbHVlRm91bmQoKSB7bW9kZSA9IDM7fQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEZpbmlzaGVkKCkge21vZGUgPSA0O30KLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZU5hbWVTZWFyY2hpbmcoKSB7cmV0dXJuIG1vZGUgPT0gMDt9Ci0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVOYW1lRm91bmQoKSB7cmV0dXJuIG1vZGUgPT0gMTt9Ci0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBdHRyaWJ1dGVWYWx1ZVNlYXJjaGluZygpIHtyZXR1cm4gbW9kZSA9PSAyO30KLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dHJpYnV0ZVZhbHVlRm91bmQoKSB7cmV0dXJuIG1vZGUgPT0gMzt9Ci0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGaW5pc2hlZCgpIHtyZXR1cm4gbW9kZSA9PSA0O30KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdCBhdHRyaWJ1dGVQYWlycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICAgICAgQ2hhcmFjdGVySXRlcmF0b3IgaXRlciA9IG5ldyBTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcihlbGVtZW50VGV4dAotICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKGdldEVsZW1lbnROYW1lKGVsZW1lbnRUZXh0KS5sZW5ndGgoKSArIDIpKTsKLQotICAgICAgICAgICAgLy8gc3RhdGUgZm9yIGZpbmRpbmcgYXR0cmlidXRlcwotICAgICAgICAgICAgTW9kZSBtb2RlID0gbmV3IE1vZGUoKTsKLSAgICAgICAgICAgIG1vZGUuc2V0QXR0cmlidXRlTmFtZVNlYXJjaGluZygpOwotICAgICAgICAgICAgY2hhciBhdHRyaWJ1dGVRdW90ZSA9ICciJzsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBjdXJyZW50QXR0cmlidXRlTmFtZSA9IG51bGw7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgY3VycmVudEF0dHJpYnV0ZVZhbHVlID0gbnVsbDsKLQotICAgICAgICAgICAgY2hhciBjID0gaXRlci5maXJzdCgpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXIuZ2V0SW5kZXgoKSA8IGl0ZXIuZ2V0RW5kSW5kZXgoKSkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBjYXNlICciJzoKLSAgICAgICAgICAgICAgICBjYXNlICdcJyc6Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUuaXNBdHRyaWJ1dGVWYWx1ZVNlYXJjaGluZygpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IG9mIGFuIGF0dHJpYnV0ZSB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlUXVvdGUgPSBjOwotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZS5zZXRBdHRyaWJ1dGVWYWx1ZUZvdW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QXR0cmlidXRlVmFsdWUgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMjQpOwotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZS5pc0F0dHJpYnV0ZVZhbHVlRm91bmQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGF0dHJpYnV0ZVF1b3RlID09IGMpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UndmUgY29tcGxldGVkIGEgcGFpciEKLSAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZVBhaXIgcGFpciA9IG5ldyBBdHRyaWJ1dGVQYWlyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QXR0cmlidXRlTmFtZS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QXR0cmlidXRlVmFsdWUudG9TdHJpbmcoKSwgYXR0cmlidXRlUXVvdGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVQYWlycy5hZGQocGFpcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IGxvb2tpbmcgZm9yIGFub3RoZXIgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlLnNldEF0dHJpYnV0ZU5hbWVTZWFyY2hpbmcoKTsKLQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUuaXNBdHRyaWJ1dGVWYWx1ZUZvdW5kKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhdHRyaWJ1dGVRdW90ZSAhPSBjKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgcXVvdGUgY2hhcmFjdGVyIGlzIHBhcnQgb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEF0dHJpYnV0ZVZhbHVlLmFwcGVuZChjKTsKLQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBubyBwbGFjZSBmb3IgYSBxdW90ZSEKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiVW5leHBlY3RlZCAnIiArIGMgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIHdoZW4gcGFyc2luZzpcblx0IiArIGVsZW1lbnRUZXh0KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSAnPSc6Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAobW9kZS5pc0F0dHJpYnV0ZVZhbHVlRm91bmQoKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNoYXJhY3RlciBpcyBwYXJ0IG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRBdHRyaWJ1dGVWYWx1ZS5hcHBlbmQoYyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtb2RlLmlzQXR0cmlidXRlTmFtZUZvdW5kKCkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5kIG9mIHRoZSBuYW1lLCBub3cgc3RhcnQgbG9va2luZyBmb3IgdGhlIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlLnNldEF0dHJpYnV0ZVZhbHVlU2VhcmNoaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgbm8gcGxhY2UgZm9yIGFuIGVxdWFscyBzaWduIQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJVbmV4cGVjdGVkICciICsgYyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgd2hlbiBwYXJzaW5nOlxuXHQiICsgZWxlbWVudFRleHQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlICcvJzoKLSAgICAgICAgICAgICAgICBjYXNlICc+JzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUuaXNBdHRyaWJ1dGVWYWx1ZUZvdW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIENEQVRBLCBhZGQgaXQgYWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QXR0cmlidXRlVmFsdWUuYXBwZW5kKGMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUuaXNBdHRyaWJ1dGVOYW1lU2VhcmNoaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUuc2V0RmluaXNoZWQoKTsKLQkJCQkJfSBlbHNlIGlmIChtb2RlLmlzRmluaXNoZWQoKSl7Ci0JCQkJCQkvLyBjb25zdW1lIHRoZSByZW1haW5pbmcgY2hhcmFjdGVycwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXJlbid0IHJlYWR5IHRvIGJlIGRvbmUhCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgJyIgKyBjIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyB3aGVuIHBhcnNpbmc6XG5cdCIgKyBlbGVtZW50VGV4dCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUuaXNBdHRyaWJ1dGVWYWx1ZUZvdW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIENEQVRBLCBhZGQgaXQgYWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QXR0cmlidXRlVmFsdWUuYXBwZW5kKGMpOwotCi0JCQkJCX0gZWxzZSBpZiAobW9kZS5pc0ZpbmlzaGVkKCkpIHsKLQkJCQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgewotCQkJCQkJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIlVuZXhwZWN0ZWQgJyIgKyBjIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkrICInIHdoZW4gcGFyc2luZzpcblx0IiArIGVsZW1lbnRUZXh0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUuaXNBdHRyaWJ1dGVOYW1lU2VhcmNoaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZm91bmQgdGhlIHN0YXJ0IG9mIGFuIGF0dHJpYnV0ZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUuc2V0QXR0cmlidXRlTmFtZUZvdW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRBdHRyaWJ1dGVOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigyNTUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QXR0cmlidXRlTmFtZS5hcHBlbmQoYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtb2RlLmlzQXR0cmlidXRlTmFtZUZvdW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEF0dHJpYnV0ZU5hbWUuYXBwZW5kKGMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGMgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIH0KLQkJCWlmICghbW9kZS5pc0ZpbmlzaGVkKCkpIHsKLQkJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIkVsZW1lbnQgZGlkIG5vdCBjb21wbGV0ZSBub3JtYWxseS4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZVBhaXJzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBwYXJhbSB0YWdUZXh0Ci0gICAgICAgICAqICAgICAgICAgICAgdGV4dCBvZiBhbiBYTUwgdGFnCi0gICAgICAgICAqIEByZXR1cm4gZXh0cmFjdGVkIFhNTCBlbGVtZW50IG5hbWUKLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoU3RyaW5nIHRhZ1RleHQpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoIXRhZ1RleHQuZXF1YWxzKHRoaXMuZlBhcnNlVGV4dCkgfHwgdGhpcy5mRWxlbWVudE5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBlbmRPZlRhZyA9IHRhZ0VuZCh0YWdUZXh0KTsKLSAgICAgICAgICAgICAgICBpZiAoKHRhZ1RleHQubGVuZ3RoKCkgPiAyKSAmJiAoZW5kT2ZUYWcgPiAxKSkgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmZQYXJzZVRleHQgPSB0YWdUZXh0OwotICAgICAgICAgICAgICAgICAgICB0aGlzLmZFbGVtZW50TmFtZSA9IHRhZ1RleHQuc3Vic3RyaW5nKDEsIGVuZE9mVGFnKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIk5vIGVsZW1lbnQgbmFtZSBmb3IgdGhlIHRhZzpcblx0IiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0YWdUZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZkVsZW1lbnROYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDbG9zZWQoU3RyaW5nIHRhZ1RleHQpIHsKLSAgICAgICAgICAgIHJldHVybiB0YWdUZXh0LmNoYXJBdCh0YWdUZXh0Lmxhc3RJbmRleE9mKCc+JykgLSAxKSA9PSAnLyc7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHBhcmFtIHRhZ1RleHQKLSAgICAgICAgICogQHJldHVybiBhIGZ1bGx5IHBvcHVsYXRlZCB0YWcKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBUYWcgcGFyc2UoU3RyaW5nIHRhZ1RleHQpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBUYWcgdGFnID0gbmV3IFRhZygpOwotICAgICAgICAgICAgdGFnLnNldEVsZW1lbnROYW1lKGdldEVsZW1lbnROYW1lKHRhZ1RleHQpKTsKLSAgICAgICAgICAgIHRhZy5zZXRBdHRyaWJ1dGVzKGdldEF0dGlidXRlcyh0YWdUZXh0KSk7Ci0gICAgICAgICAgICB0YWcuc2V0Q2xvc2VkKGlzQ2xvc2VkKHRhZ1RleHQpKTsKLSAgICAgICAgICAgIHJldHVybiB0YWc7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCB0YWdFbmQoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgYWRtaXR0ZWRseSBhIGxpdHRsZSBsb29zZSwgYnV0IHdlIGRvbid0IHdhbnQgdGhlCi0gICAgICAgICAgICAvLyBmb3JtYXR0ZXIgdG8gYmUgdG9vIHN0cmljdC4uLgotICAgICAgICAgICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMteG1sLTIwMDAxMDA2I05ULU5hbWUKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgdGV4dC5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBjID0gdGV4dC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGMpICYmIGMgIT0gJzonICYmIGMgIT0gJy4nCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBjICE9ICctJyAmJiBjICE9ICdfJykgeyByZXR1cm4gaTsgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0KFN0cmluZyB0YWdUZXh0LCBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnMsIFN0cmluZyBpbmRlbnQsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB7Ci0KLSAgICAgICAgVGFnIHRhZzsKLSAgICAgICAgaWYgKHRhZ1RleHQuc3RhcnRzV2l0aCgiPC8iKSB8fCB0YWdUZXh0LnN0YXJ0c1dpdGgoIjwlIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgfHwgdGFnVGV4dC5zdGFydHNXaXRoKCI8PyIpIHx8IHRhZ1RleHQuc3RhcnRzV2l0aCgiPFsiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgIHJldHVybiB0YWdUZXh0OwotICAgICAgICB9IAotICAgIAl0cnkgewotICAgICAgICAgICAgdGFnID0gbmV3IFRhZ1BhcnNlcigpLnBhcnNlKHRhZ1RleHQpOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpZiB3ZSBjYW4ndCBwYXJzZSB0aGUgdGFnLCBnaXZlIHVwIGFuZCBsZWF2ZSB0aGUgdGV4dCBhcyBpcy4KLSAgICAgICAgICAgIHJldHVybiB0YWdUZXh0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgVGFnRm9ybWF0dGVyKCkuZm9ybWF0KHRhZywgcHJlZnMsIGluZGVudCwgbGluZURlbGltaXRlcik7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL291dGxpbmUvQW50T3V0bGluZU1lc3NhZ2VzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9vdXRsaW5lL0FudE91dGxpbmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWI1OTY4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL291dGxpbmUvQW50T3V0bGluZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiBKb2huLU1hc29uIFAuIFNoYWNrZWxmb3JkIChqb2huLW1hc29uLnNoYWNrZWxmb3JkQHBlYXJzb24uY29tKSAtIGJ1ZyA1MzU0NwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3Iub3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBBbnRPdXRsaW5lTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmUuQW50T3V0bGluZU1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50RWRpdG9yQ29udGVudE91dGxpbmVQYWdlX09wZW5fV2l0aF8xOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVySW50ZXJuYWxUYXJnZXRzQWN0aW9uXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVySW1wb3J0ZWRFbGVtZW50c0FjdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlclByb3BlcnRpZXNBY3Rpb25fMDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlclRvcExldmVsQWN0aW9uXzA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVTb3J0QW50T3V0bGluZUFjdGlvbl8wOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlTGlua1dpdGhFZGl0b3JBY3Rpb25fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVMaW5rV2l0aEVkaXRvckFjdGlvbl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUxpbmtXaXRoRWRpdG9yQWN0aW9uXzI7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQW50T3V0bGluZU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3Ivb3V0bGluZS9BbnRPdXRsaW5lTWVzc2FnZXMucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL291dGxpbmUvQW50T3V0bGluZU1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwM2IxY2QuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3Ivb3V0bGluZS9BbnRPdXRsaW5lTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEpvaG4tTWFzb24gUC4gU2hhY2tlbGZvcmQgKGpvaG4tbWFzb24uc2hhY2tlbGZvcmRAcGVhcnNvbi5jb20pIC0gYnVnIDUzNTQ3Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUFudEVkaXRvckNvbnRlbnRPdXRsaW5lUGFnZV9PcGVuX1dpdGhfMT1PcGVuIFdpdGgKLQotRmlsdGVySW50ZXJuYWxUYXJnZXRzQWN0aW9uXzA9SGlkZSBJbnRlcm5hbCBUYXJnZXRzCi1GaWx0ZXJJbXBvcnRlZEVsZW1lbnRzQWN0aW9uXzA9SGlkZSBJbXBvcnRlZCBFbGVtZW50cwotRmlsdGVyUHJvcGVydGllc0FjdGlvbl8wPUhpZGUgUHJvcGVydGllcwotCi1GaWx0ZXJUb3BMZXZlbEFjdGlvbl8wPUhpZGUgVG9wIExldmVsIEVsZW1lbnRzCi0KLVRvZ2dsZVNvcnRBbnRPdXRsaW5lQWN0aW9uXzA9U29ydAotCi1Ub2dnbGVMaW5rV2l0aEVkaXRvckFjdGlvbl8wPUxpbiZrIHdpdGggRWRpdG9yCi1Ub2dnbGVMaW5rV2l0aEVkaXRvckFjdGlvbl8xPUxpbmsgd2l0aCBFZGl0b3IKLVRvZ2dsZUxpbmtXaXRoRWRpdG9yQWN0aW9uXzI9TGluayB3aXRoIGFjdGl2ZSBlZGl0b3IKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL291dGxpbmUvRmlsdGVySW1wb3J0ZWRFbGVtZW50c0FjdGlvbi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3Ivb3V0bGluZS9GaWx0ZXJJbXBvcnRlZEVsZW1lbnRzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMzdiYjkuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3Ivb3V0bGluZS9GaWx0ZXJJbXBvcnRlZEVsZW1lbnRzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IEpvaG4tTWFzb24gUC4gU2hhY2tlbGZvcmQgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3Iub3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotCi0vKiogCi0gKiBBbiBhY3Rpb24gd2hpY2ggdG9nZ2xlcyBmaWx0ZXJpbmcgb2YgaW1wb3J0ZWQgZWxlbWVudHMgZnJvbSB0aGUgQW50IG91dGxpbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJJbXBvcnRlZEVsZW1lbnRzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLSAgICAKLQlwcml2YXRlIEFudEVkaXRvckNvbnRlbnRPdXRsaW5lUGFnZSBmUGFnZTsKLQkKLQlwdWJsaWMgRmlsdGVySW1wb3J0ZWRFbGVtZW50c0FjdGlvbihBbnRFZGl0b3JDb250ZW50T3V0bGluZVBhZ2UgcGFnZSkgewotCQlzdXBlcihBbnRPdXRsaW5lTWVzc2FnZXMuRmlsdGVySW1wb3J0ZWRFbGVtZW50c0FjdGlvbl8wKTsKLQkJZlBhZ2UgPSBwYWdlOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoQW50VUlJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElBbnRVSUNvbnN0YW50cy5JTUdfRklMVEVSX0lNUE9SVEVEX0VMRU1FTlRTKSk7Ci0JCXNldFRvb2xUaXBUZXh0KEFudE91dGxpbmVNZXNzYWdlcy5GaWx0ZXJJbXBvcnRlZEVsZW1lbnRzQWN0aW9uXzApOwotCQlzZXRDaGVja2VkKGZQYWdlLmZpbHRlckltcG9ydGVkRWxlbWVudHMoKSk7Ci0JfQotCi0gICAgLyoqCi0JICogVG9nZ2xlcyB0aGUgZmlsdGVyaW5nIG9mIGltcG9ydGVkIGVsZW1lbnRzIGZyb20gdGhlIEFudCBvdXRsaW5lCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZlBhZ2UuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWZQYWdlLnNldEZpbHRlckltcG9ydGVkRWxlbWVudHMoaXNDaGVja2VkKCkpOwotCQkJfQotCQl9KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3Ivb3V0bGluZS9GaWx0ZXJJbnRlcm5hbFRhcmdldHNBY3Rpb24uamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL291dGxpbmUvRmlsdGVySW50ZXJuYWxUYXJnZXRzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YjhjM2QuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3Ivb3V0bGluZS9GaWx0ZXJJbnRlcm5hbFRhcmdldHNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci0KLS8qKiAKLSAqIEFuIGFjdGlvbiB3aGljaCB0b2dnbGVzIGZpbHRlcmluZyBvZiBpbnRlcm5hbCB0YXJnZXRzIGZyb20gdGhlIEFudCBvdXRsaW5lLgotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVySW50ZXJuYWxUYXJnZXRzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQkKLQlwcml2YXRlIEFudEVkaXRvckNvbnRlbnRPdXRsaW5lUGFnZSBmUGFnZTsKLQkKLQlwdWJsaWMgRmlsdGVySW50ZXJuYWxUYXJnZXRzQWN0aW9uKEFudEVkaXRvckNvbnRlbnRPdXRsaW5lUGFnZSBwYWdlKSB7Ci0JCXN1cGVyKEFudE91dGxpbmVNZXNzYWdlcy5GaWx0ZXJJbnRlcm5hbFRhcmdldHNBY3Rpb25fMCk7Ci0JCWZQYWdlID0gcGFnZTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEFudFVJSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJQW50VUlDb25zdGFudHMuSU1HX0ZJTFRFUl9JTlRFUk5BTF9UQVJHRVRTKSk7Ci0JCXNldFRvb2xUaXBUZXh0KEFudE91dGxpbmVNZXNzYWdlcy5GaWx0ZXJJbnRlcm5hbFRhcmdldHNBY3Rpb25fMCk7Ci0JCXNldENoZWNrZWQoZlBhZ2UuZmlsdGVySW50ZXJuYWxUYXJnZXRzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBUb2dnbGVzIHRoZSBmaWx0ZXJpbmcgb2YgaW50ZXJuYWwgdGFyZ2V0cyBmcm9tIHRoZSBBbnQgb3V0bGluZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGZQYWdlLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlmUGFnZS5zZXRGaWx0ZXJJbnRlcm5hbFRhcmdldHMoaXNDaGVja2VkKCkpOwotCQkJfQotCQl9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9vdXRsaW5lL0ZpbHRlclByb3BlcnRpZXNBY3Rpb24uamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL291dGxpbmUvRmlsdGVyUHJvcGVydGllc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzZhZWYyLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL291dGxpbmUvRmlsdGVyUHJvcGVydGllc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLQotLyoqIAotICogQW4gYWN0aW9uIHdoaWNoIHRvZ2dsZXMgZmlsdGVyaW5nIG9mIHByb3BlcnRpZXMgZnJvbSB0aGUgQW50IG91dGxpbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJQcm9wZXJ0aWVzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQkKLQlwcml2YXRlIEFudEVkaXRvckNvbnRlbnRPdXRsaW5lUGFnZSBmUGFnZTsKLQkKLQlwdWJsaWMgRmlsdGVyUHJvcGVydGllc0FjdGlvbihBbnRFZGl0b3JDb250ZW50T3V0bGluZVBhZ2UgcGFnZSkgewotCQlzdXBlcihBbnRPdXRsaW5lTWVzc2FnZXMuRmlsdGVyUHJvcGVydGllc0FjdGlvbl8wKTsKLQkJZlBhZ2UgPSBwYWdlOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoQW50VUlJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElBbnRVSUNvbnN0YW50cy5JTUdfRklMVEVSX1BST1BFUlRJRVMpKTsKLQkJc2V0VG9vbFRpcFRleHQoQW50T3V0bGluZU1lc3NhZ2VzLkZpbHRlclByb3BlcnRpZXNBY3Rpb25fMCk7Ci0JCXNldENoZWNrZWQoZlBhZ2UuZmlsdGVyUHJvcGVydGllcygpKTsKLQl9Ci0JCi0JLyoqCi0JICogVG9nZ2xlcyB0aGUgZmlsdGVyaW5nIG9mIHByb3BlcnRpZXMgZnJvbSB0aGUgQW50IG91dGxpbmUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShmUGFnZS5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZlBhZ2Uuc2V0RmlsdGVyUHJvcGVydGllcyhpc0NoZWNrZWQoKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL291dGxpbmUvRmlsdGVyVG9wTGV2ZWxBY3Rpb24uamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL291dGxpbmUvRmlsdGVyVG9wTGV2ZWxBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk4ZWE4OS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9vdXRsaW5lL0ZpbHRlclRvcExldmVsQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3Iub3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotCi0vKiogCi0gKiBBbiBhY3Rpb24gd2hpY2ggdG9nZ2xlcyBmaWx0ZXJpbmcgb2YgcHJvcGVydGllcyBmcm9tIHRoZSBBbnQgb3V0bGluZS4KLSAqLwotcHVibGljIGNsYXNzIEZpbHRlclRvcExldmVsQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQkKLQlwcml2YXRlIEFudEVkaXRvckNvbnRlbnRPdXRsaW5lUGFnZSBmUGFnZTsKLQkKLQlwdWJsaWMgRmlsdGVyVG9wTGV2ZWxBY3Rpb24oQW50RWRpdG9yQ29udGVudE91dGxpbmVQYWdlIHBhZ2UpIHsKLQkJc3VwZXIoQW50T3V0bGluZU1lc3NhZ2VzLkZpbHRlclRvcExldmVsQWN0aW9uXzApOwotCQlmUGFnZSA9IHBhZ2U7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihBbnRVSUltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSUFudFVJQ29uc3RhbnRzLklNR19GSUxURVJfVE9QX0xFVkVMKSk7Ci0JCXNldFRvb2xUaXBUZXh0KEFudE91dGxpbmVNZXNzYWdlcy5GaWx0ZXJUb3BMZXZlbEFjdGlvbl8wKTsKLQkJc2V0Q2hlY2tlZChmUGFnZS5maWx0ZXJUb3BMZXZlbCgpKTsKLQl9Ci0JCi0JLyoqCi0JICogVG9nZ2xlcyB0aGUgZmlsdGVyaW5nIG9mIHRvcCBsZXZlbCB0YXNrcyBhbmQgdHlwZXMgZnJvbSB0aGUgQW50IG91dGxpbmUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShmUGFnZS5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZlBhZ2Uuc2V0RmlsdGVyVG9wTGV2ZWwoaXNDaGVja2VkKCkpOwotCQkJfQotCQl9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9vdXRsaW5lL1RvZ2dsZUxpbmtXaXRoRWRpdG9yQWN0aW9uLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9vdXRsaW5lL1RvZ2dsZUxpbmtXaXRoRWRpdG9yQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwOGNlNjQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3Ivb3V0bGluZS9Ub2dnbGVMaW5rV2l0aEVkaXRvckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3Iub3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLkFudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotCi0vKioKLSAqIFRoaXMgYWN0aW9uIHRvZ2dsZXMgd2hldGhlciB0aGUgQW50IE91dGxpbmUgcGFnZSBsaW5rcyBpdHMgc2VsZWN0aW9uIHRvIHRoZQotICogYWN0aXZlIGVkaXRvci4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgVG9nZ2xlTGlua1dpdGhFZGl0b3JBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCQotCUFudEVkaXRvciBmRWRpdG9yOwotCQotCXB1YmxpYyBUb2dnbGVMaW5rV2l0aEVkaXRvckFjdGlvbihBbnRFZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKEFudE91dGxpbmVNZXNzYWdlcy5Ub2dnbGVMaW5rV2l0aEVkaXRvckFjdGlvbl8wKTsKLQkJYm9vbGVhbiBpc0xpbmtpbmdFbmFibGVkID0gQW50VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oSUFudFVJUHJlZmVyZW5jZUNvbnN0YW50cy5PVVRMSU5FX0xJTktfV0lUSF9FRElUT1IpOwotCQlzZXRDaGVja2VkKGlzTGlua2luZ0VuYWJsZWQpOwotCQlmRWRpdG9yID0gZWRpdG9yOwotCQlzZXRUb29sVGlwVGV4dChBbnRPdXRsaW5lTWVzc2FnZXMuVG9nZ2xlTGlua1dpdGhFZGl0b3JBY3Rpb25fMSk7Ci0JCXNldERlc2NyaXB0aW9uKEFudE91dGxpbmVNZXNzYWdlcy5Ub2dnbGVMaW5rV2l0aEVkaXRvckFjdGlvbl8yKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEFudFVJSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJQW50VUlDb25zdGFudHMuSU1HX0xJTktfV0lUSF9FRElUT1IpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlBbnRVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSUFudFVJUHJlZmVyZW5jZUNvbnN0YW50cy5PVVRMSU5FX0xJTktfV0lUSF9FRElUT1IsIGlzQ2hlY2tlZCgpKTsKLQkJaWYgKGlzQ2hlY2tlZCgpKQotCQkJZkVkaXRvci5zeW5jaHJvbml6ZU91dGxpbmVQYWdlKGZhbHNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9vdXRsaW5lL1RvZ2dsZVNvcnRBbnRPdXRsaW5lQWN0aW9uLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci9vdXRsaW5lL1RvZ2dsZVNvcnRBbnRPdXRsaW5lQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzM2IzMGIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3Ivb3V0bGluZS9Ub2dnbGVTb3J0QW50T3V0bGluZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotCi0vKioKLSAqIEFuIGFjdGlvbiB3aGljaCB0b2dnbGVzIHNvcnRpbmcgaW4gdGhlIEFudCBvdXRsaW5lIHBhZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBUb2dnbGVTb3J0QW50T3V0bGluZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLQlwcml2YXRlIEFudEVkaXRvckNvbnRlbnRPdXRsaW5lUGFnZSBmUGFnZTsKLQkKLQlwdWJsaWMgVG9nZ2xlU29ydEFudE91dGxpbmVBY3Rpb24oQW50RWRpdG9yQ29udGVudE91dGxpbmVQYWdlIHBhZ2UpIHsKLQkJc3VwZXIoQW50T3V0bGluZU1lc3NhZ2VzLlRvZ2dsZVNvcnRBbnRPdXRsaW5lQWN0aW9uXzApOwotCQlmUGFnZSA9IHBhZ2U7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihBbnRVSUltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSUFudFVJQ29uc3RhbnRzLklNR19TT1JUX09VVExJTkUpKTsKLQkJc2V0VG9vbFRpcFRleHQoQW50T3V0bGluZU1lc3NhZ2VzLlRvZ2dsZVNvcnRBbnRPdXRsaW5lQWN0aW9uXzApOwotCQlzZXRDaGVja2VkKGZQYWdlLmlzU29ydCgpKTsKLQl9Ci0JCi0JLyoqCi0JICogVG9nZ2xlcyB0aGUgc29ydGluZyBvZiB0YXJnZXRzIGluIHRoZSBBbnQgb3V0bGluZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWZQYWdlLnNldFNvcnQoaXNDaGVja2VkKCkpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RlbXBsYXRlcy9BbnRUZW1wbGF0ZUFjY2Vzcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGVtcGxhdGVzL0FudFRlbXBsYXRlQWNjZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiOTdlNzAuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGVtcGxhdGVzL0FudFRlbXBsYXRlQWNjZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZW1wbGF0ZXM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQudGVtcGxhdGVzLkNvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcy5Db250cmlidXRpb25UZW1wbGF0ZVN0b3JlOwotCi0KLXB1YmxpYyBjbGFzcyBBbnRUZW1wbGF0ZUFjY2VzcyB7Ci0JLyoqIEtleSB0byBzdG9yZSBjdXN0b20gdGVtcGxhdGVzLiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fVEVNUExBVEVTX0tFWT0gIm9yZy5lY2xpcHNlLmFudC51aS5jdXN0b210ZW1wbGF0ZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIFRoZSBzaGFyZWQgaW5zdGFuY2UuICovCi0JcHJpdmF0ZSBzdGF0aWMgQW50VGVtcGxhdGVBY2Nlc3MgZmdJbnN0YW5jZTsKLQkKLQkvKiogVGhlIHRlbXBsYXRlIHN0b3JlLiAqLwotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmU3RvcmU7Ci0JCi0JLyoqIFRoZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkuICovCi0JcHJpdmF0ZSBDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5IGZSZWdpc3RyeTsKLQkKLQlwcml2YXRlIEFudFRlbXBsYXRlQWNjZXNzKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFudFRlbXBsYXRlQWNjZXNzIGdldERlZmF1bHQoKSB7Ci0JCWlmIChmZ0luc3RhbmNlID09IG51bGwpIHsKLQkJCWZnSW5zdGFuY2U9IG5ldyBBbnRUZW1wbGF0ZUFjY2VzcygpOwotCQl9Ci0JCXJldHVybiBmZ0luc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBwbHVnLWluJ3MgdGVtcGxhdGUgc3RvcmUuCi0JICogCi0JICogQHJldHVybiB0aGUgdGVtcGxhdGUgc3RvcmUgb2YgdGhpcyBwbHVnLWluIGluc3RhbmNlCi0JICovCi0JcHVibGljIFRlbXBsYXRlU3RvcmUgZ2V0VGVtcGxhdGVTdG9yZSgpIHsKLQkJaWYgKGZTdG9yZSA9PSBudWxsKSB7Ci0JCQlmU3RvcmU9IG5ldyBDb250cmlidXRpb25UZW1wbGF0ZVN0b3JlKGdldENvbnRleHRUeXBlUmVnaXN0cnkoKSxBbnRVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCksIENVU1RPTV9URU1QTEFURVNfS0VZKTsKLQkJCXRyeSB7Ci0JCQkJZlN0b3JlLmxvYWQoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlBbnRVSVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZTdG9yZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgcGx1Zy1pbidzIGNvbnRleHQgdHlwZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Zy1pbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBDb250ZXh0VHlwZVJlZ2lzdHJ5IGdldENvbnRleHRUeXBlUmVnaXN0cnkoKSB7Ci0JCWlmIChmUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGFuZCBjb25maWd1cmUgdGhlIGNvbnRleHRzIGF2YWlsYWJsZSBpbiB0aGUgdGVtcGxhdGUgZWRpdG9yCi0JCQlmUmVnaXN0cnk9IG5ldyBDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5KCk7Ci0JCQlmUmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoQnVpbGRGaWxlQ29udGV4dFR5cGUuQlVJTERGSUxFX0NPTlRFWFRfVFlQRSk7Ci0JCQlmUmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGFyZ2V0Q29udGV4dFR5cGUuVEFSR0VUX0NPTlRFWFRfVFlQRSk7Ci0JCQlmUmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGFza0NvbnRleHRUeXBlLlRBU0tfQ09OVEVYVF9UWVBFKTsKLQkJfQotCQlyZXR1cm4gZlJlZ2lzdHJ5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RlbXBsYXRlcy9BbnRUZW1wbGF0ZUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RlbXBsYXRlcy9BbnRUZW1wbGF0ZUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwNjFjOS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZW1wbGF0ZXMvQW50VGVtcGxhdGVJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRlbXBsYXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuQW50U291cmNlVmlld2VySW5mb3JtYXRpb25Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3JFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotcHVibGljIGNsYXNzIEFudFRlbXBsYXRlSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvciBpbXBsZW1lbnRzIElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yLCBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvckV4dGVuc2lvbiB7Ci0JCi0JcHJpdmF0ZSBBbnRTb3VyY2VWaWV3ZXJJbmZvcm1hdGlvbkNvbnRyb2wgZkNvbnRyb2w7Ci0JCi0JcHVibGljIEFudFRlbXBsYXRlSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcigpICB7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yI2NyZWF0ZUluZm9ybWF0aW9uQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLQkgKi8KLQlwdWJsaWMgSUluZm9ybWF0aW9uQ29udHJvbCBjcmVhdGVJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50KSB7Ci0JCWZDb250cm9sPSBuZXcgQW50U291cmNlVmlld2VySW5mb3JtYXRpb25Db250cm9sKHBhcmVudCk7Ci0JCWZDb250cm9sLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQlmQ29udHJvbD0gbnVsbDsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBmQ29udHJvbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvckV4dGVuc2lvbiNjYW5SZXVzZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2wpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUmV1c2UoSUluZm9ybWF0aW9uQ29udHJvbCBjb250cm9sKSB7Ci0JCXJldHVybiBmQ29udHJvbCA9PSBjb250cm9sICYmIGZDb250cm9sICE9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3JFeHRlbnNpb24jY2FuUmVwbGFjZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblJlcGxhY2UoSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IgY3JlYXRvcikgewotCQlyZXR1cm4gKGNyZWF0b3IgIT0gbnVsbCAmJiBnZXRDbGFzcygpID09IGNyZWF0b3IuZ2V0Q2xhc3MoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGVtcGxhdGVzL0FudFRlbXBsYXRlUHJvcG9zYWwuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RlbXBsYXRlcy9BbnRUZW1wbGF0ZVByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyODk0YjMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGVtcGxhdGVzL0FudFRlbXBsYXRlUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRlbXBsYXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVQcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBBbnRUZW1wbGF0ZVByb3Bvc2FsIGV4dGVuZHMgVGVtcGxhdGVQcm9wb3NhbCB7Ci0JCi0JcHVibGljIEFudFRlbXBsYXRlUHJvcG9zYWwoVGVtcGxhdGUgdGVtcGxhdGUsIFRlbXBsYXRlQ29udGV4dCBjb250ZXh0LCBJUmVnaW9uIHJlZ2lvbiwgSW1hZ2UgaW1hZ2UsIGludCByZWxldmFuY2UpIHsKLQkJc3VwZXIodGVtcGxhdGUsIGNvbnRleHQsIHJlZ2lvbiwgaW1hZ2UsIHJlbGV2YW5jZSk7Ci0JfQotCQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiN2YWxpZGF0ZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwgaW50LCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIHRyeSB7Ci0JCQlpbnQgcmVwbGFjZU9mZnNldD0gZ2V0UmVwbGFjZU9mZnNldCgpOwotCQkJaWYgKG9mZnNldCA+PSByZXBsYWNlT2Zmc2V0KSB7Ci0JCQkJU3RyaW5nIGNvbnRlbnQ9IGRvY3VtZW50LmdldChyZXBsYWNlT2Zmc2V0LCBvZmZzZXQgLSByZXBsYWNlT2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBpZiAoY29udGVudC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLQkJCQlpZiAoY29udGVudC5jaGFyQXQoMCkgPT0gJzwnKSB7Ci0JCQkJICAgIGNvbnRlbnQ9IGNvbnRlbnQuc3Vic3RyaW5nKDEpOwotCQkJCX0KLQkJCQlyZXR1cm4gZ2V0VGVtcGxhdGUoKS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGNvbnRlbnQudG9Mb3dlckNhc2UoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIC0gaWdub3JlCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RlbXBsYXRlcy9BbnRUZW1wbGF0ZVZhcmlhYmxlVGV4dEhvdmVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZW1wbGF0ZXMvQW50VGVtcGxhdGVWYXJpYWJsZVRleHRIb3Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDQ0YzZhLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RlbXBsYXRlcy9BbnRUZW1wbGF0ZVZhcmlhYmxlVGV4dEhvdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGVtcGxhdGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGV4dC5YTUxUZXh0SG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBBbnRUZW1wbGF0ZVZhcmlhYmxlVGV4dEhvdmVyIGltcGxlbWVudHMgSVRleHRIb3ZlciB7Ci0KLQlwdWJsaWMgQW50VGVtcGxhdGVWYXJpYWJsZVRleHRIb3ZlcigpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIjZ2V0SG92ZXJJbmZvKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhvdmVySW5mbyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHN1YmplY3QpIHsKLQkJdHJ5IHsKLQkJCUlEb2N1bWVudCBkb2M9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCWludCBvZmZzZXQ9IHN1YmplY3QuZ2V0T2Zmc2V0KCk7Ci0JCQlpZiAob2Zmc2V0ID49IDIgJiYgIiR7Ii5lcXVhbHMoZG9jLmdldChvZmZzZXQtMiwgMikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgdmFyTmFtZT0gZG9jLmdldChvZmZzZXQsIHN1YmplY3QuZ2V0TGVuZ3RoKCkpOwotCQkJCVRlbXBsYXRlQ29udGV4dFR5cGUgY29udGV4dFR5cGU9IEFudFRlbXBsYXRlQWNjZXNzLmdldERlZmF1bHQoKS5nZXRDb250ZXh0VHlwZVJlZ2lzdHJ5KCkuZ2V0Q29udGV4dFR5cGUoVGFza0NvbnRleHRUeXBlLlRBU0tfQ09OVEVYVF9UWVBFKTsKLQkJCQlpZiAoY29udGV4dFR5cGUgIT0gbnVsbCkgewotCQkJCQlJdGVyYXRvciBpdGVyPSBjb250ZXh0VHlwZS5yZXNvbHZlcnMoKTsKLQkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQlUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXIgdmFyPSAoVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyKSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmICh2YXJOYW1lLmVxdWFscyh2YXIuZ2V0VHlwZSgpKSkgewotCQkJCQkJCXJldHVybiB2YXIuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0JCQkJCi0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIjZ2V0SG92ZXJSZWdpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwgaW50KQotCSAqLwotCXB1YmxpYyBJUmVnaW9uIGdldEhvdmVyUmVnaW9uKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJaWYgKHRleHRWaWV3ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIFhNTFRleHRIb3Zlci5nZXRSZWdpb24odGV4dFZpZXdlciwgb2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCi0JfQotfSAKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RlbXBsYXRlcy9BbnRUZW1wbGF0ZVZpZXdlckNvbmZpZ3VyYXRpb24uamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RlbXBsYXRlcy9BbnRUZW1wbGF0ZVZpZXdlckNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdlNGI1OS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZW1wbGF0ZXMvQW50VGVtcGxhdGVWaWV3ZXJDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZW1wbGF0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50U291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLQotcHVibGljIGNsYXNzIEFudFRlbXBsYXRlVmlld2VyQ29uZmlndXJhdGlvbiBleHRlbmRzIEFudFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gewotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24jZ2V0VGV4dEhvdmVyKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXIsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElUZXh0SG92ZXIgZ2V0VGV4dEhvdmVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJcmV0dXJuIG5ldyBBbnRUZW1wbGF0ZVZhcmlhYmxlVGV4dEhvdmVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGVtcGxhdGVzL0FudFZhcmlhYmxlUmVzb2x2ZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RlbXBsYXRlcy9BbnRWYXJpYWJsZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZTA2N2IuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGVtcGxhdGVzL0FudFZhcmlhYmxlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZW1wbGF0ZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlVmFyaWFibGVSZXNvbHZlcjsKLQotLyoqCi0gKiBMb29rcyB1cCBleGlzdGluZyBhbnQgdmFyaWFibGVzIGFuZCBwcm9wb3NlcyB0aGVtLiBUaGUgcHJvcG9zYWxzIGFyZSBzb3J0ZWQgYnkgCi0gKiB0aGVpciBwcmVmaXgtbGlrZW5lc3Mgd2l0aCB0aGUgdmFyaWFibGUgdHlwZS4KLSAqLwotcHVibGljIGNsYXNzIEFudFZhcmlhYmxlUmVzb2x2ZXIgZXh0ZW5kcyBUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXIgewotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXIjcmVzb2x2ZUFsbChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIHJlc29sdmVBbGwoVGVtcGxhdGVDb250ZXh0IGNvbnRleHQpIHsKLQkJU3RyaW5nW10gcHJvcG9zYWxzPSBuZXcgU3RyaW5nW10geyAiJHtzcmNEaXJ9IiwgIiR7ZHN0RGlyfSIgfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQotCQlBcnJheXMuc29ydChwcm9wb3NhbHMsIG5ldyBDb21wYXJhdG9yKCkgewotCi0JCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCQlyZXR1cm4gZ2V0Q29tbW9uUHJlZml4TGVuZ3RoKGdldFR5cGUoKSwgKFN0cmluZykgbzIpIC0gZ2V0Q29tbW9uUHJlZml4TGVuZ3RoKGdldFR5cGUoKSwgKFN0cmluZykgbzEpOwotCQkJfQotCi0JCQlwcml2YXRlIGludCBnZXRDb21tb25QcmVmaXhMZW5ndGgoU3RyaW5nIHR5cGUsIFN0cmluZyB2YXIpIHsKLQkJCQlpbnQgaT0gMDsKLQkJCQlDaGFyU2VxdWVuY2UgdlNlcT0gdmFyLnN1YlNlcXVlbmNlKDIsIHZhci5sZW5ndGgoKSAtIDEpOyAvLyBzdHJpcCBhd2F5ICR7fQotCQkJCXdoaWxlIChpIDwgdHlwZS5sZW5ndGgoKSAmJiBpIDwgdlNlcS5sZW5ndGgoKSkKLQkJCQkJaWYgKENoYXJhY3Rlci50b0xvd2VyQ2FzZSh0eXBlLmNoYXJBdChpKSkgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHZTZXEuY2hhckF0KGkpKSkKLQkJCQkJCWkrKzsKLQkJCQkJZWxzZQotCQkJCQkJYnJlYWs7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJcmV0dXJuIHByb3Bvc2FsczsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZW1wbGF0ZXMvQnVpbGRGaWxlQ29udGV4dFR5cGUuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RlbXBsYXRlcy9CdWlsZEZpbGVDb250ZXh0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmJkZGY3Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RlbXBsYXRlcy9CdWlsZEZpbGVDb250ZXh0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRlbXBsYXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXM7Ci0KLQotLyoqCi0gKiBBIHZlcnkgc2ltcGxlIGNvbnRleHQgdHlwZS4KLSAqLwotcHVibGljIGNsYXNzIEJ1aWxkRmlsZUNvbnRleHRUeXBlIGV4dGVuZHMgVGVtcGxhdGVDb250ZXh0VHlwZSB7Ci0KLQkvKiogVGhpcyBjb250ZXh0J3MgaWQgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMREZJTEVfQ09OVEVYVF9UWVBFPSAib3JnLmVjbGlwc2UuYW50LnVpLnRlbXBsYXRlQ29udGV4dFR5cGUuYnVpbGRGaWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBYTUwgY29udGV4dCB0eXBlLiAKLQkgKi8KLQlwdWJsaWMgQnVpbGRGaWxlQ29udGV4dFR5cGUoKSB7Ci0JCWFkZEdsb2JhbFJlc29sdmVycygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRHbG9iYWxSZXNvbHZlcnMoKSB7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5DdXJzb3IoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Xb3JkU2VsZWN0aW9uKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuTGluZVNlbGVjdGlvbigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkRvbGxhcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkRhdGUoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5ZZWFyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuVGltZSgpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlVzZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGVtcGxhdGVzL1RhcmdldENvbnRleHRUeXBlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZW1wbGF0ZXMvVGFyZ2V0Q29udGV4dFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRmYTJiMC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZW1wbGF0ZXMvVGFyZ2V0Q29udGV4dFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRlbXBsYXRlczsKLQotcHVibGljIGNsYXNzIFRhcmdldENvbnRleHRUeXBlIGV4dGVuZHMgQnVpbGRGaWxlQ29udGV4dFR5cGUgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9DT05URVhUX1RZUEU9ICJvcmcuZWNsaXBzZS5hbnQudWkudGVtcGxhdGVDb250ZXh0VHlwZS50YXJnZXQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZW1wbGF0ZXMvVGFza0NvbnRleHRUeXBlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZW1wbGF0ZXMvVGFza0NvbnRleHRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZDhmOWEuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGVtcGxhdGVzL1Rhc2tDb250ZXh0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGVtcGxhdGVzOwotCi1wdWJsaWMgY2xhc3MgVGFza0NvbnRleHRUeXBlIGV4dGVuZHMgQnVpbGRGaWxlQ29udGV4dFR5cGUgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfQ09OVEVYVF9UWVBFPSAib3JnLmVjbGlwc2UuYW50LnVpLnRlbXBsYXRlQ29udGV4dFR5cGUudGFzayI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQWJzdHJhY3RBbnRFZGl0b3JTY2FubmVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0Fic3RyYWN0QW50RWRpdG9yU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2U1YjAyLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQWJzdHJhY3RBbnRFZGl0b3JTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQ29sb3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuUnVsZUJhc2VkU2Nhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbnRFZGl0b3JTY2FubmVyIGV4dGVuZHMgUnVsZUJhc2VkU2Nhbm5lciB7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGFwdFRvQ29sb3JDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCwgVG9rZW4gdG9rZW4pIHsKLQkJUkdCIHJnYj0gbnVsbDsKLQkJCi0JCU9iamVjdCB2YWx1ZT0gZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgUkdCKSB7Ci0JCQlyZ2I9IChSR0IpIHZhbHVlOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlyZ2I9IFN0cmluZ0NvbnZlcnRlci5hc1JHQigoU3RyaW5nKSB2YWx1ZSk7Ci0JCX0KLQkJCQotCQlpZiAocmdiICE9IG51bGwpIHsKLQkJCVRleHRBdHRyaWJ1dGUgYXR0cj0gKFRleHRBdHRyaWJ1dGUpIHRva2VuLmdldERhdGEoKTsKLQkJCXRva2VuLnNldERhdGEobmV3IFRleHRBdHRyaWJ1dGUoQ29sb3JNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRDb2xvcihyZ2IpLCBhdHRyLmdldEJhY2tncm91bmQoKSwgYXR0ci5nZXRTdHlsZSgpKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGFwdFRvU3R5bGVDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCwgVG9rZW4gdG9rZW4sIGludCBzdHlsZUF0dHJpYnV0ZSkgewotCSAJaWYgKHRva2VuID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlib29sZWFuIGV2ZW50VmFsdWU9IGZhbHNlOwotCQlPYmplY3QgdmFsdWU9IGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKLQkJCWV2ZW50VmFsdWU9ICgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotCQl9IGVsc2UgaWYgKElQcmVmZXJlbmNlU3RvcmUuVFJVRS5lcXVhbHModmFsdWUpKSB7Ci0JCQlldmVudFZhbHVlPSB0cnVlOwotCQl9Ci0JCQotCQlUZXh0QXR0cmlidXRlIGF0dHI9IChUZXh0QXR0cmlidXRlKSB0b2tlbi5nZXREYXRhKCk7Ci0JCWJvb2xlYW4gYWN0aXZlVmFsdWU9IChhdHRyLmdldFN0eWxlKCkgJiBzdHlsZUF0dHJpYnV0ZSkgPT0gc3R5bGVBdHRyaWJ1dGU7Ci0JCWlmIChhY3RpdmVWYWx1ZSAhPSBldmVudFZhbHVlKSB7IAotCQkJdG9rZW4uc2V0RGF0YShuZXcgVGV4dEF0dHJpYnV0ZShhdHRyLmdldEZvcmVncm91bmQoKSwgYXR0ci5nZXRCYWNrZ3JvdW5kKCksIGV2ZW50VmFsdWUgPyBhdHRyLmdldFN0eWxlKCkgfCBzdHlsZUF0dHJpYnV0ZSA6IGF0dHIuZ2V0U3R5bGUoKSAmIH5zdHlsZUF0dHJpYnV0ZSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgY3JlYXRlVGV4dEF0dHJpYnV0ZShTdHJpbmcgY29sb3JJRCwgU3RyaW5nIGJvbGRLZXksIFN0cmluZyBpdGFsaWNLZXkpIHsKLQkJQ29sb3IgY29sb3I9IG51bGw7Ci0JCWlmIChjb2xvcklEICE9IG51bGwpIHsKLQkJCWNvbG9yPSBBbnRVSVBsdWdpbi5nZXRQcmVmZXJlbmNlQ29sb3IoY29sb3JJRCk7Ci0JCX0KLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZT0gQW50VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlpbnQgc3R5bGU9IHN0b3JlLmdldEJvb2xlYW4oYm9sZEtleSkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCWlmIChzdG9yZS5nZXRCb29sZWFuKGl0YWxpY0tleSkpIHsKLQkJCXN0eWxlIHw9IFNXVC5JVEFMSUM7Ci0JCX0KLQkJCi0JCXJldHVybiBuZXcgVGV4dEF0dHJpYnV0ZShjb2xvciwgbnVsbCwgc3R5bGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW5ub3RhdGlvbk1vZGVsRmFjdG9yeS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9Bbm5vdGF0aW9uTW9kZWxGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYmIyNWYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9Bbm5vdGF0aW9uTW9kZWxGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JQW5ub3RhdGlvbk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25Nb2RlbEZhY3RvcnkgaW1wbGVtZW50cyBJQW5ub3RhdGlvbk1vZGVsRmFjdG9yeSB7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklBbm5vdGF0aW9uTW9kZWxGYWN0b3J5I2NyZWF0ZUFubm90YXRpb25Nb2RlbChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgpCi0gICAgICovCi0gICAgcHVibGljIElBbm5vdGF0aW9uTW9kZWwgY3JlYXRlQW5ub3RhdGlvbk1vZGVsKElQYXRoIGxvY2F0aW9uKSB7Ci0gICAgICAgIElGaWxlIGZpbGUgPSBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihsb2NhdGlvbik7Ci0gICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQW50RXh0ZXJuYWxBbm5vdGF0aW9uTW9kZWwoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IEFudEFubm90YXRpb25Nb2RlbChmaWxlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0FudEFubm90YXRpb25Nb2RlbC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9BbnRBbm5vdGF0aW9uTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1NWE1MC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0FudEFubm90YXRpb25Nb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmRlYnVnLklBbnREZWJ1Z0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLkFudEVkaXRvck1hcmtlclVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLklQcm9ibGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5JUHJvYmxlbVJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuRWRpdG9yc1VJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLk1hcmtlclV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsOwotCi1wdWJsaWMgY2xhc3MgQW50QW5ub3RhdGlvbk1vZGVsIGV4dGVuZHMgUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWwgaW1wbGVtZW50cyBJUHJvYmxlbVJlcXVlc3RvciB7Ci0JCi0JcHJpdmF0ZSBMaXN0IGZHZW5lcmF0ZWRBbm5vdGF0aW9ucz0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTGlzdCBmQ29sbGVjdGVkUHJvYmxlbXM9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlwdWJsaWMgQW50QW5ub3RhdGlvbk1vZGVsKElGaWxlIGZpbGUpIHsKLQkJc3VwZXIoZmlsZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RNYXJrZXJBbm5vdGF0aW9uTW9kZWwjY3JlYXRlTWFya2VyQW5ub3RhdGlvbihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyKQotCSAqLwotCXByb3RlY3RlZCBNYXJrZXJBbm5vdGF0aW9uIGNyZWF0ZU1hcmtlckFubm90YXRpb24oSU1hcmtlciBtYXJrZXIpIHsKLQkJU3RyaW5nIG1hcmtlclR5cGU9IE1hcmtlclV0aWxpdGllcy5nZXRNYXJrZXJUeXBlKG1hcmtlcik7Ci0JCWlmIChBbnRFZGl0b3JNYXJrZXJVcGRhdGVyLkJVSUxERklMRV9QUk9CTEVNX01BUktFUi5lcXVhbHMobWFya2VyVHlwZSkpIHsKLQkJICAgIC8vd2UgY3VycmVudGx5IGRvIG5vdCBzaG93IEFudCBidWlsZGZpbGUgcHJvYmxlbSBtYXJrZXJzIGluIHRoZSBBbnQgZWRpdG9yIGFzIHdlIGhhdmUgbm8gbm90aW9uIG9mIAotCQkgICAgLy9hbm5vdGF0aW9uIG92ZXJsYXlzCi0JCSAgICAvL2J1ZyAKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBuZXcgTWFya2VyQW5ub3RhdGlvbihFZGl0b3JzVUkuZ2V0QW5ub3RhdGlvblR5cGVMb29rdXAoKS5nZXRBbm5vdGF0aW9uVHlwZShtYXJrZXIpLCBtYXJrZXIpOwotCX0KLQotCXByb3RlY3RlZCBQb3NpdGlvbiBjcmVhdGVQb3NpdGlvbkZyb21Qcm9ibGVtKElQcm9ibGVtIHByb2JsZW0pIHsKLQkJaW50IHN0YXJ0PSBwcm9ibGVtLmdldE9mZnNldCgpOwotCQlpZiAoc3RhcnQgPj0gMCkgewotCQkJaW50IGxlbmd0aD0gcHJvYmxlbS5nZXRMZW5ndGgoKTsKLQkJCQkKLQkJCWlmIChsZW5ndGggPj0gMCkKLQkJCQlyZXR1cm4gbmV3IFBvc2l0aW9uKHN0YXJ0LCBsZW5ndGgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3Iub3V0bGluZS5JUHJvYmxlbVJlcXVlc3RvciNhY2NlcHRQcm9ibGVtKG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3Iub3V0bGluZS5JUHJvYmxlbSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2NlcHRQcm9ibGVtKElQcm9ibGVtIHByb2JsZW0pIHsKLQkJZkNvbGxlY3RlZFByb2JsZW1zLmFkZChwcm9ibGVtKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLklQcm9ibGVtUmVxdWVzdG9yI2FjY2VwdFByb2JsZW0ob3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLklQcm9ibGVtKQotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luUmVwb3J0aW5nKCkgewotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmUuSVByb2JsZW1SZXF1ZXN0b3IjYWNjZXB0UHJvYmxlbShvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmUuSVByb2JsZW0pCi0JICovCi0JcHVibGljIHZvaWQgZW5kUmVwb3J0aW5nKCkgewotCQlib29sZWFuIHRlbXBvcmFyeVByb2JsZW1zQ2hhbmdlZD0gZmFsc2U7Ci0JCQkKLQkJc3luY2hyb25pemVkIChnZXRBbm5vdGF0aW9uTWFwKCkpIHsKLQkJCQkKLQkJCWlmIChmR2VuZXJhdGVkQW5ub3RhdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJCXRlbXBvcmFyeVByb2JsZW1zQ2hhbmdlZD0gdHJ1ZTsJCi0JCQkJcmVtb3ZlQW5ub3RhdGlvbnMoZkdlbmVyYXRlZEFubm90YXRpb25zLCBmYWxzZSwgdHJ1ZSk7Ci0JCQkJZkdlbmVyYXRlZEFubm90YXRpb25zLmNsZWFyKCk7Ci0JCQl9Ci0JCQkJCi0JCQlpZiAoZkNvbGxlY3RlZFByb2JsZW1zICE9IG51bGwgJiYgZkNvbGxlY3RlZFByb2JsZW1zLnNpemUoKSA+IDApIHsKLQkJCQlJdGVyYXRvciBlPSBmQ29sbGVjdGVkUHJvYmxlbXMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQkJCQotCQkJCQlJUHJvYmxlbSBwcm9ibGVtPSAoSVByb2JsZW0pIGUubmV4dCgpOwotCQkJCQkJCi0JCQkJCVBvc2l0aW9uIHBvc2l0aW9uPSBjcmVhdGVQb3NpdGlvbkZyb21Qcm9ibGVtKHByb2JsZW0pOwotCQkJCQlpZiAocG9zaXRpb24gIT0gbnVsbCkgewotCQkJCQkJCQotCQkJCQkJWE1MUHJvYmxlbUFubm90YXRpb24gYW5ub3RhdGlvbj0gbmV3IFhNTFByb2JsZW1Bbm5vdGF0aW9uKHByb2JsZW0pOwotCQkJCQkJZkdlbmVyYXRlZEFubm90YXRpb25zLmFkZChhbm5vdGF0aW9uKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJYWRkQW5ub3RhdGlvbihhbm5vdGF0aW9uLCBwb3NpdGlvbiwgZmFsc2UpOwotCQkJCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJCQlBbnRVSVBsdWdpbi5sb2coZXgpOwotCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJdGVtcG9yYXJ5UHJvYmxlbXNDaGFuZ2VkPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCQkKLQkJCQlmQ29sbGVjdGVkUHJvYmxlbXMuY2xlYXIoKTsKLQkJCX0KLQkJfQotCQkJCQotCQlpZiAodGVtcG9yYXJ5UHJvYmxlbXNDaGFuZ2VkKQotCQkJZmlyZU1vZGVsQ2hhbmdlZChuZXcgQW5ub3RhdGlvbk1vZGVsRXZlbnQodGhpcykpOwotCX0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0TWFya2VyQW5ub3RhdGlvbk1vZGVsI2lzQWNjZXB0YWJsZShvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyKQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQWNjZXB0YWJsZShJTWFya2VyIG1hcmtlcikgewotICAgICAgICBpZiAoc3VwZXIuaXNBY2NlcHRhYmxlKG1hcmtlcikpIHsKLSAgICAgICAgICByZXR1cm4gIW1hcmtlci5nZXRBdHRyaWJ1dGUoSUFudERlYnVnQ29uc3RhbnRzLkFOVF9SVU5fVE9fTElORSwgZmFsc2UpOyAgCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW50RG9jdW1lbnRTZXR1cFBhcnRpY2lwYW50LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0FudERvY3VtZW50U2V0dXBQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjRiZjk0Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW50RG9jdW1lbnRTZXR1cFBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklEb2N1bWVudFNldHVwUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5GYXN0UGFydGl0aW9uZXI7Ci0KLS8qKgotICogVGhlIGRvY3VtZW50IHNldHVwIHBhcnRpY2lwYW50IGZvciBBbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnREb2N1bWVudFNldHVwUGFydGljaXBhbnQgIGltcGxlbWVudHMgSURvY3VtZW50U2V0dXBQYXJ0aWNpcGFudCB7Ci0KLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgQW50IHBhcnRpdGlvbmluZy4KLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQU5UX1BBUlRJVElPTklORz0gIm9yZy5lY2xpcHNlLmFudC51aS5hbnRQYXJ0aXRpb25pbmciOyAgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBBbnREb2N1bWVudFNldHVwUGFydGljaXBhbnQoKSB7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSURvY3VtZW50U2V0dXBQYXJ0aWNpcGFudCNzZXR1cChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXR1cChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uMykgewotCQkJSURvY3VtZW50RXh0ZW5zaW9uMyBleHRlbnNpb24zPSAoSURvY3VtZW50RXh0ZW5zaW9uMykgZG9jdW1lbnQ7Ci0JCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IGNyZWF0ZURvY3VtZW50UGFydGl0aW9uZXIoKTsKLQkJCWV4dGVuc2lvbjMuc2V0RG9jdW1lbnRQYXJ0aXRpb25lcihBTlRfUEFSVElUSU9OSU5HLCBwYXJ0aXRpb25lcik7Ci0JCQlwYXJ0aXRpb25lci5jb25uZWN0KGRvY3VtZW50KTsKLQkJfSAKLQl9Ci0JCi0JcHJpdmF0ZSBJRG9jdW1lbnRQYXJ0aXRpb25lciBjcmVhdGVEb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQlyZXR1cm4gbmV3IEZhc3RQYXJ0aXRpb25lcigKLQkJCQluZXcgQW50RWRpdG9yUGFydGl0aW9uU2Nhbm5lcigpLCBuZXcgU3RyaW5nW117Ci0JCQkJCQlBbnRFZGl0b3JQYXJ0aXRpb25TY2FubmVyLlhNTF9UQUcsCi0JCQkJCQlBbnRFZGl0b3JQYXJ0aXRpb25TY2FubmVyLlhNTF9DT01NRU5ULCAKLQkJCQkJCUFudEVkaXRvclBhcnRpdGlvblNjYW5uZXIuWE1MX0NEQVRBLAotCQkJCQkJQW50RWRpdG9yUGFydGl0aW9uU2Nhbm5lci5YTUxfRFREfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9BbnRFZGl0b3JQYXJ0aXRpb25TY2FubmVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0FudEVkaXRvclBhcnRpdGlvblNjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFiY2RjYi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0FudEVkaXRvclBhcnRpdGlvblNjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDYgR0VCSVQgR2VzZWxsc2NoYWZ0IGZ1ZXIgRURWLUJlcmF0dW5nCi0gKiB1bmQgSW5mb3JtYXRpay1UZWNobm9sb2dpZW4gbWJILCAKLSAqIEJlcmxpbiwgRHVlc3NlbGRvcmYsIEZyYW5rZnVydCAoR2VybWFueSkgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgR0VCSVQgR2VzZWxsc2NoYWZ0IGZ1ZXIgRURWLUJlcmF0dW5nIHVuZCBJbmZvcm1hdGlrLVRlY2hub2xvZ2llbiBtYkggLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAkgICBJQk0gQ29ycG9yYXRpb24gLSBidWcgMzI4OTAsIGJ1ZyAyNDEwOCwgYnVnIDExMTc0MAotICogICAgIEpvaG4tTWFzb24gUC4gU2hhY2tlbGZvcmQgLSBidWcgNTczNzkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGV4dDsKLQotLyoKLSAqIFRoaXMgZmlsZSBvcmlnaW5hdGVzIGZyb20gYW4gaW50ZXJuYWwgcGFja2FnZSBvZiBFY2xpcHNlJ3MgCi0gKiBNYW5pZmVzdCBFZGl0b3IuIEl0IGhhcyBiZWVuIGNvcGllZCBieSBHRUJJVCB0byBoZXJlIGluIG9yZGVyIHRvCi0gKiBwZXJtYW5lbnRseSB1c2UgdGhvc2UgZmVhdHVyZXMuIEl0IGhhcyBiZWVuIHJlbmFtZWQgYW5kIGVkaXRlZCBieSBHRUJJVCAKLSAqIGFmdGVyIGNvcHlpbmcuCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVByZWRpY2F0ZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5NdWx0aUxpbmVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuUnVsZUJhc2VkUGFydGl0aW9uU2Nhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlRva2VuOwotCi0vKioKLSAqIFNjYW5uZXIgdGhhdCBzY2FucyB0aGUgZG9jdW1lbnQgYW5kIHBhcnRpdGlvbnMgdGhlIGRvY3VtZW50IGludG8gdGhlIGZvdXIgCi0gKiBzdXBwb3J0ZWQgY29udGVudCB0eXBlczoKLSAqIDx1bD4KLSAqIDxsaT5YTUxfQ09NTUVOVDwvbGk+Ci0gKiA8bGk+WE1MX1RBRzwvbGk+Ci0gKiA8bGk+WE1MX0NEQVRBPC9saT4KLSAqIDxsaT5YTUxfRFREPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBbnRFZGl0b3JQYXJ0aXRpb25TY2FubmVyIGV4dGVuZHMgUnVsZUJhc2VkUGFydGl0aW9uU2Nhbm5lciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxfQ09NTUVOVCA9ICJfX3htbF9jb21tZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTF9UQUcgPSAiX194bWxfdGFnIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTF9DREFUQSA9ICJfX3htbF9jZGF0YSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxfRFREID0gIl9feG1sX2R0ZCI7IC8vJE5PTi1OTFMtMSQKLQkKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgotICAgICAqLwotCXB1YmxpYyBBbnRFZGl0b3JQYXJ0aXRpb25TY2FubmVyKCkgewotCi0JCUlQcmVkaWNhdGVSdWxlW10gcnVsZXMgPW5ldyBJUHJlZGljYXRlUnVsZVs0XTsKLQotICAgICAgICBJVG9rZW4geG1sQ0RBVEEgPSBuZXcgVG9rZW4oWE1MX0NEQVRBKTsKLQkJcnVsZXNbMF09IG5ldyBNdWx0aUxpbmVSdWxlKCI8IVtDREFUQVsiLCAiXV0+IiwgeG1sQ0RBVEEpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCi0gICAgICAgIElUb2tlbiB4bWxDb21tZW50ID0gbmV3IFRva2VuKFhNTF9DT01NRU5UKTsKLQkJcnVsZXNbMV09IG5ldyBNdWx0aUxpbmVSdWxlKCI8IS0tIiwgIi0tPiIsIHhtbENvbW1lbnQsICdcXCcsIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICAgICBJVG9rZW4gdGFnID0gbmV3IFRva2VuKFhNTF9UQUcpOwotCQlydWxlc1syXT0gbmV3IFRhZ1J1bGUodGFnKTsKLQkKLQkJSVRva2VuIHhtbERURCA9IG5ldyBUb2tlbihYTUxfRFREKTsKLQkJcnVsZXNbM109IG5ldyBEb2NUeXBlUnVsZSh4bWxEVEQpOwotCQkKLQkJc2V0UHJlZGljYXRlUnVsZXMocnVsZXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0FudEVkaXRvclByb2NJbnN0clNjYW5uZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW50RWRpdG9yUHJvY0luc3RyU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTVjY2RmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW50RWRpdG9yUHJvY0luc3RyU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBHRUJJVCBHZXNlbGxzY2hhZnQgZnVlciBFRFYtQmVyYXR1bmcKLSAqIHVuZCBJbmZvcm1hdGlrLVRlY2hub2xvZ2llbiBtYkgsIAotICogQmVybGluLCBEdWVzc2VsZG9yZiwgRnJhbmtmdXJ0IChHZXJtYW55KSBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBHRUJJVCBHZXNlbGxzY2hhZnQgZnVlciBFRFYtQmVyYXR1bmcgdW5kIEluZm9ybWF0aWstVGVjaG5vbG9naWVuIG1iSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCSAgIElCTSBDb3Jwb3JhdGlvbiAtIGJ1ZyBmaXhlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLkFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLk11bHRpTGluZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5Ub2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLldoaXRlc3BhY2VSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi0vKioKLSAqIFRoZSBzY2FubmVyIHRvIHRva2VuaXplIGZvciBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgYW5kIHRleHQKLSAqLwotcHVibGljIGNsYXNzIEFudEVkaXRvclByb2NJbnN0clNjYW5uZXIgZXh0ZW5kcyBBYnN0cmFjdEFudEVkaXRvclNjYW5uZXIgewotCi0JVG9rZW4gZlByb2NJbnN0cnVjdGlvblRva2VuPSBudWxsOwotCQotICAgIHB1YmxpYyBBbnRFZGl0b3JQcm9jSW5zdHJTY2FubmVyKCkgewotCQlJUnVsZVtdIHJ1bGVzID1uZXcgSVJ1bGVbMl07Ci0gICAgICAgIGZQcm9jSW5zdHJ1Y3Rpb25Ub2tlbiA9Ci0gICAgICAgICAgICBuZXcgVG9rZW4oY3JlYXRlVGV4dEF0dHJpYnV0ZShJQW50RWRpdG9yQ29sb3JDb25zdGFudHMuUFJPQ0VTU0lOR19JTlNUUlVDVElPTlNfQ09MT1IsIAotCQkJCQlJQW50RWRpdG9yQ29sb3JDb25zdGFudHMuUFJPQ0VTU0lOR19JTlNUUlVDVElPTlNfQ09MT1IgKyBBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9CT0xEX1NVRkZJWCwKLQkJCQkJSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05TX0NPTE9SICsgQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSVRBTElDX1NVRkZJWCkpOwotCi0gICAgICAgIC8vQWRkIHJ1bGUgZm9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zCi0gICAgICAgIHJ1bGVzWzBdPSBuZXcgTXVsdGlMaW5lUnVsZSgiPD8iLCAiPz4iLCBmUHJvY0luc3RydWN0aW9uVG9rZW4pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICAgICAvLyBBZGQgZ2VuZXJpYyB3aGl0ZXNwYWNlIHJ1bGUuCi0gICAgICAgIHJ1bGVzWzFdPSBuZXcgV2hpdGVzcGFjZVJ1bGUobmV3IEFudEVkaXRvcldoaXRlc3BhY2VEZXRlY3RvcigpKTsKLQotICAgICAgICBzZXRSdWxlcyhydWxlcyk7Ci0gICAgICAgIAotICAgICAgICBzZXREZWZhdWx0UmV0dXJuVG9rZW4obmV3IFRva2VuKGNyZWF0ZVRleHRBdHRyaWJ1dGUoSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLlRFWFRfQ09MT1IsIAotICAgIAkJCQkJCQlJQW50RWRpdG9yQ29sb3JDb25zdGFudHMuVEVYVF9DT0xPUiArIEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0JPTERfU1VGRklYLAotCQkJCQkJCQlJQW50RWRpdG9yQ29sb3JDb25zdGFudHMuVEVYVF9DT0xPUiArIEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0lUQUxJQ19TVUZGSVgpKSk7Ci0gICAgfQotCi0JcHJpdmF0ZSBUb2tlbiBnZXRUb2tlbkFmZmVjdGVkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuc3RhcnRzV2l0aChJQW50RWRpdG9yQ29sb3JDb25zdGFudHMuUFJPQ0VTU0lOR19JTlNUUlVDVElPTlNfQ09MT1IpKSB7Ci0gICAgCQlyZXR1cm4gZlByb2NJbnN0cnVjdGlvblRva2VuOwotICAgIAl9Ci0gICAgCXJldHVybiAoVG9rZW4pZkRlZmF1bHRSZXR1cm5Ub2tlbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRhcHRUb1ByZWZlcmVuY2VDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotICAgIAlTdHJpbmcgcHJvcGVydHk9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0gICAgCWlmIChwcm9wZXJ0eS5zdGFydHNXaXRoKElBbnRFZGl0b3JDb2xvckNvbnN0YW50cy5URVhUX0NPTE9SKSB8fCBwcm9wZXJ0eS5zdGFydHNXaXRoKElBbnRFZGl0b3JDb2xvckNvbnN0YW50cy5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OU19DT0xPUikpIHsgICAgCQkKLSAgICAJCWlmIChwcm9wZXJ0eS5lbmRzV2l0aChBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9CT0xEX1NVRkZJWCkpIHsKLQkgICAgCQlhZGFwdFRvU3R5bGVDaGFuZ2UoZXZlbnQsIGdldFRva2VuQWZmZWN0ZWQoZXZlbnQpLCBTV1QuQk9MRCk7Ci0JICAgIAl9IGVsc2UgaWYgKHByb3BlcnR5LmVuZHNXaXRoKEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0lUQUxJQ19TVUZGSVgpKSB7Ci0JICAgIAkJYWRhcHRUb1N0eWxlQ2hhbmdlKGV2ZW50LCBnZXRUb2tlbkFmZmVjdGVkKGV2ZW50KSwgU1dULklUQUxJQyk7Ci0JICAgIAl9IGVsc2UgewotCSAgICAJCWFkYXB0VG9Db2xvckNoYW5nZShldmVudCwgZ2V0VG9rZW5BZmZlY3RlZChldmVudCkpOwotCSAgICAJfQotICAgIAl9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW50RWRpdG9yVGFnU2Nhbm5lci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9BbnRFZGl0b3JUYWdTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YjUwYjIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9BbnRFZGl0b3JUYWdTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IEdFQklUIEdlc2VsbHNjaGFmdCBmdWVyIEVEVi1CZXJhdHVuZwotICogdW5kIEluZm9ybWF0aWstVGVjaG5vbG9naWVuIG1iSCwgCi0gKiBCZXJsaW4sIER1ZXNzZWxkb3JmLCBGcmFua2Z1cnQgKEdlcm1hbnkpIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEdFQklUIEdlc2VsbHNjaGFmdCBmdWVyIEVEVi1CZXJhdHVuZyB1bmQgSW5mb3JtYXRpay1UZWNobm9sb2dpZW4gbWJIIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAJICAgSUJNIENvcnBvcmF0aW9uIC0gYnVnIDMxNzk2LCBidWcgMjQxMDgsIGJ1ZyA0NzEzOQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLkFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLk11bHRpTGluZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5TaW5nbGVMaW5lUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuV2hpdGVzcGFjZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLS8qKgotICogVGhlIHNjYW5uZXIgdG8gdG9rZW5pemUgZm9yIHN0cmluZ3MgYW5kIHRhZ3MKLSAqLwotcHVibGljIGNsYXNzIEFudEVkaXRvclRhZ1NjYW5uZXIgZXh0ZW5kcyBBYnN0cmFjdEFudEVkaXRvclNjYW5uZXIgewotCi0JcHJpdmF0ZSBUb2tlbiBmU3RyaW5nVG9rZW47Ci0JCi0gICAgcHVibGljIEFudEVkaXRvclRhZ1NjYW5uZXIoKSB7Ci0gICAgCWZTdHJpbmdUb2tlbj0gbmV3IFRva2VuKAotICAgIAkJCWNyZWF0ZVRleHRBdHRyaWJ1dGUoSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLlNUUklOR19DT0xPUiwgCi0gICAgCQkJCQlJQW50RWRpdG9yQ29sb3JDb25zdGFudHMuU1RSSU5HX0NPTE9SICsgQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfQk9MRF9TVUZGSVgsCi0JCQkJCQlJQW50RWRpdG9yQ29sb3JDb25zdGFudHMuU1RSSU5HX0NPTE9SICsgQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSVRBTElDX1NVRkZJWCkpOwotICAgICAgICAgICAgICAgICAgICAKLQkJSVJ1bGVbXSBydWxlcz0gbmV3IElSdWxlWzNdOwotCi0gICAgICAgIC8vIEFkZCBydWxlIGZvciBzaW5nbGUgYW5kIGRvdWJsZSBxdW90ZXMKLSAgICAgICAgcnVsZXNbMF09IG5ldyBNdWx0aUxpbmVSdWxlKCJcIiIsICJcIiIsIGZTdHJpbmdUb2tlbiwgJ1xcJyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBydWxlc1sxXT0gbmV3IFNpbmdsZUxpbmVSdWxlKCInIiwgIiciLCBmU3RyaW5nVG9rZW4sICdcXCcpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICAgICAvLyBBZGQgZ2VuZXJpYyB3aGl0ZXNwYWNlIHJ1bGUuCi0gICAgICAgIHJ1bGVzWzJdPSBuZXcgV2hpdGVzcGFjZVJ1bGUobmV3IEFudEVkaXRvcldoaXRlc3BhY2VEZXRlY3RvcigpKTsKLQotICAgICAgICBzZXRSdWxlcyhydWxlcyk7Ci0gICAgICAgIAotICAgICAgICBzZXREZWZhdWx0UmV0dXJuVG9rZW4oCi0gICAgICAgIAkJbmV3IFRva2VuKGNyZWF0ZVRleHRBdHRyaWJ1dGUoSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLlRBR19DT0xPUiwgCi0gICAgCQkJCQlJQW50RWRpdG9yQ29sb3JDb25zdGFudHMuVEFHX0NPTE9SICsgQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfQk9MRF9TVUZGSVgsCi0JCQkJCQlJQW50RWRpdG9yQ29sb3JDb25zdGFudHMuVEFHX0NPTE9SICsgQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSVRBTElDX1NVRkZJWCkpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRhcHRUb1ByZWZlcmVuY2VDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotICAgIAlTdHJpbmcgcHJvcGVydHk9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0gICAgCWlmIChwcm9wZXJ0eS5zdGFydHNXaXRoKElBbnRFZGl0b3JDb2xvckNvbnN0YW50cy5UQUdfQ09MT1IpIHx8IHByb3BlcnR5LnN0YXJ0c1dpdGgoSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLlNUUklOR19DT0xPUikpIHsKLSAgICAJCWlmIChwcm9wZXJ0eS5lbmRzV2l0aChBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9CT0xEX1NVRkZJWCkpIHsKLSAgICAJCQlhZGFwdFRvU3R5bGVDaGFuZ2UoZXZlbnQsIGdldFRva2VuQWZmZWN0ZWQoZXZlbnQpLCBTV1QuQk9MRCk7Ci0gICAgCQl9IGVsc2UgaWYgKHByb3BlcnR5LmVuZHNXaXRoKEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0lUQUxJQ19TVUZGSVgpKSB7Ci0gICAgCQkJYWRhcHRUb1N0eWxlQ2hhbmdlKGV2ZW50LCBnZXRUb2tlbkFmZmVjdGVkKGV2ZW50KSwgU1dULklUQUxJQyk7Ci0gICAgCQl9IGVsc2UgewotICAgIAkJCWFkYXB0VG9Db2xvckNoYW5nZShldmVudCwgZ2V0VG9rZW5BZmZlY3RlZChldmVudCkpOwotICAgIAkJfQotICAgIAl9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgVG9rZW4gZ2V0VG9rZW5BZmZlY3RlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgCVN0cmluZyBwcm9wZXJ0eT0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLSAgICAJaWYgKHByb3BlcnR5LnN0YXJ0c1dpdGgoSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLlNUUklOR19DT0xPUikpIHsKLSAgICAJCXJldHVybiBmU3RyaW5nVG9rZW47Ci0gICAgCX0vLyBlbHNlIGlmIChwcm9wZXJ0eS5zdGFydHNXaXRoKElBbnRFZGl0b3JDb2xvckNvbnN0YW50cy5UQUdfQ09MT1IpKSB7Ci0gICAgCQlyZXR1cm4gKFRva2VuKWZEZWZhdWx0UmV0dXJuVG9rZW47Ci0gICAgCS8vfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW50RWRpdG9yVGV4dE1lc3NhZ2VzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0FudEVkaXRvclRleHRNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzJhNTU4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW50RWRpdG9yVGV4dE1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgQW50RWRpdG9yVGV4dE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0LkFudEVkaXRvclRleHRNZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVGV4dEhvdmVyXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVGV4dEhvdmVyXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVGV4dEhvdmVyXzY7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQW50RWRpdG9yVGV4dE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9BbnRFZGl0b3JUZXh0TWVzc2FnZXMucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW50RWRpdG9yVGV4dE1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllN2Y3MmIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9BbnRFZGl0b3JUZXh0TWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotWE1MVGV4dEhvdmVyXzQ9UGF0aCBFbGVtZW50czoKLVhNTFRleHRIb3Zlcl81PUluY2x1ZGVzOgotWE1MVGV4dEhvdmVyXzY9RXhjbHVkZXM6CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0FudEVkaXRvcldoaXRlc3BhY2VEZXRlY3Rvci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9BbnRFZGl0b3JXaGl0ZXNwYWNlRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY1ZmY1OC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0FudEVkaXRvcldoaXRlc3BhY2VEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBHRUJJVCBHZXNlbGxzY2hhZnQgZnVlciBFRFYtQmVyYXR1bmcKLSAqIHVuZCBJbmZvcm1hdGlrLVRlY2hub2xvZ2llbiBtYkgsIAotICogQmVybGluLCBEdWVzc2VsZG9yZiwgRnJhbmtmdXJ0IChHZXJtYW55KSBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBHRUJJVCBHZXNlbGxzY2hhZnQgZnVlciBFRFYtQmVyYXR1bmcgdW5kIEluZm9ybWF0aWstVGVjaG5vbG9naWVuIG1iSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCSAgIElCTSBDb3Jwb3JhdGlvbiAtIGJ1ZyAyOTE0OAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0OwotCi0vKgotICogVGhpcyBmaWxlIG9yaWdpbmF0ZXMgZnJvbSBhbiBpbnRlcm5hbCBwYWNrYWdlIG9mIEVjbGlwc2UncyAKLSAqIE1hbmlmZXN0IEVkaXRvci4gSXQgaGFzIGJlZW4gY29waWVkIGJ5IEdFQklUIHRvIGhlcmUgaW4gb3JkZXIgdG8KLSAqIHBlcm1hbmVudGx5IHVzZSB0aG9zZSBmZWF0dXJlcy4gSXQgaGFzIGJlZW4gcmVuYW1lZCBieSBHRUJJVCAKLSAqIGFmdGVyIGNvcHlpbmcuCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVdoaXRlc3BhY2VEZXRlY3RvcjsKLQotcHVibGljIGNsYXNzIEFudEVkaXRvcldoaXRlc3BhY2VEZXRlY3RvciBpbXBsZW1lbnRzIElXaGl0ZXNwYWNlRGV0ZWN0b3IgewotCi0JcHVibGljIGJvb2xlYW4gaXNXaGl0ZXNwYWNlKGNoYXIgYykgewotCQlyZXR1cm4gKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCBjID09ICdcbicgfHwgYyA9PSAnXHInKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0FudEV4dGVybmFsQW5ub3RhdGlvbk1vZGVsLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0FudEV4dGVybmFsQW5ub3RhdGlvbk1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MTc0ZjkuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9BbnRFeHRlcm5hbEFubm90YXRpb25Nb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuSVByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLklQcm9ibGVtUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbk1vZGVsRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBbnRFeHRlcm5hbEFubm90YXRpb25Nb2RlbCBleHRlbmRzIEFubm90YXRpb25Nb2RlbCBpbXBsZW1lbnRzIElQcm9ibGVtUmVxdWVzdG9yIHsKLQotICAgIHByaXZhdGUgTGlzdCBmR2VuZXJhdGVkQW5ub3RhdGlvbnM9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIExpc3QgZkNvbGxlY3RlZFByb2JsZW1zPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmUuSVByb2JsZW1SZXF1ZXN0b3IjYWNjZXB0UHJvYmxlbShvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmUuSVByb2JsZW0pCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXB0UHJvYmxlbShJUHJvYmxlbSBwcm9ibGVtKSB7Ci0JCWZDb2xsZWN0ZWRQcm9ibGVtcy5hZGQocHJvYmxlbSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLklQcm9ibGVtUmVxdWVzdG9yI2FjY2VwdFByb2JsZW0ob3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLklQcm9ibGVtKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFJlcG9ydGluZygpIHsKLQkJYm9vbGVhbiB0ZW1wb3JhcnlQcm9ibGVtc0NoYW5nZWQ9IGZhbHNlOwotCQkJCi0JCXN5bmNocm9uaXplZCAoZ2V0QW5ub3RhdGlvbk1hcCgpKSB7Ci0JCQkJCi0JCQlpZiAoZkdlbmVyYXRlZEFubm90YXRpb25zLnNpemUoKSA+IDApIHsKLQkJCQl0ZW1wb3JhcnlQcm9ibGVtc0NoYW5nZWQ9IHRydWU7CQotCQkJCXJlbW92ZUFubm90YXRpb25zKGZHZW5lcmF0ZWRBbm5vdGF0aW9ucywgZmFsc2UsIHRydWUpOwotCQkJCWZHZW5lcmF0ZWRBbm5vdGF0aW9ucy5jbGVhcigpOwotCQkJfQotCQkJCQotCQkJaWYgKGZDb2xsZWN0ZWRQcm9ibGVtcyAhPSBudWxsICYmIGZDb2xsZWN0ZWRQcm9ibGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkJSXRlcmF0b3IgZT0gZkNvbGxlY3RlZFByb2JsZW1zLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJCQkKLQkJCQkJSVByb2JsZW0gcHJvYmxlbT0gKElQcm9ibGVtKSBlLm5leHQoKTsKLQkJCQkJCQotCQkJCQlQb3NpdGlvbiBwb3NpdGlvbj0gY3JlYXRlUG9zaXRpb25Gcm9tUHJvYmxlbShwcm9ibGVtKTsKLQkJCQkJaWYgKHBvc2l0aW9uICE9IG51bGwpIHsKLQkJCQkJCQkKLQkJCQkJCVhNTFByb2JsZW1Bbm5vdGF0aW9uIGFubm90YXRpb249IG5ldyBYTUxQcm9ibGVtQW5ub3RhdGlvbihwcm9ibGVtKTsKLQkJCQkJCWZHZW5lcmF0ZWRBbm5vdGF0aW9ucy5hZGQoYW5ub3RhdGlvbik7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWFkZEFubm90YXRpb24oYW5ub3RhdGlvbiwgcG9zaXRpb24sIGZhbHNlKTsKLQkJCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJQW50VUlQbHVnaW4ubG9nKGV4KTsKLQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCXRlbXBvcmFyeVByb2JsZW1zQ2hhbmdlZD0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkJCi0JCQkJZkNvbGxlY3RlZFByb2JsZW1zLmNsZWFyKCk7Ci0JCQl9Ci0JCX0KLQkJCQkKLQkJaWYgKHRlbXBvcmFyeVByb2JsZW1zQ2hhbmdlZCkKLQkJCWZpcmVNb2RlbENoYW5nZWQobmV3IEFubm90YXRpb25Nb2RlbEV2ZW50KHRoaXMpKTsKLQl9Ci0JCQkJCQotCXByb3RlY3RlZCBQb3NpdGlvbiBjcmVhdGVQb3NpdGlvbkZyb21Qcm9ibGVtKElQcm9ibGVtIHByb2JsZW0pIHsKLQkJaW50IHN0YXJ0PSBwcm9ibGVtLmdldE9mZnNldCgpOwotCQlpZiAoc3RhcnQgPj0gMCkgewotCQkJaW50IGxlbmd0aD0gcHJvYmxlbS5nZXRMZW5ndGgoKTsKLQkJCQkKLQkJCWlmIChsZW5ndGggPj0gMCkKLQkJCQlyZXR1cm4gbmV3IFBvc2l0aW9uKHN0YXJ0LCBsZW5ndGgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLklQcm9ibGVtUmVxdWVzdG9yI2JlZ2luUmVwb3J0aW5nKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBiZWdpblJlcG9ydGluZygpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0FudEluZm9ybWF0aW9uUHJvdmlkZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW50SW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTU3Yjk1Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW50SW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgQW50SW5mb3JtYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIElJbmZvcm1hdGlvblByb3ZpZGVyIHsKLQotCVhNTFRleHRIb3ZlciBmVGV4dEhvdmVyOwotCQotCXB1YmxpYyBBbnRJbmZvcm1hdGlvblByb3ZpZGVyKFhNTFRleHRIb3ZlciBob3ZlcikgewotCQlmVGV4dEhvdmVyPSBob3ZlcjsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlciNnZXRTdWJqZWN0KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRTdWJqZWN0KElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIGZUZXh0SG92ZXIuZ2V0SG92ZXJSZWdpb24odGV4dFZpZXdlciwgb2Zmc2V0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyI2dldEluZm9ybWF0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gc3ViamVjdCkgewotCQlyZXR1cm4gZlRleHRIb3Zlci5nZXRIb3ZlckluZm8odGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9BbnRTdG9yYWdlRG9jdW1lbnRQcm92aWRlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9BbnRTdG9yYWdlRG9jdW1lbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2I5Mjg2Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvQW50U3RvcmFnZURvY3VtZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuRmFzdFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5TdG9yYWdlRG9jdW1lbnRQcm92aWRlcjsKLQotLyoqCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRTdG9yYWdlRG9jdW1lbnRQcm92aWRlciBleHRlbmRzIFN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyIHsKLQkKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyI3NldHVwRG9jdW1lbnQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwRG9jdW1lbnQoT2JqZWN0IGVsZW1lbnQsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSURvY3VtZW50UGFydGl0aW9uZXIgcGFydGl0aW9uZXI9IGNyZWF0ZURvY3VtZW50UGFydGl0aW9uZXIoKTsKLQkJCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjMpIHsKLQkJCQlJRG9jdW1lbnRFeHRlbnNpb24zIGV4dGVuc2lvbjM9IChJRG9jdW1lbnRFeHRlbnNpb24zKSBkb2N1bWVudDsKLQkJCQlleHRlbnNpb24zLnNldERvY3VtZW50UGFydGl0aW9uZXIoQW50RG9jdW1lbnRTZXR1cFBhcnRpY2lwYW50LkFOVF9QQVJUSVRJT05JTkcsIHBhcnRpdGlvbmVyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZG9jdW1lbnQuc2V0RG9jdW1lbnRQYXJ0aXRpb25lcihwYXJ0aXRpb25lcik7Ci0JCQl9Ci0JCQlwYXJ0aXRpb25lci5jb25uZWN0KGRvY3VtZW50KTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElEb2N1bWVudFBhcnRpdGlvbmVyIGNyZWF0ZURvY3VtZW50UGFydGl0aW9uZXIoKSB7Ci0JCXJldHVybiBuZXcgRmFzdFBhcnRpdGlvbmVyKAotCQkJCW5ldyBBbnRFZGl0b3JQYXJ0aXRpb25TY2FubmVyKCksIG5ldyBTdHJpbmdbXXsKLQkJCQkJCUFudEVkaXRvclBhcnRpdGlvblNjYW5uZXIuWE1MX1RBRywKLQkJCQkJCUFudEVkaXRvclBhcnRpdGlvblNjYW5uZXIuWE1MX0NPTU1FTlQsCi0JCQkJCQlBbnRFZGl0b3JQYXJ0aXRpb25TY2FubmVyLlhNTF9DREFUQSwKLQkJCQkJCUFudEVkaXRvclBhcnRpdGlvblNjYW5uZXIuWE1MX0RURH0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvRG9jVHlwZVJ1bGUuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvRG9jVHlwZVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhOWU4MC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0RvY1R5cGVSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklDaGFyYWN0ZXJTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuTXVsdGlMaW5lUnVsZTsKLQotcHVibGljIGNsYXNzIERvY1R5cGVSdWxlIGV4dGVuZHMgTXVsdGlMaW5lUnVsZSB7Ci0KLSAgICBwcml2YXRlIGludCBmRW1iZWRkZWRTdGFydD0gMDsKLQotCXB1YmxpYyBEb2NUeXBlUnVsZShJVG9rZW4gdG9rZW4pIHsKLSAgICAgICAgc3VwZXIoIjwhRE9DVFlQRSIsICI+IiwgdG9rZW4pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuUGF0dGVyblJ1bGUjZW5kU2VxdWVuY2VEZXRlY3RlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklDaGFyYWN0ZXJTY2FubmVyKQotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGVuZFNlcXVlbmNlRGV0ZWN0ZWQoSUNoYXJhY3RlclNjYW5uZXIgc2Nhbm5lcikgewotICAgICAgICBpbnQgYzsKLSAgICAgICAgd2hpbGUgKChjID0gc2Nhbm5lci5yZWFkKCkpICE9IElDaGFyYWN0ZXJTY2FubmVyLkVPRikgewotICAgICAgICAgICAgaWYgKGMgPT0gZkVzY2FwZUNoYXJhY3RlcikgewotICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIGVzY2FwZWQgY2hhcmFjdGVyLgotICAgICAgICAgICAgICAgIHNjYW5uZXIucmVhZCgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICc8JykgewotICAgICAgICAgICAgCWZFbWJlZGRlZFN0YXJ0Kys7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJz4nKSB7Ci0gICAgICAgICAgICAJaWYgKGZFbWJlZGRlZFN0YXJ0ID09IDApIHsKLSAgICAgICAgICAgIAkJcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgCWZFbWJlZGRlZFN0YXJ0LS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHNjYW5uZXIudW5yZWFkKCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9ICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvRmlsZVNjYW5uZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvRmlsZVNjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ4MTdhNS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0ZpbGVTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGV4dDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7Ci0KLQotcHVibGljIGNsYXNzIEZpbGVTY2FubmVyIGV4dGVuZHMgRGlyZWN0b3J5U2Nhbm5lciB7Ci0JCi0JcHVibGljIFN0cmluZ1tdIGdldEV4Y2x1ZGVzUGF0dGVybnMoKSB7Ci0JCXJldHVybiBleGNsdWRlczsKLQl9Ci0JCi0JcHVibGljIFN0cmluZ1tdIGdldEluY2x1ZGVQYXR0ZXJucygpIHsKLQkJcmV0dXJuIGluY2x1ZGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0lBbnRFZGl0b3JDb2xvckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjg3MzIwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IEdFQklUIEdlc2VsbHNjaGFmdCBmdWVyIEVEVi1CZXJhdHVuZwotICogdW5kIEluZm9ybWF0aWstVGVjaG5vbG9naWVuIG1iSCwgCi0gKiBCZXJsaW4sIER1ZXNzZWxkb3JmLCBGcmFua2Z1cnQgKEdlcm1hbnkpIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEdFQklUIEdlc2VsbHNjaGFmdCBmdWVyIEVEVi1CZXJhdHVuZyB1bmQgSW5mb3JtYXRpay1UZWNobm9sb2dpZW4gbWJIIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAJICAgSUJNIENvcnBvcmF0aW9uIC0gYnVnIGZpeGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotCi0vKioKLSAqIFRoZSBjb2xvciBjb25zdGFudHMgdXNlZCBieSB0aGUgQW50IEVkaXRvci4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQW50RWRpdG9yQ29sb3JDb25zdGFudHMgewotCVJHQiBYTUxfQ09NTUVOVCA9ICAgICAgIG5ldyBSR0IoMTI4LCAgIDAsICAgMCk7Ci0JUkdCIFBST0NfSU5TVFIgPSAgICAgICAgbmV3IFJHQigxMjgsIDEyOCwgMTI4KTsKLQlSR0IgU1RSSU5HPSAgICAgICAgICAgICBuZXcgUkdCKCAgMCwgMTI4LCAgIDApOwotCVJHQiBERUZBVUxUPSAgICAgICAgICAgIG5ldyBSR0IoICAwLCAgIDAsICAgMCk7Ci0JUkdCIFRBRz0gICAgICAgICAgICAgICAgbmV3IFJHQiggIDAsICAgMCwgMTI4KTsKLQlSR0IgWE1MX0RURCA9ICAgICAgIAluZXcgUkdCKDEyOCwgICAwLCAgIDApOwotCQotCS8qKgotCSAqIFRoZSBzeW1ib2xpYyBuYW1lcyBmb3IgY29sb3JzIHVzZWQgZm9yIHRoZSB2YXJpb3VzIHRleHQgdG9rZW5zIGluIHRoZSBBbnQgZWRpdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NPTU1FTlRfQ09MT1IgPSAib3JnLmVjbGlwc2UuYW50LnVpLmNvbW1lbnRzQ29sb3IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU0lOR19JTlNUUlVDVElPTlNfQ09MT1IgPSAib3JnLmVjbGlwc2UuYW50LnVpLnByb2Nlc3NpbmdJbnN0cnVjdGlvbnNDb2xvciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfQ09MT1IgPSAib3JnLmVjbGlwc2UuYW50LnVpLmNvbnN0YW50U3RyaW5nc0NvbG9yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ09MT1IgPSAib3JnLmVjbGlwc2UuYW50LnVpLnRleHRDb2xvciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ09MT1IgPSAib3JnLmVjbGlwc2UuYW50LnVpLnRhZ3NDb2xvciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRFREX0NPTE9SID0gIm9yZy5lY2xpcHNlLmFudC51aS5kdGRDb2xvciI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvSVJlY29uY2lsaW5nUGFydGljaXBhbnQuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvSVJlY29uY2lsaW5nUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMwYzk0OS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L0lSZWNvbmNpbGluZ1BhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGV4dDsKLQotCi0KLS8qKgotICogSW50ZXJmYWNlIG9mIGFuIG9iamVjdCBwYXJ0aWNpcGF0aW5nIGluIHJlY29uY2lsaW5nLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZWNvbmNpbGluZ1BhcnRpY2lwYW50IHsKLQkKLQkvKioKLQkgKiBDYWxsZWQgYWZ0ZXIgcmVjb25jaWxpbmcgaGFzIGJlZW4gZmluaXNoZWQuCi0JICovCi0Jdm9pZCByZWNvbmNpbGVkKCk7Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L011bHRpbGluZURhbWFnZXJSZXBhaXJlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9NdWx0aWxpbmVEYW1hZ2VyUmVwYWlyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFjMzQyNy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L011bHRpbGluZURhbWFnZXJSZXBhaXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRleHQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuRGVmYXVsdERhbWFnZXJSZXBhaXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklUb2tlblNjYW5uZXI7Ci0KLS8qKgotICogQ29uc2lkZXJzIG11bHRpbGluZXMgYXMgZGFtYWdlIHJlZ2lvbnMgZXZlbiBpZiB0aGUgZG9jdW1lbnQgcGFydGl0aW9uaW5nIGhhcyBub3QgY2hhbmdlZC4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuRGVmYXVsdERhbWFnZXJSZXBhaXJlcgotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlsaW5lRGFtYWdlclJlcGFpcmVyIGV4dGVuZHMgRGVmYXVsdERhbWFnZXJSZXBhaXJlciB7Ci0KLQlwdWJsaWMgTXVsdGlsaW5lRGFtYWdlclJlcGFpcmVyKElUb2tlblNjYW5uZXIgc2Nhbm5lciwgVGV4dEF0dHJpYnV0ZSBkZWZhdWx0VGV4dEF0dHJpYnV0ZSkgewotCQlzdXBlcihzY2FubmVyLCBkZWZhdWx0VGV4dEF0dHJpYnV0ZSk7Ci0JfQotCQotCXB1YmxpYyBNdWx0aWxpbmVEYW1hZ2VyUmVwYWlyZXIoSVRva2VuU2Nhbm5lciBzY2FubmVyKSB7Ci0JCXN1cGVyKHNjYW5uZXIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnByZXNlbnRhdGlvbi5JUHJlc2VudGF0aW9uRGFtYWdlciNnZXREYW1hZ2VSZWdpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXREYW1hZ2VSZWdpb24oSVR5cGVkUmVnaW9uIHBhcnRpdGlvbiwgRG9jdW1lbnRFdmVudCBlLCBib29sZWFuIGRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZCkgewotCQlyZXR1cm4gcGFydGl0aW9uOwotCX0KLQotCS8qKgotCSAqIENvbmZpZ3VyZXMgdGhlIHNjYW5uZXIncyBkZWZhdWx0IHJldHVybiB0b2tlbi4gVGhpcyBpcyB0aGUgdGV4dCBhdHRyaWJ1dGUKLQkgKiB3aGljaCBpcyByZXR1cm5lZCB3aGVuIG5vbmUgaXMgcmV0dXJuZWQgYnkgdGhlIGN1cnJlbnQgdG9rZW4uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFRleHRBdHRyaWJ1dGUoVGV4dEF0dHJpYnV0ZSBkZWZhdWx0VGV4dEF0dHJpYnV0ZSkgewotCQlmRGVmYXVsdFRleHRBdHRyaWJ1dGU9IGRlZmF1bHRUZXh0QXR0cmlidXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvTm90aWZ5aW5nUmVjb25jaWxlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9Ob3RpZnlpbmdSZWNvbmNpbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjY2I4NDAuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9Ob3RpZnlpbmdSZWNvbmNpbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0OwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLk1vbm9SZWNvbmNpbGVyOwotCi0KLXB1YmxpYyBjbGFzcyBOb3RpZnlpbmdSZWNvbmNpbGVyIGV4dGVuZHMgTW9ub1JlY29uY2lsZXIgewotCi0JcHJpdmF0ZSBBcnJheUxpc3QgZlJlY29uY2lsaW5nUGFydGljaXBhbnRzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE5vdGlmeWluZ1JlY29uY2lsZXIuCi0JICogQHBhcmFtIHN0cmF0ZWd5Ci0JICovCi0JcHVibGljIE5vdGlmeWluZ1JlY29uY2lsZXIoSVJlY29uY2lsaW5nU3RyYXRlZ3kgc3RyYXRlZ3kpIHsKLQkJc3VwZXIoc3RyYXRlZ3ksIGZhbHNlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLkFic3RyYWN0UmVjb25jaWxlciNwcm9jZXNzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzKERpcnR5UmVnaW9uIGRpcnR5UmVnaW9uKSB7Ci0JCXN1cGVyLnByb2Nlc3MoZGlydHlSZWdpb24pOwotCQlub3RpZnlSZWNvbmNpbGluZ1BhcnRpY2lwYW50cygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlY29uY2lsaW5nUGFydGljaXBhbnQoSVJlY29uY2lsaW5nUGFydGljaXBhbnQgcGFydGljaXBhbnQpIHsKLQkJZlJlY29uY2lsaW5nUGFydGljaXBhbnRzLmFkZChwYXJ0aWNpcGFudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVjb25jaWxpbmdQYXJ0aWNpcGFudChJUmVjb25jaWxpbmdQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCkgewotCQlmUmVjb25jaWxpbmdQYXJ0aWNpcGFudHMucmVtb3ZlKHBhcnRpY2lwYW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlSZWNvbmNpbGluZ1BhcnRpY2lwYW50cygpIHsKLQkJSXRlcmF0b3IgaT0gbmV3IEFycmF5TGlzdChmUmVjb25jaWxpbmdQYXJ0aWNpcGFudHMpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJKChJUmVjb25jaWxpbmdQYXJ0aWNpcGFudCkgaS5uZXh0KCkpLnJlY29uY2lsZWQoKTsKLQkJfQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuQWJzdHJhY3RSZWNvbmNpbGVyI2luaXRpYWxQcm9jZXNzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsUHJvY2VzcygpIHsKLQkJc3VwZXIuaW5pdGlhbFByb2Nlc3MoKTsKLQkJbm90aWZ5UmVjb25jaWxpbmdQYXJ0aWNpcGFudHMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L1RhZ1J1bGUuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvVGFnUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjdlOTlkLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvVGFnUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBHRUJJVCBHZXNlbGxzY2hhZnQgZnVlciBFRFYtQmVyYXR1bmcKLSAqIHVuZCBJbmZvcm1hdGlrLVRlY2hub2xvZ2llbiBtYkgsIAotICogQmVybGluLCBEdWVzc2VsZG9yZiwgRnJhbmtmdXJ0IChHZXJtYW55KSBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBHRUJJVCBHZXNlbGxzY2hhZnQgZnVlciBFRFYtQmVyYXR1bmcgdW5kIEluZm9ybWF0aWstVGVjaG5vbG9naWVuIG1iSCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCSAgIElCTSBDb3Jwb3JhdGlvbiAtIGJ1ZyAyNDEwOCwgYnVnIDExMTc0MAotICogICAgIEpvaG4tTWFzb24gUC4gU2hhY2tlbGZvcmQgLSBidWcgNTEyMTUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGV4dDsKLQotLyoKLSAqIFRoaXMgZmlsZSBvcmlnaW5hdGVzIGZyb20gYW4gaW50ZXJuYWwgcGFja2FnZSBvZiBFY2xpcHNlJ3MgCi0gKiBNYW5pZmVzdCBFZGl0b3IuIEl0IGhhcyBiZWVuIGNvcGllZCBieSBHRUJJVCB0byBoZXJlIGluIG9yZGVyIHRvCi0gKiBwZXJtYW5lbnRseSB1c2UgdGhvc2UgZmVhdHVyZXMuIEl0IGhhcyBiZWVuIHJlbmFtZWQgYW5kIGVkaXRlZCBieSBHRUJJVCAKLSAqIGFmdGVyIGNvcHlpbmcuCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSUNoYXJhY3RlclNjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5NdWx0aUxpbmVSdWxlOwotCi1wdWJsaWMgY2xhc3MgVGFnUnVsZSBleHRlbmRzIE11bHRpTGluZVJ1bGUgewotCi0gICAgcHVibGljIFRhZ1J1bGUoSVRva2VuIHRva2VuKSB7Ci0gICAgICAgIHN1cGVyKCI8IiwgIj4iLCB0b2tlbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHNlcXVlbmNlRGV0ZWN0ZWQoSUNoYXJhY3RlclNjYW5uZXIgc2Nhbm5lciwgY2hhcltdIHNlcXVlbmNlLCBib29sZWFuIGVvZkFsbG93ZWQpIHsKLSAgICAgICAgaW50IGMgPSBzY2FubmVyLnJlYWQoKTsKLSAgICAgICAgaWYgKHNlcXVlbmNlWzBdID09ICc8JykgewotICAgICAgICAgICAgaWYgKGMgPT0gJz8nKSB7Ci0gICAgICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAtIGFib3J0Ci0gICAgICAgICAgICAgICAgc2Nhbm5lci51bnJlYWQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYyA9PSAnIScpIHsKLSAgICAgICAgICAgICAgICBzY2FubmVyLnVucmVhZCgpOwotICAgICAgICAgICAgICAgIC8vIGNvbW1lbnQgLSBhYm9ydAotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzZXF1ZW5jZVswXSA9PSAnPicpIHsKLSAgICAgICAgICAgIHNjYW5uZXIudW5yZWFkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3VwZXIuc2VxdWVuY2VEZXRlY3RlZChzY2FubmVyLCBzZXF1ZW5jZSwgZW9mQWxsb3dlZCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlBhdHRlcm5SdWxlI2VuZFNlcXVlbmNlRGV0ZWN0ZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JQ2hhcmFjdGVyU2Nhbm5lcikKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBlbmRTZXF1ZW5jZURldGVjdGVkKElDaGFyYWN0ZXJTY2FubmVyIHNjYW5uZXIpIHsKLSAgICAgICAgaW50IGM7Ci0gICAgICAgIHdoaWxlICgoYyA9IHNjYW5uZXIucmVhZCgpKSAhPSBJQ2hhcmFjdGVyU2Nhbm5lci5FT0YpIHsKLSAgICAgICAgICAgIGlmIChjID09IGZFc2NhcGVDaGFyYWN0ZXIpIHsKLSAgICAgICAgICAgICAgICAvLyBTa2lwIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci4KLSAgICAgICAgICAgICAgICBzY2FubmVyLnJlYWQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnPicpIHsKLSAgICAgICAgICAgICAgICBlbmRPZlRhZ0RldGVjdGVkKHNjYW5uZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSAKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgc2Nhbm5lci51bnJlYWQoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbmRPZlRhZ0RldGVjdGVkKElDaGFyYWN0ZXJTY2FubmVyIHNjYW5uZXIpIHsKLSAgICAgICAgaW50IGM7Ci0gICAgICAgIGludCBzY2FuQWhlYWQgPSAwOwotICAgICAgICBpbnQgZW5kT2ZUYWdPZmZzZXQgPSAwOwotICAgICAgICB3aGlsZSAoKGMgPSBzY2FubmVyLnJlYWQoKSkgIT0gSUNoYXJhY3RlclNjYW5uZXIuRU9GICYmIGMgIT0gJzwnKSB7Ci0gICAgICAgICAgICBzY2FuQWhlYWQrKzsKLSAgICAgICAgICAgIGlmIChjID09ICc+JykgewotICAgICAgICAgICAgCWVuZE9mVGFnT2Zmc2V0ID0gc2NhbkFoZWFkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGMgPT0gJzwnKSB7Ci0gICAgICAgICAgICBpbnQgcmV3aW5kID0gKHNjYW5BaGVhZCAtIGVuZE9mVGFnT2Zmc2V0KSArIDE7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJld2luZDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2Nhbm5lci51bnJlYWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gICAgCi19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L1hNTEFubm90YXRpb25Ib3Zlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9YTUxBbm5vdGF0aW9uSG92ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlZDQ0NS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L1hNTEFubm90YXRpb25Ib3Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuQW50RWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuaW50ZXJuYWwudGV4dC5odG1sLkhUTUxQcmludGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uSG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotCi0KLS8qKgotICogRGV0ZXJtaW5lcyBhbGwgbWFya2VycyBmb3IgdGhlIGdpdmVuIGxpbmUgYW5kIGNvbGxlY3RzLCBjb25jYXRlbmF0ZXMsIGFuZCBmb3JtdWxhdGVzCi0gKiB0aGVpciBtZXNzYWdlcy4KLSAqLwotcHVibGljIGNsYXNzIFhNTEFubm90YXRpb25Ib3ZlciBpbXBsZW1lbnRzIElBbm5vdGF0aW9uSG92ZXIgewotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc3RhbmNlIHRvIHRoZSBydWxlciBsaW5lLiAKLQkgKi8KLQlwcml2YXRlIGludCBjb21wYXJlUnVsZXJMaW5lKFBvc2l0aW9uIHBvc2l0aW9uLCBJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBsaW5lKSB7Ci0JCQotCQlpZiAocG9zaXRpb24uZ2V0T2Zmc2V0KCkgPiAtMSAmJiBwb3NpdGlvbi5nZXRMZW5ndGgoKSA+IC0xKSB7Ci0JCQl0cnkgewotCQkJCWludCB4bWxBbm5vdGF0aW9uTGluZT0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHBvc2l0aW9uLmdldE9mZnNldCgpKTsKLQkJCQlpZiAobGluZSA9PSB4bWxBbm5vdGF0aW9uTGluZSkKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJaWYgKHhtbEFubm90YXRpb25MaW5lIDw9IGxpbmUgJiYgbGluZSA8PSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQocG9zaXRpb24uZ2V0T2Zmc2V0KCkgKyBwb3NpdGlvbi5nZXRMZW5ndGgoKSkpCi0JCQkJCXJldHVybiAyOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gMDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBvbmUgbWFya2VyIHdoaWNoIGluY2x1ZGVzIHRoZSBydWxlcidzIGxpbmUgb2YgYWN0aXZpdHkuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFhNTEFubm90YXRpb25zRm9yTGluZShJU291cmNlVmlld2VyIHZpZXdlciwgaW50IGxpbmUpIHsKLQkJCi0JCUlEb2N1bWVudCBkb2N1bWVudD0gdmlld2VyLmdldERvY3VtZW50KCk7Ci0JCUlBbm5vdGF0aW9uTW9kZWwgbW9kZWw9IHZpZXdlci5nZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQkJCi0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJTGlzdCBleGFjdD0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJSXRlcmF0b3IgZT0gbW9kZWwuZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKCk7Ci0JCU1hcCBtZXNzYWdlc0F0UG9zaXRpb249IG5ldyBIYXNoTWFwKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG89IGUubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBBbm5vdGF0aW9uKSB7Ci0JCQkJQW5ub3RhdGlvbiBhPSAoQW5ub3RhdGlvbilvOwotCQkJCVBvc2l0aW9uIHBvc2l0aW9uPSBtb2RlbC5nZXRQb3NpdGlvbihhKTsKLQkJCQlpZiAocG9zaXRpb24gPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlpZiAoaXNEdXBsaWNhdGVYTUxBbm5vdGF0aW9uKG1lc3NhZ2VzQXRQb3NpdGlvbiwgcG9zaXRpb24sIGEuZ2V0VGV4dCgpKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlzd2l0Y2ggKGNvbXBhcmVSdWxlckxpbmUocG9zaXRpb24sIGRvY3VtZW50LCBsaW5lKSkgewotCQkJCQljYXNlIDE6Ci0JCQkJCQlleGFjdC5hZGQoYSk7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBleGFjdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEdXBsaWNhdGVYTUxBbm5vdGF0aW9uKE1hcCBtZXNzYWdlc0F0UG9zaXRpb24sIFBvc2l0aW9uIHBvc2l0aW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAobWVzc2FnZXNBdFBvc2l0aW9uLmNvbnRhaW5zS2V5KHBvc2l0aW9uKSkgewotCQkJT2JqZWN0IHZhbHVlPSBtZXNzYWdlc0F0UG9zaXRpb24uZ2V0KHBvc2l0aW9uKTsKLQkJCWlmIChtZXNzYWdlLmVxdWFscyh2YWx1ZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0KLQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQlMaXN0IG1lc3NhZ2VzPSAoTGlzdCl2YWx1ZTsKLQkJCQlpZiAgKG1lc3NhZ2VzLmNvbnRhaW5zKG1lc3NhZ2UpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQltZXNzYWdlcy5hZGQobWVzc2FnZSk7Ci0JCQl9IGVsc2UgewotCQkJCUFycmF5TGlzdCBtZXNzYWdlcz0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1lc3NhZ2VzLmFkZCh2YWx1ZSk7Ci0JCQkJbWVzc2FnZXMuYWRkKG1lc3NhZ2UpOwotCQkJCW1lc3NhZ2VzQXRQb3NpdGlvbi5wdXQocG9zaXRpb24sIG1lc3NhZ2VzKTsKLQkJCX0KLQkJfSBlbHNlCi0JCQltZXNzYWdlc0F0UG9zaXRpb24ucHV0KHBvc2l0aW9uLCBtZXNzYWdlKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkJCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Ib3ZlciNnZXRIb3ZlckluZm8ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlciwgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SG92ZXJJbmZvKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBpbnQgbGluZU51bWJlcikgewotCQlMaXN0IHhtbEFubm90YXRpb25zPSBnZXRYTUxBbm5vdGF0aW9uc0ZvckxpbmUoc291cmNlVmlld2VyLCBsaW5lTnVtYmVyKTsKLQkJaWYgKHhtbEFubm90YXRpb25zICE9IG51bGwpIHsKLQkJCQotCQkJaWYgKHhtbEFubm90YXRpb25zLnNpemUoKSA9PSAxKSB7Ci0JCQkJCi0JCQkJLy8gb3B0aW1pemF0aW9uCi0JCQkJQW5ub3RhdGlvbiB4bWxBbm5vdGF0aW9uPSAoQW5ub3RhdGlvbil4bWxBbm5vdGF0aW9ucy5nZXQoMCk7Ci0JCQkJU3RyaW5nIG1lc3NhZ2U9IHhtbEFubm90YXRpb24uZ2V0VGV4dCgpOwotCQkJCWlmIChtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXJldHVybiBmb3JtYXRTaW5nbGVNZXNzYWdlKG1lc3NhZ2UpOwotCQkJCX0KLQkJCQkJCi0JCQl9IGVsc2UgewotCQkJCQkKLQkJCQlMaXN0IG1lc3NhZ2VzPSBuZXcgQXJyYXlMaXN0KHhtbEFubm90YXRpb25zLnNpemUoKSk7Ci0JCQkJSXRlcmF0b3IgZT0geG1sQW5ub3RhdGlvbnMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQkJQW5ub3RhdGlvbiB4bWxBbm5vdGF0aW9uPSAoQW5ub3RhdGlvbillLm5leHQoKTsKLQkJCQkJU3RyaW5nIG1lc3NhZ2U9IHhtbEFubm90YXRpb24uZ2V0VGV4dCgpOwotCQkJCQlpZiAobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJbWVzc2FnZXMuYWRkKG1lc3NhZ2UudHJpbSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAobWVzc2FnZXMuc2l6ZSgpID09IDEpIHsKLQkJCQkJcmV0dXJuIGZvcm1hdFNpbmdsZU1lc3NhZ2UoKFN0cmluZykgbWVzc2FnZXMuZ2V0KDApKTsKLQkJCQl9Ci0JCQkJCQotCQkJCWlmIChtZXNzYWdlcy5zaXplKCkgPiAxKSB7Ci0JCQkJCXJldHVybiBmb3JtYXRNdWx0aXBsZU1lc3NhZ2VzKG1lc3NhZ2VzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIEZvcm1hdHMgYSBtZXNzYWdlIGFzIEhUTUwgdGV4dC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmb3JtYXRTaW5nbGVNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXI9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJSFRNTFByaW50ZXIuYWRkUGFnZVByb2xvZyhidWZmZXIpOwotCQlIVE1MUHJpbnRlci5hZGRQYXJhZ3JhcGgoYnVmZmVyLCBIVE1MUHJpbnRlci5jb252ZXJ0VG9IVE1MQ29udGVudChtZXNzYWdlKSk7Ci0JCUhUTUxQcmludGVyLmFkZFBhZ2VFcGlsb2coYnVmZmVyKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkKLQkvKgotCSAqIEZvcm1hdHMgc2V2ZXJhbCBtZXNzYWdlIGFzIEhUTUwgdGV4dC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmb3JtYXRNdWx0aXBsZU1lc3NhZ2VzKExpc3QgbWVzc2FnZXMpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlcj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlIVE1MUHJpbnRlci5hZGRQYWdlUHJvbG9nKGJ1ZmZlcik7Ci0JCUhUTUxQcmludGVyLmFkZFBhcmFncmFwaChidWZmZXIsIEhUTUxQcmludGVyLmNvbnZlcnRUb0hUTUxDb250ZW50KEFudEVkaXRvck1lc3NhZ2VzLmdldFN0cmluZygiQW50QW5ub3RhdGlvbkhvdmVyLm11bHRpcGxlTWFya2Vyc0F0VGhpc0xpbmUiKSkpOyAvLyROT04tTkxTLTEkCi0JCQotCQlIVE1MUHJpbnRlci5zdGFydEJ1bGxldExpc3QoYnVmZmVyKTsKLQkJSXRlcmF0b3IgZT0gbWVzc2FnZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKQotCQkJSFRNTFByaW50ZXIuYWRkQnVsbGV0KGJ1ZmZlciwgSFRNTFByaW50ZXIuY29udmVydFRvSFRNTENvbnRlbnQoKFN0cmluZykgZS5uZXh0KCkpKTsKLQkJSFRNTFByaW50ZXIuZW5kQnVsbGV0TGlzdChidWZmZXIpOwkKLQkJCi0JCUhUTUxQcmludGVyLmFkZFBhZ2VFcGlsb2coYnVmZmVyKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvWE1MUHJvYmxlbUFubm90YXRpb24uamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvWE1MUHJvYmxlbUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAwMTIzYy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci90ZXh0L1hNTFByb2JsZW1Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLklQcm9ibGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci0KLS8qKgotICogQW5ub3RhdGlvbiByZXByZXNlbnRpbmcgYW4gPGNvZGU+SVByb2JsZW08L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgWE1MUHJvYmxlbUFubm90YXRpb24gZXh0ZW5kcyBBbm5vdGF0aW9uIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9BTk5PVEFUSU9OX1RZUEU9ICJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvci5lcnJvciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOSU5HX0FOTk9UQVRJT05fVFlQRT0gIm9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLndhcm5pbmciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT19BTk5PVEFUSU9OX1RZUEU9ICJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvci5pbmZvIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgSVByb2JsZW0gZlByb2JsZW07Ci0JCi0JcHVibGljIFhNTFByb2JsZW1Bbm5vdGF0aW9uKElQcm9ibGVtIHByb2JsZW0pIHsKLQkJCi0JCWZQcm9ibGVtPSBwcm9ibGVtOwotCQkKLQkJaWYgKGZQcm9ibGVtLmlzRXJyb3IoKSkgewotCQkJc2V0VHlwZShFUlJPUl9BTk5PVEFUSU9OX1RZUEUpOwotCQl9IGVsc2UgaWYgKGZQcm9ibGVtLmlzV2FybmluZygpKSB7Ci0JCQlzZXRUeXBlKFdBUk5JTkdfQU5OT1RBVElPTl9UWVBFKTsKLQkJfSBlbHNlIHsKLQkJCXNldFR5cGUoSU5GT19BTk5PVEFUSU9OX1RZUEUpOwotCQl9CQotCQkKLQkJc2V0VGV4dChmUHJvYmxlbS5nZXRNZXNzYWdlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3RleHQvWE1MUmVjb25jaWxpbmdTdHJhdGVneS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9YTUxSZWNvbmNpbGluZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYzBmNTEuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdGV4dC9YTUxSZWNvbmNpbGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuQW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuSUFudE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuRGlydHlSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxpbmdTdHJhdGVneUV4dGVuc2lvbjsKLQotcHVibGljIGNsYXNzIFhNTFJlY29uY2lsaW5nU3RyYXRlZ3kgaW1wbGVtZW50cyBJUmVjb25jaWxpbmdTdHJhdGVneSwgSVJlY29uY2lsaW5nU3RyYXRlZ3lFeHRlbnNpb24gewotCi0JLyoqCi0JICogSG93IGxvbmcgdGhlIHJlY29uY2lsZXIgd2lsbCB3YWl0IGZvciBmdXJ0aGVyIHRleHQgY2hhbmdlcyBiZWZvcmUKLQkgKiByZWNvbmNpbGluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFTEFZPSA1MDA7Ci0KLQlwcml2YXRlIEFudEVkaXRvciBmRWRpdG9yOwotCi0JcHVibGljIFhNTFJlY29uY2lsaW5nU3RyYXRlZ3koQW50RWRpdG9yIGVkaXRvcikgewotCQlmRWRpdG9yPSBlZGl0b3I7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsUmVjb25jaWxlKCkgewotCQl0cnkgewotICAgICAgICAgICAgSUFudE1vZGVsIG1vZGVsPSBmRWRpdG9yLmdldEFudE1vZGVsKCk7Ci0JCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBBbnRNb2RlbCkgewotCQkJCSgoQW50TW9kZWwpbW9kZWwpLnJlY29uY2lsZSgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQW50VUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsaW5nU3RyYXRlZ3kjcmVjb25jaWxlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWNvbmNpbGUoSVJlZ2lvbiBwYXJ0aXRpb24pIHsKLQkJaW50ZXJuYWxSZWNvbmNpbGUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxpbmdTdHJhdGVneSNyZWNvbmNpbGUob3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLkRpcnR5UmVnaW9uLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlY29uY2lsZShEaXJ0eVJlZ2lvbiBkaXJ0eVJlZ2lvbiwgSVJlZ2lvbiBzdWJSZWdpb24pIHsKLQkJaW50ZXJuYWxSZWNvbmNpbGUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxpbmdTdHJhdGVneSNzZXREb2N1bWVudChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxpbmdTdHJhdGVneUV4dGVuc2lvbiNzZXRQcm9ncmVzc01vbml0b3Iob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5RXh0ZW5zaW9uI2luaXRpYWxSZWNvbmNpbGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxSZWNvbmNpbGUoKSB7Ci0JCWludGVybmFsUmVjb25jaWxlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdXRpbHMvUHJvamVjdEhlbHBlck1lc3NhZ2VzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci91dGlscy9Qcm9qZWN0SGVscGVyTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM3NzFjNy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBFZGl0b3Ivb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2VkaXRvci91dGlscy9Qcm9qZWN0SGVscGVyTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnV0aWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIFByb2plY3RIZWxwZXJNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudXRpbHMuUHJvamVjdEhlbHBlck1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdEhlbHBlcl8wOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFByb2plY3RIZWxwZXJNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IEVkaXRvci9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZWRpdG9yL3V0aWxzL1Byb2plY3RIZWxwZXJNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdXRpbHMvUHJvamVjdEhlbHBlck1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNTRkY2MuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgRWRpdG9yL29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9lZGl0b3IvdXRpbHMvUHJvamVjdEhlbHBlck1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1Qcm9qZWN0SGVscGVyXzA9WE1MIFBhcnNlciBjb3VsZCBub3QgYmUgY3JlYXRlZApkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgUnVubmVyIFN1cHBvcnQvTUVUQS1JTkYvZWNsaXBzZS5pbmYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBSdW5uZXIgU3VwcG9ydC9NRVRBLUlORi9lY2xpcHNlLmluZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRkZjNhYi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBSdW5uZXIgU3VwcG9ydC9NRVRBLUlORi9lY2xpcHNlLmluZgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWphcnByb2Nlc3Nvci5leGNsdWRlLnNpZ249dHJ1ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFJ1bm5lciBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9hbnRzdXBwb3J0L0FudFN1cHBvcnRNZXNzYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgUnVubmVyIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2FudHN1cHBvcnQvQW50U3VwcG9ydE1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2Nzk0MzAuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgUnVubmVyIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2FudHN1cHBvcnQvQW50U3VwcG9ydE1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmFudHN1cHBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgQW50U3VwcG9ydE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmFudHN1cHBvcnQuQW50U3VwcG9ydE1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRJbnB1dEhhbmRsZXJfQW50X0lucHV0X1JlcXVlc3RfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRJbnB1dEhhbmRsZXJfSW52YWxpZF9pbnB1dF8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudElucHV0SGFuZGxlcl9VbmFibGVfdG9fcmVzcG9uZF90b19faW5wdXRfX3JlcXVlc3RfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRJbnB1dEhhbmRsZXJfNTsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBBbnRTdXBwb3J0TWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBSdW5uZXIgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvYW50c3VwcG9ydC9BbnRTdXBwb3J0TWVzc2FnZXMucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFJ1bm5lciBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9hbnRzdXBwb3J0L0FudFN1cHBvcnRNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTNiZmYwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFJ1bm5lciBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9hbnRzdXBwb3J0L0FudFN1cHBvcnRNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1BbnRJbnB1dEhhbmRsZXJfQW50X0lucHV0X1JlcXVlc3RfMT1BbnQgSW5wdXQgUmVxdWVzdAotQW50SW5wdXRIYW5kbGVyX0ludmFsaWRfaW5wdXRfMj1JbnB1dCBkb2VzIG5vdCBtYXRjaCB2YWxpZGFyZ3MgYXR0cmlidXRlCi1BbnRJbnB1dEhhbmRsZXJfVW5hYmxlX3RvX3Jlc3BvbmRfdG9fX2lucHV0X19yZXF1ZXN0XzQ9VW5hYmxlIHRvIHJlc3BvbmQgdG8gPGlucHV0PiByZXF1ZXN0Ci1BbnRJbnB1dEhhbmRsZXJfNT1VbmFibGUgdG8gcmVzcG9uZCB0byBpbnB1dCByZXF1ZXN0IGFzIGEgcmVzdWx0IG9mIHRoZSB1c2VyIHNwZWNpZmllZCAtbm9pbnB1dCBjb21tYW5kCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9BbnREb3VibGVDbGlja1N0cmF0ZWd5LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9BbnREb3VibGVDbGlja1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NTU0Y2YuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvQW50RG91YmxlQ2xpY2tTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGV4dC5YTUxUZXh0SG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHREb3VibGVDbGlja1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci0KLXB1YmxpYyBjbGFzcyBBbnREb3VibGVDbGlja1N0cmF0ZWd5IGltcGxlbWVudHMgSVRleHREb3VibGVDbGlja1N0cmF0ZWd5IHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHREb3VibGVDbGlja1N0cmF0ZWd5I2RvdWJsZUNsaWNrZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb3VibGVDbGlja2VkKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIpIHsKLQkJaW50IG9mZnNldD0gdGV4dFZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCkueDsKLQotCQlpZiAob2Zmc2V0IDwgMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlSZWdpb24gcmVnaW9uPSBYTUxUZXh0SG92ZXIuZ2V0UmVnaW9uKHRleHRWaWV3ZXIsIG9mZnNldCk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJdGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9BbnRJbWFnZURlc2NyaXB0b3IuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL0FudEltYWdlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWEyZDkyLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL0FudEltYWdlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCAoam9obi1tYXNvbi5zaGFja2VsZm9yZEBwZWFyc29uLmNvbSkgLSBidWcgNDk0NDUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5Db21wb3NpdGVJbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotCi0vKioKLSAqIEEgaW1hZ2UgZGVzY3JpcHRvciBjb25zaXN0aW5nIG9mIGEgbWFpbiBpY29uIGFuZCBzZXZlcmFsIGFkb3JubWVudHMuIFRoZSBhZG9ybm1lbnRzCi0gKiBhcmUgY29tcHV0ZWQgYWNjb3JkaW5nIHRvIGZsYWdzIHNldCBvbiBjcmVhdGlvbiBvZiB0aGUgZGVzY3JpcHRvci4KLSAqLwotcHVibGljIGNsYXNzIEFudEltYWdlRGVzY3JpcHRvciBleHRlbmRzIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciB7Ci0JCi0JLyoqIEZsYWcgdG8gcmVuZGVyIGFuIGVycm9yIGFkb3JubWVudCAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEhBU19FUlJPUlM9IDB4MDAwMTsKLQotCS8qKiBGbGFnIHRvIHJlbmRlciBhbiBpbXBvcnRlZCBhZG9ybm1lbnQgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJTVBPUlRFRD0gMHgwMDAyOwotCQotCS8qKiBGbGFnIHRvIHJlbmRlciBhbiB3YXJuaW5nIGFkb3JubWVudCAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEhBU19XQVJOSU5HUz0gMHgwMDA0OwotCQotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGZCYXNlSW1hZ2U7Ci0JcHJpdmF0ZSBpbnQgZkZsYWdzOwotCXByaXZhdGUgUG9pbnQgZlNpemU7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgQW50SW1hZ2VEZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlSW1hZ2UgYW4gaW1hZ2UgZGVzY3JpcHRvciB1c2VkIGFzIHRoZSBiYXNlIGltYWdlCi0JICogQHBhcmFtIGZsYWdzIGZsYWdzIGluZGljYXRpbmcgd2hpY2ggYWRvcm5tZW50cyBhcmUgdG8gYmUgcmVuZGVyZWQKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQW50SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBiYXNlSW1hZ2UsIGludCBmbGFncykgewotCQlzZXRCYXNlSW1hZ2UoYmFzZUltYWdlKTsKLQkJc2V0RmxhZ3MoZmxhZ3MpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciNnZXRTaXplKCkKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0U2l6ZSgpIHsKLQkJaWYgKGZTaXplID09IG51bGwpIHsKLQkJCUltYWdlRGF0YSBkYXRhPSBnZXRCYXNlSW1hZ2UoKS5nZXRJbWFnZURhdGEoKTsKLQkJCXNldFNpemUobmV3IFBvaW50KGRhdGEud2lkdGgsIGRhdGEuaGVpZ2h0KSk7Ci0JCX0KLQkJcmV0dXJuIGZTaXplOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBBbnRJbWFnZURlc2NyaXB0b3IpKXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkJCi0JCUFudEltYWdlRGVzY3JpcHRvciBvdGhlcj0gKEFudEltYWdlRGVzY3JpcHRvcilvYmplY3Q7Ci0JCXJldHVybiAoZ2V0QmFzZUltYWdlKCkuZXF1YWxzKG90aGVyLmdldEJhc2VJbWFnZSgpKSAmJiBnZXRGbGFncygpID09IG90aGVyLmdldEZsYWdzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIE9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGdldEJhc2VJbWFnZSgpLmhhc2hDb2RlKCkgfCBnZXRGbGFncygpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciNkcmF3Q29tcG9zaXRlSW1hZ2UoaW50LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZHJhd0NvbXBvc2l0ZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlJbWFnZURhdGEgYmc9IGdldEJhc2VJbWFnZSgpLmdldEltYWdlRGF0YSgpOwotCQlpZiAoYmcgPT0gbnVsbCkgewotCQkJYmc9IERFRkFVTFRfSU1BR0VfREFUQTsKLQkJfQotCQlkcmF3SW1hZ2UoYmcsIDAsIDApOwotCQlkcmF3T3ZlcmxheXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYW55IG92ZXJsYXlzIHRvIHRoZSBpbWFnZSBhcyBzcGVjaWZpZWQgaW4gdGhlIGZsYWdzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRyYXdPdmVybGF5cygpIHsKLQkJaW50IGZsYWdzPSBnZXRGbGFncygpOwotCQlpbnQgeT0gMDsKLQkJSW1hZ2VEYXRhIGRhdGE9IG51bGw7Ci0JCWlmICgoZmxhZ3MgJiBJTVBPUlRFRCkgIT0gMCkgewotCQkJZGF0YT0gQW50VUlJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElBbnRVSUNvbnN0YW50cy5JTUdfT1ZSX0lNUE9SVCkuZ2V0SW1hZ2VEYXRhKCk7Ci0JCQlkcmF3SW1hZ2UoZGF0YSwgMCwgMCk7Ci0JCX0KLQkJaWYgKChmbGFncyAmIEhBU19FUlJPUlMpICE9IDApIHsKLQkJCXk9IGdldFNpemUoKS55OwotCQkJZGF0YT0gQW50VUlJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElBbnRVSUNvbnN0YW50cy5JTUdfT1ZSX0VSUk9SKS5nZXRJbWFnZURhdGEoKTsKLQkJCXkgLT0gZGF0YS5oZWlnaHQ7Ci0JCQlkcmF3SW1hZ2UoZGF0YSwgMCwgeSk7Ci0JCX0gZWxzZSBpZiAoKGZsYWdzICYgSEFTX1dBUk5JTkdTKSAhPSAwKSB7Ci0JCQl5PSBnZXRTaXplKCkueTsKLQkJCWRhdGE9IEFudFVJSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJQW50VUlDb25zdGFudHMuSU1HX09WUl9XQVJOSU5HKS5nZXRJbWFnZURhdGEoKTsKLQkJCXkgLT0gZGF0YS5oZWlnaHQ7Ci0JCQlkcmF3SW1hZ2UoZGF0YSwgMCwgeSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBnZXRCYXNlSW1hZ2UoKSB7Ci0JCXJldHVybiBmQmFzZUltYWdlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEJhc2VJbWFnZShJbWFnZURlc2NyaXB0b3IgYmFzZUltYWdlKSB7Ci0JCWZCYXNlSW1hZ2UgPSBiYXNlSW1hZ2U7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRGbGFncygpIHsKLQkJcmV0dXJuIGZGbGFnczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGbGFncyhpbnQgZmxhZ3MpIHsKLQkJZkZsYWdzID0gZmxhZ3M7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2l6ZShQb2ludCBzaXplKSB7Ci0JCWZTaXplID0gc2l6ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9BbnRQcm9wZXJ0eVZhbHVlUHJvdmlkZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL0FudFByb3BlcnR5VmFsdWVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzI1YmNjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL0FudFByb3BlcnR5VmFsdWVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLklBbnRQcm9wZXJ0eVZhbHVlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotCi0vKioKLSAqIER5bmFtaWMgcHJvdmlkZXIgZm9yIEFudCBwcm9wZXJ0aWVzLgotICogCi0gKiBQcm92aWRlcyB0aGUgZHluYW1pYyB2YWx1ZXMgZm9yIHRoZSBmb2xsb3dpbmcgQW50IHByb3BlcnRpZXM6Ci0gKiAKLSAqIDx1bD4KLSAqIDxsaT48Y29kZT5lY2xpcHNlLnRhcmdldDwvY29kZT4gLSBzZXQgdG8gdGhlIEVjbGlwc2UgdGFyZ2V0IHBsYXRmb3JtIGxvY2F0aW9uPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIEFudFByb3BlcnR5VmFsdWVQcm92aWRlciBpbXBsZW1lbnRzIElBbnRQcm9wZXJ0eVZhbHVlUHJvdmlkZXIgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGR5bmFtaWMgcHJvcGVydHkgdmFsdWVzIGZvciBBbnQgcHJvcGVydGllcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byByZXNvbHZlIHRoZSB2YWx1ZSBmb3IKLQkgKiBAcmV0dXJuIFRoZSByZXNvbHZlZCB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuY29yZS5JQW50UHJvcGVydHlWYWx1ZVByb3ZpZGVyI2dldEFudFByb3BlcnR5VmFsdWUoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QW50UHJvcGVydHlWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCWlmICgiZWNsaXBzZS50YXJnZXQiLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkgICAgSVBhdGggaG9tZT0gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoVmFyaWFibGUoIkVDTElQU0VfSE9NRSIpOyAvLyROT04tTkxTLTEkCi0JCQkgICAgaWYgKGhvbWUgIT0gbnVsbCkgewotCQkJICAgIAl2YWx1ZSA9IGhvbWUudG9GaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkgICAgCWlmICh2YWx1ZS5lbmRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCSAgICAJCXZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIHZhbHVlLmxlbmd0aCgpIC0gMSk7Ci0JCQkgICAgCX0KLQkJCSAgICB9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUFudFVJUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvQW50UnVubmVyV29ya2JlbmNoQWR2aXNvci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvQW50UnVubmVyV29ya2JlbmNoQWR2aXNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjZmYzU1Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL0FudFJ1bm5lcldvcmtiZW5jaEFkdmlzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3I7Ci0KLS8qKgotICogV29ya2JlbmNoIGFkdmlzb3IgdG8gcnVuIGFuIGFudCBzY3JpcHQgYWZ0ZXIgc3RhcnRpbmcgdGhlIHdvcmtiZW5jaCBhbmQKLSAqIHRoZW4gZXhpdCB0aGUgd29ya2JlbmNoLiBVc2VkIHdpdGgge0BsaW5rIFdvcmtiZW5jaEFudFJ1bm5lcn0uCi0gKiAKLSAqIEBzaW5jZSAzLjQKLSAqLwotcHVibGljIGNsYXNzIEFudFJ1bm5lcldvcmtiZW5jaEFkdmlzb3IgZXh0ZW5kcyBXb3JrYmVuY2hBZHZpc29yIHsKLQkKLQlwcml2YXRlIE9iamVjdCBmQ29udGV4dDsKLQotCXByb3RlY3RlZCBBbnRSdW5uZXJXb3JrYmVuY2hBZHZpc29yKE9iamVjdCBjb250ZXh0KSB7Ci0JCWZDb250ZXh0ID0gY29udGV4dDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvciNnZXRJbml0aWFsV2luZG93UGVyc3BlY3RpdmVJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbml0aWFsV2luZG93UGVyc3BlY3RpdmVJZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvciNwcmVTdGFydHVwKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVTdGFydHVwKCkgewotCQl0cnkgewotCQkJbmV3IEFudFJ1bm5lcigpLnJ1bihmQ29udGV4dCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBbnRVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5zYXZlKHRydWUsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUFudFVJUGx1Z2luLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3Ijb3BlbldpbmRvd3MoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIG9wZW5XaW5kb3dzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvQW50U291cmNlVmlld2VyQ29uZmlndXJhdGlvbi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvQW50U291cmNlVmlld2VyQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzM5MWEzLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL0FudFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci50ZXh0LkFudERvY3VtZW50U2V0dXBQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRleHQuQW50RWRpdG9yUGFydGl0aW9uU2Nhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRleHQuQW50RWRpdG9yUHJvY0luc3RyU2Nhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRleHQuQW50RWRpdG9yVGFnU2Nhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnRleHQuSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IudGV4dC5NdWx0aWxpbmVEYW1hZ2VyUmVwYWlyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLkFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0RG91YmxlQ2xpY2tTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5wcmVzZW50YXRpb24uSVByZXNlbnRhdGlvblJlY29uY2lsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5wcmVzZW50YXRpb24uUHJlc2VudGF0aW9uUmVjb25jaWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEFudFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gZXh0ZW5kcyBUZXh0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbiB7Ci0KLQlwcml2YXRlIEFudEVkaXRvclRhZ1NjYW5uZXIgdGFnU2Nhbm5lcjsKLSAgICBwcml2YXRlIEFudEVkaXRvclByb2NJbnN0clNjYW5uZXIgaW5zdHJ1Y3Rpb25TY2FubmVyOwotCXByaXZhdGUgTXVsdGlsaW5lRGFtYWdlclJlcGFpcmVyIGRhbWFnZVJlcGFpcmVyOwotCXByaXZhdGUgTXVsdGlsaW5lRGFtYWdlclJlcGFpcmVyIGR0ZERhbWFnZVJlcGFpcmVyOwotCXByaXZhdGUgVGV4dEF0dHJpYnV0ZSB4bWxDb21tZW50QXR0cmlidXRlOwotCXByaXZhdGUgVGV4dEF0dHJpYnV0ZSB4bWxEdGRBdHRyaWJ1dGU7Ci0JCi0gICAgcHVibGljIEFudFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0gICAgICAgIHN1cGVyKEFudFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb21iaW5lZFByZWZlcmVuY2VTdG9yZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFudEVkaXRvclByb2NJbnN0clNjYW5uZXIgZ2V0RGVmYXVsdFNjYW5uZXIoKSB7Ci0JICAgIGlmIChpbnN0cnVjdGlvblNjYW5uZXIgPT0gbnVsbCkgewotCSAgICAgICAgaW5zdHJ1Y3Rpb25TY2FubmVyID0gbmV3IEFudEVkaXRvclByb2NJbnN0clNjYW5uZXIoKTsKLQkgICAgfQotCSAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TY2FubmVyOwotCX0KLQotCXByaXZhdGUgQW50RWRpdG9yVGFnU2Nhbm5lciBnZXRUYWdTY2FubmVyKCkgewotCSAgICBpZiAodGFnU2Nhbm5lciA9PSBudWxsKSB7Ci0JICAgICAgICB0YWdTY2FubmVyID0gbmV3IEFudEVkaXRvclRhZ1NjYW5uZXIoKTsKLQkgICAgfQotCSAgICByZXR1cm4gdGFnU2Nhbm5lcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uI2dldFByZXNlbnRhdGlvblJlY29uY2lsZXIob3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgSVByZXNlbnRhdGlvblJlY29uY2lsZXIgZ2V0UHJlc2VudGF0aW9uUmVjb25jaWxlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCSAgICBQcmVzZW50YXRpb25SZWNvbmNpbGVyIHJlY29uY2lsZXIgPSBuZXcgUHJlc2VudGF0aW9uUmVjb25jaWxlcigpOwotCSAgICByZWNvbmNpbGVyLnNldERvY3VtZW50UGFydGl0aW9uaW5nKGdldENvbmZpZ3VyZWREb2N1bWVudFBhcnRpdGlvbmluZyhzb3VyY2VWaWV3ZXIpKTsKLQkgICAgCi0JCU11bHRpbGluZURhbWFnZXJSZXBhaXJlciBkciA9IG5ldyBNdWx0aWxpbmVEYW1hZ2VyUmVwYWlyZXIoZ2V0RGVmYXVsdFNjYW5uZXIoKSk7Ci0JICAgIHJlY29uY2lsZXIuc2V0RGFtYWdlcihkciwgSURvY3VtZW50LkRFRkFVTFRfQ09OVEVOVF9UWVBFKTsKLQkgICAgcmVjb25jaWxlci5zZXRSZXBhaXJlcihkciwgSURvY3VtZW50LkRFRkFVTFRfQ09OVEVOVF9UWVBFKTsKLQkKLQkgICAgZHIgPSBuZXcgTXVsdGlsaW5lRGFtYWdlclJlcGFpcmVyKGdldFRhZ1NjYW5uZXIoKSk7Ci0JICAgIHJlY29uY2lsZXIuc2V0RGFtYWdlcihkciwgQW50RWRpdG9yUGFydGl0aW9uU2Nhbm5lci5YTUxfVEFHKTsKLQkgICAgcmVjb25jaWxlci5zZXRSZXBhaXJlcihkciwgQW50RWRpdG9yUGFydGl0aW9uU2Nhbm5lci5YTUxfVEFHKTsKLQkKLQkgICAgaW50IHN0eWxlPSBnZXRTdHlsZShJQW50RWRpdG9yQ29sb3JDb25zdGFudHMuWE1MX0NPTU1FTlRfQ09MT1IpOwotCSAgICB4bWxDb21tZW50QXR0cmlidXRlPSAgbmV3IFRleHRBdHRyaWJ1dGUoQW50VUlQbHVnaW4uZ2V0UHJlZmVyZW5jZUNvbG9yKElBbnRFZGl0b3JDb2xvckNvbnN0YW50cy5YTUxfQ09NTUVOVF9DT0xPUiksIG51bGwsIHN0eWxlKTsKLQkJZGFtYWdlUmVwYWlyZXI9IG5ldyBNdWx0aWxpbmVEYW1hZ2VyUmVwYWlyZXIobnVsbCwgeG1sQ29tbWVudEF0dHJpYnV0ZSk7Ci0JICAgIHJlY29uY2lsZXIuc2V0RGFtYWdlcihkYW1hZ2VSZXBhaXJlciwgQW50RWRpdG9yUGFydGl0aW9uU2Nhbm5lci5YTUxfQ09NTUVOVCk7Ci0JICAgIHJlY29uY2lsZXIuc2V0UmVwYWlyZXIoZGFtYWdlUmVwYWlyZXIsIEFudEVkaXRvclBhcnRpdGlvblNjYW5uZXIuWE1MX0NPTU1FTlQpOwotCSAgICAKLQkgICAgc3R5bGU9IGdldFN0eWxlKElBbnRFZGl0b3JDb2xvckNvbnN0YW50cy5YTUxfRFREX0NPTE9SKTsKLQkgICAgeG1sRHRkQXR0cmlidXRlPSAgbmV3IFRleHRBdHRyaWJ1dGUoQW50VUlQbHVnaW4uZ2V0UHJlZmVyZW5jZUNvbG9yKElBbnRFZGl0b3JDb2xvckNvbnN0YW50cy5YTUxfRFREX0NPTE9SKSwgbnVsbCwgc3R5bGUpOwotCQlkdGREYW1hZ2VSZXBhaXJlcj0gbmV3IE11bHRpbGluZURhbWFnZXJSZXBhaXJlcihudWxsLCB4bWxEdGRBdHRyaWJ1dGUpOwotCSAgICByZWNvbmNpbGVyLnNldERhbWFnZXIoZHRkRGFtYWdlUmVwYWlyZXIsIEFudEVkaXRvclBhcnRpdGlvblNjYW5uZXIuWE1MX0RURCk7Ci0JICAgIHJlY29uY2lsZXIuc2V0UmVwYWlyZXIoZHRkRGFtYWdlUmVwYWlyZXIsIEFudEVkaXRvclBhcnRpdGlvblNjYW5uZXIuWE1MX0RURCk7Ci0JCi0JICAgIHJldHVybiByZWNvbmNpbGVyOwotCX0KLQotCXByaXZhdGUgaW50IGdldFN0eWxlKFN0cmluZyBwcmVmKSB7Ci0JCWludCBzdHlsZT0gU1dULk5PUk1BTDsKLQkgICAgaWYgKGZQcmVmZXJlbmNlU3RvcmUuZ2V0Qm9vbGVhbihwcmVmICsgQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfQk9MRF9TVUZGSVgpKSB7Ci0JICAgIAlzdHlsZSB8PSBTV1QuQk9MRDsKLQkgICAgfQotCSAgICBpZiAoZlByZWZlcmVuY2VTdG9yZS5nZXRCb29sZWFuKHByZWYgKyBBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9JVEFMSUNfU1VGRklYKSkgewotCSAgICAJc3R5bGUgfD0gU1dULklUQUxJQzsKLQkgICAgfQotCQlyZXR1cm4gc3R5bGU7Ci0JfQotCi0JLyoqCi0JICogUHJlZmVyZW5jZSBjb2xvcnMgaGF2ZSBjaGFuZ2VkLiAgCi0JICogVXBkYXRlIHRoZSBkZWZhdWx0IHRva2VucyBvZiB0aGUgc2Nhbm5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgYWRhcHRUb1ByZWZlcmVuY2VDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGFnU2Nhbm5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47IC8vcHJvcGVydHkgY2hhbmdlIGJlZm9yZSB0aGUgZWRpdG9yIGlzIGZ1bGx5IGNyZWF0ZWQKLQkJfQotCQl0YWdTY2FubmVyLmFkYXB0VG9QcmVmZXJlbmNlQ2hhbmdlKGV2ZW50KTsKLQkJaW5zdHJ1Y3Rpb25TY2FubmVyLmFkYXB0VG9QcmVmZXJlbmNlQ2hhbmdlKGV2ZW50KTsKLQkJU3RyaW5nIHByb3BlcnR5PSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCQlpZiAocHJvcGVydHkuc3RhcnRzV2l0aChJQW50RWRpdG9yQ29sb3JDb25zdGFudHMuWE1MX0NPTU1FTlRfQ09MT1IpKSB7Ci0JCQl4bWxDb21tZW50QXR0cmlidXRlPSBhZGFwdFRleHRBdHRyaWJ1dGUoZXZlbnQsIHByb3BlcnR5LCB4bWxDb21tZW50QXR0cmlidXRlLCBkYW1hZ2VSZXBhaXJlcik7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkuc3RhcnRzV2l0aChJQW50RWRpdG9yQ29sb3JDb25zdGFudHMuWE1MX0RURF9DT0xPUikpIHsKLQkJCXhtbER0ZEF0dHJpYnV0ZT0gYWRhcHRUZXh0QXR0cmlidXRlKGV2ZW50LCBwcm9wZXJ0eSwgeG1sRHRkQXR0cmlidXRlLCBkdGREYW1hZ2VSZXBhaXJlcik7Ci0JCX0gCi0JfQotCQotCXByaXZhdGUgVGV4dEF0dHJpYnV0ZSBhZGFwdFRleHRBdHRyaWJ1dGUoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCwgU3RyaW5nIHByb3BlcnR5LCBUZXh0QXR0cmlidXRlIHRleHRBdHRyaWJ1dGUsIE11bHRpbGluZURhbWFnZXJSZXBhaXJlciByZXBhaXJlcikgewotCQlpZiAocHJvcGVydHkuZW5kc1dpdGgoQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfQk9MRF9TVUZGSVgpKSB7Ci0JCQl0ZXh0QXR0cmlidXRlPSBhZGFwdFRvU3R5bGVDaGFuZ2UoZXZlbnQsIFNXVC5CT0xELCB0ZXh0QXR0cmlidXRlKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eS5lbmRzV2l0aChBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9JVEFMSUNfU1VGRklYKSkgewotCQkJdGV4dEF0dHJpYnV0ZT0gYWRhcHRUb1N0eWxlQ2hhbmdlKGV2ZW50LCBTV1QuSVRBTElDLCB0ZXh0QXR0cmlidXRlKTsKLQkJfSBlbHNlIHsKLQkJCXRleHRBdHRyaWJ1dGU9IGFkYXB0VG9Db2xvckNoYW5nZShldmVudCwgdGV4dEF0dHJpYnV0ZSk7Ci0JCX0KLQkJcmVwYWlyZXIuc2V0RGVmYXVsdFRleHRBdHRyaWJ1dGUodGV4dEF0dHJpYnV0ZSk7Ci0JCXJldHVybiB0ZXh0QXR0cmlidXRlOwotCX0KLQotCXByaXZhdGUgVGV4dEF0dHJpYnV0ZSBhZGFwdFRvU3R5bGVDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCwgaW50IHN0eWxlQXR0cmlidXRlLCBUZXh0QXR0cmlidXRlIHRleHRBdHRyaWJ1dGUpIHsKLQkJYm9vbGVhbiBldmVudFZhbHVlPSBmYWxzZTsKLQkJT2JqZWN0IHZhbHVlPSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7Ci0JCQlldmVudFZhbHVlPSAoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLQkJfSBlbHNlIGlmIChJUHJlZmVyZW5jZVN0b3JlLlRSVUUuZXF1YWxzKHZhbHVlKSkgewotCQkJZXZlbnRWYWx1ZT0gdHJ1ZTsKLQkJfQotCQkKLQkJYm9vbGVhbiBhY3RpdmVWYWx1ZT0gKHRleHRBdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIHN0eWxlQXR0cmlidXRlKSA9PSBzdHlsZUF0dHJpYnV0ZTsKLQkJaWYgKGFjdGl2ZVZhbHVlICE9IGV2ZW50VmFsdWUpIHsgCi0JCQl0ZXh0QXR0cmlidXRlPSBuZXcgVGV4dEF0dHJpYnV0ZSh0ZXh0QXR0cmlidXRlLmdldEZvcmVncm91bmQoKSwgdGV4dEF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCksIGV2ZW50VmFsdWUgPyB0ZXh0QXR0cmlidXRlLmdldFN0eWxlKCkgfCBzdHlsZUF0dHJpYnV0ZSA6IHRleHRBdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIH5zdHlsZUF0dHJpYnV0ZSk7Ci0JCX0JCi0JCXJldHVybiB0ZXh0QXR0cmlidXRlOwotCX0KLQkKLQkgLyoqCi0gICAgICogVXBkYXRlIHRoZSB0ZXh0IGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0b2tlbnMgb2YgdGhpcyBzY2FubmVyIGFzIGEgY29sb3IgcHJlZmVyZW5jZSBoYXMgYmVlbiBjaGFuZ2VkLiAKLSAgICAgKi8KLSAgICBwcml2YXRlIFRleHRBdHRyaWJ1dGUgYWRhcHRUb0NvbG9yQ2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQsIFRleHRBdHRyaWJ1dGUgdGV4dEF0dHJpYnV0ZSkgewotICAgIAlSR0IgcmdiPSBudWxsOwotCQkKLQkJT2JqZWN0IHZhbHVlPSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBSR0IpIHsKLQkJCXJnYj0gKFJHQikgdmFsdWU7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCXJnYj0gU3RyaW5nQ29udmVydGVyLmFzUkdCKChTdHJpbmcpIHZhbHVlKTsKLQkJfQotCQkJCi0JCWlmIChyZ2IgIT0gbnVsbCkgewotCQkJdGV4dEF0dHJpYnV0ZT0gbmV3IFRleHRBdHRyaWJ1dGUoQ29sb3JNYW5hZ2VyLmdldERlZmF1bHQoKS5nZXRDb2xvcihyZ2IpLCB0ZXh0QXR0cmlidXRlLmdldEJhY2tncm91bmQoKSwgdGV4dEF0dHJpYnV0ZS5nZXRTdHlsZSgpKTsKLQkJfQotCQlyZXR1cm4gdGV4dEF0dHJpYnV0ZTsKLSAgICB9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiNnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXIpCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7Ci0JICAgICAgICBJRG9jdW1lbnQuREVGQVVMVF9DT05URU5UX1RZUEUsCi0JICAgICAgICBBbnRFZGl0b3JQYXJ0aXRpb25TY2FubmVyLlhNTF9DT01NRU5ULAotCSAgICAgICAgQW50RWRpdG9yUGFydGl0aW9uU2Nhbm5lci5YTUxfVEFHLAotCQkJQW50RWRpdG9yUGFydGl0aW9uU2Nhbm5lci5YTUxfQ0RBVEEsCi0JCQlBbnRFZGl0b3JQYXJ0aXRpb25TY2FubmVyLlhNTF9EVER9OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24jZ2V0VGFiV2lkdGgob3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRhYldpZHRoKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCXJldHVybiBmUHJlZmVyZW5jZVN0b3JlLmdldEludChBYnN0cmFjdERlY29yYXRlZFRleHRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9UQUJfV0lEVEgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBhZmZlY3RzVGV4dFByZXNlbnRhdGlvbihQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eT0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJcmV0dXJuIHByb3BlcnR5LnN0YXJ0c1dpdGgoSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLlRFWFRfQ09MT1IpIHx8Ci0JCQlwcm9wZXJ0eS5zdGFydHNXaXRoKElBbnRFZGl0b3JDb2xvckNvbnN0YW50cy5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OU19DT0xPUikgfHwKLQkJCXByb3BlcnR5LnN0YXJ0c1dpdGgoSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLlNUUklOR19DT0xPUikgfHwKLQkJCXByb3BlcnR5LnN0YXJ0c1dpdGgoSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLlRBR19DT0xPUikgfHwKLQkJCXByb3BlcnR5LnN0YXJ0c1dpdGgoSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLlhNTF9DT01NRU5UX0NPTE9SKSB8fCAKLQkJCXByb3BlcnR5LnN0YXJ0c1dpdGgoSUFudEVkaXRvckNvbG9yQ29uc3RhbnRzLlhNTF9EVERfQ09MT1IpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uI2dldENvbmZpZ3VyZWREb2N1bWVudFBhcnRpdGlvbmluZyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCXJldHVybiBBbnREb2N1bWVudFNldHVwUGFydGljaXBhbnQuQU5UX1BBUlRJVElPTklORzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uI2dldERvdWJsZUNsaWNrU3RyYXRlZ3kob3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlciwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSVRleHREb3VibGVDbGlja1N0cmF0ZWd5IGdldERvdWJsZUNsaWNrU3RyYXRlZ3koSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlpZiAoQW50RWRpdG9yUGFydGl0aW9uU2Nhbm5lci5YTUxfVEFHLmVxdWFscyhjb250ZW50VHlwZSkpIHsKLQkJCXJldHVybiBuZXcgQW50RG91YmxlQ2xpY2tTdHJhdGVneSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXREb3VibGVDbGlja1N0cmF0ZWd5KHNvdXJjZVZpZXdlciwgY29udGVudFR5cGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL0FudFVJSW1hZ2VzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9BbnRVSUltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWYyOTViLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL0FudFVJSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKb2huLU1hc29uIFAuIFNoYWNrZWxmb3JkIChqb2huLW1hc29uLnNoYWNrZWxmb3JkQHBlYXJzb24uY29tKSAtIGJ1ZyA0OTM4MCwgNDk0NDUsIDUzNTQ3Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpOwotCi0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkNvbXBvc2l0ZUltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBUaGUgaW1hZ2VzIHByb3ZpZGVkIGJ5IHRoZSBleHRlcm5hbCB0b29scyBwbHVnaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRVSUltYWdlcyB7Ci0KLQkvKiogCi0JICogVGhlIGltYWdlIHJlZ2lzdHJ5IGNvbnRhaW5pbmcgPGNvZGU+SW1hZ2U8L2NvZGU+cy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnk7Ci0JCi0JLyoqCi0JICogVGhlIHJlZ2lzdHJ5IGZvciBjb21wb3NpdGUgaW1hZ2VzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkgaW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSUNPTlNfUEFUSCA9ICIkbmwkL2ljb25zL2Z1bGwvIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVXNlIElQYXRoIGFuZCB0b09TU3RyaW5nIHRvIGJ1aWxkIHRoZSBuYW1lcyB0byBlbnN1cmUgdGhleSBoYXZlIHRoZSBzbGFzaGVzIGNvcnJlY3QKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTE9DQUxUT09MPSBJQ09OU19QQVRIICsgImVsY2wxNi8iOyAvL2Jhc2ljIGNvbG9ycyAtIHNpemUgMTZ4MTYgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBPQkpFQ1Q9IElDT05TX1BBVEggKyAib2JqMTYvIjsgLy9iYXNpYyBjb2xvcnMgLSBzaXplIDE2eDE2IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgT1ZSPSBJQ09OU19QQVRIICsgIm92cjE2LyI7IC8vYmFzaWMgY29sb3JzIC0gc2l6ZSA3eDggLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBXSVo9IElDT05TX1BBVEggKyAid2l6YmFuLyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVF9FVE9PTD0gSUNPTlNfUEFUSCArICJldG9vbDE2IjsgCS8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBEZWNsYXJlIGFsbCBpbWFnZXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGRlY2xhcmVJbWFnZXMoKSB7Ci0JCS8vIEFudCBFZGl0b3IgaW1hZ2VzCi0JCWRlY2xhcmVSZWdpc3RyeUltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfUFJPUEVSVFksIE9CSkVDVCArICJwcm9wZXJ0eV9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19UQVNLX1BST1BPU0FMLCBPQkpFQ1QgKyAidGFza19vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19URU1QTEFURV9QUk9QT1NBTCwgT0JKRUNUICsgInRlbXBsYXRlX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19TRUdNRU5UX0VESVQsIFRfRVRPT0wgKyAic2VnbWVudF9lZGl0LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCWRlY2xhcmVSZWdpc3RyeUltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfTUFSS19PQ0NVUlJFTkNFUywgVF9FVE9PTCArICJtYXJrX29jY3VycmVuY2VzLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQkvLyBBbnQgVmlldyBBY3Rpb25zCi0JCWRlY2xhcmVSZWdpc3RyeUltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfQU5ULCBPQkpFQ1QgKyAiYW50LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCWRlY2xhcmVSZWdpc3RyeUltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfUkVNT1ZFLCBMT0NBTFRPT0wgKyAicmVtb3ZlX2NvLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCWRlY2xhcmVSZWdpc3RyeUltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfUkVNT1ZFX0FMTCwgTE9DQUxUT09MICsgInJlbW92ZWFsbF9jby5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlkZWNsYXJlUmVnaXN0cnlJbWFnZShJQW50VUlDb25zdGFudHMuSU1HX0FERCwgTE9DQUxUT09MICsgImFkZF9jby5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlkZWNsYXJlUmVnaXN0cnlJbWFnZShJQW50VUlDb25zdGFudHMuSU1HX1JVTiwgTE9DQUxUT09MICsgInJ1bl90b29sLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCWRlY2xhcmVSZWdpc3RyeUltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfU0VBUkNILCBMT0NBTFRPT0wgKyAic2VhcmNoLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlkZWNsYXJlUmVnaXN0cnlJbWFnZShJQW50VUlDb25zdGFudHMuSU1HX0ZJTFRFUl9JTlRFUk5BTF9UQVJHRVRTLCBMT0NBTFRPT0wgKyAiZmlsdGVyX2ludGVybmFsX3RhcmdldHMuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19GSUxURVJfSU1QT1JURURfRUxFTUVOVFMsIExPQ0FMVE9PTCArICJmaWx0ZXJfaW1wb3J0ZWRfZWxlbWVudHMuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19GSUxURVJfUFJPUEVSVElFUywgTE9DQUxUT09MICsgImZpbHRlcl9wcm9wZXJ0aWVzLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCWRlY2xhcmVSZWdpc3RyeUltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfRklMVEVSX1RPUF9MRVZFTCwgTE9DQUxUT09MICsgImZpbHRlcl90b3BfbGV2ZWwuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19MSU5LX1dJVEhfRURJVE9SLCBMT0NBTFRPT0wgKyAic3luY2VkLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCWRlY2xhcmVSZWdpc3RyeUltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfU09SVF9PVVRMSU5FLCBMT0NBTFRPT0wgKyAiYWxwaGFfbW9kZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlkZWNsYXJlUmVnaXN0cnlJbWFnZShJQW50VUlDb25zdGFudHMuSU1HX1JFRlJFU0gsIExPQ0FMVE9PTCArICJyZWZyZXNoLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQkvLyBBbnQgVmlldyBMYWJlbHMKLQkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19BTlRfUFJPSkVDVCwgT0JKRUNUICsgImFudF9idWlsZGZpbGUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19BTlRfVEFSR0VULCBPQkpFQ1QgKyAidGFyZ2V0cHVibGljX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlkZWNsYXJlUmVnaXN0cnlJbWFnZShJQW50VUlDb25zdGFudHMuSU1HX0FOVF9UQVJHRVRfSU5URVJOQUwsIE9CSkVDVCArICJ0YXJnZXRpbnRlcm5hbF9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19BTlRfREVGQVVMVF9UQVJHRVQsIE9CSkVDVCArICJkZWZhdWx0dGFyZ2V0X29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlkZWNsYXJlUmVnaXN0cnlJbWFnZShJQW50VUlDb25zdGFudHMuSU1HX0FOVF9UQVJHRVRfRVJST1IsIE9CSkVDVCArICJhbnRfdGFyZ2V0X2Vyci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vQU5UIG9iamVjdHMKLQkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19UQUJfQ0xBU1NQQVRILCBPQkpFQ1QgKyAiY2xhc3NwYXRoLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCWRlY2xhcmVSZWdpc3RyeUltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfQU5UX1RZUEUsIE9CSkVDVCArICJ0eXBlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCWRlY2xhcmVSZWdpc3RyeUltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfQU5UX1RBU0tERUYsIE9CSkVDVCArICJ0YXNrZGVmX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlkZWNsYXJlUmVnaXN0cnlJbWFnZShJQW50VUlDb25zdGFudHMuSU1HX0FOVF9NQUNST0RFRiwgT0JKRUNUICsgIm1hY3JvZGVmX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBkZWNsYXJlUmVnaXN0cnlJbWFnZShJQW50VUlDb25zdGFudHMuSU1HX0FOVF9JTVBPUlQsIE9CSkVDVCArICJpbXBvcnRfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGRlY2xhcmVSZWdpc3RyeUltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfQU5UX0VDTElQU0VfUlVOVElNRV9PQkpFQ1QsIE9CSkVDVCArICJlY2xpcHNlX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLQkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19XSVpBUkRfQkFOTkVSLCBXSVogKyAiYW50X3dpei5wbmciKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBkZWNsYXJlUmVnaXN0cnlJbWFnZShJQW50VUlDb25zdGFudHMuSU1HX0VYUE9SVF9XSVpBUkRfQkFOTkVSLCBXSVogKyAiZXhwb3J0X2FudF93aXoucG5nIik7IC8vJE5PTi1OTFMtMSQKLQkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19UQUJfQU5UX1RBUkdFVFMsIExPQ0FMVE9PTCArICJhbnRfdGFyZ2V0cy5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLy8gT3ZlcmxheXMKLQkJZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19PVlJfRVJST1IsIE9WUiArICJlcnJvcl9jby5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlkZWNsYXJlUmVnaXN0cnlJbWFnZShJQW50VUlDb25zdGFudHMuSU1HX09WUl9XQVJOSU5HLCBPVlIgKyAid2FybmluZ19jby5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQlkZWNsYXJlUmVnaXN0cnlJbWFnZShJQW50VUlDb25zdGFudHMuSU1HX09WUl9JTVBPUlQsIE9WUiArICJpbXBvcnRfY28uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBEZWNsYXJlIGFuIEltYWdlIGluIHRoZSByZWdpc3RyeSB0YWJsZS4KLQkgKiBAcGFyYW0ga2V5IAlUaGUga2V5IHRvIHVzZSB3aGVuIHJlZ2lzdGVyaW5nIHRoZSBpbWFnZQotCSAqIEBwYXJhbSBwYXRoCVRoZSBwYXRoIHdoZXJlIHRoZSBpbWFnZSBjYW4gYmUgZm91bmQuIFRoaXMgcGF0aCBpcyByZWxhdGl2ZSB0byB3aGVyZQotCSAqCQkJCXRoaXMgcGx1Z2luIGNsYXNzIGlzIGZvdW5kIChpLmUuIHR5cGljYWxseSB0aGUgcGFja2FnZXMgZGlyZWN0b3J5KQotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIHZvaWQgZGVjbGFyZVJlZ2lzdHJ5SW1hZ2UoU3RyaW5nIGtleSwgU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotICAgICAgICBCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKEFudFVJUGx1Z2luLmdldFVuaXF1ZUlkZW50aWZpZXIoKSk7Ci0gICAgICAgIFVSTCB1cmwgPSBudWxsOwotICAgICAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHVybCA9IEZpbGVMb2NhdG9yLmZpbmQoYnVuZGxlLCBuZXcgUGF0aChwYXRoKSwgbnVsbCk7Ci0gICAgICAgICAgICBkZXNjID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLSAgICAgICAgfQotICAgICAgICBpbWFnZVJlZ2lzdHJ5LnB1dChrZXksIGRlc2MpOwotICAgIH0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJbWFnZVJlZ2lzdHJ5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlpZiAoaW1hZ2VSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlpbml0aWFsaXplSW1hZ2VSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBpbWFnZVJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqCUluaXRpYWxpemUgdGhlIGltYWdlIHJlZ2lzdHJ5IGJ5IGRlY2xhcmluZyBhbGwgb2YgdGhlIHJlcXVpcmVkCi0JICoJZ3JhcGhpY3MuIFRoaXMgaW52b2x2ZXMgY3JlYXRpbmcgSkZhY2UgaW1hZ2UgZGVzY3JpcHRvcnMgZGVzY3JpYmluZwotCSAqCWhvdyB0byBjcmVhdGUvZmluZCB0aGUgaW1hZ2Ugc2hvdWxkIGl0IGJlIG5lZWRlZC4KLQkgKglUaGUgaW1hZ2UgaXMgbm90IGFjdHVhbGx5IGFsbG9jYXRlZCB1bnRpbCByZXF1ZXN0ZWQuCi0JICoKLQkgKiAJUHJlZml4IGNvbnZlbnRpb25zCi0JICoJCVdpemFyZCBCYW5uZXJzCQkJV0laQkFOXwotCSAqCQlQcmVmZXJlbmNlIEJhbm5lcnMJCVBSRUZfQkFOXwotCSAqCQlQcm9wZXJ0eSBQYWdlIEJhbm5lcnMJUFJPUEJBTl8KLQkgKgkJQ29sb3IgdG9vbGJhcgkJCUNUT09MXwotCSAqCQlFbmFibGUgdG9vbGJhcgkJCUVUT09MXwotCSAqCQlEaXNhYmxlIHRvb2xiYXIJCQlEVE9PTF8KLQkgKgkJTG9jYWwgZW5hYmxlZCB0b29sYmFyCUVMQ0xfCi0JICoJCUxvY2FsIERpc2FibGUgdG9vbGJhcglETENMXwotCSAqCQlPYmplY3QgbGFyZ2UJCQlPQkpMXwotCSAqCQlPYmplY3Qgc21hbGwJCQlPQkpTXwotCSAqCQlWaWV3IAkJCQkJVklFV18KLQkgKgkJUHJvZHVjdCBpbWFnZXMJCQlQUk9EXwotCSAqCQlNaXNjIGltYWdlcwkJCQlNSVNDXwotCSAqCi0JICoJV2hlcmUgYXJlIHRoZSBpbWFnZXM/Ci0JICoJCVRoZSBpbWFnZXMgKHR5cGljYWxseSBnaWZzKSBhcmUgZm91bmQgaW4gdGhlIHNhbWUgbG9jYXRpb24gYXMgdGhpcyBwbHVnaW4gY2xhc3MuCi0JICoJCVRoaXMgbWF5IG1lYW4gdGhlIHNhbWUgcGFja2FnZSBkaXJlY3RvcnkgYXMgdGhlIHBhY2thZ2UgaG9sZGluZyB0aGlzIGNsYXNzLgotCSAqCQlUaGUgaW1hZ2VzIGFyZSBkZWNsYXJlZCB1c2luZyB0aGlzLmdldENsYXNzKCkgdG8gZW5zdXJlIHRoZXkgYXJlIGxvb2tlZCB1cCB2aWEKLQkgKgkJdGhpcyBwbHVnaW4gY2xhc3MuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IGluaXRpYWxpemVJbWFnZVJlZ2lzdHJ5KCkgewotCQlpbWFnZVJlZ2lzdHJ5PSBuZXcgSW1hZ2VSZWdpc3RyeShBbnRVSVBsdWdpbi5nZXRTdGFuZGFyZERpc3BsYXkoKSk7Ci0JCWRlY2xhcmVJbWFnZXMoKTsKLQkJcmV0dXJuIGltYWdlUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+SW1hZ2U8Y29kZT4gaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5LAotCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChrZXkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5JbWFnZURlc2NyaXB0b3I8Y29kZT4gaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5LAotCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0RGVzY3JpcHRvcihrZXkpOwotCX0KLQkKLQkvKiogCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZm9yIHRoZSBnaXZlbiBjb21wb3NpdGUgZGVzY3JpcHRvci4gCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yKSB7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3JSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlpbWFnZURlc2NyaXB0b3JSZWdpc3RyeSA9IG5ldyBJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpOwkKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkuZ2V0KGltYWdlRGVzY3JpcHRvcik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkaXNwb3NlSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKSB7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3JSZWdpc3RyeSAhPSBudWxsKSB7Ci0JCQlpbWFnZURlc2NyaXB0b3JSZWdpc3RyeS5kaXNwb3NlKCk7IAotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgaW1hZ2VzIGhhdmUgYmVlbiBpbml0aWFsaXplZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGltYWdlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3JSZWdpc3RyeSAhPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL0FudFVJTW9kZWxNZXNzYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvQW50VUlNb2RlbE1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjN2Q1OTYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvQW50VUlNb2RlbE1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEFudFVJTW9kZWxNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSU1vZGVsTWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbWFnZURlc2NyaXB0b3JSZWdpc3RyeV9BbGxvY2F0aW5nX2ltYWdlX2Zvcl93cm9uZ19kaXNwbGF5XzE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRVdGlsXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50VXRpbF83OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFV0aWxfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRVdGlsXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50VXRpbF8yOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEFudFVJTW9kZWxNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL0FudFVJTW9kZWxNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvQW50VUlNb2RlbE1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYWZkMzguLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvQW50VUlNb2RlbE1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5X0FsbG9jYXRpbmdfaW1hZ2VfZm9yX3dyb25nX2Rpc3BsYXlfMT1BbGxvY2F0aW5nIGltYWdlIGZvciB3cm9uZyBkaXNwbGF5Ci0KLUFudFV0aWxfNj1JbnZhbGlkIHByb3BlcnR5IGZpbGUgZW50cnk6IHswfQotQW50VXRpbF83PVVuYWJsZSB0byBnZW5lcmF0ZSBBbnQgY2xhc3NwYXRoCi1BbnRVdGlsXzA9RWRpdG9yIGZhaWxlZCB0byBvcGVuIGZvciB7MH0KLUFudFV0aWxfMT1Ccm93c2VyIGNvdWxkIG5vdCBiZSBvcGVuZWQKLUFudFV0aWxfMj1FcnJvciByZWFkaW5nIGxhdW5jaCBjb25maWd1cmF0aW9uCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9Db2xvck1hbmFnZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL0NvbG9yTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2FiZTY3Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL0NvbG9yTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTaGFyZWRUZXh0Q29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogR2VuZXJpYyBjb2xvciBtYW5hZ2VyLgotICovCi1wdWJsaWMgY2xhc3MgQ29sb3JNYW5hZ2VyIGltcGxlbWVudHMgSVNoYXJlZFRleHRDb2xvcnMgewkKLQkKLQlwcml2YXRlIHN0YXRpYyBDb2xvck1hbmFnZXIgZmdDb2xvck1hbmFnZXI7Ci0JCi0JcHJpdmF0ZSBDb2xvck1hbmFnZXIoKSB7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29sb3JNYW5hZ2VyIGdldERlZmF1bHQoKSB7Ci0JCWlmIChmZ0NvbG9yTWFuYWdlciA9PSBudWxsKSB7Ci0JCQlmZ0NvbG9yTWFuYWdlcj0gbmV3IENvbG9yTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBmZ0NvbG9yTWFuYWdlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIE1hcCBmQ29sb3JUYWJsZT0gbmV3IEhhc2hNYXAoMTApOwotCQotCXB1YmxpYyBDb2xvciBnZXRDb2xvcihSR0IgcmdiKSB7Ci0JCUNvbG9yIGNvbG9yPSAoQ29sb3IpIGZDb2xvclRhYmxlLmdldChyZ2IpOwotCQlpZiAoY29sb3IgPT0gbnVsbCkgewotCQkJY29sb3I9IG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgcmdiKTsKLQkJCWZDb2xvclRhYmxlLnB1dChyZ2IsIGNvbG9yKTsKLQkJfQotCQlyZXR1cm4gY29sb3I7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUl0ZXJhdG9yIGU9IGZDb2xvclRhYmxlLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJKChDb2xvcikgZS5uZXh0KCkpLmRpc3Bvc2UoKTsKLQkJfQotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9FeHRlcm5hbEh5cGVybGluay5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvRXh0ZXJuYWxIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTExOTc2ZS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9FeHRlcm5hbEh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uRUZTOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb25zb2xlLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLkZpbGVTdG9yZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLQotcHVibGljIGNsYXNzIEV4dGVybmFsSHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0KLSAgICBwcml2YXRlIEZpbGUgZkZpbGU7Ci0gICAgcHJpdmF0ZSBpbnQgZkxpbmVOdW1iZXI7Ci0KLSAgICBwdWJsaWMgRXh0ZXJuYWxIeXBlcmxpbmsoRmlsZSBmaWxlLCBpbnQgbGluZU51bWJlcikgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBmRmlsZSA9IGZpbGU7Ci0gICAgICAgIGZMaW5lTnVtYmVyPSBsaW5lTnVtYmVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxpbmtFbnRlcmVkKCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGxpbmtFeGl0ZWQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZCgpIHsKLSAgICAJSUVkaXRvcklucHV0IGlucHV0OwotICAgIAlJRmlsZVN0b3JlIGZpbGVTdG9yZTsKLQkJdHJ5IHsKLQkJCWZpbGVTdG9yZT0gRUZTLmdldFN0b3JlKGZGaWxlLnRvVVJJKCkpOwotCQkJaW5wdXQgPSBuZXcgRmlsZVN0b3JlRWRpdG9ySW5wdXQoZmlsZVN0b3JlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB1bmFibGUgdG8gbGluawotCQkJQW50VUlQbHVnaW4ubG9nKGUpOwotCQkJcmV0dXJuOwotCQl9Ci0gICAgCQotICAgICAgICBJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gQW50VUlQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydD0gYWN0aXZlUGFnZS5vcGVuRWRpdG9yKGlucHV0LCAib3JnLmVjbGlwc2UuYW50LnVpLmludGVybmFsLmVkaXRvci5BbnRFZGl0b3IiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaWYgKGZMaW5lTnVtYmVyID4gMCAmJiBlZGl0b3JQYXJ0IGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLSAgICAgICAgICAgICAgICBJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKWVkaXRvclBhcnQ7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIElEb2N1bWVudFByb3ZpZGVyIHByb3ZpZGVyID0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5jb25uZWN0KGlucHV0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmFibGUgdG8gbGluawotICAgICAgICAgICAgICAgICAgICAgICAgQW50VUlQbHVnaW4ubG9nKGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIElEb2N1bWVudCBkb2N1bWVudCA9IHByb3ZpZGVyLmdldERvY3VtZW50KGlucHV0KTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElSZWdpb24gbGluZVJlZ2lvbj0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uKGZMaW5lTnVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHRFZGl0b3Iuc2VsZWN0QW5kUmV2ZWFsKGxpbmVSZWdpb24uZ2V0T2Zmc2V0KCksIGxpbmVSZWdpb24uZ2V0TGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmFibGUgdG8gbGluawotICAgICAgICAgICAgICAgICAgICAgICAgQW50VUlQbHVnaW4ubG9nKGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLmRpc2Nvbm5lY3QoaW5wdXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvSUFudFVJQ29uc3RhbnRzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9JQW50VUlDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMxNjZiMi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9JQW50VUlDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCAoam9obi1tYXNvbi5zaGFja2VsZm9yZEBwZWFyc29uLmNvbSkgLSBidWcgNDkzODAsIDQ5NDQ1LCBidWcgNTM1NDcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWk7Ci0KLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBjb25zdGFudHMgYXZhaWxhYmxlIGZvciBjbGllbnQgdXNlLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgZXh0ZW5kZWQgb3IgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQW50VUlDb25zdGFudHMgewotCS8qKgotCSAqIFBsdWdpbiBpZGVudGlmaWVyIGZvciBBbnQgdWkodmFsdWUgPGNvZGU+b3JnLmVjbGlwc2UuYW50LnVpPC9jb2RlPikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmFudC51aSI7IC8vJE5PTi1OTFMtMSQ7Ci0JCi0KLQkvLyAtLS0tLS0tIFZpZXdzIC0tLS0tLS0KLQotCS8qKgotCSAqIEFudCBWaWV3IGlkZW50aWZpZXIgKHZhbHVlIDxjb2RlPm9yZy5lY2xpcHNlLmFudC51aS5BbnRWaWV3PC9jb2RlPikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UX1ZJRVdfSUQgPSBQTFVHSU5fSUQgKyAiLkFudFZpZXciOyAvLyROT04tTkxTLTEkCi0KLQkvLyAtLS0tLS0tIEltYWdlcyAtLS0tLS0tCi0JLyoqCi0JICogTWFpbiB0YWIgaW1hZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1RBQl9NQUlOID0gUExVR0lOX0lEICsgIi5JTUdfVEFCX01BSU4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUFJPUEVSVFkgPSBQTFVHSU5fSUQgKyAiLklNR19QUk9QRVJUWSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfVEFCX0FOVF9UQVJHRVRTID0gUExVR0lOX0lEICsgIi5JTUdfVEFCX0FOVF9UQVJHRVRTIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19UQUJfQ0xBU1NQQVRIID0gUExVR0lOX0lEICsgIi5JTUdfVEFCX0NMQVNTUEFUSCI7IC8vJE5PTi1OTFMtMSQ7Ci0JCi0JLy8JTGFiZWwgaW1hZ2VzCi0JIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19BTlQ9IFBMVUdJTl9JRCArICIuYW50IjsgLy8kTk9OLU5MUy0xJAotCSBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQU5UX1BST0pFQ1Q9IFBMVUdJTl9JRCArICIuYW50UHJvamVjdCI7IC8vJE5PTi1OTFMtMSQKLQkgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0FOVF9UQVJHRVQ9IFBMVUdJTl9JRCArICIuYW50VGFyZ2V0IjsgLy8kTk9OLU5MUy0xJAotCSBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQU5UX1RBUkdFVF9JTlRFUk5BTCA9IFBMVUdJTl9JRCArICIuYW50UHJpdmF0ZVRhcmdldCI7IC8vJE5PTi1OTFMtMSQKLQkgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0FOVF9ERUZBVUxUX1RBUkdFVD0gUExVR0lOX0lEICsgIi5hbnREZWZhdWx0VGFyZ2V0IjsgLy8kTk9OLU5MUy0xJAotCSBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQU5UX1RBUkdFVF9FUlJPUiA9IFBMVUdJTl9JRCArICIuYW50VGFyZ2V0RXJyb3IiOyAvLyROT04tTkxTLTEkCi0JIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19BTlRfTUFDUk9ERUYgPSBQTFVHSU5fSUQgKyAiLmFudE1hY3JvZGVmIjsgLy8kTk9OLU5MUy0xJAotICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQU5UX0lNUE9SVCA9IFBMVUdJTl9JRCArICIuYW50SW1wb3J0IjsgLy8kTk9OLU5MUy0xJAotICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQU5UX1RBU0tERUYgPSBQTFVHSU5fSUQgKyAiLmFudFRhc2tkZWYiOyAvLyROT04tTkxTLTEkCi0gICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19BTlRfRUNMSVBTRV9SVU5USU1FX09CSkVDVCA9IFBMVUdJTl9JRCArICIuYW50RWNsaXBzZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgCi0gICAgIC8vZWRpdG9yIHRvb2xiYXIKLSAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1NFR01FTlRfRURJVCA9IFBMVUdJTl9JRCArICIuc2VnbWVudEVkaXQiOyAvLyROT04tTkxTLTEkCi0JIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19NQVJLX09DQ1VSUkVOQ0VTID0gUExVR0lOX0lEICsgIi5tYXJrT2NjdXJyZW5jZXMiOyAvLyROT04tTkxTLTEkCi0gICAgIAotCS8qKgotCSAqIEljb24gZm9yIHRhc2sgcHJvcG9zYWwuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1RBU0tfUFJPUE9TQUwgPSBQTFVHSU5fSUQgKyAiLmh0bWxfdGFiX29iaiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfVEVNUExBVEVfUFJPUE9TQUw9IFBMVUdJTl9JRCArICIudGVtcGxhdGVfb2JqIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIEFjdGlvbiBpbWFnZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUkVNT1ZFPSBQTFVHSU5fSUQgKyAiLnJlbW92ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUkVNT1ZFX0FMTD0gUExVR0lOX0lEICsgIi5yZW1vdmVBbGwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0FERD0gUExVR0lOX0lEICsgIi5hZGQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1JVTj0gUExVR0lOX0lEICsgIi5ydW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1NFQVJDSD0gUExVR0lOX0lEICsgIi5zZWFyY2giOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0ZJTFRFUl9JTlRFUk5BTF9UQVJHRVRTPSBQTFVHSU5fSUQgKyAiLmZpbHRlckludGVybmFsVGFyZ2V0cyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRklMVEVSX0lNUE9SVEVEX0VMRU1FTlRTPSBQTFVHSU5fSUQgKyAiLmZpbHRlckltcG9ydGVkRWxlbWVudHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0ZJTFRFUl9QUk9QRVJUSUVTPSBQTFVHSU5fSUQgKyAiLmZpbHRlclByb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0ZJTFRFUl9UT1BfTEVWRUw9IFBMVUdJTl9JRCArICIuZmlsdGVyVG9wTGV2ZWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1NPUlRfT1VUTElORT0gUExVR0lOX0lEICsgIi5zb3J0T3V0bGluZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTElOS19XSVRIX0VESVRPUj0gUExVR0lOX0lEICsgIi5saW5rV2l0aEVkaXRvciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUkVGUkVTSCA9IFBMVUdJTl9JRCArICIuSU1HX1JFRlJFU0giOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dJWkFSRF9CQU5ORVIgPSBQTFVHSU5fSUQgKyAiLklNR19XSVpBUkRfQkFOTkVSIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FWFBPUlRfV0laQVJEX0JBTk5FUiA9IFBMVUdJTl9JRCArICIuSU1HX0VYUE9SVF9XSVpBUkRfQkFOTkVSIjsgLy8kTk9OLU5MUy0xJAotCSAKLQkvLwlPdmVybGF5cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PVlJfRVJST1IgPSBQTFVHSU5fSUQgKyAiLm92ckVycm9yIjsgIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT1ZSX1dBUk5JTkcgPSBQTFVHSU5fSUQgKyAiLm92cldhcm5pbmciOyAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PVlJfSU1QT1JUID0gUExVR0lOX0lEICsgIi5vdnJJbXBvcnQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0FOVF9UWVBFPSBQTFVHSU5fSUQgKyAiLnR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyAtLS0tLS0tLSBTdGF0dXMgQ29kZXMgLS0tLS0tLS0tLS0tLQotCQotCS8qKgotCSAqIFN0YXR1cyBjb2RlIHVzZWQgYnkgdGhlICdSdW4gQW50JyBzdGF0dXMgaGFuZGxlciB3aGljaCBpcyBpbnZva2VkIHdoZW4KLQkgKiB0aGUgbGF1bmNoIGRpYWxvZyBpcyBvcGVuZWQgYnkgdGhlICdSdW4gQW50JyBhY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0lOSVRfUlVOX0FOVCA9IDEwMDA7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HU1RPUkVfTEFTVEVYVEpBUj0gUExVR0lOX0lEICsgIi5sYXN0ZXh0amFyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR1NUT1JFX0xBU1RFWFRGSUxFPSBQTFVHSU5fSUQgKyAiLmxhc3RleHRmaWxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR1NUT1JFX0xBU1RGT0xERVI9IFBMVUdJTl9JRCArICIubGFzdGZvbGRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dTVE9SRV9MQVNUQU5USE9NRT0gUExVR0lOX0lEICsgIi5sYXN0YW50aG9tZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBTaXplIG9mIGxlZnQtaGFuZCBjb2x1bW4gZm9yIHJpZ2h0LWp1c3RpZmllZCB0YXNrIG5hbWUuCi0JICogVXNlZCBmb3IgQW50IEJ1aWxkIGxvZ2dpbmcuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLnJ1bnRpbWUubG9nZ2VyLkFudFByb2Nlc3NCdWlsZExvZ2dlcgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5sYXVuY2hDb25maWd1cmF0aW9ucy5SZW1vdGVBbnRCdWlsZExpc3RlbmVyCi0JICAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFRlRfQ09MVU1OX1NJWkUgPSAxNTsKLQkKLQkvKioKLQkgKiBJZCBvZiB0aGUgSVByb2Nlc3NGYWN0b3J5IHRvIHVzZSB3aGVuIGNyZWF0aW5nIHByb2Nlc3NlcyBmb3IgcmVtb3RlIEFudCBidWlsZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1RFX0FOVF9QUk9DRVNTX0ZBQ1RPUllfSUQ9ICJvcmcuZWNsaXBzZS5hbnQudWkucmVtb3RlQW50UHJvY2Vzc0ZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQm9vbGVhbiBhdHRyaWJ1dGUgaW5kaWNhdGluZyBpZiBhbiBpbnB1dCBoYW5kbGVyIHNob3VsZCBiZSBzdXBwbGllZCBmb3IgdGhlIGJ1aWxkCi0JICogRGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfSU5QVVRIQU5ETEVSPSBQTFVHSU5fSUQgKyAiU0VUX0lOUFVUSEFORExFUiI7IC8vJE5PTi1OTFMtMSQJCi19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9JbWFnZURlc2NyaXB0b3JSZWdpc3RyeS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1MzAzMi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9JbWFnZURlc2NyaXB0b3JSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWk7Ci0KLSAKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBBIHJlZ2lzdHJ5IHRoYXQgbWFwcyA8Y29kZT5JbWFnZURlc2NyaXB0b3JzPC9jb2RlPiB0byA8Y29kZT5JbWFnZTwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSB7Ci0KLQlwcml2YXRlIEhhc2hNYXAgZlJlZ2lzdHJ5PSBuZXcgSGFzaE1hcCgxMCk7Ci0JcHJpdmF0ZSBEaXNwbGF5IGZEaXNwbGF5OwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeSBmb3IgdGhlIGN1cnJlbnQgb3IgZGVmYXVsdCBkaXNwbGF5LAotCSAqIHJlc3BlY3RpdmVseS4KLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKSB7Ci0JCXRoaXMoQW50VUlQbHVnaW4uZ2V0U3RhbmRhcmREaXNwbGF5KCkpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoZSBnaXZlbiBkaXNwbGF5LiBBbGwgaW1hZ2VzCi0JICogbWFuYWdlZCBieSB0aGlzIHJlZ2lzdHJ5IHdpbGwgYmUgZGlzcG9zZWQgd2hlbiB0aGUgZGlzcGxheSBnZXRzIGRpc3Bvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBkaXNwbGF5IHRoZSBkaXNwbGF5IHRoZSBpbWFnZXMgbWFuYWdlZCBieSB0aGlzIHJlZ2lzdHJ5IGFyZSBhbGxvY2F0ZWQgZm9yIAotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3JSZWdpc3RyeShEaXNwbGF5IGRpc3BsYXkpIHsKLQkJZkRpc3BsYXk9IGRpc3BsYXk7Ci0JCUFzc2VydC5pc05vdE51bGwoZkRpc3BsYXkpOwotCQlob29rRGlzcGxheSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGltYWdlIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0b3IgdGhlIGltYWdlIGRlc2NyaXB0b3IgZm9yIHdoaWNoIHRoZSByZWdpc3RyeSBtYW5hZ2VzIGFuIGltYWdlCi0JICogQHJldHVybiB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbWFnZSBkZXNjcmlwdG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogIGlmIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGNhbid0IGNyZWF0ZSB0aGUgcmVxdWVzdGVkIGltYWdlLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXQoSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkKLQkJCWRlc2NyaXB0b3I9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQkKLQkJSW1hZ2UgcmVzdWx0PSAoSW1hZ2UpZlJlZ2lzdHJ5LmdldChkZXNjcmlwdG9yKTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkKLQkJQXNzZXJ0LmlzVHJ1ZShmRGlzcGxheSA9PSBBbnRVSVBsdWdpbi5nZXRTdGFuZGFyZERpc3BsYXkoKSwgQW50VUlNb2RlbE1lc3NhZ2VzLkltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5X0FsbG9jYXRpbmdfaW1hZ2VfZm9yX3dyb25nX2Rpc3BsYXlfMSk7Ci0JCXJlc3VsdD0gZGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlmUmVnaXN0cnkucHV0KGRlc2NyaXB0b3IsIHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgYWxsIGltYWdlcyBtYW5hZ2VkIGJ5IHRoaXMgcmVnaXN0cnkuCi0JICovCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcj0gZlJlZ2lzdHJ5LnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCUltYWdlIGltYWdlPSAoSW1hZ2UpaXRlci5uZXh0KCk7Ci0JCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCX0KLQkJZlJlZ2lzdHJ5LmNsZWFyKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBob29rRGlzcGxheSgpIHsKLQkJZkRpc3BsYXkuZGlzcG9zZUV4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRpc3Bvc2UoKTsKLQkJCX0JCi0JCX0pOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvV29ya2JlbmNoQW50UnVubmVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9Xb3JrYmVuY2hBbnRSdW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ1N2RhMy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9Xb3JrYmVuY2hBbnRSdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBBcHBsaWNhdGlvbiB0byBydW4gYW4gQW50IHNjcmlwdCBhZnRlciBzdGFydGluZyB0aGUgd29ya2JlbmNoLiBTaHV0cyBkb3duIHRoZQotICogd29ya2JlbmNoIGFmdGVyIHRoZSBzY3JpcHQgcnVucy4KLSAqIAotICogQHNpbmNlIDMuNAotICovCi1wdWJsaWMgY2xhc3MgV29ya2JlbmNoQW50UnVubmVyIGltcGxlbWVudHMgSUFwcGxpY2F0aW9uIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbiNzdGFydChvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb25Db250ZXh0KQotCSAqLwotCXB1YmxpYyBPYmplY3Qgc3RhcnQoSUFwcGxpY2F0aW9uQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gUGxhdGZvcm1VSS5jcmVhdGVEaXNwbGF5KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbChkaXNwbGF5LCBTV1QuT05fVE9QKTsKLQkJCXNoZWxsLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgd29ya2JlbmNoIHdpdGggdGhpcyBhZHZpc29yIGFuZCBydW4gaXQgdW50aWwgaXQgZXhpdHMKLSAgICAgICAgICAgIC8vIE4uQi4gY3JlYXRlV29ya2JlbmNoIHJlbWVtYmVycyB0aGUgYWR2aXNvciwgYW5kIGFsc28gcmVnaXN0ZXJzCi0gICAgICAgICAgICAvLyB0aGUgd29ya2JlbmNoIGdsb2JhbGx5IHNvIHRoYXQgYWxsIFVJIHBsdWctaW5zIGNhbiBmaW5kIGl0IHVzaW5nCi0gICAgICAgICAgICAvLyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpIG9yIEFic3RyYWN0VUlQbHVnaW4uZ2V0V29ya2JlbmNoKCkKLSAgICAgICAgICAgIFBsYXRmb3JtVUkuY3JlYXRlQW5kUnVuV29ya2JlbmNoKGRpc3BsYXksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBBbnRSdW5uZXJXb3JrYmVuY2hBZHZpc29yKAotICAgICAgICAgICAgICAgICAgICAJCWNvbnRleHQuZ2V0QXJndW1lbnRzKCkuZ2V0KElBcHBsaWNhdGlvbkNvbnRleHQuQVBQTElDQVRJT05fQVJHUykpKTsKLSAgICAgICAgICAgIHJldHVybiBFWElUX09LOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGRpc3BsYXkgIT0gbnVsbCkgewotCQkJCWRpc3BsYXkuZGlzcG9zZSgpOwotCQkJfQotICAgICAgICB9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uI3N0b3AoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9jb25zb2xlL0Fic3RyYWN0SmF2YWNQYXR0ZXJuTWF0Y2hlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvY29uc29sZS9BYnN0cmFjdEphdmFjUGF0dGVybk1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MwNGFlYy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9jb25zb2xlL0Fic3RyYWN0SmF2YWNQYXR0ZXJuTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuY29uc29sZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb25zb2xlLkZpbGVMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb25zb2xlLklQYXR0ZXJuTWF0Y2hMaXN0ZW5lckRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuUGF0dGVybk1hdGNoRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5UZXh0Q29uc29sZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YWNQYXR0ZXJuTWF0Y2hlciBpbXBsZW1lbnRzIElQYXR0ZXJuTWF0Y2hMaXN0ZW5lckRlbGVnYXRlIHsKLQotICAgIHByb3RlY3RlZCBUZXh0Q29uc29sZSBmQ29uc29sZTsKLSAgICBwcml2YXRlIHN0YXRpYyBQYXR0ZXJuIGZnTGluZU51bWJlclBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIlxcZCsiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIExpc3QgZmdQYXR0ZXJuTWF0Y2hlcnM9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBwcml2YXRlIE1hcCBmRmlsZU5hbWVUb0lGaWxlPSBuZXcgSGFzaE1hcCgpOwotICAgIAotCXByaXZhdGUgSmF2YWNNYXJrZXJDcmVhdG9yIGZNYXJrZXJDcmVhdG9yOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBmZ1dhcm5pbmdUeXBlPSBuZXcgSW50ZWdlcihJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcpOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBmZ0Vycm9yVHlwZT0gbmV3IEludGVnZXIoSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5jb25zb2xlLklQYXR0ZXJuTWF0Y2hMaXN0ZW5lckRlbGVnYXRlI2Nvbm5lY3Qob3JnLmVjbGlwc2UudWkuY29uc29sZS5UZXh0Q29uc29sZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb25uZWN0KFRleHRDb25zb2xlIGNvbnNvbGUpIHsKLSAgICAgICAgZkNvbnNvbGU9IGNvbnNvbGU7Ci0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmU9IEFudFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJaWYgKHN0b3JlLmdldEJvb2xlYW4oSUFudFVJUHJlZmVyZW5jZUNvbnN0YW50cy5BTlRfQ1JFQVRFX01BUktFUlMpKSB7Ci0gICAgICAgIAlmTWFya2VyQ3JlYXRvcj0gbmV3IEphdmFjTWFya2VyQ3JlYXRvcihmQ29uc29sZSwgdGhpcyBpbnN0YW5jZW9mIEVjbGlwc2VKYXZhY1BhdHRlcm5NYXRjaGVyKTsKLSAgICAgICAgCWZnUGF0dGVybk1hdGNoZXJzLmFkZCh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuSVBhdHRlcm5NYXRjaExpc3RlbmVyRGVsZWdhdGUjZGlzY29ubmVjdCgpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHsKLSAgICAgICAgZkNvbnNvbGUgPSBudWxsOwotICAgICAgICBmRmlsZU5hbWVUb0lGaWxlLmNsZWFyKCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBJRmlsZSBnZXRJRmlsZShTdHJpbmcgZmlsZVBhdGgpIHsKLSAgICAgICAgaWYgKGZpbGVQYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOyAKLSAgICAgICAgfQotICAgICAgICBJRmlsZSBmaWxlPSAoSUZpbGUpIGZGaWxlTmFtZVRvSUZpbGUuZ2V0KGZpbGVQYXRoKTsKLSAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgSUZpbGVbXSBmaWxlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24obmV3IFBhdGgoZmlsZVBhdGgpKTsKLSAgICAgICAgICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgZmlsZSA9IGZpbGVzWzBdOwotICAgICAgICAgICAgICAgIGZGaWxlTmFtZVRvSUZpbGUucHV0KGZpbGVQYXRoLCBmaWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmlsZTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRNYXRjaGVkVGV4dChQYXR0ZXJuTWF0Y2hFdmVudCBldmVudCkgewotICAgICAgICBpbnQgZXZlbnRPZmZzZXQ9IGV2ZW50LmdldE9mZnNldCgpOwotICAgICAgICBpbnQgZXZlbnRMZW5ndGg9IGV2ZW50LmdldExlbmd0aCgpOwotICAgICAgICBJRG9jdW1lbnQgZG9jdW1lbnQ9IGZDb25zb2xlLmdldERvY3VtZW50KCk7Ci0gICAgICAgIFN0cmluZyBtYXRjaGVkVGV4dD0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1hdGNoZWRUZXh0PSBkb2N1bWVudC5nZXQoZXZlbnRPZmZzZXQsIGV2ZW50TGVuZ3RoKTsKLSAgICAgICAgfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQW50VUlQbHVnaW4ubG9nKGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXRjaGVkVGV4dDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGludCBnZXRMaW5lTnVtYmVyKGludCBldmVudE9mZnNldCwgYm9vbGVhbiBzYW1lTGluZSkgewotICAgICAgICBJRG9jdW1lbnQgZG9jdW1lbnQ9IGZDb25zb2xlLmdldERvY3VtZW50KCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnQgZmlsZUxpbmUgPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZXZlbnRPZmZzZXQpOwotICAgICAgICAgICAgaWYgKCFzYW1lTGluZSkgewotICAgICAgICAgICAgCWZpbGVMaW5lICs9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJUmVnaW9uIHJlZ2lvbiA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihmaWxlTGluZSk7Ci0gICAgICAgICAgICBpbnQgcmVnaW9uTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotICAgICAgICAgICAgaWYgKHJlZ2lvbi5nZXRPZmZzZXQoKSAhPSBldmVudE9mZnNldCkgewotICAgICAgICAgICAgCSByZWdpb25MZW5ndGggPSByZWdpb25MZW5ndGggLSAoZXZlbnRPZmZzZXQgLSByZWdpb24uZ2V0T2Zmc2V0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0JCQlTdHJpbmcgbGluZUxpbmUgPSBkb2N1bWVudC5nZXQoZXZlbnRPZmZzZXQsIHJlZ2lvbkxlbmd0aCk7Ci0gICAgICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBudWxsOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChmZ0xpbmVOdW1iZXJQYXR0ZXJuKSB7Ci0gICAgICAgICAgICAgICAgbWF0Y2hlciA9IGZnTGluZU51bWJlclBhdHRlcm4ubWF0Y2hlcihsaW5lTGluZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWF0Y2hlci5maW5kKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbGluZVN0cmluZyA9IG1hdGNoZXIuZ3JvdXAoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChsaW5lU3RyaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBBbnRVSVBsdWdpbi5sb2coZSk7Ci0gICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBBbnRVSVBsdWdpbi5sb2coZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRMaW5rKFN0cmluZyBmaWxlUGF0aCwgaW50IGxpbmVOdW1iZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIEludGVnZXIgdHlwZSkgewotICAgICAgICBJRmlsZSBmaWxlPSBnZXRJRmlsZShmaWxlUGF0aCk7Ci0gICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKGZNYXJrZXJDcmVhdG9yICE9IG51bGwpIHsKLSAgICAgICAgCWlmICh0eXBlID09IG51bGwpIHsgLy9tYXRjaCBmb3IgbGlzdGZpbGVzCi0gICAgICAgIAkJZk1hcmtlckNyZWF0b3IuYWRkRmlsZVRvQmVDbGVhbmVkKGZpbGUpOwotICAgICAgICAJfSBlbHNlIHsgLy9tYXRjaCBmb3IgZXJyb3Igb3Igd2FybmluZwotICAgICAgICAJCWZNYXJrZXJDcmVhdG9yLmFkZE1hcmtlcihmaWxlLCBsaW5lTnVtYmVyLCBvZmZzZXQsIHR5cGUpOwotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBGaWxlTGluayBsaW5rID0gbmV3IEZpbGVMaW5rKGZpbGUsIG51bGwsIC0xLCAtMSwgbGluZU51bWJlcik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmQ29uc29sZS5hZGRIeXBlcmxpbmsobGluaywgb2Zmc2V0LCBsZW5ndGgpOwotICAgICAgICB9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBBbnRVSVBsdWdpbi5sb2coZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29uc29sZUNsb3NlZChJUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCUl0ZXJhdG9yIGl0ZXI9IG5ldyBBcnJheUxpc3QoZmdQYXR0ZXJuTWF0Y2hlcnMpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJQWJzdHJhY3RKYXZhY1BhdHRlcm5NYXRjaGVyIG1hdGNoZXIgPSAoQWJzdHJhY3RKYXZhY1BhdHRlcm5NYXRjaGVyKSBpdGVyLm5leHQoKTsKLQkJCW1hdGNoZXIuZmluaXNoZWQocHJvY2Vzcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZChJUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCWlmIChmTWFya2VyQ3JlYXRvciAhPSBudWxsKSB7Ci0JCQlmTWFya2VyQ3JlYXRvci5maW5pc2hlZChwcm9jZXNzKTsKLQkJCWZnUGF0dGVybk1hdGNoZXJzLnJlbW92ZSh0aGlzKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9jb25zb2xlL0FudENvbnNvbGVDb2xvclByb3ZpZGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9jb25zb2xlL0FudENvbnNvbGVDb2xvclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NzZiZDQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvY29uc29sZS9BbnRDb25zb2xlQ29sb3JQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmNvbnNvbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmxhdW5jaENvbmZpZ3VyYXRpb25zLkFudFN0cmVhbXNQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb25zb2xlLkNvbnNvbGVDb2xvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuSU9Db25zb2xlT3V0cHV0U3RyZWFtOwotCi0KLXB1YmxpYyBjbGFzcyBBbnRDb25zb2xlQ29sb3JQcm92aWRlciBleHRlbmRzIENvbnNvbGVDb2xvclByb3ZpZGVyIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCi0gICAgCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZUNvbG9yUHJvdmlkZXIjZ2V0Q29sb3IoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgQ29sb3IgZ2V0Q29sb3IoU3RyaW5nIHN0cmVhbUlkZW50aWZlcikgewotCQlpZiAoc3RyZWFtSWRlbnRpZmVyLmVxdWFscyhJRGVidWdVSUNvbnN0YW50cy5JRF9TVEFOREFSRF9PVVRQVVRfU1RSRUFNKSkgewotCQkJcmV0dXJuIEFudFVJUGx1Z2luLmdldFByZWZlcmVuY2VDb2xvcihJQW50VUlQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfSU5GT19DT0xPUik7Ci0JCX0KLQkJaWYgKHN0cmVhbUlkZW50aWZlci5lcXVhbHMoSURlYnVnVUlDb25zdGFudHMuSURfU1RBTkRBUkRfRVJST1JfU1RSRUFNKSkgewotCQkJcmV0dXJuIEFudFVJUGx1Z2luLmdldFByZWZlcmVuY2VDb2xvcihJQW50VUlQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfRVJST1JfQ09MT1IpOwotCQl9CQkJCQotCQlpZiAoc3RyZWFtSWRlbnRpZmVyLmVxdWFscyhBbnRTdHJlYW1zUHJveHkuQU5UX0RFQlVHX1NUUkVBTSkpIHsKLQkJCXJldHVybiBBbnRVSVBsdWdpbi5nZXRQcmVmZXJlbmNlQ29sb3IoSUFudFVJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX0RFQlVHX0NPTE9SKTsKLQkJfQotCQlpZiAoc3RyZWFtSWRlbnRpZmVyLmVxdWFscyhBbnRTdHJlYW1zUHJveHkuQU5UX1ZFUkJPU0VfU1RSRUFNKSkgewotCQkJcmV0dXJuIEFudFVJUGx1Z2luLmdldFByZWZlcmVuY2VDb2xvcihJQW50VUlQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfVkVSQk9TRV9DT0xPUik7Ci0JCX0KLQkJaWYgKHN0cmVhbUlkZW50aWZlci5lcXVhbHMoQW50U3RyZWFtc1Byb3h5LkFOVF9XQVJOSU5HX1NUUkVBTSkpIHsKLQkJCXJldHVybiBBbnRVSVBsdWdpbi5nZXRQcmVmZXJlbmNlQ29sb3IoSUFudFVJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX1dBUk5JTkdfQ09MT1IpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb2xvcihzdHJlYW1JZGVudGlmZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGVDb2xvclByb3ZpZGVyI2Nvbm5lY3Qob3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JUHJvY2Vzcywgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25uZWN0KElQcm9jZXNzIHByb2Nlc3MsIElDb25zb2xlIGNvbnNvbGUpIHsKLQkJLy9Cb3RoIHJlbW90ZSBhbmQgbG9jYWwgQW50IGJ1aWxkcyBhcmUgZ3VhcmFudGVlZCB0byBoYXZlCi0JCS8vYW4gQW50U3RyZWFtc1Byb3h5LiBUaGUgcmVtb3RlIEFudCBidWlsZHMgbWFrZSB1c2Ugb2YgdGhlCi0JCS8vIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUucHJvY2Vzc0ZhY3RvcmllcyBleHRlbnNpb24gcG9pbnQKLQkJQW50U3RyZWFtc1Byb3h5IHByb3h5ID0gKEFudFN0cmVhbXNQcm94eSlwcm9jZXNzLmdldFN0cmVhbXNQcm94eSgpOwotCQlpZiAocHJveHkgIT0gbnVsbCkgewotCQkJY29uc29sZS5jb25uZWN0KHByb3h5LmdldERlYnVnU3RyZWFtTW9uaXRvcigpLCBBbnRTdHJlYW1zUHJveHkuQU5UX0RFQlVHX1NUUkVBTSk7Ci0JCQljb25zb2xlLmNvbm5lY3QocHJveHkuZ2V0V2FybmluZ1N0cmVhbU1vbml0b3IoKSwgQW50U3RyZWFtc1Byb3h5LkFOVF9XQVJOSU5HX1NUUkVBTSk7Ci0JCQljb25zb2xlLmNvbm5lY3QocHJveHkuZ2V0VmVyYm9zZVN0cmVhbU1vbml0b3IoKSwgQW50U3RyZWFtc1Byb3h5LkFOVF9WRVJCT1NFX1NUUkVBTSk7Ci0JCX0KLQkJCi0JCUFudFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlzdXBlci5jb25uZWN0KHByb2Nlc3MsIGNvbnNvbGUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb25zb2xlLklDb25zb2xlQ29sb3JQcm92aWRlciNpc1JlYWRPbmx5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCSAgICBmaW5hbCBTdHJpbmcgc3RyZWFtSWQgPSBnZXRTdHJlYW1JZChldmVudC5nZXRQcm9wZXJ0eSgpKTsKLQkJaWYgKHN0cmVhbUlkICE9IG51bGwpIHsKLQkJCUFudFVJUGx1Z2luLmdldFN0YW5kYXJkRGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCSAgICBJT0NvbnNvbGVPdXRwdXRTdHJlYW0gc3RyZWFtID0gZ2V0Q29uc29sZSgpLmdldFN0cmVhbShzdHJlYW1JZCk7Ci0JCQkJICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgewotCQkJCSAgICAgICAgc3RyZWFtLnNldENvbG9yKGdldENvbG9yKHN0cmVhbUlkKSk7Ci0JCQkJICAgIH0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN0cmVhbUlkKFN0cmluZyBjb2xvcklkKSB7Ci0JCWlmIChJQW50VUlQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfREVCVUdfQ09MT1IuZXF1YWxzKGNvbG9ySWQpKSB7Ci0JCQlyZXR1cm4gQW50U3RyZWFtc1Byb3h5LkFOVF9ERUJVR19TVFJFQU07Ci0JCX0gZWxzZSBpZiAoSUFudFVJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX0VSUk9SX0NPTE9SLmVxdWFscyhjb2xvcklkKSkgewotCQkJcmV0dXJuIElEZWJ1Z1VJQ29uc3RhbnRzLklEX1NUQU5EQVJEX0VSUk9SX1NUUkVBTTsKLQkJfSBlbHNlIGlmIChJQW50VUlQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfSU5GT19DT0xPUi5lcXVhbHMoY29sb3JJZCkpIHsKLQkJCXJldHVybiBJRGVidWdVSUNvbnN0YW50cy5JRF9TVEFOREFSRF9PVVRQVVRfU1RSRUFNOwotCQl9IGVsc2UgaWYgKElBbnRVSVByZWZlcmVuY2VDb25zdGFudHMuQ09OU09MRV9WRVJCT1NFX0NPTE9SLmVxdWFscyhjb2xvcklkKSkgewotCQkJcmV0dXJuIEFudFN0cmVhbXNQcm94eS5BTlRfVkVSQk9TRV9TVFJFQU07Ci0JCX0gZWxzZSBpZiAoSUFudFVJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX1dBUk5JTkdfQ09MT1IuZXF1YWxzKGNvbG9ySWQpKSB7Ci0JCQlyZXR1cm4gQW50U3RyZWFtc1Byb3h5LkFOVF9XQVJOSU5HX1NUUkVBTTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZUNvbG9yUHJvdmlkZXIjZGlzY29ubmVjdCgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHsKLQkJQW50VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCXN1cGVyLmRpc2Nvbm5lY3QoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9jb25zb2xlL0NvbnNvbGVNZXNzYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvY29uc29sZS9Db25zb2xlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ5ZGEzZC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9jb25zb2xlL0NvbnNvbGVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmNvbnNvbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgQ29uc29sZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmNvbnNvbGUuQ29uc29sZU1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0JCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIENvbnNvbGVNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmF2YWNNYXJrZXJDcmVhdG9yXzA7Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9jb25zb2xlL0VjbGlwc2VKYXZhY1BhdHRlcm5NYXRjaGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9jb25zb2xlL0VjbGlwc2VKYXZhY1BhdHRlcm5NYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Y2E3ZTQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvY29uc29sZS9FY2xpcHNlSmF2YWNQYXR0ZXJuTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5jb25zb2xlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5QYXR0ZXJuTWF0Y2hFdmVudDsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VKYXZhY1BhdHRlcm5NYXRjaGVyIGV4dGVuZHMgQWJzdHJhY3RKYXZhY1BhdHRlcm5NYXRjaGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBmZ0Vycm9yPSAiRVJST1IgaW4iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGZnV2FybmluZz0gIldBUk5JTkcgaW4iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGZnU3RhcnRPZkxpbmVOdW1iZXI9ICIgKCI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvKiBbamF2YWNdIDEuIEVSUk9SIGluIC9Vc2Vycy9rZXZpbmJhcm5lcy9FY2xpcHNlL3J1bnRpbWUtd29ya3NwYWNlL29yZy5lY2xpcHNlLmFudC5jb3JlL3NyY19hbnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL2NvcmUvYW50L0ludGVybmFsQW50UnVubmVyLmphdmEgKGF0IGxpbmUgNjYpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbWF0Y2hGb3VuZChQYXR0ZXJuTWF0Y2hFdmVudCBldmVudCkgewotICAgICAgICBTdHJpbmcgbWF0Y2hlZFRleHQ9IGdldE1hdGNoZWRUZXh0KGV2ZW50KTsKLSAgICAgICAgaWYgKG1hdGNoZWRUZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpbnQgaW5kZXggPSBtYXRjaGVkVGV4dC5pbmRleE9mKGZnRXJyb3IpOwotICAgICAgICBTdHJpbmcgZmlsZVBhdGg7Ci0gICAgICAgIEludGVnZXIgdHlwZT0gZmdFcnJvclR5cGU7Ci0gICAgICAgIGlmIChpbmRleCA9PSAtMSkgewotICAgICAgICAgICAgaW5kZXggPSBtYXRjaGVkVGV4dC5pbmRleE9mKGZnV2FybmluZyk7Ci0gICAgICAgICAgICBmaWxlUGF0aD0gbWF0Y2hlZFRleHQuc3Vic3RyaW5nKGluZGV4ICsgMTApLnRyaW0oKTsKLSAgICAgICAgICAgIHR5cGU9IGZnV2FybmluZ1R5cGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaWxlUGF0aD0gbWF0Y2hlZFRleHQuc3Vic3RyaW5nKGluZGV4ICsgOCkudHJpbSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGxpbmVOdW1iZXJTdGFydCA9IGZpbGVQYXRoLmxhc3RJbmRleE9mKGZnU3RhcnRPZkxpbmVOdW1iZXIpOwotICAgICAgICBpZiAobGluZU51bWJlclN0YXJ0ICE9IC0xKSB7Ci0gICAgICAgIAlmaWxlUGF0aCA9IGZpbGVQYXRoLnN1YnN0cmluZygwLCBsaW5lTnVtYmVyU3RhcnQpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpbnQgZmlsZVN0YXJ0ID0gbWF0Y2hlZFRleHQuaW5kZXhPZihmaWxlUGF0aCk7Ci0gICAgICAgIGludCBldmVudE9mZnNldD0gZXZlbnQuZ2V0T2Zmc2V0KCkgKyBmaWxlU3RhcnQ7Ci0gICAgICAgIGludCBldmVudExlbmd0aCA9IGZpbGVQYXRoLmxlbmd0aCgpOwotICAgICAgICAKLSAgICAgICAgaW50IGxpbmVOdW1iZXIgPSBnZXRMaW5lTnVtYmVyKGxpbmVOdW1iZXJTdGFydCArIGV2ZW50T2Zmc2V0LCB0cnVlKTsKLSAgICAgICAgYWRkTGluayhmaWxlUGF0aCwgbGluZU51bWJlciwgZXZlbnRPZmZzZXQsIGV2ZW50TGVuZ3RoLCB0eXBlKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvY29uc29sZS9KYXZhY01hcmtlckNyZWF0b3IuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2NvbnNvbGUvSmF2YWNNYXJrZXJDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NzZhNWQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvY29uc29sZS9KYXZhY01hcmtlckNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5jb25zb2xlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VSdWxlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmludGVybmFsLnVpLnZpZXdzLmNvbnNvbGUuUHJvY2Vzc0NvbnNvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbE1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuVGV4dENvbnNvbGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhY01hcmtlckNyZWF0b3IgewotCi0JcHJpdmF0ZSBmaW5hbCBUZXh0Q29uc29sZSBmQ29uc29sZTsKLQlwcml2YXRlIElQcm9jZXNzIGZQcm9jZXNzOwotCXByaXZhdGUgc3RhdGljIExpc3QgZmdGaWxlc1RvQmVDbGVhbmVkPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBNYXAgZkZpbGVUb01hcmtlckluZm89IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGZVc2VDdXN0b21NZXNzYWdlOwotCi0JcHJpdmF0ZSBjbGFzcyBNYXJrZXJJbmZvIHsKLQkJCi0JCXB1YmxpYyBpbnQgZkxpbmVOdW1iZXI7Ci0JCXB1YmxpYyBpbnQgZk9mZnNldDsKLQkJcHVibGljIEludGVnZXIgZlR5cGU7Ci0KLQkJcHVibGljIHZvaWQgc2V0TGluZU51bWJlcihpbnQgbGluZU51bWJlcikgewotCQkJZkxpbmVOdW1iZXI9IGxpbmVOdW1iZXI7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJCWZPZmZzZXQgPSBvZmZzZXQ7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0VHlwZShJbnRlZ2VyIHR5cGUpIHsKLQkJCWZUeXBlPSB0eXBlOwotCQkJCi0JCX0KLQl9Ci0JcHVibGljIEphdmFjTWFya2VyQ3JlYXRvcihUZXh0Q29uc29sZSBjb25zb2xlLCBib29sZWFuIHVzZUN1c3RvbU1lc3NhZ2UpIHsKLQkJZkNvbnNvbGUgPSBjb25zb2xlOwotCQlmVXNlQ3VzdG9tTWVzc2FnZSA9IHVzZUN1c3RvbU1lc3NhZ2U7Ci0JCWlmIChmQ29uc29sZSBpbnN0YW5jZW9mIFByb2Nlc3NDb25zb2xlKSB7Ci0JCQlmUHJvY2Vzcz0gKChQcm9jZXNzQ29uc29sZSkgZkNvbnNvbGUpLmdldFByb2Nlc3MoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0TWFya2VyUnVsZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkgICAgSVNjaGVkdWxpbmdSdWxlIHJ1bGUgPSBudWxsOwotCSAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCSAgICAgICAgSVJlc291cmNlUnVsZUZhY3RvcnkgcnVsZUZhY3RvcnkgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKTsKLQkgICAgICAgIHJ1bGUgPSBydWxlRmFjdG9yeS5tYXJrZXJSdWxlKHJlc291cmNlKTsKLQkgICAgfQotCSAgICByZXR1cm4gcnVsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBydW4oSVNjaGVkdWxpbmdSdWxlIHJ1bGUsIElXb3Jrc3BhY2VSdW5uYWJsZSB3cikgewotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bih3ciwgcnVsZSwgMCwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQW50VUlQbHVnaW4ubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQl9CQkJCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRmlsZVRvQmVDbGVhbmVkKElGaWxlIGZpbGUpIHsKLQkJZmdGaWxlc1RvQmVDbGVhbmVkLmFkZChmaWxlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWFya2VyKElGaWxlIGZpbGUsIGludCBsaW5lTnVtYmVyLCBpbnQgb2Zmc2V0LCBJbnRlZ2VyIHR5cGUpIHsKLQkJTWFya2VySW5mbyBpbmZvPSBuZXcgTWFya2VySW5mbygpOwotCQlpbmZvLnNldExpbmVOdW1iZXIobGluZU51bWJlcik7Ci0JCWluZm8uc2V0T2Zmc2V0KG9mZnNldCk7Ci0JCWluZm8uc2V0VHlwZSh0eXBlKTsKLQkJTGlzdCBpbmZvcz0gKExpc3QpIGZGaWxlVG9NYXJrZXJJbmZvLmdldChmaWxlKTsKLQkJaWYgKGluZm9zID09IG51bGwpIHsKLQkJCWluZm9zPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmRmlsZVRvTWFya2VySW5mby5wdXQoZmlsZSwgaW5mb3MpOwotCQl9Ci0JCWluZm9zLmFkZChpbmZvKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU1hcmtlcnMoZmluYWwgSUZpbGUgZmlsZSwgZmluYWwgTGlzdCBpbmZvcykgewotCQlJV29ya3NwYWNlUnVubmFibGUgd3I9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCi0JCQkJdHJ5IHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gaW5mb3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlNYXJrZXJJbmZvIGluZm8gPSAoTWFya2VySW5mbykgaXRlci5uZXh0KCk7Ci0JCQkJCQlJTWFya2VyIG1hcmtlcj0gZmlsZS5jcmVhdGVNYXJrZXIoSUphdmFNb2RlbE1hcmtlci5KQVZBX01PREVMX1BST0JMRU1fTUFSS0VSKTsKLQkJCQkJCU1hcCBhdHRyaWJ1dGVzPSBuZXcgSGFzaE1hcCgzKTsKLQkJCQkJCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuTElORV9OVU1CRVIsIG5ldyBJbnRlZ2VyKGluZm8uZkxpbmVOdW1iZXIpKTsKLQkJCQkJCVN0cmluZyBtZXNzYWdlPSBnZXRNZXNzYWdlKGluZm8pOwotCQkJCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5NRVNTQUdFLCBtZXNzYWdlKTsKLQkJCQkJCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuU0VWRVJJVFksIGluZm8uZlR5cGUpOwotCQkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJQW50VUlQbHVnaW4ubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQkJCX0JCi0JCQl9Ci0JCX07Ci0JCXJ1bihnZXRNYXJrZXJSdWxlKGZpbGUpLCB3cik7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNZXNzYWdlKE1hcmtlckluZm8gaW5mbykgewotCQlJRG9jdW1lbnQgZG9jPSBmQ29uc29sZS5nZXREb2N1bWVudCgpOwotCQlTdHJpbmcgbWVzc2FnZT0gQ29uc29sZU1lc3NhZ2VzLkphdmFjTWFya2VyQ3JlYXRvcl8wOwotCQlpZiAoZlVzZUN1c3RvbU1lc3NhZ2UpIHsKLQkJCUZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyIGFkYXB0ZXI9IG5ldyBGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcihkb2MpOwotCQkJdHJ5IHsKLQkJCQlJUmVnaW9uIG1hdGNoPWFkYXB0ZXIuZmluZChpbmZvLmZPZmZzZXQsICJbamF2YWNdIC0tLS0tLS0tLS0iLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChtYXRjaCAhPSBudWxsKSB7Ci0JCQkJCW1hdGNoPSBhZGFwdGVyLmZpbmQobWF0Y2guZ2V0T2Zmc2V0KCksICJbamF2YWNdIiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChtYXRjaCAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgc3RhcnQ9IG1hdGNoLmdldE9mZnNldCgpICsgbWF0Y2guZ2V0TGVuZ3RoKCkgKyAxOwotCQkJCQkJSVJlZ2lvbiBsaW5lSW5mbz0gZG9jLmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkJCW1lc3NhZ2U9IGRvYy5nZXQoc3RhcnQsIGxpbmVJbmZvLmdldE9mZnNldCgpIC0gc3RhcnQgKyBsaW5lSW5mby5nZXRMZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJQW50VUlQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbWVzc2FnZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZChJUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCWlmIChwcm9jZXNzLmVxdWFscyhmUHJvY2VzcykpIHsKLQkJCWlmICghZmdGaWxlc1RvQmVDbGVhbmVkLmlzRW1wdHkoKSkgewotCQkJCUl0ZXJhdG9yIGl0cj0gZmdGaWxlc1RvQmVDbGVhbmVkLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgaXRyLm5leHQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWZpbGUuZGVsZXRlTWFya2VycyhJSmF2YU1vZGVsTWFya2VyLkpBVkFfTU9ERUxfUFJPQkxFTV9NQVJLRVIsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJQW50VUlQbHVnaW4ubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQkJCQl9CQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZGaWxlVG9NYXJrZXJJbmZvLmlzRW1wdHkoKSkgewotCQkJCS8vZ2VuZXJhdGUgbWFya2VycyBmb3IgYWxsIHRoZSB3YXJuaW5ncyBhbmQgZXJyb3JzCi0JCQkJSXRlcmF0b3IgZmlsZXM9IGZGaWxlVG9NYXJrZXJJbmZvLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGZpbGVzLmhhc05leHQoKSkgewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBmaWxlcy5uZXh0KCk7Ci0JCQkJCUxpc3QgaW5mb3M9IChMaXN0KSBmRmlsZVRvTWFya2VySW5mby5nZXQoZmlsZSk7Ci0JCQkJCWNyZWF0ZU1hcmtlcnMoZmlsZSwgaW5mb3MpOwkKLQkJCQl9CQotCQkJfQotCQkJCi0JCQlmRmlsZVRvTWFya2VySW5mby5jbGVhcigpOwotCQkJZmdGaWxlc1RvQmVDbGVhbmVkLmNsZWFyKCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvY29uc29sZS9KYXZhY1BhdHRlcm5NYXRjaGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9jb25zb2xlL0phdmFjUGF0dGVybk1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0ZWExMC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9jb25zb2xlL0phdmFjUGF0dGVybk1hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuY29uc29sZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb25zb2xlLlBhdHRlcm5NYXRjaEV2ZW50OwotCi1wdWJsaWMgY2xhc3MgSmF2YWNQYXR0ZXJuTWF0Y2hlciBleHRlbmRzIEFic3RyYWN0SmF2YWNQYXR0ZXJuTWF0Y2hlciB7Ci0KLSAgICAvKgotICAgICAqICAgICBbamF2YWNdIC9Vc2Vycy9rZXZpbmJhcm5lcy9FY2xpcHNlL3J1bnRpbWUtd29ya3NwYWNlL0Zvby9zcmMvQ2FycmlhZ2VSZXR1cm4uamF2YTo0OiAnOycgZXhwZWN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtYXRjaEZvdW5kKFBhdHRlcm5NYXRjaEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIFN0cmluZyBtYXRjaGVkVGV4dD0gZ2V0TWF0Y2hlZFRleHQoZXZlbnQpOwotICAgICAgICBpZiAobWF0Y2hlZFRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG51bUVuZD0gbWF0Y2hlZFRleHQubGFzdEluZGV4T2YoJzonKTsKLSAgICAgICAgd2hpbGUgKG51bUVuZCA+IDEgJiYgIUNoYXJhY3Rlci5pc0RpZ2l0KG1hdGNoZWRUZXh0LmNoYXJBdChudW1FbmQgLSAxKSkpIHsKLSAgICAgICAgICAgIG51bUVuZD0gbWF0Y2hlZFRleHQubGFzdEluZGV4T2YoJzonLCBudW1FbmQgLSAxKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgbnVtU3RhcnQ9IG1hdGNoZWRUZXh0Lmxhc3RJbmRleE9mKCc6JywgbnVtRW5kIC0gMSk7Ci0gICAgICAgIAotICAgICAgICBpbnQgaW5kZXggPSBtYXRjaGVkVGV4dC5pbmRleE9mKCJdIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBmaWxlUGF0aDsKLSAgICAgICAgaWYgKG51bVN0YXJ0ID09IC0xKSB7Ci0gICAgICAgIAkvL2ZpbGUgcGF0aCBmcm9tIGxpc3RmaWxlcwotICAgICAgICAJZmlsZVBhdGg9IG1hdGNoZWRUZXh0LnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgICAgICAJZmlsZVBhdGggPSBmaWxlUGF0aC50cmltKCk7Ci0gICAgICAgIAlpbnQgZmlsZVN0YXJ0ID0gbWF0Y2hlZFRleHQuaW5kZXhPZihmaWxlUGF0aCk7Ci0gICAgICAgIAlpbnQgZXZlbnRPZmZzZXQ9IGV2ZW50LmdldE9mZnNldCgpICsgZmlsZVN0YXJ0OwotICAgICAgICAgICAgaW50IGV2ZW50TGVuZ3RoID0gZmlsZVBhdGgubGVuZ3RoKCk7Ci0gICAgICAgIAlhZGRMaW5rKGZpbGVQYXRoLCAtMSwgZXZlbnRPZmZzZXQsIGV2ZW50TGVuZ3RoLCBudWxsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCWZpbGVQYXRoPSBtYXRjaGVkVGV4dC5zdWJzdHJpbmcoaW5kZXggKyAxLCBudW1TdGFydCk7Ci0gICAgICAgIAlmaWxlUGF0aCA9IGZpbGVQYXRoLnRyaW0oKTsKLQotICAgICAgICAJaW50IGZpbGVTdGFydCA9IG1hdGNoZWRUZXh0LmluZGV4T2YoZmlsZVBhdGgpOwotICAgICAgICAJaW50IGV2ZW50T2Zmc2V0PSBldmVudC5nZXRPZmZzZXQoKSArIGZpbGVTdGFydDsKLSAgICAgICAgCWludCBldmVudExlbmd0aCA9IGZpbGVQYXRoLmxlbmd0aCgpOwotCi0gICAgICAgIAlTdHJpbmcgbGluZU51bWJlclN0cmluZyA9IG1hdGNoZWRUZXh0LnN1YnN0cmluZyhudW1TdGFydCArIDEsIG51bUVuZCk7Ci0gICAgICAgIAlpbnQgbGluZU51bWJlcj0gLTE7IAotICAgICAgICAJdHJ5IHsKLSAgICAgICAgCQlsaW5lTnVtYmVyPSBJbnRlZ2VyLnBhcnNlSW50KGxpbmVOdW1iZXJTdHJpbmcpOwotICAgICAgICAJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgCQlBbnRVSVBsdWdpbi5sb2coZSk7Ci0gICAgICAgIAl9Ci0KLSAgICAgICAgCUludGVnZXIgdHlwZT0gZmdFcnJvclR5cGU7Ci0gICAgICAgIAlpZiAoLTEgIT0gbWF0Y2hlZFRleHQuaW5kZXhPZigid2FybmluZyIsIG51bUVuZCkpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAJCXR5cGU9IGZnV2FybmluZ1R5cGU7Ci0gICAgICAgIAl9Ci0gICAgICAgIAlhZGRMaW5rKGZpbGVQYXRoLCBsaW5lTnVtYmVyLCBldmVudE9mZnNldCwgZXZlbnRMZW5ndGgsIHR5cGUpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2NvbnNvbGUvSmlrZXNKYXZhY1BhdHRlcm5NYXRjaGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9jb25zb2xlL0ppa2VzSmF2YWNQYXR0ZXJuTWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjlmYmRjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2NvbnNvbGUvSmlrZXNKYXZhY1BhdHRlcm5NYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmNvbnNvbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb25zb2xlLlBhdHRlcm5NYXRjaEV2ZW50OwotCi1wdWJsaWMgY2xhc3MgSmlrZXNKYXZhY1BhdHRlcm5NYXRjaGVyIGV4dGVuZHMgQWJzdHJhY3RKYXZhY1BhdHRlcm5NYXRjaGVyIHsKLQotICAgIC8qCi0gICAgICogICAgIFtqYXZhY10gRm91bmQgMSBzZW1hbnRpYyBlcnJvciBjb21waWxpbmcgIi9Vc2Vycy9rZXZpbmJhcm5lcy9FY2xpcHNlL3J1bnRpbWUtd29ya3NwYWNlL0Zvby9zcmMvQ2FycmlhZ2VSZXR1cm4uamF2YSI6Ci0gICAgICogICAgIFtqYXZhY10gMy4gICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZXIoIlxyIik7Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgbWF0Y2hGb3VuZChQYXR0ZXJuTWF0Y2hFdmVudCBldmVudCkgewotICAgICAgICBTdHJpbmcgbWF0Y2hlZFRleHQ9IGdldE1hdGNoZWRUZXh0KGV2ZW50KTsKLSAgICAgICAgaWYgKG1hdGNoZWRUZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpbnQgc3RhcnQgPSBtYXRjaGVkVGV4dC5pbmRleE9mKCdcIicpKzE7Ci0gICAgICAgIGludCBlbmQgPSBtYXRjaGVkVGV4dC5pbmRleE9mKCdcIicsIHN0YXJ0KTsgICAgICAgIAotICAgICAgICBTdHJpbmcgZmlsZVBhdGggPSBtYXRjaGVkVGV4dC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0gICAgICAgIGludCBldmVudE9mZnNldD0gZXZlbnQuZ2V0T2Zmc2V0KCk7Ci0gICAgICAgIGludCBmaWxlU3RhcnQgPSBtYXRjaGVkVGV4dC5pbmRleE9mKGZpbGVQYXRoKSArIGV2ZW50T2Zmc2V0OwotICAgICAgICBpbnQgZmlsZUxlbmd0aCA9IGZpbGVQYXRoLmxlbmd0aCgpOwotICAgICAgICAKLSAgICAgICAgaW50IGxpbmVOdW1iZXIgPSBnZXRMaW5lTnVtYmVyKGV2ZW50T2Zmc2V0LCBmYWxzZSk7Ci0gICAgICAgIC8vVE9ETyBkZXRlcm1pbmUgaWYgZXJyb3Igb3Igd2FybmluZwotICAgICAgICBhZGRMaW5rKGZpbGVQYXRoLCBsaW5lTnVtYmVyLCBmaWxlU3RhcnQsIGZpbGVMZW5ndGgsIGZnRXJyb3JUeXBlKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvY29uc29sZS9UYXNrTGluZVRyYWNrZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2NvbnNvbGUvVGFza0xpbmVUcmFja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYzU5NjQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvY29uc29sZS9UYXNrTGluZVRyYWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuY29uc29sZTsKLSAKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubGF1bmNoQ29uZmlndXJhdGlvbnMuVGFza0xpbmtNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZUxpbmVUcmFja2VyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLQotLyoqCi0gKiBQcm9jZXNzZXMgdGFzayBoeXBlcmxpbmtzIGFzIGxpbmVzIGFyZSBhcHBlbmRlZCB0byB0aGUgY29uc29sZQotICovCi1wdWJsaWMgY2xhc3MgVGFza0xpbmVUcmFja2VyIGltcGxlbWVudHMgSUNvbnNvbGVMaW5lVHJhY2tlckV4dGVuc2lvbiB7Ci0JCi0JcHJpdmF0ZSBJQ29uc29sZSBmQ29uc29sZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBUYXNrTGluZVRyYWNrZXIuCi0JICovCi0JcHVibGljIFRhc2tMaW5lVHJhY2tlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGVMaW5lVHJhY2tlciNpbml0KG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGUpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJQ29uc29sZSBjb25zb2xlKSB7Ci0JCWZDb25zb2xlID0gY29uc29sZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGVMaW5lVHJhY2tlciNsaW5lQXBwZW5kZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGxpbmVBcHBlbmRlZChJUmVnaW9uIGxpbmUpIHsKLQkJVGFza0xpbmtNYW5hZ2VyLnByb2Nlc3NOZXdMaW5lKGZDb25zb2xlLCBsaW5lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGVMaW5lVHJhY2tlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmQ29uc29sZSA9IG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZUxpbmVUcmFja2VyRXh0ZW5zaW9uI2NvbnNvbGVDbG9zZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnNvbGVDbG9zZWQoKSB7Ci0JCVRhc2tMaW5rTWFuYWdlci5kaXNwb3NlKGZDb25zb2xlLmdldFByb2Nlc3MoKSk7Ci0JCUFic3RyYWN0SmF2YWNQYXR0ZXJuTWF0Y2hlci5jb25zb2xlQ2xvc2VkKGZDb25zb2xlLmdldFByb2Nlc3MoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZGF0YXRyYW5zZmVyL0FudEJ1aWxkZmlsZUV4cG9ydFdpemFyZC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZGF0YXRyYW5zZmVyL0FudEJ1aWxkZmlsZUV4cG9ydFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDc5YTllLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2RhdGF0cmFuc2Zlci9BbnRCdWlsZGZpbGVFeHBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZGF0YXRyYW5zZmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEV4cG9ydHMgY3VycmVudGx5IHNlbGVjdGVkIEVjbGlwc2UgSmF2YSBwcm9qZWN0IGFzIGFuIEFudCBidWlsZGZpbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRCdWlsZGZpbGVFeHBvcnRXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJRXhwb3J0V2l6YXJkCi17Ci0gICAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBmU2VsZWN0aW9uOwotICAgIHByaXZhdGUgQW50QnVpbGRmaWxlRXhwb3J0UGFnZSBmTWFpblBhZ2U7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBidWlsZGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpCi0gICAgewotICAgICAgICByZXR1cm4gZk1haW5QYWdlLmdlbmVyYXRlQnVpbGRmaWxlcygpOwotICAgIH0KLSAKLSAgICBwdWJsaWMgdm9pZCBhZGRQYWdlcygpCi0gICAgewotICAgICAgICBmTWFpblBhZ2UgPSBuZXcgQW50QnVpbGRmaWxlRXhwb3J0UGFnZSgpOwotICAgICAgICBMaXN0IHByb2plY3RzID0gZlNlbGVjdGlvbi50b0xpc3QoKTsKLSAgICAgICAgZk1haW5QYWdlLnNldFNlbGVjdGVkUHJvamVjdHMocHJvamVjdHMpOwotICAgICAgICBhZGRQYWdlKGZNYWluUGFnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICAgIHsKLSAgICAgICAgc2V0V2luZG93VGl0bGUoRGF0YVRyYW5zZmVyTWVzc2FnZXMuQW50QnVpbGRmaWxlRXhwb3J0V2l6YXJkXzApOwotICAgIAlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihBbnRVSUltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSUFudFVJQ29uc3RhbnRzLklNR19FWFBPUlRfV0laQVJEX0JBTk5FUikpOwotICAgIAlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLSAgICAgICAgZlNlbGVjdGlvbj0gc2VsZWN0aW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2RhdGF0cmFuc2Zlci9BbnROZXdKYXZhUHJvamVjdFdpemFyZC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZGF0YXRyYW5zZmVyL0FudE5ld0phdmFQcm9qZWN0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMTRhZTUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZGF0YXRyYW5zZmVyL0FudE5ld0phdmFQcm9qZWN0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kYXRhdHJhbnNmZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi1wdWJsaWMgY2xhc3MgQW50TmV3SmF2YVByb2plY3RXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQotCXByaXZhdGUgQW50TmV3SmF2YVByb2plY3RQYWdlIGZNYWluUGFnZTsKLQotCXB1YmxpYyBBbnROZXdKYXZhUHJvamVjdFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXN1cGVyLmFkZFBhZ2VzKCk7Ci0JCWZNYWluUGFnZSA9IG5ldyBBbnROZXdKYXZhUHJvamVjdFBhZ2UoKTsKLQkJYWRkUGFnZShmTWFpblBhZ2UpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uKSB7Ci0JCXNldFdpbmRvd1RpdGxlKERhdGFUcmFuc2Zlck1lc3NhZ2VzLkFudE5ld0phdmFQcm9qZWN0V2l6YXJkXzApOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihBbnRVSUltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSUFudFVJQ29uc3RhbnRzLklNR19XSVpBUkRfQkFOTkVSKSk7Ci0JCQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNwZXJmb3JtQ2FuY2VsKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJcmV0dXJuIChmTWFpblBhZ2UuY3JlYXRlUHJvamVjdCgpICE9IG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2RhdGF0cmFuc2Zlci9EYXRhVHJhbnNmZXJNZXNzYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZGF0YXRyYW5zZmVyL0RhdGFUcmFuc2Zlck1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZmQ3YjMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZGF0YXRyYW5zZmVyL0RhdGFUcmFuc2Zlck1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmRhdGF0cmFuc2ZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBEYXRhVHJhbnNmZXJNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kYXRhdHJhbnNmZXIuRGF0YVRyYW5zZmVyTWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLSAgICAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnROZXdKYXZhUHJvamVjdFBhZ2VfMjM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnROZXdKYXZhUHJvamVjdFBhZ2VfMjQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnROZXdKYXZhUHJvamVjdFdpemFyZF8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkZmlsZUV4cG9ydFdpemFyZF8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkZmlsZUV4cG9ydFBhZ2VfMDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRCdWlsZGZpbGVFeHBvcnRQYWdlXzEwOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkZmlsZUV4cG9ydFBhZ2VfMTE7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQW50QnVpbGRmaWxlRXhwb3J0UGFnZV8xMjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRCdWlsZGZpbGVFeHBvcnRQYWdlXzEzOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkZmlsZUV4cG9ydFBhZ2VfMTQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQW50QnVpbGRmaWxlRXhwb3J0UGFnZV8xNTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRCdWlsZGZpbGVFeHBvcnRQYWdlXzE2OwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkZmlsZUV4cG9ydFBhZ2VfMTc7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQW50QnVpbGRmaWxlRXhwb3J0UGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkZmlsZUV4cG9ydFBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRCdWlsZGZpbGVFeHBvcnRQYWdlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50QnVpbGRmaWxlRXhwb3J0UGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkZmlsZUV4cG9ydFBhZ2VfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnROZXdKYXZhUHJvamVjdFBhZ2VfOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnROZXdKYXZhUHJvamVjdFBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnROZXdKYXZhUHJvamVjdFBhZ2VfMTA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TmV3SmF2YVByb2plY3RQYWdlXzExOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudE5ld0phdmFQcm9qZWN0UGFnZV8xMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnROZXdKYXZhUHJvamVjdFBhZ2VfMTM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TmV3SmF2YVByb2plY3RQYWdlXzE0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudE5ld0phdmFQcm9qZWN0UGFnZV8xNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnROZXdKYXZhUHJvamVjdFBhZ2VfMTY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TmV3SmF2YVByb2plY3RQYWdlXzE3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudE5ld0phdmFQcm9qZWN0UGFnZV8xODsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnROZXdKYXZhUHJvamVjdFBhZ2VfMTk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TmV3SmF2YVByb2plY3RQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TmV3SmF2YVByb2plY3RQYWdlXzIxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudE5ld0phdmFQcm9qZWN0UGFnZV8yMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnROZXdKYXZhUHJvamVjdFBhZ2VfMjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBbnROZXdKYXZhUHJvamVjdFBhZ2VfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0Q3JlYXRvcl8wOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEphdmFjVGFibGVMYWJlbFByb3ZpZGVyXzA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU291cmNlQW5hbHl6ZXJfMDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTb3VyY2VBbmFseXplcl8xOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvdXJjZUFuYWx5emVyXzI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU291cmNlQW5hbHl6ZXJfMzsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBEYXRhVHJhbnNmZXJNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50QnVpbGRmaWxlRXhwb3J0UGFnZV8xODsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkZmlsZUV4cG9ydFBhZ2VfMTk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRCdWlsZGZpbGVFeHBvcnRQYWdlXzIwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50QnVpbGRmaWxlRXhwb3J0UGFnZV9jcmVhdGluZ19idWlsZF9maWxlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1aWxkRmlsZUNyZWF0b3JfZ2VuZXJhdGluZ19idWlsZGZpbGVfZm9yOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2RhdGF0cmFuc2Zlci9Qcm9qZWN0Q3JlYXRvci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZGF0YXRyYW5zZmVyL1Byb2plY3RDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4Yzk0Y2YuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZGF0YXRyYW5zZmVyL1Byb2plY3RDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kYXRhdHJhbnNmZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLQotcHVibGljIGNsYXNzIFByb2plY3RDcmVhdG9yIHsKLQkJCi0JcHVibGljIElKYXZhUHJvamVjdCBjcmVhdGVKYXZhUHJvamVjdEZyb21KYXZhY05vZGUoU3RyaW5nIHByb2plY3ROYW1lLCBKYXZhYyBqYXZhY1Rhc2ssIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gY3JlYXRlSmF2YVByb2plY3QocHJvamVjdE5hbWUsIG1vbml0b3IpOwotCQkJCi0JCQlGaWxlIGRlc3REaXI9IGphdmFjVGFzay5nZXREZXN0ZGlyKCk7Ci0JCQlTdHJpbmcgZGVzdERpck5hbWU9IGRlc3REaXIgPT0gbnVsbCA/IG51bGwgOiBkZXN0RGlyLmdldE5hbWUoKTsKLQkJCW9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGggc291cmNlRGlycz0gamF2YWNUYXNrLmdldFNyY2RpcigpOwotCQkJY3JlYXRlU291cmNlRGlyZWN0b3JpZXMoZGVzdERpciwgZGVzdERpck5hbWUsIHNvdXJjZURpcnMsIGphdmFQcm9qZWN0LCBtb25pdG9yKTsKLQkJCQotCQkJLy8gYWRkIHJ0LmphcgotCQkJYWRkVmFyaWFibGVFbnRyeShqYXZhUHJvamVjdCwgbmV3IFBhdGgoSmF2YVJ1bnRpbWUuSlJFTElCX1ZBUklBQkxFKSwgbmV3IFBhdGgoSmF2YVJ1bnRpbWUuSlJFU1JDX1ZBUklBQkxFKSwgbmV3IFBhdGgoSmF2YVJ1bnRpbWUuSlJFU1JDUk9PVF9WQVJJQUJMRSksIG1vbml0b3IpOwotCQkJCi0JCQlzZXRDbGFzc3BhdGgoamF2YWNUYXNrLCBqYXZhUHJvamVjdCwgbW9uaXRvcik7Ci0JCQkKLQkJCWphdmFQcm9qZWN0LmdldFByb2plY3QoKS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBtb25pdG9yKTsKLQkJCXJldHVybiBqYXZhUHJvamVjdDsKLQkJfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLQkJCUlTdGF0dXMgc3RhdHVzPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFudFVJUGx1Z2luLlBJX0FOVFVJLCBJU3RhdHVzLk9LLCBiZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGJlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldENsYXNzcGF0aChKYXZhYyBqYXZhY1Rhc2ssIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoIGNsYXNzcGF0aD0gamF2YWNUYXNrLmdldENsYXNzcGF0aCgpOwotCQkJaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nW10gY2xhc3NwYXRocz0gY2xhc3NwYXRoLmxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NwYXRocy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBjcCA9IGNsYXNzcGF0aHNbaV07Ci0JCQkJRmlsZSBjbGFzc3BhdGhFbnRyeT0gbmV3IEZpbGUoY3ApOwotCQkJCWlmIChjbGFzc3BhdGhFbnRyeS5pc0ZpbGUoKSkgewotCQkJCQlhZGRMaWJyYXJ5KGphdmFQcm9qZWN0LCBuZXcgUGF0aChjbGFzc3BhdGhFbnRyeS5nZXRBYnNvbHV0ZVBhdGgoKSksIG1vbml0b3IpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWFkZENvbnRhaW5lcihqYXZhUHJvamVjdCwgbmV3IFBhdGgoY2xhc3NwYXRoRW50cnkuZ2V0QWJzb2x1dGVQYXRoKCkpLCBtb25pdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cz0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBbnRVSVBsdWdpbi5QSV9BTlRVSSwgSVN0YXR1cy5PSywgTWVzc2FnZUZvcm1hdC5mb3JtYXQoRGF0YVRyYW5zZmVyTWVzc2FnZXMuUHJvamVjdENyZWF0b3JfMCwgbmV3IFN0cmluZ1tde2JlLmdldExvY2FsaXplZE1lc3NhZ2UoKX0pLCBudWxsKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlU291cmNlRGlyZWN0b3JpZXMoRmlsZSBkZXN0RGlyLCBTdHJpbmcgZGVzdERpck5hbWUsIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGggc291cmNlRGlycywgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nW10gc291cmNlRGlyZWN0b3JpZXM9IHNvdXJjZURpcnMubGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZURpcmVjdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgc3JjRGlyID0gc291cmNlRGlyZWN0b3JpZXNbaV07Ci0JCQlGaWxlIHNyY0RpcmVjdG9yeT0gbmV3IEZpbGUoc3JjRGlyKTsKLQkJCVN0cmluZyBzcmNEaXJlY3RvcnlOYW1lPSBzcmNEaXJlY3RvcnkuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIGRlc3REaXJQYXRoPSBkZXN0RGlyID09IG51bGwgPyBzcmNEaXIgOiBkZXN0RGlyLmdldEFic29sdXRlUGF0aCgpOwotCQkJaWYgKGRlc3REaXJOYW1lID09IG51bGwpIHsKLQkJCSAgICBkZXN0RGlyTmFtZT0gc3JjRGlyZWN0b3J5TmFtZTsKLQkJCX0KLQkJCWFkZFNvdXJjZUNvbnRhaW5lcihqYXZhUHJvamVjdCwgc3JjRGlyZWN0b3J5TmFtZSwgc3JjRGlyLCBkZXN0RGlyTmFtZSwgZGVzdERpclBhdGgsIG1vbml0b3IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgY3JlYXRlSmF2YVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdD0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSVByb2plY3QgcHJvamVjdD0gcm9vdC5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJaWYgKCFwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQlwcm9qZWN0LmNyZWF0ZShtb25pdG9yKTsKLQkJfSBlbHNlIHsKLQkJCXByb2plY3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbW9uaXRvcik7Ci0JCX0KLQkJCi0JCWlmICghcHJvamVjdC5pc09wZW4oKSkgewotCQkJcHJvamVjdC5vcGVuKG1vbml0b3IpOwotCQl9Ci0JCQotCQlpZiAoIXByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkpIHsKLQkJCWFkZE5hdHVyZVRvUHJvamVjdChwcm9qZWN0LCBKYXZhQ29yZS5OQVRVUkVfSUQsIG1vbml0b3IpOwotCQl9Ci0JCQotCQlJSmF2YVByb2plY3QganByb2plY3Q9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCi0JCWpwcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXcgSUNsYXNzcGF0aEVudHJ5WzBdLCBtb25pdG9yKTsKLQkJCi0JCXJldHVybiBqcHJvamVjdDsJCi0JfQotCQotCXByaXZhdGUgdm9pZCBhZGROYXR1cmVUb1Byb2plY3QoSVByb2plY3QgcHJvaiwgU3RyaW5nIG5hdHVyZUlkLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2ouZ2V0RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nW10gcHJldk5hdHVyZXM9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQlTdHJpbmdbXSBuZXdOYXR1cmVzPSBuZXcgU3RyaW5nW3ByZXZOYXR1cmVzLmxlbmd0aCArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHByZXZOYXR1cmVzLCAwLCBuZXdOYXR1cmVzLCAwLCBwcmV2TmF0dXJlcy5sZW5ndGgpOwotCQluZXdOYXR1cmVzW3ByZXZOYXR1cmVzLmxlbmd0aF09IG5hdHVyZUlkOwotCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3TmF0dXJlcyk7Ci0JCXByb2ouc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG1vbml0b3IpOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIGEgc291cmNlIGNvbnRhaW5lciB0byBhIElKYXZhUHJvamVjdC4KLQkgKi8JCQotCXByaXZhdGUgdm9pZCBhZGRTb3VyY2VDb250YWluZXIoSUphdmFQcm9qZWN0IGpwcm9qZWN0LCBTdHJpbmcgc3JjTmFtZSwgU3RyaW5nIHNyY1BhdGgsIFN0cmluZyBvdXRwdXROYW1lLCBTdHJpbmcgb3V0cHV0UGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHByb2plY3Q9IGpwcm9qZWN0LmdldFByb2plY3QoKTsKLQkJSUNvbnRhaW5lciBjb250YWluZXI9IG51bGw7Ci0JCWlmIChzcmNOYW1lID09IG51bGwgfHwgc3JjTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQljb250YWluZXI9IHByb2plY3Q7Ci0JCX0gZWxzZSB7Ci0JCQlJRm9sZGVyIGZvbGRlcj0gcHJvamVjdC5nZXRGb2xkZXIoc3JjTmFtZSk7Ci0JCQlpZiAoIWZvbGRlci5leGlzdHMoKSkgewotCQkJCWZvbGRlci5jcmVhdGVMaW5rKG5ldyBQYXRoKHNyY1BhdGgpLCBJUmVzb3VyY2UuQUxMT1dfTUlTU0lOR19MT0NBTCwgbW9uaXRvcik7Ci0JCQl9Ci0JCQljb250YWluZXI9IGZvbGRlcjsKLQkJfQotCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290PSBqcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KGNvbnRhaW5lcik7Ci0KLQkJSVBhdGggb3V0cHV0PSBudWxsOwotCQlpZiAob3V0cHV0TmFtZSE9IG51bGwpIHsKLQkJCUlGb2xkZXIgb3V0cHV0Rm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIob3V0cHV0TmFtZSk7Ci0JCQlpZiAoIW91dHB1dEZvbGRlci5leGlzdHMoKSkgewotCQkJICAgIG91dHB1dEZvbGRlci5jcmVhdGVMaW5rKG5ldyBQYXRoKG91dHB1dFBhdGgpLCBJUmVzb3VyY2UuQUxMT1dfTUlTU0lOR19MT0NBTCwgbW9uaXRvcik7Ci0JCQl9Ci0JCQlvdXRwdXQ9IG91dHB1dEZvbGRlci5nZXRGdWxsUGF0aCgpOwotCQl9Ci0JCQkJCi0JCUlDbGFzc3BhdGhFbnRyeSBjcGU9IEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KHJvb3QuZ2V0UGF0aCgpLCBuZXcgSVBhdGhbMF0sIG91dHB1dCk7Ci0JCQotCQlhZGRUb0NsYXNzcGF0aChqcHJvamVjdCwgY3BlLCBtb25pdG9yKTsJCQotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGFkZFRvQ2xhc3NwYXRoKElKYXZhUHJvamVjdCBqcHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5IGNwZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNsYXNzcGF0aEVudHJ5W10gb2xkRW50cmllcz0ganByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBvbGRFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAob2xkRW50cmllc1tpXS5lcXVhbHMoY3BlKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlpbnQgbkVudHJpZXM9IG9sZEVudHJpZXMubGVuZ3RoOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdFbnRyaWVzPSBuZXcgSUNsYXNzcGF0aEVudHJ5W25FbnRyaWVzICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkob2xkRW50cmllcywgMCwgbmV3RW50cmllcywgMCwgbkVudHJpZXMpOwotCQluZXdFbnRyaWVzW25FbnRyaWVzXT0gY3BlOwotCQlqcHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3RW50cmllcywgbW9uaXRvcik7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgYSB2YXJpYWJsZSBlbnRyeSB3aXRoIHNvdXJjZSBhdHRhY2htZW50IHRvIGEgSUphdmFQcm9qZWN0IGlmIHRoZSBwYXRoIGNhbiBiZSByZXNvbHZlZC4KLQkgKi8JCQkKLQlwcml2YXRlIHZvaWQgYWRkVmFyaWFibGVFbnRyeShJSmF2YVByb2plY3QganByb2plY3QsIElQYXRoIHBhdGgsIElQYXRoIHNvdXJjZUF0dGFjaFBhdGgsIElQYXRoIHNvdXJjZUF0dGFjaFJvb3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlDbGFzc3BhdGhFbnRyeSBjcGU9IEphdmFDb3JlLm5ld1ZhcmlhYmxlRW50cnkocGF0aCwgc291cmNlQXR0YWNoUGF0aCwgc291cmNlQXR0YWNoUm9vdCk7Ci0JCWFkZFRvQ2xhc3NwYXRoKGpwcm9qZWN0LCBjcGUsIG1vbml0b3IpOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIGEgbGlicmFyeSBlbnRyeSB0byBhbiBJSmF2YVByb2plY3QuCi0JICovCQkJCi0JcHJpdmF0ZSB2b2lkIGFkZExpYnJhcnkoSUphdmFQcm9qZWN0IGpwcm9qZWN0LCBJUGF0aCBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ2xhc3NwYXRoRW50cnkgY3BlPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkocGF0aCwgbnVsbCwgbnVsbCk7Ci0JCWFkZFRvQ2xhc3NwYXRoKGpwcm9qZWN0LCBjcGUsIG1vbml0b3IpOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIGEgY29udGFpbmVyIGVudHJ5IHRvIGFuIElKYXZhUHJvamVjdC4KLQkgKi8JCQkKLQlwcml2YXRlIHZvaWQgYWRkQ29udGFpbmVyKElKYXZhUHJvamVjdCBqcHJvamVjdCwgSVBhdGggcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlDbGFzc3BhdGhFbnRyeSBjcGU9IEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KHBhdGgpOwotCQlhZGRUb0NsYXNzcGF0aChqcHJvamVjdCwgY3BlLCBtb25pdG9yKTsKLQkJSVByb2plY3QgcHJvamVjdD0ganByb2plY3QuZ2V0UHJvamVjdCgpOwotCQlJRm9sZGVyIGZvbGRlcj0gcHJvamVjdC5nZXRGb2xkZXIocGF0aC5sYXN0U2VnbWVudCgpKTsKLQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCWZvbGRlci5jcmVhdGVMaW5rKHBhdGgsIElSZXNvdXJjZS5BTExPV19NSVNTSU5HX0xPQ0FMLCBtb25pdG9yKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2RlYnVnL21vZGVsL0RlYnVnTW9kZWxNZXNzYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZGVidWcvbW9kZWwvRGVidWdNb2RlbE1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NTJhMWQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZGVidWcvbW9kZWwvRGVidWdNb2RlbE1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZGVidWcubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgRGVidWdNb2RlbE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmRlYnVnLm1vZGVsLkRlYnVnTW9kZWxNZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50RGVidWdNb2RlbFByZXNlbnRhdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudERlYnVnTW9kZWxQcmVzZW50YXRpb25fMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnREZWJ1Z01vZGVsUHJlc2VudGF0aW9uXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50RGVidWdNb2RlbFByZXNlbnRhdGlvbl8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudERlYnVnTW9kZWxQcmVzZW50YXRpb25fNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnREZWJ1Z01vZGVsUHJlc2VudGF0aW9uXzU7Ci0KLSAgICAKLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRGVidWdNb2RlbE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvZGVidWcvbW9kZWwvRGVidWdNb2RlbE1lc3NhZ2VzLnByb3BlcnRpZXMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kZWJ1Zy9tb2RlbC9EZWJ1Z01vZGVsTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzczZmJjMS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9kZWJ1Zy9tb2RlbC9EZWJ1Z01vZGVsTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQW50RGVidWdNb2RlbFByZXNlbnRhdGlvbl8wPTxub3QgYXZhaWxhYmxlPgotQW50RGVidWdNb2RlbFByZXNlbnRhdGlvbl8xPVwgbGluZTogezB9Ci1BbnREZWJ1Z01vZGVsUHJlc2VudGF0aW9uXzI9KGJyZWFrcG9pbnQgYXQgbGluZSB7MH0gaW4gezF9KQotQW50RGVidWdNb2RlbFByZXNlbnRhdGlvbl8zPVwgKFN1c3BlbmRlZCB7MH0pCi1BbnREZWJ1Z01vZGVsUHJlc2VudGF0aW9uXzQ9XCAoU3VzcGVuZGVkKQotQW50RGVidWdNb2RlbFByZXNlbnRhdGlvbl81PShydW4gdG8gbGluZSB7MH0gaW4gezF9KQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQWRkVmFyaWFibGVTdHJpbmdBY3Rpb24uamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FkZFZhcmlhYmxlU3RyaW5nQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NzQzOWUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQWRkVmFyaWFibGVTdHJpbmdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnMuUnVudGltZUNsYXNzcGF0aEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuSUNsYXNzcGF0aFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklSdW50aW1lQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLQotcHVibGljIGNsYXNzIEFkZFZhcmlhYmxlU3RyaW5nQWN0aW9uIGV4dGVuZHMgUnVudGltZUNsYXNzcGF0aEFjdGlvbiB7Ci0JCi0JcHVibGljIEFkZFZhcmlhYmxlU3RyaW5nQWN0aW9uKElDbGFzc3BhdGhWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5BZGRWYXJpYWJsZVN0cmluZ0FjdGlvbl8xLCB2aWV3ZXIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9ucy5SdW50aW1lQ2xhc3NwYXRoQWN0aW9uI2dldEFjdGlvblR5cGUoKQotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0QWN0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIEFERDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCVZhcmlhYmxlSW5wdXREaWFsb2cgaW5wdXREaWFsb2cgPSBuZXcgVmFyaWFibGVJbnB1dERpYWxvZyhnZXRTaGVsbCgpKTsKLQkJaW5wdXREaWFsb2cub3BlbigpOwotCQlTdHJpbmcgdmFyaWFibGVTdHJpbmc9IGlucHV0RGlhbG9nLmdldFZhcmlhYmxlU3RyaW5nKCk7Ci0JCWlmICh2YXJpYWJsZVN0cmluZyAhPSBudWxsICYmIHZhcmlhYmxlU3RyaW5nLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkgbmV3RW50cnkgPSBKYXZhUnVudGltZS5uZXdTdHJpbmdWYXJpYWJsZUNsYXNzcGF0aEVudHJ5KHZhcmlhYmxlU3RyaW5nKTsKLQkJCWdldFZpZXdlcigpLmFkZEVudHJpZXMobmV3IElSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSB7bmV3RW50cnl9KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudENsYXNzcGF0aFRhYi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50Q2xhc3NwYXRoVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNDhlNjUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50Q2xhc3NwYXRoVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubGF1bmNoQ29uZmlndXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmxhdW5jaENvbmZpZ3VyYXRpb25zLkFudEhvbWVDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS5sYXVuY2hDb25maWd1cmF0aW9ucy5KYXZhQ2xhc3NwYXRoVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zLkFkZEV4dGVybmFsSmFyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zLkFkZEZvbGRlckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9ucy5BZGRKYXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnMuTW92ZURvd25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnMuTW92ZVVwQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zLlJlbW92ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkuYWN0aW9ucy5SZXN0b3JlRGVmYXVsdEVudHJpZXNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmFjdGlvbnMuUnVudGltZUNsYXNzcGF0aEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkuY2xhc3NwYXRoLkNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5jbGFzc3BhdGguQ2xhc3NwYXRoTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmNsYXNzcGF0aC5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLklDbGFzc3BhdGhWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIEFudCBjbGFzc3BhdGggdGFiCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRDbGFzc3BhdGhUYWIgZXh0ZW5kcyBKYXZhQ2xhc3NwYXRoVGFiIHsKLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuZGVidWcudWkubGF1bmNoQ29uZmlndXJhdGlvbnMuSmF2YUNsYXNzcGF0aFRhYiNpc1Nob3dCb290cGF0aCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaG93Qm9vdHBhdGgoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhY3Rpb25zIHRvIG1hbmlwdWxhdGUgdGhlIGNsYXNzcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aEJ1dHRvbkNvbXAgY29tcG9zaXRlIGJ1dHRvbnMgYXJlIGNvbnRhaW5lZCBpbgotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYXRoQnV0dG9ucyhDb21wb3NpdGUgcGF0aEJ1dHRvbkNvbXApIHsJCQotCQljcmVhdGVCdXR0b24ocGF0aEJ1dHRvbkNvbXAsIG5ldyBNb3ZlVXBBY3Rpb24oZkNsYXNzcGF0aFZpZXdlcikpOwotCQljcmVhdGVCdXR0b24ocGF0aEJ1dHRvbkNvbXAsIG5ldyBNb3ZlRG93bkFjdGlvbihmQ2xhc3NwYXRoVmlld2VyKSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXRoQnV0dG9uQ29tcCwgbmV3IFJlbW92ZUFjdGlvbihmQ2xhc3NwYXRoVmlld2VyKSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXRoQnV0dG9uQ29tcCwgbmV3IEFkZEphckFjdGlvbihmQ2xhc3NwYXRoVmlld2VyKSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXRoQnV0dG9uQ29tcCwgbmV3IEFkZEV4dGVybmFsSmFyQWN0aW9uKGZDbGFzc3BhdGhWaWV3ZXIsIERJQUxPR19TRVRUSU5HU19QUkVGSVgpKTsKLQkJQnV0dG9uIGJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXRoQnV0dG9uQ29tcCwgbmV3IEFkZEZvbGRlckFjdGlvbihmQ2xhc3NwYXRoVmlld2VyKSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5BbnRDbGFzc3BhdGhUYWJfMCk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXRoQnV0dG9uQ29tcCwgbmV3IEFkZFZhcmlhYmxlU3RyaW5nQWN0aW9uKGZDbGFzc3BhdGhWaWV3ZXIpKTsKLQkJUnVudGltZUNsYXNzcGF0aEFjdGlvbiBhY3Rpb249IG5ldyBSZXN0b3JlRGVmYXVsdEVudHJpZXNBY3Rpb24oZkNsYXNzcGF0aFZpZXdlciwgdGhpcyk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXRoQnV0dG9uQ29tcCwgYWN0aW9uKTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQotCQlhY3Rpb249IG5ldyBFZGl0QW50SG9tZUVudHJ5QWN0aW9uKGZDbGFzc3BhdGhWaWV3ZXIsIHRoaXMpOwotCQljcmVhdGVCdXR0b24ocGF0aEJ1dHRvbkNvbXAsIGFjdGlvbik7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWIjc2V0RGlydHkoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXJ0eShib29sZWFuIGRpcnR5KSB7Ci0JCXN1cGVyLnNldERpcnR5KGRpcnR5KTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjaW5pdGlhbGl6ZUZyb20ob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCXRyeSB7Ci0JCQlBbnRVdGlsLm1pZ3JhdGVUb05ld0NsYXNzcGF0aEZvcm1hdChjb25maWd1cmF0aW9uKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb20oY29uZmlndXJhdGlvbik7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5JRW50cmllc0NoYW5nZWRMaXN0ZW5lciNlbnRyaWVzQ2hhbmdlZChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuSUNsYXNzcGF0aFZpZXdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbnRyaWVzQ2hhbmdlZChJQ2xhc3NwYXRoVmlld2VyIHZpZXdlcikgewotCQlzdXBlci5lbnRyaWVzQ2hhbmdlZCh2aWV3ZXIpOwotCQlJTGF1bmNoQ29uZmlndXJhdGlvblRhYltdIHRhYnMgPSBnZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCkuZ2V0VGFicygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uVGFiIHRhYiA9IHRhYnNbaV07Ci0JCQlpZiAodGFiIGluc3RhbmNlb2YgQW50VGFyZ2V0c1RhYikgewotCQkJCSgoQW50VGFyZ2V0c1RhYil0YWIpLnNldERpcnR5KHRydWUpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2lzVmFsaWQob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKElMYXVuY2hDb25maWd1cmF0aW9uIGxhdW5jaENvbmZpZykgewotCQkKLQkJYm9vbGVhbiB2YWxpZD0gc3VwZXIuaXNWYWxpZChsYXVuY2hDb25maWcpOwotCQlpZiAoIXZhbGlkKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiB2YWxpZGF0ZUFudEhvbWUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlQW50SG9tZSgpIHsKLQkJQ2xhc3NwYXRoTW9kZWwgbW9kZWw9IGdldE1vZGVsKCk7Ci0JCUlDbGFzc3BhdGhFbnRyeSB1c2VyRW50cnk9IG1vZGVsLmdldFVzZXJFbnRyeSgpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzPSB1c2VyRW50cnkuZ2V0RW50cmllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gKENsYXNzcGF0aEVudHJ5KSBlbnRyaWVzW2ldOwotCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBydW50aW1lRW50cnk9IGVudHJ5LmdldERlbGVnYXRlKCk7Ci0JCQlpZiAocnVudGltZUVudHJ5IGluc3RhbmNlb2YgQW50SG9tZUNsYXNzcGF0aEVudHJ5KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJKChBbnRIb21lQ2xhc3NwYXRoRW50cnkpcnVudGltZUVudHJ5KS5yZXNvbHZlQW50SG9tZSgpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKGNlLmdldFN0YXR1cygpLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50RW52aXJvbm1lbnRUYWIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudEVudmlyb25tZW50VGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzOGI2ZjIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50RW52aXJvbm1lbnRUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5sYXVuY2hDb25maWd1cmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5FbnZpcm9ubWVudFRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLQotLyoqCi0gKiBBbiBlbnZpcm9ubWVudCB0YWIgZm9yIEFudCBsYXVuY2ggY29uZmlndXJhdGlvbnMuCi0gKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIG9ubHkgc3VwcG9ydGVkIHdoZW4gQW50IGlzCi0gKiBydW4gaW4gYSBzZXBhcmF0ZSBWTSwgc28gdGhpcyB0YWIgYWRkcyBhIHdhcm5pbmcgbWVzc2FnZQotICogYXQgdGhlIHRvcCBhbmQgZGlzYWJsZXMgdGhlIHdpZGdldHMgaWYgdGhlIGNvbmZpZyBpc24ndAotICogc2V0IHRvIHJ1biBpbiBhIHNlcGFyYXRlIFZNLgotICovCi1wdWJsaWMgY2xhc3MgQW50RW52aXJvbm1lbnRUYWIgZXh0ZW5kcyBFbnZpcm9ubWVudFRhYiB7Ci0JCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSB3cmFwcGluZ0NvbXBvc2l0ZTsKLQlwcm90ZWN0ZWQgTGFiZWwgd2FybmluZ0xhYmVsOwotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQl3cmFwcGluZ0NvbXBvc2l0ZT0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJd3JhcHBpbmdDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQl3cmFwcGluZ0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJd3JhcHBpbmdDb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJCi0JCXdhcm5pbmdMYWJlbD0gbmV3IExhYmVsKHdyYXBwaW5nQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXdhcm5pbmdMYWJlbC5zZXRUZXh0KEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5BbnRFbnZpcm9ubWVudFRhYl8wKTsKLQkJCi0JCXN1cGVyLmNyZWF0ZUNvbnRyb2wod3JhcHBpbmdDb21wb3NpdGUpOwotCQlzZXRDb250cm9sKHdyYXBwaW5nQ29tcG9zaXRlKTsgLy8gT3ZlcndyaXRlIHNldHRpbmcgaW4gc3VwZXIgbWV0aG9kCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjYWN0aXZhdGVkKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZWQoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3b3JraW5nQ29weSkgewotCQl1cGRhdGVXaWRnZXRzRW5hYmxlZCh3b3JraW5nQ29weSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVdpZGdldHNFbmFibGVkKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd29ya2luZ0NvcHkpIHsKLQkJaWYgKHdyYXBwaW5nQ29tcG9zaXRlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlib29sZWFuIGlzU2VwYXJhdGVKUkVCdWlsZD0gQW50VXRpbC5pc1NlcGFyYXRlSlJFQW50QnVpbGQod29ya2luZ0NvcHkpOwotCQkKLQkJQ29sb3IgdGFibGVDb2xvcj0gaXNTZXBhcmF0ZUpSRUJ1aWxkID8gbnVsbCA6IERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCk7Ci0JCUNvbG9yIGxhYmVsQ29sb3I9IGlzU2VwYXJhdGVKUkVCdWlsZCA/IG51bGwgOiBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfUkVEKTsKLQkJVGFibGUgdGFibGUgPSBlbnZpcm9ubWVudFRhYmxlLmdldFRhYmxlKCk7Ci0JCXRhYmxlLnNldEVuYWJsZWQoaXNTZXBhcmF0ZUpSRUJ1aWxkKTsKLQkJdGFibGUuc2V0QmFja2dyb3VuZCh0YWJsZUNvbG9yKTsKLQkJd2FybmluZ0xhYmVsLnNldEZvcmVncm91bmQobGFiZWxDb2xvcik7Ci0JCWVudkFkZEJ1dHRvbi5zZXRFbmFibGVkKGlzU2VwYXJhdGVKUkVCdWlsZCk7Ci0JCWVudlNlbGVjdEJ1dHRvbi5zZXRFbmFibGVkKGlzU2VwYXJhdGVKUkVCdWlsZCk7Ci0JCXVwZGF0ZUFwcGVuZFJlcGxhY2UoKTsKLQkJLy91cGRhdGUgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIGVkaXQgYW5kIHJlbW92ZSBidXR0b25zCi0JCWVudmlyb25tZW50VGFibGUuc2V0U2VsZWN0aW9uKGVudmlyb25tZW50VGFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NDY4MzcuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiBkYWtzaGluYW11cnRoeS5rYXJyYUBnbWFpbC5jb20gLSBidWcgMTY1MzcxCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5sYXVuY2hDb25maWd1cmF0aW9ucy5BbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFZhcmlhYmxlU3RyaW5nQWN0aW9uXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkVmFyaWFibGVTdHJpbmdBY3Rpb25fMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRWYXJpYWJsZVN0cmluZ0FjdGlvbl8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFZhcmlhYmxlU3RyaW5nQWN0aW9uXzQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRMYXVuY2hTaG9ydGN1dF9VbmFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TGF1bmNoU2hvcnRjdXRfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRMYXVuY2hTaG9ydGN1dF8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudExhdW5jaFNob3J0Y3V0XzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TGF1bmNoU2hvcnRjdXRfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRMYXVuY2hTaG9ydGN1dF9FcnJvcl83OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudExhdW5jaFNob3J0Y3V0X0J1aWxkX0ZhaWxlZF8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudExhdW5jaFNob3J0Y3V0X0V4Y2VwdGlvbl9sYXVuY2hpbmc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRQcm9wZXJ0aWVzVGFiX19Qcm9wZXJ0aWVzX182OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFByb3BlcnRpZXNUYWJfUHJvcGVydHlfZl9pbGVzX183OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFByb3BlcnRpZXNUYWJfUF9yb3BlcnRpZXNfODsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRQcm9wZXJ0aWVzVGFiX0Vycm9yX3JlYWRpbmdfY29uZmlndXJhdGlvbl85OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFByb3BlcnRpZXNUYWJfNjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEpSRVRhYl8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEpSRVRhYl8zOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkZXJUYXJnZXRzVGFiXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50QnVpbGRlclRhcmdldHNUYWJfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRCdWlsZGVyVGFyZ2V0c1RhYl8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkZXJUYXJnZXRzVGFiXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50QnVpbGRlclRhcmdldHNUYWJfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRCdWlsZGVyVGFyZ2V0c1RhYl81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkZXJUYXJnZXRzVGFiXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50QnVpbGRlclRhcmdldHNUYWJfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRCdWlsZGVyVGFyZ2V0c1RhYl84OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudEJ1aWxkZXJUYXJnZXRzVGFiXzEwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TWFpblRhYl9fU2VsZWN0X2FfYnVpbGRfZmlsZV9fMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRNYWluVGFiXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TWFpblRhYl82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudE1haW5UYWJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRNYWluVGFiXzE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRUYXJnZXRzVGFiX0NoZWNrX3RhcmdldHNfdG9fZV94ZWN1dGVfXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50VGFyZ2V0c1RhYl8wX291dF9vZl8wX3NlbGVjdGVkXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50VGFyZ2V0c1RhYl9UYXJnZXRfZXhlY3V0aW9uX29yZGVyX18zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFRhcmdldHNUYWJfX09yZGVyX19fXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50VGFyZ2V0c1RhYl9OYW1lXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50VGFyZ2V0c1RhYl9EZXNjcmlwdGlvbl82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFRhcmdldHNUYWJfXzBfX291dF9vZl9fMV9fc2VsZWN0ZWRfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRUYXJnZXRzVGFiX1Rhcl9nZXRzXzE0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFRhcmdldHNUYWJfRXJyb3JfcmVhZGluZ19jb25maWd1cmF0aW9uXzEyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFRhcmdldHNUYWJfMTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50VGFyZ2V0c1RhYl8xMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRUYXJnZXRzVGFiXzE0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFRhcmdldHNUYWJfMTU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50VGFyZ2V0c1RhYl8xNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRUYXJnZXRzVGFiXzE3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFRhcmdldHNUYWJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRUYXJnZXRzVGFiXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50Q2xhc3NwYXRoVGFiXzA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0QW50SG9tZUVudHJ5QWN0aW9uXzE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRPcmRlckRpYWxvZ19PcmRlcl9UYXJnZXRzXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0T3JkZXJEaWFsb2dfX1NwZWNpZnlfdGFyZ2V0X2V4ZWN1dGlvbl9vcmRlcl9fMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRPcmRlckRpYWxvZ19fVXBfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRPcmRlckRpYWxvZ19fRG93bl80OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50RW52aXJvbm1lbnRUYWJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXRUYXJnZXRzRGlhbG9nXzA7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQW50V29ya2luZ0RpcmVjdG9yeUJsb2NrXzA7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLnByb3BlcnRpZXMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE2MjY4MS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIGRha3NoaW5hbXVydGh5LmthcnJhQGdtYWlsLmNvbSAtIGJ1ZyAxNjUzNzEKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQWRkVmFyaWFibGVTdHJpbmdBY3Rpb25fMT1BZGQgVmFyaWEmYmxlLi4uCi1BZGRWYXJpYWJsZVN0cmluZ0FjdGlvbl8yPSZDbGFzc3BhdGggRW50cnkgVmFsdWU6Ci1BZGRWYXJpYWJsZVN0cmluZ0FjdGlvbl8zPSZWYXJpYWJsZXMuLi4KLUFkZFZhcmlhYmxlU3RyaW5nQWN0aW9uXzQ9QWRkIFZhcmlhYmxlIENsYXNzcGF0aCBFbnRyeQotCi1BbnRMYXVuY2hTaG9ydGN1dF9VbmFibGU9VW5hYmxlIHRvIGZpbmQgYW4gQW50IGZpbGUgdG8gcnVuLgotQW50TGF1bmNoU2hvcnRjdXRfMj1BbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgY3JlYXRpbmcgYSBkZWZhdWx0IEFudCBsYXVuY2ggY29uZmlndXJhdGlvbiBmb3IgezB9Ci1BbnRMYXVuY2hTaG9ydGN1dF8zPUFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSByZXRyaWV2aW5nIEFudCBsYXVuY2ggY29uZmlndXJhdGlvbnMuCi1BbnRMYXVuY2hTaG9ydGN1dF80PUFudCBDb25maWd1cmF0aW9uIFNlbGVjdGlvbgotQW50TGF1bmNoU2hvcnRjdXRfNT0mQ2hvb3NlIGFuIEFudCBjb25maWd1cmF0aW9uIHRvIHJ1bjoKLUFudExhdW5jaFNob3J0Y3V0X0Vycm9yXzc9RXJyb3IKLUFudExhdW5jaFNob3J0Y3V0X0J1aWxkX0ZhaWxlZF8yPUJ1aWxkIEZhaWxlZAotQW50TGF1bmNoU2hvcnRjdXRfRXhjZXB0aW9uX2xhdW5jaGluZz1BbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgbGF1bmNoaW5nIHswfQotCi1BbnRQcm9wZXJ0aWVzVGFiX19Qcm9wZXJ0aWVzX182PSZQcm9wZXJ0aWVzOgotQW50UHJvcGVydGllc1RhYl9Qcm9wZXJ0eV9mX2lsZXNfXzc9UCZyb3BlcnR5IGZpbGVzOgotQW50UHJvcGVydGllc1RhYl9QX3JvcGVydGllc184PVByb3BlcnRpZXMKLUFudFByb3BlcnRpZXNUYWJfRXJyb3JfcmVhZGluZ19jb25maWd1cmF0aW9uXzk9RXJyb3IgcmVhZGluZyBjb25maWd1cmF0aW9uCi1BbnRQcm9wZXJ0aWVzVGFiXzY9VXNlICZnbG9iYWwgcHJvcGVydGllcyBhcyBzcGVjaWZpZWQgaW4gdGhlIEFudCBydW50aW1lIHByZWZlcmVuY2VzCi0KLUFudEpSRVRhYl8yPVJ1biBpbiB0aGUgc2FtZSAmSlJFIGFzIHRoZSB3b3Jrc3BhY2UKLUFudEpSRVRhYl8zPVNlJnBhcmF0ZSBKUkU6Ci0KLUFudEJ1aWxkZXJUYXJnZXRzVGFiXzA9PEJ1aWxkZXIgaXMgbm90IHNldCB0byBydW4gZm9yIHRoaXMgYnVpbGQga2luZD4KLUFudEJ1aWxkZXJUYXJnZXRzVGFiXzE9QWZ0ZXIgYSAiQ2xlYW4iOgotQW50QnVpbGRlclRhcmdldHNUYWJfMj0mU2V0IFRhcmdldHMuLi4KLUFudEJ1aWxkZXJUYXJnZXRzVGFiXzM9TWFudWFsIEJ1aWxkOgotQW50QnVpbGRlclRhcmdldHNUYWJfND1TZXQgJlRhcmdldHMuLi4KLUFudEJ1aWxkZXJUYXJnZXRzVGFiXzU9QXV0byBCdWlsZDoKLUFudEJ1aWxkZXJUYXJnZXRzVGFiXzY9U2V0IFQmYXJnZXRzLi4uCi1BbnRCdWlsZGVyVGFyZ2V0c1RhYl83PUR1cmluZyBhICJDbGVhbiI6Ci1BbnRCdWlsZGVyVGFyZ2V0c1RhYl84PVNldCBUYXImZ2V0cy4uLgotQW50QnVpbGRlclRhcmdldHNUYWJfMTA9PGRlZmF1bHQgdGFyZ2V0IHNlbGVjdGVkPgotCi1BbnRNYWluVGFiX19TZWxlY3RfYV9idWlsZF9maWxlX18xPSZTZWxlY3QgYSBidWlsZGZpbGU6Ci1BbnRNYWluVGFiXzM9QmFzZSBEaXJlY3Qmb3J5OgotQW50TWFpblRhYl82PUJ1aWxkZmkmbGU6Ci1BbnRNYWluVGFiXzA9U2V0IGFuIElucHV0ICZoYW5kbGVyCi1BbnRNYWluVGFiXzE9RXJyb3IgcmVhZGluZyBjb25maWd1cmF0aW9uCi0KLUFudFRhcmdldHNUYWJfQ2hlY2tfdGFyZ2V0c190b19lX3hlY3V0ZV9fMT1DaGVjayB0YXJnZXRzIHRvIGUmeGVjdXRlOgotQW50VGFyZ2V0c1RhYl8wX291dF9vZl8wX3NlbGVjdGVkXzI9MCBvdXQgb2YgMCBzZWxlY3RlZAotQW50VGFyZ2V0c1RhYl9UYXJnZXRfZXhlY3V0aW9uX29yZGVyX18zPVRhcmdldCBleGVjdXRpb24gb3JkZXI6Ci1BbnRUYXJnZXRzVGFiX19PcmRlcl9fX180PSZPcmRlci4uLgotQW50VGFyZ2V0c1RhYl9OYW1lXzU9TmFtZQotQW50VGFyZ2V0c1RhYl9EZXNjcmlwdGlvbl82PURlc2NyaXB0aW9uCi1BbnRUYXJnZXRzVGFiX18wX19vdXRfb2ZfXzFfX3NlbGVjdGVkXzc9ezB9IG91dCBvZiB7MX0gc2VsZWN0ZWQKLUFudFRhcmdldHNUYWJfVGFyX2dldHNfMTQ9VGFyZ2V0cwotQW50VGFyZ2V0c1RhYl9FcnJvcl9yZWFkaW5nX2NvbmZpZ3VyYXRpb25fMTI9RXJyb3IgcmVhZGluZyBjb25maWd1cmF0aW9uCi1BbnRUYXJnZXRzVGFiXzEyPSZIaWRlIGludGVybmFsIHRhcmdldHMgbm90IHNlbGVjdGVkIGZvciBleGVjdXRpb24KLUFudFRhcmdldHNUYWJfMTM9ezB9IG91dCBvZiB7MX0gc2VsZWN0ZWQgKHsyfSBpbnRlcm5hbCB0YXJnZXQocykgaGlkZGVuKQotQW50VGFyZ2V0c1RhYl8xND0mU29ydCB0YXJnZXRzCi1BbnRUYXJnZXRzVGFiXzE1PUJ1aWxkZmlsZSBkb2VzIG5vdCBleGlzdAotQW50VGFyZ2V0c1RhYl8xNj1CdWlsZGZpbGUgc3BlY2lmaWVkIGlzIG5vdCBhIGZpbGUKLUFudFRhcmdldHNUYWJfMTc9VGFyZ2V0IHNlbGVjdGlvbiBpcyBub3QgcG9zc2libGUgYXMgYnVpbGRmaWxlIGxvY2F0aW9uIGNvbnRhaW5zIHZhcmlhYmxlKHMpIHRoYXQgY2Fubm90IGJlIHJlc29sdmVkIHVudGlsIHJ1bnRpbWUuCi1BbnRUYXJnZXRzVGFiXzA9QnVpbGRmaWxlIGNvbnRhaW5zIGVycm9ycy9wcm9ibGVtcy4gQ2hlY2sgc3ludGF4IGFuZCBjbGFzc3BhdGgKLUFudFRhcmdldHNUYWJfMT1ObyB0YXJnZXRzIGNvdWxkIGJlIGRldGVybWluZWQgZm9yIHRoZSBidWlsZGZpbGUKLUFudENsYXNzcGF0aFRhYl8wPUFkZCBGJm9sZGVycy4uLgotCi1FZGl0QW50SG9tZUVudHJ5QWN0aW9uXzE9QW50ICZIb21lLi4uCi0KLVRhcmdldE9yZGVyRGlhbG9nX09yZGVyX1RhcmdldHNfMT1PcmRlciBUYXJnZXRzCi1UYXJnZXRPcmRlckRpYWxvZ19fU3BlY2lmeV90YXJnZXRfZXhlY3V0aW9uX29yZGVyX18yPSZTcGVjaWZ5IHRhcmdldCBleGVjdXRpb24gb3JkZXI6Ci1UYXJnZXRPcmRlckRpYWxvZ19fVXBfMz0mVXAKLVRhcmdldE9yZGVyRGlhbG9nX19Eb3duXzQ9JkRvd24KLQotQW50RW52aXJvbm1lbnRUYWJfMD1BbiBlbnZpcm9ubWVudCBjYW4gb25seSBiZSB1c2VkIHdoZW4gcnVubmluZyBpbiBhIHNlcGFyYXRlIEpSRS5cblRoaXMgc2V0dGluZyBjYW4gYmUgY29uZmlndXJlZCBvbiB0aGUgSlJFIHRhYi4KLVNldFRhcmdldHNEaWFsb2dfMD1TZXQgVGFyZ2V0cwotCi1BbnRXb3JraW5nRGlyZWN0b3J5QmxvY2tfMD1FeGNlcHRpb24gb2NjdXJyZWQgcmVhZGluZyBjb25maWd1cmF0aW9uOiB7MH0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudExhdW5jaERlbGVnYXRlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRMYXVuY2hEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTk1MjEzLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudExhdW5jaERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEp1YW4gQS4gSGVybmFuZGV6IC0gYnVnIDg5OTI2Ci0gKiAgICAgZGFrc2hpbmFtdXJ0aHkua2FycmFAZ21haWwuY29tIC0gYnVnIDE2NTM3MQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5sYXVuY2hDb25maWd1cmF0aW9uczsKLQotCi0vKioKLSAqIDxiPlRoaXMgY2xhc3Mgc2hvdWxkIG5vIGxvbmdlciBiZSB1c2VkLjwvYj4KLSAqIDxwPgotICogT2xkIGxhdW5jaCBkZWxlZ2F0ZSBmb3IgQW50IGJ1aWxkcwotICogPC9wPgotICogQGRlcHJlY2F0ZWQgdGhpcyBjbGFzcyBoYXMgYmVlbiByZXBsYWNlZCB3aXRoIHtAbGluayBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmxhdW5jaENvbmZpZ3VyYXRpb25zLkFudExhdW5jaERlbGVnYXRlfQotICogIGFuZCBpcyBvbmx5IHByZXNlbnQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ci0gKi8KLXB1YmxpYyBjbGFzcyBBbnRMYXVuY2hEZWxlZ2F0ZSBleHRlbmRzIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcubGF1bmNoQ29uZmlndXJhdGlvbnMuQW50TGF1bmNoRGVsZWdhdGUgIHsKLQkKLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudExhdW5jaFNob3J0Y3V0V2l0aERpYWxvZy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50TGF1bmNoU2hvcnRjdXRXaXRoRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMWRmMzEuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50TGF1bmNoU2hvcnRjdXRXaXRoRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5sYXVuY2hDb25maWd1cmF0aW9uczsKLQotcHVibGljIGNsYXNzIEFudExhdW5jaFNob3J0Y3V0V2l0aERpYWxvZyBleHRlbmRzIEFudExhdW5jaFNob3J0Y3V0IHsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IEFudCBsYXVuY2ggc2hvcnRjdXQgdGhhdCB3aWxsIG9wZW4gdGhlCi0JICogbGF1bmNoIGNvbmZpZ3VyYXRpb24gZGlhbG9nLgotCSAqLwotCXB1YmxpYyBBbnRMYXVuY2hTaG9ydGN1dFdpdGhEaWFsb2coKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFNob3dEaWFsb2codHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50UHJvcGVydGllc1RhYi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50UHJvcGVydGllc1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTUwZmJlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudFByb3BlcnRpZXNUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5sYXVuY2hDb25maWd1cmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5BbnRQcm9wZXJ0aWVzQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLklBbnRCbG9ja0NvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nLklBbnRMYXVuY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBUYWIgZm9yIHNldHRpbmcgQW50IHVzZXIgcHJvcGVydGllcyBwZXIgbGF1bmNoIGNvbmZpZ3VyYXRpb24uIEFsbCBwcm9wZXJ0aWVzCi0gKiBzcGVjaWZpZWQgaGVyZSB3aWxsIGJlIHNldCBhcyB1c2VyIHByb3BlcnRpZXMgb24gdGhlIHByb2plY3QgZm9yIHRoZQotICogc3BlY2lmaWVkIEFudCBidWlsZAotICovCi1wdWJsaWMgY2xhc3MgQW50UHJvcGVydGllc1RhYiBleHRlbmRzIEFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYiBpbXBsZW1lbnRzIElBbnRCbG9ja0NvbnRhaW5lciB7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gZlVzZURlZmF1bHRCdXR0b247Ci0JcHJpdmF0ZSBBbnRQcm9wZXJ0aWVzQmxvY2sgZkFudFByb3BlcnRpZXNCbG9jaz0gbmV3IEFudFByb3BlcnRpZXNCbG9jayh0aGlzKTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZlNlcGFyYXRlSlJFPSB0cnVlOwotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgdG9wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJdG9wLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCXNldENvbnRyb2wodG9wKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChnZXRDb250cm9sKCksIElBbnRVSUhlbHBDb250ZXh0SWRzLkFOVF9QUk9QRVJUSUVTX1RBQik7Ci0KLQkJdG9wLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJdG9wLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJY3JlYXRlQ2hhbmdlUHJvcGVydGllcyh0b3ApOwotCQkKLQkJQ29tcG9zaXRlIHByb3BlcnRpZXNCbG9ja0NvbXBvc2l0ZT0gbmV3IENvbXBvc2l0ZSh0b3AsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucz0gMjsKLQkJcHJvcGVydGllc0Jsb2NrQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlwcm9wZXJ0aWVzQmxvY2tDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQotCQlmQW50UHJvcGVydGllc0Jsb2NrLmNyZWF0ZUNvbnRyb2wocHJvcGVydGllc0Jsb2NrQ29tcG9zaXRlLCBBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuQW50UHJvcGVydGllc1RhYl9fUHJvcGVydGllc19fNiwgQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkFudFByb3BlcnRpZXNUYWJfUHJvcGVydHlfZl9pbGVzX183KTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQodG9wKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNoYW5nZVByb3BlcnRpZXMoQ29tcG9zaXRlIHRvcCkgewotCQlmVXNlRGVmYXVsdEJ1dHRvbj0gY3JlYXRlQ2hlY2tCdXR0b24odG9wLCBBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuQW50UHJvcGVydGllc1RhYl82KTsKLQkJZlVzZURlZmF1bHRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdG9nZ2xlVXNlRGVmYXVsdFByb3BlcnRpZXMoKTsKLQkJCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwotCX0JCQotCQkKLQlwcml2YXRlIHZvaWQgdG9nZ2xlVXNlRGVmYXVsdFByb3BlcnRpZXMoKSB7Ci0JCWJvb2xlYW4gZW5hYmxlPSAhZlVzZURlZmF1bHRCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCWZBbnRQcm9wZXJ0aWVzQmxvY2suc2V0RW5hYmxlZChlbmFibGUpOwotICAgICAgICBpZiAoIWVuYWJsZSkgewotICAgICAgICAgICAgaW5pdGlhbGl6ZUFzR2xvYmFsKGZTZXBhcmF0ZUpSRSk7Ci0gICAgICAgIH0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNnZXRJbWFnZSgpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gQW50VUlJbWFnZXMuZ2V0SW1hZ2UoSUFudFVJQ29uc3RhbnRzLklNR19QUk9QRVJUWSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuQW50UHJvcGVydGllc1RhYl9QX3JvcGVydGllc184OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjaW5pdGlhbGl6ZUZyb20ob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0gICAgICAgIGZTZXBhcmF0ZUpSRT0gQW50VXRpbC5pc1NlcGFyYXRlSlJFQW50QnVpbGQoY29uZmlndXJhdGlvbik7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJc2V0TWVzc2FnZShudWxsKTsKLQkJTWFwIHByb3BlcnRpZXM9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwcm9wZXJ0aWVzPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJQW50TGF1bmNoQ29uc3RhbnRzLkFUVFJfQU5UX1BST1BFUlRJRVMsIChNYXApbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCUFudFVJUGx1Z2luLmxvZyhBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuQW50UHJvcGVydGllc1RhYl9FcnJvcl9yZWFkaW5nX2NvbmZpZ3VyYXRpb25fOSwgY2UpOwotCQl9Ci0JCQotCQlTdHJpbmcgcHJvcGVydHlGaWxlcz0gbnVsbDsKLQkJdHJ5IHsKLQkJCXByb3BlcnR5RmlsZXM9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElBbnRMYXVuY2hDb25zdGFudHMuQVRUUl9BTlRfUFJPUEVSVFlfRklMRVMsIChTdHJpbmcpbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCUFudFVJUGx1Z2luLmxvZyhBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuQW50UHJvcGVydGllc1RhYl9FcnJvcl9yZWFkaW5nX2NvbmZpZ3VyYXRpb25fOSwgY2UpOwotCQl9Ci0JCQotCQlpZiAocHJvcGVydGllcyA9PSBudWxsICYmIHByb3BlcnR5RmlsZXMgPT0gbnVsbCkgewotCQkgICAgaW5pdGlhbGl6ZUFzR2xvYmFsKGZTZXBhcmF0ZUpSRSk7Ci0JCX0gZWxzZSB7Ci0JCQlmVXNlRGVmYXVsdEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJZkFudFByb3BlcnRpZXNCbG9jay5wb3B1bGF0ZVByb3BlcnR5Vmlld2VyKHByb3BlcnRpZXMpOwotCQkKLQkJCVN0cmluZ1tdIGZpbGVzPSBBbnRVdGlsLnBhcnNlU3RyaW5nKHByb3BlcnR5RmlsZXMsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZBbnRQcm9wZXJ0aWVzQmxvY2suc2V0UHJvcGVydHlGaWxlc0lucHV0KGZpbGVzKTsKLQkJfQotCQkKLQkJdG9nZ2xlVXNlRGVmYXVsdFByb3BlcnRpZXMoKTsKLQl9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUFzR2xvYmFsKGJvb2xlYW4gc2VwYXJhdGVWTSkgewotICAgICAgICBBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnMgPSBBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCk7Ci0gICAgICAgIExpc3QgcHJlZlByb3BlcnRpZXM7Ci0gICAgICAgIGlmIChzZXBhcmF0ZVZNKSB7Ci0gICAgICAgICAgICBwcmVmUHJvcGVydGllcz0gcHJlZnMuZ2V0UmVtb3RlQW50UHJvcGVydGllcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJlZlByb3BlcnRpZXM9IHByZWZzLmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgfQotICAgICAgICBmQW50UHJvcGVydGllc0Jsb2NrLnNldFByb3BlcnRpZXNJbnB1dCgoUHJvcGVydHlbXSkgcHJlZlByb3BlcnRpZXMudG9BcnJheShuZXcgUHJvcGVydHlbcHJlZlByb3BlcnRpZXMuc2l6ZSgpXSkpOwotICAgICAgICBmQW50UHJvcGVydGllc0Jsb2NrLnNldFByb3BlcnR5RmlsZXNJbnB1dChBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCkuZ2V0Q3VzdG9tUHJvcGVydHlGaWxlcyhmYWxzZSkpOwotICAgICAgICBmQW50UHJvcGVydGllc0Jsb2NrLnNldFRhYmxlc0VuYWJsZWQoZmFsc2UpOwotICAgICAgICBmVXNlRGVmYXVsdEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjcGVyZm9ybUFwcGx5KG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWd1cmF0aW9uKSB7Ci0JCWlmIChmVXNlRGVmYXVsdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoSUFudExhdW5jaENvbnN0YW50cy5BVFRSX0FOVF9QUk9QRVJUSUVTLCAoTWFwKW51bGwpOwotCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoSUFudExhdW5jaENvbnN0YW50cy5BVFRSX0FOVF9QUk9QRVJUWV9GSUxFUywgKFN0cmluZyludWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQkJCQotCQlPYmplY3RbXSBpdGVtcz0gZkFudFByb3BlcnRpZXNCbG9jay5nZXRQcm9wZXJ0aWVzKCk7Ci0JCU1hcCBwcm9wZXJ0aWVzPSBudWxsOwotCQlpZiAoaXRlbXMubGVuZ3RoID4gMCkgewotCQkJcHJvcGVydGllcz0gbmV3IEhhc2hNYXAoaXRlbXMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IChQcm9wZXJ0eSlpdGVtc1tpXTsKLQkJCQlwcm9wZXJ0aWVzLnB1dChwcm9wZXJ0eS5nZXROYW1lKCksIHByb3BlcnR5LmdldFZhbHVlKGZhbHNlKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKElBbnRMYXVuY2hDb25zdGFudHMuQVRUUl9BTlRfUFJPUEVSVElFUywgcHJvcGVydGllcyk7Ci0JCQotCQlpdGVtcz0gZkFudFByb3BlcnRpZXNCbG9jay5nZXRQcm9wZXJ0eUZpbGVzKCk7Ci0JCVN0cmluZyBmaWxlcz0gbnVsbDsKLQkJaWYgKGl0ZW1zLmxlbmd0aCA+IDApIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKWl0ZW1zW2ldOwotCQkJCWJ1ZmYuYXBwZW5kKHBhdGgpOwotCQkJCWJ1ZmYuYXBwZW5kKCcsJyk7Ci0JCQl9Ci0JCQlmaWxlcz0gYnVmZi50b1N0cmluZygpOwotCQl9Ci0JCQotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShJQW50TGF1bmNoQ29uc3RhbnRzLkFUVFJfQU5UX1BST1BFUlRZX0ZJTEVTLCBmaWxlcyk7Ci0JCQotCQlmQW50UHJvcGVydGllc0Jsb2NrLnNhdmVTZXR0aW5ncygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjc2V0RGVmYXVsdHMob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlndXJhdGlvbikgewotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuSUFudEJsb2NrQ29udGFpbmVyI2NyZWF0ZVB1c2hCdXR0b24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIuc2V0TWVzc2FnZShtZXNzYWdlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuSUFudEJsb2NrQ29udGFpbmVyI2NyZWF0ZVB1c2hCdXR0b24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlci5zZXRFcnJvck1lc3NhZ2UobWVzc2FnZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLklBbnRCbG9ja0NvbnRhaW5lciNjcmVhdGVQdXNoQnV0dG9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgQnV0dG9uIGNyZWF0ZVB1c2hCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGJ1dHRvblRleHQpIHsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVB1c2hCdXR0b24ocGFyZW50LCBidXR0b25UZXh0LCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuSUFudEJsb2NrQ29udGFpbmVyI3VwZGF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQl1cGRhdGVUYXJnZXRzVGFiKCk7Ci0JCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVRhcmdldHNUYWIoKSB7Ci0JCS8vdGhlIHByb3BlcnRpZXMgaGF2ZSBjaGFuZ2VkLi4uc2V0IHRoZSB0YXJnZXRzIHRhYiB0byAKLQkJLy9uZWVkIHRvIGJlIHJlY29tcHV0ZWQKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJbXSB0YWJzPSAgZ2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpLmdldFRhYnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJTGF1bmNoQ29uZmlndXJhdGlvblRhYiB0YWIgPSB0YWJzW2ldOwotCQkJaWYgKHRhYiBpbnN0YW5jZW9mIEFudFRhcmdldHNUYWIpIHsKLQkJCQkoKEFudFRhcmdldHNUYWIpdGFiKS5zZXREaXJ0eSh0cnVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2FjdGl2YXRlZChvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkpCi0JICovCi0JcHVibGljIHZvaWQgYWN0aXZhdGVkKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd29ya2luZ0NvcHkpIHsKLSAgICAgICAgaWYgKGZTZXBhcmF0ZUpSRSAhPSBBbnRVdGlsLmlzU2VwYXJhdGVKUkVBbnRCdWlsZCh3b3JraW5nQ29weSkpIHsKLSAgICAgICAgICAgIC8vdXBkYXRlIHRoZSBwcm9wZXJ0aWVzIGlmIGNoYW5nZWQgd2hldGhlciBidWlsZCBpcyBpbiBzZXBhcmF0ZSBKUkUKLSAgICAgICAgICAgIGluaXRpYWxpemVGcm9tKHdvcmtpbmdDb3B5KTsKLSAgICAgICAgfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2RlYWN0aXZhdGVkKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlZChJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5KSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50VGFyZ2V0c1RhYi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50VGFyZ2V0c1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGQ4YmE1Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL0FudFRhcmdldHNUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgTWFydGluIEthcnBpc2VrIChtYXJ0aW4ua2FycGlzZWtAZ21haWwuY29tKSAtIGJ1ZyAyMjk0NzQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubGF1bmNoQ29uZmlndXJhdGlvbnM7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50RWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudE1vZGVsQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRQcm9qZWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50VGFyZ2V0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuSW50ZXJuYWxUYXJnZXRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy5JQW50TGF1bmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5JRXh0ZXJuYWxUb29sQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMuSVN0cmluZ1ZhcmlhYmxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcy5WYXJpYWJsZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TaGVsbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TaGVsbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuTWVzc2FnZUZvcm1hdDsKLQotLyoqCi0gKiBMYXVuY2ggY29uZmlndXJhdGlvbiB0YWIgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvIGNob29zZSB0aGUgdGFyZ2V0cwotICogZnJvbSBhbiBBbnQgYnVpbGRmaWxlIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGlzCi0gKiBsYXVuY2hlZC4KLSAqLwotcHVibGljIGNsYXNzIEFudFRhcmdldHNUYWIgZXh0ZW5kcyBBYnN0cmFjdExhdW5jaENvbmZpZ3VyYXRpb25UYWIgewotCQotCXByaXZhdGUgQW50VGFyZ2V0Tm9kZSBmRGVmYXVsdFRhcmdldCA9IG51bGw7Ci0JcHJpdmF0ZSBBbnRUYXJnZXROb2RlW10gZkFsbFRhcmdldHM9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZPcmRlcmVkVGFyZ2V0cyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIGZUYWJsZVZpZXdlciA9IG51bGw7Ci0JcHJpdmF0ZSBMYWJlbCBmU2VsZWN0aW9uQ291bnRMYWJlbCA9IG51bGw7Ci0JcHJpdmF0ZSBUZXh0IGZUYXJnZXRPcmRlclRleHQgPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIGZPcmRlckJ1dHRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBCdXR0b24gZkZpbHRlckludGVybmFsVGFyZ2V0czsKLQlwcml2YXRlIEludGVybmFsVGFyZ2V0RmlsdGVyIGZJbnRlcm5hbFRhcmdldEZpbHRlcj0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBmU29ydEJ1dHRvbjsKLQkKLQlwcml2YXRlIElMYXVuY2hDb25maWd1cmF0aW9uIGZMYXVuY2hDb25maWd1cmF0aW9uOwotCXByaXZhdGUgaW50IGZTb3J0RGlyZWN0aW9uPSAwOwotCXByaXZhdGUgYm9vbGVhbiBmSW5pdGlhbGl6aW5nPSBmYWxzZTsKLQkKLQkvKioKLQkgKiBTb3J0IGRpcmVjdGlvbiBjb25zdGFudHMuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU09SVF9OT05FPSAwOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNPUlRfTkFNRT0gMTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTT1JUX05BTUVfUkVWRVJTRT0gLTE7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU09SVF9ERVNDUklQVElPTj0gMjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTT1JUX0RFU0NSSVBUSU9OX1JFVkVSU0U9IC0yOwotCQotCS8qKgotCSAqIEEgY29tcGFyYXRvciB3aGljaCBjYW4gc29ydCB0YXJnZXRzIGJ5IG5hbWUgb3IgZGVzY3JpcHRpb24sIGluCi0JICogZm9yd2FyZCBvciByZXZlcnNlIG9yZGVyLgotCSAqLwotCXByaXZhdGUgY2xhc3MgQW50VGFyZ2V0c0NvbXBhcmF0b3IgZXh0ZW5kcyBWaWV3ZXJDb21wYXJhdG9yIHsKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvciNjb21wYXJlKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCQlpZiAoIShlMSBpbnN0YW5jZW9mIEFudFRhcmdldE5vZGUgJiYgZTIgaW5zdGFuY2VvZiBBbnRUYXJnZXROb2RlKSkgewotCQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgZTEsIGUyKTsKLQkJCX0KLQkJCWlmIChmU29ydERpcmVjdGlvbiA9PSBTT1JUX05PTkUpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCVN0cmluZyBzdHJpbmcxLCBzdHJpbmcyOwotCQkJaW50IHJlc3VsdD0gMDsKLQkJCWlmIChmU29ydERpcmVjdGlvbiA9PSBTT1JUX05BTUUgfHwgZlNvcnREaXJlY3Rpb24gPT0gU09SVF9OQU1FX1JFVkVSU0UpIHsKLQkJCQlzdHJpbmcxPSAoKEFudFRhcmdldE5vZGUpIGUxKS5nZXRMYWJlbCgpOwotCQkJCXN0cmluZzI9ICgoQW50VGFyZ2V0Tm9kZSkgZTIpLmdldExhYmVsKCk7Ci0JCQl9IGVsc2UgewotCQkJCXN0cmluZzE9ICgoQW50VGFyZ2V0Tm9kZSkgZTEpLmdldFRhcmdldCgpLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJc3RyaW5nMj0gKChBbnRUYXJnZXROb2RlKSBlMikuZ2V0VGFyZ2V0KCkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCX0KLQkJCWlmIChzdHJpbmcxICE9IG51bGwgJiYgc3RyaW5nMiAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0PSBnZXRDb21wYXJhdG9yKCkuY29tcGFyZShzdHJpbmcxLCBzdHJpbmcyKTsKLQkJCX0gZWxzZSBpZiAoc3RyaW5nMSA9PSBudWxsKSB7Ci0JCQkJcmVzdWx0PSAxOwotCQkJfSBlbHNlIGlmIChzdHJpbmcyID09IG51bGwpIHsKLQkJCQlyZXN1bHQ9IC0xOwotCQkJfQotCQkJaWYgKGZTb3J0RGlyZWN0aW9uIDwgMCkgeyAvLyByZXZlcnNlIHNvcnQKLQkJCQlpZiAocmVzdWx0ID09IDApIHsKLQkJCQkJcmVzdWx0PSAtMTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHQ9IC1yZXN1bHQ7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKLQkJCi0JCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJc2V0Q29udHJvbChjb21wKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChnZXRDb250cm9sKCksIElBbnRVSUhlbHBDb250ZXh0SWRzLkFOVF9UQVJHRVRTX1RBQik7Ci0JCUdyaWRMYXlvdXQgdG9wTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29tcC5zZXRMYXlvdXQodG9wTGF5b3V0KTsJCQotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQljb21wLnNldExheW91dERhdGEoZ2QpOwotCQljb21wLnNldEZvbnQoZm9udCk7Ci0JCQotCQljcmVhdGVUYXJnZXRzVGFibGUoY29tcCk7Ci0JCWNyZWF0ZVNlbGVjdGlvbkNvdW50KGNvbXApOwotCQkKLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZT0gbmV3IENvbXBvc2l0ZShjb21wLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0PSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldEZvbnQoZm9udCk7Ci0JCQotCQljcmVhdGVTb3J0VGFyZ2V0cyhidXR0b25Db21wb3NpdGUpOwotCQljcmVhdGVGaWx0ZXJJbnRlcm5hbFRhcmdldHMoYnV0dG9uQ29tcG9zaXRlKTsKLQkJCi0JCWNyZWF0ZVZlcnRpY2FsU3BhY2VyKGNvbXAsIDEpOwotCQljcmVhdGVUYXJnZXRPcmRlcihjb21wKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBzZWxlY3Rpb24gY291bnQgd2lkZ2V0Ci0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWxlY3Rpb25Db3VudChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZTZWxlY3Rpb25Db3VudExhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlmU2VsZWN0aW9uQ291bnRMYWJlbC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQlmU2VsZWN0aW9uQ291bnRMYWJlbC5zZXRUZXh0KEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5BbnRUYXJnZXRzVGFiXzBfb3V0X29mXzBfc2VsZWN0ZWRfMik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWZTZWxlY3Rpb25Db3VudExhYmVsLnNldExheW91dERhdGEoZ2QpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHdpZGdldHMgdGhhdCBkaXNwbGF5IHRoZSB0YXJnZXQgb3JkZXIKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhcmdldE9yZGVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJRm9udCBmb250PSBwYXJlbnQuZ2V0Rm9udCgpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkFudFRhcmdldHNUYWJfVGFyZ2V0X2V4ZWN1dGlvbl9vcmRlcl9fMyk7Ci0JCWxhYmVsLnNldEZvbnQoZm9udCk7Ci0JCQotCQlDb21wb3NpdGUgb3JkZXJDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlvcmRlckNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlvcmRlckNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJb3JkZXJDb21wb3NpdGUuc2V0Rm9udChmb250KTsKLQkJCQkKLQkJZlRhcmdldE9yZGVyVGV4dCA9IG5ldyBUZXh0KG9yZGVyQ29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZlRhcmdldE9yZGVyVGV4dC5zZXRGb250KGZvbnQpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5oZWlnaHRIaW50ID0gNDA7Ci0JCWdkLndpZHRoSGludCA9IElEaWFsb2dDb25zdGFudHMuRU5UUllfRklFTERfV0lEVEg7Ci0JCWZUYXJnZXRPcmRlclRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJZk9yZGVyQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihvcmRlckNvbXBvc2l0ZSwgQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkFudFRhcmdldHNUYWJfX09yZGVyX19fXzQsIG51bGwpOwotCQlnZCA9IChHcmlkRGF0YSlmT3JkZXJCdXR0b24uZ2V0TGF5b3V0RGF0YSgpOwotCQlnZC52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJZk9yZGVyQnV0dG9uLnNldEZvbnQoZm9udCk7Ci0JCWZPcmRlckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVPcmRlclByZXNzZWQoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdG9nZ2xlIHRvIGZpbHRlciBpbnRlcm5hbCB0YXJnZXRzIGZyb20gdGhlIHRhYmxlCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVGaWx0ZXJJbnRlcm5hbFRhcmdldHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlmRmlsdGVySW50ZXJuYWxUYXJnZXRzPSBjcmVhdGVDaGVja0J1dHRvbihwYXJlbnQsIEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5BbnRUYXJnZXRzVGFiXzEyKTsKLQkJZkZpbHRlckludGVybmFsVGFyZ2V0cy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVGaWx0ZXJUYXJnZXRzU2VsZWN0ZWQoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRvZ2dsZSB0byBzb3J0IHRhcmdldHMgaW4gdGhlIHRhYmxlCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVTb3J0VGFyZ2V0cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZTb3J0QnV0dG9uPSBjcmVhdGVDaGVja0J1dHRvbihwYXJlbnQsIEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5BbnRUYXJnZXRzVGFiXzE0KTsKLQkJZlNvcnRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlU29ydFRhcmdldHNTZWxlY3RlZCgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIGZpbHRlciB0YXJnZXRzIGJ1dHRvbiBoYXMgYmVlbiB0b2dnbGVkLiBJZiBpdCdzIGJlZW4KLQkgKiB0dXJuZWQgb24sIGZpbHRlciBvdXQgaW50ZXJuYWwgdGFyZ2V0cy4gRWxzZSwgcmVzdG9yZSBpbnRlcm5hbAotCSAqIHRhcmdldHMgdG8gdGhlIHRhYmxlLgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVGaWx0ZXJUYXJnZXRzU2VsZWN0ZWQoKSB7Ci0JCWJvb2xlYW4gZmlsdGVyPSBmRmlsdGVySW50ZXJuYWxUYXJnZXRzLmdldFNlbGVjdGlvbigpOwotCQlpZiAoZmlsdGVyKSB7Ci0JCQlmVGFibGVWaWV3ZXIuYWRkRmlsdGVyKGdldEludGVybmFsVGFyZ2V0c0ZpbHRlcigpKTsKLQkJfSBlbHNlIHsKLQkJCWZUYWJsZVZpZXdlci5yZW1vdmVGaWx0ZXIoZ2V0SW50ZXJuYWxUYXJnZXRzRmlsdGVyKCkpOwotCQl9Ci0JCQotCQkvLyBNdXN0IHJlZnJlc2ggYmVmb3JlIHVwZGF0aW5nIHNlbGVjdGlvbiBjb3VudCBiZWNhdXNlIHRoZSBzZWxlY3Rpb24KLQkJLy8gY291bnQncyAiaGlkZGVuIiByZXBvcnRpbmcgbmVlZHMgdGhlIGNvbnRlbnQgcHJvdmlkZXIgdG8gYmUgcXVlcmllZAotCQkvLyBmaXJzdCB0byBjb3VudCBob3cgbWFueSB0YXJnZXRzIGFyZSBoaWRkZW4uCi0JCXVwZGF0ZVNlbGVjdGlvbkNvdW50KCk7Ci0JCWlmICghZkluaXRpYWxpemluZykgewotCQkgICAgdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgVmlld2VyRmlsdGVyIGdldEludGVybmFsVGFyZ2V0c0ZpbHRlcigpIHsKLQkJaWYgKGZJbnRlcm5hbFRhcmdldEZpbHRlciA9PSBudWxsKSB7Ci0JCQlmSW50ZXJuYWxUYXJnZXRGaWx0ZXI9IG5ldyBJbnRlcm5hbFRhcmdldEZpbHRlcigpOwotCQl9Ci0JCXJldHVybiBmSW50ZXJuYWxUYXJnZXRGaWx0ZXI7Ci0JfQotCQotCS8qKgotCSAqIFRoZSBidXR0b24gdG8gc29ydCB0YXJnZXRzIGhhcyBiZWVuIHRvZ2dsZWQuCi0JICogU2V0IHRoZSB0YWIncyBzb3J0aW5nIGFzIGFwcHJvcHJpYXRlLgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVTb3J0VGFyZ2V0c1NlbGVjdGVkKCkgewotCQlzZXRTb3J0KGZTb3J0QnV0dG9uLmdldFNlbGVjdGlvbigpID8gU09SVF9OQU1FIDogU09SVF9OT05FKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgc29ydGluZyBvZiB0YXJnZXRzIGluIHRoaXMgdGFiLiBTZWUgdGhlIHNvcnQgY29uc3RhbnRzIGRlZmluZWQKLQkgKiBhYm92ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29sdW1uIHRoZSBjb2x1bW4gd2hpY2ggc2hvdWxkIGJlIHNvcnRlZCBvbgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRTb3J0KGludCBjb2x1bW4pIHsKLQkJZlNvcnREaXJlY3Rpb249IGNvbHVtbjsKLQkJZlRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJaWYgKCFmSW5pdGlhbGl6aW5nKSB7Ci0JCQl1cGRhdGVMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgdGFyZ2V0IG9yZGVyIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLiBQcm9tcHQgdGhlCi0JICogdXNlciB0byByZW9yZGVyIHRoZSBzZWxlY3RlZCB0YXJnZXRzLiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlT3JkZXJQcmVzc2VkKCkgewotCQlUYXJnZXRPcmRlckRpYWxvZyBkaWFsb2cgPSBuZXcgVGFyZ2V0T3JkZXJEaWFsb2coZ2V0U2hlbGwoKSwgZk9yZGVyZWRUYXJnZXRzLnRvQXJyYXkoKSk7Ci0JCWludCBvayA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChvayA9PSBXaW5kb3cuT0spIHsKLQkJCWZPcmRlcmVkVGFyZ2V0cy5jbGVhcigpOwotCQkJT2JqZWN0W10gdGFyZ2V0cyA9IGRpYWxvZy5nZXRUYXJnZXRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRhcmdldHMubGVuZ3RoOyBpKyspIHsKLQkJCQlmT3JkZXJlZFRhcmdldHMuYWRkKHRhcmdldHNbaV0pOwotCQkJCXVwZGF0ZVNlbGVjdGlvbkNvdW50KCk7Ci0JCQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRhYmxlIHdoaWNoIGRpc3BsYXlzIHRoZSBhdmFpbGFibGUgdGFyZ2V0cwotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGFyZ2V0c1RhYmxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJRm9udCBmb250PSBwYXJlbnQuZ2V0Rm9udCgpOwotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0Rm9udChmb250KTsKLQkJbGFiZWwuc2V0VGV4dChBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuQW50VGFyZ2V0c1RhYl9DaGVja190YXJnZXRzX3RvX2VfeGVjdXRlX18xKTsKLQkJCQkKLQkJZmluYWwgVGFibGUgdGFibGU9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5DSEVDSyB8IFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04gKTsKLQkJCi0JCUdyaWREYXRhIGRhdGE9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlpbnQgYXZhaWxhYmxlUm93cz0gYXZhaWxhYmxlUm93cyhwYXJlbnQpOwotCQlkYXRhLmhlaWdodEhpbnQgPSB0YWJsZS5nZXRJdGVtSGVpZ2h0KCkgKiAoYXZhaWxhYmxlUm93cyAvIDIwKTsKLQkJZGF0YS53aWR0aEhpbnQ9IDI1MDsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGFibGUuc2V0Rm9udChmb250KTsKLQkJCQkKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwkJCi0KLQkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQ9IG5ldyBUYWJsZUxheW91dCgpOwotCQlDb2x1bW5XZWlnaHREYXRhIHdlaWdodERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgzMCwgdHJ1ZSk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEod2VpZ2h0RGF0YSk7Ci0JCXdlaWdodERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg3MCwgdHJ1ZSk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEod2VpZ2h0RGF0YSk7CQkKLQkJdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotCQlmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OVUxMKTsKLQkJY29sdW1uMS5zZXRUZXh0KEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5BbnRUYXJnZXRzVGFiX05hbWVfNSk7Ci0JCQkKLQkJZmluYWwgVGFibGVDb2x1bW4gY29sdW1uMj0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTlVMTCk7Ci0JCWNvbHVtbjIuc2V0VGV4dChBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuQW50VGFyZ2V0c1RhYl9EZXNjcmlwdGlvbl82KTsKLQkJCi0KLQkJLy9UYWJsZUxheW91dCBvbmx5IHNpemVzIGNvbHVtbnMgb25jZS4gSWYgc2hvd2luZyB0aGUgdGFyZ2V0cwotCQkvL3RhYiBhcyB0aGUgaW5pdGlhbCB0YWIsIHRoZSBkaWFsb2cgaXNuJ3Qgb3BlbiB3aGVuIHRoZSBsYXlvdXQKLQkJLy9vY2N1cnMgYW5kIHRoZSBjb2x1bW4gc2l6ZSBpc24ndCBjb21wdXRlZCBjb3JyZWN0bHkuIE5lZWQgdG8KLQkJLy9yZWNvbXB1dGUgdGhlIHNpemUgb2YgdGhlIGNvbHVtbnMgb25jZSBhbGwgdGhlIHBhcmVudCBjb250cm9scyAKLQkJLy9oYXZlIGJlZW4gY3JlYXRlZC9zaXplZC4KLQkJLy9IQUNLIEJ1ZyAxMzkxOTAgCi0JCWdldFNoZWxsKCkuYWRkU2hlbGxMaXN0ZW5lcihuZXcgU2hlbGxBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgc2hlbGxBY3RpdmF0ZWQoU2hlbGxFdmVudCBlKSB7Ci0JCQkJaWYoIXRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJCQlpbnQgdGFibGVXaWR0aCA9IHRhYmxlLmdldFNpemUoKS54OwotCQkJCQlpZiAodGFibGVXaWR0aCA+IDApIHsKLQkJCQkJCWludCBjMSA9IHRhYmxlV2lkdGggLyAzOwotCQkJCQkJY29sdW1uMS5zZXRXaWR0aChjMSk7Ci0JCQkJCQljb2x1bW4yLnNldFdpZHRoKHRhYmxlV2lkdGggLSBjMSk7Ci0JCQkJCX0KLQkJCQkJZ2V0U2hlbGwoKS5yZW1vdmVTaGVsbExpc3RlbmVyKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlmVGFibGVWaWV3ZXIgPSBuZXcgQ2hlY2tib3hUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCWZUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUYXJnZXRUYWJsZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCWZUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFudE1vZGVsQ29udGVudFByb3ZpZGVyKCkpOwotCQlmVGFibGVWaWV3ZXIuc2V0Q29tcGFyYXRvcihuZXcgQW50VGFyZ2V0c0NvbXBhcmF0b3IoKSk7Ci0JCQotCQlmVGFibGVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb249IGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzcz0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLQkJCQkJT2JqZWN0IGVsZW1lbnQ9IHNzLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlib29sZWFuIGNoZWNrZWQ9ICFmVGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZChlbGVtZW50KTsKLQkJCQkJZlRhYmxlVmlld2VyLnNldENoZWNrZWQoZWxlbWVudCwgY2hlY2tlZCk7Ci0JCQkJCXVwZGF0ZU9yZGVyZWRUYXJnZXRzKGVsZW1lbnQsIGNoZWNrZWQpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlmVGFibGVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXVwZGF0ZU9yZGVyZWRUYXJnZXRzKGV2ZW50LmdldEVsZW1lbnQoKSwgZXZlbnQuZ2V0Q2hlY2tlZCgpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlUYWJsZUNvbHVtbltdIGNvbHVtbnM9IGZUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldENvbHVtbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBpbnQgaW5kZXg9IGk7Ci0JCQljb2x1bW5zW2luZGV4XS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWlmIChmU29ydEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQkJLy8gaW5kZXggMCA9PiBzb3J0X25hbWUgKDEpCi0JCQkJCQkvLyBpbmRleCAxID0+IHNvcnRfZGVzY3JpcHRpb24gKDIpCi0JCQkJCQlpbnQgY29sdW1uPSBpbmRleCArIDE7Ci0JCQkJCQlpZiAoY29sdW1uID09IGZTb3J0RGlyZWN0aW9uKSB7Ci0JCQkJCQkJY29sdW1uPSAtY29sdW1uOyAvLyBpbnZlcnQgdGhlIHNvcnQgd2hlbiB0aGUgc2FtZSBjb2x1bW4gaXMgc2VsZWN0ZWQgdHdpY2UgaW4gYSByb3cKLQkJCQkJCX0KLQkJCQkJCXNldFNvcnQoY29sdW1uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHJvd3MgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGRpc3BsYXkgdXNpbmcgdGhlCi0JICogY3VycmVudCBmb250LgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIENvbXBvc2l0ZSB3aG9zZSBGb250IHdpbGwgYmUgcXVlcmllZC4KLQkgKiBAcmV0dXJuIGludCBUaGUgcmVzdWx0IG9mIHRoZSBkaXNwbGF5IHNpemUgZGl2aWRlZCBieSB0aGUgZm9udCBzaXplLgotCSAqLwotCXByaXZhdGUgaW50IGF2YWlsYWJsZVJvd3MoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCWludCBmb250SGVpZ2h0ID0gKHBhcmVudC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKSlbMF0uZ2V0SGVpZ2h0KCk7Ci0JCWludCBkaXNwbGF5SGVpZ2h0ID0gcGFyZW50LmdldERpc3BsYXkoKS5nZXRDbGllbnRBcmVhKCkuaGVpZ2h0OwotCi0JCXJldHVybiBkaXNwbGF5SGVpZ2h0IC8gZm9udEhlaWdodDsKLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgb3JkZXJlZCB0YXJnZXRzIGxpc3QgaW4gcmVzcG9uc2UgdG8gYW4gZWxlbWVudCBiZWluZyBjaGVja2VkCi0JICogb3IgdW5jaGVja2VkLiBXaGVuIHRoZSBlbGVtZW50IGlzIGNoZWNrZWQsIGl0J3MgYWRkZWQgdG8gdGhlIGxpc3QuIFdoZW4KLQkgKiB1bmNoZWNrZWQsIGl0J3MgcmVtb3ZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCBpbiBxdWVzdGlvbgotCSAqIEBwYXJhbSBjaGVja2VkIHdoZXRoZXIgdGhlIGVsZW1lbnQgaGFzIGJlZW4gY2hlY2tlZCBvciB1bmNoZWNrZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlT3JkZXJlZFRhcmdldHMoT2JqZWN0IGVsZW1lbnQgLCBib29sZWFuIGNoZWNrZWQpIHsKLQkJaWYgKGNoZWNrZWQpIHsKLQkJCSBmT3JkZXJlZFRhcmdldHMuYWRkKGVsZW1lbnQpOwotCQl9IGVsc2UgewotCQkJZk9yZGVyZWRUYXJnZXRzLnJlbW92ZShlbGVtZW50KTsKLQkJfQkgCi0JCXVwZGF0ZVNlbGVjdGlvbkNvdW50KCk7Ci0JCXVwZGF0ZUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coKTsJCi0JfQotCQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHNlbGVjdGlvbiBjb3VudCB3aWRnZXQgdG8gZGlzcGxheSBob3cgbWFueSB0YXJnZXRzIGFyZQotCSAqIHNlbGVjdGVkIChleGFtcGxlLCAiMSBvdXQgb2YgNiBzZWxlY3RlZCIpIGFuZCBmaWx0ZXJlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlU2VsZWN0aW9uQ291bnQoKSB7Ci0JCU9iamVjdFtdIGNoZWNrZWQgPSBmVGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCVN0cmluZyBudW1TZWxlY3RlZCA9IEludGVnZXIudG9TdHJpbmcoY2hlY2tlZC5sZW5ndGgpOwotCQotCQlpbnQgYWxsPSBmQWxsVGFyZ2V0cyA9PSBudWxsID8gMCA6IGZBbGxUYXJnZXRzLmxlbmd0aDsKLQkJaW50IHZpc2libGU9IGZUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpOwotCQlTdHJpbmcgdG90YWwgPSBJbnRlZ2VyLnRvU3RyaW5nKHZpc2libGUpOwotCQlpbnQgbnVtSGlkZGVuPSBhbGwgLSB2aXNpYmxlOwotCQlpZiAobnVtSGlkZGVuID4gMCkgewotCQkJZlNlbGVjdGlvbkNvdW50TGFiZWwuc2V0VGV4dChNZXNzYWdlRm9ybWF0LmZvcm1hdChBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuQW50VGFyZ2V0c1RhYl8xMywgbmV3IFN0cmluZ1tde251bVNlbGVjdGVkLCBTdHJpbmcudmFsdWVPZihhbGwpLCBTdHJpbmcudmFsdWVPZihudW1IaWRkZW4pfSkpOwotCQl9IGVsc2UgewotCQkJZlNlbGVjdGlvbkNvdW50TGFiZWwuc2V0VGV4dChNZXNzYWdlRm9ybWF0LmZvcm1hdChBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuQW50VGFyZ2V0c1RhYl9fMF9fb3V0X29mX18xX19zZWxlY3RlZF83LCBuZXcgU3RyaW5nW117bnVtU2VsZWN0ZWQsIHRvdGFsfSkpOwotCQl9Ci0JCQotCQlmT3JkZXJCdXR0b24uc2V0RW5hYmxlZChjaGVja2VkLmxlbmd0aCA+IDEpOwotCQkKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGZPcmRlcmVkVGFyZ2V0cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoKChBbnRUYXJnZXROb2RlKWl0ZXIubmV4dCgpKS5nZXRUYXJnZXROYW1lKCkpOwotCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChidWZmZXIubGVuZ3RoKCkgPiAyKSB7Ci0JCQkvLyByZW1vdmUgdHJhaWxpbmcgY29tbWEKLQkJCWJ1ZmZlci5zZXRMZW5ndGgoYnVmZmVyLmxlbmd0aCgpIC0gMik7Ci0JCX0KLQkJZlRhcmdldE9yZGVyVGV4dC5zZXRUZXh0KGJ1ZmZlci50b1N0cmluZygpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGFyZ2V0cyBpbiB0aGUgYnVpbGRmaWxlLgotCSAqIEByZXR1cm4gYWxsIHRhcmdldHMgaW4gdGhlIGJ1aWxkZmlsZQotCSAqLwotCXByaXZhdGUgQW50VGFyZ2V0Tm9kZVtdIGdldFRhcmdldHMoKSB7Ci0JCWlmIChmQWxsVGFyZ2V0cyA9PSBudWxsIHx8IGlzRGlydHkoKSkgewotCQkJZkFsbFRhcmdldHM9IG51bGw7Ci0JCQlmRGVmYXVsdFRhcmdldD0gbnVsbDsKLQkJCXNldERpcnR5KGZhbHNlKTsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCXNldE1lc3NhZ2UobnVsbCk7Ci0JCQkKLQkJCWZpbmFsIFN0cmluZyBleHBhbmRlZExvY2F0aW9uPSB2YWxpZGF0ZUxvY2F0aW9uKCk7Ci0JCQlpZiAoZXhwYW5kZWRMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZBbGxUYXJnZXRzOwotCQkJfQotCQkJZmluYWwgQ29yZUV4Y2VwdGlvbltdIGV4Y2VwdGlvbnM9IG5ldyBDb3JlRXhjZXB0aW9uWzFdOwotCQkJdHJ5IHsKLQkJCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3BlcmF0aW9uPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJCQkvKiAobm9uLUphdmFkb2MpCi0JCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzcyNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JCQkJCSAqLwotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWZBbGxUYXJnZXRzID0gQW50VXRpbC5nZXRUYXJnZXRzKGV4cGFuZGVkTG9jYXRpb24sIGZMYXVuY2hDb25maWd1cmF0aW9uKTsKLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJCQlleGNlcHRpb25zWzBdPSBjZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0JCQkJCi0JCQkJSVJ1bm5hYmxlQ29udGV4dCBjb250ZXh0PSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJCWlmIChjb250ZXh0ID09IG51bGwpIHsKLQkJCQkgICAgY29udGV4dD0gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCQkJCX0KLQotCQkJCUlTY2hlZHVsaW5nUnVsZSBydWxlPSBudWxsOwotCQkJCWlmICghUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmlzVHJlZUxvY2tlZCgpKSB7Ci0JCQkJCS8vb25seSBzZXQgYSBzY2hlZHVsaW5nIHJ1bGUgaWYgbm90IGluIGEgcmVzb3VyY2UgY2hhbmdlIGNhbGxiYWNrCi0JCQkJCXJ1bGU9IEFudFV0aWwuZ2V0RmlsZUZvckxvY2F0aW9uKGV4cGFuZGVkTG9jYXRpb24sIG51bGwpOwotCQkJCX0KLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bkluVUkoY29udGV4dCwgb3BlcmF0aW9uLCBydWxlKTsKLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJICAgIEFudFVJUGx1Z2luLmxvZygiSW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQgcmV0cmlldmluZyB0YXJnZXRzIiwgZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCSAgICBzZXRFcnJvck1lc3NhZ2UoQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkFudFRhcmdldHNUYWJfMSk7Ci0JCQkgICAgZkFsbFRhcmdldHM9IG51bGw7Ci0JCQkgICAgcmV0dXJuIG51bGw7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkgICAgQW50VUlQbHVnaW4ubG9nKCJJbnRlcm5hbCBlcnJvciBvY2N1cnJlZCByZXRyaWV2aW5nIHRhcmdldHMiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJICAgIHNldEVycm9yTWVzc2FnZShBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuQW50VGFyZ2V0c1RhYl8xKTsKLQkJCSAgICBmQWxsVGFyZ2V0cz0gbnVsbDsKLQkJCSAgICByZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJaWYgKGV4Y2VwdGlvbnNbMF0gIT0gbnVsbCkgewotCQkJCUlTdGF0dXMgZXhjZXB0aW9uU3RhdHVzPSBleGNlcHRpb25zWzBdLmdldFN0YXR1cygpOwotCQkJCUlTdGF0dXNbXSBjaGlsZHJlbj0gZXhjZXB0aW9uU3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCQkJU3RyaW5nQnVmZmVyIG1lc3NhZ2U9IG5ldyBTdHJpbmdCdWZmZXIoZXhjZXB0aW9uc1swXS5nZXRNZXNzYWdlKCkpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJbWVzc2FnZS5hcHBlbmQoJyAnKTsKLQkJCQkJSVN0YXR1cyBjaGlsZFN0YXR1cyA9IGNoaWxkcmVuW2ldOwotCQkJCQltZXNzYWdlLmFwcGVuZChjaGlsZFN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJCX0KLQkJCQlzZXRFcnJvck1lc3NhZ2UobWVzc2FnZS50b1N0cmluZygpKTsKLQkJCQlmQWxsVGFyZ2V0cz0gbnVsbDsKLQkJCQlyZXR1cm4gZkFsbFRhcmdldHM7Ci0JCQl9Ci0JCQkKLQkJCWlmIChmQWxsVGFyZ2V0cyA9PSBudWxsKSB7Ci0JCQkgICAgLy9pZiBhbiBlcnJvciB3YXMgbm90IHRocm93biBkdXJpbmcgcGFyc2luZyB0aGVuIGhhdmluZyBubyB0YXJnZXRzIGlzIHZhbGlkIChBbnQgMS42LiopCi0JCQkgICAgcmV0dXJuIGZBbGxUYXJnZXRzOwotCQkJfQotCQkJCi0JCQlBbnRUYXJnZXROb2RlIHRhcmdldD0gZkFsbFRhcmdldHNbMF07Ci0JCQlBbnRQcm9qZWN0Tm9kZSBwcm9qZWN0Tm9kZT0gdGFyZ2V0LmdldFByb2plY3ROb2RlKCk7Ci0JCQlzZXRFcnJvck1lc3NhZ2VGcm9tTm9kZShwcm9qZWN0Tm9kZSk7Ci0JCQlmb3IgKGludCBpPTA7IGkgPCBmQWxsVGFyZ2V0cy5sZW5ndGg7IGkrKykgewotCQkJICAgIHRhcmdldD0gZkFsbFRhcmdldHNbaV07Ci0JCQkJaWYgKHRhcmdldC5pc0RlZmF1bHRUYXJnZXQoKSkgewotCQkJCQlmRGVmYXVsdFRhcmdldD0gdGFyZ2V0OwotCQkJCX0KLQkJCQlzZXRFcnJvck1lc3NhZ2VGcm9tTm9kZSh0YXJnZXQpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZkFsbFRhcmdldHM7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRFcnJvck1lc3NhZ2VGcm9tTm9kZShBbnRFbGVtZW50Tm9kZSBub2RlKSB7Ci0JCWlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG5vZGUuaXNFcnJvck5vZGUoKSB8fCBub2RlLmlzV2FybmluZ05vZGUoKSkgewotCQkJU3RyaW5nIG1lc3NhZ2U9IG5vZGUuZ2V0UHJvYmxlbU1lc3NhZ2UoKTsKLQkJICAgIGlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJICAgICAgICBzZXRFcnJvck1lc3NhZ2UobWVzc2FnZSk7Ci0JCSAgICB9IGVsc2UgewotCQkgICAgICAgIHNldEVycm9yTWVzc2FnZShBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuQW50VGFyZ2V0c1RhYl8wKTsKLQkJICAgIH0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI3NldERlZmF1bHRzKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNpbml0aWFsaXplRnJvbShvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJZkluaXRpYWxpemluZz0gdHJ1ZTsKLQkJZkxhdW5jaENvbmZpZ3VyYXRpb249IGNvbmZpZ3VyYXRpb247Ci0JCWZPcmRlcmVkVGFyZ2V0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQlzZXRNZXNzYWdlKG51bGwpOwotCQlzZXREaXJ0eSh0cnVlKTsKLQkJYm9vbGVhbiBoaWRlSW50ZXJuYWw9IGZhbHNlOwotCQl0cnkgewotCQkJaGlkZUludGVybmFsID0gZkxhdW5jaENvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElBbnRMYXVuY2hDb25zdGFudHMuQVRUUl9ISURFX0lOVEVSTkFMX1RBUkdFVFMsIGZhbHNlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBbnRVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJZkZpbHRlckludGVybmFsVGFyZ2V0cy5zZXRTZWxlY3Rpb24oaGlkZUludGVybmFsKTsKLQkJaGFuZGxlRmlsdGVyVGFyZ2V0c1NlbGVjdGVkKCk7Ci0JCWludCBzb3J0PSBTT1JUX05PTkU7Ci0JCXRyeSB7Ci0JCQlzb3J0ID0gZkxhdW5jaENvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElBbnRMYXVuY2hDb25zdGFudHMuQVRUUl9TT1JUX1RBUkdFVFMsIHNvcnQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUFudFVJUGx1Z2luLmxvZyhlKTsKLQkJfQotCQlmU29ydEJ1dHRvbi5zZXRTZWxlY3Rpb24oc29ydCAhPSBTT1JUX05PTkUpOwotCQlzZXRTb3J0KHNvcnQpOwotCQlTdHJpbmcgY29uZmlnVGFyZ2V0cz0gbnVsbDsKLQkJU3RyaW5nIG5ld0xvY2F0aW9uPSBudWxsOwotCQkKLQkJdHJ5IHsKLQkJCWNvbmZpZ1RhcmdldHM9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElBbnRMYXVuY2hDb25zdGFudHMuQVRUUl9BTlRfVEFSR0VUUywgKFN0cmluZyludWxsKTsKLQkJCW5ld0xvY2F0aW9uPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfTE9DQVRJT04sIChTdHJpbmcpbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCUFudFVJUGx1Z2luLmxvZyhBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuQW50VGFyZ2V0c1RhYl9FcnJvcl9yZWFkaW5nX2NvbmZpZ3VyYXRpb25fMTIsIGNlKTsKLQkJfQotCQkKLQkJaWYgKG5ld0xvY2F0aW9uID09IG51bGwpIHsKLQkJCWZBbGxUYXJnZXRzPSBudWxsOwotCQkJaW5pdGlhbGl6ZUZvck5vVGFyZ2V0cygpOwotCQkJcmV0dXJuOyAKLQkJfQotCQkKLQkJQW50VGFyZ2V0Tm9kZVtdIGFsbFRhcmdldE5vZGVzPSBnZXRUYXJnZXRzKCk7Ci0JCWlmIChhbGxUYXJnZXROb2RlcyA9PSBudWxsKSB7Ci0JCQlpbml0aWFsaXplRm9yTm9UYXJnZXRzKCk7Ci0JCQlyZXR1cm47IAotCQl9Ci0JCQotCQlTdHJpbmdbXSB0YXJnZXROYW1lcz0gQW50VXRpbC5wYXJzZVJ1blRhcmdldHMoY29uZmlnVGFyZ2V0cyk7Ci0JCWlmICh0YXJnZXROYW1lcy5sZW5ndGggPT0gMCkgewotCQkJZlRhYmxlVmlld2VyLnNldEFsbENoZWNrZWQoZmFsc2UpOwotCQkJc2V0RXhlY3V0ZUlucHV0KGFsbFRhcmdldE5vZGVzKTsKLQkJCWlmIChmRGVmYXVsdFRhcmdldCAhPSBudWxsKSB7Ci0JCQkJZk9yZGVyZWRUYXJnZXRzLmFkZChmRGVmYXVsdFRhcmdldCk7Ci0JCQkJZlRhYmxlVmlld2VyLnNldENoZWNrZWQoZkRlZmF1bHRUYXJnZXQsIHRydWUpOwotCQkJCXVwZGF0ZVNlbGVjdGlvbkNvdW50KCk7Ci0JCQkJdXBkYXRlTGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZygpOwotCQkJfQotCQkJZkluaXRpYWxpemluZz0gZmFsc2U7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXNldEV4ZWN1dGVJbnB1dChhbGxUYXJnZXROb2Rlcyk7Ci0JCWZUYWJsZVZpZXdlci5zZXRBbGxDaGVja2VkKGZhbHNlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YXJnZXROYW1lcy5sZW5ndGg7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmQWxsVGFyZ2V0cy5sZW5ndGg7IGorKykgewotCQkJCWlmICh0YXJnZXROYW1lc1tpXS5lcXVhbHMoZkFsbFRhcmdldHNbal0uZ2V0VGFyZ2V0TmFtZSgpKSkgewotCQkJCQlmT3JkZXJlZFRhcmdldHMuYWRkKGZBbGxUYXJnZXRzW2pdKTsKLQkJCQkJZlRhYmxlVmlld2VyLnNldENoZWNrZWQoZkFsbFRhcmdldHNbal0sIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQl1cGRhdGVTZWxlY3Rpb25Db3VudCgpOwotCQlmSW5pdGlhbGl6aW5nPSBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVGb3JOb1RhcmdldHMoKSB7Ci0JCXNldEV4ZWN1dGVJbnB1dChuZXcgQW50VGFyZ2V0Tm9kZVswXSk7Ci0JCWZUYWJsZVZpZXdlci5zZXRJbnB1dChuZXcgQW50VGFyZ2V0Tm9kZVswXSk7Ci0JCWZJbml0aWFsaXppbmc9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGV4ZWN1dGUgdGFibGUncyBpbnB1dCB0byB0aGUgZ2l2ZW4gaW5wdXQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEV4ZWN1dGVJbnB1dChPYmplY3QgaW5wdXQpIHsKLQkJZlRhYmxlVmlld2VyLnNldElucHV0KGlucHV0KTsKLQkJdXBkYXRlU2VsZWN0aW9uQ291bnQoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNwZXJmb3JtQXBwbHkob3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5KQotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseShJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24pIHsKLQkJLy8JYXR0cmlidXRlIGFkZGVkIGluIDMuMCwgc28gbnVsbCBtdXN0IGJlIHVzZWQgaW5zdGVhZCBvZiBmYWxzZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKLQkJaWYgKGZGaWx0ZXJJbnRlcm5hbFRhcmdldHMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKElBbnRMYXVuY2hDb25zdGFudHMuQVRUUl9ISURFX0lOVEVSTkFMX1RBUkdFVFMsIHRydWUpOwotCQl9IGVsc2UgewotCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoSUFudExhdW5jaENvbnN0YW50cy5BVFRSX0hJREVfSU5URVJOQUxfVEFSR0VUUywgKFN0cmluZyludWxsKTsKLQkJfQotCQkvL2F0dHJpYnV0ZSBhZGRlZCBpbiAzLjAsIHNvIG51bGwgbXVzdCBiZSB1c2VkIGluc3RlYWQgb2YgMCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKLQkJaWYgKGZTb3J0RGlyZWN0aW9uICE9IFNPUlRfTk9ORSkgewotCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoSUFudExhdW5jaENvbnN0YW50cy5BVFRSX1NPUlRfVEFSR0VUUywgZlNvcnREaXJlY3Rpb24pOwotCQl9IGVsc2UgewotCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoSUFudExhdW5jaENvbnN0YW50cy5BVFRSX1NPUlRfVEFSR0VUUywgKFN0cmluZyludWxsKTsKLQkJfQotCQkKLQkJaWYgKGZPcmRlcmVkVGFyZ2V0cy5zaXplKCkgPT0gMSkgewotCQkJQW50VGFyZ2V0Tm9kZSBpdGVtID0gKEFudFRhcmdldE5vZGUpZk9yZGVyZWRUYXJnZXRzLmdldCgwKTsKLQkJCWlmIChpdGVtLmlzRGVmYXVsdFRhcmdldCgpKSB7Ci0JCQkJY29uZmlndXJhdGlvbi5zZXRBdHRyaWJ1dGUoSUFudExhdW5jaENvbnN0YW50cy5BVFRSX0FOVF9UQVJHRVRTLCAoU3RyaW5nKW51bGwpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfSBlbHNlIGlmIChmT3JkZXJlZFRhcmdldHMuc2l6ZSgpID09IDApIHsKLQkJCWNvbmZpZ3VyYXRpb24uc2V0QXR0cmlidXRlKElBbnRMYXVuY2hDb25zdGFudHMuQVRUUl9BTlRfVEFSR0VUUywgKFN0cmluZyludWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJU3RyaW5nQnVmZmVyIGJ1ZmY9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGZPcmRlcmVkVGFyZ2V0cy5pdGVyYXRvcigpOwotCQlTdHJpbmcgdGFyZ2V0cyA9IG51bGw7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJQW50VGFyZ2V0Tm9kZSBpdGVtID0gKEFudFRhcmdldE5vZGUpaXRlci5uZXh0KCk7Ci0JCQlidWZmLmFwcGVuZChpdGVtLmdldFRhcmdldE5hbWUoKSk7Ci0JCQlidWZmLmFwcGVuZCgnLCcpOwotCQl9Ci0JCWlmIChidWZmLmxlbmd0aCgpID4gMCkgewotCQkJdGFyZ2V0cz0gYnVmZi50b1N0cmluZygpOwotCQl9ICAKLQotCQljb25maWd1cmF0aW9uLnNldEF0dHJpYnV0ZShJQW50TGF1bmNoQ29uc3RhbnRzLkFUVFJfQU5UX1RBUkdFVFMsIHRhcmdldHMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5BbnRUYXJnZXRzVGFiX1Rhcl9nZXRzXzE0OwotCX0KLQkJCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjZ2V0SW1hZ2UoKQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEFudFVJSW1hZ2VzLmdldEltYWdlKElBbnRVSUNvbnN0YW50cy5JTUdfVEFCX0FOVF9UQVJHRVRTKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNpc1ZhbGlkKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZChJTGF1bmNoQ29uZmlndXJhdGlvbiBsYXVuY2hDb25maWcpIHsKLQkJaWYgKGZBbGxUYXJnZXRzID09IG51bGwgfHwgaXNEaXJ0eSgpKSB7Ci0JCQlpZiAoZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCAmJiAhaXNEaXJ0eSgpKSB7Ci0JCQkJLy9lcnJvciBpbiBwYXJzaW5nOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gCi0JCQkvL3RhcmdldHMgbm90IHVwIHRvIGRhdGUgYW5kIG5vIGVycm9yIG1lc3NhZ2UuLi53ZSBoYXZlIG5vdCBwYXJzZWQgcmVjZW50bHkKLQkJCWluaXRpYWxpemVGcm9tKGxhdW5jaENvbmZpZyk7Ci0JCQlpZiAoZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCS8vZXJyb3IgaW4gcGFyc2luZzsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJCi0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJcmV0dXJuIHN1cGVyLmlzVmFsaWQobGF1bmNoQ29uZmlnKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuQWJzdHJhY3RMYXVuY2hDb25maWd1cmF0aW9uVGFiI3NldERpcnR5KGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGlydHkoYm9vbGVhbiBkaXJ0eSkgewotCQkvL3Byb3ZpZGUgcGFja2FnZSB2aXNpYmlsaXR5Ci0JCXN1cGVyLnNldERpcnR5KGRpcnR5KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuSUxhdW5jaENvbmZpZ3VyYXRpb25UYWIjYWN0aXZhdGVkKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZWQoSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3b3JraW5nQ29weSkgewotCQlpZiAoaXNEaXJ0eSgpKSB7Ci0JCQlzdXBlci5hY3RpdmF0ZWQod29ya2luZ0NvcHkpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uVGFiI2RlYWN0aXZhdGVkKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlZChJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5KSB7Ci0JCWlmIChmT3JkZXJlZFRhcmdldHMuc2l6ZSgpID09IDApIHsKLQkJCS8vc2V0IHRoZSBkaXJ0eSBmbGFnIHNvIHRoYXQgdGhlIHN0YXRlIHdpbGwgYmUgcmVpbml0aWFsaXplZCBvbiBhY3RpdmF0aW9uCi0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyB2YWxpZGF0ZUxvY2F0aW9uKCkgewotCQlTdHJpbmcgZXhwYW5kZWRMb2NhdGlvbj0gbnVsbDsKLQkJU3RyaW5nIGxvY2F0aW9uPSBudWxsOwotCQlJU3RyaW5nVmFyaWFibGVNYW5hZ2VyIG1hbmFnZXIgPSBWYXJpYWJsZXNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZ1ZhcmlhYmxlTWFuYWdlcigpOwotCQl0cnkgewotCQkJbG9jYXRpb249IGZMYXVuY2hDb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfTE9DQVRJT04sIChTdHJpbmcpbnVsbCk7Ci0JCQlpZiAobG9jYXRpb24gPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlleHBhbmRlZExvY2F0aW9uPSBtYW5hZ2VyLnBlcmZvcm1TdHJpbmdTdWJzdGl0dXRpb24obG9jYXRpb24pOwotCQkJaWYgKGV4cGFuZGVkTG9jYXRpb24gPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZXhwYW5kZWRMb2NhdGlvbik7Ci0JCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkFudFRhcmdldHNUYWJfMTUpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJaWYgKCFmaWxlLmlzRmlsZSgpKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5BbnRUYXJnZXRzVGFiXzE2KTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGV4cGFuZGVkTG9jYXRpb247Ci0JCQkKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQltYW5hZ2VyLnZhbGlkYXRlU3RyaW5nVmFyaWFibGVzKGxvY2F0aW9uKTsKLQkJCQkJc2V0TWVzc2FnZShBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuQW50VGFyZ2V0c1RhYl8xNyk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTIpIHsvL2ludmFsaWQgdmFyaWFibGUKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKGUyLmdldFN0YXR1cygpLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJc2V0RXJyb3JNZXNzYWdlKGUxLmdldFN0YXR1cygpLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RhcmdldFNlbGVjdGVkKCkgewotCQlyZXR1cm4gIWZPcmRlcmVkVGFyZ2V0cy5pc0VtcHR5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvQW50V29ya2luZ0RpcmVjdG9yeUJsb2NrLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRXb3JraW5nRGlyZWN0b3J5QmxvY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ3M2I5MS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9BbnRXb3JraW5nRGlyZWN0b3J5QmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBSZW15IENoaSBKaWFuIFN1ZW4gPHJlbXkuc3VlbkBnbWFpbC5jb20+IC0gQnVnIDIxNDY5NiBFeHBvc2UgV29ya2luZ0RpcmVjdG9yeUJsb2NrIGFzIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5sYXVuY2hDb25maWd1cmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5KYXZhV29ya2luZ0RpcmVjdG9yeUJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwubGF1bmNoQ29uZmlndXJhdGlvbnMuRXh0ZXJuYWxUb29sc1V0aWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLQotcHVibGljIGNsYXNzIEFudFdvcmtpbmdEaXJlY3RvcnlCbG9jayBleHRlbmRzIEphdmFXb3JraW5nRGlyZWN0b3J5QmxvY2sgewotCQotCXByaXZhdGUgU3RyaW5nIGZEZWZhdWx0V29ya2luZ0RpclBhdGg7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHdvcmtpbmcgZGlyZWN0b3J5IHBhdGgKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHdvcmtpbmcgZGlyZWN0b3J5IHBhdGgKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRXb3JraW5nRGlyUGF0aCgpIHsKLQkJcmV0dXJuIGZEZWZhdWx0V29ya2luZ0RpclBhdGg7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLldvcmtpbmdEaXJlY3RvcnlCbG9jayNzZXREZWZhdWx0V29ya2luZ0RpcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFdvcmtpbmdEaXIoKSB7Ci0JCWlmIChmRGVmYXVsdFdvcmtpbmdEaXJQYXRoID09IG51bGwpIHsKLQkJCXN1cGVyLnNldERlZmF1bHRXb3JraW5nRGlyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0RGVmYXVsdFdvcmtpbmdEaXJlY3RvcnlUZXh0KGZEZWZhdWx0V29ya2luZ0RpclBhdGgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JTGF1bmNoQ29uZmlndXJhdGlvblRhYiNpbml0aWFsaXplRnJvbShvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJc2V0TGF1bmNoQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKTsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJZkRlZmF1bHRXb3JraW5nRGlyUGF0aD0gRXh0ZXJuYWxUb29sc1V0aWwuZ2V0TG9jYXRpb24oY29uZmlndXJhdGlvbikucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvT1NTdHJpbmcoKTsKLQkJCX0KLQkJCWNhdGNoKENvcmVFeGNlcHRpb24gY2Upe30KLQkJCVN0cmluZyB3ZCA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1dPUktJTkdfRElSRUNUT1JZLCAoU3RyaW5nKW51bGwpOwotCQkJc2V0RGVmYXVsdFdvcmtpbmdEaXIoKTsKLQkJCWlmICh3ZCAhPSBudWxsIHx8ICFpc1NhbWVBc0RlZmF1bHQod2QpKSB7Ci0JCQkJc2V0T3RoZXJXb3JraW5nRGlyZWN0b3J5VGV4dCh3ZCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5BbnRXb3JraW5nRGlyZWN0b3J5QmxvY2tfMCwgbmV3IFN0cmluZ1tdIHtlLmdldFN0YXR1cygpLmdldE1lc3NhZ2UoKX0pKTsKLQkJCUFudFVJUGx1Z2luLmxvZyhlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNTYW1lQXNEZWZhdWx0KFN0cmluZyB3b3JraW5nRGlyKSB7Ci0JCXJldHVybiB3b3JraW5nRGlyID09IG51bGwgfHwgKHdvcmtpbmdEaXIuZXF1YWxzKGZEZWZhdWx0V29ya2luZ0RpclBhdGgpIHx8IHdvcmtpbmdEaXIuZXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSkpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvRWRpdEFudEhvbWVFbnRyeUFjdGlvbi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvRWRpdEFudEhvbWVFbnRyeUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjg2NzNkLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL0VkaXRBbnRIb21lRW50cnlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmxhdW5jaGluZy5sYXVuY2hDb25maWd1cmF0aW9ucy5BbnRIb21lQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLkFudFByZWZlcmVuY2VzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5hY3Rpb25zLlJ1bnRpbWVDbGFzc3BhdGhBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmNsYXNzcGF0aC5DbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuSUNsYXNzcGF0aFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklSdW50aW1lQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5MjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLQotLyoqCi0gKiBFZGl0cyB0aGUgQW50IEhvbWUgY2xhc3NwYXRoIGVudHJ5LgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0QW50SG9tZUVudHJ5QWN0aW9uIGV4dGVuZHMgUnVudGltZUNsYXNzcGF0aEFjdGlvbiB7Ci0JCi0JcHJpdmF0ZSBBbnRDbGFzc3BhdGhUYWIgZlRhYjsKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGFuIGFjdGlvbiB0byBlZGl0IHRoZSBBbnQgSG9tZSBzZXR0aW5nIGZvciBhIGxhdW5jaCBjb25maWcuCi0JICogCi0JICogQHBhcmFtIHZpZXdlciBjbGFzc3BhdGggdmlld2VyCi0JICovCi0JcHVibGljIEVkaXRBbnRIb21lRW50cnlBY3Rpb24oSUNsYXNzcGF0aFZpZXdlciB2aWV3ZXIsIEFudENsYXNzcGF0aFRhYiB0YWIpIHsKLQkJc3VwZXIoQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkVkaXRBbnRIb21lRW50cnlBY3Rpb25fMSwgdmlld2VyKTsKLQkJZlRhYiA9IHRhYjsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBkaWFsb2dTZXR0aW5ncyA9IEFudFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlTdHJpbmcgbGFzdFVzZWRQYXRoPSBkaWFsb2dTZXR0aW5ncy5nZXQoSUFudFVJQ29uc3RhbnRzLkRJQUxPR1NUT1JFX0xBU1RBTlRIT01FKTsKLQkJaWYgKGxhc3RVc2VkUGF0aCA9PSBudWxsKSB7Ci0JCQlsYXN0VXNlZFBhdGg9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCX0KLQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50Q2xhc3NwYXRoQmxvY2tfMyk7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGxhc3RVc2VkUGF0aCk7Ci0JCVN0cmluZyBwYXRoID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWRpYWxvZ1NldHRpbmdzLnB1dChJQW50VUlDb25zdGFudHMuRElBTE9HU1RPUkVfTEFTVEFOVEhPTUUsIHBhdGgpOwotCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBkZWZhdWx0SG9tZSA9IHByZWZlcmVuY2VzLmdldEFudEhvbWUoKTsKLQkJaWYgKHBhdGguZXF1YWxzSWdub3JlQ2FzZShkZWZhdWx0SG9tZSkpIHsKLQkJCXBhdGggPSBudWxsOwotCQl9Ci0JCWZUYWIuc2V0RGlydHkodHJ1ZSk7Ci0JCS8vIHVwZGF0ZSBleGlzdGluZyBlbnRyeSBvciBhZGQgYSBuZXcgb25lCi0JCUlSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gZ2V0Vmlld2VyKCkuZ2V0RW50cmllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJaWYgKGVudHJ5LmdldFR5cGUoKSA9PSBJUnVudGltZUNsYXNzcGF0aEVudHJ5Lk9USEVSKSB7Ci0JCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeTIgZW50cnkyID0gKElSdW50aW1lQ2xhc3NwYXRoRW50cnkyKSgoQ2xhc3NwYXRoRW50cnkpZW50cnkpLmdldERlbGVnYXRlKCk7Ci0JCQkJaWYgKGVudHJ5Mi5nZXRUeXBlSWQoKS5lcXVhbHMoQW50SG9tZUNsYXNzcGF0aEVudHJ5LlRZUEVfSUQpKSB7Ci0JCQkJCSgoQW50SG9tZUNsYXNzcGF0aEVudHJ5KWVudHJ5Mikuc2V0QW50SG9tZShwYXRoKTsKLQkJCQkJZ2V0Vmlld2VyKCkucmVmcmVzaChlbnRyeSk7Ci0JCQkJCWdldFZpZXdlcigpLm5vdGlmeUNoYW5nZWQoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQkJCQkKLQkJLy8gbm8gZW50cnkgZm91bmQgLSBhZGQgYSBuZXcgb25lCi0JCWdldFZpZXdlcigpLmFkZEVudHJpZXMobmV3IElSdW50aW1lQ2xhc3NwYXRoRW50cnlbXXtuZXcgQW50SG9tZUNsYXNzcGF0aEVudHJ5KHBhdGgpfSk7CQkKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiN1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvSUFudExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL0lBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2OWI5ZWIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvSUFudExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmxhdW5jaGluZy5JQW50TGF1bmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwubW9kZWwuSUV4dGVybmFsVG9vbENvbnN0YW50czsKLQotLyoqCi0gKiBDb25zdGFudCBkZWZpbml0aW9ucyBmb3IgQW50IGxhdW5jaCBjb25maWd1cmF0aW9ucy4KLSAqIDxwPgotICogQ29uc3RhbnQgZGVmaW5pdGlvbnMgb25seTsgbm90IHRvIGJlIGltcGxlbWVudGVkLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogQGRlcHJlY2F0ZWQgVGhpcyBpbnRlcmZhY2UgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCB7QGxpbmsgSUFudExhdW5jaENvbnN0YW50c30KLSAqLwotcHVibGljIGludGVyZmFjZSBJQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cyB7Ci0KLQkvKioKLQkqIFN0cmluZyBhdHRyaWJ1dGUgaW5kaWNhdGluZyB0aGUgY3VzdG9tIHJ1bnRpbWUgY2xhc3NwYXRoIHRvIHVzZSBmb3IgYW4gQW50Ci0JKiBidWlsZC4gRGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZ2xvYmFsCi0JKiBjbGFzc3BhdGggaXMgdG8gYmUgdXNlZC4gRm9ybWF0IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Rpbmcgb2YgVVJMcy4KLQkqIEBkZXByZWNhdGVkIG5vIGxvbmdlciBzdXBwb3J0ZWQ6IHVzZSB7QGxpbmsgSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzI0FUVFJfQ0xBU1NQQVRIX1BST1ZJREVSfQotCSogQHNlZSBJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMjQVRUUl9ERUZBVUxUX0NMQVNTUEFUSAotCSovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BTlRfQ1VTVE9NX0NMQVNTUEFUSCA9IElFeHRlcm5hbFRvb2xDb25zdGFudHMuUExVR0lOX0lEICsgIi5BVFRSX0FOVF9DVVNUT01fQ0xBU1NQQVRIIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFN0cmluZyBhdHRyaWJ1dGUgaW5kaWNhdGluZyB0aGUgY3VzdG9tIEFudCBob21lIHRvIHVzZSBmb3IgYW4gQW50IGJ1aWxkLgotCSAqIERlZmF1bHQgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4gd2hpY2ggaW5kaWNhdGVzIHRoYXQgbm8gQW50IGhvbWUgaXMgdG8KLQkgKiBiZSBzZXQgCi0JICogQGRlcHJlY2F0ZWQgbm8gbG9uZ2VyIHN1cHBvcnRlZDogdXNlIHtAbGluayBJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMjQVRUUl9DTEFTU1BBVEhfUFJPVklERVJ9Ci0JICogQHNlZSBJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMjQVRUUl9ERUZBVUxUX0NMQVNTUEFUSAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQU5UX0hPTUUgPSBJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLlBMVUdJTl9JRCArICIuQVRUUl9BTlRfSE9NRSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQkvKioKLQkgKiBTdHJpbmcgYXR0cmlidXRlIGluZGljYXRpbmcgdGhlIEFudCB0YXJnZXRzIHRvIGV4ZWN1dGUuIERlZmF1bHQgdmFsdWUgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCB0YXJnZXQgaXMgdG8gYmUKLQkgKiBleGVjdXRlZC4gRm9ybWF0IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Rpbmcgb2YgdGFyZ2V0cy4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBUaGlzIGNvbnN0YW50IGhhcyBiZWVuIG1pZ3JhdGVkIHRvIHtAbGluayBvcmcuZWNsaXBzZS5hbnQudWkubGF1bmNoaW5nLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQU5UX1RBUkdFVFMgPSBvcmcuZWNsaXBzZS5hbnQudWkubGF1bmNoaW5nLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQU5UX1RBUkdFVFM7Ci0JLyoqCi0JICogU3RyaW5nIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBBbnQgdGFyZ2V0cyB0byBleGVjdXRlIGFmdGVyIGEgY2xlYW4gKGZ1bGwgYnVpbGQpIGZvciBhbiBBbnQgYnVpbGRlci4gRGVmYXVsdCB2YWx1ZSBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBkZWZhdWx0IHRhcmdldCBpcyB0byBiZQotCSAqIGV4ZWN1dGVkLiBGb3JtYXQgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdGluZyBvZiB0YXJnZXRzLgotCSAqIEBzaW5jZSAzLjEKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBUaGlzIGNvbnN0YW50IGhhcyBiZWVuIG1pZ3JhdGVkIHRvIHtAbGluayBvcmcuZWNsaXBzZS5hbnQudWkubGF1bmNoaW5nLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQU5UX0FGVEVSX0NMRUFOX1RBUkdFVFMgPSBvcmcuZWNsaXBzZS5hbnQudWkubGF1bmNoaW5nLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQU5UX0FGVEVSX0NMRUFOX1RBUkdFVFM7Ci0JLyoqCi0JICogU3RyaW5nIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBBbnQgdGFyZ2V0cyB0byBleGVjdXRlIGR1cmluZyBhIG1hbnVhbCBidWlsZCBmb3IgYW4gQW50IGJ1aWxkZXIuIERlZmF1bHQgdmFsdWUgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCB0YXJnZXQgaXMgdG8gYmUKLQkgKiBleGVjdXRlZC4gRm9ybWF0IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Rpbmcgb2YgdGFyZ2V0cy4KLQkgKiBAc2luY2UgMy4xCi0JICogCi0JICogQGRlcHJlY2F0ZWQgVGhpcyBjb25zdGFudCBoYXMgYmVlbiBtaWdyYXRlZCB0byB7QGxpbmsgb3JnLmVjbGlwc2UuYW50LnVpLmxhdW5jaGluZy5JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50c30gCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BTlRfTUFOVUFMX1RBUkdFVFMgPSBvcmcuZWNsaXBzZS5hbnQudWkubGF1bmNoaW5nLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQU5UX01BTlVBTF9UQVJHRVRTOwotCS8qKgotCSAqIFN0cmluZyBhdHRyaWJ1dGUgaW5kaWNhdGluZyB0aGUgQW50IHRhcmdldHMgdG8gZXhlY3V0ZSBkdXJpbmcgYW4gYXV0byBidWlsZCBmb3IgYW4gQW50IGJ1aWxkZXIuIERlZmF1bHQgdmFsdWUgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCB0YXJnZXQgaXMgdG8gYmUKLQkgKiBleGVjdXRlZC4gRm9ybWF0IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Rpbmcgb2YgdGFyZ2V0cy4KLQkgKiBAc2luY2UgMy4xCi0JICogCi0JICogQGRlcHJlY2F0ZWQgVGhpcyBjb25zdGFudCBoYXMgYmVlbiBtaWdyYXRlZCB0byB7QGxpbmsgb3JnLmVjbGlwc2UuYW50LnVpLmxhdW5jaGluZy5JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50c30gCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BTlRfQVVUT19UQVJHRVRTID0gb3JnLmVjbGlwc2UuYW50LnVpLmxhdW5jaGluZy5JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0FOVF9BVVRPX1RBUkdFVFM7Ci0JLyoqCi0JICogU3RyaW5nIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBBbnQgdGFyZ2V0cyB0byBleGVjdXRlIGR1cmluZyBhIGNsZWFuIGZvciBhbiBBbnQgYnVpbGRlci4gRGVmYXVsdCB2YWx1ZSBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBkZWZhdWx0IHRhcmdldCBpcyB0byBiZQotCSAqIGV4ZWN1dGVkLiBGb3JtYXQgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdGluZyBvZiB0YXJnZXRzLgotCSAqIEBzaW5jZSAzLjEKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBUaGlzIGNvbnN0YW50IGhhcyBiZWVuIG1pZ3JhdGVkIHRvIHtAbGluayBvcmcuZWNsaXBzZS5hbnQudWkubGF1bmNoaW5nLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzfSAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FOVF9DTEVBTl9UQVJHRVRTID0gb3JnLmVjbGlwc2UuYW50LnVpLmxhdW5jaGluZy5JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0FOVF9DTEVBTl9UQVJHRVRTOwotCS8qKgotCSAqIEJvb2xlYW4gYXR0cmlidXRlIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGFyZ2V0IHNwZWNpZmljYXRpb24gZm9yIGFuIEFudCBidWlsZGVyIGhhcyBiZWVuIHVwZGF0ZWQgZm9yCi0JICogMy4xIAotCSAqIAotCSAqIEBzaW5jZSAzLjEKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBUaGlzIGNvbnN0YW50IGhhcyBiZWVuIG1pZ3JhdGVkIHRvIHtAbGluayBvcmcuZWNsaXBzZS5hbnQudWkubGF1bmNoaW5nLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVEFSR0VUU19VUERBVEVEID0gb3JnLmVjbGlwc2UuYW50LnVpLmxhdW5jaGluZy5JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1RBUkdFVFNfVVBEQVRFRDsKLQkvKioKLQkgKiBNYXAgYXR0cmlidXRlIGluZGljYXRpbmcgdGhlIEFudCBwcm9wZXJ0aWVzIHRvIGJlIGRlZmluZWQgZHVyaW5nIHRoZQotCSAqIGJ1aWxkLiBEZWZhdWx0IHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIGluZGljYXRlcyBubyBhZGRpdGlvbmFsCi0JICogcHJvcGVydGllcyB3aWxsIGJlIGRlZmluZWQuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgVGhpcyBjb25zdGFudCBoYXMgYmVlbiBtaWdyYXRlZCB0byB7QGxpbmsgb3JnLmVjbGlwc2UuYW50LnVpLmxhdW5jaGluZy5JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50c30KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FOVF9QUk9QRVJUSUVTID0gb3JnLmVjbGlwc2UuYW50LnVpLmxhdW5jaGluZy5JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0FOVF9QUk9QRVJUSUVTOwkJCQkKLQkvKioKLQkgKiBTdHJpbmcgYXR0cmlidXRlIGluZGljYXRpbmcgdGhlIEFudCB0YXJnZXRzIHRvIGV4ZWN1dGUuIERlZmF1bHQgdmFsdWUgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMgdGhhdCBubyBhZGRpdGlvbmFsIHByb3BlcnR5IGZpbGVzCi0JICogd2lsbCBiZSBkZWZpbmVkLiBGb3JtYXQgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdGluZyBvZiBwcm9wZXJ0eSBmaWxlcy4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBUaGlzIGNvbnN0YW50IGhhcyBiZWVuIG1pZ3JhdGVkIHRvIHtAbGluayBvcmcuZWNsaXBzZS5hbnQudWkubGF1bmNoaW5nLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzfSAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FOVF9QUk9QRVJUWV9GSUxFUyA9IG9yZy5lY2xpcHNlLmFudC51aS5sYXVuY2hpbmcuSUFudExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9BTlRfUFJPUEVSVFlfRklMRVM7Ci0JLyoqCi0JICogQm9vbGVhbiBhdHRyaWJ1dGUgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBpbnRlcm5hbCB0YXJnZXRzICh0YXJnZXRzIHdpdGggbm8KLQkgKiBkZXNjcmlwdGlvbikgc2hvdWxkIGJlIGhpZGRlbiBmcm9tIHRoZSB1c2VyIGluIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBkaWFsb2cuCi0JICogRGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5mYWxzZTwvY29kZT4gd2hpY2ggaW5kaWNhdGVzIHRoYXQgYWxsIHRhcmdldHMgd2lsbCBiZQotCSAqIGRpc3BsYXllZC4KLQkgKiAKLQkgKiBAc2luY2UgMy4wCi0JICogCi0JICogQGRlcHJlY2F0ZWQgVGhpcyBjb25zdGFudCBoYXMgYmVlbiBtaWdyYXRlZCB0byB7QGxpbmsgb3JnLmVjbGlwc2UuYW50LnVpLmxhdW5jaGluZy5JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50c30KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0hJREVfSU5URVJOQUxfVEFSR0VUUyA9IG9yZy5lY2xpcHNlLmFudC51aS5sYXVuY2hpbmcuSUFudExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ISURFX0lOVEVSTkFMX1RBUkdFVFM7Ci0JLyoqCi0JICogSW50ZWdlciBhdHRyaWJ1dGUgaW5kaWNhdGluZyB3aGljaCBjb2x1bW4gdGFyZ2V0cyBzaG91bGQgYmUgc29ydGVkIG9uLiBBCi0JICogdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGFyZ2V0IG5hbWUsIDEgaW5kaWNhdGVzIHRhcmdldCBkZXNjcmlwdGlvbiwgYW5kIC0xCi0JICogaW5kaWNhdGVzIG5vIHNvcnQuIERlZmF1bHQgdmFsdWUgaXMgLTEuCi0JICogCi0JICogQHNpbmNlIDMuMAotCSAqIAotCSAqIEBkZXByZWNhdGVkIFRoaXMgY29uc3RhbnQgaGFzIGJlZW4gbWlncmF0ZWQgdG8ge0BsaW5rIG9yZy5lY2xpcHNlLmFudC51aS5sYXVuY2hpbmcuSUFudExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHN9Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TT1JUX1RBUkdFVFMgPSBvcmcuZWNsaXBzZS5hbnQudWkubGF1bmNoaW5nLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfU09SVF9UQVJHRVRTOwotCS8qKgotCSAqIEFudCBsYXVuY2ggY29uZmlndXJhdGlvbiB0eXBlIGlkZW50aWZpZXIuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgVGhpcyBjb25zdGFudCBoYXMgYmVlbiBtaWdyYXRlZCB0byB7QGxpbmsgb3JnLmVjbGlwc2UuYW50LnVpLmxhdW5jaGluZy5JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50c30gCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQU5UX0xBVU5DSF9DT05GSUdVUkFUSU9OX1RZUEUgPSBvcmcuZWNsaXBzZS5hbnQudWkubGF1bmNoaW5nLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLklEX0FOVF9MQVVOQ0hfQ09ORklHVVJBVElPTl9UWVBFOwotCS8qKgotCSAqIEFudCBidWlsZGVyIGxhdW5jaCBjb25maWd1cmF0aW9uIHR5cGUgaWRlbnRpZmllci4gQW50IHByb2plY3QgYnVpbGRlcnMKLQkgKiBhcmUgb2YgdGhpcyB0eXBlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIFRoaXMgY29uc3RhbnQgaGFzIGJlZW4gbWlncmF0ZWQgdG8ge0BsaW5rIG9yZy5lY2xpcHNlLmFudC51aS5sYXVuY2hpbmcuSUFudExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHN9IAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FOVF9CVUlMREVSX0xBVU5DSF9DT05GSUdVUkFUSU9OX1RZUEUgPSBvcmcuZWNsaXBzZS5hbnQudWkubGF1bmNoaW5nLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLklEX0FOVF9CVUlMREVSX0xBVU5DSF9DT05GSUdVUkFUSU9OX1RZUEU7Ci0JLyoqCi0JICogSWRlbnRpZmllciBmb3IgQW50IHByb2Nlc3NlcyAodmFsdWUgPGNvZGU+b3JnLmVjbGlwc2UuYW50LnVpLmFudFByb2Nlc3M8L2NvZGU+KS4gVGhpcyBpZGVudGlmaWVyIGlzCi0JICogc2V0IGFzIHRoZSB2YWx1ZSBmb3IgdGhlIDxjb2RlPklQcm9jZXNzLkFUVFJfUFJPQ0VTU19UWVBFPC9jb2RlPgotCSAqIGF0dHJpYnV0ZSBpbiBwcm9jZXNzZXMgY3JlYXRlZCBieSB0aGUgQW50IGxhdW5jaCBkZWxlZ2F0ZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBUaGlzIGNvbnN0YW50IGhhcyBiZWVuIG1pZ3JhdGVkIHRvIHtAbGluayBvcmcuZWNsaXBzZS5hbnQudWkubGF1bmNoaW5nLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzfSAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BTlRfUFJPQ0VTU19UWVBFID0gb3JnLmVjbGlwc2UuYW50LnVpLmxhdW5jaGluZy5JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5JRF9BTlRfUFJPQ0VTU19UWVBFOwotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvUnVuQW50U3RhdHVzSGFuZGxlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvUnVuQW50U3RhdHVzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTJkZGZhLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2xhdW5jaENvbmZpZ3VyYXRpb25zL1J1bkFudFN0YXR1c0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklTdGF0dXNIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nOwotCi0vKioKLSAqIFN0YXR1cyBoYW5kbGVyIGNhbGxlZCB3aGVuIHRoZSBsYXVuY2ggZGlhbG9nIGlzIG9wZW5lZCB2aWEgdGhlICJSdW4gQW50Li4uIgotICogYWN0aW9uLiBUaGlzIGFsbG93cyB1cyB0byBzZXQgdGhlIGluaXRpYWwgdGFiLgotICovCi1wdWJsaWMgY2xhc3MgUnVuQW50U3RhdHVzSGFuZGxlciBpbXBsZW1lbnRzIElTdGF0dXNIYW5kbGVyIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JU3RhdHVzSGFuZGxlciNoYW5kbGVTdGF0dXMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBoYW5kbGVTdGF0dXMoSVN0YXR1cyBzdGF0dXMsIE9iamVjdCBzb3VyY2UpIHsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2cgZGlhbG9nID0gKElMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKXNvdXJjZTsKLQkJZGlhbG9nLnNldEFjdGl2ZVRhYigzKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9UYXJnZXRPcmRlckRpYWxvZy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvVGFyZ2V0T3JkZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBhN2Q4MS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9UYXJnZXRPcmRlckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50TW9kZWxDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudE1vZGVsTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogRGlhbG9nIHRvIHNwZWNpZnkgdGFyZ2V0IGV4ZWN1dGlvbiBvcmRlcgotICovCi1wdWJsaWMgY2xhc3MgVGFyZ2V0T3JkZXJEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQkKLQlwcml2YXRlIEJ1dHRvbiBmVXA7Ci0JcHJpdmF0ZSBCdXR0b24gZkRvd247Ci0JcHJpdmF0ZSBUYWJsZVZpZXdlciBmVmlld2VyOwotCXByaXZhdGUgT2JqZWN0W10gZlRhcmdldHM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIHRoZSBkaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICovCi0JcHVibGljIFRhcmdldE9yZGVyRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBPYmplY3RbXSB0YXJnZXRzKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJZlRhcmdldHMgPSB0YXJnZXRzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlnZXRTaGVsbCgpLnNldFRleHQoQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLlRhcmdldE9yZGVyRGlhbG9nX09yZGVyX1RhcmdldHNfMSk7Ci0JCQotCQlDb21wb3NpdGUgY29tcCA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQkoKEdyaWRMYXlvdXQpY29tcC5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucz0gMjsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KEFudExhdW5jaENvbmZpZ3VyYXRpb25NZXNzYWdlcy5UYXJnZXRPcmRlckRpYWxvZ19fU3BlY2lmeV90YXJnZXRfZXhlY3V0aW9uX29yZGVyX18yKTsKLQkJbGFiZWwuc2V0Rm9udChjb21wLmdldEZvbnQoKSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7CQkKLQkJCi0JCWNyZWF0ZVRhcmdldExpc3QoY29tcCk7Ci0JCQotCQljcmVhdGVCdXR0b25zKGNvbXApOwotCQkKLQkJdXBkYXRlQnV0dG9ucygpOwotCQkKLQkJcmV0dXJuIGNvbXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGJ1dHRvbiBhcmVhICYgYnV0dG9ucwotCSAqIAotCSAqIEBwYXJhbSBjb21wCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJ1dHRvbnMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodD0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoPSAwOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJY29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCWZVcCA9IG5ldyBCdXR0b24oY29tcCwgU1dULlBVU0gpOwotCQlmVXAuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJZlVwLnNldFRleHQoQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLlRhcmdldE9yZGVyRGlhbG9nX19VcF8zKTsKLQkJc2V0QnV0dG9uTGF5b3V0RGF0YShmVXApOwotCQlmVXAuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlVXBQcmVzc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZkRvd24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5QVVNIKTsKLQkJZkRvd24uc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJZkRvd24uc2V0VGV4dChBbnRMYXVuY2hDb25maWd1cmF0aW9uTWVzc2FnZXMuVGFyZ2V0T3JkZXJEaWFsb2dfX0Rvd25fNCk7Ci0JCXNldEJ1dHRvbkxheW91dERhdGEoZkRvd24pOwotCQlmRG93bi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVEb3duUHJlc3NlZCgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRG93blByZXNzZWQoKSB7Ci0JCUxpc3QgdGFyZ2V0cyA9IGdldE9yZGVyZWRTZWxlY3Rpb24oKTsKLQkJaWYgKHRhcmdldHMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJTGlzdCBsaXN0PSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoZlRhcmdldHMpKTsKLQkJaW50IGJvdHRvbSA9IGxpc3Quc2l6ZSgpIC0gMTsKLQkJaW50IGluZGV4ID0gMDsKLQkJZm9yIChpbnQgaSA9IHRhcmdldHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCU9iamVjdCB0YXJnZXQgPSB0YXJnZXRzLmdldChpKTsKLQkJCWluZGV4ID0gbGlzdC5pbmRleE9mKHRhcmdldCk7Ci0JCQlpZiAoaW5kZXggPCBib3R0b20pIHsKLQkJCQlib3R0b20gPSBpbmRleCArIDE7Ci0JCQkJT2JqZWN0IHRlbXAgPSBsaXN0LmdldChib3R0b20pOwotCQkJCWxpc3Quc2V0KGJvdHRvbSwgdGFyZ2V0KTsKLQkJCQlsaXN0LnNldChpbmRleCwgdGVtcCk7Ci0JCQl9Ci0JCQlib3R0b20gPSBpbmRleDsKLQkJfSAKLQkJc2V0RW50cmllcyhsaXN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlVXBQcmVzc2VkKCkgewotCQlMaXN0IHRhcmdldHMgPSBnZXRPcmRlcmVkU2VsZWN0aW9uKCk7Ci0JCWlmICh0YXJnZXRzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCB0b3AgPSAwOwotCQlpbnQgaW5kZXggPSAwOwotCQlMaXN0IGxpc3Q9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChmVGFyZ2V0cykpOwotCQlJdGVyYXRvciBlbnRyaWVzID0gdGFyZ2V0cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZW50cmllcy5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCB0YXJnZXQgPSBlbnRyaWVzLm5leHQoKTsKLQkJCWluZGV4ID0gbGlzdC5pbmRleE9mKHRhcmdldCk7Ci0JCQlpZiAoaW5kZXggPiB0b3ApIHsKLQkJCQl0b3AgPSBpbmRleCAtIDE7Ci0JCQkJT2JqZWN0IHRlbXAgPSBsaXN0LmdldCh0b3ApOwotCQkJCWxpc3Quc2V0KHRvcCwgdGFyZ2V0KTsKLQkJCQlsaXN0LnNldChpbmRleCwgdGVtcCk7Ci0JCQl9Ci0JCQl0b3AgPSBpbmRleDsKLQkJfSAKLQkJc2V0RW50cmllcyhsaXN0KTsKLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZW50cmllcyB0byB0aGUgZW50cmllcyBpbiB0aGUgZ2l2ZW4gbGlzdAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRFbnRyaWVzKExpc3QgbGlzdCkgewotCQlmVGFyZ2V0cz0gbGlzdC50b0FycmF5KCk7Ci0JCWZWaWV3ZXIuc2V0SW5wdXQoZlRhcmdldHMpOwotCQkvLyB1cGRhdGUgYWxsIHNlbGVjdGlvbiBsaXN0ZW5lcnMKLQkJZlZpZXdlci5zZXRTZWxlY3Rpb24oZlZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlbGVjdGVkIGl0ZW1zIGluIHRoZSBsaXN0LCBpbiB0aGUgb3JkZXIgdGhleSBhcmUKLQkgKiBkaXNwbGF5ZWQgKG5vdCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIHNlbGVjdGVkKS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRhcmdldHMgZm9yIGFuIGFjdGlvbgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRPcmRlcmVkU2VsZWN0aW9uKCkgewotCQlMaXN0IHRhcmdldHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgc2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbilmVmlld2VyLmdldFNlbGVjdGlvbigpKS50b0xpc3QoKTsKLQkJT2JqZWN0W10gZW50cmllcyA9IGZUYXJnZXRzOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCB0YXJnZXQgPSBlbnRyaWVzW2ldOwotCQkJaWYgKHNlbGVjdGlvbi5jb250YWlucyh0YXJnZXQpKSB7Ci0JCQkJdGFyZ2V0cy5hZGQodGFyZ2V0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGFyZ2V0czsJCQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsaXN0IHZpZXdlciBmb3IgdGhlIHRhcmdldHMKLQkgKiAKLQkgKiBAcGFyYW0gY29tcAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUYXJnZXRMaXN0KENvbXBvc2l0ZSBjb21wKSB7Ci0JCWZWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY29tcCwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkJPUkRFUik7Ci0JCWZWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQW50TW9kZWxMYWJlbFByb3ZpZGVyKCkpOwotCQotCQlmVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQW50TW9kZWxDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWZWaWV3ZXIuc2V0SW5wdXQoZlRhcmdldHMpOwotCQlmVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJVGFibGUgdGFibGUgPSBmVmlld2VyLmdldFRhYmxlKCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhlaWdodEhpbnQgPSAyMDA7Ci0JCWdkLndpZHRoSGludCA9IDI1MDsJCQotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdGFibGUuc2V0Rm9udChjb21wLmdldEZvbnQoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9yZGVyZWQgdGFyZ2V0cwotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRUYXJnZXRzKCkgewotCQlyZXR1cm4gZlRhcmdldHM7Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZSBidXR0b24gZW5hYmxlbWVudAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJdXBkYXRlQnV0dG9ucygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlQnV0dG9ucygpIHsKLQkJaW50W10gc2VsZWN0aW9ucyA9IGZWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRpY2VzKCk7Ci0JCWludCBsYXN0ID0gZlRhcmdldHMubGVuZ3RoIC0gMTsKLQkJYm9vbGVhbiB1cCA9IHRydWUgJiYgc2VsZWN0aW9ucy5sZW5ndGggPiAwOwotCQlib29sZWFuIGRvd24gPSB0cnVlICYmIHNlbGVjdGlvbnMubGVuZ3RoID4gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoc2VsZWN0aW9uc1tpXSA9PSAwKSB7Ci0JCQkJdXAgPSBmYWxzZTsKLQkJCX0KLQkJCWlmIChzZWxlY3Rpb25zW2ldID09IGxhc3QpIHsKLQkJCQlkb3duID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJZlVwLnNldEVuYWJsZWQodXApOwotCQlmRG93bi5zZXRFbmFibGVkKGRvd24pOwkJCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNoZWxsLCBJQW50VUlIZWxwQ29udGV4dElkcy5UQVJHRVRfT1JERVJfRElBTE9HKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9WYXJpYWJsZUlucHV0RGlhbG9nLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9sYXVuY2hDb25maWd1cmF0aW9ucy9WYXJpYWJsZUlucHV0RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYmY0ZGUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbGF1bmNoQ29uZmlndXJhdGlvbnMvVmFyaWFibGVJbnB1dERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLlN0cmluZ1ZhcmlhYmxlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBWYXJpYWJsZUlucHV0RGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgRElBTE9HX1NFVFRJTkdTX1NFQ1RJT04gPSAiUnVudGltZUNsYXNzcGF0aEFjdGlvbi5WYXJpYWJsZUlucHV0RGlhbG9nIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgVGV4dCBmVGV4dDsKLQlwcml2YXRlIFN0cmluZyBmVmFyaWFibGVTdHJpbmc7Ci0JCi0JcHVibGljIFZhcmlhYmxlSW5wdXREaWFsb2coU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIoc2hlbGwpOwotCQlzZXRTaGVsbFN0eWxlKFNXVC5SRVNJWkUgfCBnZXRTaGVsbFN0eWxlKCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGlubmVyPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCSgoR3JpZExheW91dClpbm5lci5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucz0gMjsKLQkJCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGlubmVyLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkFkZFZhcmlhYmxlU3RyaW5nQWN0aW9uXzIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0gICAgICAgIGdkLmhvcml6b250YWxTcGFuPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCWZUZXh0ID0gbmV3IFRleHQoaW5uZXIsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdkLndpZHRoSGludCA9IDIwMDsKLQkJZlRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihpbm5lciwgU1dULlBVU0gpOyAKLQkJYnV0dG9uLnNldFRleHQoQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkFkZFZhcmlhYmxlU3RyaW5nQWN0aW9uXzMpOwkJCi0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyAgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZSkgewotCQkJCWdldFZhcmlhYmxlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXJldHVybiBpbm5lcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQl9Ci0gICAgCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCW5ld1NoZWxsLnNldFRleHQoQW50TGF1bmNoQ29uZmlndXJhdGlvbk1lc3NhZ2VzLkFkZFZhcmlhYmxlU3RyaW5nQWN0aW9uXzQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ2V0VmFyaWFibGUoKSB7Ci0JCVN0cmluZ1ZhcmlhYmxlU2VsZWN0aW9uRGlhbG9nIHZhcmlhYmxlRGlhbG9nID0gbmV3IFN0cmluZ1ZhcmlhYmxlU2VsZWN0aW9uRGlhbG9nKGdldFNoZWxsKCkpOwotCQlpbnQgcmV0dXJuQ29kZSA9IHZhcmlhYmxlRGlhbG9nLm9wZW4oKTsKLQkJaWYgKHJldHVybkNvZGUgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJU3RyaW5nIHZhcmlhYmxlID0gdmFyaWFibGVEaWFsb2cuZ2V0VmFyaWFibGVFeHByZXNzaW9uKCk7Ci0JCQlpZiAodmFyaWFibGUgIT0gbnVsbCkgewotCQkJCWZUZXh0Lmluc2VydCh2YXJpYWJsZSk7Ci0JCQl9Ci0JCX0JCQkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjb2tQcmVzc2VkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCVN0cmluZyB2YXJpYWJsZVN0cmluZyA9IGZUZXh0LmdldFRleHQoKTsKLQkJaWYgKHZhcmlhYmxlU3RyaW5nICE9IG51bGwgJiYgdmFyaWFibGVTdHJpbmcudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJZlZhcmlhYmxlU3RyaW5nPSB2YXJpYWJsZVN0cmluZzsKLQkJfSBlbHNlIHsKLQkJCWZWYXJpYWJsZVN0cmluZz0gbnVsbDsKLQkJfQotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRWYXJpYWJsZVN0cmluZygpIHsKLQkJcmV0dXJuIGZWYXJpYWJsZVN0cmluZzsKLQl9Ci0KLQkgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjZ2V0RGlhbG9nQm91bmRzU2V0dGluZ3MoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nQm91bmRzU2V0dGluZ3MoKSB7Ci0gICAgCSBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBBbnRVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLSAgICAgICAgIElEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gc2V0dGluZ3MuZ2V0U2VjdGlvbihESUFMT0dfU0VUVElOR1NfU0VDVElPTik7Ci0gICAgICAgICBpZiAoc2VjdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgc2VjdGlvbiA9IHNldHRpbmdzLmFkZE5ld1NlY3Rpb24oRElBTE9HX1NFVFRJTkdTX1NFQ1RJT04pOwotICAgICAgICAgfSAKLSAgICAgICAgIHJldHVybiBzZWN0aW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0FudENvbW1lbnROb2RlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9BbnRDb21tZW50Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmM3YTA4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0FudENvbW1lbnROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5BbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotcHVibGljIGNsYXNzIEFudENvbW1lbnROb2RlIGV4dGVuZHMgQW50RWxlbWVudE5vZGUgewotCXB1YmxpYyBBbnRDb21tZW50Tm9kZSgpIHsKLQkJc3VwZXIoIkFudENvbW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm1vZGVsLkFudEVsZW1lbnROb2RlI2lzU3RydWN0dXJhbE5vZGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3RydWN0dXJhbE5vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29sbGFwc2VQcm9qZWN0aW9uKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlPSBBbnRVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7CQkKLQkJaWYgKHN0b3JlLmdldEJvb2xlYW4oQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfRk9MRElOR19DT01NRU5UUykpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9BbnREVEROb2RlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9BbnREVEROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZjI5ZWYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50RFRETm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLXB1YmxpYyBjbGFzcyBBbnREVEROb2RlIGV4dGVuZHMgQW50RWxlbWVudE5vZGUgewotCXB1YmxpYyBBbnREVEROb2RlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm1vZGVsLkFudEVsZW1lbnROb2RlI2lzU3RydWN0dXJhbE5vZGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3RydWN0dXJhbE5vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29sbGFwc2VQcm9qZWN0aW9uKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlPSBBbnRVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7CQkKLQkJaWYgKHN0b3JlLmdldEJvb2xlYW4oQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfRk9MRElOR19EVEQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50RWxlbWVudEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9BbnRFbGVtZW50QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAxMTdmNy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9BbnRFbGVtZW50QWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBBZGFwdGVyIGZhY3RvcnkgZm9yIEFudCBlbGVtZW50cyBpbiBlZGl0b3Igb3V0bGluZQotICovCi1wdWJsaWMgY2xhc3MgQW50RWxlbWVudEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlcihqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBBbnRFbGVtZW50Tm9kZSkgewotCQkJQW50RWxlbWVudE5vZGUgbm9kZSA9IChBbnRFbGVtZW50Tm9kZSkgYWRhcHRhYmxlT2JqZWN0OwotCQkJaWYgKElSZXNvdXJjZS5jbGFzcy5lcXVhbHMoYWRhcHRlclR5cGUpKSB7Ci0JCQkJcmV0dXJuIG5vZGUuZ2V0SUZpbGUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXJMaXN0KCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tdIHtJUmVzb3VyY2UuY2xhc3N9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50TW9kZWxDaGFuZ2VFdmVudC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50TW9kZWxDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzdlYTI2Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0FudE1vZGVsQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWw7Ci0KLQotcHVibGljIGNsYXNzIEFudE1vZGVsQ2hhbmdlRXZlbnQgewotCQotCXByaXZhdGUgSUFudE1vZGVsIGZNb2RlbDsKLQlwcml2YXRlIGJvb2xlYW4gZlByZWZlcmVuY2VDaGFuZ2U9IGZhbHNlOwotCQotCXB1YmxpYyBBbnRNb2RlbENoYW5nZUV2ZW50KElBbnRNb2RlbCBtb2RlbCkgewotCQlmTW9kZWw9IG1vZGVsOwotCX0KLQkKLQlwdWJsaWMgQW50TW9kZWxDaGFuZ2VFdmVudChJQW50TW9kZWwgbW9kZWwsIGJvb2xlYW4gcHJlZmVyZW5jZUNoYW5nZSkgewotCQlmTW9kZWw9IG1vZGVsOwotCQlmUHJlZmVyZW5jZUNoYW5nZT0gcHJlZmVyZW5jZUNoYW5nZTsKLQl9Ci0JCi0JcHVibGljIElBbnRNb2RlbCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIGZNb2RlbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBBbnQgbW9kZWwgaGFzIGNoYW5nZWQgYXMgYSByZXN1bHQgb2YgYSBwcmVmZXJlbmNlIGNoYW5nZS4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBjaGFuZ2VkIGZyb20gYSBwcmVmZXJlbmNlIGNoYW5nZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ByZWZlcmVuY2VDaGFuZ2UoKSB7Ci0JCXJldHVybiBmUHJlZmVyZW5jZUNoYW5nZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9BbnRNb2RlbENvbnRlbnRQcm92aWRlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50TW9kZWxDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAyY2Q2MS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9BbnRNb2RlbENvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLQotcHVibGljIGNsYXNzIEFudE1vZGVsQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWT0gbmV3IE9iamVjdFswXTsKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLSAgICAKLQkvKioKLQkgKiBkbyBub3RoaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnROb2RlKSB7Ci0JCWlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgQW50RWxlbWVudE5vZGUpIHsKLQkJCUFudEVsZW1lbnROb2RlIHBhcmVudEVsZW1lbnQgPSAoQW50RWxlbWVudE5vZGUpcGFyZW50Tm9kZTsKLQkJCWlmIChwYXJlbnRFbGVtZW50Lmhhc0NoaWxkcmVuKCkpIHsKLQkJCQlMaXN0IGNoaWxkcmVuPSBwYXJlbnRFbGVtZW50LmdldENoaWxkTm9kZXMoKTsKLQkJCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCQkJfSAKLQkJfSBlbHNlIGlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgSUFudE1vZGVsKSB7Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsoKElBbnRNb2RlbClwYXJlbnROb2RlKS5nZXRQcm9qZWN0Tm9kZSgpfTsKLQkJfQotCQlyZXR1cm4gRU1QVFlfQVJSQVk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBhTm9kZSkgewotCQlBbnRFbGVtZW50Tm9kZSB0ZW1wRWxlbWVudCA9IChBbnRFbGVtZW50Tm9kZSlhTm9kZTsKLQkJcmV0dXJuIHRlbXBFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgYU5vZGUpIHsKLQkJcmV0dXJuICgoQW50RWxlbWVudE5vZGUpYU5vZGUpLmhhc0NoaWxkcmVuKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElBbnRNb2RlbCApIHsKLQkJICAgIEFudFByb2plY3ROb2RlIHByb2plY3ROb2RlPSAoKElBbnRNb2RlbCkgaW5wdXRFbGVtZW50KS5nZXRQcm9qZWN0Tm9kZSgpOwotCQkgICAgaWYgKHByb2plY3ROb2RlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IEFudEVsZW1lbnROb2RlWzBdOwotCQkJfSAKLQkJCQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7cHJvamVjdE5vZGV9OyAKLQkJfQotCQkKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIE9iamVjdFtdKSB7Ci0JCQlyZXR1cm4gKE9iamVjdFtdKWlucHV0RWxlbWVudDsKLQkJfQotCQlyZXR1cm4gRU1QVFlfQVJSQVk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50TW9kZWxDb3JlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9BbnRNb2RlbENvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJiN2U4Mi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9BbnRNb2RlbENvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwubGF1bmNoaW5nLmRlYnVnLm1vZGVsLkFudExpbmVCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5sYXVuY2hpbmcuZGVidWcubW9kZWwuRGVidWdNb2RlbE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXJEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JQnJlYWtwb2ludHNMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1wdWJsaWMgY2xhc3MgQW50TW9kZWxDb3JlIGltcGxlbWVudHMgSUJyZWFrcG9pbnRzTGlzdGVuZXIgewotCQotCXByaXZhdGUgc3RhdGljIEFudE1vZGVsQ29yZSBpbnN0OwotCQotCXB1YmxpYyBzdGF0aWMgQW50TW9kZWxDb3JlIGdldERlZmF1bHQoKSB7Ci0JCWlmIChpbnN0ID09IG51bGwpIHsKLQkJCWluc3Q9IG5ldyBBbnRNb2RlbENvcmUoKTsKLQkJfQotCQkJCi0JCXJldHVybiBpbnN0OwotCX0KLQkKLQlwcml2YXRlIExpc3QgZk1vZGVsQ2hhbmdlTGlzdGVuZXJzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHJpdmF0ZSBBbnRNb2RlbENvcmUoKSB7IH0KLQotCXB1YmxpYyB2b2lkIGFkZEFudE1vZGVsTGlzdGVuZXIoSUFudE1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChmTW9kZWxDaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCWZNb2RlbENoYW5nZUxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUFudE1vZGVsTGlzdGVuZXIoSUFudE1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChmTW9kZWxDaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCWZNb2RlbENoYW5nZUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIG5vdGlmeUFudE1vZGVsTGlzdGVuZXJzKEFudE1vZGVsQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJSXRlcmF0b3IgaTsKLQkJc3luY2hyb25pemVkIChmTW9kZWxDaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCWk9IG5ldyBBcnJheUxpc3QoZk1vZGVsQ2hhbmdlTGlzdGVuZXJzKS5pdGVyYXRvcigpOwotCQl9Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJKChJQW50TW9kZWxMaXN0ZW5lcilpLm5leHQoKSkuYW50TW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLSAgICAKLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIG1lc3NhZ2UgYXR0cmlidXRlcyBvbiBhbnkgQW50IGxpbmUgYnJlYWtwb2ludHMgaWYgdGhlcmUgYXJlIGFjdGl2ZSBBbnQgZWRpdG9ycwotICAgICAqIHdpdGggQW50IG1vZGVscwotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JQnJlYWtwb2ludHNMaXN0ZW5lciNicmVha3BvaW50c0FkZGVkKG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUJyZWFrcG9pbnRbXSkKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQnJlYWtwb2ludE1lc3NhZ2VzKGZpbmFsIElCcmVha3BvaW50W10gYnJlYWtwb2ludHMpIHsKLSAgICAgICAgSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJyZWFrcG9pbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIElCcmVha3BvaW50IGJyZWFrcG9pbnQ9IGJyZWFrcG9pbnRzW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoYnJlYWtwb2ludCBpbnN0YW5jZW9mIEFudExpbmVCcmVha3BvaW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJTWFya2VyIG1hcmtlciA9IGJyZWFrcG9pbnQuZ2V0TWFya2VyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFya2VyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAJaW50IGxpbmVOdW1iZXI9IG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUiwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UsIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KERlYnVnTW9kZWxNZXNzYWdlcy5BbnRMaW5lQnJlYWtwb2ludF8wLCBuZXcgU3RyaW5nW10ge0ludGVnZXIudG9TdHJpbmcobGluZU51bWJlcil9KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBudWxsLCAwLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBBbnRVSVBsdWdpbi5sb2coZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBicmVha3BvaW50c0FkZGVkKElCcmVha3BvaW50W10gYnJlYWtwb2ludHMpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBicmVha3BvaW50c1JlbW92ZWQoSUJyZWFrcG9pbnRbXSBicmVha3BvaW50cywgSU1hcmtlckRlbHRhW10gZGVsdGFzKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYnJlYWtwb2ludHNDaGFuZ2VkKElCcmVha3BvaW50W10gYnJlYWtwb2ludHMsIElNYXJrZXJEZWx0YVtdIGRlbHRhcykgewotICAgICAgICB1cGRhdGVCcmVha3BvaW50TWVzc2FnZXMoYnJlYWtwb2ludHMpOyAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RvcEJyZWFrcG9pbnRMaXN0ZW5pbmcoKSB7Ci0gICAgICAgIERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpLnJlbW92ZUJyZWFrcG9pbnRMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RhcnRCcmVha3BvaW50TGlzdGVuaW5nKCkgewotICAgICAgICBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKS5hZGRCcmVha3BvaW50TGlzdGVuZXIodGhpcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50TW9kZWxMYWJlbFByb3ZpZGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9BbnRNb2RlbExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY0MWFkNS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9BbnRNb2RlbExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29sb3JQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLQotcHVibGljIGNsYXNzIEFudE1vZGVsTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJQ29sb3JQcm92aWRlciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGFuRWxlbWVudCkgewotCQlBbnRFbGVtZW50Tm9kZSBub2RlID0gKEFudEVsZW1lbnROb2RlKWFuRWxlbWVudDsKLQkJcmV0dXJuIG5vZGUuZ2V0SW1hZ2UoKTsKLQl9Ci0gICAgCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG5vZGUpIHsKLQkJQW50RWxlbWVudE5vZGUgZWxlbWVudD0gKEFudEVsZW1lbnROb2RlKSBub2RlOwotCQlyZXR1cm4gZWxlbWVudC5nZXRMYWJlbCgpOwotCX0KLQotCXB1YmxpYyBDb2xvciBnZXRGb3JlZ3JvdW5kKE9iamVjdCBub2RlKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgQW50VGFyZ2V0Tm9kZSAmJiAoKEFudFRhcmdldE5vZGUpbm9kZSkuaXNEZWZhdWx0VGFyZ2V0KCkgKSB7Ci0JCQlyZXR1cm4gRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMVUUpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29sb3IgZ2V0QmFja2dyb3VuZChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9BbnRNb2RlbE1lc3NhZ2VzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9BbnRNb2RlbE1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZGI1YmMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50TW9kZWxNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBBbnRNb2RlbE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudE1vZGVsTWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFRhcmdldE5vZGVfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRJbXBvcnROb2RlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50VGFza05vZGVfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRFbGVtZW50Tm9kZV85OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50TW9kZWxfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRNb2RlbF80MzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRNb2RlbF80NDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRQcm9qZWN0Tm9kZVByb3h5XzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50UHJvamVjdE5vZGVQcm94eV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudERlZmluaW5nVGFza05vZGVfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnREZWZpbmluZ1Rhc2tOb2RlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50UHJvamVjdE5vZGVfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRQcm9wZXJ0eU5vZGVfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRQcm9wZXJ0eU5vZGVfMTsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBBbnRNb2RlbE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50TW9kZWxNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50TW9kZWxNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODMzMGM2Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0FudE1vZGVsTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQW50VGFyZ2V0Tm9kZV8yPVwgW2RlZmF1bHRdCi1BbnRJbXBvcnROb2RlXzA9U2VjdXJpdHkgZXhjZXB0aW9uIGR1cmluZyBpbXBvcnQKLUFudFRhc2tOb2RlXzA9U2VjdXJpdHkgcHJvYmxlbSBjb25maWd1cmluZyB0YXNrCi1BbnRFbGVtZW50Tm9kZV85PVwgW2Zyb20gezB9XQotCi1BbnRNb2RlbF8xPVwgbGluZToKLUFudE1vZGVsXzQzPURlZmF1bHQgdGFyZ2V0IHswfSBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIHByb2plY3QKLUFudE1vZGVsXzQ0PVRhcmdldCB7MH0gZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBwcm9qZWN0Ci1BbnRQcm9qZWN0Tm9kZVByb3h5XzA9QnVpbGRmaWxlIG5vdCBmb3VuZAotQW50UHJvamVjdE5vZGVQcm94eV8xPU5vIHRhcmdldHMgY291bGQgYmUgZGV0ZXJtaW5lZAotQW50RGVmaW5pbmdUYXNrTm9kZV8wPVRhc2sgY291bGQgbm90IGJlIGRlZmluZWQgd2l0aGluIHRoZSBBbnQgRWRpdG9yIGNvbnRleHQKLUFudERlZmluaW5nVGFza05vZGVfMT1TZWN1cml0eSBleGNlcHRpb24gYXR0ZW1wdGluZyB0byBkZWZpbmUgdHlwZQotQW50UHJvamVjdE5vZGVfMD08VW5hYmxlIHRvIHBhcnNlIGFzIGFuIEFudCBidWlsZGZpbGU+Ci1BbnRQcm9wZXJ0eU5vZGVfMD1Qcm9wZXJ0eSBjb3VsZCBub3QgYmUgc2V0IHdpdGhpbiB0aGUgQW50IEVkaXRvciBjb250ZXh0Ci1BbnRQcm9wZXJ0eU5vZGVfMT1TZWN1cml0eSBleGNlcHRpb24gYXR0ZW1wdGluZyB0byBzZXQgcHJvcGVydHkKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0FudE1vZGVsUHJvYmxlbS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50TW9kZWxQcm9ibGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZjMxZmQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50TW9kZWxQcm9ibGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci0KLXB1YmxpYyBjbGFzcyBBbnRNb2RlbFByb2JsZW0gZXh0ZW5kcyBSZWdpb24gaW1wbGVtZW50cyBJUHJvYmxlbSB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fUFJPQkxFTT0gLTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VWRVJJVFlfV0FSTklORz0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVZFUklUWV9FUlJPUj0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVZFUklUWV9GQVRBTF9FUlJPUj0gMjsKLQkKLQlwcml2YXRlIFN0cmluZyBmTWVzc2FnZTsKLQlwcml2YXRlIFN0cmluZyBmRXNjYXBlZE1lc3NhZ2U7Ci0JcHJpdmF0ZSBpbnQgZlNldmVyaXR5OwotCXByaXZhdGUgaW50IGZBZGp1c3RlZExlbmd0aD0gLTE7Ci0JcHJpdmF0ZSBpbnQgZkxpbmVOdW1iZXI9IC0xOwotCQotCXB1YmxpYyBBbnRNb2RlbFByb2JsZW0oU3RyaW5nIG1lc3NhZ2UsIGludCBzZXZlcml0eSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGxpbmVOdW1iZXIpIHsKLQkJc3VwZXIob2Zmc2V0LCBsZW5ndGgpOwotCQlmTWVzc2FnZT0gbWVzc2FnZTsKLQkJZkVzY2FwZWRNZXNzYWdlPSBnZXRFc2NhcGVkKG1lc3NhZ2UpOwotCQlmU2V2ZXJpdHk9IHNldmVyaXR5OwotCQlmTGluZU51bWJlcj0gbGluZU51bWJlcjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLklQcm9ibGVtI2dldE1lc3NhZ2UoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJcmV0dXJuIGZFc2NhcGVkTWVzc2FnZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLklQcm9ibGVtI2lzRXJyb3IoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXJyb3IoKSB7Ci0JCXJldHVybiBmU2V2ZXJpdHkgPT0gU0VWRVJJVFlfRVJST1IgfHwgZlNldmVyaXR5ID09IFNFVkVSSVRZX0ZBVEFMX0VSUk9SOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmUuSVByb2JsZW0jaXNXYXJuaW5nKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dhcm5pbmcoKSB7Ci0JCXJldHVybiBmU2V2ZXJpdHkgPT0gU0VWRVJJVFlfV0FSTklORzsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uI2dldExlbmd0aCgpCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCWlmIChmQWRqdXN0ZWRMZW5ndGggIT0gLTEpIHsKLQkJCXJldHVybiBmQWRqdXN0ZWRMZW5ndGg7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldExlbmd0aCgpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBsZW5ndGggZm9yIHRoaXMgcHJvYmxlbS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IGFkanVzdGVkTGVuZ3RoKSB7Ci0JCWZBZGp1c3RlZExlbmd0aD0gYWRqdXN0ZWRMZW5ndGg7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLklQcm9ibGVtI2dldExpbmVOdW1iZXIoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKLQkJcmV0dXJuIGZMaW5lTnVtYmVyOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYXBwZW5kRXNjYXBlZENoYXIoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgY2hhciBjKSB7Ci0JCVN0cmluZyByZXBsYWNlbWVudD0gZ2V0UmVwbGFjZW1lbnQoYyk7Ci0JCWlmIChyZXBsYWNlbWVudCAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHJlcGxhY2VtZW50KTsKLQkJfSBlbHNlIHsKLQkJCWJ1ZmZlci5hcHBlbmQoYyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RXNjYXBlZChTdHJpbmcgcykgewotCQlTdHJpbmdCdWZmZXIgcmVzdWx0PSBuZXcgU3RyaW5nQnVmZmVyKHMubGVuZ3RoKCkgKyAxMCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBzLmxlbmd0aCgpOyArK2kpIHsKLQkJCWFwcGVuZEVzY2FwZWRDaGFyKHJlc3VsdCwgcy5jaGFyQXQoaSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UmVwbGFjZW1lbnQoY2hhciBjKSB7Ci0JCS8vIEVuY29kZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW50byB0aGUgZXF1aXZhbGVudCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KLQkJLy8gRW5zdXJlcyB0aGF0IGVycm9yIG1lc3NhZ2VzIHRoYXQgaW5jbHVkZSBzcGVjaWFsIGNoYXJhY3RlcnMgZG8gbm90IGdldAotCQkvL2luY29ycmVjdGx5IHJlcHJlc2VudGVkIGFzIEhUTUwgaW4gdGhlIHRleHQgaG92ZXIgKGJ1ZyA1NjI1OCkKLQkJc3dpdGNoIChjKSB7Ci0JCQljYXNlICc8JyA6Ci0JCQkJcmV0dXJuICImbHQ7IjsgLy8kTk9OLU5MUy0xJAotCQkJY2FzZSAnPicgOgotCQkJCXJldHVybiAiJmd0OyI7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgJyInIDoKLQkJCQlyZXR1cm4gIiZxdW90OyI7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgJyYnIDoKLQkJCQlyZXR1cm4gIiZhbXA7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmUuSVByb2JsZW0jZ2V0VW5tb2RpZmllZE1lc3NhZ2UoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VW5tb2RpZmllZE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBmTWVzc2FnZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0U2V2ZXJpdHkoU3RyaW5nIHByZWZlcmVuY2VLZXkpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZT0gQW50VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlTdHJpbmcgc2V2ZXJpdHlMZXZlbD0gc3RvcmUuZ2V0U3RyaW5nKHByZWZlcmVuY2VLZXkpOwotCQlpZiAoc2V2ZXJpdHlMZXZlbC5sZW5ndGgoKSA9PSAwIHx8IHNldmVyaXR5TGV2ZWwuZXF1YWxzKEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuQlVJTERGSUxFX0VSUk9SKSkgewotCQkJcmV0dXJuIFNFVkVSSVRZX0VSUk9SOwotCQl9IGVsc2UgaWYgKHNldmVyaXR5TGV2ZWwuZXF1YWxzKEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuQlVJTERGSUxFX1dBUk5JTkcpKSB7Ci0JCQlyZXR1cm4gU0VWRVJJVFlfV0FSTklORzsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBOT19QUk9CTEVNOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWJvb2xlYW4gZXF1YWw9IHN1cGVyLmVxdWFscyhvKTsKLQkJaWYgKGVxdWFsKSB7Ci0JCQlyZXR1cm4gKChBbnRNb2RlbFByb2JsZW0pbykuZ2V0VW5tb2RpZmllZE1lc3NhZ2UoKS5lcXVhbHMoZ2V0VW5tb2RpZmllZE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0FudFByb2plY3ROb2RlUHJveHkuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0FudFByb2plY3ROb2RlUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ3NTAzMy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9BbnRQcm9qZWN0Tm9kZVByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotCi1wdWJsaWMgY2xhc3MgQW50UHJvamVjdE5vZGVQcm94eSBleHRlbmRzIEFudFByb2plY3ROb2RlIHsKLQkKLQlwcml2YXRlIFN0cmluZyBmQnVpbGRGaWxlTmFtZTsKLQlwcml2YXRlIFN0cmluZyBmRGVmYXVsdFRhcmdldE5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIGZQYXJzZWQ9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBwcm9qZWN0IG5vZGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdGhlIGdpdmVuIGJ1aWxkIGZpbGUKLQkgKiBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lIHRoZSBwcm9qZWN0J3MgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcHJvamVjdCdzCi0JICogbmFtZSBpcyBub3Qga25vd24uIElmIHRoaXMgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZSBmaWxlIHdpbGwgYmUKLQkgKiBwYXJzZWQgdGhlIGZpcnN0IHRpbWUgYSB2YWx1ZSBpcyByZXF1ZXN0ZWQgdGhhdCByZXF1aXJlcyBpdC4KLQkgKiBAcGFyYW0gYnVpbGRGaWxlTmFtZQotCSAqLwotCXB1YmxpYyBBbnRQcm9qZWN0Tm9kZVByb3h5KFN0cmluZyBuYW1lLCBTdHJpbmcgYnVpbGRGaWxlTmFtZSkgewotCQlzdXBlcihudWxsLCBudWxsKTsKLQkJZk5hbWU9IG5hbWU7Ci0JCWZCdWlsZEZpbGVOYW1lPSBidWlsZEZpbGVOYW1lOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHByb2plY3Qgbm9kZSBvbiB0aGUgZ2l2ZW4gYnVpbGQgZmlsZS4KLQkgKi8KLQlwdWJsaWMgQW50UHJvamVjdE5vZGVQcm94eShTdHJpbmcgYnVpbGRGaWxlTmFtZSkgewotCQl0aGlzKG51bGwsIGJ1aWxkRmlsZU5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwYXJzZUJ1aWxkRmlsZShib29sZWFuIGZvcmNlKSB7Ci0JCWlmIChmUGFyc2VkICYmICFmb3JjZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZDaGlsZE5vZGVzPSBudWxsOwotCQlmUGFyc2VkPSB0cnVlOwotCQlBbnRUYXJnZXROb2RlW10gbm9kZXMgPSBudWxsOwotCQlJUGF0aCBidWlsZEZpbGVQYXRoPSBBbnRVdGlsLmdldEZpbGUoZ2V0QnVpbGRGaWxlTmFtZSgpKS5nZXRMb2NhdGlvbigpOwotCQlpZiAoYnVpbGRGaWxlUGF0aCA9PSBudWxsKSB7Ci0JCQlzZXRQcm9ibGVtU2V2ZXJpdHkoQW50TW9kZWxQcm9ibGVtLlNFVkVSSVRZX0VSUk9SKTsKLQkJCXNldFByb2JsZW1NZXNzYWdlKEFudE1vZGVsTWVzc2FnZXMuQW50UHJvamVjdE5vZGVQcm94eV8wKTsKLQkJCXJldHVybjsKLQkJfQotCQlub2RlcyA9IEFudFV0aWwuZ2V0VGFyZ2V0cyhidWlsZEZpbGVQYXRoLnRvU3RyaW5nKCkpOwotCQkKLQkJaWYgKG5vZGVzID09IG51bGwgfHwgbm9kZXMubGVuZ3RoIDwgMSkgewotCQkJc2V0UHJvYmxlbVNldmVyaXR5KEFudE1vZGVsUHJvYmxlbS5TRVZFUklUWV9FUlJPUik7Ci0JCQlzZXRQcm9ibGVtTWVzc2FnZShBbnRNb2RlbE1lc3NhZ2VzLkFudFByb2plY3ROb2RlUHJveHlfMSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUFudFByb2plY3ROb2RlIHByb2plY3ROb2RlID0gbm9kZXNbMF0uZ2V0UHJvamVjdE5vZGUoKTsKLSAgICAgICAgaWYgKG5vZGVzWzBdLmdldFRhcmdldE5hbWUoKS5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICAvL25vdCBqdXN0IHRoZSBpbXBsaWNpdCB0YXJnZXQKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBhZGRDaGlsZE5vZGUobm9kZXNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0JCQotCQlmTW9kZWw9IHByb2plY3ROb2RlLmdldEFudE1vZGVsKCk7Ci0JCWZQcm9qZWN0PSAoQW50TW9kZWxQcm9qZWN0KXByb2plY3ROb2RlLmdldFByb2plY3QoKTsKLQkJZkxhYmVsPSBudWxsOwotCQlmTmFtZT0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcGFyc2VCdWlsZEZpbGUoKSB7Ci0JCXBhcnNlQnVpbGRGaWxlKGZhbHNlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudFByb2plY3ROb2RlI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlpZiAoZlByb2plY3QgIT0gbnVsbCkgewotCQkJcmV0dXJuIHN1cGVyLmdldERlc2NyaXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRFbGVtZW50Tm9kZSNnZXRMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkgICAgaWYgKGZOYW1lICE9IG51bGwpIHsKLQkgICAgICAgIHJldHVybiBmTmFtZTsKLQkgICAgfQotCQlpZiAoZlByb2plY3QgPT0gbnVsbCkgewotCQkJcGFyc2VCdWlsZEZpbGUoKTsKLQkJfQotCQlTdHJpbmdCdWZmZXIgbmFtZT0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci5nZXRMYWJlbCgpKTsKLQkJQW50UHJvamVjdE5vZGUgcmVhbE5vZGU9IGdldFJlYWxOb2RlKCk7Ci0JCWlmIChyZWFsTm9kZSAhPSBudWxsICYmIHJlYWxOb2RlLmdldFByb2JsZW1NZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJbmFtZS5hcHBlbmQoIiA8Iik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUuYXBwZW5kKGdldFJlYWxOb2RlKCkuZ2V0UHJvYmxlbU1lc3NhZ2UoKSk7Ci0JCQluYW1lLmFwcGVuZCgnPicpOwotCQl9Ci0JCWZOYW1lPSBuYW1lLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBmTmFtZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudEVsZW1lbnROb2RlI2dldENoaWxkTm9kZXMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldENoaWxkTm9kZXMoKSB7Ci0JCWlmIChmUHJvamVjdCA9PSBudWxsKSB7Ci0JCQlwYXJzZUJ1aWxkRmlsZSgpOwotCQl9Ci0JCUxpc3QgY2hpbGRyZW49IHN1cGVyLmdldENoaWxkTm9kZXMoKTsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRCdWlsZEZpbGVOYW1lKCkgewotCQlyZXR1cm4gZkJ1aWxkRmlsZU5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFRhcmdldE5hbWUoU3RyaW5nIGRlZmF1bHRUYXJnZXQpIHsKLQkJZkRlZmF1bHRUYXJnZXROYW1lPSBkZWZhdWx0VGFyZ2V0OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYXJnZXROYW1lKCkgewotCQlpZiAoZlByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZEZWZhdWx0VGFyZ2V0TmFtZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFRhcmdldE5hbWUoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudEVsZW1lbnROb2RlI2hhc0NoaWxkcmVuKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRFbGVtZW50Tm9kZSNkaXNwb3NlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBpZiAoZlByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRFbGVtZW50Tm9kZSNpc0Vycm9yTm9kZSgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFcnJvck5vZGUoKSB7Ci0gICAgICAgIGlmIChmUHJvamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuaXNFcnJvck5vZGUoKTsKLSAgICAgICAgfSAKLSAgICAgICAgcmV0dXJuIGdldFJlYWxOb2RlKCkuaXNFcnJvck5vZGUoKTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudEVsZW1lbnROb2RlI2dldFByb2JsZW1NZXNzYWdlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb2JsZW1NZXNzYWdlKCkgewotCQlpZiAoaXNFcnJvck5vZGUoKSkgewotCQkJcmV0dXJuIGdldEJ1aWxkRmlsZU5hbWUoKTsKLQkJfQotICAgIAlyZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudEVsZW1lbnROb2RlI2lzV2FybmluZ05vZGUoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzV2FybmluZ05vZGUoKSB7Ci0gICAgICAgIGlmIChmUHJvamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuaXNXYXJuaW5nTm9kZSgpOwotICAgICAgICB9IAotICAgICAgICByZXR1cm4gZ2V0UmVhbE5vZGUoKS5pc1dhcm5pbmdOb2RlKCk7Ci0gICAgfQotICAgIAotCXByaXZhdGUgQW50UHJvamVjdE5vZGUgZ2V0UmVhbE5vZGUoKSB7Ci0JCWlmIChmTW9kZWwgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZNb2RlbC5nZXRQcm9qZWN0Tm9kZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRFbGVtZW50Tm9kZSNnZXRBbnRNb2RlbCgpCi0JICovCi0JcHJvdGVjdGVkIElBbnRNb2RlbCBnZXRBbnRNb2RlbCgpIHsKLQkJaWYgKGZQcm9qZWN0ID09IG51bGwpIHsKLQkJCXBhcnNlQnVpbGRGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEFudE1vZGVsKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRFbGVtZW50Tm9kZSNnZXRMZW5ndGgoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlpZiAoZlByb2plY3QgPT0gbnVsbCkgewotCQkJcGFyc2VCdWlsZEZpbGUoKTsKLQkJfQotCQlBbnRQcm9qZWN0Tm9kZSByZWFsTm9kZT0gZ2V0UmVhbE5vZGUoKTsKLQkJaWYgKHJlYWxOb2RlID09IG51bGwpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlyZXR1cm4gcmVhbE5vZGUuZ2V0TGVuZ3RoKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRFbGVtZW50Tm9kZSNnZXRPZmZzZXQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlpZiAoZlByb2plY3QgPT0gbnVsbCkgewotCQkJcGFyc2VCdWlsZEZpbGUoKTsKLQkJfQotCQlBbnRQcm9qZWN0Tm9kZSByZWFsTm9kZT0gZ2V0UmVhbE5vZGUoKTsKLQkJaWYgKHJlYWxOb2RlID09IG51bGwpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlyZXR1cm4gcmVhbE5vZGUuZ2V0T2Zmc2V0KCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRFbGVtZW50Tm9kZSNnZXRTZWxlY3Rpb25MZW5ndGgoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2VsZWN0aW9uTGVuZ3RoKCkgewotCQlpZiAoZlByb2plY3QgPT0gbnVsbCkgewotCQkJcGFyc2VCdWlsZEZpbGUoKTsKLQkJfQotCQlBbnRQcm9qZWN0Tm9kZSByZWFsTm9kZT0gZ2V0UmVhbE5vZGUoKTsKLQkJaWYgKHJlYWxOb2RlID09IG51bGwpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlyZXR1cm4gcmVhbE5vZGUuZ2V0U2VsZWN0aW9uTGVuZ3RoKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRFbGVtZW50Tm9kZSNnZXRCdWlsZEZpbGVSZXNvdXJjZSgpCi0JICovCi0JcHVibGljIElGaWxlIGdldEJ1aWxkRmlsZVJlc291cmNlKCkgewotCQlpZiAoZlByb2plY3QgPT0gbnVsbCkgewotCQkJaWYgKGZCdWlsZEZpbGVOYW1lICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gQW50VXRpbC5nZXRGaWxlKGZCdWlsZEZpbGVOYW1lKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QnVpbGRGaWxlUmVzb3VyY2UoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldExhYmVsKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50VGFza05vZGUuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0FudFRhc2tOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YjRkZjQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvQW50VGFza05vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUnVudGltZUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudFNlY3VyaXR5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5BbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLQotCi1wdWJsaWMgY2xhc3MgQW50VGFza05vZGUgZXh0ZW5kcyBBbnRFbGVtZW50Tm9kZSB7Ci0KLQlwcml2YXRlIFRhc2sgZlRhc2s9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBmQmFzZUxhYmVsPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgZkxhYmVsOwotCXByaXZhdGUgU3RyaW5nIGZJZD0gbnVsbDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmQ29uZmlndXJlZD0gZmFsc2U7Ci0JCi0JcHVibGljIEFudFRhc2tOb2RlKFRhc2sgdGFzaykgewotCQlzdXBlcih0YXNrLmdldFRhc2tOYW1lKCkpOwotCQlmVGFzaz0gdGFzazsKLQl9Ci0JCi0JcHVibGljIEFudFRhc2tOb2RlKFRhc2sgdGFzaywgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKHRhc2suZ2V0VGFza05hbWUoKSk7Ci0JCWZUYXNrPSB0YXNrOwotCQlmQmFzZUxhYmVsPSBsYWJlbDsKLQl9CQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JICAgIGlmIChmTGFiZWwgPT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGxhYmVsPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpZiAoZkJhc2VMYWJlbCAhPSBudWxsKSB7Ci0JCQkJbGFiZWwuYXBwZW5kKGZCYXNlTGFiZWwpOwotCQkJfSBlbHNlIGlmIChmSWQgIT0gbnVsbCkgewotCQkJCWxhYmVsLmFwcGVuZChmSWQpOwotCQkJfSBlbHNlIHsKLQkJCQlsYWJlbC5hcHBlbmQoZlRhc2suZ2V0VGFza05hbWUoKSk7Ci0JCQl9Ci0JCQlpZiAoaXNFeHRlcm5hbCgpKSB7Ci0JCQkJYXBwZW5kRW50aXR5TmFtZShsYWJlbCk7Ci0JCQl9Ci0JCQlmTGFiZWw9IGxhYmVsLnRvU3RyaW5nKCk7Ci0JICAgIH0KLQkgICAgcmV0dXJuIGZMYWJlbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QmFzZUxhYmVsKFN0cmluZyBsYWJlbCkgewotCQlmQmFzZUxhYmVsPSBsYWJlbDsKLQl9Ci0JCi0JcHVibGljIFRhc2sgZ2V0VGFzaygpIHsKLQkJcmV0dXJuIGZUYXNrOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUYXNrKFRhc2sgdGFzaykgewotCQlmVGFzaz0gdGFzazsKLQl9Ci0JCi0JcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBnZXRCYXNlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlpZiAoZklkICE9IG51bGwpIHsKLQkJCXJldHVybiBBbnRVSUltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSUFudFVJQ29uc3RhbnRzLklNR19BTlRfVFlQRSk7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5nZXRCYXNlSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHJlZmVyZW5jZSBpZCBmb3IgdGhpcyB0YXNrCi0JICogQHBhcmFtIGlkIFRoZSByZWZlcmVuY2UgaWQgZm9yIHRoaXMgdGFzawotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQlmSWQ9IGlkOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2UgaWQgZm9yIHRoaXMgdGFzayBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIGl0IGhhcyBubyByZWZlcmVuY2UgaWQuCi0JICogQHJldHVybiBUaGUgcmVmZXJlbmNlIGlkIGZvciB0aGlzIHRhc2sKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZklkOwotCX0KLQkKLQkvKioKLQkgKiBDb25maWd1cmVzIHRoZSBhc3NvY2lhdGVkIHRhc2sgaWYgcmVxdWlyZWQuCi0JICogQWxsb3dzIHN1YmNsYXNzZXMgdG8gZG8gc3BlY2lmaWMgY29uZmlndXJhdGlvbiAoc3VjaCBhcyBleGVjdXRpbmcgdGhlIHRhc2spIGJ5Ci0JICogY2FsbGluZyA8Y29kZT5ub2RlU3BlY2lmaWNDb25maWd1cmU8L2NvZGU+Ci0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoaXMgbm9kZSBjb3VsZCBoYXZlIGltcGFjdCBvbiBvdGhlciBub2RlcwotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShib29sZWFuIHZhbGlkYXRlRnVsbHkpIHsKLQkJaWYgKGdldElkKCkgIT0gbnVsbCkgewotCQkJLy9lbnN1cmUgdGhhdCByZWZlcmVuY2VzIGFyZSBzZXQuLi5uZXcgZm9yIEFudCAxLjcKLQkJCXRyeSB7Ci0JCQkJZ2V0UHJvamVjdE5vZGUoKS5nZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKGdldElkKCkpOwotCQkJfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgewotCQkJCWhhbmRsZUJ1aWxkRXhjZXB0aW9uKGUsIEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuUFJPQkxFTV9UQVNLUyk7Ci0JCQl9Ci0JCX0gCi0JCWlmICghdmFsaWRhdGVGdWxseSB8fCAoZ2V0UGFyZW50Tm9kZSgpIGluc3RhbmNlb2YgQW50VGFza05vZGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGZDb25maWd1cmVkKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IHNldmVyaXR5PSBBbnRNb2RlbFByb2JsZW0uZ2V0U2V2ZXJpdHkoQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9CTEVNX1RBU0tTKTsKLQkJaWYgKHNldmVyaXR5ICE9IEFudE1vZGVsUHJvYmxlbS5OT19QUk9CTEVNKSB7Ci0JCSAgICAvL29ubHkgY29uZmlndXJlIGlmIHRoZSB1c2VyIGNhcmVzIGFib3V0IHRoZSBwcm9ibGVtcwotCQkJdHJ5IHsKLQkJCQlnZXRUYXNrKCkubWF5YmVDb25maWd1cmUoKTsKLQkJCQlmQ29uZmlndXJlZD0gdHJ1ZTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0JCQkJaGFuZGxlQnVpbGRFeGNlcHRpb24oYmUsIEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuUFJPQkxFTV9UQVNLUyk7Ci0JCQl9IGNhdGNoIChBbnRTZWN1cml0eUV4Y2VwdGlvbiBzZSkgewotCQkJCS8vZWl0aGVyIGEgc3lzdGVtIGV4aXQgb3Igc2V0dGluZyBvZiBzeXN0ZW0gcHJvcGVydHkgd2FzIGF0dGVtcHRlZAotCQkJCWhhbmRsZUJ1aWxkRXhjZXB0aW9uKG5ldyBCdWlsZEV4Y2VwdGlvbihBbnRNb2RlbE1lc3NhZ2VzLkFudFRhc2tOb2RlXzApLCBBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLlBST0JMRU1fU0VDVVJJVFkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVCdWlsZEV4Y2VwdGlvbihCdWlsZEV4Y2VwdGlvbiBiZSwgU3RyaW5nIHByZWZlcmVuY2VLZXkpIHsKLQkJaW50IHNldmVyaXR5PSBBbnRNb2RlbFByb2JsZW0uZ2V0U2V2ZXJpdHkocHJlZmVyZW5jZUtleSk7Ci0JCWlmIChzZXZlcml0eSAhPSBBbnRNb2RlbFByb2JsZW0uTk9fUFJPQkxFTSkgewotCQkJZ2V0QW50TW9kZWwoKS5oYW5kbGVCdWlsZEV4Y2VwdGlvbihiZSwgdGhpcywgc2V2ZXJpdHkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2NjdXJyZW5jZShTdHJpbmcgaWRlbnRpZmllcikgewotCQlSdW50aW1lQ29uZmlndXJhYmxlIHdyYXBwZXI9IGdldFRhc2soKS5nZXRSdW50aW1lQ29uZmlndXJhYmxlV3JhcHBlcigpOwotCQlNYXAgYXR0cmlidXRlTWFwPSB3cmFwcGVyLmdldEF0dHJpYnV0ZU1hcCgpOwotCQlTZXQga2V5cz0gYXR0cmlidXRlTWFwLmtleVNldCgpOwotICAgICAgICBib29sZWFuIGxvb2tpbmdGb3JQcm9wZXJ0eT0gaWRlbnRpZmllci5zdGFydHNXaXRoKCIkeyIpICYmIGlkZW50aWZpZXIuZW5kc1dpdGgoIn0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGtleXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJU3RyaW5nIGtleT0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgdmFsdWU9IChTdHJpbmcpIGF0dHJpYnV0ZU1hcC5nZXQoa2V5KTsKLSAgICAgICAgICAgIGlmIChsb29raW5nRm9yUHJvcGVydHkgJiYgKGtleS5lcXVhbHMoImlmIikgfHwga2V5LmVxdWFscygidW5sZXNzIikpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKGlkZW50aWZpZXIuc3Vic3RyaW5nKDIsIGlkZW50aWZpZXIubGVuZ3RoKCkgLSAxKSkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKGlkZW50aWZpZXIpICE9IC0xKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIHRleHQ9IHdyYXBwZXIuZ2V0VGV4dCgpOwotCQlpZiAodGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCWlmIChsb29raW5nRm9yUHJvcGVydHkgJiYgdGV4dC5pbmRleE9mKGlkZW50aWZpZXIpICE9IC0xKSB7Ci0JCQkJcmV0dXJuIHRydWU7IC8vcHJvcGVydHkgcmVmIGluIHRleHQKLQkJCX0KLQkJfQotCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIExpc3QgY29tcHV0ZUlkZW50aWZpZXJPZmZzZXRzKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0gICAgICAgIFN0cmluZyB0ZXh0VG9TZWFyY2g9IGdldEFudE1vZGVsKCkuZ2V0VGV4dChnZXRPZmZzZXQoKSwgZ2V0TGVuZ3RoKCkpOwotICAgICAgICBpZiAodGV4dFRvU2VhcmNoID09IG51bGwgfHwgdGV4dFRvU2VhcmNoLmxlbmd0aCgpID09IDAgfHwgaWRlbnRpZmllci5sZW5ndGgoKSA9PTApIHsKLSAgICAgICAgCXJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIExpc3QgcmVzdWx0cz0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBSdW50aW1lQ29uZmlndXJhYmxlIHdyYXBwZXI9IGdldFRhc2soKS5nZXRSdW50aW1lQ29uZmlndXJhYmxlV3JhcHBlcigpOwotICAgICAgICBNYXAgYXR0cmlidXRlTWFwPSB3cmFwcGVyLmdldEF0dHJpYnV0ZU1hcCgpOwotICAgICAgICBTZXQga2V5cz0gYXR0cmlidXRlTWFwLmtleVNldCgpOwotCQlTdHJpbmcgbGluZVNlcD0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGtleXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlPSAoU3RyaW5nKSBhdHRyaWJ1dGVNYXAuZ2V0KGtleSk7Ci0JCQlpbnQgaWRlbnRpZmllckNvcnJlY3Rpb249IDE7Ci0gICAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZihpZGVudGlmaWVyKSAhPSAtMSkgewotICAgICAgICAgICAgICAgIGludCBrZXlPZmZzZXQ9IHRleHRUb1NlYXJjaC5pbmRleE9mKGtleSk7Ci0JCQkJd2hpbGUgKGtleU9mZnNldCA+IDAgJiYgIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UodGV4dFRvU2VhcmNoLmNoYXJBdChrZXlPZmZzZXQgLSAxKSkpIHsKLQkJCQkJa2V5T2Zmc2V0PSB0ZXh0VG9TZWFyY2guaW5kZXhPZihrZXksIGtleU9mZnNldCArIDEpOwotCQkJCX0KLSAgICAgICAgICAgICAgICBpbnQgdmFsdWVPZmZzZXQ9IHRleHRUb1NlYXJjaC5pbmRleE9mKCciJywga2V5T2Zmc2V0KTsKLQkJCQlpbnQgdmFsdWVMaW5lPSAoKEFudE1vZGVsKWdldEFudE1vZGVsKCkpLmdldExpbmUoZ2V0T2Zmc2V0KCkgKyB2YWx1ZU9mZnNldCk7Ci0JCQkJCi0gICAgICAgICAgICAgICAgaW50IHdpdGhpblZhbHVlT2Zmc2V0PSB2YWx1ZS5pbmRleE9mKGlkZW50aWZpZXIpOwotICAgICAgICAgICAgICAgIHdoaWxlICh3aXRoaW5WYWx1ZU9mZnNldCAhPSAtMSkgewotCQkJCQlpbnQgcmVzdWx0TGluZT0gKChBbnRNb2RlbClnZXRBbnRNb2RlbCgpKS5nZXRMaW5lKGdldE9mZnNldCgpICsgdmFsdWVPZmZzZXQgKyB3aXRoaW5WYWx1ZU9mZnNldCk7Ci0JCQkJCS8vdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgYXR0cmlidXRlIG1hcCBzZWVtcyB0byBiZSBtb2RpZmllZCB0byBub3QgY29udGFpbiBjb250cm9sIGNoYXJhY3RlcnMKLQkJCQkJLy9uZXcgbGluZXMsIGNhcnJpYWdlIHJldHVybnMgYW5kIHRoZXNlIGFyZSByZXBsYWNlZCB3aXRoIHNwYWNlcwotCQkJCQkvL3NvIGlmIHRoZSBsaW5lIHNlcGFyYXRvciBpcyBncmVhdGVyIHRoYW4gMSBpbiBsZW5ndGggd2UgbmVlZCB0byBjb3JyZWN0IGZvciB0aGlzCi0JCQkJCWludCByZXN1bHRPZmZzZXQ9IGdldE9mZnNldCgpICsgdmFsdWVPZmZzZXQgKyB3aXRoaW5WYWx1ZU9mZnNldCArIGlkZW50aWZpZXJDb3JyZWN0aW9uICsgKChyZXN1bHRMaW5lIC0gdmFsdWVMaW5lKSAqIChsaW5lU2VwLmxlbmd0aCgpIC0gMSkpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChuZXcgSW50ZWdlcihyZXN1bHRPZmZzZXQpKTsKLSAgICAgICAgICAgICAgICAgICAgd2l0aGluVmFsdWVPZmZzZXQ9IHZhbHVlLmluZGV4T2YoaWRlbnRpZmllciwgd2l0aGluVmFsdWVPZmZzZXQgKyAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgCVN0cmluZyB0ZXh0PSB3cmFwcGVyLmdldFRleHQoKS50b1N0cmluZygpLnRyaW0oKTsKLSAgICAJaWYgKHRleHQubGVuZ3RoKCkgPiAwKSB7Ci0gICAgCQlpbnQgb2Zmc2V0PSB0ZXh0VG9TZWFyY2guaW5kZXhPZih0ZXh0LnRvU3RyaW5nKCkpOwotICAgIAkJb2Zmc2V0PSB0ZXh0VG9TZWFyY2guaW5kZXhPZihpZGVudGlmaWVyLCBvZmZzZXQpOwotICAgIAkJcmVzdWx0cy5hZGQobmV3IEludGVnZXIob2Zmc2V0ICsgZ2V0T2Zmc2V0KCkpKTsKLSAgICAJfQotICAgICAgICByZXR1cm4gcmVzdWx0czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9JQW50RWxlbWVudC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvSUFudEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE5MThkMS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9JQW50RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gdGFnIGFsbCBBbnQgZWxlbWVudHMgZm9yIGFkYXB0ZXIgZmFjdG9yeSAtIGN1cnJlbnRseSBlbXB0eS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQW50RWxlbWVudCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0lBbnRNb2RlbExpc3RlbmVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9JQW50TW9kZWxMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzMyMDcwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0lBbnRNb2RlbExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUFudE1vZGVsTGlzdGVuZXIgewotCQotCXB1YmxpYyB2b2lkIGFudE1vZGVsQ2hhbmdlZChBbnRNb2RlbENoYW5nZUV2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0lQcm9ibGVtLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9JUHJvYmxlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTY0NDgxLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0lQcm9ibGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9ibGVtIGV4dGVuZHMgSVJlZ2lvbiB7Ci0KLQkvKioKLQkgKiBBbnN3ZXIgYSBsb2NhbGl6ZWQsIGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2Ugc3RyaW5nIHdoaWNoIGRlc2NyaWJlcyB0aGUgcHJvYmxlbS4KLQkgKiBUaGUgbWVzc2FnZSBoYXMgYmVlbiAiZXNjYXBlZCIgdG8gaGFuZGxlIHNwZWNpYWwgY2hhcmFjdGVycy4KLQkgKgotCSAqIEByZXR1cm4gYSBsb2NhbGl6ZWQsIGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2Ugc3RyaW5nIHdoaWNoIGRlc2NyaWJlcyB0aGUgcHJvYmxlbQotCSAqLwotCVN0cmluZyBnZXRNZXNzYWdlKCk7Ci0JCi0JLyoqCi0JICogQW5zd2VyIGEgbG9jYWxpemVkLCBodW1hbi1yZWFkYWJsZSBtZXNzYWdlIHN0cmluZyB3aGljaCBkZXNjcmliZXMgdGhlIHByb2JsZW0uCi0JICogVGhlIG1lc3NhZ2UgaXMgaW4gaXRzIG9yaWdpbmFsIGZvcm07IHNwZWNpYWwgY2hhcmFjdGVycyBoYXZlIG5vdCBiZWVuIGVzY2FwZWQuCi0JICoKLQkgKiBAcmV0dXJuIGxvY2FsaXplZCwgaHVtYW4tcmVhZGFibGUgbWVzc2FnZSBzdHJpbmcgd2hpY2ggZGVzY3JpYmVzIHRoZSBwcm9ibGVtCi0JICovCi0JU3RyaW5nIGdldFVubW9kaWZpZWRNZXNzYWdlKCk7Ci0KLQkvKioKLQkgKiBDaGVja3MgdGhlIHNldmVyaXR5IHRvIHNlZSBpZiB0aGUgRXJyb3IgYml0IGlzIHNldC4KLQkgKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgRXJyb3IgYml0IGlzIHNldCBmb3IgdGhlIHNldmVyaXR5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlib29sZWFuIGlzRXJyb3IoKTsKLQotCS8qKgotCSAqIENoZWNrcyB0aGUgc2V2ZXJpdHkgdG8gc2VlIGlmIHRoZSBFcnJvciBiaXQgaXMgbm90IHNldC4KLQkgKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgRXJyb3IgYml0IGlzIG5vdCBzZXQgZm9yIHRoZSBzZXZlcml0eSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JYm9vbGVhbiBpc1dhcm5pbmcoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaW5lIG51bWJlciBvZiB0aGlzIHByb2JsZW0uCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBsaW5lIG51bWJlciBvZiB0aGlzIHByb2JsZW0KLQkgKi8KLQlpbnQgZ2V0TGluZU51bWJlcigpOwotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvSVByb2JsZW1SZXF1ZXN0b3IuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0lQcm9ibGVtUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NWRlMDAuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvbW9kZWwvSVByb2JsZW1SZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9ibGVtUmVxdWVzdG9yIHsKLQotCS8qKgotCSAqIE5vdGlmaWNhdGlvbiBvZiBhIEFudCBidWlsZGZpbGUgcHJvYmxlbS4KLQkgKgotCSAqIEBwYXJhbSBwcm9ibGVtIElQcm9ibGVtIC0gVGhlIGRpc2NvdmVyZWQgQW50IGJ1aWxkZmlsZSBwcm9ibGVtLgotCSAqLwotCXZvaWQgYWNjZXB0UHJvYmxlbShJUHJvYmxlbSBwcm9ibGVtKTsKLQotCS8qKgotCSAqIE5vdGlmaWNhdGlvbiBzZW50IGJlZm9yZSBzdGFydGluZyB0aGUgcHJvYmxlbSBkZXRlY3Rpb24gcHJvY2Vzcy4KLQkgKiBUeXBpY2FsbHksIHRoaXMgd291bGQgdGVsbCBhIHByb2JsZW0gY29sbGVjdG9yIHRvIGNsZWFyIHByZXZpb3VzbHkgcmVjb3JkZWQgcHJvYmxlbXMuCi0JICovCi0Jdm9pZCBiZWdpblJlcG9ydGluZygpOwotCi0JLyoqCi0JICogTm90aWZpY2F0aW9uIHNlbnQgYWZ0ZXIgaGF2aW5nIGNvbXBsZXRlZCBwcm9ibGVtIGRldGVjdGlvbiBwcm9jZXNzLgotCSAqIFR5cGljYWxseSwgdGhpcyB3b3VsZCB0ZWxsIGEgcHJvYmxlbSBjb2xsZWN0b3IgdGhhdCBubyBtb3JlIHByb2JsZW1zIHNob3VsZCBiZSBleHBlY3RlZCBpbiB0aGlzCi0JICogaXRlcmF0aW9uLgotCSAqLwotCXZvaWQgZW5kUmVwb3J0aW5nKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0ludGVybmFsVGFyZ2V0RmlsdGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9JbnRlcm5hbFRhcmdldEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTBkYWE1Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0ludGVybmFsVGFyZ2V0RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci0KLQotcHVibGljIGNsYXNzIEludGVybmFsVGFyZ2V0RmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLQkKLQlwcml2YXRlIGludCBmRmlsdGVyZWQ9IDA7Ci0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiB0YXJnZXQgaXMgYW4gaW50ZXJuYWwgdGFyZ2V0LiBJbnRlcm5hbAotCSAqIHRhcmdldHMgYXJlIHRhcmdldHMgd2hpY2ggaGF2ZSBubyBkZXNjcmlwdGlvbi4gVGhlIGRlZmF1bHQgdGFyZ2V0Ci0JICogaXMgbmV2ZXIgY29uc2lkZXJlZCBpbnRlcm5hbC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWJvb2xlYW4gcmVzdWx0PSB0cnVlOwotCQlpZiAodmlld2VyIGluc3RhbmNlb2YgQ2hlY2tib3hUYWJsZVZpZXdlcikgewotCQkgICAgaWYgKCgoQ2hlY2tib3hUYWJsZVZpZXdlcil2aWV3ZXIpLmdldENoZWNrZWQoZWxlbWVudCkpIHsKLQkJICAgICAgICAvL2RvIG5vdCBmaWx0ZXIgb3V0IChzZWxlY3RlZCkgY2hlY2tlZCBpdGVtcwotCQkgICAgICAgIHJldHVybiB0cnVlOwotCQkgICAgfQotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQW50VGFyZ2V0Tm9kZSkgewotCQkJcmVzdWx0ID0gISgoQW50VGFyZ2V0Tm9kZSllbGVtZW50KS5pc0ludGVybmFsKCk7Ci0JCX0gCi0JCWlmICghcmVzdWx0KSB7Ci0JCQlmRmlsdGVyZWQrKzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlciNmaWx0ZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3RbXSkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZmlsdGVyKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0JCWZGaWx0ZXJlZD0gMDsKLQkJcmV0dXJuIHN1cGVyLmZpbHRlcih2aWV3ZXIsIHBhcmVudCwgZWxlbWVudHMpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldE51bWJlck9mVGFyZ2V0c0ZpbHRlcmVkKCkgewotCQlyZXR1cm4gZkZpbHRlcmVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0xvY2F0aW9uUHJvdmlkZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL21vZGVsL0xvY2F0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY2ZTMzYS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9tb2RlbC9Mb2NhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuSUxvY2F0aW9uUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBMb2NhdGlvblByb3ZpZGVyIHsKLQlwcml2YXRlIElFZGl0b3JJbnB1dCBmRWRpdG9ySW5wdXQ7Ci0JCi0JcHVibGljIExvY2F0aW9uUHJvdmlkZXIoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCWZFZGl0b3JJbnB1dD0gaW5wdXQ7Ci0JfQotCi0JcHVibGljIElQYXRoIGdldExvY2F0aW9uKCkgewotCQlpZiAoZkVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJcmV0dXJuICgoSUZpbGVFZGl0b3JJbnB1dClmRWRpdG9ySW5wdXQpLmdldEZpbGUoKS5nZXRMb2NhdGlvbigpOwotCQl9Ci0JCUlMb2NhdGlvblByb3ZpZGVyIGxvY2F0aW9uUHJvdmlkZXI9IChJTG9jYXRpb25Qcm92aWRlcilmRWRpdG9ySW5wdXQuZ2V0QWRhcHRlcihJTG9jYXRpb25Qcm92aWRlci5jbGFzcyk7Ci0JCWlmIChsb2NhdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBsb2NhdGlvblByb3ZpZGVyLmdldFBhdGgoZkVkaXRvcklucHV0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCWlmKGZFZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCXJldHVybiAoKElGaWxlRWRpdG9ySW5wdXQpZkVkaXRvcklucHV0KS5nZXRGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQWJzdHJhY3RDbGFzc3BhdGhFbnRyeS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQWJzdHJhY3RDbGFzc3BhdGhFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTJkZjM2Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0Fic3RyYWN0Q2xhc3NwYXRoRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5JQW50Q2xhc3NwYXRoRW50cnk7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENsYXNzcGF0aEVudHJ5IGltcGxlbWVudHMgSUNsYXNzcGF0aEVudHJ5IHsKLQotCXByb3RlY3RlZCBMaXN0IGZDaGlsZEVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIElDbGFzc3BhdGhFbnRyeSBmUGFyZW50ID0gbnVsbDsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5JQ2xhc3NwYXRoRW50cnkjZ2V0RW50cmllcygpCi0JICovCi0JcHVibGljIElBbnRDbGFzc3BhdGhFbnRyeVtdIGdldEVudHJpZXMoKSB7Ci0JCXJldHVybiAoSUFudENsYXNzcGF0aEVudHJ5W10pZkNoaWxkRW50cmllcy50b0FycmF5KG5ldyBJQW50Q2xhc3NwYXRoRW50cnlbZkNoaWxkRW50cmllcy5zaXplKCldKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuSUNsYXNzcGF0aEVudHJ5I2hhc0VudHJpZXMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0VudHJpZXMoKSB7Ci0JCXJldHVybiAhZkNoaWxkRW50cmllcy5pc0VtcHR5KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLklDbGFzc3BhdGhFbnRyeSNnZXRQYXJlbnQoKQotCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnkgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gZlBhcmVudDsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoSUNsYXNzcGF0aEVudHJ5IHBhcmVudCkgewotCQlmUGFyZW50ID0gcGFyZW50OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuY29yZS5JQW50Q2xhc3NwYXRoRW50cnkjZ2V0RW50cnlVUkwoKQotCSAqLwotCXB1YmxpYyBVUkwgZ2V0RW50cnlVUkwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5jb3JlLklBbnRDbGFzc3BhdGhFbnRyeSNnZXRMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIHRvU3RyaW5nKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmNvcmUuSUFudENsYXNzcGF0aEVudHJ5I2lzRWNsaXBzZVJ1bnRpbWVSZXF1aXJlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFY2xpcHNlUnVudGltZVJlcXVpcmVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQWRkUHJvcGVydHlEaWFsb2cuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FkZFByb3BlcnR5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMjVlMmIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQWRkUHJvcGVydHlEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5TdHJpbmdWYXJpYWJsZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotcHVibGljIGNsYXNzIEFkZFByb3BlcnR5RGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCXByaXZhdGUgU3RyaW5nIGZOYW1lOwotCXByaXZhdGUgU3RyaW5nIGZWYWx1ZTsKLQotCXByaXZhdGUgU3RyaW5nIGZUaXRsZTsKLQkKLQlwcml2YXRlIExhYmVsIGZOYW1lTGFiZWw7Ci0JcHJpdmF0ZSBUZXh0IGZOYW1lVGV4dDsKLQlwcml2YXRlIExhYmVsIGZWYWx1ZUxhYmVsOwotCXByaXZhdGUgVGV4dCBmVmFsdWVUZXh0OwotCQotCXByaXZhdGUgU3RyaW5nW10gZkluaXRpYWxWYWx1ZXM7Ci0KLQlwdWJsaWMgQWRkUHJvcGVydHlEaWFsb2coU2hlbGwgc2hlbGwsIFN0cmluZyB0aXRsZSwgU3RyaW5nW10gaW5pdGlhbFZhbHVlcykgewotCQlzdXBlcihzaGVsbCk7Ci0JCWZUaXRsZSA9IHRpdGxlOwotCQlmSW5pdGlhbFZhbHVlcz0gaW5pdGlhbFZhbHVlczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJKChHcmlkTGF5b3V0KSBjb21wLmdldExheW91dCgpKS5udW1Db2x1bW5zID0gMjsKLQkJCi0JCWZOYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOwotCQlmTmFtZUxhYmVsLnNldFRleHQoQW50UHJlZmVyZW5jZXNNZXNzYWdlcy5BZGRQcm9wZXJ0eURpYWxvZ19fTmFtZV9fMSk7Ci0JCWZOYW1lTGFiZWwuc2V0Rm9udChjb21wLmdldEZvbnQoKSk7Ci0JCQotCQlmTmFtZVRleHQgPSBuZXcgVGV4dChjb21wLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSk7Ci0JCWZOYW1lVGV4dC5zZXRUZXh0KGZJbml0aWFsVmFsdWVzWzBdKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2Qud2lkdGhIaW50ID0gMzAwOwotCQlmTmFtZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWZOYW1lVGV4dC5zZXRGb250KGNvbXAuZ2V0Rm9udCgpKTsKLQkJZk5hbWVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlmVmFsdWVMYWJlbCA9IG5ldyBMYWJlbChjb21wLCBTV1QuTk9ORSk7Ci0JCWZWYWx1ZUxhYmVsLnNldFRleHQoQW50UHJlZmVyZW5jZXNNZXNzYWdlcy5BZGRQcm9wZXJ0eURpYWxvZ19fVmFsdWVfXzIpOwotCQlmVmFsdWVMYWJlbC5zZXRGb250KGNvbXAuZ2V0Rm9udCgpKTsKLQkJCi0JCWZWYWx1ZVRleHQgPSBuZXcgVGV4dChjb21wLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSk7Ci0JCWZWYWx1ZVRleHQuc2V0VGV4dChmSW5pdGlhbFZhbHVlc1sxXSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLndpZHRoSGludCA9IDMwMDsKLQkJZlZhbHVlVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZlZhbHVlVGV4dC5zZXRGb250KGNvbXAuZ2V0Rm9udCgpKTsKLQkJZlZhbHVlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQl1cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwkJCi0JCQotCQlCdXR0b24gdmFyaWFibGVzQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuUFVTSCk7Ci0JCXZhcmlhYmxlc0J1dHRvbi5zZXRUZXh0KEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQWRkUHJvcGVydHlEaWFsb2dfMik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlpbnQgd2lkdGhIaW50ID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpOwotCQlnZC53aWR0aEhpbnQgPSBNYXRoLm1heCh3aWR0aEhpbnQsIHZhcmlhYmxlc0J1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpLngpOwotCQl2YXJpYWJsZXNCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXZhcmlhYmxlc0J1dHRvbi5zZXRGb250KGNvbXAuZ2V0Rm9udCgpKTsKLQkJCi0JCXZhcmlhYmxlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlKSB7Ci0JCQkJZ2V0VmFyaWFibGUoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gY29tcDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZ2V0VmFyaWFibGUoKSB7Ci0JCVN0cmluZ1ZhcmlhYmxlU2VsZWN0aW9uRGlhbG9nIHZhcmlhYmxlc0RpYWxvZyA9IG5ldyBTdHJpbmdWYXJpYWJsZVNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpKTsKLQkJaW50IHJldHVybkNvZGUgPSB2YXJpYWJsZXNEaWFsb2cub3BlbigpOwotCQlpZiAocmV0dXJuQ29kZSA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQlTdHJpbmcgdmFyaWFibGUgPSB2YXJpYWJsZXNEaWFsb2cuZ2V0VmFyaWFibGVFeHByZXNzaW9uKCk7Ci0JCQlpZiAodmFyaWFibGUgIT0gbnVsbCkgewotCQkJCWZWYWx1ZVRleHQuaW5zZXJ0KHZhcmlhYmxlLnRyaW0oKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUvdmFsdWUgcGFpciBlbnRlcmVkIGluIHRoaXMgZGlhbG9nLiAgSWYgdGhlIGNhbmNlbCBidXR0b24gd2FzIGhpdCwKLQkgKiBib3RoIHdpbGwgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldE5hbWVWYWx1ZVBhaXIoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10ge2ZOYW1lLCBmVmFsdWV9OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNidXR0b25QcmVzc2VkKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQlpZiAoYnV0dG9uSWQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ4MzE2Ci0JCQlmTmFtZT0gZk5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JCQlmVmFsdWUgPSBmVmFsdWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JCX0gZWxzZSB7Ci0JCQlmTmFtZSA9IG51bGw7Ci0JCQlmVmFsdWUgPSBudWxsOwotCQl9Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NvbmZpZ3VyZVNoZWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJaWYgKGZUaXRsZSAhPSBudWxsKSB7Ci0JCQlzaGVsbC5zZXRUZXh0KGZUaXRsZSk7Ci0JCX0KLQkJaWYgKGZJbml0aWFsVmFsdWVzWzBdLmxlbmd0aCgpID09IDApIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc2hlbGwsIElBbnRVSUhlbHBDb250ZXh0SWRzLkFERF9QUk9QRVJUWV9ESUFMT0cpOwotCQl9IGVsc2UgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzaGVsbCwgSUFudFVJSGVscENvbnRleHRJZHMuRURJVF9QUk9QRVJUWV9ESUFMT0cpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEVuYWJsZSB0aGUgT0sgYnV0dG9uIGlmIHZhbGlkIGlucHV0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQnV0dG9ucygpIHsKLQkJU3RyaW5nIG5hbWUgPSBmTmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJU3RyaW5nIHZhbHVlID0gZlZhbHVlVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCQlnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZCgobmFtZS5sZW5ndGgoKSA+IDApICYmKHZhbHVlLmxlbmd0aCgpID4gMCkpOwotCX0KLQkKLQkvKioKLQkgKiBFbmFibGUgdGhlIGJ1dHRvbnMgb24gY3JlYXRpb24uCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NyZWF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlKCkgewotCQlzdXBlci5jcmVhdGUoKTsKLQkJdXBkYXRlQnV0dG9ucygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FudENsYXNzcGF0aENvbnRlbnRQcm92aWRlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQW50Q2xhc3NwYXRoQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzBjN2UuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQW50Q2xhc3NwYXRoQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIENvbnRlbnQgcHJvdmlkZXIgdGhhdCBtYWludGFpbnMgYSBsaXN0IG9mIGNsYXNzcGF0aCBlbnRyaWVzIHdoaWNoIGFyZSBzaG93biBpbiBhIHRyZWUKLSAqIHZpZXdlci4KLSAqLwotcHVibGljIGNsYXNzIEFudENsYXNzcGF0aENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQlwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQlwcml2YXRlIENsYXNzcGF0aE1vZGVsIG1vZGVsPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiByZWZyZXNoRW5hYmxlZD0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHJlZnJlc2hSZXF1ZXN0ZWQ9IGZhbHNlOwotCQkKLQlwdWJsaWMgdm9pZCBhZGQoSUNsYXNzcGF0aEVudHJ5IHBhcmVudCwgT2JqZWN0IGNoaWxkKSB7Ci0JCU9iamVjdCBuZXdFbnRyeT0gbnVsbDsKLQkJYm9vbGVhbiBhZGRlZD0gZmFsc2U7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQgPT0gbW9kZWwpIHsKLQkJCWFkZGVkPSB0cnVlOwotCQkJbmV3RW50cnk9IG1vZGVsLmFkZEVudHJ5KGNoaWxkKTsKLQkJCWlmIChuZXdFbnRyeSA9PSBudWxsKSB7Ci0JCQkJLy9lbnRyeSBhbHJlYWR5IGV4aXN0cwotCQkJCW5ld0VudHJ5PSBtb2RlbC5jcmVhdGVFbnRyeShjaGlsZCwgbW9kZWwpOwotCQkJCWFkZGVkPSBmYWxzZTsKLQkJCX0KLQkJCXBhcmVudD0gbW9kZWw7Ci0JCX0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgR2xvYmFsQ2xhc3NwYXRoRW50cmllcykgewotCQkJR2xvYmFsQ2xhc3NwYXRoRW50cmllcyBnbG9iYWxQYXJlbnQ9IChHbG9iYWxDbGFzc3BhdGhFbnRyaWVzKSBwYXJlbnQ7Ci0JCQluZXdFbnRyeT0gbW9kZWwuY3JlYXRlRW50cnkoY2hpbGQsIGdsb2JhbFBhcmVudCk7Ci0JCQlDbGFzc3BhdGhFbnRyeSBuZXdDbGFzc3BhdGhFbnRyeT0gKENsYXNzcGF0aEVudHJ5KSBuZXdFbnRyeTsKLQkJCWlmICghZ2xvYmFsUGFyZW50LmNvbnRhaW5zKG5ld0NsYXNzcGF0aEVudHJ5KSkgewotCQkJCWFkZGVkPSB0cnVlOwotCQkJCWdsb2JhbFBhcmVudC5hZGRFbnRyeShuZXdDbGFzc3BhdGhFbnRyeSk7Ci0JCQl9Ci0JCX0gCi0JCWlmIChuZXdFbnRyeSAhPSBudWxsKSB7Ci0JCQlpZiAoYWRkZWQpIHsKLQkJCQl0cmVlVmlld2VyLmFkZChwYXJlbnQsIG5ld0VudHJ5KTsKLQkJCX0KLQkJCXRyZWVWaWV3ZXIuc2V0RXhwYW5kZWRTdGF0ZShwYXJlbnQsIHRydWUpOwotCQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3RW50cnkpLCB0cnVlKTsKLQkJCXJlZnJlc2goKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGQoaW50IGVudHJ5VHlwZSwgT2JqZWN0IGNoaWxkKSB7Ci0JCU9iamVjdCBuZXdFbnRyeT0gbW9kZWwuYWRkRW50cnkoZW50cnlUeXBlLCBjaGlsZCk7Ci0JCWlmIChuZXdFbnRyeSAhPSBudWxsKSB7Ci0JCQl0cmVlVmlld2VyLmFkZChnZXRQYXJlbnQobmV3RW50cnkpLCBuZXdFbnRyeSk7Ci0JCQlyZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGwoKSB7Ci0JCW1vZGVsLnJlbW92ZUFsbCgpOwotCQlyZWZyZXNoKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZWZyZXNoKCkgewotCQlpZiAocmVmcmVzaEVuYWJsZWQpIHsKLQkJCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCQkJcmVmcmVzaFJlcXVlc3RlZD0gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlyZWZyZXNoUmVxdWVzdGVkPSB0cnVlOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbEdsb2JhbEFudENsYXNzcGF0aEVudHJpZXMoKSB7Ci0JCW1vZGVsLnJlbW92ZUFsbChDbGFzc3BhdGhNb2RlbC5BTlRfSE9NRSk7Ci0JCXJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElUcmVlQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDbGFzc3BhdGhFbnRyeSkgewotCQkJcmV0dXJuICgoQ2xhc3NwYXRoRW50cnkpZWxlbWVudCkuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBHbG9iYWxDbGFzc3BhdGhFbnRyaWVzKSB7Ci0JCQlyZXR1cm4gbW9kZWw7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2xhc3NwYXRoRW50cnkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEdsb2JhbENsYXNzcGF0aEVudHJpZXMpIHsKLQkJCXJldHVybiAoKEdsb2JhbENsYXNzcGF0aEVudHJpZXMpZWxlbWVudCkuaGFzRW50cmllcygpOwotCQkJCi0JCX0gCi0JCQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENsYXNzcGF0aE1vZGVsKSB7Ci0JCQlyZXR1cm4gKChDbGFzc3BhdGhNb2RlbCkgZWxlbWVudCkuaGFzRW50cmllcygpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JfQotCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQl0cmVlVmlld2VyID0gKFRyZWVWaWV3ZXIpIHZpZXdlcjsKLQkJCi0JCWlmIChuZXdJbnB1dCAhPSBudWxsKSB7Ci0JCQltb2RlbD0gKENsYXNzcGF0aE1vZGVsKW5ld0lucHV0OwotCQl9IGVsc2UgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5yZW1vdmVBbGwoKTsKLQkJCX0KLQkJCW1vZGVsPSBudWxsOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEdsb2JhbENsYXNzcGF0aEVudHJpZXMpIHsKLQkJCXJldHVybiAoKEdsb2JhbENsYXNzcGF0aEVudHJpZXMpcGFyZW50RWxlbWVudCkuZ2V0RW50cmllcygpOwotCQl9Ci0JCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQ2xhc3NwYXRoTW9kZWwpIHsKLQkJCXJldHVybiAoKENsYXNzcGF0aE1vZGVsKXBhcmVudEVsZW1lbnQpLmdldEVudHJpZXMoKTsKLQkJfQotCQlpZiAocGFyZW50RWxlbWVudCA9PSBudWxsKSB7Ci0JCQlMaXN0IGFsbD0gbmV3IEFycmF5TGlzdCgpOwotCQkJT2JqZWN0W10gdG9wRW50cmllcz0gbW9kZWwuZ2V0RW50cmllcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b3BFbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IHRvcEVudHJpZXNbaV07Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENsYXNzcGF0aEVudHJ5KSB7Ci0JCQkJCWFsbC5hZGQob2JqZWN0KTsKLQkJCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEdsb2JhbENsYXNzcGF0aEVudHJpZXMpIHsKLQkJCQkJYWxsLmFkZEFsbChBcnJheXMuYXNMaXN0KCgoR2xvYmFsQ2xhc3NwYXRoRW50cmllcylvYmplY3QpLmdldEVudHJpZXMoKSkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBhbGwudG9BcnJheSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdFtdIGFycmF5PSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQltb2RlbC5yZW1vdmVBbGwoYXJyYXkpOwotCQl0cmVlVmlld2VyLnJlbW92ZShhcnJheSk7Ci0JCXJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3NwYXRoTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZyZXNoRW5hYmxlZChib29sZWFuIHJlZnJlc2hFbmFibGVkKSB7Ci0JCXRoaXMucmVmcmVzaEVuYWJsZWQgPSByZWZyZXNoRW5hYmxlZDsKLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0UmVkcmF3KHJlZnJlc2hFbmFibGVkKTsKLQkJaWYgKHJlZnJlc2hFbmFibGVkICYmIHJlZnJlc2hSZXF1ZXN0ZWQpIHsKLQkJCXJlZnJlc2goKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjdXJyZW50UGFyZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RW50cmllcyhJQ2xhc3NwYXRoRW50cnkgY3VycmVudFBhcmVudCwgTGlzdCBlbnRyaWVzKSB7Ci0JCWlmIChjdXJyZW50UGFyZW50IGluc3RhbmNlb2YgR2xvYmFsQ2xhc3NwYXRoRW50cmllcykgewotCQkJR2xvYmFsQ2xhc3NwYXRoRW50cmllcyBncm91cD0gKEdsb2JhbENsYXNzcGF0aEVudHJpZXMpIGN1cnJlbnRQYXJlbnQ7Ci0JCQlncm91cC5zZXRFbnRyaWVzKGVudHJpZXMpOwotCQl9Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FudENsYXNzcGF0aExhYmVsUHJvdmlkZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FudENsYXNzcGF0aExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI0ZjY2NS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRDbGFzc3BhdGhMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLklBbnRDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbG9yUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIExhYmVsIHByb3ZpZGVyIGZvciBjbGFzc3BhdGggZWxlbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFudENsYXNzcGF0aExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciwgSUNvbG9yUHJvdmlkZXIgewotCi0KLQlwcml2YXRlIEFudENsYXNzcGF0aEJsb2NrIGZCbG9jazsKLQkKLQlwdWJsaWMgQW50Q2xhc3NwYXRoTGFiZWxQcm92aWRlcihBbnRDbGFzc3BhdGhCbG9jayBibG9jaykgewotCQlmQmxvY2s9IGJsb2NrOwotCX0KLQotCXByaXZhdGUgSW1hZ2UgZ2V0Rm9sZGVySW1hZ2UoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSl9GT0xERVIpOwotCX0KLQotCXByaXZhdGUgSW1hZ2UgZ2V0SmFySW1hZ2UoKSB7Ci0JCXJldHVybiBKYXZhVUkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2Uob3JnLmVjbGlwc2UuamR0LnVpLklTaGFyZWRJbWFnZXMuSU1HX09CSlNfSkFSKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0Q2xhc3NwYXRoSW1hZ2UoKSB7Ci0JCXJldHVybiBBbnRVSUltYWdlcy5nZXRJbWFnZShJQW50VUlDb25zdGFudHMuSU1HX1RBQl9DTEFTU1BBVEgpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCVN0cmluZyBmaWxlOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENsYXNzcGF0aEVudHJ5KSB7Ci0JCQlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IChDbGFzc3BhdGhFbnRyeSkgZWxlbWVudDsKLSAgICAgICAgICAgIGlmIChlbnRyeS5pc0VjbGlwc2VSdW50aW1lUmVxdWlyZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBBbnRVSUltYWdlcy5nZXRJbWFnZShJQW50VUlDb25zdGFudHMuSU1HX0FOVF9FQ0xJUFNFX1JVTlRJTUVfT0JKRUNUKTsKLSAgICAgICAgICAgIH0KLQkJCWZpbGU9IGVudHJ5LnRvU3RyaW5nKCk7Ci0JCQlpZiAoZmlsZS5lbmRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZ2V0Rm9sZGVySW1hZ2UoKTsKLQkJCX0gCi0JCQlyZXR1cm4gZ2V0SmFySW1hZ2UoKTsKLQkJfQotCQkKLQkJcmV0dXJuIGdldENsYXNzcGF0aEltYWdlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUFudENsYXNzcGF0aEVudHJ5KSB7Ci0gICAgICAgICAgICBJQW50Q2xhc3NwYXRoRW50cnkgZW50cnk9IChJQW50Q2xhc3NwYXRoRW50cnkpZWxlbWVudDsKLQkJCVN0cmluZ0J1ZmZlciBsYWJlbD0gbmV3IFN0cmluZ0J1ZmZlcihlbnRyeS5nZXRMYWJlbCgpKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgR2xvYmFsQ2xhc3NwYXRoRW50cmllcykgewotICAgICAgICAgICAgICAgIGlmICgoKEdsb2JhbENsYXNzcGF0aEVudHJpZXMpZWxlbWVudCkuZ2V0VHlwZSgpID09IENsYXNzcGF0aE1vZGVsLkFOVF9IT01FKSB7Ci0gICAgCQkJCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcz0gQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOwotICAgIAkJCQlTdHJpbmcgZGVmYXVsdEFudEhvbWU9IHByZWZzLmdldERlZmF1bHRBbnRIb21lKCk7Ci0gICAgCQkJCVN0cmluZyBjdXJyZW50QW50SG9tZT0gZkJsb2NrLmdldEFudEhvbWUoKTsKLSAgICAJCQkJbGFiZWwuYXBwZW5kKCIgKCIpOyAvLyROT04tTkxTLTEkCi0gICAgCQkJCWlmIChkZWZhdWx0QW50SG9tZSA9PSBudWxsIHx8IGRlZmF1bHRBbnRIb21lLmVxdWFscyhjdXJyZW50QW50SG9tZSkpIHsKLSAgICAJCQkJCWxhYmVsLmFwcGVuZChBbnRQcmVmZXJlbmNlc01lc3NhZ2VzLkFudENsYXNzcGF0aExhYmVsUHJvdmlkZXJfMCk7Ci0gICAgCQkJCX0gZWxzZSB7Ci0gICAgCQkJCQlsYWJlbC5hcHBlbmQoZkJsb2NrLmdldEFudEhvbWUoKSk7CQotICAgIAkJCQl9Ci0gICAgCQkJCWxhYmVsLmFwcGVuZCgnKScpOwotICAgICAgICAgICAgICAgIH0KLQkJCX0gCi0JCQlyZXR1cm4gbGFiZWwudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbG9yUHJvdmlkZXIjZ2V0QmFja2dyb3VuZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgR2xvYmFsQ2xhc3NwYXRoRW50cmllcykgewotICAgICAgICAgICAgaW50IHR5cGU9ICgoR2xvYmFsQ2xhc3NwYXRoRW50cmllcykgZWxlbWVudCkuZ2V0VHlwZSgpOwotICAgICAgICAgICAgaWYgKHR5cGUgPT0gQ2xhc3NwYXRoTW9kZWwuQ09OVFJJQlVURUQpIHsKLSAgICAgICAgICAgICAgICBEaXNwbGF5IGRpc3BsYXk9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpOwotICAgICAgICAgICAgfQotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDbGFzc3BhdGhFbnRyeSkgewotICAgICAgICAgICAgcmV0dXJuIGdldEJhY2tncm91bmQoKChDbGFzc3BhdGhFbnRyeSkgZWxlbWVudCkuZ2V0UGFyZW50KCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbG9yUHJvdmlkZXIjZ2V0Rm9yZWdyb3VuZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xvciBnZXRGb3JlZ3JvdW5kKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRDbGFzc3BhdGhQYWdlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRDbGFzc3BhdGhQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MzQzOGMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQW50Q2xhc3NwYXRoUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLklBbnRDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwuY29yZS5BbnRDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFN1Yi1wYWdlIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIGVudGVyIGN1c3RvbSBjbGFzc3BhdGhzCi0gKiB0byBiZSB1c2VkIHdoZW4gcnVubmluZyBBbnQgYnVpbGQgZmlsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRDbGFzc3BhdGhQYWdlIGltcGxlbWVudHMgSUFudEJsb2NrQ29udGFpbmVyIHsKLQotCXByaXZhdGUgQW50Q2xhc3NwYXRoQmxvY2sgZkFudENsYXNzcGF0aEJsb2NrPSBuZXcgQW50Q2xhc3NwYXRoQmxvY2soKTsKLQlwcml2YXRlIEFudFJ1bnRpbWVQcmVmZXJlbmNlUGFnZSBmUHJlZmVyZW5jZVBhZ2U7Ci0JcHJpdmF0ZSBDbGFzc3BhdGhNb2RlbCBmTW9kZWw7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQW50Q2xhc3NwYXRoUGFnZShBbnRSdW50aW1lUHJlZmVyZW5jZVBhZ2UgcHJlZmVyZW5jZVBhZ2UpIHsKLQkJZlByZWZlcmVuY2VQYWdlID0gcHJlZmVyZW5jZVBhZ2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNwZWNpZmllZCB1c2VyIGNsYXNzcGF0aCBlbnRyaWVzCi0JICogCi0JICogQHJldHVybiBzZXQgb2YgdXNlciBjbGFzc3BhdGggZW50cmllcwotCSAqLwotCXByb3RlY3RlZCBJQW50Q2xhc3NwYXRoRW50cnlbXSBnZXRBZGRpdGlvbmFsRW50cmllcygpIHsKLQkJcmV0dXJuIGZNb2RlbC5nZXRFbnRyaWVzKENsYXNzcGF0aE1vZGVsLkdMT0JBTF9VU0VSKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIGFudCBob21lIGNsYXNzcGF0aCBlbnRyaWVzCi0JICovCi0JcHJvdGVjdGVkIElBbnRDbGFzc3BhdGhFbnRyeVtdIGdldEFudEhvbWVFbnRyaWVzKCkgewotCQlyZXR1cm4gZk1vZGVsLmdldEVudHJpZXMoQ2xhc3NwYXRoTW9kZWwuQU5UX0hPTUUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250cmlidXRlZCBjbGFzc3BhdGggZW50cmllcwotCSAqLwotCXByb3RlY3RlZCBJQW50Q2xhc3NwYXRoRW50cnlbXSBnZXRDb250cmlidXRlZEVudHJpZXMoKSB7Ci0JCXJldHVybiBmTW9kZWwuZ2V0RW50cmllcyhDbGFzc3BhdGhNb2RlbC5DT05UUklCVVRFRCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW50SG9tZSgpIHsKLQkJcmV0dXJuIGZBbnRDbGFzc3BhdGhCbG9jay5nZXRBbnRIb21lKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGNvbnRlbnRzIG9mIHRoZSB0YWJsZXMgb24gdGhpcyBwYWdlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCQotCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnM9IEFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJY3JlYXRlQ2xhc3NwYXRoTW9kZWwoKTsKLQkJZkFudENsYXNzcGF0aEJsb2NrLmluaXRpYWxpemVBbnRIb21lKHByZWZzLmdldEFudEhvbWUoKSk7Ci0JCWZBbnRDbGFzc3BhdGhCbG9jay5zZXRJbnB1dChmTW9kZWwpOwotCQkKLQkJZlByZWZlcmVuY2VQYWdlLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJZlByZWZlcmVuY2VQYWdlLnNldFZhbGlkKHRydWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDbGFzc3BhdGhNb2RlbCgpIHsKLQkJZk1vZGVsPSBuZXcgQ2xhc3NwYXRoTW9kZWwoKTsKLQkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZzPSBBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCk7Ci0JCWZNb2RlbC5zZXRBbnRIb21lRW50cmllcyhwcmVmcy5nZXRBbnRIb21lQ2xhc3NwYXRoRW50cmllcygpKTsKLQkJZk1vZGVsLnNldEdsb2JhbEVudHJpZXMocHJlZnMuZ2V0QWRkaXRpb25hbENsYXNzcGF0aEVudHJpZXMoKSk7Ci0gICAgICAgIGZNb2RlbC5zZXRDb250cmlidXRlZEVudHJpZXMocHJlZnMuZ2V0Q29udHJpYnV0ZWRDbGFzc3BhdGhFbnRyaWVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcz0gQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOwotCQlmTW9kZWw9IG5ldyBDbGFzc3BhdGhNb2RlbCgpOwotCQlmTW9kZWwuc2V0QW50SG9tZUVudHJpZXMocHJlZnMuZ2V0RGVmYXVsdEFudEhvbWVFbnRyaWVzKCkpOwotCQlMaXN0IGFkZGl0aW9uYWxFbnRyaWVzPSBnZXREZWZhdWx0QWRkaXRpb25hbEVudHJpZXMoKTsKLQkJaWYgKGFkZGl0aW9uYWxFbnRyaWVzICE9IG51bGwpIHsKLQkJCWZNb2RlbC5zZXRHbG9iYWxFbnRyaWVzKChJQW50Q2xhc3NwYXRoRW50cnlbXSkgYWRkaXRpb25hbEVudHJpZXMudG9BcnJheShuZXcgSUFudENsYXNzcGF0aEVudHJ5W2FkZGl0aW9uYWxFbnRyaWVzLnNpemUoKV0pKTsKLQkJfSBlbHNlIHsKLQkJCWZNb2RlbC5zZXRHbG9iYWxFbnRyaWVzKG5ldyBJQW50Q2xhc3NwYXRoRW50cnlbMF0pOwotCQl9Ci0gICAgICAgIGZNb2RlbC5zZXRDb250cmlidXRlZEVudHJpZXMocHJlZnMuZ2V0Q29udHJpYnV0ZWRDbGFzc3BhdGhFbnRyaWVzKCkpOwotCQlmQW50Q2xhc3NwYXRoQmxvY2suaW5pdGlhbGl6ZUFudEhvbWUocHJlZnMuZ2V0RGVmYXVsdEFudEhvbWUoKSk7Ci0JCWZBbnRDbGFzc3BhdGhCbG9jay5zZXRJbnB1dChmTW9kZWwpOwotCQl1cGRhdGUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGdldERlZmF1bHRBZGRpdGlvbmFsRW50cmllcygpIHsKLQkJSUFudENsYXNzcGF0aEVudHJ5IHRvb2xzSmFyRW50cnk9IEFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKS5nZXRUb29sc0phckVudHJ5KCk7Ci0JCS8vVE9ETyBzaG91bGQgdXNlIEFudENvcmVQcmVmZXJlbmNlcy5nZXRVc2VyTGlicmFyaWVzIHdoZW4gcHJvbW90ZWQgdG8gQVBJIHBvc3QgMy4xCi0JCUZpbGUgbGliRGlyPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpLCAiLmFudCIgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyAibGliIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCVVSTFtdIHVybHM9IG51bGw7Ci0JCXRyeSB7Ci0JCQl1cmxzPSBnZXRMb2NhdGlvblVSTHMobGliRGlyKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEFudFVJUGx1Z2luLmxvZyhlKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0KDApOwotCQl9Ci0JCQotCQlMaXN0IGVudHJpZXM9IG5ldyBBcnJheUxpc3QodXJscy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLQkJCUFudENsYXNzcGF0aEVudHJ5IGVudHJ5PSBuZXcgQW50Q2xhc3NwYXRoRW50cnkodXJsc1tpXSk7Ci0JCQllbnRyaWVzLmFkZChlbnRyeSk7Ci0JCX0KLQkJaWYgKHRvb2xzSmFyRW50cnkgIT0gbnVsbCkgewotCQkJZW50cmllcy5hZGQodG9vbHNKYXJFbnRyeSk7Ci0JCX0KLQkJcmV0dXJuIGVudHJpZXM7Ci0JfQotCQotCXByaXZhdGUgVVJMW10gZ2V0TG9jYXRpb25VUkxzKEZpbGUgbG9jYXRpb24pIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQkgZmluYWwgU3RyaW5nIGV4dGVuc2lvbj0gIi5qYXIiOyAvLyROT04tTkxTLTEkCi0JCSBVUkxbXSB1cmxzID0gbmV3IFVSTFswXTsKLQkJIAotCQkgaWYgKCFsb2NhdGlvbi5leGlzdHMoKSkgewotCQkJIHJldHVybiB1cmxzOwotCQkgfQotCQkgCi0JCSBpZiAoIWxvY2F0aW9uLmlzRGlyZWN0b3J5KCkpIHsKLQkJCSB1cmxzID0gbmV3IFVSTFsxXTsKLQkJCSBTdHJpbmcgcGF0aCA9IGxvY2F0aW9uLmdldFBhdGgoKTsKLQkJCSBpZiAocGF0aC50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKGV4dGVuc2lvbikpIHsKLQkJCQkgdXJsc1swXSA9IGxvY2F0aW9uLnRvVVJMKCk7Ci0JCQkgfQotCQkJIHJldHVybiB1cmxzOwotCQkgfQotCQkgCi0JCSBGaWxlW10gbWF0Y2hlcyA9IGxvY2F0aW9uLmxpc3RGaWxlcygKLQkJCSBuZXcgRmlsZW5hbWVGaWx0ZXIoKSB7Ci0JCQkJIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKLQkJCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChleHRlbnNpb24pOwotCQkJCSB9Ci0JCQkgfSk7Ci0JCSAKLQkJIHVybHMgPSBuZXcgVVJMW21hdGNoZXMubGVuZ3RoXTsKLQkJIGZvciAoaW50IGkgPSAwOyBpIDwgbWF0Y2hlcy5sZW5ndGg7ICsraSkgewotCQkJIHVybHNbaV0gPSBtYXRjaGVzW2ldLnRvVVJMKCk7Ci0JCSB9Ci0JCSByZXR1cm4gdXJsczsKLQkgfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRhYiBpdGVtIHRoYXQgY29udGFpbnMgdGhpcyBzdWItcGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgVGFiSXRlbSBjcmVhdGVUYWJJdGVtKFRhYkZvbGRlciBmb2xkZXIpIHsKLQkJVGFiSXRlbSBpdGVtID0gbmV3IFRhYkl0ZW0oZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChBbnRQcmVmZXJlbmNlc01lc3NhZ2VzLkFudENsYXNzcGF0aFBhZ2VfdGl0bGUpOwotCQlpdGVtLnNldEltYWdlKGZBbnRDbGFzc3BhdGhCbG9jay5nZXRDbGFzc3BhdGhJbWFnZSgpKTsKLQkJaXRlbS5zZXREYXRhKHRoaXMpOwotCQlpdGVtLnNldENvbnRyb2woY3JlYXRlQ29udGVudHMoZm9sZGVyKSk7Ci0JCXJldHVybiBpdGVtOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoaXMgcGFnZSdzIGNvbnRyb2xzCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBJQW50VUlIZWxwQ29udGV4dElkcy5BTlRfQ0xBU1NQQVRIX1BBR0UpOwotCQlGb250IGZvbnQgPSBwYXJlbnQuZ2V0Rm9udCgpOwotCQkKLQkJQ29tcG9zaXRlIHRvcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXRvcC5zZXRGb250KGZvbnQpOwotCQkKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAyOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAyOwotCQl0b3Auc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJdG9wLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCWZBbnRDbGFzc3BhdGhCbG9jay5zZXRDb250YWluZXIodGhpcyk7Ci0JCWZBbnRDbGFzc3BhdGhCbG9jay5jcmVhdGVDb250ZW50cyh0b3ApOwotCQkKLQkJcmV0dXJuIHRvcDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLklBbnRCbG9ja0NvbnRhaW5lciN1cGRhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJaWYgKGZBbnRDbGFzc3BhdGhCbG9jay5pc1ZhbGlkYXRlZCgpKXsKLQkJCXJldHVybjsKLQkJfQotCQlzZXRNZXNzYWdlKG51bGwpOwotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCWJvb2xlYW4gdmFsaWQ9IGZBbnRDbGFzc3BhdGhCbG9jay52YWxpZGF0ZUFudEhvbWUoKTsKLQkKLQkJaWYgKHZhbGlkKSB7Ci0JCQl2YWxpZD0gZkFudENsYXNzcGF0aEJsb2NrLnZhbGlkYXRlVG9vbHNKQVIoKTsKLQkJfQotCQkKLQkJZlByZWZlcmVuY2VQYWdlLnNldFZhbGlkKHZhbGlkKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLklBbnRCbG9ja0NvbnRhaW5lciNzZXRNZXNzYWdlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQlmUHJlZmVyZW5jZVBhZ2Uuc2V0TWVzc2FnZShtZXNzYWdlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLklBbnRCbG9ja0NvbnRhaW5lciNzZXRFcnJvck1lc3NhZ2UoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJZlByZWZlcmVuY2VQYWdlLnNldEVycm9yTWVzc2FnZShtZXNzYWdlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLklBbnRCbG9ja0NvbnRhaW5lciNjcmVhdGVQdXNoQnV0dG9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgQnV0dG9uIGNyZWF0ZVB1c2hCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGJ1dHRvblRleHQpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQlidXR0b24uc2V0VGV4dChidXR0b25UZXh0KTsKLQkJZlByZWZlcmVuY2VQYWdlLnNldEJ1dHRvbkxheW91dERhdGEoYnV0dG9uKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRDb250ZW50UHJvdmlkZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FudENvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDg3NzE4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FudENvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDb21wYXJhdG9yOwotCi0vKioKLSAqIENvbnRlbnQgcHJvdmlkZXIgdGhhdCBtYWludGFpbnMgYSBnZW5lcmljIGxpc3Qgb2Ygb2JqZWN0cyB3aGljaCBhcmUgc2hvd24gaW4KLSAqIGEgdGFibGUgdmlld2VyLgotICovCi1wdWJsaWMgY2xhc3MgQW50Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCXByb3RlY3RlZCBMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsKLQlwcml2YXRlIFZpZXdlckNvbXBhcmF0b3IgZkNvbXBhcmF0b3I9IG51bGw7Ci0JLyoqCi0JICogQHNpbmNlIDMuNQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBkZWZhdWx0Y29tcGFyYXRvciA9IHRydWU7Ci0JCi0JCi0JLyoqCi0JICogRGVmYXVsdCBDb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBBbnRDb250ZW50UHJvdmlkZXIoKSB7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIGRlZmF1bHRjb21wYXJhdG9yIGlmIHRoZSBkZWZhdWx0IGNvbXBhcmF0b3Igc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSByZXR1cm5lZCBkYXRhCi0JICogQHNpbmNlIDMuNQotCSAqLwotCXB1YmxpYyBBbnRDb250ZW50UHJvdmlkZXIoYm9vbGVhbiBkZWZhdWx0Y29tcGFyYXRvcikgewotCQl0aGlzLmRlZmF1bHRjb21wYXJhdG9yID0gZGVmYXVsdGNvbXBhcmF0b3I7Ci0JfQotCQotCS8qKgotCSAqIEFkZCBhbiBlbGVtZW50IHRvIHRoZSBjdXJyZW50IGxpc3Rpbmcgb2YgZWxlbWVudHMgYW5kIHRvIHRoZSB1bmRlcmx5aW5nIHZpZXdlci4gRG9lcyBub3RoaW5nCi0JICogaWYgdGhlIGxpc3RpbmcgYWxyZWFkeSBjb250YWlucyB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqIEBwYXJhbSBvCi0JICovCi0JcHVibGljIHZvaWQgYWRkKE9iamVjdCBvKSB7Ci0JCWlmIChlbGVtZW50cy5jb250YWlucyhvKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWVsZW1lbnRzLmFkZChvKTsKLQkJdGFibGVWaWV3ZXIuYWRkKG8pOwotCQl0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obyksIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJcmV0dXJuIGVsZW1lbnRzLnRvQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCXRhYmxlVmlld2VyID0gKFRhYmxlVmlld2VyKSB2aWV3ZXI7Ci0JCWVsZW1lbnRzLmNsZWFyKCk7Ci0JCWlmIChuZXdJbnB1dCAhPSBudWxsKSB7Ci0JCQlpZihkZWZhdWx0Y29tcGFyYXRvcikgewotCQkJCXRhYmxlVmlld2VyLnNldENvbXBhcmF0b3IoZ2V0Q29tcGFyYXRvcigpKTsKLQkJCX0KLQkJCUxpc3QgbGlzdDsKLQkJCWlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQlsaXN0PSAoTGlzdCkgbmV3SW5wdXQ7Ci0JCQl9IGVsc2UgewotCQkJCWxpc3Q9IEFycmF5cy5hc0xpc3QoKE9iamVjdFtdKSBuZXdJbnB1dCk7CQotCQkJfQotCQkJZWxlbWVudHMuYWRkQWxsKGxpc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gZWxlbWVudCBmcm9tIHRoZSBsaXN0aW5nIG9mIGVsZW1lbnRzIGFuZCBmcm9tIHRoZSBiYWNraW5nIHZpZXdlci4KLQkgKiBAcGFyYW0gbwotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZShPYmplY3QgbykgewotCQllbGVtZW50cy5yZW1vdmUobyk7Ci0JCXRhYmxlVmlld2VyLnJlbW92ZShvKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gc2VsZWN0aW9uIG9mIHRoZSBsaXN0aW5nIG9mIGVsZW1lbnRzIGFuZCBmcm9tIHRoZSBiYWNraW5nIHZpZXdlcgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdFtdIGFycmF5PSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQllbGVtZW50cy5yZW1vdmVBbGwoQXJyYXlzLmFzTGlzdChhcnJheSkpOwotCQl0YWJsZVZpZXdlci5yZW1vdmUoYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgY29tcGFyYXRvciB3aGljaCBjb21wYXJlcyB0aGUge0BsaW5rICN0b1N0cmluZygpfSB2YWx1ZSBvZiB0aGUgZWxlbWVudHMgZm9yIG9yZGVyaW5nCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBjb21wYXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIFZpZXdlckNvbXBhcmF0b3IgZ2V0Q29tcGFyYXRvcigpIHsKLQkJaWYgKGZDb21wYXJhdG9yID09IG51bGwpIHsKLQkJCWZDb21wYXJhdG9yPSBuZXcgVmlld2VyQ29tcGFyYXRvcigpIHsKLQkJCQkvKiAobm9uLUphdmFkb2MpCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3IjY29tcGFyZShvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJCQkJcmV0dXJuIGUxLnRvU3RyaW5nKCkuY29tcGFyZVRvSWdub3JlQ2FzZShlMi50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBmQ29tcGFyYXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NjBiMGIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIFByZWZlcmVuY2UgY29uc3RhbnRzIHVzZWQgZm9yIHRoZSBBbnQgRWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzIHsKLQotCXByaXZhdGUgQW50RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cygpIHsKLQl9Ci0JCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgY29udHJvbHMgaWYgdGhlIEFudCBFZGl0b3IgY29kZSBhc3Npc3QgZ2V0cyBhdXRvIGFjdGl2YXRlZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0RFQVNTSVNUX0FVVE9BQ1RJVkFUSU9OPSAiY29udGVudF9hc3Npc3RfYXV0b2FjdGl2YXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIG5hbWUgcHJlZmVyZW5jZSB0aGF0IGhvbGRzIHRoZSBhdXRvIGFjdGl2YXRpb24gZGVsYXkgdGltZSBpbiBtaWxsaSBzZWNvbmRzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+SW50PC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09ERUFTU0lTVF9BVVRPQUNUSVZBVElPTl9ERUxBWT0gImNvbnRlbnRfYXNzaXN0X2F1dG9hY3RpdmF0aW9uX2RlbGF5IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgY29udHJvbHMgaWYgdGhlIEFudCBlZGl0b3IgY29kZSBhc3Npc3QgaW5zZXJ0cyBhCi0JICogcHJvcG9zYWwgYXV0b21hdGljYWxseSBpZiBvbmx5IG9uZSBwcm9wb3NhbCBpcyBhdmFpbGFibGUuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogQHNpbmNlIDIuMQotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPREVBU1NJU1RfQVVUT0lOU0VSVD0gImNvbnRlbnRfYXNzaXN0X2F1dG9pbnNlcnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBob2xkcyB0aGUgY2hhcmFjdGVycyB0aGF0IGF1dG8gYWN0aXZhdGUgY29kZSBhc3Npc3QgaW4gYW4gQW50IGJ1aWxkZmlsZS4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlNyaW5nPC9jb2RlPi4gQWxsIGNoYXJhY3RlcnMgdGhhdCB0cmlnZ2VyIGF1dG8gY29kZSBhc3Npc3QgaW4gYW4gQW50IGJ1aWxkZmlsZS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09ERUFTU0lTVF9BVVRPQUNUSVZBVElPTl9UUklHR0VSUz0gImNvbnRlbnRfYXNzaXN0X2F1dG9hY3RpdmF0aW9uX3RyaWdnZXJzX2phdmEiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBjb250cm9scyBpZiB0aGUgQW50IGVkaXRvciBwcmVzZW50cyBjb2RlIGFzc2lzdCBwcm9wb3NhbHMgZm9yCi0JICogdXNlciBkZWZpbmVkIHRhc2tzCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPREVBU1NJU1RfVVNFUl9ERUZJTkVEX1RBU0tTPSAiY29udGVudF9hc3Npc3RfdXNlckRlZmluZWRUYXNrcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBzcGVjaWZpZXMgdGhlIHRhYiBzaXplIGZvciB0aGUgQW50IGZvcm1hdHRlci4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPmludDwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9UQUJfU0laRT0gImZvcm1hdHRlcl90YWJfc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBzcGVjaWZpZXMgaWYgdGhlIEFudCBmb3JtYXR0ZXIgdXNlcyBzcGFjZXMgZm9yIHRhYnMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5ib29sZWFuPC9jb2RlPi4gSWYgPGNvZGU+ZmFsc2U8L2NvZGU+IHNwYWNlcyBpbnN0ZWFkIG9mIHRhYnMgYXJlIHVzZWQKLQkgKiB3aGVuIGZvcm1hdHRpbmcuIElmIDxjb2RlPnRydWU8L2NvZGU+IHRoZSBmb3JtYXR0ZXIgaW5zZXJ0cyBhIHRhYiBjaGFyYWN0ZXIgZm9yIGluZGVudGluZy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVSX1RBQl9DSEFSPSAiZm9ybWF0dGVyX3RhYl9jaGFyIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IHNwZWNpZmllcyBpZiB0aGUgQW50IGZvcm1hdHRlciBhbGlnbnMgdGhlIGZpbmFsCi0JICogJnF1b3RlJmd0JnF1b3RlIGluIG11bHRpLWxpbmUgZWxlbWVudCB0YWdzCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4gSWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIGZpbmFsCi0JICogJnF1b3RlJmd0JnF1b3RlIGluIG11bHRpLWxpbmUgZWxlbWVudCB0YWdzIGFyZSBhbGlnbmVkIGJ5IHRoZSBmb3JtYXR0ZXIuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9BTElHTj0gImZvcm1hdHRlcl9hbGlnbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBzcGVjaWZpZXMgdGhlIG1heGltdW0gbGluZSBsZW5ndGggZm9yIHRoZSBBbnQgZm9ybWF0dGVyLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+aW50PC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUVEVSX01BWF9MSU5FX0xFTkdUSD0gImZvcm1hdHRlcl9tYXhfbGluZV9sZW5ndGgiOyAvLyROT04tTkxTLTEkCi0JCQkKLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBzcGVjaWZpZXMgaWYgdGhlIEFudCBmb3JtYXR0ZXIgc2hvdWxkIHdyYXAgZWxlbWVudHMgdGhhdCBhcmUgbG9uZ2VyIHRoYW4KLQkgKiB0aGUgbWF4aW11bSBsaW5lIGxlbmd0aC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LiBJZiA8Y29kZT50cnVlPC9jb2RlPiBsb25nIGVsZW1lbnRzIGFyZSB3cmFwcGVkCi0JICogd2hlbiBmb3JtYXR0aW5nIGluIHRoZSBlZGl0b3IuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFUl9XUkFQX0xPTkc9ICJmb3JtYXR0ZXJfd3JhcF9sb25nIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEJvb2xlYW4gcHJlZmVyZW5jZSBpZGVudGlmaWVyIGNvbnN0YW50IHdoaWNoIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBBbnQgZWRpdG9yIHNob3VsZAotCSAqIGZvcm1hdCB0ZW1wbGF0ZXMgb24gaW5zZXJ0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFU19VU0VfQ09ERUZPUk1BVFRFUj0gInRlbXBsYXRlc191c2VfY29kZWZvcm1hdHRlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByZWZlcmVuY2Uga2V5IHN1ZmZpeCBmb3IgYm9sZCB0ZXh0IHN0eWxlIHByZWZlcmVuY2Uga2V5cy4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfQk9MRF9TVUZGSVg9ICJfYm9sZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByZWZlcmVuY2Uga2V5IHN1ZmZpeCBmb3IgaXRhbGljIHRleHQgc3R5bGUgcHJlZmVyZW5jZSBrZXlzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9JVEFMSUNfU1VGRklYPSAiX2l0YWxpYyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBQcmVmZXJlbmNlIGtleSBwcmVmaXggZm9yIGFsbCBwcm9ibGVtIHByZWZlcmVuY2Uga2V5cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9CTEVNPSAicHJvYmxlbSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBTdHJpbmcgcHJlZmVyZW5jZSBpZGVudGlmaWVyIGNvbnN0YW50IHdoaWNoIHNwZWNpZmllcyB0aGUgc2V2ZXJpdHkgbGV2ZWwgZm9yIHByb2JsZW1zCi0JICogcmVsYXRlZCB0byBjbGFzc3BhdGggaW4gdGhlIEFudCBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9CTEVNX0NMQVNTUEFUSD0gUFJPQkxFTSArICJfY2xhc3NwYXRoIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBTdHJpbmcgcHJlZmVyZW5jZSBpZGVudGlmaWVyIGNvbnN0YW50IHdoaWNoIHNwZWNpZmllcyB0aGUgc2V2ZXJpdHkgbGV2ZWwgZm9yIHByb2JsZW1zCi0JICogcmVsYXRlZCB0byBwcm9wZXJ0aWVzIGluIHRoZSBBbnQgZWRpdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQkxFTV9QUk9QRVJUSUVTPSBQUk9CTEVNICsgIl9wcm9wZXJ0aWVzIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBTdHJpbmcgcHJlZmVyZW5jZSBpZGVudGlmaWVyIGNvbnN0YW50IHdoaWNoIHNwZWNpZmllcyB0aGUgc2V2ZXJpdHkgbGV2ZWwgZm9yIHByb2JsZW1zCi0JICogcmVsYXRlZCB0byBpbXBvcnRzIGluIHRoZSBBbnQgZWRpdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQkxFTV9JTVBPUlRTPSBQUk9CTEVNICsgIl9pbXBvcnRzIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBTdHJpbmcgcHJlZmVyZW5jZSBpZGVudGlmaWVyIGNvbnN0YW50IHdoaWNoIHNwZWNpZmllcyB0aGUgc2V2ZXJpdHkgbGV2ZWwgZm9yIHByb2JsZW1zCi0JICogcmVsYXRlZCB0byB0YXNrcyBpbiB0aGUgQW50IGVkaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0JMRU1fVEFTS1M9IFBST0JMRU0gKyAiX3Rhc2tzIjsgIC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvKioKLSAgICAgKiBTdHJpbmcgcHJlZmVyZW5jZSBpZGVudGlmaWVyIGNvbnN0YW50IHdoaWNoIHNwZWNpZmllcyB0aGUgc2V2ZXJpdHkgbGV2ZWwgZm9yIHByb2JsZW1zCi0gICAgICogcmVsYXRlZCB0byBzZWN1cml0eSBleGNlcHRpb25zIGluIHRoZSBBbnQgZWRpdG9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQkxFTV9TRUNVUklUWT0gUFJPQkxFTSArICJfc2VjdXJpdHkiOyAgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBjb25zdGFudHMgYWxsb3dhYmxlIGZvciB0aGUgc2V2ZXJpdHkgbGV2ZWxzIGZvciBwcm9ibGVtIHByZWZlcmVuY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERGSUxFX0VSUk9SID0gImVycm9yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxERklMRV9XQVJOSU5HID0gIndhcm5pbmciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERGSUxFX0lHTk9SRSA9ICJpZ25vcmUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgY29udHJvbHMgd2hldGhlciBwcm9ibGVtIHJlcG9ydGluZyBpcyBlbmFibGVkIGluIHRoZSBBbnQgZWRpdG9yLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCVUlMREZJTEVfSUdOT1JFX0FMTCA9ICJpZ25vcmVBbGwiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgbGlzdHMgdGhlIG5hbWVzIG9mIGJ1aWxkZmlsZXMgdG8gbm90IGRvIHByb2JsZW0gcmVwb3J0aW5nIGZvcgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJVSUxERklMRV9OQU1FU19UT19JR05PUkUgPSAiaWdub3JlTmFtZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgY29udHJvbHMgd2hldGhlciBmb2xkaW5nIGlzIGVuYWJsZWQgaW4gdGhlIEFudCBlZGl0b3IuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9GT0xESU5HX0VOQUJMRUQ9ICJlZGl0b3JfZm9sZGluZ19lbmFibGVkIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IHN0b3JlcyB0aGUgdmFsdWUgZm9yIGNvbW1lbnQgZm9sZGluZy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0ZPTERJTkdfQ09NTUVOVFM9ICJlZGl0b3JfZm9sZGluZ19jb21tZW50cyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBzdG9yZXMgdGhlIHZhbHVlIGZvciB0YXJnZXQgZm9sZGluZy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX0ZPTERJTkdfVEFSR0VUUz0gImVkaXRvcl9mb2xkaW5nX3RhcmdldHMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgc3RvcmVzIHRoZSB2YWx1ZSBmb3IgRFREIGZvbGRpbmcuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9GT0xESU5HX0RURD0gImVkaXRvcl9mb2xkaW5nX2R0ZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBzdG9yZXMgdGhlIHZhbHVlIGZvciBkZWZpbmluZyBlbGVtZW50cyBmb2xkaW5nLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfRk9MRElOR19ERUZJTklORz0gImVkaXRvcl9mb2xkaW5nX2RlZmluaW5nIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGNvbnRyb2xzIGlmIHNlZ21lbnRlZCB2aWV3IChzaG93IHNlbGVjdGVkIGVsZW1lbnQgb25seSkgaXMgdHVybmVkIG9uIG9yIG9mZi4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX1NIT1dfU0VHTUVOVFM9ICJlZGl0b3Jfc2hvd19zZWdtZW50cyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBjb250cm9scyBpZiBvY2N1cnJlbmNlcyBhcmUgbWFya2VkIGluIHRoZSBlZGl0b3IKLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX01BUktfT0NDVVJSRU5DRVM9ICJlZGl0b3JfbWFya19vY2N1cnJlbmNlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBjb250cm9scyBpZiBiYWNrZ3JvdW5kIHJlY29uY2lsaW5nIGlzIHRyaWdnZXJlZCBieSB0aGUgdXNlcgotICAgICAqIHR5cGluZyBpbiB0aGUgZWRpdG9yCi0gICAgICogPHA+Ci0gICAgICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9SRUNPTkNJTEU9ICJlZGl0b3JfcmVjb25jaWxlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGNvbnRyb2xzIHdoZXRoZXIgb2NjdXJyZW5jZXMgYXJlIHN0aWNreSBpbiB0aGUgZWRpdG9yLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9TVElDS1lfT0NDVVJSRU5DRVM9ICJzdGlja3lPY2N1cnJlbmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0VmFsdWVzKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUpIHsKLQkJCi0JCXN0b3JlLnNldERlZmF1bHQoQ09ERUFTU0lTVF9BVVRPSU5TRVJULCB0cnVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChDT0RFQVNTSVNUX1VTRVJfREVGSU5FRF9UQVNLUywgdHJ1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoQ09ERUFTU0lTVF9BVVRPQUNUSVZBVElPTiwgdHJ1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoQ09ERUFTU0lTVF9BVVRPQUNUSVZBVElPTl9ERUxBWSwgNTAwKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChDT0RFQVNTSVNUX0FVVE9BQ1RJVkFUSU9OX1RSSUdHRVJTLCAiPCR7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXN0b3JlLnNldERlZmF1bHQoRk9STUFUVEVSX1RBQl9DSEFSLCB0cnVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChGT1JNQVRURVJfVEFCX1NJWkUsIDQpOwotCQlzdG9yZS5zZXREZWZhdWx0KEZPUk1BVFRFUl9BTElHTiwgZmFsc2UpOwotCQlzdG9yZS5zZXREZWZhdWx0KEZPUk1BVFRFUl9NQVhfTElORV9MRU5HVEgsIDgwKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChGT1JNQVRURVJfV1JBUF9MT05HLCBmYWxzZSk7Ci0JCQotCQlzdG9yZS5zZXREZWZhdWx0KFRFTVBMQVRFU19VU0VfQ09ERUZPUk1BVFRFUiwgdHJ1ZSk7Ci0JCQotICAgICAgICBzdG9yZS5zZXREZWZhdWx0KFBST0JMRU1fU0VDVVJJVFksIEJVSUxERklMRV9XQVJOSU5HKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChQUk9CTEVNX0NMQVNTUEFUSCwgQlVJTERGSUxFX1dBUk5JTkcpOwotCQlzdG9yZS5zZXREZWZhdWx0KFBST0JMRU1fUFJPUEVSVElFUywgQlVJTERGSUxFX0lHTk9SRSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoUFJPQkxFTV9JTVBPUlRTLCBCVUlMREZJTEVfV0FSTklORyk7Ci0JCXN0b3JlLnNldERlZmF1bHQoUFJPQkxFTV9UQVNLUywgQlVJTERGSUxFX0lHTk9SRSk7Ci0JCQotCQlzdG9yZS5zZXREZWZhdWx0KEVESVRPUl9GT0xESU5HX0VOQUJMRUQsIHRydWUpOwotCQkKLQkJc3RvcmUuc2V0RGVmYXVsdChFRElUT1JfU0hPV19TRUdNRU5UUywgZmFsc2UpOwotCQkKLQkJc3RvcmUuc2V0RGVmYXVsdChFRElUT1JfTUFSS19PQ0NVUlJFTkNFUywgZmFsc2UpOwotCQlzdG9yZS5zZXREZWZhdWx0KEVESVRPUl9TVElDS1lfT0NDVVJSRU5DRVMsIHRydWUpOwotCQkKLQkJc3RvcmUuc2V0RGVmYXVsdChCVUlMREZJTEVfSUdOT1JFX0FMTCwgZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgc3RvcmUuc2V0RGVmYXVsdChFRElUT1JfUkVDT05DSUxFLCB0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRQYWdlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNTA0N2EuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQW50UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLkFudE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkNvbHVtblNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYXlvdXREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogUHJvdmlkZXMgdGhlIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gZm9yIGEgc3ViLXBhZ2UgaW4gdGhlCi0gKiBBbnQgcHJlZmVyZW5jZSBwYWdlLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW50UGFnZSB7Ci0gICAgCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQUREX0JVVFRPTiA9IElEaWFsb2dDb25zdGFudHMuQ0xJRU5UX0lEICsgMTsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFRElUX0JVVFRPTiA9IElEaWFsb2dDb25zdGFudHMuQ0xJRU5UX0lEICsgMjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBSRU1PVkVfQlVUVE9OID0gSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyAzOwotICAgIAotCXByb3RlY3RlZCBTZWxlY3Rpb25BZGFwdGVyIHNlbGVjdGlvbkFkYXB0ZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJYnV0dG9uUHJlc3NlZCgoKEludGVnZXIpIGUud2lkZ2V0LmdldERhdGEoKSkuaW50VmFsdWUoKSk7Ci0JCX0KLQl9OwotCQotCXByaXZhdGUgQW50UnVudGltZVByZWZlcmVuY2VQYWdlIHByZWZlcmVuY2VQYWdlOwotCXByaXZhdGUgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0JcHJpdmF0ZSBBbnRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCXByaXZhdGUgQW50T2JqZWN0TGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFudE9iamVjdExhYmVsUHJvdmlkZXIoKTsKLQkKLQlwcm90ZWN0ZWQgQnV0dG9uIGVkaXRCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiByZW1vdmVCdXR0b247Ci0gICAgCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBmVGFibGVDb2x1bW5IZWFkZXJzPSB7Ci0JICAgICAgICBBbnRQcmVmZXJlbmNlc01lc3NhZ2VzLkFudFBhZ2VfMCwgQW50UHJlZmVyZW5jZXNNZXNzYWdlcy5BbnRQYWdlXzEsIEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50UGFnZV8yLCBBbnRQcmVmZXJlbmNlc01lc3NhZ2VzLkFudFBhZ2VfMwotCX07Ci0JcHJpdmF0ZSBmaW5hbCBDb2x1bW5MYXlvdXREYXRhW10gZlRhYmxlQ29sdW1uTGF5b3V0cz0gewotCSAgICAgICAgbmV3IENvbHVtbldlaWdodERhdGEoMzMpLAotCSAgICAgICAgbmV3IENvbHVtbldlaWdodERhdGEoMjMpLAotCSAgICAgICAgbmV3IENvbHVtbldlaWdodERhdGEoMjIpLAotCSAgICAgICAgbmV3IENvbHVtbldlaWdodERhdGEoMjIpCi0JfTsgIAotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIHBhZ2UuCi0JICovCi0JcHVibGljIEFudFBhZ2UoQW50UnVudGltZVByZWZlcmVuY2VQYWdlIHByZWZlcmVuY2VQYWdlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucHJlZmVyZW5jZVBhZ2UgPSBwcmVmZXJlbmNlUGFnZTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyBidXR0b25zIHNwZWNpZmljIHRvIHRoZSBwYWdlLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZEJ1dHRvbnNUb0J1dHRvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpOwotCQotCS8qKgotCSAqIEdpdmUgdGhpcyBwYWdlIGEgY2hhbmNlIHRvIGluaXRpYWxpemUgaXRzZWxmCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZSgpOwotCQotCS8qKgotCSAqIEFkZHMgYW4gb2JqZWN0IHRvIHRoZSBjb250ZW50cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbnRlbnQoT2JqZWN0IG8pIHsKLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQljb250ZW50UHJvdmlkZXIuYWRkKG8pOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5BbnRQYWdlI2J1dHRvblByZXNzZWQoaW50KQotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotICAgICAgICBzd2l0Y2ggKGJ1dHRvbklkKSB7Ci0gICAgICAgICAgICBjYXNlIEFERF9CVVRUT04gOgotICAgICAgICAgICAgICAgIGFkZCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBFRElUX0JVVFRPTiA6Ci0gICAgICAgICAgICAgICAgZWRpdChnZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJFTU9WRV9CVVRUT04gOgotICAgICAgICAgICAgICAgIHJlbW92ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIAotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBidXR0b24gd2l0aCBhcHByb3ByaWF0ZSBzaXplIGFuZCBsYXlvdXQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudCB0aGUgY29udHJvbCB0byBjcmVhdGUgdGhlIGJ1dHRvbiBvbgotCSAqIEBwYXJhbSBsYWJlbEtleSB0aGUga2V5IHRvIGxvb2t1cCB0aGUgYnV0dG9uJ3MgbGFiZWwKLQkgKiBAcGFyYW0gYnV0dG9uSWQgdGhlIGlkIHRvIGFzc2lnbiB0byB0aGlzIGJ1dHRvbgotCSAqIEByZXR1cm4gYSBuZXcgYW5kIGluaXRpYWxpemVkIGJ1dHRvbgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlUHVzaEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgYnV0dG9uVGV4dCwgaW50IGJ1dHRvbklkKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJYnV0dG9uLnNldFRleHQoYnV0dG9uVGV4dCk7Ci0JCWJ1dHRvbi5zZXREYXRhKG5ldyBJbnRlZ2VyKGJ1dHRvbklkKSk7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25BZGFwdGVyKTsKLQkJcHJlZmVyZW5jZVBhZ2Uuc2V0QnV0dG9uTGF5b3V0RGF0YShidXR0b24pOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBncm91cCB3aGljaCB3aWxsIGNvbnRhaW4gdGhlIGJ1dHRvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uR3JvdXAoQ29tcG9zaXRlIHRvcCkgewotCQlDb21wb3NpdGUgYnV0dG9uR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHRvcCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlidXR0b25Hcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJYnV0dG9uR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOwotCQlidXR0b25Hcm91cC5zZXRGb250KHRvcC5nZXRGb250KCkpOwotCQkKLQkJYWRkQnV0dG9uc1RvQnV0dG9uR3JvdXAoYnV0dG9uR3JvdXApOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0YWJsZSB2aWV3ZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFibGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBkYXRhPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS53aWR0aEhpbnQgPSA0MjU7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IHRhYmxlLmdldEl0ZW1IZWlnaHQoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRhYmxlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0gICAgICAgIAotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQl0YWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCQotCQljb250ZW50UHJvdmlkZXIgPSBnZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJdGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcih0aGlzLmxhYmVsUHJvdmlkZXIpOwotCQl0YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXRhYmxlU2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQl0YWJsZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIWV2ZW50LmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSAmJiBlZGl0QnV0dG9uLmlzRW5hYmxlZCgpKSB7Ci0JCQkJCWVkaXQoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKWV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlBcnJheUxpc3Qgc29ydGVycyA9IG5ldyBBcnJheUxpc3QoZlRhYmxlQ29sdW1uSGVhZGVycy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZUYWJsZUNvbHVtbkhlYWRlcnMubGVuZ3RoOyBpKyspIHsKLQkJICAgIHRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoZlRhYmxlQ29sdW1uTGF5b3V0c1tpXSk7Ci0JCSAgICBUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FLCBpKTsKLQkJICAgIGNvbHVtbi5zZXRSZXNpemFibGUoZlRhYmxlQ29sdW1uTGF5b3V0c1tpXS5yZXNpemFibGUpOwotCQkgICAgY29sdW1uLnNldFRleHQoZlRhYmxlQ29sdW1uSGVhZGVyc1tpXSk7Ci0JCSAgICBzb3J0ZXJzLmFkZChuZXcgQ29sdW1uU29ydGVyKHRoaXMudGFibGVWaWV3ZXIsIGNvbHVtbikgewotCQkgICAgCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFyZVRleHQoT2JqZWN0IG9iaiwgaW50IGNvbHVtbmluZGV4KSB7Ci0JCSAgICAJCXJldHVybiBBbnRQYWdlLnRoaXMubGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0KG9iaiwgY29sdW1uaW5kZXgpOwotCQkgICAgCX0KLQkJICAgIH0pOwotCQl9Ci0JCQotCQl0YWJsZS5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZWRpdEJ1dHRvbi5pc0VuYWJsZWQoKSAmJiBldmVudC5jaGFyYWN0ZXIgPT0gU1dULkRFTCAmJiBldmVudC5zdGF0ZU1hc2sgPT0gMCkgewotCQkJCQlyZW1vdmUodGFibGVWaWV3ZXIpOwotCQkJCX0KLQkJCX0KLQkJfSk7CQotCQkKLQkJcmVzdG9yZUNvbHVtblNldHRpbmdzKEFudFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpLCBzb3J0ZXJzKTsKLQl9Ci0JCi0JLyoqCi0JICogUGVyc2lzdCB0YWJsZSBzZXR0aW5ncyBpbnRvIHRoZSBnaXZlIGRpYWxvZyBzdG9yZSwgcHJlZml4ZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBrZXkuCi0JICogCi0JICogQHBhcmFtIHNldHRpbmdzIGRpYWxvZyBzdG9yZQotCSAqIEBzaW5jZSAzLjUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlQ29sdW1uU2V0dGluZ3MoSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzKSB7Ci0JCVRhYmxlIHRhYmxlID0gdGhpcy50YWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgICAgICBpbnQgY29sdW1uQ291bnQgPSB0YWJsZS5nZXRDb2x1bW5Db3VudCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkNvdW50OyBpKyspIHsKLQkJCXNldHRpbmdzLnB1dChnZXRIZWxwQ29udGV4dElkKCkgKyAiLmNvbHVtbldpZHRoIiArIGksIHRhYmxlLmdldENvbHVtbihpKS5nZXRXaWR0aCgpKTsJIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSB0YWJsZS5nZXRTb3J0Q29sdW1uKCk7Ci0JCWlmKGNvbHVtbiAhPSBudWxsKSB7Ci0JCQlzZXR0aW5ncy5wdXQoZ2V0SGVscENvbnRleHRJZCgpICsgIi5zb3J0Q29sdW1uIiwgdGFibGUuaW5kZXhPZihjb2x1bW4pKTsgLy8kTk9OLU5MUy0xJAotCQkJc2V0dGluZ3MucHV0KGdldEhlbHBDb250ZXh0SWQoKSArICIuc29ydERpcmVjdGlvbiIsIHRhYmxlLmdldFNvcnREaXJlY3Rpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXN0b3JlIHRhYmxlIHNldHRpbmdzIGZyb20gdGhlIGdpdmVuIGRpYWxvZyBzdG9yZSB1c2luZyB0aGUKLQkgKiBnaXZlbiBrZXkuCi0JICogCi0JICogQHBhcmFtIHNldHRpbmdzIGRpYWxvZyBzZXR0aW5ncyBzdG9yZQotCSAqIEBzaW5jZSAzLjUKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzdG9yZUNvbHVtblNldHRpbmdzKElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncywgQXJyYXlMaXN0IHNvcnRlcnMpIHsKLSAgICAgICAgcmVzdG9yZUNvbHVtbldpZHRocyhzZXR0aW5ncyk7Ci0gICAgICAgIGludCBpZHggPSAwOwotICAgICAgICBpbnQgZGlyZWN0aW9uID0gU1dULkRPV047Ci0JCXRyeSB7Ci0JCQlpZHggPSBzZXR0aW5ncy5nZXRJbnQoZ2V0SGVscENvbnRleHRJZCgpICsgIi5zb3J0Q29sdW1uIik7IC8vJE5PTi1OTFMtMSQKLQkJCWRpcmVjdGlvbiA9IHNldHRpbmdzLmdldEludChnZXRIZWxwQ29udGV4dElkKCkgKyAiLnNvcnREaXJlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9IAotCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHt9Ci0JCVRhYmxlIHRhYmxlID0gdGhpcy50YWJsZVZpZXdlci5nZXRUYWJsZSgpOwotCQlpZih0YWJsZS5nZXRDb2x1bW5Db3VudCgpIDwgMSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IHRhYmxlLmdldENvbHVtbihpZHgpOwotCQlpZihjb2x1bW4gIT0gbnVsbCkgewotCQkJdGFibGUuc2V0U29ydENvbHVtbihjb2x1bW4pOwotCQkJdGFibGUuc2V0U29ydERpcmVjdGlvbihkaXJlY3Rpb24pOwotCQkJQ29sdW1uU29ydGVyIHNvcnRlciA9IChDb2x1bW5Tb3J0ZXIpIHNvcnRlcnMuZ2V0KGlkeCk7Ci0JCQlzb3J0ZXIuc2V0RGlyZWN0aW9uKGRpcmVjdGlvbik7Ci0JCX0KLQkJc29ydGVycy5jbGVhcigpOwotCX0KLQkKLQkvKioKLQkgKiBSZXN0b3JlcyB0aGUgY29sdW1uIHdpZHRocyBmcm9tIGRpYWxvZyBzZXR0aW5ncwotCSAqIAotCSAqIEBwYXJhbSBzZXR0aW5ncwotCSAqIEBzaW5jZSAzLjUKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzdG9yZUNvbHVtbldpZHRocyhJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MpIHsKLQkJVGFibGUgdGFibGUgPSB0aGlzLnRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0gICAgICAgIGludCBjb2x1bW5Db3VudCA9IHRhYmxlLmdldENvbHVtbkNvdW50KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uQ291bnQ7IGkrKykgewotICAgICAgICAgICAgaW50IHdpZHRoID0gLTE7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHdpZHRoID0gc2V0dGluZ3MuZ2V0SW50KGdldEhlbHBDb250ZXh0SWQoKSArICIuY29sdW1uV2lkdGgiICsgaSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7fQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoKHdpZHRoIDw9IDApIHx8IChpID09IHRhYmxlLmdldENvbHVtbkNvdW50KCkgLSAxKSkgewotICAgICAgICAgICAgCXRhYmxlLmdldENvbHVtbihpKS5wYWNrKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgCXRhYmxlLmdldENvbHVtbihpKS5zZXRXaWR0aCh3aWR0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCBwcm92aWRlciB0byB1c2UgZm9yIHRoZSB0YWJsZSB2aWV3ZXIKLQkgKiAKLQkgKiBAcmV0dXJuIEFudFBhZ2VDb250ZW50UHJvdmlkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgQW50Q29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBBbnRDb250ZW50UHJvdmlkZXIoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBsaXN0ZWQgb2JqZWN0cyBpbiB0aGUgdGFibGUgaWYgdGhlIGxpYnJhcnkKLQkgKiBmb3IgdGhhdCBlbnRyeSBpcyBzdGlsbCBpbmNsdWRlZCBpbiB0aGUgcHJlZmVyZW5jZXMuICBEZWZhdWx0IG9iamVjdHMKLQkgKiBhcmUgaW5jbHVkZWQgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+Zm9yRGlzcGxheTwvY29kZT4gcGFyYW1ldGVyLgotCSAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyB3aWRnZXQgaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkCi0JICogb3IgaGFzIGJlZW4gZGlzcG9zZWQuCi0JICogQHBhcmFtIGZvckRpc3BsYXkgV2hldGhlciB0aGUgcmVzdWx0IGlzIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgVUkgb3Igc3RvcmVkIGluIHRoZSBwcmVmZXJlbmNlcwotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2Ygb2JqZWN0cyBjdXJyZW50bHkgZGlzcGxheWVkIGluIHRoZSB0YWJsZQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldENvbnRlbnRzKGJvb2xlYW4gZm9yRGlzcGxheSkgewotCQlpZiAodGFibGVWaWV3ZXIgPT0gbnVsbCB8fCB0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlMaXN0IGVudHJpZXM9IGdldFByZWZlcmVuY2VQYWdlKCkuZ2V0TGlicmFyeUVudHJpZXMoKTsKLQkJCi0JCU9iamVjdFtdIGVsZW1lbnRzID0gY29udGVudFByb3ZpZGVyLmdldEVsZW1lbnRzKHRhYmxlVmlld2VyLmdldElucHV0KCkpOwotCQlMaXN0IGNvbnRlbnRzPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnRzLmxlbmd0aCk7Ci0JCU9iamVjdCBlbGVtZW50OwotCQlBbnRPYmplY3QgYW50T2JqZWN0OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQllbGVtZW50PSBlbGVtZW50c1tpXTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQW50T2JqZWN0KSB7Ci0JCQkJYW50T2JqZWN0PSAoQW50T2JqZWN0KWVsZW1lbnQ7Ci0JCQkJaWYgKGZvckRpc3BsYXkpIHsKLQkJCQkJaWYgKCFhbnRPYmplY3QuaXNEZWZhdWx0KCkgJiYgIWVudHJpZXMuY29udGFpbnMoYW50T2JqZWN0LmdldExpYnJhcnlFbnRyeSgpKSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGFudE9iamVjdC5pc0RlZmF1bHQoKSB8fCAhZW50cmllcy5jb250YWlucyhhbnRPYmplY3QuZ2V0TGlicmFyeUVudHJ5KCkpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCWNvbnRlbnRzLmFkZChlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gY29udGVudHM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlbGVjdGlvbiBpbiB0aGUgdmlld2VyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCWlmICh0YWJsZVZpZXdlciA9PSBudWxsIHx8IHRhYmxlVmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoZWxsIG9mIHRoZSBzdWItcGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCWlmICh0YWJsZVZpZXdlciA9PSBudWxsIHx8IHRhYmxlVmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKTsKLQl9Ci0JCi0JLyoqCi0JICogSGFuZGxlcyB0aGUgcmVtb3ZlIGJ1dHRvbiBwcmVzc2VkIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKCkgewotCQlyZW1vdmUodGFibGVWaWV3ZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoVGFibGVWaWV3ZXIgdmlld2VyKSB7Ci0JCUFudENvbnRlbnRQcm92aWRlciBhbnRDb250ZW50UHJvdmlkZXI9IChBbnRDb250ZW50UHJvdmlkZXIpdmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJSXRlcmF0b3IgaXRyID0gc2VsLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlhbnRDb250ZW50UHJvdmlkZXIucmVtb3ZlKGl0ci5uZXh0KCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGNvbnRlbnRzIG9mIHRoZSB0YWJsZSBvbiB0aGlzIHBhZ2UuICBIYXMgbm8gZWZmZWN0Ci0JICogaWYgdGhpcyB3aWRnZXQgaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkIG9yIGhhcyBiZWVuIGRpc3Bvc2VkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldElucHV0KExpc3QgaW5wdXRzKSB7Ci0JCWlmICh0YWJsZVZpZXdlciA9PSBudWxsIHx8IHRhYmxlVmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0YWJsZVZpZXdlci5zZXRJbnB1dChpbnB1dHMpOwotCQl0YWJsZVNlbGVjdGlvbkNoYW5nZWQoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgY29udGVudCBlbGVtZW50IGluIHRoZSB0YWJsZSB2aWV3ZXIuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgdXBkYXRlQ29udGVudChPYmplY3QgZWxlbWVudCkgewotCQlpZiAodGFibGVWaWV3ZXIgPT0gbnVsbCB8fCB0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGFibGVWaWV3ZXIudXBkYXRlKGVsZW1lbnQsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGNvbnRlbnRzIG9mIHRoaXMgcGFnZQotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHRvcCkgewotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRvcCwgZ2V0SGVscENvbnRleHRJZCgpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAyOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAyOwotCQl0b3Auc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQl0b3Auc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJY3JlYXRlVGFibGUodG9wKTsKLQkJY3JlYXRlQnV0dG9uR3JvdXAodG9wKTsKLQkJCi0JCXJldHVybiB0b3A7Ci0JfQotCQotCXByb3RlY3RlZCBBbnRSdW50aW1lUHJlZmVyZW5jZVBhZ2UgZ2V0UHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXJldHVybiBwcmVmZXJlbmNlUGFnZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIGdldFRhYmxlVmlld2VyKCkgewotCQlyZXR1cm4gdGFibGVWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBzZWxlY3Rpb24gY2hhbmdlcyBpbiB0aGUgdGFibGUgdmlld2VyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRhYmxlU2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBuZXdTZWxlY3Rpb24pIHsKLQkJaW50IHNpemUgPSBuZXdTZWxlY3Rpb24uc2l6ZSgpOwotCQlib29sZWFuIGVuYWJsZWQ9IHRydWU7Ci0JCQotCQlJdGVyYXRvciBpdHI9IG5ld1NlbGVjdGlvbi5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdHIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBbnRPYmplY3QpIHsKLQkJCQlBbnRPYmplY3QgYW50T2JqZWN0PSAoQW50T2JqZWN0KWVsZW1lbnQ7Ci0JCQkJaWYgKGFudE9iamVjdC5pc0RlZmF1bHQoKSkgewotCQkJCQllbmFibGVkPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVkaXRCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkICYmIHNpemUgPT0gMSk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQgJiYgc2l6ZSA+IDApOwotCX0KLQkKLQkvKioKLQkgKiBBbGxvd3MgdGhlIHVzZXIgdG8gZWRpdCBhIGN1c3RvbSBBbnQgb2JqZWN0LgotCSAqCi0JICogQHBhcmFtIHNlbGVjdGlvbiBUaGUgc2VsZWN0aW9uIGNvbnRhaW5pbmcgdGhlIG9iamVjdCB0byBlZGl0Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZWRpdChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pOwotICAgIAotICAgIC8qKgotICAgICAqIEFsbG93cyB0aGUgdXNlciB0byBhZGQgYSBjdXN0b20gQW50IG9iamVjdC4KLSAgICAgKgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZCgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBwYWdlJ3MgaGVscCBjb250ZXh0IGlkLCB3aGljaCBpcyBob29rZWQKLQkgKiB0byB0aGlzIHBhZ2Ugb24gY3JlYXRpb24uCi0JICogCi0JICogQHJldHVybiBoZWxwIGNvbnRleHQgaWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEhlbHBDb250ZXh0SWQoKTsKLQotCXByb3RlY3RlZCB2b2lkIGNvbm5lY3RUb0ZvbGRlcihmaW5hbCBUYWJJdGVtIGl0ZW0sIFRhYkZvbGRlciBmb2xkZXIpIHsKLQkJZm9sZGVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChlLml0ZW0gPT0gaXRlbSkgewotCQkJCQkvL3JlbW92ZSBhbnQgb2JqZWN0cyB3aG9zZSBsaWJyYXJ5IGhhcyBiZWVuIHJlbW92ZWQKLQkJCQkJc2V0SW5wdXQoZ2V0Q29udGVudHModHJ1ZSkpOwotCQkJCX0KLQkJCX0KLQkJfSk7CQkKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRQcmV2aWV3ZXJVcGRhdGVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRQcmV2aWV3ZXJVcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NzIzZjQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQW50UHJldmlld2VyVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50U291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLmZvcm1hdHRlci5Gb3JtYXR0aW5nUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5mb3JtYXR0ZXIuWG1sRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3I7Ci0KLS8qKgotICogSGFuZGxlcyBjaGFuZ2VzIGZvciBBbnQgcHJldmlldyB2aWV3ZXJzLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLWNsYXNzIEFudFByZXZpZXdlclVwZGF0ZXIgewotCQotCXByaXZhdGUgQ29sb3IgZkZvcmVncm91bmRDb2xvcj0gbnVsbDsKLQlwcml2YXRlIENvbG9yIGZCYWNrZ3JvdW5kQ29sb3I9IG51bGw7Ci0JcHJpdmF0ZSBDb2xvciBmU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yPSBudWxsOwotCXByaXZhdGUgQ29sb3IgZlNlbGVjdGlvbkZvcmVncm91bmRDb2xvcj0gbnVsbDsKLQkKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgc291cmNlIHByZXZpZXcgdXBkYXRlciBmb3IgdGhlIGdpdmVuIHZpZXdlciwgY29uZmlndXJhdGlvbiBhbmQgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKgotCSAqIEBwYXJhbSB2aWV3ZXIgdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHRoZSBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHByZWZlcmVuY2VTdG9yZSB0aGUgcHJlZmVyZW5jZSBzdG9yZQotCSAqLwotCXB1YmxpYyBBbnRQcmV2aWV3ZXJVcGRhdGVyKGZpbmFsIFNvdXJjZVZpZXdlciB2aWV3ZXIsIGZpbmFsIEFudFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmZXJlbmNlU3RvcmUpIHsKLQkJCi0JCWluaXRpYWxpemVWaWV3ZXJDb2xvcnModmlld2VyLCBwcmVmZXJlbmNlU3RvcmUpOwotCQkKLQkJZmluYWwgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZm9udENoYW5nZUxpc3RlbmVyPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkvKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlKG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhKRmFjZVJlc291cmNlcy5URVhUX0ZPTlQpKSB7Ci0JCQkJCUZvbnQgZm9udD0gSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udChKRmFjZVJlc291cmNlcy5URVhUX0ZPTlQpOwotCQkJCQl2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpLnNldEZvbnQoZm9udCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlmaW5hbCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkvKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlKG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQotCQkJCVN0cmluZyBwcm9wZXJ0eT0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJCQkJCi0JCQkJaWYgKEFic3RyYWN0VGV4dEVkaXRvci5QUkVGRVJFTkNFX0NPTE9SX0ZPUkVHUk9VTkQuZXF1YWxzKHByb3BlcnR5KSB8fCBBYnN0cmFjdFRleHRFZGl0b3IuUFJFRkVSRU5DRV9DT0xPUl9GT1JFR1JPVU5EX1NZU1RFTV9ERUZBVUxULmVxdWFscyhwcm9wZXJ0eSkgfHwKLQkJCQkJCUFic3RyYWN0VGV4dEVkaXRvci5QUkVGRVJFTkNFX0NPTE9SX0JBQ0tHUk9VTkQuZXF1YWxzKHByb3BlcnR5KSB8fAlBYnN0cmFjdFRleHRFZGl0b3IuUFJFRkVSRU5DRV9DT0xPUl9CQUNLR1JPVU5EX1NZU1RFTV9ERUZBVUxULmVxdWFscyhwcm9wZXJ0eSkgfHwKLQkJCQkJCUFic3RyYWN0VGV4dEVkaXRvci5QUkVGRVJFTkNFX0NPTE9SX1NFTEVDVElPTl9GT1JFR1JPVU5ELmVxdWFscyhwcm9wZXJ0eSkgfHwgQWJzdHJhY3RUZXh0RWRpdG9yLlBSRUZFUkVOQ0VfQ09MT1JfU0VMRUNUSU9OX0ZPUkVHUk9VTkRfU1lTVEVNX0RFRkFVTFQuZXF1YWxzKHByb3BlcnR5KSB8fAotCQkJCQkJQWJzdHJhY3RUZXh0RWRpdG9yLlBSRUZFUkVOQ0VfQ09MT1JfU0VMRUNUSU9OX0JBQ0tHUk9VTkQuZXF1YWxzKHByb3BlcnR5KSB8fAlBYnN0cmFjdFRleHRFZGl0b3IuUFJFRkVSRU5DRV9DT0xPUl9TRUxFQ1RJT05fQkFDS0dST1VORF9TWVNURU1fREVGQVVMVC5lcXVhbHMocHJvcGVydHkpKQotCQkJCQl7Ci0JCQkJCQlpbml0aWFsaXplVmlld2VyQ29sb3JzKHZpZXdlciwgcHJlZmVyZW5jZVN0b3JlKTsKLQkJCQl9IAotCQkJCQotCQkJCWlmIChjb25maWd1cmF0aW9uLmFmZmVjdHNUZXh0UHJlc2VudGF0aW9uKGV2ZW50KSkgewotCQkJCQljb25maWd1cmF0aW9uLmFkYXB0VG9QcmVmZXJlbmNlQ2hhbmdlKGV2ZW50KTsKLQkJCQkJdmlld2VyLmludmFsaWRhdGVUZXh0UHJlc2VudGF0aW9uKCk7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChGb3JtYXR0aW5nUHJlZmVyZW5jZXMuYWZmZWN0c0Zvcm1hdHRpbmcoZXZlbnQpKSB7Ci0JCQkJCWZvcm1hdCh2aWV3ZXIsIHByZWZlcmVuY2VTdG9yZSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBwYXJhbSB2aWV3ZXIKLQkJCSAqIEBwYXJhbSBwcmVmZXJlbmNlU3RvcmUKLQkJCSAqLwotCQkJcHJpdmF0ZSB2b2lkIGZvcm1hdChmaW5hbCBTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBmaW5hbCBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlKSB7Ci0JCQkJU3RyaW5nIGNvbnRlbnRzPSBzb3VyY2VWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXQoKTsKLQkJCQlGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnM9IG5ldyBGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKTsKLQkJCQlwcmVmcy5zZXRQcmVmZXJlbmNlU3RvcmUoc3RvcmUpOwotCQkJCWNvbnRlbnRzPSBYbWxGb3JtYXR0ZXIuZm9ybWF0KGNvbnRlbnRzLCBwcmVmcyk7Ci0JCQkJdmlld2VyLmdldERvY3VtZW50KCkuc2V0KGNvbnRlbnRzKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyLmdldFRleHRXaWRnZXQoKS5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCS8qCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyI3dpZGdldERpc3Bvc2VkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCXByZWZlcmVuY2VTdG9yZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkJCUpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLnJlbW92ZUxpc3RlbmVyKGZvbnRDaGFuZ2VMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0pOwotCQlKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5hZGRMaXN0ZW5lcihmb250Q2hhbmdlTGlzdGVuZXIpOwotCQlwcmVmZXJlbmNlU3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGdpdmVuIHZpZXdlcidzIGNvbG9ycy4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyIHRoZSB2aWV3ZXIgdG8gYmUgaW5pdGlhbGl6ZWQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZpZXdlckNvbG9ycyhJU291cmNlVmlld2VyIHZpZXdlciwgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQkJCi0JCVN0eWxlZFRleHQgc3R5bGVkVGV4dD0gdmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJCi0JCS8vIC0tLS0tLS0tLS0tIGZvcmVncm91bmQgY29sb3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJQ29sb3IgY29sb3I9IHN0b3JlLmdldEJvb2xlYW4oQWJzdHJhY3RUZXh0RWRpdG9yLlBSRUZFUkVOQ0VfQ09MT1JfRk9SRUdST1VORF9TWVNURU1fREVGQVVMVCkKLQkJCT8gbnVsbAotCQkJOiBjcmVhdGVDb2xvcihzdG9yZSwgQWJzdHJhY3RUZXh0RWRpdG9yLlBSRUZFUkVOQ0VfQ09MT1JfRk9SRUdST1VORCwgc3R5bGVkVGV4dC5nZXREaXNwbGF5KCkpOwotCQlzdHlsZWRUZXh0LnNldEZvcmVncm91bmQoY29sb3IpOwotCQkJCi0JCWlmIChmRm9yZWdyb3VuZENvbG9yICE9IG51bGwpIHsKLQkJCWZGb3JlZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlmRm9yZWdyb3VuZENvbG9yPSBjb2xvcjsKLQkJCi0JCS8vIC0tLS0tLS0tLS0gYmFja2dyb3VuZCBjb2xvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCWNvbG9yPSBzdG9yZS5nZXRCb29sZWFuKEFic3RyYWN0VGV4dEVkaXRvci5QUkVGRVJFTkNFX0NPTE9SX0JBQ0tHUk9VTkRfU1lTVEVNX0RFRkFVTFQpCi0JCQk/IG51bGwKLQkJCTogY3JlYXRlQ29sb3Ioc3RvcmUsIEFic3RyYWN0VGV4dEVkaXRvci5QUkVGRVJFTkNFX0NPTE9SX0JBQ0tHUk9VTkQsIHN0eWxlZFRleHQuZ2V0RGlzcGxheSgpKTsKLQkJc3R5bGVkVGV4dC5zZXRCYWNrZ3JvdW5kKGNvbG9yKTsKLQkJCQotCQlpZiAoZkJhY2tncm91bmRDb2xvciAhPSBudWxsKSB7Ci0JCQlmQmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJfQotCQkJCi0JCWZCYWNrZ3JvdW5kQ29sb3I9IGNvbG9yOwotCQkKLQkJLy8gLS0tLS0tLS0tLS0gc2VsZWN0aW9uIGZvcmVncm91bmQgY29sb3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJY29sb3I9IHN0b3JlLmdldEJvb2xlYW4oQWJzdHJhY3RUZXh0RWRpdG9yLlBSRUZFUkVOQ0VfQ09MT1JfU0VMRUNUSU9OX0ZPUkVHUk9VTkRfU1lTVEVNX0RFRkFVTFQpCi0JCQk/IG51bGwKLQkJCTogY3JlYXRlQ29sb3Ioc3RvcmUsIEFic3RyYWN0VGV4dEVkaXRvci5QUkVGRVJFTkNFX0NPTE9SX1NFTEVDVElPTl9GT1JFR1JPVU5ELCBzdHlsZWRUZXh0LmdldERpc3BsYXkoKSk7Ci0JCXN0eWxlZFRleHQuc2V0U2VsZWN0aW9uRm9yZWdyb3VuZChjb2xvcik7Ci0JCQkKLQkJaWYgKGZTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IgIT0gbnVsbCkgewotCQkJZlNlbGVjdGlvbkZvcmVncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCWZTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3I9IGNvbG9yOwotCQkKLQkJLy8gLS0tLS0tLS0tLSBzZWxlY3Rpb24gYmFja2dyb3VuZCBjb2xvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCWNvbG9yPSBzdG9yZS5nZXRCb29sZWFuKEFic3RyYWN0VGV4dEVkaXRvci5QUkVGRVJFTkNFX0NPTE9SX1NFTEVDVElPTl9CQUNLR1JPVU5EX1NZU1RFTV9ERUZBVUxUKQotCQkJPyBudWxsCi0JCQk6IGNyZWF0ZUNvbG9yKHN0b3JlLCBBYnN0cmFjdFRleHRFZGl0b3IuUFJFRkVSRU5DRV9DT0xPUl9TRUxFQ1RJT05fQkFDS0dST1VORCwgc3R5bGVkVGV4dC5nZXREaXNwbGF5KCkpOwotCQlzdHlsZWRUZXh0LnNldFNlbGVjdGlvbkJhY2tncm91bmQoY29sb3IpOwotCQkJCi0JCWlmIChmU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yICE9IG51bGwpIHsKLQkJCWZTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQl9Ci0JCQkKLQkJZlNlbGVjdGlvbkJhY2tncm91bmRDb2xvcj0gY29sb3I7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb2xvciBmcm9tIHRoZSBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIGdpdmVuIHByZWZlcmVuY2Ugc3RvcmUuCi0JICogUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBzdWNoIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RvcmUgdGhlIHN0b3JlIHRvIHJlYWQgZnJvbQotCSAqIEBwYXJhbSBrZXkgdGhlIGtleSB1c2VkIGZvciB0aGUgbG9va3VwIGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlCi0JICogQHBhcmFtIGRpc3BsYXkgdGhlIGRpc3BsYXkgdXNlZCBjcmVhdGUgdGhlIGNvbG9yCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBjb2xvciBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24gaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJpdmF0ZSBDb2xvciBjcmVhdGVDb2xvcihJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLCBTdHJpbmcga2V5LCBEaXNwbGF5IGRpc3BsYXkpIHsKLQkKLQkJUkdCIHJnYj0gbnVsbDsJCQotCQkKLQkJaWYgKHN0b3JlLmNvbnRhaW5zKGtleSkpIHsKLQkJCQotCQkJaWYgKHN0b3JlLmlzRGVmYXVsdChrZXkpKQotCQkJCXJnYj0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXREZWZhdWx0Q29sb3Ioc3RvcmUsIGtleSk7Ci0JCQllbHNlCi0JCQkJcmdiPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKHN0b3JlLCBrZXkpOwotCQkKLQkJCWlmIChyZ2IgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IENvbG9yKGRpc3BsYXksIHJnYik7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChmRm9yZWdyb3VuZENvbG9yICE9IG51bGwpIHsKLQkJCWZGb3JlZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJZkZvcmVncm91bmRDb2xvcj0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKGZCYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCkgewotCQkJZkJhY2tncm91bmRDb2xvci5kaXNwb3NlKCk7Ci0JCQlmQmFja2dyb3VuZENvbG9yPSBudWxsOwotCQl9Ci0JCQotCQlpZiAoZlNlbGVjdGlvbkZvcmVncm91bmRDb2xvciAhPSBudWxsKSB7Ci0JCQlmU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCWZTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3I9IG51bGw7Ci0JCX0KLQkJCi0JCWlmIChmU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yICE9IG51bGwpIHsKLQkJCWZTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IuZGlzcG9zZSgpOwotCQkJZlNlbGVjdGlvbkJhY2tncm91bmRDb2xvcj0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FudFByb3BlcnRpZXNQYWdlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRQcm9wZXJ0aWVzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODI4ZWYzLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FudFByb3BlcnRpZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgZm9yIHNldHRpbmcgZ2xvYmFsIEFudCB1c2VyIHByb3BlcnRpZXMuCi0gKiBBbGwgcHJvcGVydGllcyBzcGVjaWZpZWQgaGVyZSB3aWxsIGJlIHNldCBhcyB1c2VyIHByb3BlcnRpZXMgb24gdGhlIAotICogcHJvamVjdCBmb3IgYW55IEFudCBidWlsZAotICovCi1wdWJsaWMgY2xhc3MgQW50UHJvcGVydGllc1BhZ2UgaW1wbGVtZW50cyBJQW50QmxvY2tDb250YWluZXIgewotCQotCXByaXZhdGUgQW50UHJvcGVydGllc0Jsb2NrIGFudFByb3BlcnRpZXNCbG9jaz0gbmV3IEFudFByb3BlcnRpZXNCbG9jayh0aGlzKTsKLQlwcml2YXRlIEFudFJ1bnRpbWVQcmVmZXJlbmNlUGFnZSBwcmVmZXJlbmNlUGFnZTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBbnRQcm9wZXJ0aWVzUGFnZShBbnRSdW50aW1lUHJlZmVyZW5jZVBhZ2UgcHJlZmVyZW5jZVBhZ2UpIHsKLQkJdGhpcy5wcmVmZXJlbmNlUGFnZT0gcHJlZmVyZW5jZVBhZ2U7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRhYiBpdGVtIHRoYXQgY29udGFpbnMgdGhpcyBzdWItcGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgVGFiSXRlbSBjcmVhdGVUYWJJdGVtKFRhYkZvbGRlciBmb2xkZXIpIHsKLQkJVGFiSXRlbSBpdGVtID0gbmV3IFRhYkl0ZW0oZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChBbnRQcmVmZXJlbmNlc01lc3NhZ2VzLkFudFByb3BlcnRpZXNQYWdlX3RpdGxlKTsKLQkJaXRlbS5zZXRJbWFnZShBbnRPYmplY3RMYWJlbFByb3ZpZGVyLmdldFByb3BlcnR5SW1hZ2UoKSk7Ci0JCWl0ZW0uc2V0RGF0YSh0aGlzKTsKLQkJaXRlbS5zZXRDb250cm9sKGNyZWF0ZUNvbnRlbnRzKGZvbGRlcikpOwotCQlyZXR1cm4gaXRlbTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7Ci0JCQotCQlDb21wb3NpdGUgdG9wID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJdG9wLnNldEZvbnQoZm9udCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodG9wLCBJQW50VUlIZWxwQ29udGV4dElkcy5BTlRfUFJPUEVSVElFU19QQUdFKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucz0gMjsKLQkJdG9wLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQl0b3Auc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7IAotCQkJCQotCQlhbnRQcm9wZXJ0aWVzQmxvY2suY3JlYXRlQ29udHJvbCh0b3AsIEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50UHJvcGVydGllc1BhZ2VfX0dsb2JhbF9wcm9wZXJ0aWVzX18xLCBBbnRQcmVmZXJlbmNlc01lc3NhZ2VzLkFudFByb3BlcnRpZXNQYWdlX0dsb19iYWxfcHJvcGVydHlfZmlsZXNfXzIpOwotCQkKLQkJcmV0dXJuIHRvcDsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgY29udGVudHMgb2YgdGhlIHRhYmxlcyBvbiB0aGlzIHBhZ2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJTGlzdCBhbGxQcm9wZXJ0aWVzPSBBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdFByb3BlcnRpZXMoKTsKLQkJYWxsUHJvcGVydGllcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCkuZ2V0Q3VzdG9tUHJvcGVydGllcygpKSk7Ci0JCWFudFByb3BlcnRpZXNCbG9jay5zZXRQcm9wZXJ0aWVzSW5wdXQoKFByb3BlcnR5W10pIGFsbFByb3BlcnRpZXMudG9BcnJheShuZXcgUHJvcGVydHlbYWxsUHJvcGVydGllcy5zaXplKCldKSk7Ci0JCWFudFByb3BlcnRpZXNCbG9jay5zZXRQcm9wZXJ0eUZpbGVzSW5wdXQoQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpLmdldEN1c3RvbVByb3BlcnR5RmlsZXMoZmFsc2UpKTsKLQkJYW50UHJvcGVydGllc0Jsb2NrLnVwZGF0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCUxpc3QgZGVmYXVsdFByb3BlcnRpZXM9IEFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0UHJvcGVydGllcygpOwotCQlhbnRQcm9wZXJ0aWVzQmxvY2suc2V0UHJvcGVydGllc0lucHV0KChQcm9wZXJ0eVtdKSBkZWZhdWx0UHJvcGVydGllcy50b0FycmF5KG5ldyBQcm9wZXJ0eVtkZWZhdWx0UHJvcGVydGllcy5zaXplKCldKSk7Ci0JCWFudFByb3BlcnRpZXNCbG9jay5zZXRQcm9wZXJ0eUZpbGVzSW5wdXQobmV3IFN0cmluZ1swXSk7Ci0JCWFudFByb3BlcnRpZXNCbG9jay51cGRhdGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogRGVsZWdhdGVzIHRvIHNhdmluZyBhbnkgYWRkaXRpb25hbCB0YWJsZSBzZXR0aW5ncyB3aGVuIHRoZSBwYWdlIGlzIGNsb3NlZAotCSAqIAotCSAqIEBzaW5jZSAzLjUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlQWRkaXRpb25hbFNldHRpbmdzKCkgewotCQlhbnRQcm9wZXJ0aWVzQmxvY2suc2F2ZVNldHRpbmdzKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBmaWxlcwotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nW10KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UHJvcGVydHlGaWxlcygpIHsKLQkJT2JqZWN0W10gZWxlbWVudHMgPSBhbnRQcm9wZXJ0aWVzQmxvY2suZ2V0UHJvcGVydHlGaWxlcygpOwotCQlTdHJpbmdbXSBmaWxlcz0gbmV3IFN0cmluZ1tlbGVtZW50cy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaWxlc1tpXSA9IChTdHJpbmcpZWxlbWVudHNbaV07Ci0JCX0KLQkJcmV0dXJuIGZpbGVzOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuSUFudEJsb2NrQ29udGFpbmVyI3NldE1lc3NhZ2UoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXByZWZlcmVuY2VQYWdlLnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLklBbnRCbG9ja0NvbnRhaW5lciNzZXRFcnJvck1lc3NhZ2UoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcHJlZmVyZW5jZVBhZ2Uuc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5JQW50QmxvY2tDb250YWluZXIjY3JlYXRlUHVzaEJ1dHRvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIEJ1dHRvbiBjcmVhdGVQdXNoQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBidXR0b25UZXh0KSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJYnV0dG9uLnNldFRleHQoYnV0dG9uVGV4dCk7Ci0JCXByZWZlcmVuY2VQYWdlLnNldEJ1dHRvbkxheW91dERhdGEoYnV0dG9uKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuSUFudEJsb2NrQ29udGFpbmVyI3VwZGF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCBnZXRQcm9wZXJ0aWVzKCkgewotCQlPYmplY3RbXSBhbGxQcm9wZXJ0aWVzPSBhbnRQcm9wZXJ0aWVzQmxvY2suZ2V0UHJvcGVydGllcygpOwotCQlMaXN0IHByb3BlcnRpZXM9IG5ldyBBcnJheUxpc3QoYWxsUHJvcGVydGllcy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCVByb3BlcnR5IHByb3BlcnR5ID0gKFByb3BlcnR5KWFsbFByb3BlcnRpZXNbaV07Ci0JCQlpZiAoIXByb3BlcnR5LmlzRGVmYXVsdCgpKSB7Ci0JCQkJcHJvcGVydGllcy5hZGQocHJvcGVydHkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0FudFJ1bnRpbWVQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQW50UnVudGltZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMDk3NDUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQW50UnVudGltZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuQW50VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBBbnQgcHJlZmVyZW5jZSBwYWdlIHRvIHNldCB0aGUgY2xhc3NwYXRoLCB0YXNrcywgdHlwZXMgYW5kIHByb3BlcnRpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRSdW50aW1lUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0JCi0JcHJpdmF0ZSBBbnRDbGFzc3BhdGhQYWdlIGNsYXNzcGF0aFBhZ2U7Ci0JcHJpdmF0ZSBBbnRUYXNrc1BhZ2UgdGFza3NQYWdlOwotCXByaXZhdGUgQW50VHlwZXNQYWdlIHR5cGVzUGFnZTsKLQlwcml2YXRlIEFudFByb3BlcnRpZXNQYWdlIHByb3BlcnRpZXNQYWdlOwotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHByZWZlcmVuY2UgcGFnZQotCSAqLwotCXB1YmxpYyBBbnRSdW50aW1lUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXNldERlc2NyaXB0aW9uKEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50UHJlZmVyZW5jZVBhZ2VfZGVzY3JpcHRpb24pOwotCQlzZXRQcmVmZXJlbmNlU3RvcmUoQW50VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChnZXRDb250cm9sKCksIElBbnRVSUhlbHBDb250ZXh0SWRzLkFOVF9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRSk7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0JCVRhYkZvbGRlciBmb2xkZXIgPSBuZXcgVGFiRm9sZGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQlmb2xkZXIuc2V0TGF5b3V0KG5ldyBUYWJGb2xkZXJMYXlvdXQoKSk7CQotCQlmb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWZvbGRlci5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0JCWNsYXNzcGF0aFBhZ2UgPSBuZXcgQW50Q2xhc3NwYXRoUGFnZSh0aGlzKTsKLQkJY2xhc3NwYXRoUGFnZS5jcmVhdGVUYWJJdGVtKGZvbGRlcik7Ci0JCQotCQl0YXNrc1BhZ2UgPSBuZXcgQW50VGFza3NQYWdlKHRoaXMpOwotCQl0YXNrc1BhZ2UuY3JlYXRlVGFiSXRlbShmb2xkZXIpOwotCQkKLQkJdHlwZXNQYWdlID0gbmV3IEFudFR5cGVzUGFnZSh0aGlzKTsKLQkJdHlwZXNQYWdlLmNyZWF0ZVRhYkl0ZW0oZm9sZGVyKTsKLQotCQlwcm9wZXJ0aWVzUGFnZT0gbmV3IEFudFByb3BlcnRpZXNQYWdlKHRoaXMpOwotCQlwcm9wZXJ0aWVzUGFnZS5jcmVhdGVUYWJJdGVtKGZvbGRlcik7Ci0JCQotCQl0YXNrc1BhZ2UuaW5pdGlhbGl6ZSgpOwotCQl0eXBlc1BhZ2UuaW5pdGlhbGl6ZSgpOwotCQljbGFzc3BhdGhQYWdlLmluaXRpYWxpemUoKTsKLQkJcHJvcGVydGllc1BhZ2UuaW5pdGlhbGl6ZSgpOwotCi0JCXJldHVybiBmb2xkZXI7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybURlZmF1bHRzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQkKLQkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZzID0gQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOwotCQl0YXNrc1BhZ2Uuc2V0SW5wdXQocHJlZnMuZ2V0RGVmYXVsdFRhc2tzKCkpOwotCQl0eXBlc1BhZ2Uuc2V0SW5wdXQocHJlZnMuZ2V0RGVmYXVsdFR5cGVzKCkpOwotCQljbGFzc3BhdGhQYWdlLnBlcmZvcm1EZWZhdWx0cygpOwotCQlwcm9wZXJ0aWVzUGFnZS5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcyA9IEFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gQW50VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCQotCQlwcmVmcy5zZXRBbnRIb21lQ2xhc3NwYXRoRW50cmllcyhjbGFzc3BhdGhQYWdlLmdldEFudEhvbWVFbnRyaWVzKCkpOwotCQkKLQkJCi0JCXByZWZzLnNldEFkZGl0aW9uYWxDbGFzc3BhdGhFbnRyaWVzKGNsYXNzcGF0aFBhZ2UuZ2V0QWRkaXRpb25hbEVudHJpZXMoKSk7Ci0JCQotCQlTdHJpbmcgYW50SG9tZT0gY2xhc3NwYXRoUGFnZS5nZXRBbnRIb21lKCk7Ci0JCXByZWZzLnNldEFudEhvbWUoYW50SG9tZSk7Ci0JCQotCQlMaXN0IGNvbnRlbnRzID0gdGFza3NQYWdlLmdldENvbnRlbnRzKGZhbHNlKTsKLQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCVRhc2tbXSB0YXNrcyA9IChUYXNrW10pIGNvbnRlbnRzLnRvQXJyYXkobmV3IFRhc2tbY29udGVudHMuc2l6ZSgpXSk7Ci0JCQlwcmVmcy5zZXRDdXN0b21UYXNrcyh0YXNrcyk7Ci0JCX0KLQkJCi0JCXRhc2tzUGFnZS5zYXZlQ29sdW1uU2V0dGluZ3Moc2V0dGluZ3MpOwotCQkKLQkJY29udGVudHMgPSB0eXBlc1BhZ2UuZ2V0Q29udGVudHMoZmFsc2UpOwotCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJVHlwZVtdIHR5cGVzID0gKFR5cGVbXSkgY29udGVudHMudG9BcnJheShuZXcgVHlwZVtjb250ZW50cy5zaXplKCldKTsKLQkJCXByZWZzLnNldEN1c3RvbVR5cGVzKHR5cGVzKTsKLQkJfQotCQkKLQkJdHlwZXNQYWdlLnNhdmVDb2x1bW5TZXR0aW5ncyhzZXR0aW5ncyk7Ci0JCQotCQljb250ZW50cyA9IHByb3BlcnRpZXNQYWdlLmdldFByb3BlcnRpZXMoKTsKLQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCVByb3BlcnR5W10gcHJvcGVydGllcyA9IChQcm9wZXJ0eVtdKSBjb250ZW50cy50b0FycmF5KG5ldyBQcm9wZXJ0eVtjb250ZW50cy5zaXplKCldKTsKLQkJCXByZWZzLnNldEN1c3RvbVByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0JCX0KLQkJCi0JCVN0cmluZ1tdIGZpbGVzID0gcHJvcGVydGllc1BhZ2UuZ2V0UHJvcGVydHlGaWxlcygpOwotCQlwcmVmcy5zZXRDdXN0b21Qcm9wZXJ0eUZpbGVzKGZpbGVzKTsKLQkJCi0JCXByb3BlcnRpZXNQYWdlLnNhdmVBZGRpdGlvbmFsU2V0dGluZ3MoKTsKLQkJCi0JCXByZWZzLnVwZGF0ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCi0JCXJldHVybiBzdXBlci5wZXJmb3JtT2soKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlI3NldEJ1dHRvbkxheW91dERhdGEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uKQotCSAqLwotCXByb3RlY3RlZCBHcmlkRGF0YSBzZXRCdXR0b25MYXlvdXREYXRhKEJ1dHRvbiBidXR0b24pIHsKLQkJcmV0dXJuIHN1cGVyLnNldEJ1dHRvbkxheW91dERhdGEoYnV0dG9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3QgZ2V0TGlicmFyeUVudHJpZXMoKSB7Ci0JCUxpc3QgdXJscz0gbmV3IEFycmF5TGlzdCgpOwotCQl1cmxzLmFkZEFsbChBcnJheXMuYXNMaXN0KGNsYXNzcGF0aFBhZ2UuZ2V0QW50SG9tZUVudHJpZXMoKSkpOwotCQl1cmxzLmFkZEFsbChBcnJheXMuYXNMaXN0KGNsYXNzcGF0aFBhZ2UuZ2V0QWRkaXRpb25hbEVudHJpZXMoKSkpOwotCQl1cmxzLmFkZEFsbChBcnJheXMuYXNMaXN0KGNsYXNzcGF0aFBhZ2UuZ2V0Q29udHJpYnV0ZWRFbnRyaWVzKCkpKTsKLQkJcmV0dXJuIHVybHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQW50VGFza3NQYWdlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRUYXNrc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg4NTkyZS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRUYXNrc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW07Ci0KLS8qKgotICogU3ViLXBhZ2UgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gZW50ZXIgY3VzdG9tIHRhc2tzCi0gKiB0byBiZSB1c2VkIHdoZW4gcnVubmluZyBBbnQgYnVpbGQgZmlsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRUYXNrc1BhZ2UgZXh0ZW5kcyBBbnRQYWdlIHsKLSAgICAKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBbnRUYXNrc1BhZ2UoQW50UnVudGltZVByZWZlcmVuY2VQYWdlIHByZWZlcmVuY2VQYWdlKSB7Ci0JCXN1cGVyKHByZWZlcmVuY2VQYWdlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLkFudFBhZ2UjYWRkQnV0dG9uc1RvQnV0dG9uR3JvdXAob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJ1dHRvbnNUb0J1dHRvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY3JlYXRlUHVzaEJ1dHRvbihwYXJlbnQsIEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50VGFza3NQYWdlXzEsIEFERF9CVVRUT04pOwotCQllZGl0QnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihwYXJlbnQsIEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50VGFza3NQYWdlXzIsIEVESVRfQlVUVE9OKTsKLQkJcmVtb3ZlQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihwYXJlbnQsIEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50VGFza3NQYWdlXzMsIFJFTU9WRV9CVVRUT04pOwotCX0KLQkKLQkvKioKLQkgKiBBbGxvd3MgdGhlIHVzZXIgdG8gZW50ZXIgYSBjdXN0b20gdGFzay4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGQoKSB7Ci0JCVN0cmluZyB0aXRsZSA9IEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50VGFza3NQYWdlX2FkZFRhc2tEaWFsb2dUaXRsZTsKLQkJQWRkQ3VzdG9tRGlhbG9nIGRpYWxvZyA9IGdldEN1c3RvbURpYWxvZyh0aXRsZSwgSUFudFVJSGVscENvbnRleHRJZHMuQUREX1RBU0tfRElBTE9HKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJVGFzayB0YXNrID0gbmV3IFRhc2soKTsKLQkJdGFzay5zZXRUYXNrTmFtZShkaWFsb2cuZ2V0TmFtZSgpKTsKLQkJdGFzay5zZXRDbGFzc05hbWUoZGlhbG9nLmdldENsYXNzTmFtZSgpKTsKLQkJdGFzay5zZXRMaWJyYXJ5RW50cnkoZGlhbG9nLmdldExpYnJhcnlFbnRyeSgpKTsKLQkJYWRkQ29udGVudCh0YXNrKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGRDdXN0b21EaWFsb2cgZ2V0Q3VzdG9tRGlhbG9nKFN0cmluZyB0aXRsZSwgU3RyaW5nIGhlbHBDb250ZXh0KSB7Ci0JCUl0ZXJhdG9yIHRhc2tzPSBnZXRDb250ZW50cyh0cnVlKS5pdGVyYXRvcigpOwotCQlMaXN0IG5hbWVzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlICh0YXNrcy5oYXNOZXh0KCkpIHsKLQkJCVRhc2sgdGFzayA9IChUYXNrKSB0YXNrcy5uZXh0KCk7Ci0JCQluYW1lcy5hZGQodGFzay5nZXRUYXNrTmFtZSgpKTsJCi0JCX0KLQkJQWRkQ3VzdG9tRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRDdXN0b21EaWFsb2coZ2V0U2hlbGwoKSwgZ2V0UHJlZmVyZW5jZVBhZ2UoKS5nZXRMaWJyYXJ5RW50cmllcygpLCBuYW1lcywgaGVscENvbnRleHQpOwotCQlkaWFsb2cuc2V0VGl0bGUodGl0bGUpOwotCQlkaWFsb2cuc2V0QWxyZWFkeUV4aXN0c0Vycm9yTXNnKEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50VGFza3NQYWdlXzgpOwotCQlkaWFsb2cuc2V0Tm9OYW1lRXJyb3JNc2coQW50UHJlZmVyZW5jZXNNZXNzYWdlcy5BbnRUYXNrc1BhZ2VfOSk7Ci0JCXJldHVybiBkaWFsb2c7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRhYiBpdGVtIHRoYXQgY29udGFpbnMgdGhpcyBzdWItcGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgVGFiSXRlbSBjcmVhdGVUYWJJdGVtKFRhYkZvbGRlciBmb2xkZXIpIHsKLQkJVGFiSXRlbSBpdGVtID0gbmV3IFRhYkl0ZW0oZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChBbnRQcmVmZXJlbmNlc01lc3NhZ2VzLkFudFRhc2tzUGFnZV90aXRsZSk7Ci0JCWl0ZW0uc2V0SW1hZ2UoQW50T2JqZWN0TGFiZWxQcm92aWRlci5nZXRUYXNrSW1hZ2UoKSk7Ci0JCWl0ZW0uc2V0RGF0YSh0aGlzKTsKLQkJQ29tcG9zaXRlIHRvcCA9IG5ldyBDb21wb3NpdGUoZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCXRvcC5zZXRGb250KGZvbGRlci5nZXRGb250KCkpOwotCQlpdGVtLnNldENvbnRyb2woY3JlYXRlQ29udGVudHModG9wKSk7Ci0JCQotCQljb25uZWN0VG9Gb2xkZXIoaXRlbSwgZm9sZGVyKTsKLQkJCi0JCXJldHVybiBpdGVtOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5BbnRQYWdlI2VkaXQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlZGl0KElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlUYXNrIHRhc2s9IChUYXNrKXNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJU3RyaW5nIHRpdGxlID0gQW50UHJlZmVyZW5jZXNNZXNzYWdlcy5BbnRUYXNrc1BhZ2VfZWRpdFRhc2tEaWFsb2dUaXRsZTsKLQkJQWRkQ3VzdG9tRGlhbG9nIGRpYWxvZyA9IGdldEN1c3RvbURpYWxvZyh0aXRsZSwgSUFudFVJSGVscENvbnRleHRJZHMuRURJVF9UQVNLX0RJQUxPRyk7Ci0JCWRpYWxvZy5zZXRDbGFzc05hbWUodGFzay5nZXRDbGFzc05hbWUoKSk7Ci0JCWRpYWxvZy5zZXROYW1lKHRhc2suZ2V0VGFza05hbWUoKSk7Ci0JCWRpYWxvZy5zZXRMaWJyYXJ5RW50cnkodGFzay5nZXRMaWJyYXJ5RW50cnkoKSk7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5DQU5DRUwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRhc2suc2V0VGFza05hbWUoZGlhbG9nLmdldE5hbWUoKSk7Ci0JCXRhc2suc2V0Q2xhc3NOYW1lKGRpYWxvZy5nZXRDbGFzc05hbWUoKSk7Ci0JCXRhc2suc2V0TGlicmFyeUVudHJ5KGRpYWxvZy5nZXRMaWJyYXJ5RW50cnkoKSk7Ci0JCXVwZGF0ZUNvbnRlbnQodGFzayk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLkFudFBhZ2UjaW5pdGlhbGl6ZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZzID0gQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOwotCQlzZXRJbnB1dChwcmVmcy5nZXRUYXNrcygpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLkFudFBhZ2UjZ2V0SGVscENvbnRleHRJZCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwQ29udGV4dElkKCkgewotCQlyZXR1cm4gSUFudFVJSGVscENvbnRleHRJZHMuQU5UX1RBU0tTX1BBR0U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQW50VHlwZXNQYWdlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRUeXBlc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJiOTcxYy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9BbnRUeXBlc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW07Ci0KLS8qKgotICogU3ViLXBhZ2UgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gZW50ZXIgY3VzdG9tIHR5cGVzCi0gKiB0byBiZSB1c2VkIHdoZW4gcnVubmluZyBBbnQgYnVpbGQgZmlsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRUeXBlc1BhZ2UgZXh0ZW5kcyBBbnRQYWdlIHsKLSAgICAKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBbnRUeXBlc1BhZ2UoQW50UnVudGltZVByZWZlcmVuY2VQYWdlIHByZWZlcmVuY2VQYWdlKSB7Ci0JCXN1cGVyKHByZWZlcmVuY2VQYWdlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLkFudFBhZ2UjYWRkQnV0dG9uc1RvQnV0dG9uR3JvdXAob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJ1dHRvbnNUb0J1dHRvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY3JlYXRlUHVzaEJ1dHRvbihwYXJlbnQsIEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50VHlwZXNQYWdlXzIsIEFERF9CVVRUT04pOwotCQllZGl0QnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihwYXJlbnQsIEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50VHlwZXNQYWdlXzMsIEVESVRfQlVUVE9OKTsKLQkJcmVtb3ZlQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihwYXJlbnQsIEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50VHlwZXNQYWdlXzEsIFJFTU9WRV9CVVRUT04pOwotCX0KLQkKLQkvKioKLQkgKiBBbGxvd3MgdGhlIHVzZXIgdG8gZW50ZXIgYSBjdXN0b20gdHlwZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGQoKSB7Ci0JCVN0cmluZyB0aXRsZSA9IEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50VHlwZXNQYWdlX2FkZFR5cGVEaWFsb2dUaXRsZTsKLQkJQWRkQ3VzdG9tRGlhbG9nIGRpYWxvZyA9IGdldEN1c3RvbURpYWxvZyh0aXRsZSwgSUFudFVJSGVscENvbnRleHRJZHMuQUREX1RZUEVfRElBTE9HKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJVHlwZSB0eXBlID0gbmV3IFR5cGUoKTsKLQkJdHlwZS5zZXRUeXBlTmFtZShkaWFsb2cuZ2V0TmFtZSgpKTsKLQkJdHlwZS5zZXRDbGFzc05hbWUoZGlhbG9nLmdldENsYXNzTmFtZSgpKTsKLQkJdHlwZS5zZXRMaWJyYXJ5RW50cnkoZGlhbG9nLmdldExpYnJhcnlFbnRyeSgpKTsKLQkJYWRkQ29udGVudCh0eXBlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGFiIGl0ZW0gdGhhdCBjb250YWlucyB0aGlzIHN1Yi1wYWdlLgotCSAqLwotCXByb3RlY3RlZCBUYWJJdGVtIGNyZWF0ZVRhYkl0ZW0oVGFiRm9sZGVyIGZvbGRlcikgewotCQlUYWJJdGVtIGl0ZW0gPSBuZXcgVGFiSXRlbShmb2xkZXIsIFNXVC5OT05FKTsKLQkJaXRlbS5zZXRUZXh0KEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50VHlwZXNQYWdlX3R5cGVzUGFnZVRpdGxlKTsKLQkJaXRlbS5zZXRJbWFnZShBbnRPYmplY3RMYWJlbFByb3ZpZGVyLmdldFR5cGVJbWFnZSgpKTsKLQkJaXRlbS5zZXREYXRhKHRoaXMpOwotCQlDb21wb3NpdGUgdG9wID0gbmV3IENvbXBvc2l0ZShmb2xkZXIsIFNXVC5OT05FKTsKLQkJdG9wLnNldEZvbnQoZm9sZGVyLmdldEZvbnQoKSk7CQkJCi0JCWl0ZW0uc2V0Q29udHJvbChjcmVhdGVDb250ZW50cyh0b3ApKTsKLQkJCi0JCWNvbm5lY3RUb0ZvbGRlcihpdGVtLCBmb2xkZXIpOwotCQkJCQotCQlyZXR1cm4gaXRlbTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLkFudFBhZ2UjZWRpdChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVkaXQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCVR5cGUgdHlwZSA9IChUeXBlKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCVN0cmluZyB0aXRsZSA9IEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50VHlwZXNQYWdlX2VkaXRUeXBlRGlhbG9nVGl0bGU7Ci0JCUFkZEN1c3RvbURpYWxvZyBkaWFsb2cgPSBnZXRDdXN0b21EaWFsb2codGl0bGUsIElBbnRVSUhlbHBDb250ZXh0SWRzLkVESVRfVFlQRV9ESUFMT0cpOwotCQlkaWFsb2cuc2V0Q2xhc3NOYW1lKHR5cGUuZ2V0Q2xhc3NOYW1lKCkpOwotCQlkaWFsb2cuc2V0TmFtZSh0eXBlLmdldFR5cGVOYW1lKCkpOwotCQlkaWFsb2cuc2V0TGlicmFyeUVudHJ5KHR5cGUuZ2V0TGlicmFyeUVudHJ5KCkpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl0eXBlLnNldFR5cGVOYW1lKGRpYWxvZy5nZXROYW1lKCkpOwotCQl0eXBlLnNldENsYXNzTmFtZShkaWFsb2cuZ2V0Q2xhc3NOYW1lKCkpOwotCQl0eXBlLnNldExpYnJhcnlFbnRyeShkaWFsb2cuZ2V0TGlicmFyeUVudHJ5KCkpOwotCQl1cGRhdGVDb250ZW50KHR5cGUpOwotCX0KLQkKLQlwcml2YXRlIEFkZEN1c3RvbURpYWxvZyBnZXRDdXN0b21EaWFsb2coU3RyaW5nIHRpdGxlLCBTdHJpbmcgaGVscENvbnRleHQpIHsKLQkJSXRlcmF0b3IgdHlwZXM9IGdldENvbnRlbnRzKHRydWUpLml0ZXJhdG9yKCk7Ci0JCUxpc3QgbmFtZXM9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKHR5cGVzLmhhc05leHQoKSkgewotCQkJVHlwZSBhVGFzayA9IChUeXBlKSB0eXBlcy5uZXh0KCk7Ci0JCQluYW1lcy5hZGQoYVRhc2suZ2V0VHlwZU5hbWUoKSk7Ci0JCX0KLQkJCi0JCUFkZEN1c3RvbURpYWxvZyBkaWFsb2cgPSBuZXcgQWRkQ3VzdG9tRGlhbG9nKGdldFNoZWxsKCksIGdldFByZWZlcmVuY2VQYWdlKCkuZ2V0TGlicmFyeUVudHJpZXMoKSwgbmFtZXMsIGhlbHBDb250ZXh0KTsKLQkJZGlhbG9nLnNldFRpdGxlKHRpdGxlKTsKLQkJZGlhbG9nLnNldEFscmVhZHlFeGlzdHNFcnJvck1zZyhBbnRQcmVmZXJlbmNlc01lc3NhZ2VzLkFudFR5cGVzUGFnZV84KTsKLQkJZGlhbG9nLnNldE5vTmFtZUVycm9yTXNnKEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQW50VHlwZXNQYWdlXzkpOwotCQlyZXR1cm4gZGlhbG9nOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5BbnRQYWdlI2luaXRpYWxpemUoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcz0gQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOwotCQlzZXRJbnB1dChwcmVmcy5nZXRUeXBlcygpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuQW50UGFnZSNnZXRIZWxwQ29udGV4dElkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBDb250ZXh0SWQoKSB7Ci0JCXJldHVybiBJQW50VUlIZWxwQ29udGV4dElkcy5BTlRfVFlQRVNfUEFHRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9DbGFzc3BhdGhNb2RlbC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQ2xhc3NwYXRoTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEzM2FhYi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9DbGFzc3BhdGhNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5JQW50Q2xhc3NwYXRoRW50cnk7Ci0KLXB1YmxpYyBjbGFzcyBDbGFzc3BhdGhNb2RlbCBleHRlbmRzIEFic3RyYWN0Q2xhc3NwYXRoRW50cnkgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFOVF9IT01FPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMT0JBTF9VU0VSPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVTRVI9IDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVFJJQlVURUQ9IDM7Ci0JCi0JcHJpdmF0ZSBHbG9iYWxDbGFzc3BhdGhFbnRyaWVzIGZBbnRIb21lRW50cnk7Ci0JcHJpdmF0ZSBHbG9iYWxDbGFzc3BhdGhFbnRyaWVzIGZVc2VyR2xvYmFsRW50cnk7Ci0gICAgcHJpdmF0ZSBHbG9iYWxDbGFzc3BhdGhFbnRyaWVzIGZDb250cmlidXRlZEdsb2JhbEVudHJ5OwotCQotCXB1YmxpYyBPYmplY3QgYWRkRW50cnkoT2JqZWN0IGVudHJ5KSB7Ci0JCWlmIChlbnRyeSBpbnN0YW5jZW9mIEdsb2JhbENsYXNzcGF0aEVudHJpZXMpIHsKLQkJCWlmICghZkNoaWxkRW50cmllcy5jb250YWlucyhlbnRyeSkpIHsKLQkJCQlmQ2hpbGRFbnRyaWVzLmFkZChlbnRyeSk7Ci0JCQkJcmV0dXJuIGVudHJ5OwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0gCi0JCUNsYXNzcGF0aEVudHJ5IG5ld0VudHJ5PSBjcmVhdGVFbnRyeShlbnRyeSwgbnVsbCk7Ci0JCUl0ZXJhdG9yIGVudHJpZXM9IGZDaGlsZEVudHJpZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGVudHJpZXMuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGVudHJpZXMubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBHbG9iYWxDbGFzc3BhdGhFbnRyaWVzKSB7Ci0JCQkJaWYoKChHbG9iYWxDbGFzc3BhdGhFbnRyaWVzKWVsZW1lbnQpLmNvbnRhaW5zKG5ld0VudHJ5KSkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQuZXF1YWxzKG5ld0VudHJ5KSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCWZDaGlsZEVudHJpZXMuYWRkKG5ld0VudHJ5KTsKLQkJcmV0dXJuIG5ld0VudHJ5OwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGFkZEVudHJ5KGludCBlbnRyeVR5cGUsIE9iamVjdCBlbnRyeSkgewotCQlJQ2xhc3NwYXRoRW50cnkgZW50cnlQYXJlbnQ9IG51bGw7Ci0JCXN3aXRjaCAoZW50cnlUeXBlKSB7Ci0JCQljYXNlIEFOVF9IT01FIDoKLQkJCQlpZiAoZkFudEhvbWVFbnRyeSA9PSBudWxsKSB7Ci0JCQkJCVN0cmluZyBuYW1lPSBBbnRQcmVmZXJlbmNlc01lc3NhZ2VzLkNsYXNzcGF0aE1vZGVsXzI7Ci0JCQkJCWZBbnRIb21lRW50cnk9IGNyZWF0ZUdsb2JhbEVudHJ5KG5ldyBJQW50Q2xhc3NwYXRoRW50cnlbMF0sIG5hbWUsIGZhbHNlLCB0cnVlLCBBTlRfSE9NRSk7Ci0JCQkJfQotCQkJCWVudHJ5UGFyZW50PSBmQW50SG9tZUVudHJ5OwotCQkJCWJyZWFrOwotCQkJY2FzZSBHTE9CQUxfVVNFUiA6Ci0JCQkJaWYgKGZVc2VyR2xvYmFsRW50cnkgPT0gbnVsbCkgewotCQkJCQlTdHJpbmcgbmFtZT0gQW50UHJlZmVyZW5jZXNNZXNzYWdlcy5DbGFzc3BhdGhNb2RlbF8zOwotCQkJCQlmVXNlckdsb2JhbEVudHJ5PSBjcmVhdGVHbG9iYWxFbnRyeShuZXcgSUFudENsYXNzcGF0aEVudHJ5WzBdLCBuYW1lLCB0cnVlLCB0cnVlLCBHTE9CQUxfVVNFUik7Ci0JCQkJfQotCQkJCWVudHJ5UGFyZW50PSBmVXNlckdsb2JhbEVudHJ5OwotCQkJCWJyZWFrOwotICAgICAgICAgICAgY2FzZSBDT05UUklCVVRFRCA6Ci0gICAgICAgICAgICAgICAgaWYgKGZDb250cmlidXRlZEdsb2JhbEVudHJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWU9IEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQ2xhc3NwYXRoTW9kZWxfMDsKLSAgICAgICAgICAgICAgICAgICAgZkNvbnRyaWJ1dGVkR2xvYmFsRW50cnk9IGNyZWF0ZUdsb2JhbEVudHJ5KG5ldyBJQW50Q2xhc3NwYXRoRW50cnlbMF0sIG5hbWUsIHRydWUsIHRydWUsIENPTlRSSUJVVEVEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZW50cnlQYXJlbnQ9IGZDb250cmlidXRlZEdsb2JhbEVudHJ5OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJCQotCQlDbGFzc3BhdGhFbnRyeSBuZXdFbnRyeT0gY3JlYXRlRW50cnkoZW50cnksIGVudHJ5UGFyZW50KTsKLQkJSXRlcmF0b3IgZW50cmllcz0gZkNoaWxkRW50cmllcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZW50cmllcy5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gZW50cmllcy5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEdsb2JhbENsYXNzcGF0aEVudHJpZXMpIHsKLQkJCQlpZigoKEdsb2JhbENsYXNzcGF0aEVudHJpZXMpZWxlbWVudCkuY29udGFpbnMobmV3RW50cnkpKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZWxlbWVudC5lcXVhbHMobmV3RW50cnkpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVudHJ5UGFyZW50ICE9IG51bGwpIHsKLQkJCSgoR2xvYmFsQ2xhc3NwYXRoRW50cmllcyllbnRyeVBhcmVudCkuYWRkRW50cnkobmV3RW50cnkpOwotCQl9IGVsc2UgewotCQkJZkNoaWxkRW50cmllcy5hZGQobmV3RW50cnkpOwotCQl9Ci0JCXJldHVybiBuZXdFbnRyeTsJCQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGVudHJpZXMgb2YgdGhlIHNwZWNpZmllZCBraW5kLCBwb3NzaWJseSBlbXB0eS4KLQkgKiAKLQkgKiBAcGFyYW0gZW50cnlUeXBlIGtpbmQgb2YgZW50cmllcyB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gZW50cmllcyBvZiB0aGUgc3BlY2lmaWVkIGtpbmQsIHBvc3NpYmx5IGVtcHR5Ci0JICovCi0JcHVibGljIElBbnRDbGFzc3BhdGhFbnRyeVtdIGdldEVudHJpZXMoaW50IGVudHJ5VHlwZSkgewotCQlzd2l0Y2ggKGVudHJ5VHlwZSkgewotCQkJY2FzZSBBTlRfSE9NRSA6Ci0JCQkJaWYgKGZBbnRIb21lRW50cnkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZkFudEhvbWVFbnRyeS5nZXRFbnRyaWVzKCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBHTE9CQUxfVVNFUiA6Ci0JCQkJaWYgKGZVc2VyR2xvYmFsRW50cnkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZlVzZXJHbG9iYWxFbnRyeS5nZXRFbnRyaWVzKCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBVU0VSIDogCi0JCQkJcmV0dXJuIGdldFVzZXJFbnRyaWVzKCk7Ci0JCQljYXNlIENPTlRSSUJVVEVEIDogCi0JCQkJaWYgKGZDb250cmlidXRlZEdsb2JhbEVudHJ5ICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZDb250cmlidXRlZEdsb2JhbEVudHJ5LmdldEVudHJpZXMoKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIG5ldyBJQW50Q2xhc3NwYXRoRW50cnlbMF07Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZShPYmplY3QgZW50cnkpIHsKLQkJZkNoaWxkRW50cmllcy5yZW1vdmUoZW50cnkpOwotCQlpZiAoZW50cnkgPT0gZlVzZXJHbG9iYWxFbnRyeSkgewotCQkJZlVzZXJHbG9iYWxFbnRyeT0gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgQ2xhc3NwYXRoRW50cnkgY3JlYXRlRW50cnkoT2JqZWN0IGVudHJ5LCBJQ2xhc3NwYXRoRW50cnkgZW50cnlQYXJlbnQpIHsKLQkJaWYgKGVudHJ5UGFyZW50ID09IG51bGwpIHsKLQkJCWVudHJ5UGFyZW50PSB0aGlzOwotCQl9IAotCQlyZXR1cm4gbmV3IENsYXNzcGF0aEVudHJ5KGVudHJ5LCBlbnRyeVBhcmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsKCkgewotCQlpZiAoZkFudEhvbWVFbnRyeSAhPSBudWxsKSB7Ci0JCQlmQW50SG9tZUVudHJ5LnJlbW92ZUFsbCgpOwotCQl9IAotCQlpZiAoZlVzZXJHbG9iYWxFbnRyeSAhPSBudWxsKSB7Ci0JCQlmVXNlckdsb2JhbEVudHJ5LnJlbW92ZUFsbCgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbChpbnQgZW50cnlUeXBlKSB7Ci0JCXN3aXRjaCAoZW50cnlUeXBlKSB7Ci0JCQljYXNlIEFOVF9IT01FIDoKLQkJCQlpZiAoZkFudEhvbWVFbnRyeSAhPSBudWxsKSB7Ci0JCQkJCWZBbnRIb21lRW50cnkucmVtb3ZlQWxsKCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBHTE9CQUxfVVNFUiA6Ci0JCQkJaWYgKGZVc2VyR2xvYmFsRW50cnkgIT0gbnVsbCkgewotCQkJCQlmVXNlckdsb2JhbEVudHJ5LnJlbW92ZUFsbCgpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbChPYmplY3RbXSBlbnRyaWVzKSB7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBlbnRyaWVzW2ldOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENsYXNzcGF0aEVudHJ5KSB7Ci0JCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5UGFyZW50PSAoKENsYXNzcGF0aEVudHJ5KW9iamVjdCkuZ2V0UGFyZW50KCk7Ci0JCQkJaWYgKGVudHJ5UGFyZW50IGluc3RhbmNlb2YgR2xvYmFsQ2xhc3NwYXRoRW50cmllcykgewotCQkJCQkoKEdsb2JhbENsYXNzcGF0aEVudHJpZXMpZW50cnlQYXJlbnQpLnJlbW92ZUVudHJ5KChDbGFzc3BhdGhFbnRyeSkgb2JqZWN0KTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZW1vdmUob2JqZWN0KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJlbW92ZShvYmplY3QpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QW50SG9tZUVudHJpZXMoSUFudENsYXNzcGF0aEVudHJ5W10gZW50cmllcykgewotCQlpZiAoZkFudEhvbWVFbnRyeSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgbmFtZT0gQW50UHJlZmVyZW5jZXNNZXNzYWdlcy5DbGFzc3BhdGhNb2RlbF8yOwotCQkJZkFudEhvbWVFbnRyeT0gY3JlYXRlR2xvYmFsRW50cnkoZW50cmllcywgbmFtZSwgZmFsc2UsIHRydWUsIEFOVF9IT01FKTsKLQkJfSBlbHNlIHsKLQkJCWZBbnRIb21lRW50cnkucmVtb3ZlQWxsKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlmQW50SG9tZUVudHJ5LmFkZEVudHJ5KG5ldyBDbGFzc3BhdGhFbnRyeShlbnRyaWVzW2ldLCBmQW50SG9tZUVudHJ5KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEdsb2JhbENsYXNzcGF0aEVudHJpZXMgY3JlYXRlR2xvYmFsRW50cnkoSUFudENsYXNzcGF0aEVudHJ5W10gZW50cmllcywgU3RyaW5nIG5hbWUsIGJvb2xlYW4gY2FuQmVSZW1vdmVkLCBib29sZWFuIGFkZEVudHJ5LCBpbnQgdHlwZSkgewotCQkKLQkJR2xvYmFsQ2xhc3NwYXRoRW50cmllcyBnbG9iYWw9IG5ldyBHbG9iYWxDbGFzc3BhdGhFbnRyaWVzKG5hbWUsIHRoaXMsIGNhbkJlUmVtb3ZlZCwgdHlwZSk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWdsb2JhbC5hZGRFbnRyeShuZXcgQ2xhc3NwYXRoRW50cnkoZW50cmllc1tpXSwgZ2xvYmFsKSk7Ci0JCX0KLQkJCi0JCWlmIChhZGRFbnRyeSkgewotCQkJYWRkRW50cnkoZ2xvYmFsKTsKLQkJfQotCQlyZXR1cm4gZ2xvYmFsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdsb2JhbEVudHJpZXMoSUFudENsYXNzcGF0aEVudHJ5W10gZW50cmllcykgewotCQlpZiAoZlVzZXJHbG9iYWxFbnRyeSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgbmFtZT0gQW50UHJlZmVyZW5jZXNNZXNzYWdlcy5DbGFzc3BhdGhNb2RlbF8zOwotCQkJZlVzZXJHbG9iYWxFbnRyeT0gY3JlYXRlR2xvYmFsRW50cnkoZW50cmllcywgbmFtZSwgdHJ1ZSwgdHJ1ZSwgR0xPQkFMX1VTRVIpOwotCQl9IGVsc2UgewotCQkJZlVzZXJHbG9iYWxFbnRyeS5yZW1vdmVBbGwoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCWZVc2VyR2xvYmFsRW50cnkuYWRkRW50cnkobmV3IENsYXNzcGF0aEVudHJ5KGVudHJpZXNbaV0sIGZVc2VyR2xvYmFsRW50cnkpKTsKLQkJCX0KLQkJfQotCX0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRDb250cmlidXRlZEVudHJpZXMoSUFudENsYXNzcGF0aEVudHJ5W10gZW50cmllcykgewotICAgICAgICBpZiAoZkNvbnRyaWJ1dGVkR2xvYmFsRW50cnkgPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWU9IEFudFByZWZlcmVuY2VzTWVzc2FnZXMuQ2xhc3NwYXRoTW9kZWxfMDsKLSAgICAgICAgICAgIGZDb250cmlidXRlZEdsb2JhbEVudHJ5PSBjcmVhdGVHbG9iYWxFbnRyeShlbnRyaWVzLCBuYW1lLCBmYWxzZSwgdHJ1ZSwgQ09OVFJJQlVURUQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZkNvbnRyaWJ1dGVkR2xvYmFsRW50cnkucmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmQ29udHJpYnV0ZWRHbG9iYWxFbnRyeS5hZGRFbnRyeShuZXcgQ2xhc3NwYXRoRW50cnkoZW50cmllc1tpXSwgZkNvbnRyaWJ1dGVkR2xvYmFsRW50cnkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQkKLQlwcml2YXRlIElBbnRDbGFzc3BhdGhFbnRyeVtdIGdldFVzZXJFbnRyaWVzKCkgewotCQlMaXN0IHVzZXJFbnRyaWVzPSBuZXcgQXJyYXlMaXN0KGZDaGlsZEVudHJpZXMuc2l6ZSgpKTsKLQkJSXRlcmF0b3IgaXRyPSBmQ2hpbGRFbnRyaWVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnkgZWxlbWVudCA9IChJQ2xhc3NwYXRoRW50cnkpIGl0ci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEdsb2JhbENsYXNzcGF0aEVudHJpZXMpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXVzZXJFbnRyaWVzLmFkZChlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gKElBbnRDbGFzc3BhdGhFbnRyeVtdKXVzZXJFbnRyaWVzLnRvQXJyYXkobmV3IElBbnRDbGFzc3BhdGhFbnRyeVt1c2VyRW50cmllcy5zaXplKCldKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9Db2xvckVkaXRvci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvQ29sb3JFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1NTJmYi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9Db2xvckVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db2xvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci0KLS8qKgotICogQSAiYnV0dG9uIiBvZiBhIGNlcnRhaW4gY29sb3IgZGV0ZXJtaW5lZCBieSB0aGUgY29sb3IgcGlja2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2xvckVkaXRvciB7Ci0JCi0JcHJpdmF0ZSBQb2ludCBmRXh0ZW50OwotCXByaXZhdGUgSW1hZ2UgZkltYWdlOwotCXByaXZhdGUgUkdCIGZDb2xvclZhbHVlOwotCXByaXZhdGUgQ29sb3IgZkNvbG9yOwotCXByaXZhdGUgQnV0dG9uIGZCdXR0b247Ci0JCi0JcHVibGljIENvbG9yRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCWZCdXR0b249IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JCWZFeHRlbnQ9IGNvbXB1dGVJbWFnZVNpemUocGFyZW50KTsKLQkJZkltYWdlPSBuZXcgSW1hZ2UocGFyZW50LmdldERpc3BsYXkoKSwgZkV4dGVudC54LCBmRXh0ZW50LnkpOwotCQkKLQkJR0MgZ2M9IG5ldyBHQyhmSW1hZ2UpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGZCdXR0b24uZ2V0QmFja2dyb3VuZCgpKTsKLQkJZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCBmRXh0ZW50LngsIGZFeHRlbnQueSk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJCi0JCWZCdXR0b24uc2V0SW1hZ2UoZkltYWdlKTsKLQkJZkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sb3JEaWFsb2cgY29sb3JEaWFsb2c9IG5ldyBDb2xvckRpYWxvZyhmQnV0dG9uLmdldFNoZWxsKCkpOwotCQkJCWNvbG9yRGlhbG9nLnNldFJHQihmQ29sb3JWYWx1ZSk7Ci0JCQkJUkdCIG5ld0NvbG9yID0gY29sb3JEaWFsb2cub3BlbigpOwotCQkJCWlmIChuZXdDb2xvciAhPSBudWxsKSB7Ci0JCQkJCWZDb2xvclZhbHVlPSBuZXdDb2xvcjsKLQkJCQkJdXBkYXRlQ29sb3JJbWFnZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlmQnV0dG9uLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGZJbWFnZSAhPSBudWxsKSAgewotCQkJCQlmSW1hZ2UuZGlzcG9zZSgpOwotCQkJCQlmSW1hZ2U9IG51bGw7Ci0JCQkJfQotCQkJCWlmIChmQ29sb3IgIT0gbnVsbCkgewotCQkJCQlmQ29sb3IuZGlzcG9zZSgpOwotCQkJCQlmQ29sb3I9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIFJHQiBnZXRDb2xvclZhbHVlKCkgewotCQlyZXR1cm4gZkNvbG9yVmFsdWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENvbG9yVmFsdWUoUkdCIHJnYikgewotCQlmQ29sb3JWYWx1ZT0gcmdiOwotCQl1cGRhdGVDb2xvckltYWdlKCk7Ci0JfQotCQotCXB1YmxpYyBCdXR0b24gZ2V0QnV0dG9uKCkgewotCQlyZXR1cm4gZkJ1dHRvbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29sb3JJbWFnZSgpIHsKLQkJCi0JCURpc3BsYXkgZGlzcGxheT0gZkJ1dHRvbi5nZXREaXNwbGF5KCk7Ci0JCQotCQlHQyBnYz0gbmV3IEdDKGZJbWFnZSk7Ci0JCWdjLnNldEZvcmVncm91bmQoZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spKTsKLQkJZ2MuZHJhd1JlY3RhbmdsZSgwLCAyLCBmRXh0ZW50LnggLSAxLCBmRXh0ZW50LnkgLSA0KTsKLQkJCi0JCWlmIChmQ29sb3IgIT0gbnVsbCkKLQkJCWZDb2xvci5kaXNwb3NlKCk7Ci0JCQkKLQkJZkNvbG9yPSBuZXcgQ29sb3IoZGlzcGxheSwgZkNvbG9yVmFsdWUpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGZDb2xvcik7Ci0JCWdjLmZpbGxSZWN0YW5nbGUoMSwgMywgZkV4dGVudC54IC0gMiwgZkV4dGVudC55IC0gNSk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJCi0JCWZCdXR0b24uc2V0SW1hZ2UoZkltYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVJbWFnZVNpemUoQ29udHJvbCB3aW5kb3cpIHsKLQkJR0MgZ2M9IG5ldyBHQyh3aW5kb3cpOwotCQlGb250IGY9IEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmdldChKRmFjZVJlc291cmNlcy5ERUZBVUxUX0ZPTlQpOwotCQlnYy5zZXRGb250KGYpOwotCQlpbnQgaGVpZ2h0PSBnYy5nZXRGb250TWV0cmljcygpLmdldEhlaWdodCgpOwotCQlnYy5kaXNwb3NlKCk7Ci0JCVBvaW50IHA9IG5ldyBQb2ludChoZWlnaHQgKiAzIC0gNiwgaGVpZ2h0KTsKLQkJcmV0dXJuIHA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvRmlsZUZpbHRlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvRmlsZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWQ5ZGRlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0ZpbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci0KLXB1YmxpYyBjbGFzcyBGaWxlRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLQotCS8qKgotCSAqIE9iamVjdHMgdG8gZmlsdGVyCi0JICovCi0JcHJpdmF0ZSBMaXN0IGZGaWx0ZXI7Ci0JCi0JLyoqCi0JICogQ29sbGVjdGlvbiBvZiBmaWxlcyBhbmQgY29udGFpbmVycyB0byBkaXNwbGF5Ci0JICovCi0JcHJpdmF0ZSBTZXQgZkZpbGVzOwotCQotCXByaXZhdGUgU3RyaW5nIGZFeHRlbnNpb247Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZkNvbnNpZGVyRXh0ZW5zaW9uPSB0cnVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBmaWx0ZXIgdGhhdCBmaWx0ZXJzIHRoZSBnaXZlbiAKLQkgKiBvYmplY3RzLgotCSAqIE5vdGU6IGNvbnNpZGVyRXh0ZW5zaW9uIG11c3QgYmUgY2FsbGVkIHRvIGluaXRpYWxpemUgdGhlIGZpbHRlcgotCSAqLwotCXB1YmxpYyBGaWxlRmlsdGVyKExpc3Qgb2JqZWN0cywgU3RyaW5nIGV4dGVuc2lvbikgewotCQlmRmlsdGVyID0gb2JqZWN0czsKLQkJZkV4dGVuc2lvbj0gZXh0ZW5zaW9uOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyI3NlbGVjdChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBmRmlsZXMuY29udGFpbnMoZWxlbWVudCkgJiYgIWZGaWx0ZXIuY29udGFpbnMoZWxlbWVudCk7Ci0JfQotCQotCS8qKgotCSAqIFNlYXJjaCBmb3IgYWxsIHRoZSBtYXRjaGluZyBmaWxlcyBpbiB0aGUgd29ya3NwYWNlLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShBbnRVSVBsdWdpbi5nZXRTdGFuZGFyZERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWZGaWxlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJdHJhdmVyc2UoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSwgZkZpbGVzKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogVHJhdmVyc2UgdGhlIGdpdmVuIGNvbnRhaW5lciwgYWRkaW5nIGZpbGVzIHRvIHRoZSBnaXZlbiBzZXQuCi0JICogUmV0dXJucyB3aGV0aGVyIGFueSBmaWxlcyB3ZXJlIGFkZGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHRyYXZlcnNlKElDb250YWluZXIgY29udGFpbmVyLCBTZXQgc2V0KSB7Ci0JCWJvb2xlYW4gYWRkZWQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUlSZXNvdXJjZVtdIHJlc291cmNlcyA9IGNvbnRhaW5lci5tZW1iZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlc1tpXTsKLQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKLQkJCQkJU3RyaW5nIGV4dCA9IGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpOwotCQkJCQlpZiAoIWZDb25zaWRlckV4dGVuc2lvbiB8fCAoZXh0ICE9IG51bGwgJiYgZXh0LmVxdWFsc0lnbm9yZUNhc2UoZkV4dGVuc2lvbikpKSB7Ci0JCQkJCQlzZXQuYWRkKGZpbGUpOwotCQkJCQkJYWRkZWQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQkJaWYgKHRyYXZlcnNlKChJQ29udGFpbmVyKSByZXNvdXJjZSwgc2V0KSkgewotCQkJCQkJc2V0LmFkZChyZXNvdXJjZSk7Ci0JCQkJCQlhZGRlZCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBhZGRlZDsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB3aGV0aGVyIHRoaXMgZmlsdGVyIHdpbGwgZmlsdGVyIGJhc2VkIG9uIGV4dGVuc2lvbi4KLQkgKiBAcGFyYW0gY29uc2lkZXJFeHRlbnNpb24gd2hldGhlciB0byBjb25zaWRlciBhIGZpbGUncyBleHRlbnNpb24gd2hlbiBmaWx0ZXJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25zaWRlckV4dGVuc2lvbihib29sZWFuIGNvbnNpZGVyRXh0ZW5zaW9uKSB7Ci0JICAgIGZDb25zaWRlckV4dGVuc2lvbj0gY29uc2lkZXJFeHRlbnNpb247Ci0JICAgIGluaXQoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvRm9ybWF0UHJldmlld0NvZGUudHh0IGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvRm9ybWF0UHJldmlld0NvZGUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2IyMDJjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0Zvcm1hdFByZXZpZXdDb2RlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gIFNhbXBsZSBidWlsZGZpbGUgZm9yIGphciBjb21wb25lbnRzICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTxwcm9qZWN0IG5hbWU9InNhbXBsZSIgZGVmYXVsdD0iYnVpbGQiPgotCi0JPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0tPgotCTwhLS0gIHRhcmdldDogaW5pdCAgICAgICAgICAgICAtLT4KLQk8IS0tIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9IiR7ZWNsaXBzZS5ob21lfSIgbG9jYXRpb249Ii9ob21lL2VjbGlwc2UiIC8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSAgIHRhcmdldDogYnVpbGQgICAgICAgICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkIgotCSAgICAgICAgZGVwZW5kcz0iaW5pdCIKLQkgICAgICAgIGRlc2NyaXB0aW9uPSItLT4gY29tcGlsZSBhbmQgamFyIHRoaXMgY29tcG9uZW50Ij4KLQotCQk8amF2YWMgc3JjZGlyPSIke3NyYy5ob21lfSIKLQkJICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuaG9tZX0iCi0JCSAgICAgICBkZWJ1Zz0iJHtjb21waWxlLmRlYnVnfSIKLQkJICAgICAgIGRlcHJlY2F0aW9uPSIke2NvbXBpbGUuZGVwcmVjYXRpb259IgotCQkgICAgICAgb3B0aW1pemU9IiR7Y29tcGlsZS5vcHRpbWl6ZX0iPgotCQkJPGNsYXNzcGF0aCByZWZpZD0iY29tcGlsZS5jbGFzc3BhdGgiIC8+Ci0JCTwvamF2YWM+Ci0KLQkJPGphciBkZXN0ZmlsZT0iJHtkaXN0LmhvbWV9LyR7YXBwLm5hbWV9LmphciIKLQkJICAgICBiYXNlZGlyPSIke2J1aWxkLmhvbWV9IgotCQkgICAgIGV4Y2x1ZGVzPSIqKi8qVVQuY2xhc3MiIC8+Ci0JPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9HbG9iYWxDbGFzc3BhdGhFbnRyaWVzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9HbG9iYWxDbGFzc3BhdGhFbnRyaWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNDQ5MjYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvR2xvYmFsQ2xhc3NwYXRoRW50cmllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgR2xvYmFsQ2xhc3NwYXRoRW50cmllcyBleHRlbmRzIEFic3RyYWN0Q2xhc3NwYXRoRW50cnkgewotCXByaXZhdGUgU3RyaW5nIGZOYW1lOwotCXByaXZhdGUgaW50IGZUeXBlOwotCXByaXZhdGUgYm9vbGVhbiBmQ2FuQmVSZW1vdmVkPSB0cnVlOwotCQotCXB1YmxpYyBHbG9iYWxDbGFzc3BhdGhFbnRyaWVzKFN0cmluZyBuYW1lLCBJQ2xhc3NwYXRoRW50cnkgcGFyZW50LCBib29sZWFuIGNhbkJlUmVtb3ZlZCwgaW50IHR5cGUpIHsKLQkJZlBhcmVudD0gcGFyZW50OwotCQlmTmFtZT0gbmFtZTsKLQkJZkNhbkJlUmVtb3ZlZD0gY2FuQmVSZW1vdmVkOwotCQlmVHlwZT0gdHlwZTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIGFkZEVudHJ5KENsYXNzcGF0aEVudHJ5IGVudHJ5KSB7Ci0JCWZDaGlsZEVudHJpZXMuYWRkKGVudHJ5KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlRW50cnkoQ2xhc3NwYXRoRW50cnkgZW50cnkpIHsKLQkJZkNoaWxkRW50cmllcy5yZW1vdmUoZW50cnkpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCQlyZXR1cm4gZkNoaWxkRW50cmllcy5jb250YWlucyhlbnRyeSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBmTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGwoKSB7Ci0JCWZDaGlsZEVudHJpZXMuY2xlYXIoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuQmVSZW1vdmVkKCkgewotCQlyZXR1cm4gZkNhbkJlUmVtb3ZlZDsKLQl9Ci0KLQkvKioKLSAgICAgKiBTZXQgdGhlIGNoaWxkIGVudHJpZXMgb2YgdGhpcyBjbGFzc3BhdGggZW50cnkuCi0JICogQHBhcmFtIGVudHJpZXMgVGhlIGNoaWxkIGVudHJpZXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW50cmllcyhMaXN0IGVudHJpZXMpIHsKLQkJZkNoaWxkRW50cmllcz0gZW50cmllczsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgZ2xvYmFsIGNsYXNzcGF0aCBlbnRyeS4KLQkgKiBAc2VlIENsYXNzcGF0aE1vZGVsI0FOVF9IT01FCi0JICogQHNlZSBDbGFzc3BhdGhNb2RlbCNHTE9CQUxfVVNFUgotCSAqIEBzZWUgQ2xhc3NwYXRoTW9kZWwjQ09OVFJJQlVURUQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9JQW50QmxvY2tDb250YWluZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0lBbnRCbG9ja0NvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDgyNzlmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0lBbnRCbG9ja0NvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUFudEJsb2NrQ29udGFpbmVyIHsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgY29udGFpbmVyLgotCSAqIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPiB0byByZW1vdmUgdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UgQSBzdHJpbmcgZXJyb3IgbWVzc2FnZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgbWVzc2FnZSk7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgbWVzc2FnZSBmb3IgdGhlIGNvbnRhaW5lci4KLQkgKiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gdG8gcmVtb3ZlIHRoZSBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlIEEgc3RyaW5nIG1lc3NhZ2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgcHJvcGVybHkgY29uZmlndXJlZCBwdXNoIGJ1dHRvbiB3aXRoIAotCSAqIHRoZSBzdXBwbGllZCBsYWJlbAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIGNvbXBvc2l0ZSBwYXJlbnQgb2YgdGhlIGJ1dHRvbgotCSAqIEBwYXJhbSBsYWJlbCBUaGUgYnV0dG9uIGxhYmVsCi0JICogCi0JICogQHJldHVybiBidXR0b24gdGhlIGNyZWF0ZWQgYnV0dG9uCi0JICovCi0JcHVibGljIEJ1dHRvbiBjcmVhdGVQdXNoQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCk7Ci0JCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIGNvbnRhaW5lciB0aGF0IHN0YXRlIGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpOwotCi19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9JQ2xhc3NwYXRoRW50cnkuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0lDbGFzc3BhdGhFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjI5MWUzLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0lDbGFzc3BhdGhFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLklBbnRDbGFzc3BhdGhFbnRyeTsKLQotcHVibGljIGludGVyZmFjZSBJQ2xhc3NwYXRoRW50cnkgZXh0ZW5kcyBJQW50Q2xhc3NwYXRoRW50cnkgewotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNsYXNzcGF0aCBlbnRyaWVzIHRoYXQgYXJlIHRoZSBjaGlsZHJlbiBvZiB0aGlzIGNsYXNzcGF0aCBlbnRyeQotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNoaWxkIGNsYXNzcGF0aCBlbnRyaWVzIG9mIHRoaXMgZW50cnkKLQkgKi8KLQlwdWJsaWMgSUFudENsYXNzcGF0aEVudHJ5W10gZ2V0RW50cmllcygpOwotCQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGNsYXNzcGF0aCBlbnRyaWVzIGhhcyBjaGlsZCBlbnRyaWVzLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNsYXNzcGF0aCBlbnRyeSBoYXMgY2hpbGRlcm4sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRW50cmllcygpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudCBvZiB0aGlzIGNsYXNzcGF0aCBlbnRyeQotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBvZiB0aGlzIGNsYXNzcGF0aCBlbnRyeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5IGdldFBhcmVudCgpOwotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL01pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYjUzN2YuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyOwotCi1jbGFzcyBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBpbXBsZW1lbnRzIElXb3JrYmVuY2hBZGFwdGVyLCBJQWRhcHRhYmxlIHsKLQlwcml2YXRlIGJvb2xlYW4gcG9wdWxhdGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBMaXN0IGZvbGRlcnMgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmaWxlcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNEaXJlY3RvcnkgPSBmYWxzZTsKLQlwcml2YXRlIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IHBhcmVudDsKLQlwcml2YXRlIE9iamVjdCBmaWxlU3lzdGVtT2JqZWN0OwotCQotCS8qKgotCSAqIENyZWF0ZSBhIDxjb2RlPk1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50PC9jb2RlPiB3aXRoIHRoZSBzdXBwbGllZCBuYW1lIGFuZCBwYXJlbnQuCi0JICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgZWxlbWVudCB0aGlzIHJlcHJlc2VudHMKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBjb250YWluaW5nIHBhcmVudAotCSAqIEBwYXJhbSBpc0RpcmVjdG9yeSBpbmRpY2F0ZWQgaWYgdGhpcyBjb3VsZCBoYXZlIGNoaWxkcmVuIG9yIG5vdAotCSAqLwotCXB1YmxpYyBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudChTdHJpbmcgbmFtZSwgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgcGFyZW50LCBib29sZWFuIGlzRGlyZWN0b3J5KSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLmlzRGlyZWN0b3J5ID0gaXNEaXJlY3Rvcnk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LmFkZENoaWxkKHRoaXMpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoYWRhcHRlciA9PSBJV29ya2JlbmNoQWRhcHRlci5jbGFzcykgewotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJLy9kZWZlciB0byB0aGUgcGxhdGZvcm0KLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZWxlbWVudCByZXByZXNlbnRzIGEgZGlyZWN0b3J5LCBhbmQgZmFsc2UKLQkgKiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBpc0RpcmVjdG9yeTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyB0aGUgcGFzc2VkIGNoaWxkIHRvIHRoaXMgb2JqZWN0J3MgY29sbGVjdGlvbiBvZiBjaGlsZHJlbi4KLQkgKgotCSAqIEBwYXJhbSBjaGlsZCBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRDaGlsZChNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBjaGlsZCkgewotCQlpZiAoY2hpbGQuaXNEaXJlY3RvcnkoKSkgewotCQkJaWYgKGZvbGRlcnMgPT0gbnVsbCkgewotCQkJCSBmb2xkZXJzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCX0KLQkJCWZvbGRlcnMuYWRkKGNoaWxkKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmaWxlcyA9PSBudWxsKSB7Ci0JCQkJIGZpbGVzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCX0KLQkJCWZpbGVzLmFkZChjaGlsZCk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgdGhlIGZpbGVzIHRoYXQgYXJlIGltbWVkaWF0ZSBjaGlsZHJlbi4gVXNlIHRoZSBzdXBwbGllZCBwcm92aWRlcgotCSAqIGlmIGl0IG5lZWRzIHRvIGJlIHBvcHVsYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRGaWxlcyhJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJaWYgKCFwb3B1bGF0ZWQpIHsKLQkJCXBvcHVsYXRlKHByb3ZpZGVyKTsKLQkJfQotCi0JCWlmIChmaWxlcyA9PSBudWxsKSB7Ci0JCQkgcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJcmV0dXJuIGZpbGVzOwotCi0JfQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBmb2xkZXJzIHRoYXQgYXJlIGltbWVkaWF0ZSBjaGlsZHJlbi4gVXNlIHRoZSBzdXBwbGllZCBwcm92aWRlcgotCSAqIGlmIGl0IG5lZWRzIHRvIGJlIHBvcHVsYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRGb2xkZXJzKElJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciBwcm92aWRlcikgewotCQlpZiAoIXBvcHVsYXRlZCkgewotCQkJcG9wdWxhdGUocHJvdmlkZXIpOwotCQl9Ci0KLQkJcmV0dXJuIGdldEZvbGRlcnMoKTsKLQotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEZvbGRlcnMoKSB7Ci0JCWlmIChmb2xkZXJzID09IG51bGwpewotCQkJIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCXJldHVybiBmb2xkZXJzOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBvciBub3QgcG9wdWxhdGlvbiBoYXMgaGFwcGVuZWQgZm9yIHRoZSByZWNlaXZlci4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BvcHVsYXRlZCgpIHsKLQkJcmV0dXJuIHRoaXMucG9wdWxhdGVkOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBvciBub3QgcG9wdWxhdGlvbiBoYXMgbm90IGhhcHBlbmVkIGZvciB0aGUgcmVjZWl2ZXIuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbm90UG9wdWxhdGVkKCkgewotCQlyZXR1cm4gIXRoaXMucG9wdWxhdGVkOwotCX0KLQkvKioKLQkgKiBQb3B1bGF0ZSB0aGUgZmlsZXMgYW5kIGZvbGRlcnMgb2YgdGhlIHJlY2VpdmVyIHVzaW5nIHRoZSBzdXBwbGllZAotCSAqIHN0cnVjdHVyZSBwcm92aWRlci4KLQkgKiBAcGFyYW0gcHJvdmlkZXIgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlKElJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciBwcm92aWRlcikgewotCi0JCUxpc3QgY2hpbGRyZW4gPSBwcm92aWRlci5nZXRDaGlsZHJlbihmaWxlU3lzdGVtT2JqZWN0KTsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJfQotCQlJdGVyYXRvciBjaGlsZHJlbkVudW0gPSBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQl3aGlsZSAoY2hpbGRyZW5FbnVtLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGNoaWxkID0gY2hpbGRyZW5FbnVtLm5leHQoKTsKLQotCQkJU3RyaW5nIGVsZW1lbnRMYWJlbCA9IHByb3ZpZGVyLmdldExhYmVsKGNoaWxkKTsKLQkJCWJvb2xlYW4gaXNGb2xkZXI9IHByb3ZpZGVyLmlzRm9sZGVyKGNoaWxkKTsKLQkJCWlmICghaXNGb2xkZXIgJiYgIWVsZW1lbnRMYWJlbC5lbmRzV2l0aCgiLmNsYXNzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJLy9DcmVhdGUgb25lIGxldmVsIGJlbG93Ci0JCQlNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCByZXN1bHQgPSBuZXcgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQoZWxlbWVudExhYmVsLCB0aGlzLCBpc0ZvbGRlcik7Ci0JCQlyZXN1bHQuc2V0RmlsZVN5c3RlbU9iamVjdChjaGlsZCk7Ci0JCX0KLQkJc2V0UG9wdWxhdGVkKCk7Ci0JfQotCQotCS8qKgotCSAqCVJldHVybnMgdGhlIGZpbGUgc3lzdGVtIG9iamVjdCBwcm9wZXJ0eSBvZiB0aGlzIGVsZW1lbnQKLQkgKgotCSAqCUByZXR1cm4gdGhlIGZpbGUgc3lzdGVtIG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0RmlsZVN5c3RlbU9iamVjdCgpIHsKLQkJcmV0dXJuIGZpbGVTeXN0ZW1PYmplY3Q7Ci0JfQotCQotCS8qKgotCSAqCVNldCB0aGUgZmlsZSBzeXN0ZW0gb2JqZWN0IHByb3BlcnR5IG9mIHRoaXMgZWxlbWVudAotCSAqCi0JICoJQHBhcmFtIHZhbHVlIHRoZSBmaWxlIHN5c3RlbSBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGaWxlU3lzdGVtT2JqZWN0KE9iamVjdCB2YWx1ZSkgewotCQlmaWxlU3lzdGVtT2JqZWN0ID0gdmFsdWU7Ci0JfQotCS8qKgotCSAqIFNldCB3aGV0aGVyIG9yIG5vdCBwb3B1bGF0aW9uIGhhcyBoYXBwZW5lZCBmb3IgdGhlIHJlY2VpdmVyIHRvIHRydWUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UG9wdWxhdGVkKCkgewotCQl0aGlzLnBvcHVsYXRlZCA9IHRydWU7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8pIHsKLQkJcmV0dXJuIGdldEZvbGRlcnMoKS50b0FycmF5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRJbWFnZURlc2NyaXB0b3IoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpc0RpcmVjdG9yeSgpKSB7Ci0JCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfT0JKX0ZPTERFUik7Ci0JCX0KLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RWRpdG9yUmVnaXN0cnkoKS5nZXRJbWFnZURlc2NyaXB0b3IobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRMYWJlbChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgbykgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotfQotCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9PdmVybGF5UHJlZmVyZW5jZVN0b3JlLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9PdmVybGF5UHJlZmVyZW5jZVN0b3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGI3ZmEuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIEFuIG92ZXJsYXlpbmcgcHJlZmVyZW5jZSBzdG9yZS4KLSAqLwotY2xhc3MgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSAgaW1wbGVtZW50cyBJUHJlZmVyZW5jZVN0b3JlIHsKLQkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFR5cGVEZXNjcmlwdG9yIHsKLQkJcHJpdmF0ZSBUeXBlRGVzY3JpcHRvcigpIHsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVEZXNjcmlwdG9yIEJPT0xFQU49IG5ldyBUeXBlRGVzY3JpcHRvcigpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZURlc2NyaXB0b3IgRE9VQkxFPSBuZXcgVHlwZURlc2NyaXB0b3IoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVEZXNjcmlwdG9yIEZMT0FUPSBuZXcgVHlwZURlc2NyaXB0b3IoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVEZXNjcmlwdG9yIElOVD0gbmV3IFR5cGVEZXNjcmlwdG9yKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlRGVzY3JpcHRvciBMT05HPSBuZXcgVHlwZURlc2NyaXB0b3IoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVEZXNjcmlwdG9yIFNUUklORz0gbmV3IFR5cGVEZXNjcmlwdG9yKCk7Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBPdmVybGF5S2V5IHsKLQkJCi0JCVR5cGVEZXNjcmlwdG9yIGZEZXNjcmlwdG9yOwotCQlTdHJpbmcgZktleTsKLQkJCi0JCXB1YmxpYyBPdmVybGF5S2V5KFR5cGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFN0cmluZyBrZXkpIHsKLQkJCWZEZXNjcmlwdG9yPSBkZXNjcmlwdG9yOwotCQkJZktleT0ga2V5OwotCQl9Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgUHJvcGVydHlMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQkJCQkKLQkJLyoKLQkJICogQHNlZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJT3ZlcmxheUtleSBrZXk9IGZpbmRPdmVybGF5S2V5KGV2ZW50LmdldFByb3BlcnR5KCkpOwotCQkJaWYgKGtleSAhPSBudWxsKQotCQkJCXByb3BhZ2F0ZVByb3BlcnR5KGZQYXJlbnQsIGtleSwgZlN0b3JlKTsgCi0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGZQYXJlbnQ7Ci0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGZTdG9yZTsKLQlwcml2YXRlIE92ZXJsYXlLZXlbXSBmT3ZlcmxheUtleXM7Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eUxpc3RlbmVyIGZQcm9wZXJ0eUxpc3RlbmVyOwotCQotCQotCXB1YmxpYyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlKElQcmVmZXJlbmNlU3RvcmUgcGFyZW50LCBPdmVybGF5S2V5W10gb3ZlcmxheUtleXMpIHsKLQkJZlBhcmVudD0gcGFyZW50OwotCQlmT3ZlcmxheUtleXM9IG92ZXJsYXlLZXlzOwotCQlmU3RvcmU9IG5ldyBQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBPdmVybGF5S2V5IGZpbmRPdmVybGF5S2V5KFN0cmluZyBrZXkpIHsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGZPdmVybGF5S2V5cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZPdmVybGF5S2V5c1tpXS5mS2V5LmVxdWFscyhrZXkpKQotCQkJCXJldHVybiBmT3ZlcmxheUtleXNbaV07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjb3ZlcnMoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gKGZpbmRPdmVybGF5S2V5KGtleSkgIT0gbnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwcm9wYWdhdGVQcm9wZXJ0eShJUHJlZmVyZW5jZVN0b3JlIG9yZ2luLCBPdmVybGF5S2V5IGtleSwgSVByZWZlcmVuY2VTdG9yZSB0YXJnZXQpIHsKLQkJCi0JCWlmIChvcmdpbi5pc0RlZmF1bHQoa2V5LmZLZXkpKSB7Ci0JCQlpZiAoIXRhcmdldC5pc0RlZmF1bHQoa2V5LmZLZXkpKQotCQkJCXRhcmdldC5zZXRUb0RlZmF1bHQoa2V5LmZLZXkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlUeXBlRGVzY3JpcHRvciBkPSBrZXkuZkRlc2NyaXB0b3I7Ci0JCWlmIChCT09MRUFOID09IGQpIHsKLQkJCQotCQkJYm9vbGVhbiBvcmlnaW5WYWx1ZT0gb3JnaW4uZ2V0Qm9vbGVhbihrZXkuZktleSk7Ci0JCQlib29sZWFuIHRhcmdldFZhbHVlPSB0YXJnZXQuZ2V0Qm9vbGVhbihrZXkuZktleSk7Ci0JCQlpZiAodGFyZ2V0VmFsdWUgIT0gb3JpZ2luVmFsdWUpCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmlnaW5WYWx1ZSk7Ci0JCQkJCi0JCX0gZWxzZSBpZiAoRE9VQkxFID09IGQpIHsKLQkJCQotCQkJZG91YmxlIG9yaWdpblZhbHVlPSBvcmdpbi5nZXREb3VibGUoa2V5LmZLZXkpOwotCQkJZG91YmxlIHRhcmdldFZhbHVlPSB0YXJnZXQuZ2V0RG91YmxlKGtleS5mS2V5KTsKLQkJCWlmICh0YXJnZXRWYWx1ZSAhPSBvcmlnaW5WYWx1ZSkKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yaWdpblZhbHVlKTsKLQkJCi0JCX0gZWxzZSBpZiAoRkxPQVQgPT0gZCkgewotCQkJCi0JCQlmbG9hdCBvcmlnaW5WYWx1ZT0gb3JnaW4uZ2V0RmxvYXQoa2V5LmZLZXkpOwotCQkJZmxvYXQgdGFyZ2V0VmFsdWU9IHRhcmdldC5nZXRGbG9hdChrZXkuZktleSk7Ci0JCQlpZiAodGFyZ2V0VmFsdWUgIT0gb3JpZ2luVmFsdWUpCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmlnaW5WYWx1ZSk7Ci0JCQkJCi0JCX0gZWxzZSBpZiAoSU5UID09IGQpIHsKLQotCQkJaW50IG9yaWdpblZhbHVlPSBvcmdpbi5nZXRJbnQoa2V5LmZLZXkpOwotCQkJaW50IHRhcmdldFZhbHVlPSB0YXJnZXQuZ2V0SW50KGtleS5mS2V5KTsKLQkJCWlmICh0YXJnZXRWYWx1ZSAhPSBvcmlnaW5WYWx1ZSkKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yaWdpblZhbHVlKTsKLQotCQl9IGVsc2UgaWYgKExPTkcgPT0gZCkgewotCi0JCQlsb25nIG9yaWdpblZhbHVlPSBvcmdpbi5nZXRMb25nKGtleS5mS2V5KTsKLQkJCWxvbmcgdGFyZ2V0VmFsdWU9IHRhcmdldC5nZXRMb25nKGtleS5mS2V5KTsKLQkJCWlmICh0YXJnZXRWYWx1ZSAhPSBvcmlnaW5WYWx1ZSkKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yaWdpblZhbHVlKTsKLQotCQl9IGVsc2UgaWYgKFNUUklORyA9PSBkKSB7Ci0KLQkJCVN0cmluZyBvcmlnaW5WYWx1ZT0gb3JnaW4uZ2V0U3RyaW5nKGtleS5mS2V5KTsKLQkJCVN0cmluZyB0YXJnZXRWYWx1ZT0gdGFyZ2V0LmdldFN0cmluZyhrZXkuZktleSk7Ci0JCQlpZiAodGFyZ2V0VmFsdWUgIT0gbnVsbCAmJiBvcmlnaW5WYWx1ZSAhPSBudWxsICYmICF0YXJnZXRWYWx1ZS5lcXVhbHMob3JpZ2luVmFsdWUpKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JpZ2luVmFsdWUpOwotCi0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcHJvcGFnYXRlKCkgewotCQlmb3IgKGludCBpPSAwOyBpIDwgZk92ZXJsYXlLZXlzLmxlbmd0aDsgaSsrKQotCQkJcHJvcGFnYXRlUHJvcGVydHkoZlN0b3JlLCBmT3ZlcmxheUtleXNbaV0sIGZQYXJlbnQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9hZFByb3BlcnR5KElQcmVmZXJlbmNlU3RvcmUgb3JnaW4sIE92ZXJsYXlLZXkga2V5LCBJUHJlZmVyZW5jZVN0b3JlIHRhcmdldCwgYm9vbGVhbiBmb3JjZUluaXRpYWxpemF0aW9uKSB7Ci0JCVR5cGVEZXNjcmlwdG9yIGQ9IGtleS5mRGVzY3JpcHRvcjsKLQkJaWYgKEJPT0xFQU4gPT0gZCkgewotCQkJCi0JCQlpZiAoZm9yY2VJbml0aWFsaXphdGlvbikKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIHRydWUpOwotCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmdpbi5nZXRCb29sZWFuKGtleS5mS2V5KSk7Ci0JCQl0YXJnZXQuc2V0RGVmYXVsdChrZXkuZktleSwgb3JnaW4uZ2V0RGVmYXVsdEJvb2xlYW4oa2V5LmZLZXkpKTsKLQkJCQotCQl9IGVsc2UgaWYgKERPVUJMRSA9PSBkKSB7Ci0JCQkKLQkJCWlmIChmb3JjZUluaXRpYWxpemF0aW9uKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgMS4wRCk7Ci0JCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yZ2luLmdldERvdWJsZShrZXkuZktleSkpOwotCQkJdGFyZ2V0LnNldERlZmF1bHQoa2V5LmZLZXksIG9yZ2luLmdldERlZmF1bHREb3VibGUoa2V5LmZLZXkpKTsKLQkJCQotCQl9IGVsc2UgaWYgKEZMT0FUID09IGQpIHsKLQkJCQotCQkJaWYgKGZvcmNlSW5pdGlhbGl6YXRpb24pCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCAxLjBGKTsKLQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JnaW4uZ2V0RmxvYXQoa2V5LmZLZXkpKTsKLQkJCXRhcmdldC5zZXREZWZhdWx0KGtleS5mS2V5LCBvcmdpbi5nZXREZWZhdWx0RmxvYXQoa2V5LmZLZXkpKTsKLQkJCQotCQl9IGVsc2UgaWYgKElOVCA9PSBkKSB7Ci0JCQkKLQkJCWlmIChmb3JjZUluaXRpYWxpemF0aW9uKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgMSk7Ci0JCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yZ2luLmdldEludChrZXkuZktleSkpOwotCQkJdGFyZ2V0LnNldERlZmF1bHQoa2V5LmZLZXksIG9yZ2luLmdldERlZmF1bHRJbnQoa2V5LmZLZXkpKTsKLQkJCQotCQl9IGVsc2UgaWYgKExPTkcgPT0gZCkgewotCQkJCi0JCQlpZiAoZm9yY2VJbml0aWFsaXphdGlvbikKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIDFMKTsKLQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JnaW4uZ2V0TG9uZyhrZXkuZktleSkpOwotCQkJdGFyZ2V0LnNldERlZmF1bHQoa2V5LmZLZXksIG9yZ2luLmdldERlZmF1bHRMb25nKGtleS5mS2V5KSk7Ci0JCQkKLQkJfSBlbHNlIGlmIChTVFJJTkcgPT0gZCkgewotCQkJCi0JCQlpZiAoZm9yY2VJbml0aWFsaXphdGlvbikKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksICIxIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JnaW4uZ2V0U3RyaW5nKGtleS5mS2V5KSk7Ci0JCQl0YXJnZXQuc2V0RGVmYXVsdChrZXkuZktleSwgb3JnaW4uZ2V0RGVmYXVsdFN0cmluZyhrZXkuZktleSkpOwotCQkJCi0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9hZCgpIHsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGZPdmVybGF5S2V5cy5sZW5ndGg7IGkrKykKLQkJCWxvYWRQcm9wZXJ0eShmUGFyZW50LCBmT3ZlcmxheUtleXNbaV0sIGZTdG9yZSwgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGxvYWREZWZhdWx0cygpIHsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGZPdmVybGF5S2V5cy5sZW5ndGg7IGkrKykKLQkJCXNldFRvRGVmYXVsdChmT3ZlcmxheUtleXNbaV0uZktleSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQlpZiAoZlByb3BlcnR5TGlzdGVuZXIgPT0gbnVsbCkgewotCQkJZlByb3BlcnR5TGlzdGVuZXI9IG5ldyBQcm9wZXJ0eUxpc3RlbmVyKCk7Ci0JCQlmUGFyZW50LmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByb3BlcnR5TGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCWlmIChmUHJvcGVydHlMaXN0ZW5lciAhPSBudWxsKSAgewotCQkJZlBhcmVudC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcm9wZXJ0eUxpc3RlbmVyKTsKLQkJCWZQcm9wZXJ0eUxpc3RlbmVyPSBudWxsOwotCQl9Ci0JfQotCQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2FkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlmU3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3JlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlmU3RvcmUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2ZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFN0cmluZywgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoU3RyaW5nIG5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWZTdG9yZS5maXJlUHJvcGVydHlDaGFuZ2VFdmVudChuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2NvbnRhaW5zKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmNvbnRhaW5zKG5hbWUpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXRCb29sZWFuKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0Qm9vbGVhbihuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXREZWZhdWx0Qm9vbGVhbihTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdEJvb2xlYW4oU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXREZWZhdWx0Qm9vbGVhbihuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXREZWZhdWx0RG91YmxlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgZG91YmxlIGdldERlZmF1bHREb3VibGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXREZWZhdWx0RG91YmxlKG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldERlZmF1bHRGbG9hdChTdHJpbmcpCi0JICovCi0JcHVibGljIGZsb2F0IGdldERlZmF1bHRGbG9hdChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldERlZmF1bHRGbG9hdChuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXREZWZhdWx0SW50KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgaW50IGdldERlZmF1bHRJbnQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXREZWZhdWx0SW50KG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldERlZmF1bHRMb25nKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXREZWZhdWx0TG9uZyhTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldERlZmF1bHRMb25nKG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldERlZmF1bHRTdHJpbmcoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFN0cmluZyhTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldERlZmF1bHRTdHJpbmcobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0RG91YmxlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgZG91YmxlIGdldERvdWJsZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldERvdWJsZShuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXRGbG9hdChTdHJpbmcpCi0JICovCi0JcHVibGljIGZsb2F0IGdldEZsb2F0KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0RmxvYXQobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0SW50KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldEludChuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXRMb25nKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRMb25nKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0TG9uZyhuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXRTdHJpbmcoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0U3RyaW5nKG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2lzRGVmYXVsdChTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuaXNEZWZhdWx0KG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI25lZWRzU2F2aW5nKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBuZWVkc1NhdmluZygpIHsKLQkJcmV0dXJuIGZTdG9yZS5uZWVkc1NhdmluZygpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3B1dFZhbHVlKFN0cmluZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dFZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5wdXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0RGVmYXVsdChTdHJpbmcsIGRvdWJsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBkb3VibGUgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXREZWZhdWx0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXREZWZhdWx0KFN0cmluZywgZmxvYXQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgZmxvYXQgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXREZWZhdWx0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXREZWZhdWx0KFN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldERlZmF1bHQoU3RyaW5nLCBsb25nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGxvbmcgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXREZWZhdWx0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXREZWZhdWx0KFN0cmluZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldERlZmF1bHQoU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXREZWZhdWx0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXRUb0RlZmF1bHQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvRGVmYXVsdChTdHJpbmcgbmFtZSkgewotCQlmU3RvcmUuc2V0VG9EZWZhdWx0KG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldFZhbHVlKFN0cmluZywgZG91YmxlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBkb3VibGUgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0VmFsdWUoU3RyaW5nLCBmbG9hdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgZmxvYXQgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0VmFsdWUoU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXRWYWx1ZShTdHJpbmcsIGxvbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGxvbmcgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0VmFsdWUoU3RyaW5nLCBTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXRWYWx1ZShTdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvU3RhdHVzSW5mby5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvU3RhdHVzSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjUyZjI0Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1N0YXR1c0luZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIEEgc2V0dGFibGUgSVN0YXR1cy4KLSAqIENhbiBiZSBhbiBlcnJvciwgd2FybmluZywgaW5mbyBvciBvay4gRm9yIGVycm9yLCBpbmZvIGFuZCB3YXJuaW5nIHN0YXRlcywKLSAqIGEgbWVzc2FnZSBkZXNjcmliZXMgdGhlIHByb2JsZW0uCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0dXNJbmZvIGltcGxlbWVudHMgSVN0YXR1cyB7Ci0KLQlwcml2YXRlIFN0cmluZyBmU3RhdHVzTWVzc2FnZTsKLQlwcml2YXRlIGludCBmU2V2ZXJpdHk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgc3RhdHVzIHNldCB0byBPSyAobm8gbWVzc2FnZSkKLQkgKi8KLQlwdWJsaWMgU3RhdHVzSW5mbygpIHsKLQkJdGhpcyhPSywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHN0YXR1cyAuCi0JICogQHBhcmFtIHNldmVyaXR5IFRoZSBzdGF0dXMgc2V2ZXJpdHk6IEVSUk9SLCBXQVJOSU5HLCBJTkZPIGFuZCBPSy4KLQkgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSBvZiB0aGUgc3RhdHVzLiBBcHBsaWVzIG9ubHkgZm9yIEVSUk9SLAotCSAqIFdBUk5JTkcgYW5kIElORk8uCi0JICovCi0JcHVibGljIFN0YXR1c0luZm8oaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlmU3RhdHVzTWVzc2FnZT0gbWVzc2FnZTsKLQkJZlNldmVyaXR5PSBzZXZlcml0eTsKLQl9Ci0KLQkvKioKLQkgKiAgUmV0dXJucyBpZiB0aGUgc3RhdHVzJyBzZXZlcml0eSBpcyBPSy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09LKCkgewotCQlyZXR1cm4gZlNldmVyaXR5ID09IElTdGF0dXMuT0s7Ci0JfQotCi0JLyoqCi0JICogIFJldHVybnMgaWYgdGhlIHN0YXR1cycgc2V2ZXJpdHkgaXMgV0FSTklORy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dhcm5pbmcoKSB7Ci0JCXJldHVybiBmU2V2ZXJpdHkgPT0gSVN0YXR1cy5XQVJOSU5HOwotCX0KLQotCS8qKgotCSAqICBSZXR1cm5zIGlmIHRoZSBzdGF0dXMnIHNldmVyaXR5IGlzIElORk8uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbmZvKCkgewotCQlyZXR1cm4gZlNldmVyaXR5ID09IElTdGF0dXMuSU5GTzsKLQl9Ci0KLQkvKioKLQkgKiAgUmV0dXJucyBpZiB0aGUgc3RhdHVzJyBzZXZlcml0eSBpcyBFUlJPUi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Vycm9yKCkgewotCQlyZXR1cm4gZlNldmVyaXR5ID09IElTdGF0dXMuRVJST1I7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMjZ2V0TWVzc2FnZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQlyZXR1cm4gZlN0YXR1c01lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdHVzIHRvIEVSUk9SLgotCSAqIEBwYXJhbSBlcnJvck1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UgKGNhbiBiZSBlbXB0eSwgYnV0IG5vdCBudWxsKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVycm9yKFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChlcnJvck1lc3NhZ2UpOwotCQlmU3RhdHVzTWVzc2FnZT0gZXJyb3JNZXNzYWdlOwotCQlmU2V2ZXJpdHk9IElTdGF0dXMuRVJST1I7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdHVzIHRvIFdBUk5JTkcuCi0JICogQHBhcmFtIHdhcm5pbmdNZXNzYWdlIFRoZSB3YXJuaW5nIG1lc3NhZ2UgKGNhbiBiZSBlbXB0eSwgYnV0IG5vdCBudWxsKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdhcm5pbmcoU3RyaW5nIHdhcm5pbmdNZXNzYWdlKSB7Ci0JCUFzc2VydC5pc05vdE51bGwod2FybmluZ01lc3NhZ2UpOwotCQlmU3RhdHVzTWVzc2FnZT0gd2FybmluZ01lc3NhZ2U7Ci0JCWZTZXZlcml0eT0gSVN0YXR1cy5XQVJOSU5HOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXR1cyB0byBJTkZPLgotCSAqIEBwYXJhbSBpbmZvTWVzc2FnZSBUaGUgaW5mbyBtZXNzYWdlIChjYW4gYmUgZW1wdHksIGJ1dCBub3QgbnVsbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmZvKFN0cmluZyBpbmZvTWVzc2FnZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGluZm9NZXNzYWdlKTsKLQkJZlN0YXR1c01lc3NhZ2U9IGluZm9NZXNzYWdlOwotCQlmU2V2ZXJpdHk9IElTdGF0dXMuSU5GTzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0dXMgdG8gT0suCi0JICovCi0JcHVibGljIHZvaWQgc2V0T0soKSB7Ci0JCWZTdGF0dXNNZXNzYWdlPSBudWxsOwotCQlmU2V2ZXJpdHk9IElTdGF0dXMuT0s7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTdGF0dXMjbWF0Y2hlcyhpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhpbnQgc2V2ZXJpdHlNYXNrKSB7Ci0JCXJldHVybiAoZlNldmVyaXR5ICYgc2V2ZXJpdHlNYXNrKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWx3YXlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiBAc2VlIElTdGF0dXMjaXNNdWx0aVN0YXR1cygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNdWx0aVN0YXR1cygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBJU3RhdHVzI2dldFNldmVyaXR5KCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNldmVyaXR5KCkgewotCQlyZXR1cm4gZlNldmVyaXR5OwotCX0KLQotCS8qCi0JICogQHNlZSBJU3RhdHVzI2dldFBsdWdpbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBJQW50VUlDb25zdGFudHMuUExVR0lOX0lEOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWx3YXlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzZWUgSVN0YXR1cyNnZXRFeGNlcHRpb24oKQotCSAqLwotCXB1YmxpYyBUaHJvd2FibGUgZ2V0RXhjZXB0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsd2F5cyB0aGUgZXJyb3Igc2V2ZXJpdHkuCi0JICogQHNlZSBJU3RhdHVzI2dldENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29kZSgpIHsKLQkJcmV0dXJuIGZTZXZlcml0eTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsd2F5cyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2VlIElTdGF0dXMjZ2V0Q2hpbGRyZW4oKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzW10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgSVN0YXR1c1swXTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1N5bnRheFByZXZpZXdDb2RlLnR4dCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1N5bnRheFByZXZpZXdDb2RlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyODFkZC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9TeW50YXhQcmV2aWV3Q29kZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIHByb2plY3QgICBbCi08IUVOVElUWSBjb21tb24gU1lTVEVNICJjb21tb24ueG1sIj4KLV0+Ci08cHJvamVjdCBkZWZhdWx0PSJncmVldGluZ3MiPgotCSZjb21tb247Ci0gICAgPHRhcmdldCBuYW1lPSJncmVldGluZ3MiPgotICAgIDwhLS1TYXlpbmcgSEkKLSAgICB0byB0aGUgd29ybGQtLT4KLSAgICAgICAgPGVjaG8+Ci0gICAgICAgICAgICAgRWNsaXBzZSEKLSAgICAgICAgPC9lY2hvPgkJICAKLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9UYWJGb2xkZXJMYXlvdXQuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1RhYkZvbGRlckxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDZmM2ZmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1RhYkZvbGRlckxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotCi1wdWJsaWMgY2xhc3MgVGFiRm9sZGVyTGF5b3V0IGV4dGVuZHMgTGF5b3V0IHsKLQotCXByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZSAoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQgJiYgaEhpbnQgIT0gU1dULkRFRkFVTFQpCi0JCQlyZXR1cm4gbmV3IFBvaW50KHdIaW50LCBoSGludCk7Ci0JCQkKLQkJQ29udHJvbCBbXSBjaGlsZHJlbiA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbiAoKTsKLQkJaW50IGNvdW50ID0gY2hpbGRyZW4ubGVuZ3RoOwotCQlpbnQgbWF4V2lkdGggPSAwLCBtYXhIZWlnaHQgPSAwOwotCQlmb3IgKGludCBpPTA7IGk8Y291bnQ7IGkrKykgewotCQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuIFtpXTsKLQkJCVBvaW50IHB0ID0gY2hpbGQuY29tcHV0ZVNpemUgKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmx1c2hDYWNoZSk7Ci0JCQltYXhXaWR0aCA9IE1hdGgubWF4IChtYXhXaWR0aCwgcHQueCk7Ci0JCQltYXhIZWlnaHQgPSBNYXRoLm1heCAobWF4SGVpZ2h0LCBwdC55KTsKLQkJfQotCQkKLQkJaWYgKHdIaW50ICE9IFNXVC5ERUZBVUxUKQotCQkJbWF4V2lkdGg9IHdIaW50OwotCQlpZiAoaEhpbnQgIT0gU1dULkRFRkFVTFQpCi0JCQltYXhIZWlnaHQ9IGhIaW50OwotCQkKLQkJcmV0dXJuIG5ldyBQb2ludChtYXhXaWR0aCwgbWF4SGVpZ2h0KTsJCi0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQgKENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQlSZWN0YW5nbGUgcmVjdD0gY29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKLQkKLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWNoaWxkcmVuW2ldLnNldEJvdW5kcyhyZWN0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1VSTEZpZWxkRWRpdG9yLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9VUkxGaWVsZEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDVlMzk2Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1VSTEZpZWxkRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlN0cmluZ0J1dHRvbkZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLQotcHVibGljIGNsYXNzIFVSTEZpZWxkRWRpdG9yIGV4dGVuZHMgU3RyaW5nQnV0dG9uRmllbGRFZGl0b3IgewotCQotCXB1YmxpYyBVUkxGaWVsZEVkaXRvcihTdHJpbmcgbmFtZSwgU3RyaW5nIGxhYmVsVGV4dCwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihuYW1lLCBsYWJlbFRleHQsIHBhcmVudCk7Ci0JCXNldEVtcHR5U3RyaW5nQWxsb3dlZChmYWxzZSk7Ci0JCXNldENoYW5nZUJ1dHRvblRleHQoSkZhY2VSZXNvdXJjZXMuZ2V0U3RyaW5nKCJvcGVuQnJvd3NlIikpOy8vJE5PTi1OTFMtMSQKLQkJc2V0RXJyb3JNZXNzYWdlKEFudFByZWZlcmVuY2VzTWVzc2FnZXMuVVJMRmllbGRFZGl0b3JfMCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuU3RyaW5nRmllbGRFZGl0b3IjZG9DaGVja1N0YXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkb0NoZWNrU3RhdGUoKSB7Ci0JCVN0cmluZyB0ZXh0PSBnZXRUZXh0Q29udHJvbCgpLmdldFRleHQoKTsKLQkJaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJdHJ5IHsKLQkJCQluZXcgVVJMKHRleHQpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gU3RyaW5nQnV0dG9uRmllbGRFZGl0b3IuCi0gICAgICogT3BlbnMgdGhlIGRpcmVjdG9yeSBjaG9vc2VyIGRpYWxvZyBhbmQgcmV0dXJucyB0aGUgPGNvZGU+VVJMPC9jb2RlPiBvZiB0aGUgc2VsZWN0ZWQgZGlyZWN0b3J5LgotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgY2hhbmdlUHJlc3NlZCgpIHsKLSAgICAJVVJMIHVybD0gbnVsbDsKLQkJdHJ5IHsKLQkJCXVybCA9IG5ldyBVUkwoZ2V0VGV4dENvbnRyb2woKS5nZXRUZXh0KCkpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZTEpIHsKLQkJfQotCQlGaWxlIGYgPSBudWxsOwotCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCWY9IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpOwotCQkJaWYgKCFmLmV4aXN0cygpKSB7Ci0JICAgICAgICAgICAgZiA9IG51bGw7Ci0JICAgICAgICB9Ci0JCX0KLSAgICAgICAgCi0gICAgICAgIEZpbGUgZCA9IGdldERpcmVjdG9yeShmKTsKLSAgICAgICAgaWYgKGQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotCQkJcmV0dXJuIGQudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJQW50VUlQbHVnaW4ubG9nKCJJbnRlcm5hbCBlcnJvciBzZXR0aW5nIGRvY3VtZW50YXRpb24gbG9jYXRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogSGVscGVyIHRoYXQgb3BlbnMgdGhlIGRpcmVjdG9yeSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKiBAcGFyYW0gc3RhcnRpbmdEaXJlY3RvcnkgVGhlIGRpcmVjdG9yeSB0aGUgZGlhbG9nIHdpbGwgb3BlbiBpbi4KLSAgICAgKiBAcmV0dXJuIEZpbGUgRmlsZSBvciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKi8KLSAgICBwcml2YXRlIEZpbGUgZ2V0RGlyZWN0b3J5KEZpbGUgc3RhcnRpbmdEaXJlY3RvcnkpIHsKLQotICAgICAgICBEaXJlY3RvcnlEaWFsb2cgZmlsZURpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0U2hlbGwoKSwgU1dULk9QRU4pOwotICAgICAgICBpZiAoc3RhcnRpbmdEaXJlY3RvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgZmlsZURpYWxvZy5zZXRGaWx0ZXJQYXRoKHN0YXJ0aW5nRGlyZWN0b3J5LmdldFBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGRpciA9IGZpbGVEaWFsb2cub3BlbigpOwotICAgICAgICBpZiAoZGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRpciA9IGRpci50cmltKCk7Ci0gICAgICAgICAgICBpZiAoZGlyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZShkaXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcmVmYWN0b3JpbmcvTGF1bmNoQ29uZmlndXJhdGlvbkJ1aWxkZmlsZVJlbmFtZVBhcnRpY2lwYW50LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9yZWZhY3RvcmluZy9MYXVuY2hDb25maWd1cmF0aW9uQnVpbGRmaWxlUmVuYW1lUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjMWU3NS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9yZWZhY3RvcmluZy9MYXVuY2hDb25maWd1cmF0aW9uQnVpbGRmaWxlUmVuYW1lUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQYXJ0aWNpcGFudDsKLQotcHVibGljIGNsYXNzIExhdW5jaENvbmZpZ3VyYXRpb25CdWlsZGZpbGVSZW5hbWVQYXJ0aWNpcGFudCBleHRlbmRzIFJlbmFtZVBhcnRpY2lwYW50IHsKLQotCXByaXZhdGUgSUZpbGUgZkZpbGU7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNpbml0aWFsaXplKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZShPYmplY3QgZWxlbWVudCkgewotCQlmRmlsZT0gKElGaWxlKSBlbGVtZW50OwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gUmVmYWN0b3JpbmdNZXNzYWdlcy5MYXVuY2hDb25maWd1cmF0aW9uUGFydGljaXBhbnRfMDsgCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NoZWNrQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtLCBDaGVja0NvbmRpdGlvbnNDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NyZWF0ZUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBMYXVuY2hDb25maWd1cmF0aW9uQnVpbGRmaWxlQ2hhbmdlLmNyZWF0ZUNoYW5nZXNGb3JCdWlsZGZpbGVSZW5hbWUoZkZpbGUsIGdldEFyZ3VtZW50cygpLmdldE5ld05hbWUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3JlZmFjdG9yaW5nL0xhdW5jaENvbmZpZ3VyYXRpb25JUHJvamVjdFJlbmFtZVBhcnRpY2lwYW50LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9yZWZhY3RvcmluZy9MYXVuY2hDb25maWd1cmF0aW9uSVByb2plY3RSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2M5ZWY1Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3JlZmFjdG9yaW5nL0xhdW5jaENvbmZpZ3VyYXRpb25JUHJvamVjdFJlbmFtZVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZW5hbWVQYXJ0aWNpcGFudDsKLQotcHVibGljIGNsYXNzIExhdW5jaENvbmZpZ3VyYXRpb25JUHJvamVjdFJlbmFtZVBhcnRpY2lwYW50IGV4dGVuZHMgUmVuYW1lUGFydGljaXBhbnQgewotCi0JcHJpdmF0ZSBJUHJvamVjdCBmUHJvamVjdDsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2luaXRpYWxpemUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplKE9iamVjdCBlbGVtZW50KSB7Ci0JCWZQcm9qZWN0PSAoSVByb2plY3QpIGVsZW1lbnQ7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBSZWZhY3RvcmluZ01lc3NhZ2VzLkxhdW5jaENvbmZpZ3VyYXRpb25QYXJ0aWNpcGFudF8wOyAKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjaGVja0NvbmRpdGlvbnMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0KQotCSAqLwotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0NvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSwgQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5JUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjcmVhdGVDaGFuZ2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIENoYW5nZSBjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gTGF1bmNoQ29uZmlndXJhdGlvbkJ1aWxkZmlsZUNoYW5nZS5jcmVhdGVDaGFuZ2VzRm9yUHJvamVjdFJlbmFtZShmUHJvamVjdCwgZ2V0QXJndW1lbnRzKCkuZ2V0TmV3TmFtZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcmVmYWN0b3JpbmcvUmVmYWN0b3JpbmdNZXNzYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcmVmYWN0b3JpbmcvUmVmYWN0b3JpbmdNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWQ5ODk2Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3JlZmFjdG9yaW5nL1JlZmFjdG9yaW5nTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBSZWZhY3RvcmluZ01lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nTWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhdW5jaENvbmZpZ3VyYXRpb25QYXJ0aWNpcGFudF8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhdW5jaENvbmZpZ3VyYXRpb25CdWlsZGZpbGVDaGFuZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMYXVuY2hDb25maWd1cmF0aW9uQnVpbGRmaWxlQ2hhbmdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGF1bmNoQ29uZmlndXJhdGlvbkJ1aWxkZmlsZUNoYW5nZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhdW5jaENvbmZpZ3VyYXRpb25CdWlsZGZpbGVDaGFuZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMYXVuY2hDb25maWd1cmF0aW9uQnVpbGRmaWxlQ2hhbmdlXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGF1bmNoQ29uZmlndXJhdGlvbkJ1aWxkZmlsZUNoYW5nZV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExhdW5jaENvbmZpZ3VyYXRpb25CdWlsZGZpbGVDaGFuZ2VfNzsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBSZWZhY3RvcmluZ01lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcmVmYWN0b3JpbmcvUmVmYWN0b3JpbmdNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvcmVmYWN0b3JpbmcvUmVmYWN0b3JpbmdNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGVhYzRjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3JlZmFjdG9yaW5nL1JlZmFjdG9yaW5nTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotTGF1bmNoQ29uZmlndXJhdGlvblBhcnRpY2lwYW50XzA9QW50IExhdW5jaCBjb25maWd1cmF0aW9uIHBhcnRpY2lwYW50Ci1MYXVuY2hDb25maWd1cmF0aW9uQnVpbGRmaWxlQ2hhbmdlXzA9UmVuYW1lIHRoZSBBbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24gInswfSIgdG8gInsxfSIsIHVwZGF0ZSBidWlsZGZpbGUgbG9jYXRpb24gYXR0cmlidXRlCi1MYXVuY2hDb25maWd1cmF0aW9uQnVpbGRmaWxlQ2hhbmdlXzE9VXBkYXRlIGJ1aWxkZmlsZSBvZiBBbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24gInswfSIKLUxhdW5jaENvbmZpZ3VyYXRpb25CdWlsZGZpbGVDaGFuZ2VfMj1VcGRhdGUgQW50IGxhdW5jaCBjb25maWd1cmF0aW9uICJ7MH0iCi1MYXVuY2hDb25maWd1cmF0aW9uQnVpbGRmaWxlQ2hhbmdlXzQ9VGhlIHByb2plY3QgZm9yIHRoZSBBbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24gInswfSIgaXMgbm8gbG9uZ2VyICJ7MX0iLgotTGF1bmNoQ29uZmlndXJhdGlvbkJ1aWxkZmlsZUNoYW5nZV81PVRoZSBidWlsZGZpbGUgbG9jYXRpb24gZm9yIHRoZSBBbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24gInswfSIgaXMgbm8gbG9uZ2VyICJ7MX0iLgotTGF1bmNoQ29uZmlndXJhdGlvbkJ1aWxkZmlsZUNoYW5nZV82PVRoZSBBbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24gInswfSIgbm8gbG9uZ2VyIGV4aXN0cy4KLUxhdW5jaENvbmZpZ3VyYXRpb25CdWlsZGZpbGVDaGFuZ2VfNz1BbnQgTGF1bmNoIGNvbmZpZ3VyYXRpb24gdXBkYXRlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL0FudFZpZXdDb250ZW50UHJvdmlkZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL0FudFZpZXdDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjYzY3My4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9BbnRWaWV3Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gY3VycmVudCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudE1vZGVsQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLQotcHVibGljIGNsYXNzIEFudFZpZXdDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBbnRNb2RlbENvbnRlbnRQcm92aWRlciB7Ci0JCi0JcHJpdmF0ZSBUcmVlVmlld2VyIGZUcmVlVmlld2VyOwotCXByaXZhdGUgTGlzdCBmRWxlbWVudHM9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGFuSW5wdXRFbGVtZW50KSB7Ci0JCWlmIChhbklucHV0RWxlbWVudCBpbnN0YW5jZW9mIE9iamVjdFtdKSB7Ci0JCQlyZXR1cm4gZkVsZW1lbnRzLnRvQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gRU1QVFlfQVJSQVk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZChPYmplY3QgbykgewotCQlpZiAoZkVsZW1lbnRzLmNvbnRhaW5zKG8pKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZkVsZW1lbnRzLmFkZChvKTsKLQkJZlRyZWVWaWV3ZXIuYWRkKGZUcmVlVmlld2VyLmdldElucHV0KCksIG8pOwotCQlmVHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obyksIHRydWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRBbGwoT2JqZWN0W10gbykgewotCQlmRWxlbWVudHMuYWRkQWxsKEFycmF5cy5hc0xpc3QobykpOwotCQlmVHJlZVZpZXdlci5hZGQoZlRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSwgbyk7Ci0JfQotCQotCS8qKgotCSAqIGRvIG5vdGhpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJZlRyZWVWaWV3ZXI9IChUcmVlVmlld2VyKXZpZXdlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCWZFbGVtZW50cy5yZW1vdmUobyk7Ci0JCWZUcmVlVmlld2VyLnJlbW92ZShvKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsKCkgewotCQlmVHJlZVZpZXdlci5yZW1vdmUoZlRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSwgZkVsZW1lbnRzLnRvQXJyYXkoKSk7Ci0JCWZFbGVtZW50cy5jbGVhcigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9BbnRWaWV3TWVzc2FnZXMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL0FudFZpZXdNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTY5NjQ0Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL0FudFZpZXdNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBBbnRWaWV3TWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkudmlld3MuQW50Vmlld01lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbnRWaWV3XzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50Vmlld18zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFZpZXdfNDsKLQotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEFudFZpZXdNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL0FudFZpZXdNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvQW50Vmlld01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYmVjZGYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvQW50Vmlld01lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUFudFZpZXdfMT0mT3BlbiBXaXRoCi1BbnRWaWV3XzM9XCBkZXBlbmRzPSIKLUFudFZpZXdfND1cIGRlc2NyaXB0aW9uPSIKLQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvYWN0aW9ucy9BZGRCdWlsZEZpbGVzQWN0aW9uLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL0FkZEJ1aWxkRmlsZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmExY2I3ZC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL0FkZEJ1aWxkRmlsZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnZpZXdzLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRQcm9qZWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50UHJvamVjdE5vZGVQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuRmlsZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkudmlld3MuQW50VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEFjdGlvbiB0aGF0IHByb21wdHMgdGhlIHVzZXIgZm9yIGJ1aWxkIGZpbGVzIGFuZCBhZGRzIHRoZSBzZWxlY3RlZCBmaWxlcyB0bwotICogYW4gPGNvZGU+QW50VmlldzwvY29kZT4KLSAqLwotcHVibGljIGNsYXNzIEFkZEJ1aWxkRmlsZXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JcHJpdmF0ZSBBbnRWaWV3IHZpZXc7Ci0KLQlwdWJsaWMgQWRkQnVpbGRGaWxlc0FjdGlvbihBbnRWaWV3IHZpZXcpIHsKLQkJc3VwZXIoQW50Vmlld0FjdGlvbk1lc3NhZ2VzLkFkZEJ1aWxkRmlsZXNBY3Rpb25fMSwgQW50VUlJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElBbnRVSUNvbnN0YW50cy5JTUdfQUREKSk7Ci0JCXRoaXMudmlldz0gdmlldzsKLQkJc2V0VG9vbFRpcFRleHQoQW50Vmlld0FjdGlvbk1lc3NhZ2VzLkFkZEJ1aWxkRmlsZXNBY3Rpb25fMCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywgSUFudFVJSGVscENvbnRleHRJZHMuQUREX0JVSUxERklMRV9BQ1RJT04pOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlTdHJpbmcgdGl0bGU9IEFudFZpZXdBY3Rpb25NZXNzYWdlcy5BZGRCdWlsZEZpbGVzQWN0aW9uXzI7Ci0JCVN0cmluZyBtZXNzYWdlPSBBbnRWaWV3QWN0aW9uTWVzc2FnZXMuQWRkQnVpbGRGaWxlc0FjdGlvbl80OwotCQlTdHJpbmcgZmlsdGVyRXh0ZW5zaW9uPSAieG1sIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZmlsdGVyTWVzc2FnZT0gQW50Vmlld0FjdGlvbk1lc3NhZ2VzLkFkZEJ1aWxkRmlsZXNBY3Rpb25fNTsKLQkJCi0JCUZpbGVTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVTZWxlY3Rpb25EaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgZ2V0QnVpbGRGaWxlcygpLCB0aXRsZSwgbWVzc2FnZSwgZmlsdGVyRXh0ZW5zaW9uLCBmaWx0ZXJNZXNzYWdlKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJZmluYWwgT2JqZWN0W10gcmVzdWx0PSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkuYnVzeUN1cnNvcldoaWxlKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQltb25pdG9yLmJlZ2luVGFzayhBbnRWaWV3QWN0aW9uTWVzc2FnZXMuQWRkQnVpbGRGaWxlc0FjdGlvbl8zLCByZXN1bHQubGVuZ3RoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoICYmICFtb25pdG9yLmlzQ2FuY2VsZWQoKTsgaSsrKSB7Ci0JCQkJCQlPYmplY3QgZmlsZSA9IHJlc3VsdFtpXTsKLQkJCQkJCWlmIChmaWxlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJCQlTdHJpbmcgYnVpbGRGaWxlTmFtZT0gKChJRmlsZSlmaWxlKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQkJCQkJZmluYWwgQW50UHJvamVjdE5vZGUgcHJvamVjdD0gbmV3IEFudFByb2plY3ROb2RlUHJveHkoYnVpbGRGaWxlTmFtZSk7Ci0JCQkJCQkJcHJvamVjdC5nZXROYW1lKCk7Ci0JCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJdmlldy5hZGRQcm9qZWN0KHByb2plY3QpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRCdWlsZEZpbGVzKCkgewotCQlBbnRQcm9qZWN0Tm9kZVtdIGV4aXN0aW5nUHJvamVjdHM9IHZpZXcuZ2V0UHJvamVjdHMoKTsKLQkJTGlzdCBidWlsZEZpbGVzPSBuZXcgQXJyYXlMaXN0KGV4aXN0aW5nUHJvamVjdHMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBleGlzdGluZ1Byb2plY3RzLmxlbmd0aDsgaisrKSB7Ci0JCQlBbnRQcm9qZWN0Tm9kZSBleGlzdGluZ1Byb2plY3QgPSBleGlzdGluZ1Byb2plY3RzW2pdOwotCQkJYnVpbGRGaWxlcy5hZGQoQW50VXRpbC5nZXRGaWxlKGV4aXN0aW5nUHJvamVjdC5nZXRCdWlsZEZpbGVOYW1lKCkpKTsKLQkJfQotCQlyZXR1cm4gYnVpbGRGaWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL0FudE9wZW5XaXRoTWVudS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvYWN0aW9ucy9BbnRPcGVuV2l0aE1lbnUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwYmY1My4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL0FudE9wZW5XaXRoTWVudS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkudmlld3MuYWN0aW9uczsKLQotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudEVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS5Qcm9ncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLQotLyoqCi0gKiAKLSAqIENvZGUgbW9zdGx5IGEgY29weSBvZiB0aGUgT3BlbldpdGhNZW51IHdoaWNoIGNhbm5vdCBiZSBlZmZlY3RpdmVseSBzdWJjbGFzc2VkCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRPcGVuV2l0aE1lbnUgZXh0ZW5kcyBDb250cmlidXRpb25JdGVtIHsKLQotCXByaXZhdGUgSVdvcmtiZW5jaFBhZ2UgZlBhZ2U7Ci0JcHJpdmF0ZSBJRWRpdG9yUmVnaXN0cnkgZlJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRFZGl0b3JSZWdpc3RyeSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fRURJVE9SX0lEPSBQbGF0Zm9ybVVJLlBMVUdJTl9JRCArICIuU3lzdGVtRWRpdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGltYWdlQ2FjaGUgPSBuZXcgSGFzaHRhYmxlKDExKTsKLQotCXByaXZhdGUgQW50RWxlbWVudE5vZGUgZk5vZGU7Ci0JCi0JLyoqCi0JICogVGhlIGlkIG9mIHRoaXMgYWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gSUFudFVJQ29uc3RhbnRzLlBMVUdJTl9JRCArICIuQW50T3BlbldpdGhNZW51IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEFudE9wZW5XaXRoTWVudShJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0JCXN1cGVyKElEKTsKLQkJdGhpcy5mUGFnZT0gcGFnZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJSXRlcmF0b3IgaXRlcj0gaW1hZ2VDYWNoZS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUltYWdlIGltYWdlID0gKEltYWdlKSBpdGVyLm5leHQoKTsKLQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJfQkJCi0JCWltYWdlQ2FjaGUuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIHRvIHNob3cgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGVkaXRvciBkZXNjcmlwdG9yLgotCSAqCi0JICogQHBhcmFtIGVkaXRvckRlc2MgdGhlIGVkaXRvciBkZXNjcmlwdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBmb3IgdGhlIHN5c3RlbSBlZGl0b3IKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByaXZhdGUgSW1hZ2UgZ2V0SW1hZ2UoSUVkaXRvckRlc2NyaXB0b3IgZWRpdG9yRGVzYykgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKGVkaXRvckRlc2MpOwotCQlpZiAoaW1hZ2VEZXNjID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUltYWdlIGltYWdlID0gKEltYWdlKSBpbWFnZUNhY2hlLmdldChpbWFnZURlc2MpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJaW1hZ2UgPSBpbWFnZURlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJCWltYWdlQ2FjaGUucHV0KGltYWdlRGVzYywgaW1hZ2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gZWRpdG9yIGRlc2NyaXB0b3IsCi0JICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaGFzIG5vIGltYWdlLgotCSAqLwotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihJRWRpdG9yRGVzY3JpcHRvciBlZGl0b3JEZXNjKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2MgPSBudWxsOwotCQlpZiAoZWRpdG9yRGVzYyA9PSBudWxsKSB7Ci0JCQlpbWFnZURlc2MgPSBmUmVnaXN0cnkuZ2V0SW1hZ2VEZXNjcmlwdG9yKGZOb2RlLmdldElGaWxlKCkuZ2V0TmFtZSgpKTsKLQkJfSBlbHNlIHsKLQkJCWltYWdlRGVzYyA9IGVkaXRvckRlc2MuZ2V0SW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQkJaWYgKGltYWdlRGVzYyA9PSBudWxsICYmIGVkaXRvckRlc2MgIT0gbnVsbCkgewotCQkJaWYgKGVkaXRvckRlc2MuZ2V0SWQoKS5lcXVhbHMoU1lTVEVNX0VESVRPUl9JRCkpIHsKLQkJCQlpbWFnZURlc2MgPSBnZXRTeXN0ZW1FZGl0b3JJbWFnZURlc2NyaXB0b3IoZk5vZGUuZ2V0SUZpbGUoKS5nZXRGaWxlRXh0ZW5zaW9uKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZURlc2M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yIG9mIHRoZSBzeXN0ZW0gZWRpdG9yCi0JICogdGhhdCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIE9TIHRvIGVkaXQgZmlsZXMgb2YKLQkgKiB0aGlzIHR5cGUuIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgY2FuIGJlIGZvdW5kLgotCSAqLwotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGdldFN5c3RlbUVkaXRvckltYWdlRGVzY3JpcHRvcihTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0JCVByb2dyYW0gZXh0ZXJuYWxQcm9ncmFtID0gbnVsbDsKLQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7Ci0JCQlleHRlcm5hbFByb2dyYW0gPSBQcm9ncmFtLmZpbmRQcm9ncmFtKGV4dGVuc2lvbik7Ci0JCX0KLQkJaWYgKGV4dGVybmFsUHJvZ3JhbSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSAKLQkJcmV0dXJuIG5ldyBFZGl0b3JJbWFnZURlc2NyaXB0b3IoZXh0ZXJuYWxQcm9ncmFtKTsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWVudSBpdGVtIGZvciB0aGUgZWRpdG9yIGRlc2NyaXB0b3IuCi0JICoKLQkgKiBAcGFyYW0gbWVudSB0aGUgbWVudSB0byBhZGQgdGhlIGl0ZW0gdG8KLQkgKiBAcGFyYW0gZGVzY3JpcHRvciB0aGUgZWRpdG9yIGRlc2NyaXB0b3IsIG9yIG51bGwgZm9yIHRoZSBzeXN0ZW0gZWRpdG9yCi0JICogQHBhcmFtIHByZWZlcnJlZEVkaXRvciB0aGUgZGVzY3JpcHRvciBvZiB0aGUgcHJlZmVycmVkIGVkaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlTWVudUl0ZW0oTWVudSBtZW51LCBmaW5hbCBJRWRpdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBmaW5hbCBJRWRpdG9yRGVzY3JpcHRvciBwcmVmZXJyZWRFZGl0b3IpIHsKLQkJLy8gWFhYOiBXb3VsZCBiZSBiZXR0ZXIgdG8gdXNlIGJvbGQgaGVyZSwgYnV0IFNXVCBkb2VzIG5vdCBzdXBwb3J0IGl0LgotCQlmaW5hbCBNZW51SXRlbSBtZW51SXRlbSA9IG5ldyBNZW51SXRlbShtZW51LCBTV1QuUkFESU8pOwotCQlib29sZWFuIGlzUHJlZmVycmVkID0gcHJlZmVycmVkRWRpdG9yICE9IG51bGwgJiYgZGVzY3JpcHRvci5nZXRJZCgpLmVxdWFscyhwcmVmZXJyZWRFZGl0b3IuZ2V0SWQoKSk7Ci0JCW1lbnVJdGVtLnNldFNlbGVjdGlvbihpc1ByZWZlcnJlZCk7Ci0JCW1lbnVJdGVtLnNldFRleHQoZGVzY3JpcHRvci5nZXRMYWJlbCgpKTsKLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZShkZXNjcmlwdG9yKTsKLQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCW1lbnVJdGVtLnNldEltYWdlKGltYWdlKTsKLQkJfQotCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJCWNhc2UgU1dULlNlbGVjdGlvbiA6Ci0JCQkJCQlpZiAobWVudUl0ZW0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJCQlvcGVuRWRpdG9yKGRlc2NyaXB0b3IpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9OwotCQltZW51SXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbSNmaWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnUsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsKE1lbnUgbWVudSwgaW50IGluZGV4KSB7Ci0JCUlGaWxlIGZpbGVSZXNvdXJjZSA9IGZOb2RlLmdldElGaWxlKCk7Ci0JCWlmIChmaWxlUmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSUVkaXRvckRlc2NyaXB0b3IgZGVmYXVsdEVkaXRvciA9IGZSZWdpc3RyeS5maW5kRWRpdG9yKElFZGl0b3JSZWdpc3RyeS5TWVNURU1fSU5QTEFDRV9FRElUT1JfSUQpOyAvLyBzaG91bGQgbm90IGJlIG51bGwKLQkJSUVkaXRvckRlc2NyaXB0b3IgcHJlZmVycmVkRWRpdG9yID0gSURFLmdldERlZmF1bHRFZGl0b3IoZmlsZVJlc291cmNlKTsgLy8gbWF5IGJlIG51bGwKLQkJCi0JCU9iamVjdFtdIGVkaXRvcnM9IGZSZWdpc3RyeS5nZXRFZGl0b3JzKGZpbGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlBcnJheXMuc29ydChlZGl0b3JzLCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgamF2YS51dGlsLkNvbXBhcmF0b3IjY29tcGFyZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCQkJICovCi0JCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCQlTdHJpbmcgczEgPSAoKElFZGl0b3JEZXNjcmlwdG9yKSBvMSkuZ2V0TGFiZWwoKTsKLQkJCQlTdHJpbmcgczIgPSAoKElFZGl0b3JEZXNjcmlwdG9yKSBvMikuZ2V0TGFiZWwoKTsKLQkJCQkvL1JldHVybiB0cnVlIGlmIGVsZW1lbnRUd28gaXMgJ2dyZWF0ZXIgdGhhbicgZWxlbWVudE9uZQotCQkJCXJldHVybiBzMS5jb21wYXJlVG9JZ25vcmVDYXNlKHMyKTsKLQkJCX0KLQkJfSk7Ci0JCUlFZGl0b3JEZXNjcmlwdG9yIGFudEVkaXRvcj0gZlJlZ2lzdHJ5LmZpbmRFZGl0b3IoIm9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuQW50RWRpdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWJvb2xlYW4gZGVmYXVsdEZvdW5kID0gZmFsc2U7Ci0JCWJvb2xlYW4gYW50Rm91bmQ9IGZhbHNlOwotCQlMaXN0IGFscmVhZHlBZGRlZEVkaXRvcnM9IG5ldyBBcnJheUxpc3QoZWRpdG9ycy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JEZXNjcmlwdG9yIGVkaXRvciA9IChJRWRpdG9yRGVzY3JpcHRvcikgZWRpdG9yc1tpXTsKLQkJCWlmIChhbHJlYWR5QWRkZWRFZGl0b3JzLmNvbnRhaW5zKGVkaXRvci5nZXRJZCgpKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJY3JlYXRlTWVudUl0ZW0obWVudSwgZWRpdG9yLCBwcmVmZXJyZWRFZGl0b3IpOwotCQkJaWYgKGRlZmF1bHRFZGl0b3IgIT0gbnVsbCAmJiBlZGl0b3IuZ2V0SWQoKS5lcXVhbHMoZGVmYXVsdEVkaXRvci5nZXRJZCgpKSkgewotCQkJCWRlZmF1bHRGb3VuZCA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAoYW50RWRpdG9yICE9IG51bGwgJiYgZWRpdG9yLmdldElkKCkuZXF1YWxzKGFudEVkaXRvci5nZXRJZCgpKSkgewotCQkJCWFudEZvdW5kPSB0cnVlOwotCQkJfQotCQkJYWxyZWFkeUFkZGVkRWRpdG9ycy5hZGQoZWRpdG9yLmdldElkKCkpOwotCQkJCi0JCX0KLQotCQkvLyBPbmx5IGFkZCBhIHNlcGFyYXRvciBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdG8gc2VwYXJhdGUKLQkJaWYgKGVkaXRvcnMubGVuZ3RoID4gMCkgewotCQkJbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5TRVBBUkFUT1IpOwotCQl9Ci0KLQkJLy8gQWRkIGFudCBlZGl0b3IuCi0JCSBpZiAoIWFudEZvdW5kICYmIGFudEVkaXRvciAhPSBudWxsKSB7Ci0JCQkgY3JlYXRlTWVudUl0ZW0obWVudSwgYW50RWRpdG9yLCBwcmVmZXJyZWRFZGl0b3IpOwotCQkgfQotCQkJIAotCQkvLyBBZGQgZGVmYXVsdCBlZGl0b3IuCi0JCWlmICghZGVmYXVsdEZvdW5kICYmIGRlZmF1bHRFZGl0b3IgIT0gbnVsbCkgewotCQkJY3JlYXRlTWVudUl0ZW0obWVudSwgZGVmYXVsdEVkaXRvciwgcHJlZmVycmVkRWRpdG9yKTsKLQkJfQotCi0JCS8vIEFkZCBzeXN0ZW0gZWRpdG9yLgotCQlJRWRpdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZlJlZ2lzdHJ5LmZpbmRFZGl0b3IoSUVkaXRvclJlZ2lzdHJ5LlNZU1RFTV9FWFRFUk5BTF9FRElUT1JfSUQpOwotCQljcmVhdGVNZW51SXRlbShtZW51LCBkZXNjcmlwdG9yLCBwcmVmZXJyZWRFZGl0b3IpOwotCQljcmVhdGVEZWZhdWx0TWVudUl0ZW0obWVudSwgZmlsZVJlc291cmNlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW0jaXNEeW5hbWljKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0R5bmFtaWMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKioKLQkgKiBPcGVucyB0aGUgZ2l2ZW4gZWRpdG9yIG9uIHRoZSBzZWxlY3RlZCBmaWxlLgotCSAqCi0JICogQHBhcmFtIGVkaXRvciB0aGUgZWRpdG9yIGRlc2NyaXB0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciB0aGUgc3lzdGVtIGVkaXRvcgotCSAqLwotCXByaXZhdGUgdm9pZCBvcGVuRWRpdG9yKElFZGl0b3JEZXNjcmlwdG9yIGVkaXRvckRlc2NyaXB0b3IpIHsKLQkJQW50VXRpbC5vcGVuSW5FZGl0b3IoZlBhZ2UsIGVkaXRvckRlc2NyaXB0b3IsIGZOb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZW51IGl0ZW0gZm9yIHRoZSBkZWZhdWx0IGVkaXRvcgotCSAqCi0JICogQHBhcmFtIG1lbnUgdGhlIG1lbnUgdG8gYWRkIHRoZSBpdGVtIHRvCi0JICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgYmVpbmcgZWRpdGVkCi0JICogQHBhcmFtIHJlZ2lzdHJ5IHRoZSBlZGl0b3IgcmVnaXN0cnkKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdE1lbnVJdGVtKE1lbnUgbWVudSwgZmluYWwgSUZpbGUgZmlsZVJlc291cmNlKSB7Ci0JCWZpbmFsIE1lbnVJdGVtIG1lbnVJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5SQURJTyk7Ci0JCW1lbnVJdGVtLnNldFNlbGVjdGlvbihJREUuZ2V0RGVmYXVsdEVkaXRvcihmaWxlUmVzb3VyY2UpID09IG51bGwpOwotCQltZW51SXRlbS5zZXRUZXh0KEFudFZpZXdBY3Rpb25NZXNzYWdlcy5BbnRWaWV3T3BlbldpdGhNZW51X0RlZmF1bHRfRWRpdG9yXzQpOwotCi0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLQkJCQkJY2FzZSBTV1QuU2VsZWN0aW9uIDoKLQkJCQkJCWlmIChtZW51SXRlbS5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQkJCUlERS5zZXREZWZhdWx0RWRpdG9yKGZpbGVSZXNvdXJjZSwgbnVsbCk7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJSURFLm9wZW5FZGl0b3IoZlBhZ2UsIGZpbGVSZXNvdXJjZSwgdHJ1ZSk7Ci0JCQkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJCQlBbnRVSVBsdWdpbi5sb2coTWVzc2FnZUZvcm1hdC5mb3JtYXQoQW50Vmlld0FjdGlvbk1lc3NhZ2VzLkFudFZpZXdPcGVuV2l0aE1lbnVfRWRpdG9yX2ZhaWxlZCwgbmV3IFN0cmluZ1tde2ZpbGVSZXNvdXJjZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKX0pLCBlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJbWVudUl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vZGUoQW50RWxlbWVudE5vZGUgbm9kZSkgewotCQlmTm9kZT0gbm9kZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL0FudFZpZXdBY3Rpb25NZXNzYWdlcy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvYWN0aW9ucy9BbnRWaWV3QWN0aW9uTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzODA0Yy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL0FudFZpZXdBY3Rpb25NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS52aWV3cy5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEFudFZpZXdBY3Rpb25NZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS52aWV3cy5hY3Rpb25zLkFudFZpZXdBY3Rpb25NZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoRm9yQnVpbGRGaWxlc0RpYWxvZ19TZWFyY2hfZm9yX0J1aWxkX0ZpbGVzXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoRm9yQnVpbGRGaWxlc0RpYWxvZ19fSW5wdXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoRm9yQnVpbGRGaWxlc0RpYWxvZ19CdWlsZF9uYW1lX2Nhbm5vdF9iZV9lbXB0eV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaEZvckJ1aWxkRmlsZXNEaWFsb2dfX1NlYXJjaF80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaEZvckJ1aWxkRmlsZXNEaWFsb2dfU2NvcGVfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hGb3JCdWlsZEZpbGVzRGlhbG9nX19Xb3Jrc3BhY2VfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hGb3JCdWlsZEZpbGVzRGlhbG9nX1dvcl9raW5nX1NldF9fNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hGb3JCdWlsZEZpbGVzRGlhbG9nX19DaG9vc2VfX19fODsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hGb3JCdWlsZEZpbGVzRGlhbG9nX0luY2x1ZGVfZXJyb3JzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaEZvckJ1aWxkRmlsZXNEaWFsb2dfTXVzdF9zZWxlY3RfYV93b3JraW5nX3NldF8xMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hGb3JCdWlsZEZpbGVzRGlhbG9nX05vX3NlYXJjaGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW50Vmlld09wZW5XaXRoTWVudV9FZGl0b3JfZmFpbGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFudFZpZXdPcGVuV2l0aE1lbnVfRGVmYXVsdF9FZGl0b3JfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCdWlsZEZpbGVzQWN0aW9uXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQnVpbGRGaWxlc0FjdGlvbl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJ1aWxkRmlsZXNBY3Rpb25fMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCdWlsZEZpbGVzQWN0aW9uXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQnVpbGRGaWxlc0FjdGlvbl80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJ1aWxkRmlsZXNBY3Rpb25fNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVBbGxBY3Rpb25fUmVtb3ZlX0FsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVBbGxBY3Rpb25fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVBbGxBY3Rpb25fMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVQcm9qZWN0QWN0aW9uX1JlbW92ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVQcm9qZWN0QWN0aW9uX1JlbW92ZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJ1blRhcmdldEFjdGlvbl9SdW5fMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSdW5UYXJnZXRBY3Rpb25fMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSdW5UYXJnZXRBY3Rpb25fNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSdW5UYXJnZXRBY3Rpb25fMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSdW5UYXJnZXRBY3Rpb25fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hGb3JCdWlsZEZpbGVzQWN0aW9uX1NlYXJjaF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlYXJjaEZvckJ1aWxkRmlsZXNBY3Rpb25fQWRkX2J1aWxkX2ZpbGVzX3dpdGhfc2VhcmNoXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoRm9yQnVpbGRGaWxlc0FjdGlvbl9Qcm9jZXNzaW5nX3NlYXJjaF9yZXN1bHRzXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VhcmNoRm9yQnVpbGRGaWxlc0FjdGlvbl9BZGRpbmdfXzBfXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVmcmVzaEJ1aWxkRmlsZXNBY3Rpb25fUmVmcmVzaF9CdWlsZGZpbGVzXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVmcmVzaEJ1aWxkRmlsZXNBY3Rpb25fUmVmcmVzaGluZ19idWlsZGZpbGVzXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVmcmVzaEJ1aWxkRmlsZXNBY3Rpb25fUmVmcmVzaGluZ19fMF9fNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJJbnRlcm5hbFRhcmdldHNBY3Rpb25fMDsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBBbnRWaWV3QWN0aW9uTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL0FudFZpZXdBY3Rpb25NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvYWN0aW9ucy9BbnRWaWV3QWN0aW9uTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg4MmJhOS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL0FudFZpZXdBY3Rpb25NZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1TZWFyY2hGb3JCdWlsZEZpbGVzRGlhbG9nX1NlYXJjaF9mb3JfQnVpbGRfRmlsZXNfMT1TZWFyY2ggZm9yIEJ1aWxkZmlsZXMKLVNlYXJjaEZvckJ1aWxkRmlsZXNEaWFsb2dfX0lucHV0PSZJbnB1dCBhIGJ1aWxkZmlsZSBuYW1lICgqID0gYW55IHN0cmluZywgPyA9IGFueSBjaGFyYWN0ZXIpOgotU2VhcmNoRm9yQnVpbGRGaWxlc0RpYWxvZ19CdWlsZF9uYW1lX2Nhbm5vdF9iZV9lbXB0eV8zPUJ1aWxkIG5hbWUgY2Fubm90IGJlIGVtcHR5Ci1TZWFyY2hGb3JCdWlsZEZpbGVzRGlhbG9nX19TZWFyY2hfND0mU2VhcmNoCi1TZWFyY2hGb3JCdWlsZEZpbGVzRGlhbG9nX1Njb3BlXzU9U2NvcGUKLVNlYXJjaEZvckJ1aWxkRmlsZXNEaWFsb2dfX1dvcmtzcGFjZV82PSZXb3Jrc3BhY2UKLVNlYXJjaEZvckJ1aWxkRmlsZXNEaWFsb2dfV29yX2tpbmdfU2V0X183PVdvciZraW5nIFNldDoKLVNlYXJjaEZvckJ1aWxkRmlsZXNEaWFsb2dfX0Nob29zZV9fX184PSZDaG9vc2UuLi4KLVNlYXJjaEZvckJ1aWxkRmlsZXNEaWFsb2dfSW5jbHVkZV9lcnJvcnM9SW5jbHVkZSAmYnVpbGRmaWxlcyB0aGF0IGNvbnRhaW4gZXJyb3JzCi1TZWFyY2hGb3JCdWlsZEZpbGVzRGlhbG9nX011c3Rfc2VsZWN0X2Ffd29ya2luZ19zZXRfMTA9TXVzdCBzZWxlY3QgYSB3b3JraW5nIHNldAotU2VhcmNoRm9yQnVpbGRGaWxlc0RpYWxvZ19Ob19zZWFyY2hhYmxlPU5vIHNlYXJjaGFibGUgcmVzb3VyY2VzIGZvdW5kIGluIHRoZSBzZWxlY3RlZCB3b3JraW5nIHNldAotQW50Vmlld09wZW5XaXRoTWVudV9FZGl0b3JfZmFpbGVkPUVkaXRvciBmYWlsZWQgdG8gb3BlbiBmb3IgezB9Ci1BbnRWaWV3T3BlbldpdGhNZW51X0RlZmF1bHRfRWRpdG9yXzQ9RGVmYXVsdCBFZGl0b3IKLUFkZEJ1aWxkRmlsZXNBY3Rpb25fMD1BZGQgQnVpbGRmaWxlcwotQWRkQnVpbGRGaWxlc0FjdGlvbl8xPSZBZGQgQnVpbGRmaWxlcy4uLgotQWRkQnVpbGRGaWxlc0FjdGlvbl8yPUJ1aWxkZmlsZSBTZWxlY3Rpb24KLUFkZEJ1aWxkRmlsZXNBY3Rpb25fMz1BZGRpbmcgQnVpbGRmaWxlKHMpLi4uCi1BZGRCdWlsZEZpbGVzQWN0aW9uXzQ9JkNob29zZSB0aGUgYnVpbGRmaWxlcyB0byBhZGQ6Ci1BZGRCdWlsZEZpbGVzQWN0aW9uXzU9Jk9ubHkgc2hvdyAqLnhtbCBmaWxlcwotUmVtb3ZlQWxsQWN0aW9uX1JlbW92ZV9BbGw9UmVtb3ZlIEEmbGwgQnVpbGRmaWxlcwotUmVtb3ZlQWxsQWN0aW9uXzA9UmVtb3ZlIEFsbCBmcm9tIFZpZXcKLVJlbW92ZUFsbEFjdGlvbl8xPUFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZW1vdmUgYWxsIGJ1aWxkZmlsZXMgZnJvbSB0aGUgdmlldz8KLVJlbW92ZVByb2plY3RBY3Rpb25fUmVtb3ZlPVJlbW8mdmUgQnVpbGRmaWxlCi1SZW1vdmVQcm9qZWN0QWN0aW9uX1JlbW92ZV8yPVJlbW92ZSBTZWxlY3RlZCBCdWlsZGZpbGUKLVJ1blRhcmdldEFjdGlvbl9SdW5fMT1SJnVuCi1SdW5UYXJnZXRBY3Rpb25fMz1SdW4gdGhlIERlZmF1bHQgVGFyZ2V0IG9mIHRoZSBTZWxlY3RlZCBCdWlsZGZpbGUKLVJ1blRhcmdldEFjdGlvbl80PVJ1biB0aGUgU2VsZWN0ZWQgVGFyZ2V0Ci1SdW5UYXJnZXRBY3Rpb25fMj1MYXVuY2hpbmcgQW50IGJ1aWxkZmlsZQotUnVuVGFyZ2V0QWN0aW9uXzA9UnVuIHRoZSBPd25pbmcgVGFyZ2V0IG9mIHRoZSBTZWxlY3RlZCBUYXNrCi1TZWFyY2hGb3JCdWlsZEZpbGVzQWN0aW9uX1NlYXJjaF8xPVNlYXJjaAotU2VhcmNoRm9yQnVpbGRGaWxlc0FjdGlvbl9BZGRfYnVpbGRfZmlsZXNfd2l0aF9zZWFyY2hfMj1BZGQgQnVpbGRmaWxlcyB3aXRoIFNlYXJjaAotU2VhcmNoRm9yQnVpbGRGaWxlc0FjdGlvbl9Qcm9jZXNzaW5nX3NlYXJjaF9yZXN1bHRzXzM9UHJvY2Vzc2luZyBzZWFyY2ggcmVzdWx0cy4uLgotU2VhcmNoRm9yQnVpbGRGaWxlc0FjdGlvbl9BZGRpbmdfXzBfXzQ9QWRkaW5nIHswfQotUmVmcmVzaEJ1aWxkRmlsZXNBY3Rpb25fUmVmcmVzaF9CdWlsZGZpbGVzXzE9UmUmZnJlc2ggQnVpbGRmaWxlcwotUmVmcmVzaEJ1aWxkRmlsZXNBY3Rpb25fUmVmcmVzaGluZ19idWlsZGZpbGVzXzM9UmVmcmVzaGluZyBidWlsZGZpbGVzLi4uCi1SZWZyZXNoQnVpbGRGaWxlc0FjdGlvbl9SZWZyZXNoaW5nX18wX180PVJlZnJlc2hpbmcgezB9Ci1GaWx0ZXJJbnRlcm5hbFRhcmdldHNBY3Rpb25fMD1IaWRlIEludGVybmFsIFRhcmdldHMKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL2FjdGlvbnMvRWRpdG9ySW1hZ2VEZXNjcmlwdG9yLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL0VkaXRvckltYWdlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTYxZjIzLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL2FjdGlvbnMvRWRpdG9ySW1hZ2VEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS52aWV3cy5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0uUHJvZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogQ29weSBvZiBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5taXNjLkV4dGVybmFsUHJvZ3JhbUltYWdlRGVzY3JpcHRvciBmb3IKLSAqIHVzZSBpbiB0aGUgQW50Vmlld09wZW5XaXRoTWVudQotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9ySW1hZ2VEZXNjcmlwdG9yIGV4dGVuZHMgSW1hZ2VEZXNjcmlwdG9yIHsKLQotCXB1YmxpYyBQcm9ncmFtIHByb2dyYW07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IEltYWdlRGVzY3JpcHRvci4gVGhlIGltYWdlIGlzIGxvYWRlZCAKLQkgKiBmcm9tIGEgZmlsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIDxjb2RlPm5hbWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBFZGl0b3JJbWFnZURlc2NyaXB0b3IoUHJvZ3JhbSBwcm9ncmFtKSB7Ci0JCXRoaXMucHJvZ3JhbSA9IHByb2dyYW07Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmICghKG8gaW5zdGFuY2VvZiBFZGl0b3JJbWFnZURlc2NyaXB0b3IpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJRWRpdG9ySW1hZ2VEZXNjcmlwdG9yIG90aGVyID0gKEVkaXRvckltYWdlRGVzY3JpcHRvcikgbzsKLQotCQkvL1NlZSBpZiB0aGVyZSBpcyBhIG5hbWUgLSBjb21wYXJlIGl0IGlmIHNvIGFuZCBjb21wYXJlIHRoZSBwcm9ncmFtcyBpZiBub3QKLQkJU3RyaW5nIG90aGVyTmFtZSA9IG90aGVyLnByb2dyYW0uZ2V0TmFtZSgpOwotCQlpZiAob3RoZXJOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBvdGhlci5wcm9ncmFtLmVxdWFscyhwcm9ncmFtKTsKLQkJfSAKLQkJcmV0dXJuIG90aGVyTmFtZS5lcXVhbHMocHJvZ3JhbS5nZXROYW1lKCkpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIFNXVCBJbWFnZSB0aGF0IGlzIGRlc2NyaWJlZCBieSB0aGUgaW5mb3JtYXRpb24KLQkgKiBpbiB0aGlzIGRlc2NyaXB0b3IuICBFYWNoIGNhbGwgcmV0dXJucyBhIG5ldyBJbWFnZS4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBjcmVhdGVJbWFnZSgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvciNnZXRJbWFnZURhdGEoKQotCSAqLwotCXB1YmxpYyBJbWFnZURhdGEgZ2V0SW1hZ2VEYXRhKCkgewotCQkKLQkJSW1hZ2VEYXRhIGRlZmF1bHRJbWFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX09CSl9GSUxFKS5nZXRJbWFnZURhdGEoKTsKLQkJaWYgKGRlZmF1bHRJbWFnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJbWFnZURhdGEgZGF0YSA9IG51bGw7Ci0JCWlmIChwcm9ncmFtID09IG51bGwgfHwgKChkYXRhID0gcHJvZ3JhbS5nZXRJbWFnZURhdGEoKSkgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBkZWZhdWx0SW1hZ2U7Ci0JCX0KLQotCQkvL1RoZSBpbWFnZXMgaW4gR05PTUUgYXJlIHRvbyBiaWcuIFNjYWxpbmcgdGhlbSBkb2VzIG5vdCBnaXZlIG5pY2UgcmVzdWx0IHNvIHJldHVybiBkZWZhdWx0SW1hZ2U7Ci0JCWlmIChkYXRhLmhlaWdodCA+IGRlZmF1bHRJbWFnZS5oZWlnaHQgfHwgZGF0YS53aWR0aCA+IGRlZmF1bHRJbWFnZS53aWR0aCkgewotCQkJcmV0dXJuIGRlZmF1bHRJbWFnZTsKLQkJfQotCi0JCXJldHVybiBkYXRhOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlTdHJpbmcgcHJvZ3JhbU5hbWUgPSBwcm9ncmFtLmdldE5hbWUoKTsKLQkJaWYgKHByb2dyYW1OYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBwcm9ncmFtLmhhc2hDb2RlKCk7Ci0JCX0gCi0JCXJldHVybiBwcm9ncmFtTmFtZS5oYXNoQ29kZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL2FjdGlvbnMvRmlsdGVySW50ZXJuYWxUYXJnZXRzQWN0aW9uLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL0ZpbHRlckludGVybmFsVGFyZ2V0c0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2NmNmM4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL2FjdGlvbnMvRmlsdGVySW50ZXJuYWxUYXJnZXRzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS52aWV3cy5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnZpZXdzLkFudFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLQotLyoqIAotICogQW4gYWN0aW9uIHdoaWNoIHRvZ2dsZXMgZmlsdGVyaW5nIG9mIGludGVybmFsIHRhcmdldHMgZnJvbSB0aGUgQW50IHZpZXcuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJJbnRlcm5hbFRhcmdldHNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JcHJpdmF0ZSBBbnRWaWV3IGZWaWV3OwotCQotCXB1YmxpYyBGaWx0ZXJJbnRlcm5hbFRhcmdldHNBY3Rpb24oQW50VmlldyB2aWV3KSB7Ci0JCXN1cGVyKEFudFZpZXdBY3Rpb25NZXNzYWdlcy5GaWx0ZXJJbnRlcm5hbFRhcmdldHNBY3Rpb25fMCk7Ci0JCWZWaWV3ID0gdmlldzsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEFudFVJSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJQW50VUlDb25zdGFudHMuSU1HX0ZJTFRFUl9JTlRFUk5BTF9UQVJHRVRTKSk7Ci0JCXNldFRvb2xUaXBUZXh0KEFudFZpZXdBY3Rpb25NZXNzYWdlcy5GaWx0ZXJJbnRlcm5hbFRhcmdldHNBY3Rpb25fMCk7Ci0JCXNldENoZWNrZWQoZlZpZXcuaXNGaWx0ZXJJbnRlcm5hbFRhcmdldHMoKSk7Ci0JfQotCQotCS8qKgotCSAqIFRvZ2dsZXMgdGhlIGZpbHRlcmluZyBvZiBpbnRlcm5hbCB0YXJnZXRzIGZyb20gdGhlIEFudCB2aWV3Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJZlZpZXcuc2V0RmlsdGVySW50ZXJuYWxUYXJnZXRzKGlzQ2hlY2tlZCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL1JlZnJlc2hCdWlsZEZpbGVzQWN0aW9uLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL1JlZnJlc2hCdWlsZEZpbGVzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ODVlZTIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvYWN0aW9ucy9SZWZyZXNoQnVpbGRGaWxlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkudmlld3MuYWN0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50UHJvamVjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudFByb2plY3ROb2RlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudFRhcmdldE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnZpZXdzLkFudFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGU7Ci0KLS8qKgotICogQWN0aW9uIHdoaWNoIHJlZnJlc2hlcyB0aGUgc2VsZWN0ZWQgYnVpbGRmaWxlcyBpbiB0aGUgQW50IHZpZXcKLSAqLwotcHVibGljIGNsYXNzIFJlZnJlc2hCdWlsZEZpbGVzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSVVwZGF0ZSB7Ci0KLQlwcml2YXRlIEFudFZpZXcgZlZpZXc7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlJlZnJlc2hCdWlsZEZpbGVzQWN0aW9uPC9jb2RlPiB3aGljaCB3aWxsIHJlZnJlc2ggYnVpbGRmaWxlcyAKLQkgKiBpbiB0aGUgZ2l2ZW4gQW50IHZpZXcuCi0JICogQHBhcmFtIHZpZXcgdGhlIEFudCB2aWV3IHdob3NlIHNlbGVjdGlvbiB0aGlzIGFjdGlvbiB3aWxsIHVzZSB3aGVuCi0JICogZGV0ZXJtaW5pbmcgd2hpY2ggYnVpbGRmaWxlcyB0byByZWZyZXNoLgotCSAqLwotCXB1YmxpYyBSZWZyZXNoQnVpbGRGaWxlc0FjdGlvbihBbnRWaWV3IHZpZXcpIHsKLQkJc3VwZXIoQW50Vmlld0FjdGlvbk1lc3NhZ2VzLlJlZnJlc2hCdWlsZEZpbGVzQWN0aW9uX1JlZnJlc2hfQnVpbGRmaWxlc18xLCBBbnRVSUltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoSUFudFVJQ29uc3RhbnRzLklNR19SRUZSRVNIKSk7Ci0JCXNldFRvb2xUaXBUZXh0KEFudFZpZXdBY3Rpb25NZXNzYWdlcy5SZWZyZXNoQnVpbGRGaWxlc0FjdGlvbl9SZWZyZXNoX0J1aWxkZmlsZXNfMSk7Ci0JCWZWaWV3ID0gdmlldzsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLCBJQW50VUlIZWxwQ29udGV4dElkcy5SRUZSRVNIX0JVSUxERklMRV9BQ1RJT04pOwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2hlcyB0aGUgc2VsZWN0ZWQgYnVpbGRmaWxlcyAob3IgYWxsIGJ1aWxkZmlsZXMgaWYgbm9uZSBzZWxlY3RlZCkgaW4gdGhlIEFudCB2aWV3Ci0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlmaW5hbCBTZXQgcHJvamVjdHM9IGdldFNlbGVjdGVkUHJvamVjdHMoKTsKLQkJaWYgKHByb2plY3RzLmlzRW1wdHkoKSkgewotCQkJLy8gSWYgbm8gc2VsZWN0aW9uLCBhZGQgYWxsCi0JCQlBbnRQcm9qZWN0Tm9kZVtdIGFsbFByb2plY3RzPSBmVmlldy5nZXRQcm9qZWN0cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxQcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCXByb2plY3RzLmFkZChhbGxQcm9qZWN0c1tpXSk7Ci0JCQl9Ci0JCX0KLQkJZmluYWwgSXRlcmF0b3IgaXRlcj0gcHJvamVjdHMuaXRlcmF0b3IoKTsKLQkJaWYgKCFpdGVyLmhhc05leHQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQl0cnkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5idXN5Q3Vyc29yV2hpbGUobmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKEFudFZpZXdBY3Rpb25NZXNzYWdlcy5SZWZyZXNoQnVpbGRGaWxlc0FjdGlvbl9SZWZyZXNoaW5nX2J1aWxkZmlsZXNfMywgcHJvamVjdHMuc2l6ZSgpKTsKLQkJCQkJQW50UHJvamVjdE5vZGVQcm94eSBwcm9qZWN0OwotCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCXByb2plY3Q9IChBbnRQcm9qZWN0Tm9kZVByb3h5KSBpdGVyLm5leHQoKTsKLQkJCQkJCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlRm9ybWF0LmZvcm1hdChBbnRWaWV3QWN0aW9uTWVzc2FnZXMuUmVmcmVzaEJ1aWxkRmlsZXNBY3Rpb25fUmVmcmVzaGluZ19fMF9fNCwgbmV3IFN0cmluZ1tdIHtwcm9qZWN0LmdldEJ1aWxkRmlsZU5hbWUoKX0pKTsKLQkJCQkJCXByb2plY3QucGFyc2VCdWlsZEZpbGUodHJ1ZSk7Ci0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQl9Ci0JCWZWaWV3LmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBwcm9qZWN0IG5vZGVzIHRvIHJlZnJlc2gKLQkgKiAKLQkgKiBAcmV0dXJuIFNldCB0aGUgc2VsZWN0ZWQgPGNvZGU+UHJvamVjdE5vZGU8L2NvZGU+cyB0byByZWZyZXNoLgotCSAqLwotCXByaXZhdGUgU2V0IGdldFNlbGVjdGVkUHJvamVjdHMoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlZpZXcuZ2V0Vmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCUhhc2hTZXQgc2V0PSBuZXcgSGFzaFNldCgpOwotCQlJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCU9iamVjdCBkYXRhOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWRhdGE9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBBbnRQcm9qZWN0Tm9kZSkgewotCQkJCXNldC5hZGQoZGF0YSk7Ci0JCQl9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBBbnRUYXJnZXROb2RlKSB7Ci0JCQkJc2V0LmFkZCgoKEFudFRhcmdldE5vZGUpIGRhdGEpLmdldFByb2plY3ROb2RlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzZXQ7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZW5hYmxlbWVudCBvZiB0aGlzIGFjdGlvbiBiYXNlZCBvbiB0aGUgdXNlcidzIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc2V0RW5hYmxlZChmVmlldy5nZXRQcm9qZWN0cygpLmxlbmd0aCA+IDApOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvYWN0aW9ucy9SZW1vdmVBbGxBY3Rpb24uamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL2FjdGlvbnMvUmVtb3ZlQWxsQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkOGFjNjAuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvYWN0aW9ucy9SZW1vdmVBbGxBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnZpZXdzLmFjdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkudmlld3MuQW50VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZTsKLQotcHVibGljIGNsYXNzIFJlbW92ZUFsbEFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElVcGRhdGUgewotCXByaXZhdGUgQW50VmlldyB2aWV3OwotCQotCXB1YmxpYyBSZW1vdmVBbGxBY3Rpb24oQW50VmlldyB2aWV3KSB7Ci0JCXN1cGVyKEFudFZpZXdBY3Rpb25NZXNzYWdlcy5SZW1vdmVBbGxBY3Rpb25fUmVtb3ZlX0FsbCwgQW50VUlJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElBbnRVSUNvbnN0YW50cy5JTUdfUkVNT1ZFX0FMTCkpOwotCQlzZXREZXNjcmlwdGlvbihBbnRWaWV3QWN0aW9uTWVzc2FnZXMuUmVtb3ZlQWxsQWN0aW9uX1JlbW92ZV9BbGwpOwotCQlzZXRUb29sVGlwVGV4dChBbnRWaWV3QWN0aW9uTWVzc2FnZXMuUmVtb3ZlQWxsQWN0aW9uX1JlbW92ZV9BbGwpOwotCQl0aGlzLnZpZXc9IHZpZXc7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywgSUFudFVJSGVscENvbnRleHRJZHMuUkVNT1ZFX0FMTF9BQ1RJT04pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWJvb2xlYW4gcHJvY2VlZCA9IE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKHZpZXcuZ2V0Vmlld1NpdGUoKS5nZXRTaGVsbCgpLCBBbnRWaWV3QWN0aW9uTWVzc2FnZXMuUmVtb3ZlQWxsQWN0aW9uXzAsIEFudFZpZXdBY3Rpb25NZXNzYWdlcy5SZW1vdmVBbGxBY3Rpb25fMSk7Ci0JCWlmIChwcm9jZWVkKSB7Ci0JCQl2aWV3LnJlbW92ZUFsbFByb2plY3RzKCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGUjdXBkYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXNldEVuYWJsZWQodmlldy5nZXRWaWV3ZXIoKS5nZXRUcmVlKCkuZ2V0SXRlbUNvdW50KCkgIT0gMCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvYWN0aW9ucy9SZW1vdmVQcm9qZWN0QWN0aW9uLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL1JlbW92ZVByb2plY3RBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3NjNlMS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL1JlbW92ZVByb2plY3RBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnZpZXdzLmFjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRQcm9qZWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkudmlld3MuQW50VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGU7Ci0KLS8qKgotICogQWN0aW9uIHRoYXQgcmVtb3ZlcyBzZWxlY3RlZCBidWlsZCBmaWxlcyBmcm9tIGFuIDxjb2RlPkFudFZpZXc8L2NvZGU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVQcm9qZWN0QWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSVVwZGF0ZSB7Ci0JCi0JcHJpdmF0ZSBBbnRWaWV3IHZpZXc7Ci0JCi0JcHVibGljIFJlbW92ZVByb2plY3RBY3Rpb24oQW50VmlldyB2aWV3KSB7Ci0JCXN1cGVyKEFudFZpZXdBY3Rpb25NZXNzYWdlcy5SZW1vdmVQcm9qZWN0QWN0aW9uX1JlbW92ZSwgQW50VUlJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElBbnRVSUNvbnN0YW50cy5JTUdfUkVNT1ZFKSk7Ci0JCXRoaXMudmlldz0gdmlldzsKLQkJc2V0VG9vbFRpcFRleHQoQW50Vmlld0FjdGlvbk1lc3NhZ2VzLlJlbW92ZVByb2plY3RBY3Rpb25fUmVtb3ZlXzIpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsIElBbnRVSUhlbHBDb250ZXh0SWRzLlJFTU9WRV9QUk9KRUNUX0FDVElPTik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXcuZ2V0Vmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCUl0ZXJhdG9yIGl0ZXI9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQlPYmplY3QgZWxlbWVudDsKLQkJTGlzdCBwcm9qZWN0Tm9kZXM9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQllbGVtZW50PSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQW50UHJvamVjdE5vZGUpIHsKLQkJCQlwcm9qZWN0Tm9kZXMuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXZpZXcucmVtb3ZlUHJvamVjdHMocHJvamVjdE5vZGVzKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGUjdXBkYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbj0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3LmdldFZpZXdlcigpLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJT2JqZWN0IGVsZW1lbnQ7Ci0JCUl0ZXJhdG9yIGl0ZXI9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWVsZW1lbnQ9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEFudFByb2plY3ROb2RlKSkgewotCQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzZXRFbmFibGVkKHRydWUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL2FjdGlvbnMvUnVuVGFyZ2V0QWN0aW9uLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS92aWV3cy9hY3Rpb25zL1J1blRhcmdldEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODk5M2U2Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL2FjdGlvbnMvUnVuVGFyZ2V0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS52aWV3cy5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5BbnRVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuSUFudFVJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubGF1bmNoQ29uZmlndXJhdGlvbnMuQW50TGF1bmNoU2hvcnRjdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudEVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRQcm9qZWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50VGFyZ2V0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50VGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnZpZXdzLkFudFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZTsKLQotLyoqCi0gKiBBY3Rpb24gd2hpY2ggcnVucyB0aGUgc2VsZWN0ZWQgdGFyZ2V0IG9yIHRoZSBkZWZhdWx0IHRhcmdldCBvZiB0aGUgc2VsZWN0ZWQKLSAqIHByb2plY3QgaW4gdGhlIEFudFZpZXcuCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW5UYXJnZXRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJVXBkYXRlIHsKLQkKLQlwcml2YXRlIEFudFZpZXcgZlZpZXc7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5SdW5UYXJnZXRBY3Rpb248L2NvZGU+IHdoaWNoIHdpbGwgZXhlY3V0ZQotCSAqIHRhcmdldHMgaW4gdGhlIGdpdmVuIHZpZXcuCi0JICogQHBhcmFtIHZpZXcgdGhlIEFudCB2aWV3IHdob3NlIHNlbGVjdGlvbiB0aGlzIGFjdGlvbiB3aWxsIHVzZSB3aGVuCi0JICogZGV0ZXJtaW5pbmcgd2hpY2ggdGFyZ2V0IHRvIHJ1bi4KLQkgKi8KLQlwdWJsaWMgUnVuVGFyZ2V0QWN0aW9uKEFudFZpZXcgdmlldykgewotCQkKLQkJc2V0VGV4dChBbnRWaWV3QWN0aW9uTWVzc2FnZXMuUnVuVGFyZ2V0QWN0aW9uX1J1bl8xKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEFudFVJSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJQW50VUlDb25zdGFudHMuSU1HX1JVTikpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsIElBbnRVSUhlbHBDb250ZXh0SWRzLlJVTl9UQVJHRVRfQUNUSU9OKTsKLQotCQlzZXRUb29sVGlwVGV4dChBbnRWaWV3QWN0aW9uTWVzc2FnZXMuUnVuVGFyZ2V0QWN0aW9uXzMpOwotCQlmVmlldz0gdmlldzsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYXBwcm9wcmlhdGUgdGFyZ2V0IGJhc2VkIG9uIHRoZSBzZWxlY3Rpb24gaW4gdGhlIEFudCB2aWV3LgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJcnVuKGdldFNlbGVjdGVkRWxlbWVudCgpKTsKLQl9Ci0JCi0JLyoqCi0gICAgICogQHBhcmFtIHNlbGVjdGVkRWxlbWVudCBUaGUgZWxlbWVudCB0byB1c2UgYXMgdGhlIGNvbnRleHQgZm9yIGxhdW5jaGluZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bihmaW5hbCBBbnRFbGVtZW50Tm9kZSBzZWxlY3RlZEVsZW1lbnQpIHsKLSAgICAgICAgVUlKb2Igam9iPSBuZXcgVUlKb2IoQW50Vmlld0FjdGlvbk1lc3NhZ2VzLlJ1blRhcmdldEFjdGlvbl8yKSB7Ci0JCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCWxhdW5jaChzZWxlY3RlZEVsZW1lbnQpOwotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9OwotCQlqb2Iuc2NoZWR1bGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLQkgKiBMYXVuY2hlcyB0aGUgZ2l2ZW4gQW50IGVsZW1lbnQgbm9kZQotCSAqIEBwYXJhbSBub2RlIHRoZSBub2RlIHRvIHVzZSB0byBsYXVuY2gKLQkgKiBAc2VlIEFudExhdW5jaFNob3J0Y3V0I2xhdW5jaChBbnRFbGVtZW50Tm9kZSwgU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGxhdW5jaChBbnRFbGVtZW50Tm9kZSBub2RlKSB7Ci0JCUFudExhdW5jaFNob3J0Y3V0IHNob3J0Y3V0PSBuZXcgQW50TGF1bmNoU2hvcnRjdXQoKTsKLQkJc2hvcnRjdXQuc2V0U2hvd0RpYWxvZyhmYWxzZSk7Ci0JCXNob3J0Y3V0LmxhdW5jaChub2RlLCBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZW5hYmxlbWVudCBvZiB0aGlzIGFjdGlvbiBiYXNlZCBvbiB0aGUgdXNlcidzIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJQW50RWxlbWVudE5vZGUgc2VsZWN0aW9uPSBnZXRTZWxlY3RlZEVsZW1lbnQoKTsKLQkJYm9vbGVhbiBlbmFibGVkPSBmYWxzZTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIEFudFRhcmdldE5vZGUpIHsKLQkJCWlmICghKChBbnRUYXJnZXROb2RlKSBzZWxlY3Rpb24pLmlzRXJyb3JOb2RlKCkpIHsKLQkJCQlzZXRUb29sVGlwVGV4dChBbnRWaWV3QWN0aW9uTWVzc2FnZXMuUnVuVGFyZ2V0QWN0aW9uXzQpOwotCQkJCWVuYWJsZWQ9IHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgQW50UHJvamVjdE5vZGUpIHsKLQkJCWlmICghKChBbnRQcm9qZWN0Tm9kZSkgc2VsZWN0aW9uKS5pc0Vycm9yTm9kZSgpKSB7Ci0JCQkJZW5hYmxlZD0gdHJ1ZTsKLQkJCQlzZXRUb29sVGlwVGV4dChBbnRWaWV3QWN0aW9uTWVzc2FnZXMuUnVuVGFyZ2V0QWN0aW9uXzMpOwotCQkJfQotCQl9ICBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBBbnRUYXNrTm9kZSkgewotCQkJaWYgKCEoKEFudFRhc2tOb2RlKSBzZWxlY3Rpb24pLmlzRXJyb3JOb2RlKCkpIHsKLQkJCQllbmFibGVkPSB0cnVlOwotCQkJCXNldFRvb2xUaXBUZXh0KEFudFZpZXdBY3Rpb25NZXNzYWdlcy5SdW5UYXJnZXRBY3Rpb25fMCk7Ci0JCQl9Ci0JCX0KLQkJc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgbm9kZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBtb3JlIHRoYW4gb25lIGVsZW1lbnQgaXMgc2VsZWN0ZWQuCi0JICogCi0JICogQHJldHVybiBBbnRFbGVtZW50Tm9kZSB0aGUgc2VsZWN0ZWQgbm9kZQotCSAqLwotCXByaXZhdGUgQW50RWxlbWVudE5vZGUgZ2V0U2VsZWN0ZWRFbGVtZW50KCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb249IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlZpZXcuZ2V0Vmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJdGVyYXRvciBpdGVyPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJT2JqZWN0IGRhdGE9IGl0ZXIubmV4dCgpOwotCQlpZiAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoQW50RWxlbWVudE5vZGUpIGRhdGE7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL3ZpZXdzL2FjdGlvbnMvU2VhcmNoRm9yQnVpbGRGaWxlc0FjdGlvbi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvYWN0aW9ucy9TZWFyY2hGb3JCdWlsZEZpbGVzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMzc1NWYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvdmlld3MvYWN0aW9ucy9TZWFyY2hGb3JCdWlsZEZpbGVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnZpZXdzLmFjdGlvbnM7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uaWJtLmljdS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLkFudFVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5JQW50VUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLklBbnRVSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRQcm9qZWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50UHJvamVjdE5vZGVQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkudmlld3MuQW50VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogVGhpcyBhY3Rpb24gb3BlbnMgYSBkaWFsb2cgdG8gc2VhcmNoIGZvciBidWlsZCBmaWxlcyBhbmQgYWRkcyB0aGUgcmVzdWx0aW5nCi0gKiBwcm9qZWN0cyB0byB0aGUgYW50IHZpZXcuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hGb3JCdWlsZEZpbGVzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcml2YXRlIEFudFZpZXcgdmlldzsKLQkKLQlwdWJsaWMgU2VhcmNoRm9yQnVpbGRGaWxlc0FjdGlvbihBbnRWaWV3IHZpZXcpIHsKLQkJc3VwZXIoQW50Vmlld0FjdGlvbk1lc3NhZ2VzLlNlYXJjaEZvckJ1aWxkRmlsZXNBY3Rpb25fU2VhcmNoXzEsIEFudFVJSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJQW50VUlDb25zdGFudHMuSU1HX1NFQVJDSCkpOwotCQlzZXRUb29sVGlwVGV4dChBbnRWaWV3QWN0aW9uTWVzc2FnZXMuU2VhcmNoRm9yQnVpbGRGaWxlc0FjdGlvbl9BZGRfYnVpbGRfZmlsZXNfd2l0aF9zZWFyY2hfMik7Ci0JCXRoaXMudmlldz0gdmlldzsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLCBJQW50VUlIZWxwQ29udGV4dElkcy5TRUFSQ0hfRk9SX0JVSUxERklMRVNfQUNUSU9OKTsKLQl9Ci0JCi0JLyoqCi0JICogT3BlbnMgdGhlIDxjb2RlPlNlYXJjaEZvckJ1aWxkRmlsZXNEaWFsb2c8L2NvZGU+IGFuZCBhZGRzIHRoZSByZXN1bHRzIHRvCi0JICogdGhlIGFudCB2aWV3LgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJU2VhcmNoRm9yQnVpbGRGaWxlc0RpYWxvZyBkaWFsb2c9IG5ldyBTZWFyY2hGb3JCdWlsZEZpbGVzRGlhbG9nKCk7Ci0JCWlmIChkaWFsb2cub3BlbigpICE9IFdpbmRvdy5DQU5DRUwpIHsKLQkJCWZpbmFsIElGaWxlW10gZmlsZXM9IGRpYWxvZy5nZXRSZXN1bHRzKCk7Ci0JCQlmaW5hbCBib29sZWFuIGluY2x1ZGVFcnJvck5vZGVzPSBkaWFsb2cuZ2V0SW5jbHVkZUVycm9yUmVzdWx0cygpOwotCQkJZmluYWwgQW50UHJvamVjdE5vZGVbXSBleGlzdGluZ1Byb2plY3RzPSB2aWV3LmdldFByb2plY3RzKCk7Ci0JCQl0cnkgewotCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkuYnVzeUN1cnNvcldoaWxlKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJCW1vbml0b3IuYmVnaW5UYXNrKEFudFZpZXdBY3Rpb25NZXNzYWdlcy5TZWFyY2hGb3JCdWlsZEZpbGVzQWN0aW9uX1Byb2Nlc3Npbmdfc2VhcmNoX3Jlc3VsdHNfMywgZmlsZXMubGVuZ3RoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoICYmICFtb25pdG9yLmlzQ2FuY2VsZWQoKTsgaSsrKSB7Ci0JCQkJCQkJU3RyaW5nIGJ1aWxkRmlsZU5hbWU9IGZpbGVzW2ldLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQkJCQltb25pdG9yLnN1YlRhc2soTWVzc2FnZUZvcm1hdC5mb3JtYXQoQW50Vmlld0FjdGlvbk1lc3NhZ2VzLlNlYXJjaEZvckJ1aWxkRmlsZXNBY3Rpb25fQWRkaW5nX18wX180LCBuZXcgU3RyaW5nW10ge2J1aWxkRmlsZU5hbWV9KSk7Ci0JCQkJCQkJaWYgKGFscmVhZHlBZGRlZChidWlsZEZpbGVOYW1lKSkgewotCQkJCQkJCQkvLyBEb24ndCBwYXJzZSBwcm9qZWN0cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGFkZGVkLgotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJZmluYWwgQW50UHJvamVjdE5vZGVQcm94eSBwcm9qZWN0PSBuZXcgQW50UHJvamVjdE5vZGVQcm94eShidWlsZEZpbGVOYW1lKTsKLQkJCQkJCQkvLyBGb3JjZSB0aGUgcHJvamVjdCB0byBiZSBwYXJzZWQgc28gdGhlIGVycm9yIHN0YXRlIGlzIHNldC4KLQkJCQkJCQlwcm9qZWN0LnBhcnNlQnVpbGRGaWxlKCk7Ci0JCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCQkJaWYgKGluY2x1ZGVFcnJvck5vZGVzIHx8ICEocHJvamVjdC5pc0Vycm9yTm9kZSgpKSkgewotCQkJCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXZpZXcuYWRkUHJvamVjdChwcm9qZWN0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8qKgotCQkJCQkgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBidWlsZCBmaWxlIGFscmVhZHkKLQkJCQkJICogZXhpc3RzIGluIHRoZSBhbnQgdmlldy4KLQkJCQkJICovCi0JCQkJCXByaXZhdGUgYm9vbGVhbiBhbHJlYWR5QWRkZWQoU3RyaW5nIGJ1aWxkRmlsZU5hbWUpIHsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXhpc3RpbmdQcm9qZWN0cy5sZW5ndGg7IGorKykgewotCQkJCQkJCUFudFByb2plY3ROb2RlIGV4aXN0aW5nUHJvamVjdCA9IGV4aXN0aW5nUHJvamVjdHNbal07Ci0JCQkJCQkJaWYgKGV4aXN0aW5nUHJvamVjdC5nZXRCdWlsZEZpbGVOYW1lKCkuZXF1YWxzKGJ1aWxkRmlsZU5hbWUpKSB7Ci0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC91aS9sYXVuY2hpbmcvSUFudExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3VpL2xhdW5jaGluZy9JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDkzYzAwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvQW50IFRvb2xzIFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3VpL2xhdW5jaGluZy9JQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC51aS5sYXVuY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQubGF1bmNoaW5nLklBbnRMYXVuY2hDb25zdGFudHM7Ci0KLS8qKgotICogQ29uc3RhbnQgZGVmaW5pdGlvbnMgZm9yIEFudCBsYXVuY2ggY29uZmlndXJhdGlvbnMuCi0gKiAKLSAqIEBzaW5jZSAzLjQKLSAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgSUFudExhdW5jaENvbnN0YW50c30KLSAqLwotcHVibGljIGludGVyZmFjZSBJQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cyB7Ci0KLQkvKioKLQkgKiBBbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24gdHlwZSBpZGVudGlmaWVyLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgSUFudExhdW5jaENvbnN0YW50cyNJRF9BTlRfTEFVTkNIX0NPTkZJR1VSQVRJT05fVFlQRX0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BTlRfTEFVTkNIX0NPTkZJR1VSQVRJT05fVFlQRSA9IElBbnRMYXVuY2hDb25zdGFudHMuSURfQU5UX0xBVU5DSF9DT05GSUdVUkFUSU9OX1RZUEU7Ci0KLQkvKioKLQkgKiBBbnQgYnVpbGRlciBsYXVuY2ggY29uZmlndXJhdGlvbiB0eXBlIGlkZW50aWZpZXIuIEFudCBwcm9qZWN0IGJ1aWxkZXJzCi0JICogYXJlIG9mIHRoaXMgdHlwZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIElBbnRMYXVuY2hDb25zdGFudHMjSURfQU5UX0JVSUxERVJfTEFVTkNIX0NPTkZJR1VSQVRJT05fVFlQRX0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BTlRfQlVJTERFUl9MQVVOQ0hfQ09ORklHVVJBVElPTl9UWVBFID0gSUFudExhdW5jaENvbnN0YW50cy5JRF9BTlRfQlVJTERFUl9MQVVOQ0hfQ09ORklHVVJBVElPTl9UWVBFOwotCQotCS8qKgotCSAqIFN0cmluZyBhdHRyaWJ1dGUgaW5kaWNhdGluZyB0aGUgQW50IHRhcmdldHMgdG8gZXhlY3V0ZS4gRGVmYXVsdCB2YWx1ZSBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBkZWZhdWx0IHRhcmdldCBpcyB0byBiZQotCSAqIGV4ZWN1dGVkLiBGb3JtYXQgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdGluZyBvZiB0YXJnZXRzLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgSUFudExhdW5jaENvbnN0YW50cyNBVFRSX0FOVF9UQVJHRVRTfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQU5UX1RBUkdFVFMgPSBJQW50TGF1bmNoQ29uc3RhbnRzLkFUVFJfQU5UX1RBUkdFVFM7Ci0JCi0JLyoqCi0JICogU3RyaW5nIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBBbnQgdGFyZ2V0cyB0byBleGVjdXRlIGFmdGVyIGEgY2xlYW4gKGZ1bGwgYnVpbGQpIGZvciBhbiBBbnQgYnVpbGRlci4gRGVmYXVsdCB2YWx1ZSBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBkZWZhdWx0IHRhcmdldCBpcyB0byBiZQotCSAqIGV4ZWN1dGVkLiBGb3JtYXQgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdGluZyBvZiB0YXJnZXRzLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgSUFudExhdW5jaENvbnN0YW50cyNBVFRSX0FOVF9BRlRFUl9DTEVBTl9UQVJHRVRTfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQU5UX0FGVEVSX0NMRUFOX1RBUkdFVFMgPSBJQW50TGF1bmNoQ29uc3RhbnRzLkFUVFJfQU5UX0FGVEVSX0NMRUFOX1RBUkdFVFM7Ci0JCi0JLyoqCi0JICogU3RyaW5nIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBBbnQgdGFyZ2V0cyB0byBleGVjdXRlIGR1cmluZyBhIG1hbnVhbCBidWlsZCBmb3IgYW4gQW50IGJ1aWxkZXIuIERlZmF1bHQgdmFsdWUgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCB0YXJnZXQgaXMgdG8gYmUKLQkgKiBleGVjdXRlZC4gRm9ybWF0IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Rpbmcgb2YgdGFyZ2V0cy4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIElBbnRMYXVuY2hDb25zdGFudHMjQVRUUl9BTlRfTUFOVUFMX1RBUkdFVFN9Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BTlRfTUFOVUFMX1RBUkdFVFMgPSBJQW50TGF1bmNoQ29uc3RhbnRzLkFUVFJfQU5UX01BTlVBTF9UQVJHRVRTOwotCQotCS8qKgotCSAqIFN0cmluZyBhdHRyaWJ1dGUgaW5kaWNhdGluZyB0aGUgQW50IHRhcmdldHMgdG8gZXhlY3V0ZSBkdXJpbmcgYW4gYXV0byBidWlsZCBmb3IgYW4gQW50IGJ1aWxkZXIuIERlZmF1bHQgdmFsdWUgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCB0YXJnZXQgaXMgdG8gYmUKLQkgKiBleGVjdXRlZC4gRm9ybWF0IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Rpbmcgb2YgdGFyZ2V0cy4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIElBbnRMYXVuY2hDb25zdGFudHMjQVRUUl9BTlRfQVVUT19UQVJHRVRTfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQU5UX0FVVE9fVEFSR0VUUyA9IElBbnRMYXVuY2hDb25zdGFudHMuQVRUUl9BTlRfQVVUT19UQVJHRVRTOwotCQotCS8qKgotCSAqIFN0cmluZyBhdHRyaWJ1dGUgaW5kaWNhdGluZyB0aGUgQW50IHRhcmdldHMgdG8gZXhlY3V0ZSBkdXJpbmcgYSBjbGVhbiBmb3IgYW4gQW50IGJ1aWxkZXIuIERlZmF1bHQgdmFsdWUgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCB0YXJnZXQgaXMgdG8gYmUKLQkgKiBleGVjdXRlZC4gRm9ybWF0IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Rpbmcgb2YgdGFyZ2V0cy4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIElBbnRMYXVuY2hDb25zdGFudHMjQVRUUl9BTlRfQ0xFQU5fVEFSR0VUU30KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FOVF9DTEVBTl9UQVJHRVRTID0gSUFudExhdW5jaENvbnN0YW50cy5BVFRSX0FOVF9DTEVBTl9UQVJHRVRTOwotCQotCS8qKgotCSAqIEJvb2xlYW4gYXR0cmlidXRlIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGFyZ2V0IHNwZWNpZmljYXRpb24gZm9yIGFuIEFudCBidWlsZGVyIAotCSAqIGhhcyBiZWVuIHVwZGF0ZWQgZm9yIDMuMSAKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIElBbnRMYXVuY2hDb25zdGFudHMjQVRUUl9UQVJHRVRTX1VQREFURUR9Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9UQVJHRVRTX1VQREFURUQgPSBJQW50TGF1bmNoQ29uc3RhbnRzLkFUVFJfVEFSR0VUU19VUERBVEVEOwotCQotCS8qKgotCSAqIE1hcCBhdHRyaWJ1dGUgaW5kaWNhdGluZyB0aGUgQW50IHByb3BlcnRpZXMgdG8gYmUgZGVmaW5lZCBkdXJpbmcgdGhlCi0JICogYnVpbGQuIERlZmF1bHQgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4gd2hpY2ggaW5kaWNhdGVzIG5vIGFkZGl0aW9uYWwKLQkgKiBwcm9wZXJ0aWVzIHdpbGwgYmUgZGVmaW5lZC4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIElBbnRMYXVuY2hDb25zdGFudHMjQVRUUl9BTlRfUFJPUEVSVElFU30KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FOVF9QUk9QRVJUSUVTID0gSUFudExhdW5jaENvbnN0YW50cy5BVFRSX0FOVF9QUk9QRVJUSUVTOwkJCQkJCi0JCi0JLyoqCi0JICogU3RyaW5nIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBBbnQgdGFyZ2V0cyB0byBleGVjdXRlLiBEZWZhdWx0IHZhbHVlIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4gd2hpY2ggaW5kaWNhdGVzIHRoYXQgbm8gYWRkaXRpb25hbCBwcm9wZXJ0eSBmaWxlcwotCSAqIHdpbGwgYmUgZGVmaW5lZC4gRm9ybWF0IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Rpbmcgb2YgcHJvcGVydHkgZmlsZXMuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBJQW50TGF1bmNoQ29uc3RhbnRzI0FUVFJfQU5UX1BST1BFUlRZX0ZJTEVTfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQU5UX1BST1BFUlRZX0ZJTEVTID0gSUFudExhdW5jaENvbnN0YW50cy5BVFRSX0FOVF9QUk9QRVJUWV9GSUxFUzsKLQkKLQkvKioKLQkgKiBCb29sZWFuIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IGludGVybmFsIHRhcmdldHMgKHRhcmdldHMgd2l0aCBubwotCSAqIGRlc2NyaXB0aW9uKSBzaG91bGQgYmUgaGlkZGVuIGZyb20gdGhlIHVzZXIgaW4gdGhlIGxhdW5jaCBjb25maWd1cmF0aW9uIGRpYWxvZy4KLQkgKiBEZWZhdWx0IHZhbHVlIGlzIDxjb2RlPmZhbHNlPC9jb2RlPiB3aGljaCBpbmRpY2F0ZXMgdGhhdCBhbGwgdGFyZ2V0cyB3aWxsIGJlCi0JICogZGlzcGxheWVkLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgSUFudExhdW5jaENvbnN0YW50cyNBVFRSX0hJREVfSU5URVJOQUxfVEFSR0VUU30KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0hJREVfSU5URVJOQUxfVEFSR0VUUyA9IElBbnRMYXVuY2hDb25zdGFudHMuQVRUUl9ISURFX0lOVEVSTkFMX1RBUkdFVFM7Ci0JCi0JLyoqCi0JICogSW50ZWdlciBhdHRyaWJ1dGUgaW5kaWNhdGluZyB3aGljaCBjb2x1bW4gdGFyZ2V0cyBzaG91bGQgYmUgc29ydGVkIG9uLiBBCi0JICogdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGFyZ2V0IG5hbWUsIDEgaW5kaWNhdGVzIHRhcmdldCBkZXNjcmlwdGlvbiwgYW5kIC0xCi0JICogaW5kaWNhdGVzIG5vIHNvcnQuIERlZmF1bHQgdmFsdWUgaXMgLTEuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBJQW50TGF1bmNoQ29uc3RhbnRzI0FUVFJfU09SVF9UQVJHRVRTfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU09SVF9UQVJHRVRTID0gSUFudExhdW5jaENvbnN0YW50cy5BVFRSX1NPUlRfVEFSR0VUUzsKLQotCS8qKgotCSAqIEJvb2xlYW4gYXR0cmlidXRlIGluZGljYXRpbmcgaWYgdGhlIGRlZmF1bHQgVk0gaW5zdGFsbCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHNlcGFyYXRlIEpSRSBidWlsZAotCSAqIERlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQotCSAqIAotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgSUFudExhdW5jaENvbnN0YW50cyNBVFRSX0RFRkFVTFRfVk1fSU5TVEFMTH0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0RFRkFVTFRfVk1fSU5TVEFMTCA9IElBbnRMYXVuY2hDb25zdGFudHMuQVRUUl9ERUZBVUxUX1ZNX0lOU1RBTEw7Ci0KLQkvKioKLQkgKiBJZGVudGlmaWVyIGZvciBBbnQgcHJvY2Vzc2VzICh2YWx1ZSA8Y29kZT5vcmcuZWNsaXBzZS5hbnQudWkuYW50UHJvY2VzczwvY29kZT4pLiBUaGlzIGlkZW50aWZpZXIgaXMKLQkgKiBzZXQgYXMgdGhlIHZhbHVlIGZvciB0aGUgPGNvZGU+SVByb2Nlc3MuQVRUUl9QUk9DRVNTX1RZUEU8L2NvZGU+Ci0JICogYXR0cmlidXRlIGluIHByb2Nlc3NlcyBjcmVhdGVkIGJ5IHRoZSBBbnQgbGF1bmNoIGRlbGVnYXRlLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgSUFudExhdW5jaENvbnN0YW50cyNJRF9BTlRfUFJPQ0VTU19UWVBFfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FOVF9QUk9DRVNTX1RZUEUgPSBJQW50TGF1bmNoQ29uc3RhbnRzLklEX0FOVF9QUk9DRVNTX1RZUEU7Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC91aS9sYXVuY2hpbmcvcGFja2FnZS5odG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9BbnQgVG9vbHMgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdWkvbGF1bmNoaW5nL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmZDQ4NC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL0FudCBUb29scyBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC91aS9sYXVuY2hpbmcvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci1Qcm92aWRlcyBzdXBwb3J0IGZvciBBbnQgbGF1bmNoaW5nLgotPGgyPgotUGFja2FnZSBTcGVjaWZpY2F0aW9uPC9oMj4KLVRoaXMgcGFja2FnZSBkZWZpbmVzIGNvbnN0YW50cyBmb3IgQW50IGxhdW5jaCBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZXMuIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9SZW1vdGUgQW50IFN1cHBvcnQvTUVUQS1JTkYvZWNsaXBzZS5pbmYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL1JlbW90ZSBBbnQgU3VwcG9ydC9NRVRBLUlORi9lY2xpcHNlLmluZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRkZjNhYi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL1JlbW90ZSBBbnQgU3VwcG9ydC9NRVRBLUlORi9lY2xpcHNlLmluZgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWphcnByb2Nlc3Nvci5leGNsdWRlLnNpZ249dHJ1ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvUmVtb3RlIEFudCBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9hbnRzdXBwb3J0L2lucHV0aGFuZGxlci9Qcm94eUlucHV0SGFuZGxlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9SZW1vdGUgQW50IFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2FudHN1cHBvcnQvaW5wdXRoYW5kbGVyL1Byb3h5SW5wdXRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZTA2YzMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9SZW1vdGUgQW50IFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2FudHN1cHBvcnQvaW5wdXRoYW5kbGVyL1Byb3h5SW5wdXRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmFudHN1cHBvcnQuaW5wdXRoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuSW5wdXRIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LklucHV0UmVxdWVzdDsKLQotcHVibGljIGNsYXNzIFByb3h5SW5wdXRIYW5kbGVyIGltcGxlbWVudHMgSW5wdXRIYW5kbGVyIHsKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5JbnB1dEhhbmRsZXIjaGFuZGxlSW5wdXQob3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuSW5wdXRSZXF1ZXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUlucHV0KElucHV0UmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCQluZXcgU1dUSW5wdXRIYW5kbGVyKCkuaGFuZGxlSW5wdXQocmVxdWVzdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9SZW1vdGUgQW50IFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2FudHN1cHBvcnQvaW5wdXRoYW5kbGVyL1JlbW90ZUFudE1lc3NhZ2VzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL1JlbW90ZSBBbnQgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvYW50c3VwcG9ydC9pbnB1dGhhbmRsZXIvUmVtb3RlQW50TWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzMjQ1OC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL1JlbW90ZSBBbnQgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvYW50c3VwcG9ydC9pbnB1dGhhbmRsZXIvUmVtb3RlQW50TWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuYW50c3VwcG9ydC5pbnB1dGhhbmRsZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgUmVtb3RlQW50TWVzc2FnZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5hbnRzdXBwb3J0LmlucHV0aGFuZGxlci5SZW1vdGVBbnRNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIFJlbW90ZUFudE1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvUmVtb3RlIEFudCBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9hbnRzdXBwb3J0L2lucHV0aGFuZGxlci9SZW1vdGVBbnRNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9SZW1vdGUgQW50IFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2FudHN1cHBvcnQvaW5wdXRoYW5kbGVyL1JlbW90ZUFudE1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMjJlNjkuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9SZW1vdGUgQW50IFN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L2ludGVybmFsL3VpL2FudHN1cHBvcnQvaW5wdXRoYW5kbGVyL1JlbW90ZUFudE1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVNXVElucHV0SGFuZGxlci4wPVVuYWJsZSB0byByZXNwb25kIHRvIGlucHV0IHJlcXVlc3QgYXMgYSByZXN1bHQgb2YgdGhlIHVzZXIgc3BlY2lmaWVkIC1ub2lucHV0IGNvbW1hbmQKLVNXVElucHV0SGFuZGxlci4xPUFudCBJbnB1dCBSZXF1ZXN0Ci1TV1RJbnB1dEhhbmRsZXIuMj1VbmFibGUgdG8gcmVzcG9uZCB0byA8aW5wdXQ+IHJlcXVlc3QKLVNXVElucHV0SGFuZGxlci4zPUlucHV0IGRvZXMgbm90IG1hdGNoIHZhbGlkYXJncyBhdHRyaWJ1dGUKLVNXVElucHV0SGFuZGxlci40PU9LCi1TV1RJbnB1dEhhbmRsZXIuNT1DYW5jZWwKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvUmVtb3RlIEFudCBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9hbnRzdXBwb3J0L2lucHV0aGFuZGxlci9TV1RJbnB1dEhhbmRsZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvUmVtb3RlIEFudCBTdXBwb3J0L29yZy9lY2xpcHNlL2FudC9pbnRlcm5hbC91aS9hbnRzdXBwb3J0L2lucHV0aGFuZGxlci9TV1RJbnB1dEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3N2YxMy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL1JlbW90ZSBBbnQgU3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvaW50ZXJuYWwvdWkvYW50c3VwcG9ydC9pbnB1dGhhbmRsZXIvU1dUSW5wdXRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEJyb2NrIEphbmljemFrIChicm9ja2pAdHBnLmNvbS5hdSkgLSBCdWcgMTQ1NzM2Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuYW50c3VwcG9ydC5pbnB1dGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5EZWZhdWx0SW5wdXRIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LklucHV0UmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5NdWx0aXBsZUNob2ljZUlucHV0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1wdWJsaWMgY2xhc3MgU1dUSW5wdXRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdElucHV0SGFuZGxlciB7Ci0JCi0JcHJpdmF0ZSBUZXh0IGZUZXh0OwotCXByaXZhdGUgQ29tYm8gZkNvbWJvOwotCXByaXZhdGUgVGV4dCBmRXJyb3JNZXNzYWdlVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiBmT2tCdXR0b247Ci0JcHJpdmF0ZSBTaGVsbCBmRGlhbG9nOwotCXByaXZhdGUgRm9udE1ldHJpY3MgZkZvbnRNZXRyaWNzOwotCXByb3RlY3RlZCBJbnB1dFJlcXVlc3QgZlJlcXVlc3Q7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGZGaXJzdFZhbGlkYXRpb249IHRydWU7Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuSW5wdXRIYW5kbGVyI2hhbmRsZUlucHV0KG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LklucHV0UmVxdWVzdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVJbnB1dChJbnB1dFJlcXVlc3QgcmVxdWVzdCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQkJaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiZWNsaXBzZS5hbnQubm9JbnB1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKFJlbW90ZUFudE1lc3NhZ2VzLmdldFN0cmluZygiU1dUSW5wdXRIYW5kbGVyLjAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlmRmlyc3RWYWxpZGF0aW9uPSB0cnVlOwotCQlmUmVxdWVzdD0gcmVxdWVzdDsKLQkJQnVpbGRFeGNlcHRpb25bXSBwcm9ibGVtPSBuZXcgQnVpbGRFeGNlcHRpb25bMV07Ci0JCVJ1bm5hYmxlIHJ1bm5hYmxlPSBnZXRIYW5kbGVJbnB1dFJ1bm5hYmxlKHByb2JsZW0pOwotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhydW5uYWJsZSk7Ci0JCWlmIChwcm9ibGVtWzBdICE9IG51bGwpIHsKLQkJCXRocm93IHByb2JsZW1bMF07Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFJ1bm5hYmxlIGdldEhhbmRsZUlucHV0UnVubmFibGUoZmluYWwgQnVpbGRFeGNlcHRpb25bXSBwcm9ibGVtKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU3RyaW5nIHByb21wdDsKLQkJCQlpZiAoZlJlcXVlc3QgaW5zdGFuY2VvZiBNdWx0aXBsZUNob2ljZUlucHV0UmVxdWVzdCkgewotCQkJCQlwcm9tcHQgPSBmUmVxdWVzdC5nZXRQcm9tcHQoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlwcm9tcHQgPSBnZXRQcm9tcHQoZlJlcXVlc3QpOwotCQkJCX0KLQkJICAgICAgIAlTdHJpbmcgdGl0bGU9IFJlbW90ZUFudE1lc3NhZ2VzLmdldFN0cmluZygiU1dUSW5wdXRIYW5kbGVyLjEiKTsgLy8kTk9OLU5MUy0xJAotCQkgICAgICAgCWJvb2xlYW5bXSByZXN1bHQgPSBuZXcgYm9vbGVhblsxXTsKLQkJCQlvcGVuKHRpdGxlLCBwcm9tcHQsIHJlc3VsdCk7Ci0JCQotCQkJCWlmICghcmVzdWx0WzBdKSB7Ci0JCQkJCXByb2JsZW1bMF09IG5ldyBCdWlsZEV4Y2VwdGlvbihSZW1vdGVBbnRNZXNzYWdlcy5nZXRTdHJpbmcoIlNXVElucHV0SGFuZGxlci4yIikpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBvcGVuKFN0cmluZyB0aXRsZSwgU3RyaW5nIHByb21wdCwgYm9vbGVhbltdIHJlc3VsdCkgewotCQljcmVhdGVEaWFsb2codGl0bGUsIHByb21wdCwgcmVzdWx0KTsKLQkJdmFsaWRhdGVJbnB1dCgpOwotCQlmRGlhbG9nLm9wZW4oKTsKLQotCQl3aGlsZSAoIWZEaWFsb2cuaXNEaXNwb3NlZCgpKSB7Ci0JCQlpZiAoIWZEaWFsb2cuZ2V0RGlzcGxheSgpLnJlYWRBbmREaXNwYXRjaCgpKSBmRGlhbG9nLmdldERpc3BsYXkoKS5zbGVlcCgpOwotCQl9Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmRpc3Bvc2UoKTsKLQl9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlRGlhbG9nKFN0cmluZyB0aXRsZSwgU3RyaW5nIHByb21wdCwgYm9vbGVhbltdIHJlc3VsdCkgewotICAgICAgICBEaXNwbGF5IGRpc3BsYXk9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQlmRGlhbG9nID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCB8IFNXVC5SRVNJWkUpOwotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMoZkRpYWxvZyk7Ci0JCWZEaWFsb2cuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkKLQkJR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YShTV1QuRklMTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuPSAyOwotCQlmRGlhbG9nLnNldExheW91dERhdGEoZ2QpOwotCQlmRGlhbG9nLnNldFRleHQodGl0bGUpOwotCQlMYWJlbCBsYWJlbD0gbmV3IExhYmVsKGZEaWFsb2csIFNXVC5XUkFQKTsKLQkJbGFiZWwuc2V0VGV4dChwcm9tcHQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotICAgICAgICAKLSAgICAgICAgZGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscygzMDApOyAvL2Zyb20gSURpYWxvZ0NvbnN0YW50cy5NSU5JTVVNX01FU1NBR0VfQVJFQV9XSURUSAotICAgICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBsYWJlbC5zZXRGb250KGZEaWFsb2cuZ2V0Rm9udCgpKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChmUmVxdWVzdCBpbnN0YW5jZW9mIE11bHRpcGxlQ2hvaWNlSW5wdXRSZXF1ZXN0KSB7Ci0gICAgICAgIAlmQ29tYm8gPSBuZXcgQ29tYm8oZkRpYWxvZywgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotICAgICAgICAJZkNvbWJvLmFkZCgiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCWZvciAoSXRlcmF0b3IgaSA9ICgoTXVsdGlwbGVDaG9pY2VJbnB1dFJlcXVlc3QpZlJlcXVlc3QpLmdldENob2ljZXMoKS5pdGVyYXRvcigpO2kuaGFzTmV4dCgpOykgewotICAgICAgICAJCWZDb21iby5hZGQoKFN0cmluZylpLm5leHQoKSk7Ci0gICAgICAgIAkJZkNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgICAgIAkJZkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQl2YWxpZGF0ZUlucHV0KCk7Ci0JCQkJCX0KLQkJCQl9KTsKLSAgICAgICAgCX0KLSAgICAgICAgfSBlbHNlIHsKLQkgICAgICAgIGZUZXh0ID0gbmV3IFRleHQoZkRpYWxvZywgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCSAgICAgICAgZlRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkgICAgICAgIGZUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkgICAgICAgICAgICAgICAgdmFsaWRhdGVJbnB1dCgpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH0pOwotICAgICAgICB9Ci0JCQotICAgIAlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQl0cnkgewotCQkJZlJlcXVlc3QuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImdldERlZmF1bHRWYWx1ZSIsIG5ldyBDbGFzc1swXSk7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlID0gZlJlcXVlc3QuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCS8vcHJlIEFudCAxLjcuMAotCQl9Ci0JCQotCQlmRXJyb3JNZXNzYWdlVGV4dCA9IG5ldyBUZXh0KGZEaWFsb2csIFNXVC5SRUFEX09OTFkpOwotICAgICAgICBmRXJyb3JNZXNzYWdlVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLSAgICAgICAgZkVycm9yTWVzc2FnZVRleHQuc2V0QmFja2dyb3VuZChkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfQkFDS0dST1VORCkpOwotICAgICAgICAKLQkJY3JlYXRlQnV0dG9uQmFyKGZEaWFsb2csIHJlc3VsdCk7Ci0JCQotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJaWYgKGZDb21ibyAhPSBudWxsKSB7Ci0JCQkJZkNvbWJvLnNlbGVjdChmQ29tYm8uaW5kZXhPZih2YWx1ZSkpOwotCQkJfSBlbHNlIHsKLQkJCQlmVGV4dC5zZXRUZXh0KHZhbHVlKTsKLQkJCQlmVGV4dC5zZWxlY3RBbGwoKTsKLQkJCX0KLQkJfQotCQlmRGlhbG9nLnBhY2soKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGVycm9yTWVzc2FnZSkgewotICAgICAgICBmRXJyb3JNZXNzYWdlVGV4dC5zZXRUZXh0KGVycm9yTWVzc2FnZSA9PSBudWxsID8gIiIgOiBlcnJvck1lc3NhZ2UpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGZPa0J1dHRvbi5zZXRFbmFibGVkKGVycm9yTWVzc2FnZSA9PSBudWxsKTsKLSAgICAgICAgZkVycm9yTWVzc2FnZVRleHQuZ2V0UGFyZW50KCkudXBkYXRlKCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSW5wdXQoKSB7Ci0gICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotICAgICAgICBpZiAoZlJlcXVlc3QgaW5zdGFuY2VvZiBNdWx0aXBsZUNob2ljZUlucHV0UmVxdWVzdCkgewotICAgICAgICAJZlJlcXVlc3Quc2V0SW5wdXQoZkNvbWJvLmdldFRleHQoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlmUmVxdWVzdC5zZXRJbnB1dChmVGV4dC5nZXRUZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZlJlcXVlc3QuaXNJbnB1dFZhbGlkKCkpIHsKLSAgICAgICAgICAgIGlmIChmRmlyc3RWYWxpZGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGZGaXJzdFZhbGlkYXRpb249IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U9IFJlbW90ZUFudE1lc3NhZ2VzLmdldFN0cmluZygiU1dUSW5wdXRIYW5kbGVyLjMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfSAKLSAgICAgICB9Ci0gICAgICAgCi0gICAgICAgIHNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOyAKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW5bXSByZXN1bHQpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOyAKLSAgICAgICAgbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBjb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAKLSAgICAgICAgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihjb21wb3NpdGUsIHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgYm9vbGVhbltdIHJlc3VsdCkgewotICAgIAlmT2tCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCQlmT2tCdXR0b24uc2V0VGV4dChSZW1vdGVBbnRNZXNzYWdlcy5nZXRTdHJpbmcoIlNXVElucHV0SGFuZGxlci40IikpOyAvLyROT04tTkxTLTEkCi0JCXNldEJ1dHRvbkxheW91dERhdGEoZk9rQnV0dG9uKTsKLQkJCi0JCUJ1dHRvbiBjYW5jZWwgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCQljYW5jZWwuc2V0VGV4dChSZW1vdGVBbnRNZXNzYWdlcy5nZXRTdHJpbmcoIlNXVElucHV0SGFuZGxlci41IikpOyAvLyROT04tTkxTLTEkCi0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlyZXN1bHRbMF0gPSBldmVudC53aWRnZXQgPT0gZk9rQnV0dG9uOwotCQkJCWZEaWFsb2cuY2xvc2UoKTsKLQkJCX0KLQkJfTsKLQkJc2V0QnV0dG9uTGF5b3V0RGF0YShjYW5jZWwpOwotCQlmT2tCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbGlzdGVuZXIpOwotCQlmRGlhbG9nLnNldERlZmF1bHRCdXR0b24oZk9rQnV0dG9uKTsKLQkJY2FuY2VsLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIGxpc3RlbmVyKTsKLSAgICAgICAgLy9kbyB0aGlzIGhlcmUgYmVjYXVzZSBzZXR0aW5nIHRoZSB0ZXh0IHdpbGwgc2V0IGVuYWJsZW1lbnQgb24gdGhlIG9rIGJ1dHRvbgotCQlpZiAoZlJlcXVlc3QgaW5zdGFuY2VvZiBNdWx0aXBsZUNob2ljZUlucHV0UmVxdWVzdCkgewotCQkJZkNvbWJvLnNldEZvY3VzKCk7Ci0JCX0gZWxzZSB7Ci0JCQlmVGV4dC5zZXRGb2N1cygpOwotCQl9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBzZXRCdXR0b25MYXlvdXREYXRhKEJ1dHRvbiBidXR0b24pIHsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlpbnQgd2lkdGhIaW50ID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoNjEpOyAvL2Zyb20gSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgKLQkJUG9pbnQgbWluU2l6ZSA9IGJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpOwotCQlkYXRhLndpZHRoSGludCA9IE1hdGgubWF4KHdpZHRoSGludCwgbWluU2l6ZS54KTsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoaW50IGRsdXMpIHsKLSAgICAgICAgLy8gcm91bmQgdG8gdGhlIG5lYXJlc3QgcGl4ZWwKLSAgICAgICAgcmV0dXJuIChmRm9udE1ldHJpY3MuZ2V0QXZlcmFnZUNoYXJXaWR0aCgpICogZGx1cyArIDQgLyAyKSAvIDQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKENvbnRyb2wgY29udHJvbCkgewotICAgICAgICAvLyBDb21wdXRlIGFuZCBzdG9yZSBhIGZvbnQgbWV0cmljCi0gICAgICAgIEdDIGdjID0gbmV3IEdDKGNvbnRyb2wpOwotICAgICAgICBnYy5zZXRGb250KGNvbnRyb2wuZ2V0Rm9udCgpKTsKLSAgICAgICAgZkZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLSAgICAgICAgZ2MuZGlzcG9zZSgpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2Fib3V0Lmh0bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlOTRkMDcuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPk9jdG9iZXIgOCwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPGgzPlRoaXJkIFBhcnR5IENvbnRlbnQ8L2gzPgotCi08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgb3V0IGJlbG93LiBJZiB5b3UgCi1kaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCAKLWZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgdG8gdGhlIFJlZGlzdHJpYnV0b3ImcnNxdW87cyBsaWNlbnNlIGZvciAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci0KLTxoND5BbnQgMS43LjE8L2g0PgotCi08cD5UaGUgZm9sbG93aW5nIGNsYXNzZXMgaW4gdGhlIHBsdWctaW4gSkFSIGFyZSBiYXNlZCBvbiBBbnQgY29kZSBkZXZlbG9wZWQgYnkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCBzaGFsbCBiZSBkZWZpbmVkIGFzIHRoZSAmcXVvdDtBbnQtRGVyaXZlZCBXb3JrJnF1b3Q7OjwvcD4KLQotPHVsPgotCTxsaT5vcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLnV0aWxzLlByb2plY3RIZWxwZXI8L2xpPgotPC91bD4KLQotPHA+VGhlIG9iamVjdCBjb2RlIGZvciBQcm9qZWN0SGVscGVyIGlzIGxvY2F0ZWQKLWluIHRoZSBwbHVnLWluIEpBUiBhbmQgdGhlIHNvdXJjZSBjb2RlIGlzIGxvY2F0ZWQgaW4gc3JjLnppcC48L3A+Ci0KLTxwPllvdXIgdXNlIG9mIHRoZSBBbnQtRGVyaXZlZCBXb3JrIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAuICBBIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaXMgY29udGFpbmVkCi1pbiB0aGUgZmlsZSA8YSBocmVmPSJhYm91dF9maWxlcy9hc2wtdjIwLnR4dCIgdGFyZ2V0PSJfYmxhbmsiPmFib3V0X2ZpbGVzL2FzbC12MjAudHh0PC9hPiBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgCi08YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sPC9hPi48L3A+Ci0KLTxwPlRoZSBuYW1lcyAmcXVvdDtBbnQmcXVvdDsgYW5kICAmcXVvdDtBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiZxdW90OyBtdXN0IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyAKLXNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAgRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgPGEgaHJlZj0ibWFpbHRvOmFwYWNoZUBhcGFjaGUub3JnIj5hcGFjaGVAYXBhY2hlLm9yZzwvYT4uPC9wPgotCi08cD5UaGUgQXBhY2hlIGF0dHJpYnV0aW9uIDxhIGhyZWY9ImFib3V0X2ZpbGVzL05PVElDRSIgdGFyZ2V0PSJfYmxhbmsiPk5PVElDRTwvYT4gZmlsZSBpcyBpbmNsdWRlZCB3aXRoIHRoZSBDb250ZW50IGluIGFjY29yZGFuY2Ugd2l0aCA0ZCBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2Fib3V0X2ZpbGVzL05PVElDRSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvYWJvdXRfZmlsZXMvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmI2ZGRlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvYWJvdXRfZmlsZXMvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNlY3Rpb24gNCBkIG9mICAgICAgICAgICAgICAgICAgICA9PQotICAgPT0gIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PQotICAgPT0gIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBBbnQgZGlzdHJpYnV0aW9uLiAgICAgICAgICAgICAgICAgICAgICA9PQotICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5Ci0gICBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi0gICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgYWxzbyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgOgotICAgICAtIHRoZSBXM0MgY29uc29ydGl1bSAoaHR0cDovL3d3dy53M2Mub3JnKSAsCi0gICAgIC0gdGhlIFNBWCBwcm9qZWN0IChodHRwOi8vd3d3LnNheHByb2plY3Qub3JnKQotCi0gICBQbGVhc2UgcmVhZCB0aGUgZGlmZmVyZW50IExJQ0VOU0UgZmlsZXMgcHJlc2VudCBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YKLSAgIHRoaXMgZGlzdHJpYnV0aW9uLgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9hYm91dF9maWxlcy9hc2wtdjIwLnR4dCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvYWJvdXRfZmlsZXMvYXNsLXYyMC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDU2OTUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9hYm91dF9maWxlcy9hc2wtdjIwLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWE1Y2M0Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gQW50IFRvb2xzIFN1cHBvcnQvLFwKLSAgICAgICAgICAgICAgICAgICBBbnQgRWRpdG9yLwotCi1zb3VyY2UubGliL2FudHJ1bm5lci5qYXIgPSBBbnQgUnVubmVyIFN1cHBvcnQvCi0KLXNvdXJjZS5saWIvcmVtb3RlQW50LmphciA9IFJlbW90ZSBBbnQgU3VwcG9ydC8KLQotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dF9maWxlcy8KLQotYmluLmluY2x1ZGVzID0gaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICB0ZW1wbGF0ZXMvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgbGliLyouamFyLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dF9maWxlcy8KLQkJCQkKLWphcnMuY29tcGlsZS5vcmRlcj0uLGxpYi9hbnRydW5uZXIuamFyLGxpYi9yZW1vdGVBbnQuamFyCi1vdXRwdXQubGliL2FudHJ1bm5lci5qYXIgPSBhbnRfcnVubmVyX3N1cHBvcnRfYmluLwotb3V0cHV0LmxpYi9yZW1vdGVBbnQuamFyID0gcmVtb3RlX3N1cHBvcnRfYmluLwpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9idWlsZGZpbGVzL2V4cG9ydHBsdWdpbi54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2J1aWxkZmlsZXMvZXhwb3J0cGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE1YjljOS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2J1aWxkZmlsZXMvZXhwb3J0cGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhLS0gRXhwb3J0IGEgamFyIG9mIC5jbGFzcyBmaWxlcyBmb3IgdGhlIG9yZy5lY2xpcHNlLmFudC51aSBFY2xpcHNlIHBsdWctaW4KLSAgICAgYWxvbmcgd2l0aCBvdGhlciBpbXBvcnRhbnQgcGx1Z2luIGZpbGVzIHRvIHRoZSAicGx1Z2luLWV4cG9ydCIgc3ViZGlyZWN0b3J5Ci0gICAgIG9mIHRoZSB0YXJnZXQgRWNsaXBzZSBpbnN0YWxsYXRpb24gLS0+Ci08cHJvamVjdCBuYW1lPSJFeHBvcnQgYW50dWkiIGRlZmF1bHQ9ImV4cG9ydCIgYmFzZWRpcj0iLi4iPgotCi0JPCEtLSBTZXQgdGhlIHRpbWVzdGFtcCBhbmQgaW1wb3J0YW50IHByb3BlcnRpZXMgLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHRzdGFtcC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0ZGlyIiB2YWx1ZT0iLi4vLi4vcGx1Z2luLWV4cG9ydCIgLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3QiICB2YWx1ZT0iJHtkZXN0ZGlyfS9vcmcuZWNsaXBzZS5hbnQudWlfMy4wLjAiIC8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIENyZWF0ZSB0aGUgamFyIG9mIC5jbGFzcyBmaWxlcywgYW5kIGNvcHkgb3RoZXIgaW1wb3J0YW50IGZpbGVzIHRvIGV4cG9ydCBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJleHBvcnQiIGRlcGVuZHM9ImluaXQiPgotCQk8bWtkaXIgZGlyPSIke2Rlc3RkaXJ9IiAvPgotCQk8ZGVsZXRlIGRpcj0iJHtkZXN0fSIgLz4KLQkJPG1rZGlyIGRpcj0iJHtkZXN0fSIgLz4KLQkJPGRlbGV0ZSBkaXI9IiR7ZGVzdH0vbGliIi8+Ci0JCTxta2RpciBkaXI9IiR7ZGVzdH0vbGliIi8+Ci0JCTxqYXIgZGVzdGZpbGU9IiR7ZGVzdH0vYW50dWkuamFyIj4KLQkJCTxmaWxlc2V0IGRpcj0iYmluIj4KLQkJCQk8ZXhjbHVkZSBuYW1lPSJvcmcvZWNsaXBzZS9hbnQvdWkvaW50ZXJuYWwvYW50c3VwcG9ydC8qIi8+Ci0JCQkJPGV4Y2x1ZGUgbmFtZT0ib3JnL2VjbGlwc2UvYW50L3VpL2ludGVybmFsL2FudHN1cHBvcnQvaW5wdXRoYW5kbGVyLyoiLz4KLQkJCQk8ZXhjbHVkZSBuYW1lPSJvcmcvZWNsaXBzZS9hbnQvdWkvaW50ZXJuYWwvYW50c3VwcG9ydC9sb2dnZXIvKiIvPgotCQkJPC9maWxlc2V0PgotCQk8L2phcj4KLQkJPCEtLSBDcmVhdGUgdGhlIHNvdXJjZSB6aXAgLS0+Ci0JCTx6aXAgZGVzdGZpbGU9IiR7ZGVzdH0vYW50dWlzcmMuemlwIj4KLQkJCTxmaWxlc2V0IGRpcj0iQW50IFRvb2xzIFN1cHBvcnQiLz4KLQkJCTxmaWxlc2V0IGRpcj0iQW50IFJ1bm5lciBTdXBwb3J0Ii8+Ci0JCQk8ZmlsZXNldCBkaXI9IkFudCBFZGl0b3IiLz4KLQkJPC96aXA+Ci0JCTxjb3B5IGZpbGU9InBsdWdpbi54bWwiIHRvZGlyPSIke2Rlc3R9Ii8+Ci0JCTxjb3B5IGZpbGU9InBsdWdpbi5wcm9wZXJ0aWVzIiB0b2Rpcj0iJHtkZXN0fSIvPgotCQk8Y29weSBmaWxlPSIuY2xhc3NwYXRoIiB0b2Rpcj0iJHtkZXN0fSIvPgotCQk8Y29weSBmaWxlPSIub3B0aW9ucyIgdG9kaXI9IiR7ZGVzdH0iLz4KLQkJPGNvcHkgZmlsZT0ibGliL2FudHJ1bm5lci5qYXIiIHRvZGlyPSIke2Rlc3R9L2xpYiIvPgotCQk8Y29weSBmaWxlPSJsaWIvcmVtb3RlQW50LmphciIgdG9kaXI9IiR7ZGVzdH0vbGliIi8+Ci0JCTxjb3B5IHRvZGlyPSIke2Rlc3R9L2ljb25zIj4KLQkJCTxmaWxlc2V0IGRpcj0iaWNvbnMiIC8+Ci0JCTwvY29weT4JCQotCTwvdGFyZ2V0PgotCQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2RsY2wxNi9hZGRfY28uZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2RsY2wxNi9hZGRfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDkyNTk4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvYWRkX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvYWxwaGFfbW9kZS5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L2FscGhhX21vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWUzMThlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvYWxwaGFfbW9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L2FudF90YXJnZXRzLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvYW50X3RhcmdldHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWNjMmNmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvYW50X3RhcmdldHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2RsY2wxNi9leHBvcnRBbnRfY28uZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2RsY2wxNi9leHBvcnRBbnRfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTJlMzY1Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvZXhwb3J0QW50X2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvZmlsdGVyX2ltcG9ydGVkX2VsZW1lbnRzLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvZmlsdGVyX2ltcG9ydGVkX2VsZW1lbnRzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE3MTcyMS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L2ZpbHRlcl9pbXBvcnRlZF9lbGVtZW50cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L2ZpbHRlcl9pbnRlcm5hbF90YXJnZXRzLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvZmlsdGVyX2ludGVybmFsX3RhcmdldHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2RhODFlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvZmlsdGVyX2ludGVybmFsX3RhcmdldHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2RsY2wxNi9maWx0ZXJfcHJvcGVydGllcy5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L2ZpbHRlcl9wcm9wZXJ0aWVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q5ZWU4NC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L2ZpbHRlcl9wcm9wZXJ0aWVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvZmlsdGVyX3RvcF9sZXZlbC5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L2ZpbHRlcl90b3BfbGV2ZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzFjZTE1Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvZmlsdGVyX3RvcF9sZXZlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L3Byb3BlcnRpZXMuZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2RsY2wxNi9wcm9wZXJ0aWVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZiZjlkMC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L3Byb3BlcnRpZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2RsY2wxNi9yZWZyZXNoLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvcmVmcmVzaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YTFkMzguLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2RsY2wxNi9yZWZyZXNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvcmVtb3ZlX2NvLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvcmVtb3ZlX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU5ZTQ2Mi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L3JlbW92ZV9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L3JlbW92ZWFsbF9jby5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L3JlbW92ZWFsbF9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZDFiZTUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2RsY2wxNi9yZW1vdmVhbGxfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2RsY2wxNi9ydW5fdG9vbC5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L3J1bl90b29sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI1MmJmMC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L3J1bl90b29sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvc2VhcmNoLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kbGNsMTYvc2VhcmNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI0NmE2My4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L3NlYXJjaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L3N5bmNlZC5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZGxjbDE2L3N5bmNlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNmU0M2EuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2RsY2wxNi9zeW5jZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2R0b29sMTYvbWFya19vY2N1cnJlbmNlcy5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9tYXJrX29jY3VycmVuY2VzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmNGQzYi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9tYXJrX29jY3VycmVuY2VzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3NlZ21lbnRfZWRpdC5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9zZWdtZW50X2VkaXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2RhMGYwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3NlZ21lbnRfZWRpdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZWxjbDE2L2FkZF9jby5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZWxjbDE2L2FkZF9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmViODguLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9hZGRfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9hbHBoYV9tb2RlLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvYWxwaGFfbW9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwN2QzNGYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9hbHBoYV9tb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvYW50X3RhcmdldHMuZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9hbnRfdGFyZ2V0cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYjA0MDIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9hbnRfdGFyZ2V0cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZWxjbDE2L2V4cG9ydEFudF9jby5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZWxjbDE2L2V4cG9ydEFudF9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NDNhMzUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9leHBvcnRBbnRfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9maWx0ZXJfaW1wb3J0ZWRfZWxlbWVudHMuZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9maWx0ZXJfaW1wb3J0ZWRfZWxlbWVudHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTdmOGE5Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvZmlsdGVyX2ltcG9ydGVkX2VsZW1lbnRzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvZmlsdGVyX2ludGVybmFsX3RhcmdldHMuZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9maWx0ZXJfaW50ZXJuYWxfdGFyZ2V0cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNzM4N2MuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9maWx0ZXJfaW50ZXJuYWxfdGFyZ2V0cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZWxjbDE2L2ZpbHRlcl9wcm9wZXJ0aWVzLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvZmlsdGVyX3Byb3BlcnRpZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjQ2Y2YwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvZmlsdGVyX3Byb3BlcnRpZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9maWx0ZXJfdG9wX2xldmVsLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvZmlsdGVyX3RvcF9sZXZlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OGUwODIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9maWx0ZXJfdG9wX2xldmVsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvcHJvcGVydGllcy5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZWxjbDE2L3Byb3BlcnRpZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjIzY2ZjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvcHJvcGVydGllcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZWxjbDE2L3JlZnJlc2guZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9yZWZyZXNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NhMDRkMC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZWxjbDE2L3JlZnJlc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9yZW1vdmVfY28uZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9yZW1vdmVfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2Q5YzU0Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvcmVtb3ZlX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvcmVtb3ZlYWxsX2NvLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvcmVtb3ZlYWxsX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhhMzc4NS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZWxjbDE2L3JlbW92ZWFsbF9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZWxjbDE2L3J1bl90b29sLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvcnVuX3Rvb2wuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2Y0MTAyLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvcnVuX3Rvb2wuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9zZWFyY2guZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2VsY2wxNi9zZWFyY2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTQwYTAxLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvc2VhcmNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvc3luY2VkLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9lbGNsMTYvc3luY2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcwOTM0Yi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZWxjbDE2L3N5bmNlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tYXJrX29jY3VycmVuY2VzLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21hcmtfb2NjdXJyZW5jZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDdjMTc1Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21hcmtfb2NjdXJyZW5jZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2V0b29sMTYvc2VnbWVudF9lZGl0LmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3NlZ21lbnRfZWRpdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYzVmYjYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL2V0b29sMTYvc2VnbWVudF9lZGl0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9ldmlldzE2L2FudF92aWV3LmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9ldmlldzE2L2FudF92aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhkOTU2NC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9hbnRfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvYW50LmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9hbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzk5NTQyLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9hbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L2FudF9idWlsZGZpbGUuZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L2FudF9idWlsZGZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGYzNDY5Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9hbnRfYnVpbGRmaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9hbnRfdGFyZ2V0X2Vyci5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvYW50X3RhcmdldF9lcnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmM2MDY4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9hbnRfdGFyZ2V0X2Vyci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvY2xhc3NwYXRoLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9jbGFzc3BhdGguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmZjNDFhLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9jbGFzc3BhdGguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L2RlZmF1bHR0YXJnZXRfb2JqLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9kZWZhdWx0dGFyZ2V0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiY2YyZjguLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L2RlZmF1bHR0YXJnZXRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9lY2xpcHNlX29iai5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvZWNsaXBzZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjdiOTBjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9lY2xpcHNlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvaW1wb3J0X29iai5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvaW1wb3J0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZTkxMzAuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L2ltcG9ydF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L21hY3JvZGVmX29iai5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvbWFjcm9kZWZfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc1M2I5Ni4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvbWFjcm9kZWZfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9tYWluX3RhYi5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvbWFpbl90YWIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjlmNzlhLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9tYWluX3RhYi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvbmV3X2FudF9wcm9qZWN0LmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9uZXdfYW50X3Byb2plY3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzdkMTNiLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9uZXdfYW50X3Byb2plY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L3Byb3BfcHMuZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L3Byb3BfcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjIzY2ZjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm9wX3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm9wZXJ0eV9vYmouZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L3Byb3BlcnR5X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4Mjc3Y2YuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L3Byb3BlcnR5X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFyZ2V0aW50ZXJuYWxfb2JqLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi90YXJnZXRpbnRlcm5hbF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTFhMTY2Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi90YXJnZXRpbnRlcm5hbF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L3RhcmdldHB1YmxpY19vYmouZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L3RhcmdldHB1YmxpY19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDZhOTAzLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi90YXJnZXRwdWJsaWNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi90YXNrX29iai5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFza19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTE0ZWQ3Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi90YXNrX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFza2RlZl9vYmouZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L3Rhc2tkZWZfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA3ZDFmNC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFza2RlZl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL29iajE2L3RlbXBsYXRlX29iai5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvdGVtcGxhdGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRkZTVmYi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvdGVtcGxhdGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi90eXBlLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vYmoxNi90eXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZhNThjNS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb2JqMTYvdHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3JfY28uZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL292cjE2L2Vycm9yX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5ZGNjYy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3JfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL292cjE2L2ltcG9ydF9jby5naWYgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb3ZyMTYvaW1wb3J0X2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBhMjRiMi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb3ZyMTYvaW1wb3J0X2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vdnIxNi93YXJuaW5nX2NvLmdpZiBiL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvaWNvbnMvZnVsbC9vdnIxNi93YXJuaW5nX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUyZGFjNC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvb3ZyMTYvd2FybmluZ19jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FudF93aXoucG5nIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL3dpemJhbi9hbnRfd2l6LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg3YTc3NS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FudF93aXoucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfYW50X3dpei5wbmcgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9hbnRfd2l6LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0MmJkOC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9hbnRfd2l6LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvdGVtcGxhdGVzL2FudC5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS90ZW1wbGF0ZXMvYW50LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YjNhOGYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC51aS90ZW1wbGF0ZXMvYW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1maWxlc2V0VGVtcGxhdGUxLmRlc2NyaXB0aW9uPSBmaWxlc2V0IHR5cGUgd2l0aCBpbmNsdWRlIGNsYXVzZQotdGFyZ2V0VGVtcGxhdGUxLmRlc2NyaXB0aW9uPSBwdWJsaWMgdGFyZ2V0Ci10YXJnZXRUZW1wbGF0ZTIuZGVzY3JpcHRpb249IHByaXZhdGUgdGFyZ2V0Ci1wcm9wZXJ0eVRlbXBsYXRlMS5kZXNjcmlwdGlvbj0gcHJvcGVydHkgd2l0aCBuYW1lIGFuZCBsb2NhdGlvbgotcHJvcGVydHlUZW1wbGF0ZTIuZGVzY3JpcHRpb249IHByb3BlcnR5IHdpdGggbmFtZSBhbmQgdmFsdWUKLW1hY3JvZGVmVGVtcGxhdGUuZGVzY3JpcHRpb249IG1hY3JvZGVmIHdpdGggYSBzaW5nbGUgYXR0cmlidXRlCi1kZWxldGVUZW1wbGF0ZTEuZGVzY3JpcHRpb249IGRlbGV0ZSBmaWxlcyBpbiBhIGZpbGVzZXQKLWRlbGV0ZVRlbXBsYXRlMi5kZXNjcmlwdGlvbj0gZGVsZXRlIGZpbGVzIGluIGEgcmVmZXJlbmNlZCBmaWxlc2V0Ci0KLWphdmFjVGVtcGxhdGUxLmRlc2NyaXB0aW9uPSBhZGQgYSBqYXZhYyB0YXNrCi1idWlsZEZpbGVUZW1wbGF0ZTEubmFtZT0gQnVpbGRmaWxlIHRlbXBsYXRlCi1idWlsZEZpbGVUZW1wbGF0ZTEuZGVzY3JpcHRpb249IHNpbXBsZSBidWlsZGZpbGUgd2l0aCB0d28gdGFyZ2V0cwotCi1hbnRDb21tZW50Lm5hbWU9IGNvbW1lbnQKLWFudENvbW1lbnQuZGVzY3JpcHRpb249IGNvbW1lbnRzIHRoZSBzZWxlY3RlZCB3b3JkCi1hbnRMaW5lQ29tbWVudC5uYW1lPSBjb21tZW50IGxpbmUKLWFudExpbmVDb21tZW50LmRlc2NyaXB0aW9uPSBjb21tZW50cyB0aGUgc2VsZWN0ZWQgbGluZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvdGVtcGxhdGVzL2FudC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnVpL3RlbXBsYXRlcy9hbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTc5MDMwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvdGVtcGxhdGVzL2FudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgTWFydGluIEthcnBpc2VrIChtYXJ0aW4ua2FycGlzZWtAZ21haWwuY29tKSAtIGJ1ZyAxOTkwMTQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKLS0tPgotCi08dGVtcGxhdGVzPgotCi08dGVtcGxhdGUgCi0JY29udGV4dD0ib3JnLmVjbGlwc2UuYW50LnVpLnRlbXBsYXRlQ29udGV4dFR5cGUudGFzayIgCi0JZGVzY3JpcHRpb249IiVqYXZhY1RlbXBsYXRlMS5kZXNjcmlwdGlvbiIgCi0JaWQ9Im9yZy5lY2xpcHNlLmFudC51aS50ZW1wbGF0ZXMuamF2YWMxIiAKLQluYW1lPSJqYXZhYyI+Jmx0O2phdmFjIHNyY2Rpcj0mcXVvdDske3NyY30mcXVvdDsKLSAgICAgICAgIGRlc3RkaXI9JnF1b3Q7JHtkc3R9JnF1b3Q7Ci0gICAgICAgICBjbGFzc3BhdGg9JnF1b3Q7JHtqYXJmaWxlfSZxdW90OwotICAgICAgICAgZGVidWc9JnF1b3Q7JHtvbn0mcXVvdDsKLQkvJmd0OyR7Y3Vyc29yfTwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSAKLQljb250ZXh0PSJvcmcuZWNsaXBzZS5hbnQudWkudGVtcGxhdGVDb250ZXh0VHlwZS50YXNrIiAKLQlkZXNjcmlwdGlvbj0iJWZpbGVzZXRUZW1wbGF0ZTEuZGVzY3JpcHRpb24iIAotCWlkPSJvcmcuZWNsaXBzZS5hbnQudWkudGVtcGxhdGVzLmZpbGVzZXQxIiAKLQluYW1lPSJmaWxlc2V0Ij48IVtDREFUQVs8ZmlsZXNldCBkaXI9IiR7ZGlyfSIgaWQ9IiR7aWR9Ij4KLSAgICA8aW5jbHVkZSBuYW1lPSIke2luY2x1ZGV9Ii8+Ci0gICAgPGV4Y2x1ZGUgbmFtZT0iJHtleGNsdWRlfSIvPgotPC9maWxlc2V0PgotJHtjdXJzb3J9XV0+PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIAotICAgIGNvbnRleHQ9Im9yZy5lY2xpcHNlLmFudC51aS50ZW1wbGF0ZUNvbnRleHRUeXBlLnRhc2siIAotICAgIGRlc2NyaXB0aW9uPSIlZGVsZXRlVGVtcGxhdGUxLmRlc2NyaXB0aW9uIiAKLSAgICBpZD0ib3JnLmVjbGlwc2UuYW50LnVpLnRlbXBsYXRlcy5kZWxldGUxIiAKLSAgICBuYW1lPSJkZWxldGUiPjwhW0NEQVRBWzxkZWxldGU+Ci0JPGZpbGVzZXQgZGlyPSIke2Rpcn0iPgotCSAgICA8aW5jbHVkZSBuYW1lPSIke2luY2x1ZGV9Ii8+Ci0JICAgIDxleGNsdWRlIG5hbWU9IiR7ZXhjbHVkZX0iLz4KLQk8L2ZpbGVzZXQ+Ci08L2RlbGV0ZT4KLSR7Y3Vyc29yfV1dPjwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSAKLSAgICBjb250ZXh0PSJvcmcuZWNsaXBzZS5hbnQudWkudGVtcGxhdGVDb250ZXh0VHlwZS50YXNrIiAKLSAgICBkZXNjcmlwdGlvbj0iJWRlbGV0ZVRlbXBsYXRlMi5kZXNjcmlwdGlvbiIgCi0gICAgaWQ9Im9yZy5lY2xpcHNlLmFudC51aS50ZW1wbGF0ZXMuZGVsZXRlMiIgCi0gICAgbmFtZT0iZGVsZXRlIj48IVtDREFUQVs8ZGVsZXRlPgotICAgIDxmaWxlc2V0IHJlZmlkPSIke2N1cnNvcn0iLz4KLTwvZGVsZXRlPl1dPgotPC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIAotICAgIGNvbnRleHQ9Im9yZy5lY2xpcHNlLmFudC51aS50ZW1wbGF0ZUNvbnRleHRUeXBlLnRhc2siIAotICAgIGRlc2NyaXB0aW9uPSIlcHJvcGVydHlUZW1wbGF0ZTEuZGVzY3JpcHRpb24iIAotICAgIGlkPSJvcmcuZWNsaXBzZS5hbnQudWkudGVtcGxhdGVzLnByb3BlcnR5MSIgCi0gICAgbmFtZT0icHJvcGVydHkiPiZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90OyR7bmFtZX0mcXVvdDsgbG9jYXRpb249JnF1b3Q7JHtsb2NhdGlvbn0mcXVvdDsvJmd0OwotPC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIAotICAgIGNvbnRleHQ9Im9yZy5lY2xpcHNlLmFudC51aS50ZW1wbGF0ZUNvbnRleHRUeXBlLnRhc2siIAotICAgIGRlc2NyaXB0aW9uPSIlcHJvcGVydHlUZW1wbGF0ZTIuZGVzY3JpcHRpb24iIAotICAgIGlkPSJvcmcuZWNsaXBzZS5hbnQudWkudGVtcGxhdGVzLnByb3BlcnR5MiIgCi0gICAgbmFtZT0icHJvcGVydHkiPiZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90OyR7bmFtZX0mcXVvdDsgdmFsdWU9JnF1b3Q7JHt2YWx1ZX0mcXVvdDsvJmd0OwotPC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIAotCWNvbnRleHQ9Im9yZy5lY2xpcHNlLmFudC51aS50ZW1wbGF0ZUNvbnRleHRUeXBlLnRhcmdldCIgCi0JZGVzY3JpcHRpb249IiV0YXJnZXRUZW1wbGF0ZTEuZGVzY3JpcHRpb24iIAotCWlkPSJvcmcuZWNsaXBzZS5hbnQudWkudGVtcGxhdGVzLnRhcmdldDEiIAotCW5hbWU9InRhcmdldCI+PCFbQ0RBVEFbPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gICAgICAgICAgdGFyZ2V0OiAke25hbWV9ICAgICAgICAgICAgICAKLSAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9IiR7bmFtZX0iIGRlcGVuZHM9IiR7ZGVwZW5kc30iIGRlc2NyaXB0aW9uPSIke2Rlc2NyaXB0aW9ufSI+Ci0gICAgICAgICR7Y3Vyc29yfQotICAgIDwvdGFyZ2V0PgotXV0+PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIAotICAgIGNvbnRleHQ9Im9yZy5lY2xpcHNlLmFudC51aS50ZW1wbGF0ZUNvbnRleHRUeXBlLnRhcmdldCIgCi0gICAgZGVzY3JpcHRpb249IiV0YXJnZXRUZW1wbGF0ZTIuZGVzY3JpcHRpb24iIAotICAgIGlkPSJvcmcuZWNsaXBzZS5hbnQudWkudGVtcGxhdGVzLnRhcmdldDIiIAotICAgIG5hbWU9InRhcmdldCI+PCFbQ0RBVEFbPCEtLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gCi0gICAgICAgICAgdGFyZ2V0OiAke25hbWV9ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iJHtuYW1lfSI+Ci0gICAgICAgICAgICAke2N1cnNvcn0KLSAgICA8L3RhcmdldD4KLV1dPjwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSAKLSAgICBjb250ZXh0PSJvcmcuZWNsaXBzZS5hbnQudWkudGVtcGxhdGVDb250ZXh0VHlwZS50YXNrIiAKLSAgICBkZXNjcmlwdGlvbj0iJW1hY3JvZGVmVGVtcGxhdGUuZGVzY3JpcHRpb24iIAotICAgIGlkPSJvcmcuZWNsaXBzZS5hbnQudWkudGVtcGxhdGVzLm1hY3JvZGVmIiAKLSAgICBuYW1lPSJtYWNyb2RlZiI+PCFbQ0RBVEFbPCEtLSA9ID0gPSA9ID0gPSA9ID0gPSA9ID0gPSA9ID0gPSA9ID0KLSAgICAgICAgICBtYWNyb2RlZjogJHtuYW1lfSAgICAgICAgICAKLSAgICAgICAgID0gPSA9ID0gPSA9ID0gPSA9ID0gPSA9ID0gPSA9ID0gPSAtLT4KLSAgICA8bWFjcm9kZWYgbmFtZT0iJHtuYW1lfSI+Ci0gICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iJHthcmduYW1lfSIgZGVmYXVsdD0iJHtkZWZhdWx0fSIgLz4KLSAgICAgICAgPHNlcXVlbnRpYWw+Ci0gICAgICAgICAgICAke2N1cnNvcn0KLSAgICAgICAgPC9zZXF1ZW50aWFsPgotICAgIDwvbWFjcm9kZWY+Ci1dXT48L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgCi0JY29udGV4dD0ib3JnLmVjbGlwc2UuYW50LnVpLnRlbXBsYXRlQ29udGV4dFR5cGUuYnVpbGRGaWxlIiAKLQlkZXNjcmlwdGlvbj0iJWJ1aWxkRmlsZVRlbXBsYXRlMS5kZXNjcmlwdGlvbiIgCi0JaWQ9Im9yZy5lY2xpcHNlLmFudC51aS50ZW1wbGF0ZXMuYnVpbGRGaWxlMSIgCi0JbmFtZT0iJWJ1aWxkRmlsZVRlbXBsYXRlMS5uYW1lIj48IVtDREFUQVs8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAotICAgICAke2RhdGV9ICR7dGltZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgICR7cHJvamVjdH0gICAgCi0gICAgICR7ZGVzY3JpcHRpb259Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICR7dXNlcn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08cHJvamVjdCBuYW1lPSIke3Byb2plY3R9IiBkZWZhdWx0PSIke2RlZmF1bHR9Ij4KLSAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAke2Rlc2NyaXB0aW9ufQotICAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKLSAgICAgICAgICB0YXJnZXQ6ICR7ZGVmYXVsdH0gICAgICAgICAgICAgIAotICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotICAgIDx0YXJnZXQgbmFtZT0iJHtkZWZhdWx0fSIgZGVwZW5kcz0iJHtkZXBlbmRzfSIgZGVzY3JpcHRpb249IiR7ZGVzY3JpcHRpb259Ij4KLSAgICAgICAgJHtjdXJzb3J9Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAKLSAgICAgICAgICB0YXJnZXQ6ICR7ZGVwZW5kc30gICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLS0+Ci0gICAgPHRhcmdldCBuYW1lPSIke2RlcGVuZHN9Ij4KLSAgICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgotXV0+PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVhbnRDb21tZW50Lm5hbWUiIGRlc2NyaXB0aW9uPSIlYW50Q29tbWVudC5kZXNjcmlwdGlvbiIKLQljb250ZXh0PSJvcmcuZWNsaXBzZS5hbnQudWkudGVtcGxhdGVDb250ZXh0VHlwZS5idWlsZEZpbGUiIAotCWlkPSJvcmcuZWNsaXBzZS5hbnQudWkudGVtcGxhdGVzLmNvbW1lbnQxIiA+PCFbQ0RBVEFbPCEtLSAke3dvcmRfc2VsZWN0aW9ufS0tPl1dPjwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlYW50Q29tbWVudC5uYW1lIiBkZXNjcmlwdGlvbj0iJWFudENvbW1lbnQuZGVzY3JpcHRpb24iCi0JY29udGV4dD0ib3JnLmVjbGlwc2UuYW50LnVpLnRlbXBsYXRlQ29udGV4dFR5cGUudGFzayIgCi0JaWQ9Im9yZy5lY2xpcHNlLmFudC51aS50ZW1wbGF0ZXMuY29tbWVudDIiPjwhW0NEQVRBWzwhLS0gJHt3b3JkX3NlbGVjdGlvbn0tLT5dXT48L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJWFudExpbmVDb21tZW50Lm5hbWUiIGRlc2NyaXB0aW9uPSIlYW50TGluZUNvbW1lbnQuZGVzY3JpcHRpb24iCi0JY29udGV4dD0ib3JnLmVjbGlwc2UuYW50LnVpLnRlbXBsYXRlQ29udGV4dFR5cGUuYnVpbGRGaWxlIiAKLQlpZD0ib3JnLmVjbGlwc2UuYW50LnVpLnRlbXBsYXRlcy5jb21tZW50MyI+PCFbQ0RBVEFbPCEtLQotJHtsaW5lX3NlbGVjdGlvbn0KLS0tPl1dPjwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlYW50TGluZUNvbW1lbnQubmFtZSIgZGVzY3JpcHRpb249IiVhbnRMaW5lQ29tbWVudC5kZXNjcmlwdGlvbiIKLQljb250ZXh0PSJvcmcuZWNsaXBzZS5hbnQudWkudGVtcGxhdGVDb250ZXh0VHlwZS50YXNrIgotCWlkPSJvcmcuZWNsaXBzZS5hbnQudWkudGVtcGxhdGVzLmNvbW1lbnQ0Ij48IVtDREFUQVs8IS0tCi0ke2xpbmVfc2VsZWN0aW9ufQotLS0+XV0+PC90ZW1wbGF0ZT4KLQotPC90ZW1wbGF0ZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC51aS90ZW1wbGF0ZXMvcmVzb2x2ZXIuZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC51aS90ZW1wbGF0ZXMvcmVzb2x2ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTI2NjczLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudWkvdGVtcGxhdGVzL3Jlc29sdmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL0xlZ2FjeUlERS5lNHhtaSBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL0xlZ2FjeUlERS5lNHhtaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTRiZmVkCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vTGVnYWN5SURFLmU0eG1pCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+Cis8YXBwbGljYXRpb246QXBwbGljYXRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczphcHBsaWNhdGlvbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91aS8yMDEwL1VJTW9kZWwvYXBwbGljYXRpb24iIHhtbG5zOmJhc2ljPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VpLzIwMTAvVUlNb2RlbC9hcHBsaWNhdGlvbi91aS9iYXNpYyIgeG1sbnM6bWVudT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91aS8yMDEwL1VJTW9kZWwvYXBwbGljYXRpb24vdWkvbWVudSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VpLzIwMTAvVUlNb2RlbC9hcHBsaWNhdGlvbi91aS9iYXNpYyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VpLzIwMTAvVUlNb2RlbC9hcHBsaWNhdGlvbiMvL3VpL2Jhc2ljIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdWkvMjAxMC9VSU1vZGVsL2FwcGxpY2F0aW9uL3VpL21lbnUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91aS8yMDEwL1VJTW9kZWwvYXBwbGljYXRpb24jLy91aS9tZW51IiB4bWk6aWQ9Im9yZy5lY2xpcHNlLmU0LmxlZ2FjeS5pZGUuYXBwbGljYXRpb24iIGVsZW1lbnRJZD0ib3JnLmVjbGlwc2UuZTQubGVnYWN5LmlkZS5hcHBsaWNhdGlvbiIgYmluZGluZ0NvbnRleHRzPSJfU2VYVUhPOEVFZDZCQzljRGI2aVY3eSI+CisgIDxjaGlsZHJlbiB4c2k6dHlwZT0iYmFzaWM6VHJpbW1lZFdpbmRvdyIgeG1pOmlkPSJJREVXaW5kb3ciIGVsZW1lbnRJZD0iSURFV2luZG93IiBsYWJlbD0iJXRyaW1tZWR3aW5kb3cubGFiZWwuZWNsaXBzZVNESyIgd2lkdGg9IjEwMjQiIGhlaWdodD0iNzY4Ij4KKyAgPC9jaGlsZHJlbj4KKyAgPGhhbmRsZXJzIHhtaTppZD0iX1VXOVRZX3IzRWQ2Z21vN2NhT3hVOWciIGVsZW1lbnRJZD0iX1VXOVRZX3IzRWQ2Z21vN2NhT3hVOWciIGNvbnRyaWJ1dGlvblVSST0iYnVuZGxlY2xhc3M6Ly9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLkV4aXRIYW5kbGVyIiBjb21tYW5kPSJlNC5leGl0Ii8+CisgIDxoYW5kbGVycyB4bWk6aWQ9Il9CRVNUWmZyM0VkNmdtbzdjYU94VTA0IiBlbGVtZW50SWQ9Il9CRVNUWmZyM0VkNmdtbzdjYU94VTA0IiBjb250cmlidXRpb25VUkk9ImJ1bmRsZWNsYXNzOi8vb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnN3dC9vcmcuZWNsaXBzZS5lNC51aS5pbnRlcm5hbC53b3JrYmVuY2guc3d0LmhhbmRsZXJzLlNob3dWaWV3SGFuZGxlciIgY29tbWFuZD0iZTQuc2hvdy52aWV3Ii8+CisgIDxoYW5kbGVycyB4bWk6aWQ9Il9lVEJSZ0FGU0VkLVo4clFrc0x3Ull3IiBlbGVtZW50SWQ9Im9yZy5lY2xpcHNlLmU0LnVpLnNhdmVIYW5kbGVyIiBjb250cmlidXRpb25VUkk9ImJ1bmRsZWNsYXNzOi8vb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoL29yZy5lY2xpcHNlLmU0LnVpLmludGVybmFsLndvcmtiZW5jaC5oYW5kbGVycy5TYXZlSGFuZGxlciIgY29tbWFuZD0iX2pSNW1VQUZTRWQtWjhyUWtzTHdSWXciLz4KKyAgPGhhbmRsZXJzIHhtaTppZD0iX2VUQlJnQUZTRWQtWjhyUWtzTHdSWXgiIGVsZW1lbnRJZD0ib3JnLmVjbGlwc2UuZTQudWkuc2F2ZUFsbEhhbmRsZXIiIGNvbnRyaWJ1dGlvblVSST0iYnVuZGxlY2xhc3M6Ly9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLmhhbmRsZXJzLlNhdmVBbGxIYW5kbGVyIiBjb21tYW5kPSJfalI1bVVBRlNFZC1aOHJRa3NMd1JZeCIvPgorICA8YmluZGluZ1RhYmxlcyB4bWk6aWQ9Il9TZVhVRU84RUVkNkZDOWNEYjZpVjd4IiBiaW5kaW5nQ29udGV4dD0iX1NlWFVITzhFRWQ2QkM5Y0RiNmlWN3kiPgorICAgIDxiaW5kaW5ncyB4bWk6aWQ9Il9VVzlUWmZyM0VkNmdtbzdjYU94VTlnIiBrZXlTZXF1ZW5jZT0iQ1RSTCtRIiBlbGVtZW50SWQ9Il9VVzlUWmZyM0VkNmdtbzdjYU94VTlnIiBjb21tYW5kPSJlNC5leGl0Ii8+CisgICAgPGJpbmRpbmdzIHhtaTppZD0iX29ScjZFQUZTRWQtWjhyUWtzTHdSWXciIGtleVNlcXVlbmNlPSJDVFJMK1MiIGVsZW1lbnRJZD0iX29ScjZFQUZTRWQtWjhyUWtzTHdSWXciIGNvbW1hbmQ9Il9qUjVtVUFGU0VkLVo4clFrc0x3Ull3Ii8+CisgICAgPGJpbmRpbmdzIHhtaTppZD0iX29ScjZFQUZTRWQtWjhyUWtzTHdSWXgiIGtleVNlcXVlbmNlPSJDVFJMK1NISUZUK1MiIGNvbW1hbmQ9Il9qUjVtVUFGU0VkLVo4clFrc0x3Ull4Ii8+CisgIDwvYmluZGluZ1RhYmxlcz4KKyAgPHJvb3RDb250ZXh0IHhtaTppZD0iX1NlWFVITzhFRWQ2QkM5Y0RiNmlWN3kiIGVsZW1lbnRJZD0ib3JnLmVjbGlwc2UudWkuY29udGV4dHMuZGlhbG9nQW5kV2luZG93IiBuYW1lPSIlYmluZGluZ2NvbnRleHQubmFtZS5kaWFsb2dBbmRXaW5kb3dzIj4KKyAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU2VYVUVPOEVFZDZGQzljRGI2aVY3dyIgZWxlbWVudElkPSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cy53aW5kb3ciIG5hbWU9IiViaW5kaW5nY29udGV4dC5uYW1lLndpbmRvd3MiPgorICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NlWFVFTzhFRWQ2RkM5Y0RiNnlWN3giIGVsZW1lbnRJZD0ib3JnLmVjbGlwc2UuZTQudWkuY29udGV4dHMudmlld3MiIG5hbWU9IiViaW5kaW5nY29udGV4dC5uYW1lLmJpbmRpbmdWaWV3Ii8+CisgICAgPC9jaGlsZHJlbj4KKyAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU2VYVUVPOEVFZDZGQzljRGI2aVY3eCIgZWxlbWVudElkPSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cy5kaWFsb2ciIG5hbWU9IiViaW5kaW5nY29udGV4dC5uYW1lLmRpYWxvZ3MiLz4KKyAgPC9yb290Q29udGV4dD4KKyAgPGNvbW1hbmRzIHhtaTppZD0iZTQuZXhpdCIgZWxlbWVudElkPSJlNC5leGl0IiBjb21tYW5kTmFtZT0iJWNvbW1hbmQubmFtZS5leGl0IiBkZXNjcmlwdGlvbj0iIi8+CisgIDxjb21tYW5kcyB4bWk6aWQ9ImU0LnNob3cudmlldyIgZWxlbWVudElkPSJlNC5zaG93LnZpZXciIGNvbW1hbmROYW1lPSIlY29tbWFuZC5uYW1lLnNob3dWaWV3Ij4KKyAgICA8cGFyYW1ldGVycyB4bWk6aWQ9Il9vUnI2RUFGU0VkLVo4clFrc0x3Ull6IiBlbGVtZW50SWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnNob3dWaWV3LnZpZXdJZCIgbmFtZT0iVmlldyIvPgorICA8L2NvbW1hbmRzPgorICA8Y29tbWFuZHMgeG1pOmlkPSJfalI1bVVBRlNFZC1aOHJRa3NMd1JZdyIgZWxlbWVudElkPSJvcmcuZWNsaXBzZS5lNC51aS5zYXZlQ29tbWFuZHMiIGNvbW1hbmROYW1lPSIlY29tbWFuZC5uYW1lLnNhdmUiLz4KKyAgPGNvbW1hbmRzIHhtaTppZD0iX2pSNW1VQUZTRWQtWjhyUWtzTHdSWXgiIGVsZW1lbnRJZD0ib3JnLmVjbGlwc2UuZTQudWkuc2F2ZUFsbENvbW1hbmRzIiBjb21tYW5kTmFtZT0iJWNvbW1hbmQubmFtZS5zYXZlQWxsIi8+CisgIDxhZGRvbnMgeG1pOmlkPSJfWEdCM3dQWmxFZC1Yc3RsVFo2blRYZyIgZWxlbWVudElkPSJvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzLnNlcnZpY2UiIGNvbnRyaWJ1dGlvblVSST0iYnVuZGxlY2xhc3M6Ly9vcmcuZWNsaXBzZS5lNC5jb3JlLmNvbW1hbmRzL29yZy5lY2xpcHNlLmU0LmNvcmUuY29tbWFuZHMuQ29tbWFuZFNlcnZpY2VBZGRvbiIvPgorICA8YWRkb25zIHhtaTppZD0iX1hHQjN3UFpsRWQtWHN0bFRaNm5UWGgiIGVsZW1lbnRJZD0ib3JnLmVjbGlwc2UuZTQudWkuY29udGV4dHMuc2VydmljZSIgY29udHJpYnV0aW9uVVJJPSJidW5kbGVjbGFzczovL29yZy5lY2xpcHNlLmU0LnVpLnNlcnZpY2VzL29yZy5lY2xpcHNlLmU0LnVpLnNlcnZpY2VzLkNvbnRleHRTZXJ2aWNlQWRkb24iLz4KKyAgPGFkZG9ucyB4bWk6aWQ9Il9YR0Izd1BabEVkLVhzdGxUWjZuVFhpIiBlbGVtZW50SWQ9Im9yZy5lY2xpcHNlLmU0LnVpLmJpbmRpbmdzLnNlcnZpY2UiIGNvbnRyaWJ1dGlvblVSST0iYnVuZGxlY2xhc3M6Ly9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy9vcmcuZWNsaXBzZS5lNC51aS5iaW5kaW5ncy5CaW5kaW5nU2VydmljZUFkZG9uIi8+CisgIDxhZGRvbnMgeG1pOmlkPSJfTEswTmdQWm1FZC1Yc3RsVFo2blRYaiIgZWxlbWVudElkPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guY29tbWFuZHMubW9kZWwiIGNvbnRyaWJ1dGlvblVSST0iYnVuZGxlY2xhc3M6Ly9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLmFkZG9ucy5Db21tYW5kUHJvY2Vzc2luZ0FkZG9uIi8+CisgIDxhZGRvbnMgeG1pOmlkPSJfTEswTmdQWm1FZC1Yc3RsVFo2blRYayIgZWxlbWVudElkPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guY29udGV4dHMubW9kZWwiIGNvbnRyaWJ1dGlvblVSST0iYnVuZGxlY2xhc3M6Ly9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gvb3JnLmVjbGlwc2UuZTQudWkuaW50ZXJuYWwud29ya2JlbmNoLmFkZG9ucy5Db250ZXh0UHJvY2Vzc2luZ0FkZG9uIi8+CisgIDxhZGRvbnMgeG1pOmlkPSJfTEswTmdQWm1FZC1Yc3RsVFo2blRYbCIgZWxlbWVudElkPSJvcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYmluZGluZ3MubW9kZWwiIGNvbnRyaWJ1dGlvblVSST0iYnVuZGxlY2xhc3M6Ly9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guc3d0L29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5zd3QudXRpbC5CaW5kaW5nUHJvY2Vzc2luZ0FkZG9uIi8+CisgIDxhZGRvbnMgeG1pOmlkPSJfWHdRWWtFMkVFZC1EZk4ydllZNExldyIgZWxlbWVudElkPSJDbGVhbnVwIEFkZG9uIiBjb250cmlidXRpb25VUkk9ImJ1bmRsZWNsYXNzOi8vb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5zd3Qvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLmFkZG9ucy5jbGVhbnVwYWRkb24uQ2xlYW51cEFkZG9uIi8+CisgIDxhZGRvbnMgeG1pOmlkPSJfYnFjV01FMkVFZC1EZk4ydllZNExldyIgZWxlbWVudElkPSJEbkQgQWRkb24iIGNvbnRyaWJ1dGlvblVSST0iYnVuZGxlY2xhc3M6Ly9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLmRuZGFkZG9uLkRuREFkZG9uIi8+CisgIDxhZGRvbnMgeG1pOmlkPSJfN0dDNnNHcC1FZC1ReU5aakg5ZzE1USIgZWxlbWVudElkPSJNaW5NYXggQWRkb24iIGNvbnRyaWJ1dGlvblVSST0iYnVuZGxlY2xhc3M6Ly9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLnN3dC9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2guYWRkb25zLm1pbm1heC5NaW5NYXhBZGRvbiIvPgorPC9hcHBsaWNhdGlvbjpBcHBsaWNhdGlvbj4KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggMTM0MmNiNy4uYjcxZWNkOSAxMDA2NDQKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTIsNyArMiw3IEBACiBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCiBCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLnBsYXRmb3JtOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAzLjguMC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA0LjIuMC5xdWFsaWZpZXIKIEJ1bmRsZS1DbGFzc1BhdGg6IHBsYXRmb3JtLmphcgogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9idWlsZC5wcm9wZXJ0aWVzIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vYnVpbGQucHJvcGVydGllcwppbmRleCAyNDY4ODIyLi4xMmRiM2FkIDEwMDY0NAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9idWlsZC5wcm9wZXJ0aWVzCisrKyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2J1aWxkLnByb3BlcnRpZXMKQEAgLTM1LDcgKzM1LDkgQEAKICAgICAgICAgICAgICAgIGludHJvLWVjbGlwc2UucG5nLFwKICAgICAgICAgICAgICAgIGludHJvRGF0YS54bWwsXAogICAgICAgICAgICAgICAgaGVscERhdGEueG1sLFwKLSAgICAgICAgICAgICAgIGltYWdlcy8KKyAgICAgICAgICAgICAgIGltYWdlcy8sXAorICAgICAgICAgICAgICAgTGVnYWN5SURFLmU0eG1pLFwKKyAgICAgICAgICAgICAgIGNzcy8KIHNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsXAogICAgICAgICAgICAgICAgbGF1bmNoZXJzcmMuemlwLFwKICAgICAgICAgICAgICAgIHBsYXRmb3Jtc3JjLnppcApkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vY3NzL2U0X2Jhc2VzdHlsZS5jc3MgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9jc3MvZTRfYmFzZXN0eWxlLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDUxMGUxCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vY3NzL2U0X2Jhc2VzdHlsZS5jc3MKQEAgLTAsMCArMSwzNCBAQAorCisuTVRyaW1tZWRXaW5kb3cudG9wTGV2ZWwgeyAKKyAgICBtYXJnaW4tdG9wOiA1cHg7CisgICAgbWFyZ2luLWJvdHRvbTogMnB4OworICAgIG1hcmdpbi1sZWZ0OiAycHg7CisgICAgbWFyZ2luLXJpZ2h0OiAycHg7Cit9CisKKy5NUGFydFN0YWNrIHsKKyAgICBzd3QtdGFiLXJlbmRlcmVyOiB1cmwoJ2J1bmRsZWNsYXNzOi8vb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3QuQ1RhYlJlbmRlcmluZycpOworICAgIHN3dC11bnNlbGVjdGVkLXRhYnMtY29sb3I6ICNGRkZGRkYgI0ZGRkZGRiAjRkZGRkZGIDEwMCUgMTAwJTsKKyAgICBzd3Qtb3V0ZXIta2V5bGluZS1jb2xvcjogI0ZGRkZGRjsKKwlzd3QtaW5uZXIta2V5bGluZS1jb2xvcjogI0ZGRkZGRjsKKwlwYWRkaW5nOiAwcHggOXB4IDEwcHg7CisJc3d0LXRhYi1vdXRsaW5lOiAjQjZCQ0NDOworCXN3dC1zaGFkb3ctdmlzaWJsZTogdHJ1ZTsKKwlzd3QtbXJ1LXZpc2libGU6IGZhbHNlOworfQorCisuTVBhcnRTdGFjay5hY3RpdmUgeworCXN3dC1pbm5lci1rZXlsaW5lLWNvbG9yOiAjRkZGRkZGOworCXN3dC10YWItb3V0bGluZTogI0I2QkNDQzsKKwlzd3Qtc2hhZG93LXZpc2libGU6IHRydWU7Cit9CisKKyNQZXJzcGVjdGl2ZVN3aXRjaGVyIHsKKwllY2xpcHNlLXBlcnNwZWN0aXZlLWtleWxpbmUtY29sb3I6ICNBQUIwQkYgI0FBQjBCRjsKK30KKworLk1Ub29sQ29udHJvbC5UcmltU3RhY2sgeworCWZyYW1lLWltYWdlOiAgdXJsKC4vd2luWFBUU0ZyYW1lLlBORyk7CisJaGFuZGxlLWltYWdlOiAgdXJsKC4vd2luWFBIYW5kbGUuUE5HKTsKKwlmcmFtZS1jdXRzOiA1cHggMXB4IDVweCAxNnB4OworfQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vY3NzL2U0X2NsYXNzaWNfd2luNy5jc3MgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9jc3MvZTRfY2xhc3NpY193aW43LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmM3ZjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vY3NzL2U0X2NsYXNzaWNfd2luNy5jc3MKQEAgLTAsMCArMSwyOCBAQAorLk1UcmltbWVkV2luZG93IHsgIAorICAgIG1hcmdpbi10b3A6IDBweDsKKyAgICBtYXJnaW4tYm90dG9tOiAwcHg7CisgICAgbWFyZ2luLWxlZnQ6IDJweDsKKyAgICBtYXJnaW4tcmlnaHQ6IDJweDsKK30KKworLk1QYXJ0U3RhY2sgeworICBzd3QtdGFiLXJlbmRlcmVyOiBudWxsOworICBzd3Qtc2VsZWN0ZWQtdGFicy1iYWNrZ3JvdW5kOiAjRkZGRkZGICNGMEYwRjAgMTAwJTsKKyAgc3d0LXNpbXBsZTogZmFsc2U7CisgIHN3dC1tcnUtdmlzaWJsZTogdHJ1ZTsKK30KKworCisuTVBhcnRTdGFjay5hY3RpdmUgeworICBzd3Qtc2VsZWN0ZWQtdGFicy1iYWNrZ3JvdW5kOiAjRjJGNUY5ICM5OUI0RDEJIDEwMCU7Cit9CisKKyNQZXJzcGVjdGl2ZVN3aXRjaGVyICB7CisJZWNsaXBzZS1wZXJzcGVjdGl2ZS1rZXlsaW5lLWNvbG9yOiAjRUNFOUQ4ICNGRkZGRkY7Cit9CisKKy5NVG9vbENvbnRyb2wuVHJpbVN0YWNrIHsKKwlmcmFtZS1pbWFnZTogIHVybCguL3dpblhQVFNGcmFtZS5QTkcpOworCWhhbmRsZS1pbWFnZTogIHVybCguL3dpblhQSGFuZGxlLlBORyk7CisJZnJhbWUtY3V0czogNXB4IDFweCA1cHggMTZweDsKK30KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2Nzcy9lNF9jbGFzc2ljX3dpbnhwLmNzcyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2Nzcy9lNF9jbGFzc2ljX3dpbnhwLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWY3NjFkCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vY3NzL2U0X2NsYXNzaWNfd2lueHAuY3NzCkBAIC0wLDAgKzEsMjggQEAKKy5NVHJpbW1lZFdpbmRvdyB7ICAKKyAgICBtYXJnaW4tdG9wOiAwcHg7CisgICAgbWFyZ2luLWJvdHRvbTogMHB4OworICAgIG1hcmdpbi1sZWZ0OiAycHg7CisgICAgbWFyZ2luLXJpZ2h0OiAycHg7Cit9CisKKy5NUGFydFN0YWNrIHsKKyAgc3d0LXRhYi1yZW5kZXJlcjogbnVsbDsKKyAgc3d0LXNlbGVjdGVkLXRhYnMtYmFja2dyb3VuZDogI0ZGRkZGRiAjRUNFOUQ4IDEwMCU7CisgIHN3dC1zaW1wbGU6IGZhbHNlOworICBzd3QtbXJ1LXZpc2libGU6IHRydWU7Cit9CisKKworLk1QYXJ0U3RhY2suYWN0aXZlIHsKKyAgc3d0LXNlbGVjdGVkLXRhYnMtYmFja2dyb3VuZDogI0U1RURGQyAjOTlCQUYzIDEwMCU7Cit9CisKKyNQZXJzcGVjdGl2ZVN3aXRjaGVyICB7CisJZWNsaXBzZS1wZXJzcGVjdGl2ZS1rZXlsaW5lLWNvbG9yOiAjRUNFOUQ4ICNGRkZGRkY7Cit9CisKKy5NVG9vbENvbnRyb2wuVHJpbVN0YWNrIHsKKwlmcmFtZS1pbWFnZTogIHVybCguL3dpblhQVFNGcmFtZS5QTkcpOworCWhhbmRsZS1pbWFnZTogIHVybCguL3dpblhQSGFuZGxlLlBORyk7CisJZnJhbWUtY3V0czogNXB4IDFweCA1cHggMTZweDsKK30KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2Nzcy9lNF9kZWZhdWx0LmNzcyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2Nzcy9lNF9kZWZhdWx0LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzllOTFlCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vY3NzL2U0X2RlZmF1bHQuY3NzCkBAIC0wLDAgKzEsNDEgQEAKKworLk1XaW5kb3cgeworICAgIGJhY2tncm91bmQtY29sb3I6ICAjRUVGMkY3ICNERUVCRjMgMTAwJTsKK30KKworLk1UcmltbWVkV2luZG93IHsgIAorICAgIG1hcmdpbi10b3A6IDJweDsKKyAgICBtYXJnaW4tYm90dG9tOiAycHg7CisgICAgbWFyZ2luLWxlZnQ6IDJweDsKKyAgICBtYXJnaW4tcmlnaHQ6IDJweDsKK30KKworLk1UcmltbWVkV2luZG93LnRvcExldmVsIHsgCisgICAgbWFyZ2luLXRvcDogMjRweDsKKyAgICBtYXJnaW4tYm90dG9tOiAycHg7CisgICAgbWFyZ2luLWxlZnQ6IDEycHg7CisgICAgbWFyZ2luLXJpZ2h0OiAxMnB4OworfQorCisuTVBhcnRTdGFjayB7CisgICAgc3d0LXRhYi1yZW5kZXJlcjogdXJsKCdidW5kbGVjbGFzczovL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0LkNUYWJSZW5kZXJpbmcnKTsKKyAgICBzd3QtdW5zZWxlY3RlZC10YWJzLWNvbG9yOiAjRkZGRkZGICNGRkZGRkYgI0ZGRkZGRiAxMDAlIDEwMCU7CisgICAgc3d0LW91dGVyLWtleWxpbmUtY29sb3I6ICNGRkZGRkY7CisJc3d0LWlubmVyLWtleWxpbmUtY29sb3I6ICNGRkZGRkY7CisJc3d0LW1ydS12aXNpYmxlOiBmYWxzZTsKK30KKworLk1UcmltQmFyIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRUVGMkY3ICNERUVCRjMgMTAwJTsKK30KKworCisuTVRyaW1CYXIjb3JnLWVjbGlwc2UtdWktbWFpbi10b29sYmFyICB7CisgICAgYmFja2dyb3VuZC1pbWFnZTogIHVybCguL3dpblhQQmx1ZS5QTkcpOwkKK30KKworLk1QYXJ0U3RhY2suYWN0aXZlIHsKKwlzd3QtdW5zZWxlY3RlZC10YWJzLWNvbG9yOiAjQ0VERUY0ICNEMkUyRjkgI0ZGRkZGRiAxMDAlIDEwMCU7CisgICAgc3d0LW91dGVyLWtleWxpbmUtY29sb3I6ICNDM0QwRTk7CisJc3d0LWlubmVyLWtleWxpbmUtY29sb3I6ICNGRkZGRkY7Cit9CmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9jc3MvZTRfZGVmYXVsdF9ndGsuY3NzIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vY3NzL2U0X2RlZmF1bHRfZ3RrLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjNkMTVhCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vY3NzL2U0X2RlZmF1bHRfZ3RrLmNzcwpAQCAtMCwwICsxLDUxIEBACisKK0BpbXBvcnQgdXJsKCJlNF9iYXNlc3R5bGUuY3NzIik7CisKKy5NVHJpbW1lZFdpbmRvdyB7IAorICAgIGJhY2tncm91bmQtY29sb3I6ICNFMkUyRTI7IAorfQorCisuTVBhcnRTdGFjayB7CisJZm9udC1zaXplOiAxMTsKKwlzd3Qtc2ltcGxlOiBmYWxzZTsKKwlzd3QtbXJ1LXZpc2libGU6IGZhbHNlOworfQorCisuTVRyaW1CYXIgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNFMkUyRTI7IAorfQorCisuTVRyaW1CYXIjb3JnLWVjbGlwc2UtdWktbWFpbi10b29sYmFyICB7CisgICAgYmFja2dyb3VuZC1pbWFnZTogIHVybCguL2d0a0dyZXkuUE5HKTsJCit9CisKKy5NUGFydFN0YWNrLmFjdGl2ZSB7CisJc3d0LXVuc2VsZWN0ZWQtdGFicy1jb2xvcjogI0RDRENEQyAjRTFFMUUxICNGRkZGRkYgMTAwJSAxMDAlOworICAgIHN3dC1vdXRlci1rZXlsaW5lLWNvbG9yOiAjQjRCNEI0OworICAgIHN3dC10YWItb3V0bGluZTogI0I0QjRCNDsKK30KKworI1BlcnNwZWN0aXZlU3dpdGNoZXIgeyAKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRUJFQkVCICNFMkUyRTIgMTAwJTsKKwllY2xpcHNlLXBlcnNwZWN0aXZlLWtleWxpbmUtY29sb3I6ICNCNEI0QjQgI0I0QjRCNDsKK30KKworI29yZy1lY2xpcHNlLXVpLWVkaXRvcnNzIHsKKyAgIHN3dC10YWItcmVuZGVyZXI6IHVybCgnYnVuZGxlY2xhc3M6Ly9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC5DVGFiUmVuZGVyaW5nJyk7CisgICBzd3QtdW5zZWxlY3RlZC10YWJzLWNvbG9yOiAjRjBGMEYwICNGMEYwRjAgI0YwRjBGMCAxMDAlIDEwMCU7CisgICBzd3Qtb3V0ZXIta2V5bGluZS1jb2xvcjogI0I0QjRCNDsKKyAgIHN3dC1pbm5lci1rZXlsaW5lLWNvbG9yOiAjRjBGMEYwOworICAgc3d0LXRhYi1vdXRsaW5lOiAjRjBGMEYwOworICAgY29sb3I6ICNGMEYwRjA7CisgICBzd3QtdGFiLWhlaWdodDogOHB4OworICAgcGFkZGluZzogMHB4IDVweCA3cHg7Cit9CisKK0NUYWJGb2xkZXIuTUFyZWEgLk1QYXJ0U3RhY2ssIENUYWJGb2xkZXIuTUFyZWEgLk1QYXJ0U3RhY2suYWN0aXZlIHsKKyAgIHN3dC1zaGFkb3ctdmlzaWJsZTogZmFsc2U7Cit9CisKK0NUYWJGb2xkZXIgQ2FudmFzIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI0Y4RjhGODsKK30KKwpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vY3NzL2U0X2RlZmF1bHRfbWFjLmNzcyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2Nzcy9lNF9kZWZhdWx0X21hYy5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViNzdlZQotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2Nzcy9lNF9kZWZhdWx0X21hYy5jc3MKQEAgLTAsMCArMSw0OCBAQAorQGltcG9ydCB1cmwoImU0X2Jhc2VzdHlsZS5jc3MiKTsKKworLk1UcmltbWVkV2luZG93IHsgCisgICAgYmFja2dyb3VuZC1jb2xvcjogI0U4RThFODsKK30KKworLk1QYXJ0U3RhY2sgeworCWZvbnQtc2l6ZTogMTI7CisJc3d0LXNpbXBsZTogZmFsc2U7CisJc3d0LW1ydS12aXNpYmxlOiBmYWxzZTsKK30KKworLk1UcmltQmFyIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRThFOEU4OworfQorCisuTVRyaW1CYXIjb3JnLWVjbGlwc2UtdWktbWFpbi10b29sYmFyIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAgI0NGQ0ZDRiAjQThBOEE4IDEwMCU7CQorfQorCisuTVBhcnRTdGFjay5hY3RpdmUgeworCXN3dC11bnNlbGVjdGVkLXRhYnMtY29sb3I6ICNGNkY2RjYgI0QzRDNEMyAjRDFEMUQxICNEMUQxRDEgI0Q2RDZENiAjRDZENkQ2ICNGRkZGRkYgMjAlIDQ1JSA2MCUgNzAlIDEwMCUgMTAwJTsKKyAgICBzd3Qtb3V0ZXIta2V5bGluZS1jb2xvcjogI0M0QzVDMTsKK30KKworI1BlcnNwZWN0aXZlU3dpdGNoZXIgeworCWJhY2tncm91bmQtY29sb3I6ICNGMEYwRjAgI0U4RThFOCAxMDAlOworCWVjbGlwc2UtcGVyc3BlY3RpdmUta2V5bGluZS1jb2xvcjogIzUxNTE1MSAjNTE1MTUxOworfQorCisjb3JnLWVjbGlwc2UtdWktZWRpdG9yc3MgeworICAgc3d0LXRhYi1yZW5kZXJlcjogdXJsKCdidW5kbGVjbGFzczovL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0LkNUYWJSZW5kZXJpbmcnKTsKKyAgIHN3dC11bnNlbGVjdGVkLXRhYnMtY29sb3I6ICNENkRERTUgI0Q2RERFNSAjRDZEREU1IDEwMCUgMTAwJTsKKyAgIHN3dC1vdXRlci1rZXlsaW5lLWNvbG9yOiAjRDZEREU1OworICAgc3d0LWlubmVyLWtleWxpbmUtY29sb3I6ICNENkRERTU7CisgICBzd3QtdGFiLW91dGxpbmU6ICNENkRERTU7CisgICBjb2xvcjogI0Q2RERFNTsKKyAgIHN3dC10YWItaGVpZ2h0OiA4cHg7CisgICBwYWRkaW5nOiAwcHggNXB4IDdweDsKK30KKworQ1RhYkZvbGRlci5NQXJlYSAuTVBhcnRTdGFjaywgQ1RhYkZvbGRlci5NQXJlYSAuTVBhcnRTdGFjay5hY3RpdmUgeworICAgc3d0LXNoYWRvdy12aXNpYmxlOiBmYWxzZTsKK30KKworQ1RhYkZvbGRlciBDYW52YXMgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjBGMEYwOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2Nzcy9lNF9kZWZhdWx0X21ydV9vbl93aW43LmNzcyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2Nzcy9lNF9kZWZhdWx0X21ydV9vbl93aW43LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmYwODczCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vY3NzL2U0X2RlZmF1bHRfbXJ1X29uX3dpbjcuY3NzCkBAIC0wLDAgKzEsNDggQEAKK0BpbXBvcnQgdXJsKCJlNF9iYXNlc3R5bGUuY3NzIik7CisKKy5NVHJpbW1lZFdpbmRvdyB7IAorICAgIGJhY2tncm91bmQtY29sb3I6ICNFMUU2RjY7IAorfQorCisuTVBhcnRTdGFjayB7CisJZm9udC1zaXplOiA5OworCWZvbnQtZmFtaWx5OiAnU2Vnb2UgVUknOworCXN3dC1zaW1wbGU6IHRydWU7CisJc3d0LW1ydS12aXNpYmxlOiB0cnVlOworfQorCisuTVRyaW1CYXIgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNFMUU2RjY7IAorfQorCisuTVRyaW1CYXIjb3JnLWVjbGlwc2UtdWktbWFpbi10b29sYmFyIHsKKyAgICBiYWNrZ3JvdW5kLWltYWdlOiAgdXJsKC4vd2luNy5QTkcpOwkKK30KKworLk1QYXJ0U3RhY2suYWN0aXZlIHsKKwlzd3QtdW5zZWxlY3RlZC10YWJzLWNvbG9yOiAjRjNGOUZGICNEMERGRUUgI0NFRERFRCAjQ0VEREVEICNEMkUxRjAgI0QyRTFGMCAjRkZGRkZGIDIwJSA0NSUgNjAlIDcwJSAxMDAlIDEwMCU7CisJc3d0LW91dGVyLWtleWxpbmUtY29sb3I6ICNCNkJDQ0M7Cit9CisKKyNQZXJzcGVjdGl2ZVN3aXRjaGVyICB7CisJYmFja2dyb3VuZC1jb2xvcjogI0Y1RjdGQyAjRTFFNkY2IDEwMCU7Cit9CisKKyNvcmctZWNsaXBzZS11aS1lZGl0b3JzcyB7CisgICBzd3QtdGFiLXJlbmRlcmVyOiB1cmwoJ2J1bmRsZWNsYXNzOi8vb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3QuQ1RhYlJlbmRlcmluZycpOworICAgc3d0LXVuc2VsZWN0ZWQtdGFicy1jb2xvcjogI0YwRjBGMCAjRjBGMEYwICNGMEYwRjAgMTAwJSAxMDAlOworICAgc3d0LW91dGVyLWtleWxpbmUtY29sb3I6ICNCNEI0QjQ7CisgICBzd3QtaW5uZXIta2V5bGluZS1jb2xvcjogI0YwRjBGMDsKKyAgIHN3dC10YWItb3V0bGluZTogI0YwRjBGMDsKKyAgIGNvbG9yOiAjRjBGMEYwOworICAgc3d0LXRhYi1oZWlnaHQ6IDhweDsKKyAgIHBhZGRpbmc6IDBweCA1cHggN3B4OworfQorCitDVGFiRm9sZGVyLk1BcmVhIC5NUGFydFN0YWNrLCBDVGFiRm9sZGVyLk1BcmVhIC5NUGFydFN0YWNrLmFjdGl2ZSB7CisgICBzd3Qtc2hhZG93LXZpc2libGU6IGZhbHNlOworfQorCitDVGFiRm9sZGVyIENhbnZhcyB7CisgIGJhY2tncm91bmQtY29sb3I6ICNGOEY4Rjg7Cit9CmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9jc3MvZTRfZGVmYXVsdF93aW43LmNzcyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2Nzcy9lNF9kZWZhdWx0X3dpbjcuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZDYxMmMKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9jc3MvZTRfZGVmYXVsdF93aW43LmNzcwpAQCAtMCwwICsxLDQ4IEBACitAaW1wb3J0IHVybCgiZTRfYmFzZXN0eWxlLmNzcyIpOworCisuTVRyaW1tZWRXaW5kb3cgeyAKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRTFFNkY2OyAKK30KKworLk1QYXJ0U3RhY2sgeworCWZvbnQtc2l6ZTogOTsKKwlmb250LWZhbWlseTogJ1NlZ29lIFVJJzsKKwlzd3Qtc2ltcGxlOiB0cnVlOworCXN3dC1tcnUtdmlzaWJsZTogZmFsc2U7Cit9CisKKy5NVHJpbUJhciB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI0UxRTZGNjsgCit9CisKKy5NVHJpbUJhciNvcmctZWNsaXBzZS11aS1tYWluLXRvb2xiYXIgeworICAgIGJhY2tncm91bmQtaW1hZ2U6ICB1cmwoLi93aW43LlBORyk7CQorfQorCisuTVBhcnRTdGFjay5hY3RpdmUgeworCXN3dC11bnNlbGVjdGVkLXRhYnMtY29sb3I6ICNGM0Y5RkYgI0QwREZFRSAjQ0VEREVEICNDRURERUQgI0QyRTFGMCAjRDJFMUYwICNGRkZGRkYgMjAlIDQ1JSA2MCUgNzAlIDEwMCUgMTAwJTsKKwlzd3Qtb3V0ZXIta2V5bGluZS1jb2xvcjogI0I2QkNDQzsKK30KKworI1BlcnNwZWN0aXZlU3dpdGNoZXIgIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjRjVGN0ZDICNFMUU2RjYgMTAwJTsKK30KKworI29yZy1lY2xpcHNlLXVpLWVkaXRvcnNzIHsKKyAgIHN3dC10YWItcmVuZGVyZXI6IHVybCgnYnVuZGxlY2xhc3M6Ly9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC9vcmcuZWNsaXBzZS5lNC51aS53b3JrYmVuY2gucmVuZGVyZXJzLnN3dC5DVGFiUmVuZGVyaW5nJyk7CisgICBzd3QtdW5zZWxlY3RlZC10YWJzLWNvbG9yOiAjRjBGMEYwICNGMEYwRjAgI0YwRjBGMCAxMDAlIDEwMCU7CisgICBzd3Qtb3V0ZXIta2V5bGluZS1jb2xvcjogI0I0QjRCNDsKKyAgIHN3dC1pbm5lci1rZXlsaW5lLWNvbG9yOiAjRjBGMEYwOworICAgc3d0LXRhYi1vdXRsaW5lOiAjRjBGMEYwOworICAgY29sb3I6ICNGMEYwRjA7CisgICBzd3QtdGFiLWhlaWdodDogOHB4OworICAgcGFkZGluZzogMHB4IDVweCA3cHg7Cit9CisKK0NUYWJGb2xkZXIuTUFyZWEgLk1QYXJ0U3RhY2ssIENUYWJGb2xkZXIuTUFyZWEgLk1QYXJ0U3RhY2suYWN0aXZlIHsKKyAgIHN3dC1zaGFkb3ctdmlzaWJsZTogZmFsc2U7Cit9CisKK0NUYWJGb2xkZXIgQ2FudmFzIHsKKyAgYmFja2dyb3VuZC1jb2xvcjogI0Y4RjhGODsKK30KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2Nzcy9lNF9kZWZhdWx0X3dpbnhwX2JsdS5jc3MgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9jc3MvZTRfZGVmYXVsdF93aW54cF9ibHUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YzkwYmQKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9jc3MvZTRfZGVmYXVsdF93aW54cF9ibHUuY3NzCkBAIC0wLDAgKzEsNTAgQEAKK0BpbXBvcnQgdXJsKCJlNF9iYXNlc3R5bGUuY3NzIik7CisKKy5NVHJpbW1lZFdpbmRvdyB7IAorIAliYWNrZ3JvdW5kLWNvbG9yOiAjRjBFQ0UwOyAKK30KKworLk1QYXJ0U3RhY2sgeworCWZvbnQtc2l6ZTogOTsKKwlzd3Qtc2ltcGxlOiB0cnVlOworCXN3dC1tcnUtdmlzaWJsZTogZmFsc2U7Cit9CisKKy5NVHJpbUJhciB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI0YwRUNFMDsgCit9CisKKworLk1UcmltQmFyI29yZy1lY2xpcHNlLXVpLW1haW4tdG9vbGJhciAgeworICAgIGJhY2tncm91bmQtaW1hZ2U6ICB1cmwoLi93aW5YUEJsdWUuUE5HKTsJCit9CisKKy5NUGFydFN0YWNrLmFjdGl2ZSB7CisJc3d0LXVuc2VsZWN0ZWQtdGFicy1jb2xvcjogI0YxRjRGRCAjQzlEQUYzICNCRUQ0RjEgI0JFRDRGMSAjQzlEN0YyICNDOUQ3RjIgI0ZGRkZGRiAyMCUgNDUlIDYwJSA3MCUgMTAwJSAxMDAlOworICAgIHN3dC1vdXRlci1rZXlsaW5lLWNvbG9yOiAjQjhDN0U1OworfQorCisjUGVyc3BlY3RpdmVTd2l0Y2hlciAgeworCWJhY2tncm91bmQtY29sb3I6ICNGNUYzRUQgI0YwRUNFMCAxMDAlOworCWVjbGlwc2UtcGVyc3BlY3RpdmUta2V5bGluZS1jb2xvcjogIzdGOTFCNSAjN0Y5MUI1OworfQorCisjb3JnLWVjbGlwc2UtdWktZWRpdG9yc3MgeworICAgc3d0LXRhYi1yZW5kZXJlcjogdXJsKCdidW5kbGVjbGFzczovL29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0L29yZy5lY2xpcHNlLmU0LnVpLndvcmtiZW5jaC5yZW5kZXJlcnMuc3d0LkNUYWJSZW5kZXJpbmcnKTsKKyAgIHN3dC11bnNlbGVjdGVkLXRhYnMtY29sb3I6ICNGMEYwRjAgI0YwRjBGMCAjRjBGMEYwIDEwMCUgMTAwJTsKKyAgIHN3dC1vdXRlci1rZXlsaW5lLWNvbG9yOiAjQjRCNEI0OworICAgc3d0LWlubmVyLWtleWxpbmUtY29sb3I6ICNGMEYwRjA7CisgICBzd3QtdGFiLW91dGxpbmU6ICNGMEYwRjA7CisgICBjb2xvcjogI0YwRjBGMDsKKyAgIHN3dC10YWItaGVpZ2h0OiA4cHg7CisgICBwYWRkaW5nOiAwcHggNXB4IDdweDsKK30KKworQ1RhYkZvbGRlci5NQXJlYSAuTVBhcnRTdGFjaywgQ1RhYkZvbGRlci5NQXJlYSAuTVBhcnRTdGFjay5hY3RpdmUgeworICAgc3d0LXNoYWRvdy12aXNpYmxlOiBmYWxzZTsKK30KKworQ1RhYkZvbGRlciBDYW52YXMgeworICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjhGOEY4OworfQorCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9jc3MvZTRfZGVmYXVsdF93aW54cF9vbHYuY3NzIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vY3NzL2U0X2RlZmF1bHRfd2lueHBfb2x2LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTNkYzE2Ci0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vY3NzL2U0X2RlZmF1bHRfd2lueHBfb2x2LmNzcwpAQCAtMCwwICsxLDQyIEBACisKKworLk1UcmltbWVkV2luZG93IHsgCisgICAgbWFyZ2luLXRvcDogMnB4OworICAgIG1hcmdpbi1ib3R0b206IDJweDsKKyAgICBtYXJnaW4tbGVmdDogMnB4OworICAgIG1hcmdpbi1yaWdodDogMnB4OworfQorCisuTVRyaW1tZWRXaW5kb3cudG9wTGV2ZWwgeyAKKyAgICBtYXJnaW4tdG9wOiAyNHB4OworICAgIG1hcmdpbi1ib3R0b206IDJweDsKKyAgICBtYXJnaW4tbGVmdDogMTJweDsKKyAgICBtYXJnaW4tcmlnaHQ6IDEycHg7Cit9CisKKy5NUGFydFN0YWNrIHsKKyAgICBzd3QtdGFiLXJlbmRlcmVyOiB1cmwoJ2J1bmRsZWNsYXNzOi8vb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3Qvb3JnLmVjbGlwc2UuZTQudWkud29ya2JlbmNoLnJlbmRlcmVycy5zd3QuQ1RhYlJlbmRlcmluZycpOworICAgIHN3dC11bnNlbGVjdGVkLXRhYnMtY29sb3I6ICNGRkZGRkYgI0ZGRkZGRiAjRkZGRkZGIDEwMCUgMTAwJTsKKyAgICBzd3Qtb3V0ZXIta2V5bGluZS1jb2xvcjogI0ZGRkZGRjsKKwlzd3QtaW5uZXIta2V5bGluZS1jb2xvcjogI0ZGRkZGRjsKKwlmb250LXNpemU6IDk7CisJc3d0LXNpbXBsZTogdHJ1ZTsKKwlwYWRkaW5nOiAwcHggMTBweCAxMXB4OworCXN3dC1tcnUtdmlzaWJsZTogZmFsc2U7Cit9CisKKy5NVHJpbUJhciNvcmctZWNsaXBzZS11aS1tYWluLXRvb2xiYXIgeworICAgIGJhY2tncm91bmQtaW1hZ2U6ICB1cmwoLi93aW5YUE9saXZlLlBORyk7CQorfQorCisuTVBhcnRTdGFjay5hY3RpdmUgeworCXN3dC11bnNlbGVjdGVkLXRhYnMtY29sb3I6ICNFNkUzQzMgI0VERUFDQSAjRkZGRkZGIDEwMCUgMTAwJTsKKyAgICBzd3Qtb3V0ZXIta2V5bGluZS1jb2xvcjogI0JGQ0RBNDsKKwlzd3QtaW5uZXIta2V5bGluZS1jb2xvcjogI0ZGRkZGRjsKKwlzd3QtdGFiLW91dGxpbmU6ICNCNkJDQ0M7Cit9CisKKyNQZXJzcGVjdGl2ZVN3aXRjaGVyICB7CisJYmFja2dyb3VuZC1jb2xvcjogI0Y1RjNFRCAjRjBFQ0UwIDEwMCU7CisJZWNsaXBzZS1wZXJzcGVjdGl2ZS1rZXlsaW5lLWNvbG9yOiAjQTdCNjgwICNBN0I2ODA7Cit9CmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9lY2xpcHNlX2xnLmdpZiBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2VjbGlwc2VfbGcuZ2lmCmluZGV4IGJmOGI4NzIuLmMwMDRiZjIgMTAwNjQ0Ci0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2VjbGlwc2VfbGcuZ2lmCisrKyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2VjbGlwc2VfbGcuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy9ndGtHcmV5LlBORyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy9ndGtHcmV5LlBORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGQ2MzFkCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL2d0a0dyZXkuUE5HCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy9tYWNHcmV5LlBORyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy9tYWNHcmV5LlBORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTA3NWFkCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL21hY0dyZXkuUE5HCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy93aW43LlBORyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy93aW43LlBORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWJmMDlkCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3dpbjcuUE5HCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy93aW5YUEJsdWUuUE5HIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3dpblhQQmx1ZS5QTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMyNzk2NAotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy93aW5YUEJsdWUuUE5HCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy93aW5YUEhhbmRsZS5QTkcgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbWFnZXMvd2luWFBIYW5kbGUuUE5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZWI2OWEKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbWFnZXMvd2luWFBIYW5kbGUuUE5HCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy93aW5YUE9saXZlLlBORyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy93aW5YUE9saXZlLlBORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzQ1ZWUxCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3dpblhQT2xpdmUuUE5HCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy93aW5YUFRTRnJhbWUuUE5HIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzL3dpblhQVFNGcmFtZS5QTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFmNDViOQotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ltYWdlcy93aW5YUFRTRnJhbWUuUE5HCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ludHJvL3doYXRzbmV3RXh0ZW5zaW9uQ29udGVudDMueG1sIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW50cm8vd2hhdHNuZXdFeHRlbnNpb25Db250ZW50My54bWwKaW5kZXggNTI5MjAzMS4uMjg2NjhlMSAxMDA2NDQKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW50cm8vd2hhdHNuZXdFeHRlbnNpb25Db250ZW50My54bWwKKysrIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW50cm8vd2hhdHNuZXdFeHRlbnNpb25Db250ZW50My54bWwKQEAgLTIsOCArMiw4IEBACiA8aW50cm9Db250ZW50PgogICAJPGV4dGVuc2lvbkNvbnRlbnQgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5taWdyYXRpb24iIG5hbWU9IlBvcnRpbmcgR3VpZGUiIGFsdC1zdHlsZT0iY3NzL3doYXRzbmV3LnByb3BlcnRpZXMiIHN0eWxlPSJjc3Mvd2hhdHNuZXcuY3NzIiBwYXRoPSJ3aGF0c25ldy9AIj4KIAkJPGdyb3VwIGZpbHRlcj0icGx1Z2luPW9yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy5pc3YiIHN0eWxlLWlkPSJjb250ZW50LWdyb3VwIiBpZD0iY29udGVudC1ncm91cCI+Ci0gICAgICAgCQk8bGluayBsYWJlbD0iTWlncmF0aW9uIGZyb20gdGhlIHByZXZpb3VzIHJlbGVhc2UiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy5pc3YvcG9ydGluZy9lY2xpcHNlXzNfN19wb3J0aW5nX2d1aWRlLmh0bWwiIGlkPSJtaWdyYXRpb24iIHN0eWxlLWlkPSJjb250ZW50LWxpbmsiPgotICAgICAgICAgIAkJPHRleHQ+TGVhcm4gd2hhdCB5b3UgbmVlZCB0byBkbyB0byBtYWtlIHlvdXIgb2xkIGNvZGUgd29yayBpbiBFY2xpcHNlIDMuNzwvdGV4dD4KKyAgICAgICAJCTxsaW5rIGxhYmVsPSJNaWdyYXRpb24gZnJvbSB0aGUgcHJldmlvdXMgcmVsZWFzZSIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLmlzdi9wb3J0aW5nL2VjbGlwc2VfNF8yX3BvcnRpbmdfZ3VpZGUuaHRtbCIgaWQ9Im1pZ3JhdGlvbiIgc3R5bGUtaWQ9ImNvbnRlbnQtbGluayI+CisgICAgICAgICAgCQk8dGV4dD5MZWFybiB3aGF0IHlvdSBuZWVkIHRvIGRvIHRvIG1ha2UgeW91ciBvbGQgY29kZSB3b3JrIGluIEVjbGlwc2UgNC4yPC90ZXh0PgogICAgICAgIAkJPC9saW5rPgogICAgICAgIAk8L2dyb3VwPgogICAJPC9leHRlbnNpb25Db250ZW50PgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vcGx1Z2luLnByb3BlcnRpZXMgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9wbHVnaW4ucHJvcGVydGllcwppbmRleCA5ZjNmOTEyLi5kMzIyMmZkIDEwMDY0NAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9wbHVnaW4ucHJvcGVydGllcworKysgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9wbHVnaW4ucHJvcGVydGllcwpAQCAtMSw1ICsxLDUgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNCwxMCArMTQsMTAgQEAKIHByb2R1Y3ROYW1lPUVjbGlwc2UgUGxhdGZvcm0KIHByb2R1Y3RCbHVyYj1FY2xpcHNlIFBsYXRmb3JtXG5cCiBcblwKLVZlcnNpb246IDMuOC4wXG5cCitWZXJzaW9uOiA0LjIuMFxuXAogQnVpbGQgaWQ6IHswfVxuXAogXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAxMS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCisoYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAxMi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCiBWaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtXG5cCiBcblwKIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlXG5cCkBAIC00MCwzICs0MCwyNSBAQAogaW50cm9EZXNjcmlwdGlvbi1vdmVydmlldyA9IFRoZSBFY2xpcHNlIFBsYXRmb3JtIGlzIGEga2luZCBvZiB1bml2ZXJzYWwgdG9vbCBwbGF0Zm9ybSAtIGFuIG9wZW4gZXh0ZW5zaWJsZSBJREUgZm9yIGFueXRoaW5nIGFuZCBub3RoaW5nIGluIHBhcnRpY3VsYXIuIAogaW50cm9EZXNjcmlwdGlvbi10dXRvcmlhbHMgPSBMZWFybiBob3cgdG8gYmUgcHJvZHVjdGl2ZSB1c2luZyBFY2xpcHNlIGJ5IGNvbXBsZXRpbmcgZW5kLXRvLWVuZCB0dXRvcmlhbHMgdGhhdCB3aWxsIGd1aWRlIHlvdSBhbG9uZyB0aGUgd2F5LgogaW50cm9EZXNjcmlwdGlvbi1zYW1wbGVzID0gRXhwbG9yZSBFY2xpcHNlIGJ5IGluc3RhbGxpbmcgcHJlZmFicmljYXRlZCBzYW1wbGVzIChtYXkgcmVxdWlyZSBJbnRlcm5ldCBjb25uZWN0aW9uKS4KKwordGhlbWUuZGVmYXVsdCA9IERlZmF1bHQgVGhlbWUKK3RoZW1lLmNsYXNzaWMgPSBDbGFzc2ljCit0aGVtZS5ndGsgPSBHVEsKK3RoZW1lLm1hYyA9IE1hYwordGhlbWUud2luNyA9IFdpbmRvd3MgNwordGhlbWUud2lueHBCbHVlID0gV2luZG93cyBYUCBCbHVlCit0aGVtZS53aW54cE9saXZlID0gV2luZG93cyBYUCBPbGl2ZQordGhlbWUud2luN0NsYXNzaWMgPSBXaW5kb3dzIDcgQ2xhc3NpYwordGhlbWUuc29sYXJpcyA9IFNvbGFyaXMKK3RoZW1lLmFpeCA9IEFJWAordGhlbWUuaHB1eCA9IEhQVVgKKwordHJpbW1lZHdpbmRvdy5sYWJlbC4xID0gRWNsaXBzZSBTREsgNC4wCitjb21tYW5kLm5hbWUuZXhpdCA9IEV4aXQKK2NvbW1hbmQubmFtZS5zaG93VmlldyA9IFNob3cgVmlldworY29tbWFuZC5uYW1lLnNhdmUgPSBTYXZlCitjb21tYW5kLm5hbWUuc2F2ZUFsbCA9IFNhdmUgQWxsCitiaW5kaW5nY29udGV4dC5uYW1lLmRpYWxvZ0FuZFdpbmRvd3MgPSBJbiBEaWFsb2cgYW5kIFdpbmRvd3MKK2JpbmRpbmdjb250ZXh0Lm5hbWUud2luZG93cyA9IEluIFdpbmRvd3MKK2JpbmRpbmdjb250ZXh0Lm5hbWUuYmluZGluZ1ZpZXcgPSBJbiBCaW5kaW5nIFZpZXcKK2JpbmRpbmdjb250ZXh0Lm5hbWUuZGlhbG9ncyA9IEluIERpYWxvZ3MKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL3BsdWdpbi54bWwgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9wbHVnaW4ueG1sCmluZGV4IGZkN2UyZWIuLmNiMzA3M2IgMTAwNjQ0Ci0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL3BsdWdpbi54bWwKKysrIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vcGx1Z2luLnhtbApAQCAtMTEsMTMgKzExLDEzIEBACiAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InByZWZlcmVuY2VDdXN0b21pemF0aW9uIiB2YWx1ZT0icGx1Z2luX2N1c3RvbWl6YXRpb24uaW5pIi8+IAogICAgICAgICAgIDxwcm9wZXJ0eQogICAgICAgICAgICAgICAgIG5hbWU9InN0YXJ0dXBGb3JlZ3JvdW5kQ29sb3IiCi0gICAgICAgICAgICAgICAgdmFsdWU9IkM4RDVFQSIvPgorICAgICAgICAgICAgICAgIHZhbHVlPSJGRkZGRkYiLz4KICAgICAgICAgICA8cHJvcGVydHkKICAgICAgICAgICAgICAgICBuYW1lPSJzdGFydHVwTWVzc2FnZVJlY3QiCi0gICAgICAgICAgICAgICAgdmFsdWU9IjcsMjIwLDQ0MSwyMCIvPgorICAgICAgICAgICAgICAgIHZhbHVlPSI3LDIyNSwzMjAsMjAiLz4KICAgICAgICAgICA8cHJvcGVydHkKICAgICAgICAgICAgICAgICBuYW1lPSJzdGFydHVwUHJvZ3Jlc3NSZWN0IgotICAgICAgICAgICAgICAgIHZhbHVlPSIwLDI4MCw0NTUsMTUiLz4KKyAgICAgICAgICAgICAgICB2YWx1ZT0iMiwyOTAsNDQ4LDEwIi8+CiAgICAgICAgICA8cHJvcGVydHkKICAgICAgICAgICAJCW5hbWU9ImludHJvVGl0bGUiCiAgICAgICAgICAgCQl2YWx1ZT0iJXByb2R1Y3RJbnRyb1RpdGxlIi8+CkBAIC0zNiw2ICszNiwxOCBAQAogCQkgIDxwcm9wZXJ0eQogCQkJCW5hbWU9ImludHJvRGVzY3JpcHRpb24tc2FtcGxlcyIKIAkJCQl2YWx1ZT0iJWludHJvRGVzY3JpcHRpb24tc2FtcGxlcyIvPiAgICAgICAgICAgICAgICAKKwkJICA8cHJvcGVydHkKKwkJCQluYW1lPSJhcHBsaWNhdGlvblhNSSIKKwkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UucGxhdGZvcm0vTGVnYWN5SURFLmU0eG1pIj4KKwkJICA8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eQorCQkJCW5hbWU9ImNzc1RoZW1lIgorCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5lNC51aS5jc3MudGhlbWUuZTRfZGVmYXVsdCI+CisJCSAgPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkKKwkJCQluYW1lPSJhcHBsaWNhdGlvbkNTU1Jlc291cmNlcyIKKyAgICAgICAgICB2YWx1ZT0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbWFnZXMvIj4KKwkJICA8L3Byb3BlcnR5PgogICAgICAgPC9wcm9kdWN0PiAKICAgIDwvZXh0ZW5zaW9uPiAKICAgIApAQCAtMTEyLDUgKzEyNCw3NCBAQAogICAgICAgICAgPC9hY3Rpb24+CiAgICAgICA8L2FjdGlvblNldD4KICAgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmU0LnVpLmNzcy5zd3QudGhlbWUiPgorICAgICAgPHRoZW1lCisgICAgICAgICAgICBiYXNlc3R5bGVzaGVldHVyaT0iY3NzL2U0X2RlZmF1bHQuY3NzIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmU0LnVpLmNzcy50aGVtZS5lNF9kZWZhdWx0Lm5vb3MiCisgICAgICAgICAgICBsYWJlbD0iJXRoZW1lLmRlZmF1bHQiPgorICAgICAgPC90aGVtZT4KKyAgICAgIDx0aGVtZQorICAgICAgICAgICAgYmFzZXN0eWxlc2hlZXR1cmk9ImNzcy9lNF9jbGFzc2ljX3dpbnhwLmNzcyIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lNC51aS5jc3MudGhlbWUuZTRfY2xhc3NpYyIKKyAgICAgICAgICAgIGxhYmVsPSIldGhlbWUuY2xhc3NpYyI+CisgICAgICA8L3RoZW1lPgorICAgICAgPHRoZW1lCisgICAgICAgICAgICBiYXNlc3R5bGVzaGVldHVyaT0iY3NzL2U0X2RlZmF1bHRfZ3RrLmNzcyIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lNC51aS5jc3MudGhlbWUuZTRfZGVmYXVsdCIKKyAgICAgICAgICAgIGxhYmVsPSIldGhlbWUuZ3RrIgorICAgICAgICAgICAgb3M9ImxpbnV4Ij4KKyAgICAgIDwvdGhlbWU+CisgICAgICA8dGhlbWUKKyAgICAgICAgICAgIGJhc2VzdHlsZXNoZWV0dXJpPSJjc3MvZTRfZGVmYXVsdF9tYWMuY3NzIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmU0LnVpLmNzcy50aGVtZS5lNF9kZWZhdWx0IgorICAgICAgICAgICAgbGFiZWw9IiV0aGVtZS5tYWMiCisgICAgICAgICAgICBvcz0ibWFjb3N4Ij4KKyAgICAgIDwvdGhlbWU+CisgICAgICA8dGhlbWUKKyAgICAgICAgICAgIGJhc2VzdHlsZXNoZWV0dXJpPSJjc3MvZTRfZGVmYXVsdF93aW43LmNzcyIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lNC51aS5jc3MudGhlbWUuZTRfZGVmYXVsdCIKKyAgICAgICAgICAgIGxhYmVsPSIldGhlbWUud2luNyIKKyAgICAgICAgICAgIG9zPSJ3aW4zMiIKKyAgICAgICAgICAgIG9zX3ZlcnNpb249IjYuMSI+CisgICAgICA8L3RoZW1lPgorICAgICAgICAgICAgPHRoZW1lCisgICAgICAgICAgICAgICAgICBiYXNlc3R5bGVzaGVldHVyaT0iY3NzL2U0X2RlZmF1bHRfd2lueHBfYmx1LmNzcyIKKyAgICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lNC51aS5jc3MudGhlbWUuZTRfZGVmYXVsdCIKKyAgICAgICAgICAgICAgICAgIGxhYmVsPSIldGhlbWUud2lueHBCbHVlIgorICAgICAgICAgICAgICAgICAgb3M9IndpbjMyIj4KKyAgICAgIDwvdGhlbWU+CisJICA8dGhlbWUKKyAgICAgICAgICAgIGJhc2VzdHlsZXNoZWV0dXJpPSJjc3MvZTRfZGVmYXVsdF93aW54cF9vbHYuY3NzIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmU0LnVpLmNzcy50aGVtZS5lNF9kZWZhdWx0Lnhwb2xpdmUiCisgICAgICAgICAgICBsYWJlbD0iJXRoZW1lLndpbnhwT2xpdmUiCisgICAgICAgICAgICBvcz0id2luMzIiPgorICAgICAgPC90aGVtZT4KKyAgIDx0aGVtZQorICAgICAgICAgYmFzZXN0eWxlc2hlZXR1cmk9ImNzcy9lNF9jbGFzc2ljX3dpbjcuY3NzIgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmU0LnVpLmNzcy50aGVtZS5lNF9jbGFzc2ljIgorICAgICAgICAgbGFiZWw9IiV0aGVtZS53aW43Q2xhc3NpYyIKKyAgICAgICAgIG9zPSJ3aW4zMiIKKyAgICAgICAgIG9zX3ZlcnNpb249IjYuMSI+CisgICA8L3RoZW1lPgorICAgPHRoZW1lCisgICAgICAgICBiYXNlc3R5bGVzaGVldHVyaT0iY3NzL2U0X2RlZmF1bHRfZ3RrLmNzcyIKKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lNC51aS5jc3MudGhlbWUuZTRfZGVmYXVsdCIKKyAgICAgICAgIGxhYmVsPSIldGhlbWUuc29sYXJpcyIKKyAgICAgICAgIG9zPSJzb2xhcmlzIj4KKyAgIDwvdGhlbWU+CisgICA8dGhlbWUKKyAgICAgICAgIGJhc2VzdHlsZXNoZWV0dXJpPSJjc3MvZTRfZGVmYXVsdF9ndGsuY3NzIgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmU0LnVpLmNzcy50aGVtZS5lNF9kZWZhdWx0IgorICAgICAgICAgbGFiZWw9IiV0aGVtZS5haXgiCisgICAgICAgICBvcz0iYWl4Ij4KKyAgIDwvdGhlbWU+CisgICA8dGhlbWUKKyAgICAgICAgIGJhc2VzdHlsZXNoZWV0dXJpPSJjc3MvZTRfY2xhc3NpY193aW54cC5jc3MiCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZTQudWkuY3NzLnRoZW1lLmU0X2RlZmF1bHQiCisgICAgICAgICBsYWJlbD0iJXRoZW1lLmhwdXgiCisgICAgICAgICBvcz0iaHB1eCI+CisgICA8L3RoZW1lPgorICAgICAgPC9leHRlbnNpb24+CiAKIDwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vc3BsYXNoLmJtcCBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL3NwbGFzaC5ibXAKaW5kZXggMjM2YmZiMS4uYzFjYzM4NyAxMDA2NDQKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vc3BsYXNoLmJtcAorKysgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9zcGxhc2guYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBmNTViZWNmLi44ODJlODNmIDEwMDY0NAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0yLDcgKzIsNyBAQAogQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgogQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5zZGs7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDMuOC4wLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDQuMi4wLnF1YWxpZmllcgogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLApkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2J1aWxkLnByb3BlcnRpZXMgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvYnVpbGQucHJvcGVydGllcwppbmRleCAwOTQ0MjhjLi5iMmIyMDczIDEwMDY0NAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvYnVpbGQucHJvcGVydGllcworKysgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvYnVpbGQucHJvcGVydGllcwpAQCAtMSw1ICsxLDUgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zMCw0ICszMCw0IEBACiAgICAgICAgICAgICAgICBtYWNvc3hfbmFycm93X2Jvb2suY3NzLFwKICAgICAgICAgICAgICAgIGludHJvRGF0YS54bWwsXAogICAgICAgICAgICAgICAgaW50cm8tZWNsaXBzZS5wbmcsXAotICAgICAgICAgICAgICAgaGVscERhdGEueG1sCisgICAgICAgICAgICAgICBoZWxwRGF0YS54bWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvZWNsaXBzZV9sZy5naWYgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvZWNsaXBzZV9sZy5naWYKaW5kZXggYmY4Yjg3Mi4uYzAwNGJmMiAxMDA2NDQKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2VjbGlwc2VfbGcuZ2lmCisrKyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9lY2xpcHNlX2xnLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvcGx1Z2luLnByb3BlcnRpZXMgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvcGx1Z2luLnByb3BlcnRpZXMKaW5kZXggODM2NjI4Ni4uZTk1ZGJiYiAxMDA2NDQKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9wbHVnaW4ucHJvcGVydGllcwpAQCAtMSw1ICsxLDUgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNCwxMCArMTQsMTAgQEAKIHByb2R1Y3ROYW1lPUVjbGlwc2UgU0RLCiBwcm9kdWN0Qmx1cmI9RWNsaXBzZSBTREtcblwKIFxuXAotVmVyc2lvbjogMy44LjBcblwKK1ZlcnNpb246IDQuMi4wXG5cCiBCdWlsZCBpZDogezB9XG5cCiBcblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDExLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKKyhjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDEyLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKIFZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGxhdGZvcm1cblwKIFxuXAogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGVcblwKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9wbHVnaW4ueG1sIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL3BsdWdpbi54bWwKaW5kZXggNzAzYzA3ZS4uMDRjMzFmNyAxMDA2NDQKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL3BsdWdpbi54bWwKKysrIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL3BsdWdpbi54bWwKQEAgLTEwLDE0ICsxMCwxNCBAQAogICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhcHBOYW1lIiB2YWx1ZT0iRWNsaXBzZSIvPiAKICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icHJlZmVyZW5jZUN1c3RvbWl6YXRpb24iIHZhbHVlPSJwbHVnaW5fY3VzdG9taXphdGlvbi5pbmkiLz4KICAgICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgICBuYW1lPSJzdGFydHVwRm9yZWdyb3VuZENvbG9yIgotICAgICAgICAgICAgICAgIHZhbHVlPSJDOEQ1RUEiLz4KKyAgICAgICAgCQluYW1lPSJzdGFydHVwRm9yZWdyb3VuZENvbG9yIgorICAgICAgICAJCXZhbHVlPSJGRkZGRkYiLz4KICAgICAgICAgICA8cHJvcGVydHkKICAgICAgICAgICAgICAgICBuYW1lPSJzdGFydHVwTWVzc2FnZVJlY3QiCi0gICAgICAgICAgICAgICAgdmFsdWU9IjcsMjIwLDQ0MSwyMCIvPgorICAgICAgICAgICAgICAgIHZhbHVlPSI3LDIyNSwzMjAsMjAiLz4KICAgICAgICAgICA8cHJvcGVydHkKICAgICAgICAgICAgICAgICBuYW1lPSJzdGFydHVwUHJvZ3Jlc3NSZWN0IgotICAgICAgICAgICAgICAgIHZhbHVlPSIwLDI4MCw0NTUsMTUiLz4gCisgICAgICAgICAgICAgICAgdmFsdWU9IjIsMjkwLDQ0OCwxMCIvPgogICAgICAgICAgIDxwcm9wZXJ0eQogICAgICAgICAgIAkJbmFtZT0iaW50cm9UaXRsZSIKICAgICAgICAgICAJCXZhbHVlPSIlcHJvZHVjdEludHJvVGl0bGUiLz4KQEAgLTM2LDkgKzM2LDI1IEBACiAJCSAgPHByb3BlcnR5CiAJCQkJbmFtZT0iaW50cm9EZXNjcmlwdGlvbi1zYW1wbGVzIgogCQkJCXZhbHVlPSIlaW50cm9EZXNjcmlwdGlvbi1zYW1wbGVzIi8+CisJCSAgPHByb3BlcnR5CisJCQkJbmFtZT0iYXBwbGljYXRpb25YTUkiCisJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLnBsYXRmb3JtL0xlZ2FjeUlERS5lNHhtaSI+CisJCSAgPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkKKwkJCQluYW1lPSJjc3NUaGVtZSIKKwkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuZTQudWkuY3NzLnRoZW1lLmU0X2RlZmF1bHQiPgorCQkgIDwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5CisJCQkJbmFtZT0iYXBwbGljYXRpb25DU1NSZXNvdXJjZXMiCisgICAgICAgICAgdmFsdWU9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW1hZ2VzLyI+CisJCSAgPC9wcm9wZXJ0eT4KICAgICA8cHJvcGVydHkKICAgICAgICAgICBuYW1lPSJidWlsZElkTG9jYXRpb24iCi0gICAgICAgICAgdmFsdWU9IjMxMiwxOTAiPgorICAgICAgICAgIHZhbHVlPSIzMDAsMTgwIj4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eQorICAgICAgICAgIG5hbWU9ImJ1aWxkSWRTaXplIgorICAgICAgICAgIHZhbHVlPSIxNDAsNDAiPgogICAgIDwvcHJvcGVydHk+CiAgICAgICA8L3Byb2R1Y3Q+IAogICAgIDwvZXh0ZW5zaW9uPiAKQEAgLTMxMyw1ICszMjksNSBAQAogICAgICAgCQk8L3BhcmFtPgogICAgICAgPC9lbmdpbmU+CiAgICAgPC9leHRlbnNpb24+Ci0KKyAgICAKIDwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvLmNsYXNzcGF0aCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzM5MzMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci8uY3ZzaWdub3JlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0NjNhZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvLm9wdGlvbnMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJjNzE0Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIyBEZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgdGhlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IgcGx1Z2luCi0KLSMgVHVybiBvbiBnZW5lcmFsIGRlYnVnZ2luZyBmb3IgdGhlIHBsdWdpbi4KLW9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvZGVidWc9ZmFsc2UKLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIxM2ExMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3I8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5kcy5jb3JlLmJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3OTBjMzIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotI0ZyaSBOb3YgMDcgMTU6NTc6NTQgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uY29tcGFyaW5nSWRlbnRpY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSGFzaENvZGVNZXRob2Q9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU3luY2hyb25pemVkT25Jbmhlcml0ZWRNZXRob2Q9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFN1cGVyaW50ZXJmYWNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkV4ZW1wdEV4Y2VwdGlvbkFuZFRocm93YWJsZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL09TR0ktSU5GL2J1bmRsZUdyb3VwLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL09TR0ktSU5GL2J1bmRsZUdyb3VwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNkMzcxNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9PU0dJLUlORi9idW5kbGVHcm91cC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2NyOmNvbXBvbmVudCB4bWxuczpzY3I9Imh0dHA6Ly93d3cub3NnaS5vcmcveG1sbnMvc2NyL3YxLjEuMCIgaW1tZWRpYXRlPSJmYWxzZSIgbmFtZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5idW5kbGVncm91cCI+Ci0gICA8aW1wbGVtZW50YXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuQnVuZGxlR3JvdXBDb21wb25lbnQiLz4KLSAgIDxzZXJ2aWNlPgotICAgICAgPHByb3ZpZGUgaW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUJ1bmRsZUdyb3VwUHJvdmlkZXIiLz4KLSAgIDwvc2VydmljZT4KLTwvc2NyOmNvbXBvbmVudD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL2Fib3V0Lmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvYnVpbGQucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NzQ2MjIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgT1NHSS1JTkYvCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi1zb3VyY2UuLiA9IHNyYy8KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MjRhN2YuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPSBJbnN0YWxsL1VwZGF0ZSBDb25maWd1cmF0b3IKLXByb3ZpZGVyTmFtZT0gRWNsaXBzZS5vcmcKLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0b3IvcGFja2FnZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0b3IvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTBmOWY2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdG9yL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJBdXRob3IiIGNvbnRlbnQ9IklCTSI+Ci0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC43MiBbZW5dIChXaW5kb3dzIE5UIDUuMDsgVSkgW05ldHNjYXBlXSI+Ci0gICA8dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotUHJvdmlkZXMgc3VwcG9ydCBmb3IgYWNjZXNzaW5nIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gZGF0YS4KLTxoMj4KLVBhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+Ci1UaGlzIHBhY2thZ2UgY29udGFpbnMgaW50ZXJmYWNlcyBmb3IgYWNjZXNzaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlIGxvY2FsCi1zeXN0ZW0gaW5zdGFsbGF0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiAKLTxwPgotPGI+Tm90ZTo8L2I+IFRoaXMgcGFja2FnZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi1jaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLWZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0ocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvQnVuZGxlTWFuaWZlc3QuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0J1bmRsZU1hbmlmZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNjEyNGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvQnVuZGxlTWFuaWZlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmFtZXMgRCBNaWxlcyAoSUJNIENvcnAuKSAtIGJ1ZyAxODI2NjYsIHRyaW0gc3BhY2VzIGZyb20gdmVyc2lvbiBpZAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3I7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5qYXIuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotLyoqCi0gKiBQYXJzZXMgTUFOSUZFU1QuTUYKLSAqLwotcHVibGljIGNsYXNzIEJ1bmRsZU1hbmlmZXN0IGltcGxlbWVudHMgSUNvbmZpZ3VyYXRpb25Db25zdGFudHMgewotCXByaXZhdGUgRmlsZSBtYW5pZmVzdEZpbGU7Ci0JcHJpdmF0ZSBQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeTsKLQlwcml2YXRlIElPRXhjZXB0aW9uIGV4Y2VwdGlvbjsKLQlwcml2YXRlIFN0cmluZyBidW5kbGVVUkw7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIGxvY2FsIGZpbGUKLQkgKi8KLQlwdWJsaWMgQnVuZGxlTWFuaWZlc3QoRmlsZSBtYW5pZmVzdCkgewotCQlzdXBlcigpOwotCQltYW5pZmVzdEZpbGUgPSBtYW5pZmVzdDsKLQkJaWYgKG1hbmlmZXN0LmV4aXN0cygpICYmICFtYW5pZmVzdC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlGaWxlSW5wdXRTdHJlYW0gZm9zID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZm9zID0gbmV3IEZpbGVJbnB1dFN0cmVhbShtYW5pZmVzdCk7Ci0JCQkJcGFyc2UoZm9zKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoZm9zICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWZvcy5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCS8qKgotCQkgKiBDb25zdHJ1Y3RvciBmb3IgbG9jYWwgZmlsZQotCQkgKi8KLQkJcHVibGljIEJ1bmRsZU1hbmlmZXN0KElucHV0U3RyZWFtIGlucHV0LCBTdHJpbmcgYnVuZGxlVXJsKSB7Ci0JCQlzdXBlcigpOwotCQkJYnVuZGxlVVJMID0gYnVuZGxlVXJsOwotCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQlwYXJzZShpbnB1dCk7Ci0JCQl9Ci0JCX0KLQkvKioKLQkgKiBQYXJzZXMgbWFuaWZlc3QsIGNyZWF0ZXMgUGx1Z2luRW50cnkgaWYgbWFuaWZlc3QgaXMgdmFsaWQsIHN0b3JlcwotCSAqIGV4Y2VwdGlvbiBpZiBhbnkgb2NjdXJzCi0JICogCi0JICogQHBhcmFtIGluCi0JICogICAgICAgICAgICBJbnB1dFN0cmVhbQotCSAqLwotCXByaXZhdGUgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBpbikgewotCQl0cnkgewotCQkJTWFuaWZlc3QgbSA9IG5ldyBNYW5pZmVzdChpbik7Ci0JCQlBdHRyaWJ1dGVzIGEgPSBtLmdldE1haW5BdHRyaWJ1dGVzKCk7Ci0JCQkvLyBwbHVnaW4gaWQKLQkJCVN0cmluZyBzeW1ib2xpY05hbWUgPSBhLmdldFZhbHVlKENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKTsKLQkJCWlmIChzeW1ib2xpY05hbWUgPT0gbnVsbCkgewotCQkJCS8vIEluIEVjbGlwc2UgbWFuaWZlc3QgbXVzdCBoYXZlIEJ1bmRsZS1TeW1ib2xpY05hbWUgYXR0cmlidXRlCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIGlkOwotCQkJdHJ5IHsKLQkJCQlNYW5pZmVzdEVsZW1lbnRbXSBlbGVtZW50cyA9IE1hbmlmZXN0RWxlbWVudC5wYXJzZUhlYWRlcigKLQkJCQkJCUNvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCBzeW1ib2xpY05hbWUpOwotCQkJCWlkID0gZWxlbWVudHNbMF0uZ2V0VmFsdWUoKTsKLQkJCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihiZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQkJLy8gcGx1Z2luIHZlcnNpb24KLQkJCVN0cmluZyB2ZXJzaW9uID0gYS5nZXRWYWx1ZShDb25zdGFudHMuQlVORExFX1ZFUlNJT04pOwotCQkJaWYgKHZlcnNpb24gPT0gbnVsbCkgewotCQkJCVV0aWxzLmxvZyhOTFMuYmluZChNZXNzYWdlcy5CdW5kbGVNYW5pZmVzdF9ub1ZlcnNpb24sIChuZXcgU3RyaW5nW10geyBDb25zdGFudHMuQlVORExFX1ZFUlNJT04sIGlkIH0pKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdmVyc2lvbiA9IHZlcnNpb24udHJpbSgpOwotCQkJU3RyaW5nIGhvc3RQbHVnaW4gPSBhLmdldFZhbHVlKENvbnN0YW50cy5GUkFHTUVOVF9IT1NUKTsKLQkJCXBsdWdpbkVudHJ5ID0gbmV3IFBsdWdpbkVudHJ5KCk7Ci0JCQlwbHVnaW5FbnRyeS5zZXRWZXJzaW9uZWRJZGVudGlmaWVyKG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKGlkLAotCQkJCQl2ZXJzaW9uKSk7Ci0JCQlwbHVnaW5FbnRyeS5pc0ZyYWdtZW50KGhvc3RQbHVnaW4gIT0gbnVsbAotCQkJCQkmJiBob3N0UGx1Z2luLmxlbmd0aCgpID4gMCk7Ci0JCQkvLyBTZXQgVVJMCi0JCQlpZihidW5kbGVVUkwhPW51bGwpewotCQkJCXBsdWdpbkVudHJ5LnNldFVSTChidW5kbGVVUkwpOwotCQkJfWVsc2V7Ci0JCQkJRmlsZSBwbHVnaW5EaXIgPSBtYW5pZmVzdEZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQkJCWlmIChwbHVnaW5EaXIgIT0gbnVsbCkgewotCQkJCQlwbHVnaW5EaXIgPSBwbHVnaW5EaXIuZ2V0UGFyZW50RmlsZSgpOwotCQkJCX0KLQkJCQlpZiAocGx1Z2luRGlyICE9IG51bGwpewotCQkJCQlwbHVnaW5FbnRyeS5zZXRVUkwoUExVR0lOUyArICIvIiArIHBsdWdpbkRpci5nZXROYW1lKCkgKyAiLyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCQkvLwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCWV4Y2VwdGlvbiA9IGlvZTsKLQkJfQotCX0KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCXJldHVybiBleGNlcHRpb24gIT0gbnVsbCB8fCBwbHVnaW5FbnRyeSAhPSBudWxsOwotCX0KLQkvKioKLQkgKiBPYnRhaW5zIFBsdWdpbkVudHJ5IGZyb20gYSBtYW5pZmVzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIFBsdWdpbkVudHJ5IG9yIG51bGwgaWYgdmFsaWQgbWFuaWZlc3QgZG9lcyBub3QgZXhpc3QKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgZXhjZXB0aW9uIGR1cmluZyBwYXJzaW5nCi0JICovCi0JcHVibGljIFBsdWdpbkVudHJ5IGdldFBsdWdpbkVudHJ5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0JCQl0aHJvdyBleGNlcHRpb247Ci0JCX0gCi0JCXJldHVybiBwbHVnaW5FbnRyeTsJCQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0NvbmZpZ3VyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0NvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4M2JiMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9Db25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEphbWVzIEQgTWlsZXMgKElCTSBDb3JwLikgLSBidWcgMTc2MjUwLCBDb25maWd1cmF0b3IgbmVlZHMgdG8gaGFuZGxlIG1vcmUgcGxhdGZvcm0gdXJscyAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLQotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb24gaW1wbGVtZW50cyBJQ29uZmlndXJhdGlvbkNvbnN0YW50cyB7Ci0JCi0JcHJpdmF0ZSBIYXNoTWFwIHNpdGVzID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIEhhc2hNYXAgcGxhdGZvcm1VUkxzID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIERhdGUgZGF0ZTsKLQlwcml2YXRlIGxvbmcgbGFzdE1vZGlmaWVkOyAvLyBuZWVkZWQgdG8gYWNjb3VudCBmb3IgZmlsZSBzeXN0ZW0gbGltaXRhdGlvbnMKLQlwcml2YXRlIFVSTCB1cmw7Ci0JcHJpdmF0ZSBib29sZWFuIHRyYW5zaWVudENvbmZpZzsKLQlwcml2YXRlIGJvb2xlYW4gaXNEaXJ0eTsKLQlwcml2YXRlIENvbmZpZ3VyYXRpb24gbGlua2VkQ29uZmlnOyAvLyBzaGFyZWQgY29uZmlndXJhdGlvbgotCXByaXZhdGUgVVJMIGFzc29jaWF0ZWRJbnN0YWxsVVJMID0gVXRpbHMuZ2V0SW5zdGFsbFVSTCgpOwotCQotCXB1YmxpYyBDb25maWd1cmF0aW9uKCkgewotCQl0aGlzKG5ldyBEYXRlKCkpOwotCQkvLyB0aGUgY29uZmlnIGlzIGNyZWF0ZWQgbm93IG9yIG91dCBvZiBhIHBsYXRmb3JtLnhtbCB3aXRob3V0IGEgZGF0ZQotCQlpc0RpcnR5ID0gdHJ1ZTsKLQl9Ci0JcHVibGljIENvbmZpZ3VyYXRpb24oRGF0ZSBkYXRlKSAgewotCQl0aGlzLmRhdGUgPSBkYXRlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRVUkwoVVJMIHVybCkgewotCQl0aGlzLnVybCA9IHVybDsKLQl9Ci0JCi0JcHVibGljIFVSTCBnZXRVUkwoKSB7Ci0JCXJldHVybiB1cmw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExpbmtlZENvbmZpZyhDb25maWd1cmF0aW9uIGxpbmtlZENvbmZpZykgewotCQl0aGlzLmxpbmtlZENvbmZpZyA9IGxpbmtlZENvbmZpZzsKLQkJLy8gbWFrZSBhbGwgdGhlIHNpdGVzIHJlYWQtb25seQotCQlTaXRlRW50cnlbXSBsaW5rZWRTaXRlcyA9IGxpbmtlZENvbmZpZy5nZXRTaXRlcygpOwotCQlmb3IgKGludCBpPTA7IGk8bGlua2VkU2l0ZXMubGVuZ3RoOyBpKyspCi0JCQlsaW5rZWRTaXRlc1tpXS5zZXRVcGRhdGVhYmxlKGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIENvbmZpZ3VyYXRpb24gZ2V0TGlua2VkQ29uZmlnKCkgewotCQlyZXR1cm4gbGlua2VkQ29uZmlnOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbmZpZyBuZWVkcyB0byBiZSBzYXZlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCXJldHVybiBpc0RpcnR5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREaXJ0eShib29sZWFuIGRpcnR5KSB7Ci0JCWlzRGlydHkgPSBkaXJ0eTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkU2l0ZUVudHJ5KFN0cmluZyB1cmwsIFNpdGVFbnRyeSBzaXRlKSB7Ci0JCXVybCA9IFV0aWxzLmNhbm9uaWNhbGl6ZVVSTCh1cmwpOwotCQkvLyBvbmx5IGFkZCB0aGUgc2FtZSBzaXRlIG9uY2UKLQkJaWYgKHNpdGVzLmdldCh1cmwpID09IG51bGwgJiYgKGxpbmtlZENvbmZpZyA9PSBudWxsIHx8IGxpbmtlZENvbmZpZy5zaXRlcy5nZXQodXJsKSA9PSBudWxsKSkgewotCQkJc2l0ZS5zZXRDb25maWcodGhpcyk7Ci0JCQlzaXRlcy5wdXQodXJsLCBzaXRlKTsKLQkJCWlmKHVybC5zdGFydHNXaXRoKCJwbGF0Zm9ybToiKSl7Ly8kTk9OLU5MUy0xJAotCQkJCVVSTCBwVVJMOwotCQkJCXRyeSB7Ci0JCQkJCVVSTCByZWxTaXRlPSBudWxsOwotCQkJCQlpZiAodXJsICE9IG51bGwgJiYgdXJsLnN0YXJ0c1dpdGgoInBsYXRmb3JtOi9jb25maWciKSkgewotCQkJCQkJLy8gdXJsIGZvciBsb2NhdGlvbiBvZiBjb25maWd1cmF0aW9uIGlzIHJlbGF0aXZlIHRvIHBsYXRmb3JtLnhtbAotCQkJCQkJVVJMIGNvbmZpZ19sb2MgPSBnZXRVUkwoKTsKLQkJCQkJCXJlbFNpdGUgPSBuZXcgVVJMKGNvbmZpZ19sb2MsICIuLiIpOwotCQkJCQl9ZWxzZXsKLQkJCQkJCXJlbFNpdGUgPSBnZXRJbnN0YWxsVVJMKCk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXBVUkwgPSBuZXcgVVJMKHVybCk7Ci0JCQkJCVVSTCByVVJMID0gUGxhdGZvcm1Db25maWd1cmF0aW9uLnJlc29sdmVQbGF0Zm9ybVVSTChwVVJMLCByZWxTaXRlKTsKLQkJCQkJU3RyaW5nIHJlc29sdmVkVVJMID0gclVSTC50b0V4dGVybmFsRm9ybSgpOwotCQkJCQlwbGF0Zm9ybVVSTHMucHV0KHJlc29sdmVkVVJMLCBwVVJMKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGNhbid0IHJlc29sdmUgc28gY2FuJ3QgaGF2ZSBsb29rIHVwLgotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVTaXRlRW50cnkoU3RyaW5nIHVybCkgewotCQl1cmwgPVV0aWxzLmNhbm9uaWNhbGl6ZVVSTCh1cmwpOwkJCi0JCXNpdGVzLnJlbW92ZSh1cmwpOwotCQlpZih1cmwuc3RhcnRzV2l0aCgicGxhdGZvcm06IikpeyAvLyROT04tTkxTLTEkCi0JCQlVUkwgcFVSTDsKLQkJCXRyeSB7Ci0JCQkJVVJMIHJlbFNpdGU9IG51bGw7Ci0JCQkJaWYgKHVybCAhPSBudWxsICYmIHVybC5zdGFydHNXaXRoKCJwbGF0Zm9ybTovY29uZmlnIikpIHsKLQkJCQkJLy8gdXJsIGZvciBsb2NhdGlvbiBvZiBjb25maWd1cmF0aW9uIGlzIHJlbGF0aXZlIHRvIHBsYXRmb3JtLnhtbAotCQkJCQlVUkwgY29uZmlnX2xvYyA9IGdldFVSTCgpOwotCQkJCQlyZWxTaXRlID0gbmV3IFVSTChjb25maWdfbG9jLCAiLi4iKTsKLQkJCQl9ZWxzZXsKLQkJCQkJcmVsU2l0ZSA9IGdldEluc3RhbGxVUkwoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcFVSTCA9IG5ldyBVUkwodXJsKTsKLQkJCQlVUkwgclVSTCA9IFBsYXRmb3JtQ29uZmlndXJhdGlvbi5yZXNvbHZlUGxhdGZvcm1VUkwocFVSTCwgcmVsU2l0ZSk7Ci0JCQkJU3RyaW5nIHJlc29sdmVkVVJMID0gclVSTC50b0V4dGVybmFsRm9ybSgpOwotCQkJCXBsYXRmb3JtVVJMcy5yZW1vdmUocmVzb2x2ZWRVUkwpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGNhbid0IHJlc29sdmUgc28gY2FuJ3QgaGF2ZSBsb29rIHVwLgotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBTaXRlRW50cnkgZ2V0U2l0ZUVudHJ5KFN0cmluZyB1cmwpIHsKLQkJdXJsID0gVXRpbHMuY2Fub25pY2FsaXplVVJMKHVybCk7CQkKLQkJU2l0ZUVudHJ5IHNpdGUgPSAoU2l0ZUVudHJ5KXNpdGVzLmdldCh1cmwpOwotCQlpZiAoc2l0ZSA9PSBudWxsICYmIGxpbmtlZENvbmZpZyAhPSBudWxsKQotCQkJc2l0ZSA9IGxpbmtlZENvbmZpZy5nZXRTaXRlRW50cnkodXJsKTsKLQkJcmV0dXJuIHNpdGU7Ci0JfQotCQotCXB1YmxpYyBTaXRlRW50cnlbXSBnZXRTaXRlcygpIHsKLQkJaWYgKGxpbmtlZENvbmZpZyA9PSBudWxsKQotCQkJcmV0dXJuIChTaXRlRW50cnlbXSkgc2l0ZXMudmFsdWVzKCkudG9BcnJheShuZXcgU2l0ZUVudHJ5W3NpdGVzLnNpemUoKV0pOwotCQlBcnJheUxpc3QgY29tYmluZWRTaXRlcyA9IG5ldyBBcnJheUxpc3Qoc2l0ZXMudmFsdWVzKCkpOwotCQljb21iaW5lZFNpdGVzLmFkZEFsbChsaW5rZWRDb25maWcuc2l0ZXMudmFsdWVzKCkpOwotCQlyZXR1cm4gKFNpdGVFbnRyeVtdKSBjb21iaW5lZFNpdGVzLnRvQXJyYXkobmV3IFNpdGVFbnRyeVtjb21iaW5lZFNpdGVzLnNpemUoKV0pOwotCX0KLQkKLQlwdWJsaWMgRWxlbWVudCB0b1hNTChEb2N1bWVudCBkb2MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsJCi0JCXRyeSB7Ci0JCQlFbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudChDRkcpOwotCi0JCQljb25maWdFbGVtZW50LnNldEF0dHJpYnV0ZShDRkdfVkVSU0lPTiwgVkVSU0lPTik7Ci0JCQljb25maWdFbGVtZW50LnNldEF0dHJpYnV0ZShDRkdfREFURSwgU3RyaW5nLnZhbHVlT2YoZGF0ZS5nZXRUaW1lKCkpKTsKLQkJCVN0cmluZyB0cmFuc2l0b3J5ID0gaXNUcmFuc2llbnQoKSA/ICJ0cnVlIiA6ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJY29uZmlnRWxlbWVudC5zZXRBdHRyaWJ1dGUoQ0ZHX1RSQU5TSUVOVCwgdHJhbnNpdG9yeSk7Ci0JCQkJCQkKLQkJCWlmIChsaW5rZWRDb25maWcgIT0gbnVsbCkgewotCQkJCS8vIG1ha2UgZXh0ZXJuYWxpemVkIFVSTCBpbnN0YWxsIHJlbGF0aXZlIAotCQkJCWNvbmZpZ0VsZW1lbnQuc2V0QXR0cmlidXRlKENGR19TSEFSRURfVVJMLCBVdGlscy5tYWtlUmVsYXRpdmUoZ2V0SW5zdGFsbFVSTCgpLCBsaW5rZWRDb25maWcuZ2V0VVJMKCkpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJfQotCi0JCQkvLyBjb2xsZWN0IHNpdGUgZW50cmllcwotCQkJU2l0ZUVudHJ5W10gbGlzdCA9IChTaXRlRW50cnlbXSkgc2l0ZXMudmFsdWVzKCkudG9BcnJheShuZXcgU2l0ZUVudHJ5WzBdKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotCQkJCWlmIChsaW5rZWRDb25maWcgIT0gbnVsbCAmJiBsaW5rZWRDb25maWcuZ2V0U2l0ZUVudHJ5KGxpc3RbaV0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSkgIT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJRWxlbWVudCBzaXRlRWxlbWVudCA9IGxpc3RbaV0udG9YTUwoZG9jKTsKLQkJCQljb25maWdFbGVtZW50LmFwcGVuZENoaWxkKHNpdGVFbGVtZW50KTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGNvbmZpZ0VsZW1lbnQ7Ci0JCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IFV0aWxzLm5ld0NvcmVFeGNlcHRpb24oIiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVHJhbnNpZW50KCkgewotCQlyZXR1cm4gdHJhbnNpZW50Q29uZmlnOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUcmFuc2llbnQoYm9vbGVhbiBpc1RyYW5zaWVudCkgewotCQl0aGlzLnRyYW5zaWVudENvbmZpZyA9IGlzVHJhbnNpZW50OwotCX0KLQkKLQlwdWJsaWMgRGF0ZSBnZXREYXRlKCkgewotCQlyZXR1cm4gZGF0ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGF0ZShEYXRlIGRhdGUpIHsKLQkJdGhpcy5kYXRlID0gZGF0ZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdW5jb25maWd1cmVGZWF0dXJlRW50cnkoSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JRmVhdHVyZUVudHJ5IGZlYXR1cmUpIHsKLQkJU2l0ZUVudHJ5W10gc2l0ZXMgPSBnZXRTaXRlcygpOwotCQlmb3IgKGludCBpPTA7IGk8c2l0ZXMubGVuZ3RoOyBpKyspCi0JCQlpZiAoc2l0ZXNbaV0udW5jb25maWd1cmVGZWF0dXJlRW50cnkoZmVhdHVyZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TGFzdE1vZGlmaWVkKGxvbmcgbGFzdE1vZGlmaWVkKSB7Ci0JCXRoaXMubGFzdE1vZGlmaWVkID0gbGFzdE1vZGlmaWVkOwotCX0KLQkKLQlwdWJsaWMgbG9uZyBsYXN0TW9kaWZpZWQoKSB7Ci0JCXJldHVybiAobGFzdE1vZGlmaWVkICE9IDApID8gbGFzdE1vZGlmaWVkIDogZGF0ZS5nZXRUaW1lKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVybCBhcyBhIHBsYXRmb3JtOi8gdXJsLCBpZiBwb3NzaWJsZSwgZWxzZSBsZWF2ZXMgaXQgdW5jaGFuZ2VkCi0JICogQHBhcmFtIHVybAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgVVJMIGFzUGxhdGZvcm1VUkwoVVJMIHVybCkgewotCQl0cnkgewotCQkJaWYgKHVybC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyByVXJsID0gdXJsLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQkJVVJMIHBVcmwgPSAoVVJMKXBsYXRmb3JtVVJMcy5nZXQoclVybCk7Ci0JCQkJaWYocFVybCA9PSBudWxsKQotCQkJCQlyZXR1cm4gdXJsOwotCQkJCXJldHVybiBwVXJsOwotCQkJfQotCQkJcmV0dXJuIHVybDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiB1cmw7Ci0JCX0KLQl9Ci0JCQotCXB1YmxpYyBVUkwgZ2V0SW5zdGFsbFVSTCgpIHsKLQkJcmV0dXJuIGFzc29jaWF0ZWRJbnN0YWxsVVJMOwotCX0KLQkJCi0JcHVibGljIHZvaWQgc2V0SW5zdGFsbExvY2F0aW9uKFVSTCBpbnN0YWxsVVJMKSB7Ci0JCWFzc29jaWF0ZWRJbnN0YWxsVVJMID0gaW5zdGFsbFVSTDsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9GZWF0dXJlRW50cnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0ZlYXR1cmVFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzE5MTJmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0ZlYXR1cmVFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuYnJhbmRpbmcuKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcudzNjLmRvbS4qOwotCi0KLS8qKgotICogCi0gKiBGZWF0dXJlIGluZm9ybWF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlRW50cnkKLQkJaW1wbGVtZW50cwotCQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JRmVhdHVyZUVudHJ5LAotCQkJSUNvbmZpZ3VyYXRpb25Db25zdGFudHMsCi0JCQlJQnVuZGxlR3JvdXAsCi0JCQlJQnVuZGxlR3JvdXBDb25zdGFudHMsCi0JCQlJUHJvZHVjdENvbnN0YW50cyB7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKLQlwcml2YXRlIFN0cmluZyBwbHVnaW5WZXJzaW9uOwotCXByaXZhdGUgU3RyaW5nIGFwcGxpY2F0aW9uOwotCXByaXZhdGUgVVJMW10gcm9vdDsKLQlwcml2YXRlIGJvb2xlYW4gcHJpbWFyeTsKLQlwcml2YXRlIFN0cmluZyBwbHVnaW5JZGVudGlmaWVyOwotCXByaXZhdGUgU3RyaW5nIHVybDsKLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQlwcml2YXRlIFN0cmluZyBsaWNlbnNlVVJMOwotCXByaXZhdGUgQXJyYXlMaXN0IHBsdWdpbnM7Ci0JcHJpdmF0ZSBBYm91dEluZm8gYnJhbmRpbmc7Ci0JcHJpdmF0ZSBTaXRlRW50cnkgc2l0ZTsKLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCXByaXZhdGUgYm9vbGVhbiBmdWxseVBhcnNlZDsKLQotCXB1YmxpYyBGZWF0dXJlRW50cnkoU3RyaW5nIGlkLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIHBsdWdpbklkZW50aWZpZXIsIFN0cmluZyBwbHVnaW5WZXJzaW9uLCBib29sZWFuIHByaW1hcnksIFN0cmluZyBhcHBsaWNhdGlvbiwgVVJMW10gcm9vdCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCQl0aGlzLnBsdWdpblZlcnNpb24gPSBwbHVnaW5WZXJzaW9uOwotCQl0aGlzLnBsdWdpbklkZW50aWZpZXIgPSBwbHVnaW5JZGVudGlmaWVyOwotCQl0aGlzLnByaW1hcnkgPSBwcmltYXJ5OwotCQl0aGlzLmFwcGxpY2F0aW9uID0gYXBwbGljYXRpb247Ci0JCXRoaXMucm9vdCA9IChyb290ID09IG51bGwgPyBuZXcgVVJMWzBdIDogcm9vdCk7Ci0JfQotCi0JcHVibGljIEZlYXR1cmVFbnRyeSggU3RyaW5nIGlkLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIHBsdWdpblZlcnNpb24sIGJvb2xlYW4gcHJpbWFyeSwgU3RyaW5nIGFwcGxpY2F0aW9uLCBVUkxbXSByb290KSB7Ci0JCXRoaXMoaWQsIHZlcnNpb24sIGlkLCBwbHVnaW5WZXJzaW9uLCBwcmltYXJ5LCBhcHBsaWNhdGlvbiwgcm9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2l0ZShTaXRlRW50cnkgc2l0ZSkgewotCQl0aGlzLnNpdGUgPSBzaXRlOwotCX0KLQkKLQlwdWJsaWMgU2l0ZUVudHJ5IGdldFNpdGUoKSB7Ci0JCXJldHVybiB0aGlzLnNpdGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFBsdWdpbihQbHVnaW5FbnRyeSBwbHVnaW4pIHsKLQkJaWYgKHBsdWdpbnMgPT0gbnVsbCkKLQkJCXBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXBsdWdpbnMuYWRkKHBsdWdpbik7Ci0JfQotCQotCXB1YmxpYyBQbHVnaW5FbnRyeVtdIGdldFBsdWdpbkVudHJpZXMoKSB7Ci0JCWlmIChwbHVnaW5zID09IG51bGwpCi0JCQlmdWxsUGFyc2UoKTsKLQkJcmV0dXJuIChQbHVnaW5FbnRyeVtdKXBsdWdpbnMudG9BcnJheShuZXcgUGx1Z2luRW50cnlbcGx1Z2lucy5zaXplKCldKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdXJsIHN0cmluZyAocmVsYXRpdmUgdG8gdGhlIHNpdGUgdXJsKQotCSAqIEBwYXJhbSB1cmwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVUkwoU3RyaW5nIHVybCkgewotCQl0aGlzLnVybCA9IHVybDsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgZmVhdHVyZSB1cmwgKHJlbGF0aXZlIHRvIHRoZSBzaXRlKTogZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0vCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUkwoKSB7Ci0vLwkJaWYgKHVybCA9PSBudWxsKQotLy8JCQl1cmwgPSBGRUFUVVJFUyArICIvIiArIGlkICsgIl8iICsgdmVyc2lvbiArICIvIjsKLQkJcmV0dXJuIHVybDsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElGZWF0dXJlRW50cnkjZ2V0RmVhdHVyZUlkZW50aWZpZXIoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmVFbnRyeSNnZXRGZWF0dXJlVmVyc2lvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGZWF0dXJlVmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElGZWF0dXJlRW50cnkjZ2V0RmVhdHVyZVBsdWdpblZlcnNpb24oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmVhdHVyZVBsdWdpblZlcnNpb24oKSB7Ci0JCXJldHVybiBwbHVnaW5WZXJzaW9uICE9IG51bGwgJiYgcGx1Z2luVmVyc2lvbi5sZW5ndGgoKSA+IDAgPyBwbHVnaW5WZXJzaW9uIDogbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmVFbnRyeSNnZXRGZWF0dXJlUGx1Z2luSWRlbnRpZmllcigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGZWF0dXJlUGx1Z2luSWRlbnRpZmllcigpIHsKLQkJLy8gaWYgbm8gcGx1Z2luIGlzIHNwZWNpZmllZCwgdXNlIHRoZSBmZWF0dXJlIGlkCi0JCXJldHVybiBwbHVnaW5JZGVudGlmaWVyICE9IG51bGwgJiYgcGx1Z2luSWRlbnRpZmllci5sZW5ndGgoKSA+IDAgPyBwbHVnaW5JZGVudGlmaWVyIDogaWQ7Ci0JfQotCQotCS8qCi0JICogQHNlZSBJRmVhdHVyZUVudHJ5I2dldEZlYXR1cmVBcHBsaWNhdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGZWF0dXJlQXBwbGljYXRpb24oKSB7Ci0JCXJldHVybiBhcHBsaWNhdGlvbjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmVFbnRyeSNnZXRGZWF0dXJlUm9vdFVSTHMoKQotCSAqLwotCXB1YmxpYyBVUkxbXSBnZXRGZWF0dXJlUm9vdFVSTHMoKSB7Ci0JCXJldHVybiByb290OwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZUVudHJ5I2NhbkJlUHJpbWFyeSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuQmVQcmltYXJ5KCkgewotCQlyZXR1cm4gcHJpbWFyeTsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudCB0b1hNTChEb2N1bWVudCBkb2MpIHsKLQkJVVJMIGluc3RhbGxVUkwgPSBnZXRTaXRlKCkuZ2V0Q29uZmlnKCkuZ2V0SW5zdGFsbFVSTCgpOwkKLQkJCi0JCUVsZW1lbnQgZmVhdHVyZUVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudChDRkdfRkVBVFVSRV9FTlRSWSk7CQkKLQkJLy8gd3JpdGUgb3V0IGZlYXR1cmUgZW50cnkgc2V0dGluZ3MKLQkJaWYgKGlkICE9IG51bGwpCi0JCQlmZWF0dXJlRWxlbWVudC5zZXRBdHRyaWJ1dGUoQ0ZHX0ZFQVRVUkVfRU5UUllfSUQsIGlkKTsgCi0JCWlmIChwcmltYXJ5KQotCQkJZmVhdHVyZUVsZW1lbnQuc2V0QXR0cmlidXRlKENGR19GRUFUVVJFX0VOVFJZX1BSSU1BUlksICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHZlcnNpb24gIT0gbnVsbCkKLQkJCWZlYXR1cmVFbGVtZW50LnNldEF0dHJpYnV0ZShDRkdfRkVBVFVSRV9FTlRSWV9WRVJTSU9OLCB2ZXJzaW9uKTsgCi0JCWlmIChwbHVnaW5WZXJzaW9uICE9IG51bGwgJiYgIXBsdWdpblZlcnNpb24uZXF1YWxzKHZlcnNpb24pICYmIHBsdWdpblZlcnNpb24ubGVuZ3RoKCkgPiAwKQotCQkJZmVhdHVyZUVsZW1lbnQuc2V0QXR0cmlidXRlKENGR19GRUFUVVJFX0VOVFJZX1BMVUdJTl9WRVJTSU9OLCBwbHVnaW5WZXJzaW9uKTsgCi0JCWlmIChwbHVnaW5JZGVudGlmaWVyICE9IG51bGwgJiYgIXBsdWdpbklkZW50aWZpZXIuZXF1YWxzKGlkKSAmJiBwbHVnaW5JZGVudGlmaWVyLmxlbmd0aCgpID4gMCkKLQkJCWZlYXR1cmVFbGVtZW50LnNldEF0dHJpYnV0ZShDRkdfRkVBVFVSRV9FTlRSWV9QTFVHSU5fSURFTlRJRklFUiwgcGx1Z2luSWRlbnRpZmllcik7Ci0JCWlmIChhcHBsaWNhdGlvbiAhPSBudWxsKQotCQkJZmVhdHVyZUVsZW1lbnQuc2V0QXR0cmlidXRlKENGR19GRUFUVVJFX0VOVFJZX0FQUExJQ0FUSU9OLCBhcHBsaWNhdGlvbik7Ci0JCWlmICh1cmwgIT0gbnVsbCkKLQkJCS8vIG1ha2UgZXh0ZXJuYWxpemVkIFVSTCBpbnN0YWxsIHJlbGF0aXZlCi0JCQlmZWF0dXJlRWxlbWVudC5zZXRBdHRyaWJ1dGUoQ0ZHX1VSTCwgVXRpbHMubWFrZVJlbGF0aXZlKGluc3RhbGxVUkwsIHVybCkpOwotCQkKLQkJVVJMW10gcm9vdHMgPSBnZXRGZWF0dXJlUm9vdFVSTHMoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkvLyBtYWtlIGV4dGVybmFsaXplZCBVUkwgaW5zdGFsbCByZWxhdGl2ZQotCQkJU3RyaW5nIHJvb3QgPSBVdGlscy5tYWtlUmVsYXRpdmUoaW5zdGFsbFVSTCwgcm9vdHNbaV0pLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQlpZiAocm9vdC50cmltKCkubGVuZ3RoKCkgPiAwKXsKLQkJCQlFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoQ0ZHX0ZFQVRVUkVfRU5UUllfUk9PVCk7Ci0JCQkJcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKHJvb3QpKTsKLQkJCQlmZWF0dXJlRWxlbWVudC5hcHBlbmRDaGlsZChyb290RWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmZWF0dXJlRWxlbWVudDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklCdW5kbGVHcm91cCNnZXRCdW5kbGVzKCkKLQkgKi8KLQlwdWJsaWMgQnVuZGxlW10gZ2V0QnVuZGxlcygpIHsKLQkJaWYgKHBsdWdpbnMgPT0gbnVsbCkKLQkJCWZ1bGxQYXJzZSgpOwotCQkKLQkJQXJyYXlMaXN0IGJ1bmRsZXMgPSBuZXcgQXJyYXlMaXN0KHBsdWdpbnMuc2l6ZSgpKTsKLQkJZm9yIChpbnQgaT0wOyBpPHBsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCVBsdWdpbkVudHJ5IHBsdWdpbiA9IChQbHVnaW5FbnRyeSlwbHVnaW5zLmdldChpKTsKLQkJCS8vIGdldCB0aGUgaGlnaGVzdCB2ZXJzaW9uIGZvciB0aGUgcGx1Z2luCi0JCQlCdW5kbGUgYnVuZGxlID0gVXRpbHMuZ2V0QnVuZGxlKHBsdWdpbi5nZXRQbHVnaW5JZGVudGlmaWVyKCkpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKQotCQkJCWJ1bmRsZXMuYWRkKGJ1bmRsZSk7Ci0JCX0KLQkJcmV0dXJuIChCdW5kbGVbXSlidW5kbGVzLnRvQXJyYXkobmV3IEJ1bmRsZVtidW5kbGVzLnNpemUoKV0pOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUJ1bmRsZUdyb3VwI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCWZ1bGxQYXJzZSgpOwotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQnVuZGxlR3JvdXAjZ2V0SWRlbnRpZmllcigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQnVuZGxlR3JvdXAjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAoYnJhbmRpbmcgPT0gbnVsbCkKLQkJCWJyYW5kaW5nID0gQWJvdXRJbmZvLnJlYWRGZWF0dXJlSW5mbyhpZCwgdmVyc2lvbiwgZ2V0RmVhdHVyZVBsdWdpbklkZW50aWZpZXIoKSk7Ci0JCXJldHVybiBicmFuZGluZy5nZXRQcm9kdWN0TmFtZSgpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUJ1bmRsZUdyb3VwI2dldFByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7Ci0JCWlmIChrZXkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJaWYgKGJyYW5kaW5nID09IG51bGwpCi0JCQlicmFuZGluZyA9IEFib3V0SW5mby5yZWFkRmVhdHVyZUluZm8oaWQsIHZlcnNpb24sIGdldEZlYXR1cmVQbHVnaW5JZGVudGlmaWVyKCkpOwotCQkKLQkJLy8gSUJ1bmRsZUdyb3VwQ29uc3RhbnRzCi0JCWlmIChrZXkuZXF1YWxzKEZFQVRVUkVfSU1BR0UpKQotCQkJcmV0dXJuIGJyYW5kaW5nLmdldEZlYXR1cmVJbWFnZVVSTCgpID09IG51bGwgPyBudWxsIDogYnJhbmRpbmcuZ2V0RmVhdHVyZUltYWdlVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJZWxzZSBpZiAoa2V5LmVxdWFscyhUSVBTX0FORF9UUklDS1NfSFJFRikpIAotCQkJcmV0dXJuIGJyYW5kaW5nLmdldFRpcHNBbmRUcmlja3NIcmVmKCk7Ci0JCWVsc2UgaWYgKGtleS5lcXVhbHMoSUJ1bmRsZUdyb3VwQ29uc3RhbnRzLldFTENPTUVfUEFHRSkpIC8vIHNhbWUgdmFsdWUgaXMgdXNlZCBieSBwcm9kdWN0IGFuZCBidW5kbGUgZ3JvdXAKLQkJCXJldHVybiBicmFuZGluZy5nZXRXZWxjb21lUGFnZVVSTCgpID09IG51bGwgPyBudWxsIDogYnJhbmRpbmcuZ2V0V2VsY29tZVBhZ2VVUkwoKS50b0V4dGVybmFsRm9ybSgpOwotCQllbHNlIGlmIChrZXkuZXF1YWxzKFdFTENPTUVfUEVSU1BFQ1RJVkUpKQotCQkJcmV0dXJuIGJyYW5kaW5nLmdldFdlbGNvbWVQZXJzcGVjdGl2ZUlkKCk7Ci0JCWVsc2UgaWYgKGtleS5lcXVhbHMoQlJBTkRJTkdfQlVORExFX0lEKSkKLQkJCXJldHVybiBwbHVnaW5JZGVudGlmaWVyOwotCQllbHNlIGlmIChrZXkuZXF1YWxzKEJSQU5ESU5HX0JVTkRMRV9WRVJTSU9OKSkKLQkJCXJldHVybiBwbHVnaW5WZXJzaW9uOwotCQkvLyBJUHJvZHVjdENvbnN0YW50cwotCQllbHNlIGlmIChrZXkuZXF1YWxzKEFQUF9OQU1FKSkgCi0JCQlyZXR1cm4gYnJhbmRpbmcuZ2V0QXBwTmFtZSgpOwotCQllbHNlIGlmIChrZXkuZXF1YWxzKEFCT1VUX1RFWFQpKQotCQkJcmV0dXJuIGJyYW5kaW5nLmdldEFib3V0VGV4dCgpOwotCQllbHNlIGlmIChrZXkuZXF1YWxzKEFCT1VUX0lNQUdFKSkKLQkJCXJldHVybiBicmFuZGluZy5nZXRBYm91dEltYWdlVVJMKCkgPT0gbnVsbCA/IG51bGwgOiBicmFuZGluZy5nZXRBYm91dEltYWdlVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJZWxzZSBpZiAoa2V5LmVxdWFscyhXSU5ET1dfSU1BR0UpKQotCQkJcmV0dXJuIGJyYW5kaW5nLmdldFdpbmRvd0ltYWdlVVJMKCk9PSBudWxsID8gbnVsbCA6IGJyYW5kaW5nLmdldFdpbmRvd0ltYWdlVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJZWxzZSBpZiAoa2V5LmVxdWFscyhXSU5ET1dfSU1BR0VTKSkgewotCQkJVVJMW10gdXJscyA9IGJyYW5kaW5nLmdldFdpbmRvd0ltYWdlc1VSTHMoKTsKLQkJCWlmICh1cmxzID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlTdHJpbmdCdWZmZXIgd2luZG93SW1hZ2VzVVJMcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoaW50IGk9MDsgaTx1cmxzLmxlbmd0aDsgaSsrKXsKLQkJCQl3aW5kb3dJbWFnZXNVUkxzLmFwcGVuZCh1cmxzW2ldLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJCWlmIChpICE9IHVybHMubGVuZ3RoLTEpCi0JCQkJCXdpbmRvd0ltYWdlc1VSTHMuYXBwZW5kKCcsJyk7Ci0JCQl9Ci0JCQlyZXR1cm4gd2luZG93SW1hZ2VzVVJMcy50b1N0cmluZygpOwotCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoTElDRU5TRV9IUkVGKSkKLQkJCXJldHVybiBnZXRMaWNlbnNlVVJMKCk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklCdW5kbGVHcm91cCNnZXRQcm92aWRlck5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdmlkZXJOYW1lKCkgewotCQlpZiAoYnJhbmRpbmcgPT0gbnVsbCkKLQkJCWJyYW5kaW5nID0gQWJvdXRJbmZvLnJlYWRGZWF0dXJlSW5mbyhpZCwgdmVyc2lvbiwgZ2V0RmVhdHVyZVBsdWdpbklkZW50aWZpZXIoKSk7Ci0JCXJldHVybiBicmFuZGluZy5nZXRQcm92aWRlck5hbWUoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklCdW5kbGVHcm91cCNnZXRWZXJzaW9uKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2R1Y3QjZ2V0QXBwbGljYXRpb24oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXBwbGljYXRpb24oKSB7Ci0JCXJldHVybiBhcHBsaWNhdGlvbjsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9kdWN0I2dldElkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCQotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpewotCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkKLQkJCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQkJCi0JCS8vIERldGVybWluZSB0aGUgcHJvcGVydGllcyBmaWxlIGxvY2F0aW9uCi0JCWlmIChzaXRlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlVUkwgcHJvcGVydGllc1VSTCA9IG5ldyBVUkwoc2l0ZS5nZXRSZXNvbHZlZFVSTCgpLCBnZXRVUkwoKSk7Ci0JCQlDbGFzc0xvYWRlciBsID0gbmV3IFVSTENsYXNzTG9hZGVyKG5ldyBVUkxbXSB7IHByb3BlcnRpZXNVUkwgfSwgbnVsbCk7Ci0JCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoSUNvbmZpZ3VyYXRpb25Db25zdGFudHMuQ0ZHX0ZFQVRVUkVfRU5UUlksIFV0aWxzLmdldERlZmF1bHRMb2NhbGUoKSwgbCk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVdGlscy5sb2coZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOyAKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCVV0aWxzLmxvZyhlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7IAotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExpY2Vuc2VVUkwoU3RyaW5nIGxpY2Vuc2VVUkwpIHsKLQkJdGhpcy5saWNlbnNlVVJMID0gbGljZW5zZVVSTDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMaWNlbnNlVVJMKCkgewotCQlpZiAobGljZW5zZVVSTCA9PSBudWxsKQotCQkJZnVsbFBhcnNlKCk7Ci0JCWlmIChsaWNlbnNlVVJMID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCVN0cmluZyByZXNvbHZlZFVSTCA9IFV0aWxzLmdldFJlc291cmNlU3RyaW5nKGdldFJlc291cmNlQnVuZGxlKCksIGxpY2Vuc2VVUkwpOwotCQlpZiAocmVzb2x2ZWRVUkwuc3RhcnRzV2l0aCgiaHR0cDovLyIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gcmVzb2x2ZWRVUkw7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IFVSTChnZXRTaXRlKCkuZ2V0UmVzb2x2ZWRVUkwoKSwgZ2V0VVJMKCkgKyByZXNvbHZlZFVSTCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiByZXNvbHZlZFVSTDsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZnVsbFBhcnNlKCkgewotCQlpZiAoZnVsbHlQYXJzZWQpCi0JCQlyZXR1cm47Ci0JCWZ1bGx5UGFyc2VkID0gdHJ1ZTsKLQkJaWYgKHBsdWdpbnMgPT0gbnVsbCkgCi0JCQlwbHVnaW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlGdWxsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgRnVsbEZlYXR1cmVQYXJzZXIodGhpcyk7Ci0JCXBhcnNlci5wYXJzZSgpOwotCX0KLQkKLQlwdWJsaWMgQnVuZGxlIGdldERlZmluaW5nQnVuZGxlKCkgewotCQlyZXR1cm4gVXRpbHMuZ2V0QnVuZGxlKGdldEZlYXR1cmVQbHVnaW5JZGVudGlmaWVyKCkpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNCcmFuZGluZygpIHsKLSAgICAgICAgU3RyaW5nIGJ1bmRsZUlkID0gZ2V0RmVhdHVyZVBsdWdpbklkZW50aWZpZXIoKTsKLQkJcmV0dXJuIGJ1bmRsZUlkICE9IG51bGwgJiYgVXRpbHMuZ2V0QnVuZGxlKGJ1bmRsZUlkKSAhPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0ZlYXR1cmVQYXJzZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0ZlYXR1cmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJjZTU5OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9GZWF0dXJlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3I7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLio7Ci0KLS8qKgotICogRGVmYXVsdCBmZWF0dXJlIHBhcnNlci4KLSAqIFBhcnNlcyB0aGUgZmVhdHVyZSBtYW5pZmVzdCBmaWxlIGFzIGRlZmluZWQgYnkgdGhlIHBsYXRmb3JtLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlUGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotCi0JcHJpdmF0ZSBTQVhQYXJzZXIgcGFyc2VyOwotCXByaXZhdGUgRmVhdHVyZUVudHJ5IGZlYXR1cmU7Ci0JcHJpdmF0ZSBVUkwgdXJsOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU0FYUGFyc2VyRmFjdG9yeSBwYXJzZXJGYWN0b3J5ID0KLQkJU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIGZlYXR1cmUgcGFyc2VyLgotCSAqLwotCXB1YmxpYyBGZWF0dXJlUGFyc2VyKCkgewotCQlzdXBlcigpOwotCQl0cnkgewotCQkJcGFyc2VyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQkJCXRoaXMucGFyc2VyID0gcGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogUGFyc2VzIHRoZSBzcGVjaWZpZWQgdXJsIGFuZCBjb25zdHJ1Y3RzIGEgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBGZWF0dXJlRW50cnkgcGFyc2UoVVJMIGZlYXR1cmVVUkwpewotCQlmZWF0dXJlPW51bGw7Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRoaXMudXJsID0gZmVhdHVyZVVSTDsKLQkJCWluID0gZmVhdHVyZVVSTC5vcGVuU3RyZWFtKCk7Ci0JCQlwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKGluKSwgdGhpcyk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpbiAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQkJVXRpbHMubG9nKGUxLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQkJfQotCQl9Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBzdGFydCBvZiBlbGVtZW50IHRhZ3MKLQkgKiBAc2VlIERlZmF1bHRIYW5kbGVyI3N0YXJ0RWxlbWVudChTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBBdHRyaWJ1dGVzKQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gewotCi0JCVV0aWxzLmRlYnVnKCJTdGFydCBFbGVtZW50OiB1cmk6IiArIHVyaSArICIgbG9jYWwgTmFtZToiICsgbG9jYWxOYW1lICsgIiBxTmFtZToiICsgcU5hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCWlmICgiZmVhdHVyZSIuZXF1YWxzKGxvY2FsTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvY2Vzc0ZlYXR1cmUoYXR0cmlidXRlcyk7Ci0JCQkvLyBzdG9wIHBhcnNpbmcgbm93Ci0JCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9IAotCX0KLQotCS8qCi0JICogUHJvY2VzcyBmZWF0dXJlIGluZm9ybWF0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NGZWF0dXJlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCi0JCS8vIGlkZW50aWZpZXIgYW5kIHZlcnNpb24KLQkJU3RyaW5nIGlkID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdmVyID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGlkID09IG51bGwgfHwgaWQudHJpbSgpLmVxdWFscygiIikgLy8kTk9OLU5MUy0xJAotCQl8fCB2ZXIgPT0gbnVsbCB8fCB2ZXIudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLkZlYXR1cmVQYXJzZXJfSWRPclZlcnNpb25JbnZhbGlkLCAobmV3IFN0cmluZ1tdIHsgaWQsIHZlcn0pKSk7Ci0JCX0gZWxzZSB7Ci0vLwkJCVN0cmluZyBsYWJlbCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImxhYmVsIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJU3RyaW5nIHByb3ZpZGVyID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgicHJvdmlkZXItbmFtZSIpOyAvLyROT04tTkxTLTEkCi0vLwkJCVN0cmluZyBpbWFnZVVSTCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImltYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBvcyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm9zIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyB3cyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIndzIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBubCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm5sIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBhcmNoID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiYXJjaCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoIVV0aWxzLmlzVmFsaWRFbnZpcm9ubWVudChvcywgd3MsIGFyY2gsIG5sKSkgCi0JCQkJcmV0dXJuOwotLy8JCQlTdHJpbmcgZXhjbHVzaXZlID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiZXhjbHVzaXZlIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJU3RyaW5nIGFmZmluaXR5ID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiY29sb2NhdGlvbi1hZmZpbml0eSIpOyAvLyROT04tTkxTLTEkCi0KLQkJCVN0cmluZyBwcmltYXJ5ID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgicHJpbWFyeSIpOyAvLyROT04tTkxTLTEkCi0JCQlib29sZWFuIGlzUHJpbWFyeSA9ICJ0cnVlIi5lcXVhbHMocHJpbWFyeSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBhcHBsaWNhdGlvbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImFwcGxpY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBwbHVnaW4gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJwbHVnaW4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvL1RPRE8gcm9vdFVSTHMKLQkJCWZlYXR1cmUgPSBuZXcgRmVhdHVyZUVudHJ5KGlkLCB2ZXIsIHBsdWdpbiwgIiIsIGlzUHJpbWFyeSwgYXBwbGljYXRpb24sIG51bGwgKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCJmaWxlIi5lcXVhbHModXJsLmdldFByb3RvY29sKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlGaWxlIGYgPSBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpKTsKLQkJCQlmZWF0dXJlLnNldFVSTCgiZmVhdHVyZXMiICsgIi8iICsgZi5nZXRQYXJlbnRGaWxlKCkuZ2V0TmFtZSgpICsgIi8iKTsvLyArIGYuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gZXh0ZXJuYWxpemVkIFVSTHMgbWlnaHQgYmUgaW4gcmVsYXRpdmUgZm9ybSwgZW5zdXJlIHRoZXkgYXJlIGFic29sdXRlCQkJCQotCQkJCWZlYXR1cmUuc2V0VVJMKFV0aWxzLm1ha2VBYnNvbHV0ZShVdGlscy5nZXRJbnN0YWxsVVJMKCksIHVybCkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCQl9Ci0KLQkJCVV0aWxzLgotCQkJCWRlYnVnKCJFbmQgcHJvY2VzcyBEZWZhdWx0RmVhdHVyZSB0YWc6IGlkOiIgK2lkICsgIiB2ZXI6IiArdmVyICsgIiB1cmw6IiArIGZlYXR1cmUuZ2V0VVJMKCkpOyAJIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9GdWxsRmVhdHVyZVBhcnNlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvRnVsbEZlYXR1cmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ3NTYyNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9GdWxsRmVhdHVyZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuKjsKLQotLyoqCi0gKiBBIG1vcmUgY29tcGxldGUgZmVhdHVyZSBwYXJzZXIuIEl0IGFkZHMgdGhlIHBsdWdpbnMgbGlzdGVkIHRvIHRoZSBmZWF0dXJlLgotICovCi1wdWJsaWMgY2xhc3MgRnVsbEZlYXR1cmVQYXJzZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciBpbXBsZW1lbnRzIElDb25maWd1cmF0aW9uQ29uc3RhbnRzewotCi0JcHJpdmF0ZSBTQVhQYXJzZXIgcGFyc2VyOwotCXByaXZhdGUgRmVhdHVyZUVudHJ5IGZlYXR1cmU7Ci0JcHJpdmF0ZSBVUkwgdXJsOwotCXByaXZhdGUgYm9vbGVhbiBpc0Rlc2NyaXB0aW9uOwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGRlc2NyaXB0aW9uID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU0FYUGFyc2VyRmFjdG9yeSBwYXJzZXJGYWN0b3J5ID0KLQkJU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIGZlYXR1cmUgcGFyc2VyLgotCSAqLwotCXB1YmxpYyBGdWxsRmVhdHVyZVBhcnNlcihGZWF0dXJlRW50cnkgZmVhdHVyZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0cnkgewotCQkJcGFyc2VyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQkJCXRoaXMucGFyc2VyID0gcGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCX0KLQl9Ci0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcGFyc2UoKXsKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGZlYXR1cmUuZ2V0U2l0ZSgpID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJdGhpcy51cmwgPSBuZXcgVVJMKGZlYXR1cmUuZ2V0U2l0ZSgpLmdldFJlc29sdmVkVVJMKCksIGZlYXR1cmUuZ2V0VVJMKCkgKyBGRUFUVVJFX1hNTCk7Ci0JCQlpbiA9IHVybC5vcGVuU3RyZWFtKCk7Ci0JCQlwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKGluKSwgdGhpcyk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpbiAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQkJVXRpbHMubG9nKGUxLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIHN0YXJ0IG9mIGVsZW1lbnQgdGFncwotCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjc3RhcnRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIEF0dHJpYnV0ZXMpCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLQkJVXRpbHMuZGVidWcoIlN0YXJ0IEVsZW1lbnQ6IHVyaToiICsgdXJpICsgIiBsb2NhbCBOYW1lOiIgKyBsb2NhbE5hbWUgKyAiIHFOYW1lOiIgKyBxTmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJaWYgKCJwbHVnaW4iLmVxdWFscyhsb2NhbE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXByb2Nlc3NQbHVnaW4oYXR0cmlidXRlcyk7Ci0JCX0gZWxzZSBpZiAoImRlc2NyaXB0aW9uIi5lcXVhbHMobG9jYWxOYW1lKSl7IC8vJE5PTi1OTFMtMSQKLQkJCWlzRGVzY3JpcHRpb24gPSB0cnVlOwotCQl9IGVsc2UgaWYgKCJsaWNlbnNlIi5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm9jZXNzTGljZW5zZShhdHRyaWJ1dGVzKTsKLQkJfQotCX0KLQotCS8qCi0JICogUHJvY2VzcyBmZWF0dXJlIGluZm9ybWF0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NQbHVnaW4oQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0KLQkJLy8gaWRlbnRpZmllciBhbmQgdmVyc2lvbgotCQlTdHJpbmcgaWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJpZCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB2ZXIgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC50cmltKCkuZXF1YWxzKCIiKSAvLyROT04tTkxTLTEkCi0JCXx8IHZlciA9PSBudWxsIHx8IHZlci50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMuRmVhdHVyZVBhcnNlcl9JZE9yVmVyc2lvbkludmFsaWQsIChuZXcgU3RyaW5nW10geyBpZCwgdmVyfSkpKTsKLQkJfSBlbHNlIHsKLS8vCQkJU3RyaW5nIGxhYmVsID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibGFiZWwiKTsgLy8kTk9OLU5MUy0xJAotLy8JCQlTdHJpbmcgcHJvdmlkZXIgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJwcm92aWRlci1uYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBubCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm5sIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBvcyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm9zIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyB3cyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIndzIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBhcmNoID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiYXJjaCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoIVV0aWxzLmlzVmFsaWRFbnZpcm9ubWVudChvcywgd3MsIGFyY2gsbmwpKQotCQkJCXJldHVybjsKLQotCQkJUGx1Z2luRW50cnkgcGx1Z2luID0gbmV3IFBsdWdpbkVudHJ5KCk7Ci0JCQlwbHVnaW4uc2V0UGx1Z2luSWRlbnRpZmllcihpZCk7Ci0JCQlwbHVnaW4uc2V0UGx1Z2luVmVyc2lvbih2ZXIpOwotCQkJZmVhdHVyZS5hZGRQbHVnaW4ocGx1Z2luKTsKLQkJCQotCQkJVXRpbHMuCi0JCQkJZGVidWcoIkVuZCBwcm9jZXNzIERlZmF1bHRGZWF0dXJlIHRhZzogaWQ6IiAraWQgKyAiIHZlcjoiICt2ZXIgKyAiIHVybDoiICsgZmVhdHVyZS5nZXRVUkwoKSk7IAkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0xpY2Vuc2UoQXR0cmlidXRlcyBhdHRyaWJ1dGVzICl7Ci0JCWZlYXR1cmUuc2V0TGljZW5zZVVSTChhdHRyaWJ1dGVzLmdldFZhbHVlKCJ1cmwiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjY2hhcmFjdGVycyhjaGFyW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCi0JCQl0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJaWYgKCFpc0Rlc2NyaXB0aW9uKQotCQkJcmV0dXJuOwotCQlkZXNjcmlwdGlvbi5hcHBlbmQoY2gsIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNlbmRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpCi0JCQl0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJaWYgKCJkZXNjcmlwdGlvbiIuZXF1YWxzKGxvY2FsTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJaXNEZXNjcmlwdGlvbiA9IGZhbHNlOwotCQkJU3RyaW5nIGQgPSBkZXNjcmlwdGlvbi50b1N0cmluZygpLnRyaW0oKTsKLQkJCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IGZlYXR1cmUuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJCWZlYXR1cmUuc2V0RGVzY3JpcHRpb24oVXRpbHMuZ2V0UmVzb3VyY2VTdHJpbmcoYnVuZGxlLCBkKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9JQ29uZmlndXJhdGlvbkNvbnN0YW50cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvSUNvbmZpZ3VyYXRpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcyMDViYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9JQ29uZmlndXJhdGlvbkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uKjsKLQotLyoqCi0gKiBDb25zdGFudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJhdGlvbkNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRV9QUk9EVUNUID0gImVjbGlwc2UucHJvZHVjdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFX0FQUExJQ0FUSU9OID0gImVjbGlwc2UuYXBwbGljYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHID0gImNvbmZpZyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRkdfU0lURSA9ICJzaXRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGR19VUkwgPSAidXJsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGR19QT0xJQ1kgPSAicG9saWN5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ0ZHX1BPTElDWV9UWVBFID0geyAiVVNFUi1JTkNMVURFIiwgIlVTRVItRVhDTFVERSIsICJNQU5BR0VELU9OTFkiIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX1BPTElDWV9UWVBFX1VOS05PV04gPSAiVU5LTk9XTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRkdfTElTVCA9ICJsaXN0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGR19VUERBVEVBQkxFID0gInVwZGF0ZWFibGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX0xJTktfRklMRSA9ICJsaW5rZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRkdfRkVBVFVSRV9FTlRSWSA9ICJmZWF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGR19GRUFUVVJFX0VOVFJZX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGR19GRUFUVVJFX0VOVFJZX1BSSU1BUlkgPSAicHJpbWFyeSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRkdfRkVBVFVSRV9FTlRSWV9WRVJTSU9OID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX0ZFQVRVUkVfRU5UUllfUExVR0lOX1ZFUlNJT04gPSAicGx1Z2luLXZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX0ZFQVRVUkVfRU5UUllfUExVR0lOX0lERU5USUZJRVIgPSAicGx1Z2luLWlkZW50aWZpZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX0ZFQVRVUkVfRU5UUllfQVBQTElDQVRJT04gPSAiYXBwbGljYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX0ZFQVRVUkVfRU5UUllfUk9PVCA9ICJyb290IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGR19EQVRFID0gImRhdGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX1BMVUdJTiA9ICJwbHVnaW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX0ZSQUdNRU5UID0gImZyYWdtZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGR19FTkFCTEVEID0gImVuYWJsZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX1NIQVJFRF9VUkwgPSAic2hhcmVkX3VyIjsgLy8kTk9OLU5MUy0xJAotCQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRkdfVFJBTlNJRU5UID0gInRyYW5zaWVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gIjMuMCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUE9MSUNZX1RZUEUgPSBJU2l0ZVBvbGljeS5VU0VSX0VYQ0xVREU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1BPTElDWV9MSVNUID0gbmV3IFN0cmluZ1swXTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5TID0gInBsdWdpbnMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRVMgPSAiZmVhdHVyZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX1hNTCA9ICJwbHVnaW4ueG1sIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQUdNRU5UX1hNTCA9ICJmcmFnbWVudC54bWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQV9NQU5JRkVTVF9NRiA9ICJNRVRBLUlORi9NQU5JRkVTVC5NRiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX1hNTCA9ICJmZWF0dXJlLnhtbCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0xvY2tlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvTG9ja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNzZlYWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvTG9ja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogSW50ZXJuYWwgY2xhc3MuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTG9ja2VyIHsKLQlwdWJsaWMgYm9vbGVhbiBsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKTsKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0xvY2tlcl9KYXZhSW8uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0xvY2tlcl9KYXZhSW8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgyZWExZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9Mb2NrZXJfSmF2YUlvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotLyoqCi0gKiBJbnRlcm5hbCBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIExvY2tlcl9KYXZhSW8gaW1wbGVtZW50cyBMb2NrZXIgewotCXByaXZhdGUgRmlsZSBsb2NrRmlsZTsKLQlwcml2YXRlIFJhbmRvbUFjY2Vzc0ZpbGUgbG9ja1JBRjsKLQotCXB1YmxpYyBMb2NrZXJfSmF2YUlvKEZpbGUgbG9ja0ZpbGUpIHsKLQkJdGhpcy5sb2NrRmlsZSA9IGxvY2tGaWxlOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy9pZiB0aGUgbG9jayBmaWxlIGFscmVhZHkgZXhpc3RzLCB0cnkgdG8gZGVsZXRlLAotCQkvL2Fzc3VtZSBmYWlsdXJlIG1lYW5zIGFub3RoZXIgZWNsaXBzZSBoYXMgaXQgb3BlbgotCQlpZiAobG9ja0ZpbGUuZXhpc3RzKCkpCi0JCQlsb2NrRmlsZS5kZWxldGUoKTsKLQkJaWYgKGxvY2tGaWxlLmV4aXN0cygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vb3BlbiB0aGUgbG9jayBmaWxlIHNvIG90aGVyIGluc3RhbmNlcyBjYW4ndCBjby1leGlzdAotCQlsb2NrUkFGID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUobG9ja0ZpbGUsICJydyIpOyAvLyROT04tTkxTLTEkCi0JCWxvY2tSQUYud3JpdGVCeXRlKDApOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlKCkgewotCQl0cnkgewotCQkJaWYgKGxvY2tSQUYgIT0gbnVsbCkgewotCQkJCWxvY2tSQUYuY2xvc2UoKTsKLQkJCQlsb2NrUkFGID0gbnVsbDsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy9kb24ndCBjb21wbGFpbiwgd2UncmUgbWFraW5nIGEgYmVzdCBlZmZvcnQgdG8gY2xlYW4gdXAKLQkJfQotCQlpZiAobG9ja0ZpbGUgIT0gbnVsbCkKLQkJCWxvY2tGaWxlLmRlbGV0ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0xvY2tlcl9KYXZhTmlvLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9Mb2NrZXJfSmF2YU5pby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2ZhZDM0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0xvY2tlcl9KYXZhTmlvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgKiAgICBBbmRyZWkgTG9za3V0b3YgLSBidWcgNDQ3MzUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVMb2NrOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLk92ZXJsYXBwaW5nRmlsZUxvY2tFeGNlcHRpb247Ci0KLS8qKgotICogSW50ZXJuYWwgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NrZXJfSmF2YU5pbyBpbXBsZW1lbnRzIExvY2tlciB7Ci0JcHJpdmF0ZSBGaWxlIGxvY2tGaWxlOwotCXByaXZhdGUgUmFuZG9tQWNjZXNzRmlsZSByYWY7Ci0JcHJpdmF0ZSBGaWxlTG9jayBmaWxlTG9jazsKLQotCXB1YmxpYyBMb2NrZXJfSmF2YU5pbyhGaWxlIGxvY2tGaWxlKSB7Ci0JCXRoaXMubG9ja0ZpbGUgPSBsb2NrRmlsZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gbG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJhZiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKGxvY2tGaWxlLCAicnciKTsgLy8kTk9OLU5MUy0xJAotCQl0cnl7Ci0JCQkvKgotCQkJICogZml4IGZvciBidWcgaHR0cDovL2J1Z3Muc3VuLmNvbS92aWV3X2J1Zy5kbz9idWdfaWQ9NjYyODU3NSBhbmQKLQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00NDczNSNjMTcKLQkJCSAqLwotCQkJZmlsZUxvY2sgPSByYWYuZ2V0Q2hhbm5lbCgpLnRyeUxvY2soMCwgMSwgZmFsc2UpOwotCQl9IGNhdGNoKE92ZXJsYXBwaW5nRmlsZUxvY2tFeGNlcHRpb24gZSkgewotCQkJZmlsZUxvY2sgPSBudWxsOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGZpbGVMb2NrICE9IG51bGwpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlyYWYuY2xvc2UoKTsKLQkJCXJhZiA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlKCkgewotCQlpZiAoZmlsZUxvY2sgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlmaWxlTG9jay5yZWxlYXNlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9kb24ndCBjb21wbGFpbiwgd2UncmUgbWFraW5nIGEgYmVzdCBlZmZvcnQgdG8gY2xlYW4gdXAKLQkJCX0KLQkJCWZpbGVMb2NrID0gbnVsbDsKLQkJfQotCQlpZiAocmFmICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmFmLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9kb24ndCBjb21wbGFpbiwgd2UncmUgbWFraW5nIGEgYmVzdCBlZmZvcnQgdG8gY2xlYW4gdXAKLQkJCX0KLQkJCXJhZiA9IG51bGw7Ci0JCX0KLQkJaWYgKGxvY2tGaWxlICE9IG51bGwpIHsKLQkJCWxvY2tGaWxlLmRlbGV0ZSgpOwotCQkJbG9ja0ZpbGUgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvTWVzc2FnZXMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ODg4YTYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yLm1lc3NhZ2VzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjZmlnX3VuYWJsZVRvTG9hZF9ub1VSTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjZmlnX3VuYWJsZVRvU2F2ZV9ub1VSTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjZmlnX3VuYWJsZVRvU2F2ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsZWRTaXRlUGFyc2VyX1VuYWJsZVRvQ3JlYXRlVVJMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxlZFNpdGVQYXJzZXJfVW5hYmxlVG9DcmVhdGVVUkxGb3JGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxlZFNpdGVQYXJzZXJfRXJyb3JQYXJzaW5nRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsZWRTaXRlUGFyc2VyX0Vycm9yQWNjZXNzaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxlZFNpdGVQYXJzZXJfZGF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVNYW5pZmVzdF9ub1ZlcnNpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZVBhcnNlcl9JZE9yVmVyc2lvbkludmFsaWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlR3JvdXBQcm92aWRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uQWN0aXZhdG9yX2luaXRpYWxpemU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkFjdGl2YXRvcl9jcmVhdGVDb25maWc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkFjdGl2YXRvcl91bmluc3RhbGxCdW5kbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhcnNlcl9jYW5ub3RMb2FkU2hhcmVkSW5zdGFsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uQWN0aXZhdG9yX2luc3RhbGxCdW5kbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGx1Z2luRW50cnlfdmVyc2lvbkVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluaUZpbGVSZWFkZXJfTWlzc2luZ0Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5pRmlsZVJlYWRlcl9PcGVuSU5JRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5pRmlsZVJlYWRlcl9SZWFkSW5pRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5pRmlsZVJlYWRlcl9SZWFkUHJvcEVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluaUZpbGVSZWFkZXJfUmVhZE1hcEVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVFbnRyeV9jb21wdXRlUGx1Z2luU3RhbXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUVudHJ5X2Nhbm5vdEZpbmRGZWF0dXJlSW5EaXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUVudHJ5X2R1cGxpY2F0ZUZlYXR1cmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUVudHJ5X3BsdWdpbnNEaXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGxhdGZvcm1Db25maWd1cmF0aW9uX2V4cGVjdGluZ1BsYXRmb3JtWE1Mb3JEaXJlY3Rvcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGxhdGZvcm1Db25maWd1cmF0aW9uX2Nhbm5vdEJhY2t1cENvbmZpZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbGF0Zm9ybUNvbmZpZ3VyYXRpb25fY2Fubm90Q2xvc2VTdHJlYW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGxhdGZvcm1Db25maWd1cmF0aW9uX2Nhbm5vdENsb3NlVGVtcEZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGxhdGZvcm1Db25maWd1cmF0aW9uX2Nhbm5vdFJlbmFtZVRlbXBGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsYXRmb3JtQ29uZmlndXJhdGlvbl9jYW5ub3RMb2FkQ29uZmlnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsYXRmb3JtQ29uZmlndXJhdGlvbl9jYW5ub3RMb2FkRGVmYXVsdFNpdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGxhdGZvcm1Db25maWd1cmF0aW9uX2Nhbm5vdEZpbmRDb25maWdGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsYXRmb3JtQ29uZmlndXJhdGlvbl9jYW5ub3RTYXZlTm9uRXhpc3RpbmdDb25maWc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGx1Z2luUGFyc2VyX3BsdWdpbl9ub19pZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5QYXJzZXJfcGx1Z2luX25vX3ZlcnNpb247Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MUHJpbnRIYW5kbGVyX3Vuc3VwcG9ydGVkTm9kZVR5cGU7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvUGxhdGZvcm1Db25maWd1cmF0aW9uRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvUGxhdGZvcm1Db25maWd1cmF0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWM0NDQ4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1BsYXRmb3JtQ29uZmlndXJhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5JUGxhdGZvcm1Db25maWd1cmF0aW9uRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFBsYXRmb3JtQ29uZmlndXJhdGlvbkZhY3RvcnkgaW1wbGVtZW50cyBJUGxhdGZvcm1Db25maWd1cmF0aW9uRmFjdG9yeSB7Ci0JcHVibGljIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIFBsYXRmb3JtQ29uZmlndXJhdGlvbi5nZXRDdXJyZW50KCk7Ci0JfQotCQotCXB1YmxpYyBJUGxhdGZvcm1Db25maWd1cmF0aW9uIGdldFBsYXRmb3JtQ29uZmlndXJhdGlvbihVUkwgdXJsKQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBQbGF0Zm9ybUNvbmZpZ3VyYXRpb24odXJsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pCi0JCQkJdGhyb3cgKElPRXhjZXB0aW9uKWU7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBJUGxhdGZvcm1Db25maWd1cmF0aW9uIGdldFBsYXRmb3JtQ29uZmlndXJhdGlvbihVUkwgdXJsLCBVUkwgbG9jKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBQbGF0Zm9ybUNvbmZpZ3VyYXRpb24odXJsLCBsb2MpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKGUgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikKLQkJCQl0aHJvdyAoSU9FeGNlcHRpb24pZTsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9QbHVnaW5FbnRyeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvUGx1Z2luRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NhNGYyMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9QbHVnaW5FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkVudHJ5IHsKLQotCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkOwotCXByaXZhdGUgU3RyaW5nIHBsdWdpblZlcnNpb247Ci0JcHJpdmF0ZSBib29sZWFuIGlzRnJhZ21lbnQgPSBmYWxzZTsKLQlwcml2YXRlIFZlcnNpb25lZElkZW50aWZpZXIgdmVyc2lvbklkOwotCXByaXZhdGUgU3RyaW5nIHVybDsKLQkKLQlwdWJsaWMgUGx1Z2luRW50cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB1cmwgcmVsYXRpdmUgdG8gdGhlIHNpdGUgbG9jYXRpb246IHBsdWdpbnMvb3JnLmVjbGlwc2UuZm9vL3BsdWdpbi54bWwKLQkgKiBOb3RlOiB0byBkbzogd2Ugc2hvdWxkIHByb2JhYmx5IG9ubHkgdXNlIHBsdWdpbnMvb3JnLmVjbGlwc2UuZm9vLyBpbiB0aGUgZnV0dXJlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUkwoKSB7Ci0JCXJldHVybiB1cmw7Ci0JfQotCQotCS8qKgotCSAqIHVybCBpcyByZWxhdGl2ZSB0byB0aGUgc2l0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVSTChTdHJpbmcgdXJsKSB7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWctaW4gaWRlbnRpZmllciBmb3IgdGhpcyBlbnRyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwbHVnLWluIGlkZW50aWZpZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZGVudGlmaWVyKCkgewotCQlyZXR1cm4gcGx1Z2luSWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Zy1pbiB2ZXJzaW9uIGZvciB0aGlzIGVudHJ5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBsdWctaW4gdmVyc2lvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpblZlcnNpb24oKSB7Ci0JCXJldHVybiBwbHVnaW5WZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbnRyeSBkZXNjcmliZXMgYSBmdWxsIHBsdWctaW4sIG9yIAotCSAqIGEgcGx1Zy1pbiBmcmFnbWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBlbnRyeSBpcyBhIHBsdWctaW4gZnJhZ21lbnQsIAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgZW50cnkgaXMgYSBwbHVnLWluCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGcmFnbWVudCgpIHsKLQkJcmV0dXJuIGlzRnJhZ21lbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZW50cnkgcGx1Zy1pbiBpZGVudGlmaWVyLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICoKLQkgKiBAcGFyYW0gcGx1Z2luSWQgdGhlIGVudHJ5IGlkZW50aWZpZXIuCi0JICovCi0Jdm9pZCBzZXRQbHVnaW5JZGVudGlmaWVyKFN0cmluZyBwbHVnaW5JZCkgewotCQl0aGlzLnBsdWdpbklkID0gcGx1Z2luSWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZW50cnkgcGx1Zy1pbiB2ZXJzaW9uLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICoKLQkgKiBAcGFyYW0gcGx1Z2luVmVyc2lvbiB0aGUgZW50cnkgdmVyc2lvbi4KLQkgKi8KLQl2b2lkIHNldFBsdWdpblZlcnNpb24oU3RyaW5nIHBsdWdpblZlcnNpb24pIHsKLQkJdGhpcy5wbHVnaW5WZXJzaW9uID0gcGx1Z2luVmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGVudHJ5IHJlcHJlc2VudHMgYSBmcmFnbWVudCBvciBwbHVnLWluLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICoKLQkgKiBAcGFyYW0gaXNGcmFnbWVudCBmcmFnbWVudCBzZXR0aW5nCi0JICovCi0JcHVibGljIHZvaWQgaXNGcmFnbWVudChib29sZWFuIGlzRnJhZ21lbnQpIHsKLQkJdGhpcy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIG1zZyA9IChnZXRQbHVnaW5JZGVudGlmaWVyKCkhPW51bGwpP2dldFBsdWdpbklkZW50aWZpZXIoKS50b1N0cmluZygpOiIiOyAvLyROT04tTkxTLTEkCi0JCW1zZyArPSBnZXRQbHVnaW5WZXJzaW9uKCkhPW51bGw/IiAiK2dldFBsdWdpblZlcnNpb24oKS50b1N0cmluZygpOiIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbXNnICs9IGlzRnJhZ21lbnQoKT8iIGZyYWdtZW50IjoiIHBsdWdpbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gbXNnOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaWRlbnRpZmllciBvZiB0aGlzIHBsdWdpbiBlbnRyeQotCSAqLwotCXB1YmxpYyBWZXJzaW9uZWRJZGVudGlmaWVyIGdldFZlcnNpb25lZElkZW50aWZpZXIoKSB7Ci0JCWlmICh2ZXJzaW9uSWQgIT0gbnVsbCkKLQkJCXJldHVybiB2ZXJzaW9uSWQ7Ci0KLQkJU3RyaW5nIGlkID0gZ2V0UGx1Z2luSWRlbnRpZmllcigpOwotCQlTdHJpbmcgdmVyID0gZ2V0UGx1Z2luVmVyc2lvbigpOwotCQlpZiAoaWQgIT0gbnVsbCAmJiB2ZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl2ZXJzaW9uSWQgPSBuZXcgVmVyc2lvbmVkSWRlbnRpZmllcihpZCwgdmVyKTsKLQkJCQlyZXR1cm4gdmVyc2lvbklkOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlVdGlscy5sb2coTkxTLmJpbmQoTWVzc2FnZXMuUGx1Z2luRW50cnlfdmVyc2lvbkVycm9yLCAobmV3IFN0cmluZ1tdIHsgaWQsIHZlciB9KSkpOwotCQkJfQotCQl9Ci0KLQkJdmVyc2lvbklkID0gbmV3IFZlcnNpb25lZElkZW50aWZpZXIoIiIsbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHZlcnNpb25JZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpZGVudGlmaWVyIG9mIHRoaXMgcGx1Z2luIGVudHJ5LiAKLQkgKiAKLQkgKi8KLQl2b2lkIHNldFZlcnNpb25lZElkZW50aWZpZXIoVmVyc2lvbmVkSWRlbnRpZmllciBpZGVudGlmaWVyKSB7Ci0JCXNldFBsdWdpbklkZW50aWZpZXIoaWRlbnRpZmllci5nZXRJZGVudGlmaWVyKCkpOwotCQlzZXRQbHVnaW5WZXJzaW9uKGlkZW50aWZpZXIuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkpOwotCX0JCi0KLQkvKioKLQkgKiBDb21wYXJlcyB0d28gcGx1Z2luIGVudHJpZXMgZm9yIGVxdWFsaXR5Ci0JICogCi0JICogQHBhcmFtIG9iamVjdCBwbHVnaW4gZW50cnkgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHR3byBlbnRyaWVzIGFyZSBlcXVhbCwgCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIFBsdWdpbkVudHJ5KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJUGx1Z2luRW50cnkgZSA9IChQbHVnaW5FbnRyeSkgb2JqZWN0OwotCQlyZXR1cm4gZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyhlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBnZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuaGFzaENvZGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9QbHVnaW5QYXJzZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1BsdWdpblBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTg4YTY0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1BsdWdpblBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuKjsKLQotLyoqCi0gKiBQYXJzZSBkZWZhdWx0IGZlYXR1cmUueG1sCi0gKi8KLQotcHVibGljIGNsYXNzIFBsdWdpblBhcnNlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIGltcGxlbWVudHMgSUNvbmZpZ3VyYXRpb25Db25zdGFudHMgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFNBWFBhcnNlckZhY3RvcnkgcGFyc2VyRmFjdG9yeSA9Ci0JCVNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQlwcml2YXRlIFNBWFBhcnNlciBwYXJzZXI7Ci0JcHJpdmF0ZSBQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeTsKLSAgICBwcml2YXRlIFN0cmluZyBsb2NhdGlvbjsKLQotCXByaXZhdGUgY2xhc3MgUGFyc2VDb21wbGV0ZUV4Y2VwdGlvbiBleHRlbmRzIFNBWEV4Y2VwdGlvbiB7Ci0JCQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgICAgICBwdWJsaWMgUGFyc2VDb21wbGV0ZUV4Y2VwdGlvbihTdHJpbmcgYXJnMCkgewotCQkJc3VwZXIoYXJnMCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVmYXVsdEZlYXR1cmVQYXJzZXIKLQkgKi8KLQlwdWJsaWMgUGx1Z2luUGFyc2VyKCkgewotCQlzdXBlcigpOwotCQl0cnkgewotCQkJcGFyc2VyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQkJCXRoaXMucGFyc2VyID0gcGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBQbHVnaW5FbnRyeSBwYXJzZShGaWxlIHBsdWdpbkZpbGUpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJRmlsZUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJdHJ5ewotCQkJaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBsdWdpbkZpbGUpOwotCQkJcmV0dXJuIHBhcnNlKGluLCBQTFVHSU5TICsgIi8iICsgcGx1Z2luRmlsZS5nZXRQYXJlbnRGaWxlKCkuZ2V0TmFtZSgpICsgIi8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX1maW5hbGx5ewotCQkJaWYgKGluICE9IG51bGwpewotCQkJCXRyeXsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9Y2F0Y2goSU9FeGNlcHRpb24gZSl7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFBsdWdpbkVudHJ5IHBhcnNlKElucHV0U3RyZWFtIGluLCBTdHJpbmcgYnVuZGxlVXJsKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0gICAgICAgICAgICBsb2NhdGlvbiA9IGJ1bmRsZVVybDsKLQkJCXBsdWdpbkVudHJ5ID0gbmV3IFBsdWdpbkVudHJ5KCk7Ci0JCQlwbHVnaW5FbnRyeS5zZXRVUkwoYnVuZGxlVXJsKTsKLQkJCXBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW4pLCB0aGlzKTsKLQkJfSBjYXRjaCAoUGFyc2VDb21wbGV0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZCwgd2Ugc3RvcHBlZCB0aGUgcGFyc2luZyB3aGVuIHdlIGhhdmUgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQKLQkJCS8vLyBubyBuZWVkIHRvIHB1cnN1ZSB0aGUgcGFyc2luZwotCQl9Ci0JCXJldHVybiBwbHVnaW5FbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIERlZmF1bHRIYW5kbGVyI3N0YXJ0RWxlbWVudChTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBBdHRyaWJ1dGVzKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLQkJU3RyaW5nIHRhZyA9IGxvY2FsTmFtZS50cmltKCk7Ci0KLQkJaWYgKHRhZy5lcXVhbHNJZ25vcmVDYXNlKENGR19QTFVHSU4pKSB7Ci0JCQlwbHVnaW5FbnRyeS5pc0ZyYWdtZW50KGZhbHNlKTsJCQkKLQkJCXByb2Nlc3NQbHVnaW4oYXR0cmlidXRlcyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAodGFnLmVxdWFsc0lnbm9yZUNhc2UoQ0ZHX0ZSQUdNRU5UKSkgewotCQkJcGx1Z2luRW50cnkuaXNGcmFnbWVudCh0cnVlKTsJCQkKLQkJCXByb2Nlc3NQbHVnaW4oYXR0cmlidXRlcyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKiogCi0JICogcHJvY2VzcyBwbHVnaW4gZW50cnkgaW5mbwotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzUGx1Z2luKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFBhcnNlQ29tcGxldGVFeGNlcHRpb24gewotCQlTdHJpbmcgaWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJpZCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB2ZXJzaW9uID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpZCA9PSBudWxsIHx8IGlkLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlpZCA9ICJfbm9faWRfIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgVXRpbHMubG9nKE5MUy5iaW5kKE1lc3NhZ2VzLlBsdWdpblBhcnNlcl9wbHVnaW5fbm9faWQsIChuZXcgU3RyaW5nW10geyBsb2NhdGlvbiB9KSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2ZXJzaW9uID09IG51bGwgfHwgdmVyc2lvbi50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgdmVyc2lvbiA9ICIwLjAuMCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIFV0aWxzLmxvZyhOTFMuYmluZChNZXNzYWdlcy5QbHVnaW5QYXJzZXJfcGx1Z2luX25vX3ZlcnNpb24sIChuZXcgU3RyaW5nW10geyBsb2NhdGlvbiB9KSkpOwotICAgICAgICB9Ci0JCXBsdWdpbkVudHJ5LnNldFZlcnNpb25lZElkZW50aWZpZXIobmV3IFZlcnNpb25lZElkZW50aWZpZXIoaWQsIHZlcnNpb24pKTsKLQkJCi0JCS8vIHN0b3AgcGFyc2luZyBub3cKLQkJdGhyb3cgbmV3IFBhcnNlQ29tcGxldGVFeGNlcHRpb24oIiIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvU2l0ZUVudHJ5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9TaXRlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk3Y2JjOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9TaXRlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci0KLQotcHVibGljIGNsYXNzIFNpdGVFbnRyeSBpbXBsZW1lbnRzIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVFbnRyeSwgSUNvbmZpZ3VyYXRpb25Db25zdGFudHN7CQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQUNfT1NfTUFSS0VSID0gIi5EU19TdG9yZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIFVSTCB1cmw7IC8vIHRoaXMgaXMgdGhlIGV4dGVybmFsIFVSTCBmb3IgdGhlIHNpdGUKLQlwcml2YXRlIFVSTCByZXNvbHZlZFVSTDsgLy8gdGhpcyBpcyB0aGUgcmVzb2x2ZWQgVVJMIHVzZWQgaW50ZXJuYWxseQotCXByaXZhdGUgSVNpdGVQb2xpY3kgcG9saWN5OwotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGVhYmxlID0gdHJ1ZTsKLQlwcml2YXRlIE1hcCBmZWF0dXJlRW50cmllczsKLQlwcml2YXRlIEFycmF5TGlzdCBwbHVnaW5FbnRyaWVzOwotCXByaXZhdGUgbG9uZyBjaGFuZ2VTdGFtcDsKLQlwcml2YXRlIGxvbmcgZmVhdHVyZXNDaGFuZ2VTdGFtcDsKLQlwcml2YXRlIGxvbmcgcGx1Z2luc0NoYW5nZVN0YW1wOwotCXByaXZhdGUgU3RyaW5nIGxpbmtGaWxlTmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7Ci0JcHJpdmF0ZSBDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkKLQlwcml2YXRlIHN0YXRpYyBGZWF0dXJlUGFyc2VyIGZlYXR1cmVQYXJzZXIgPSBuZXcgRmVhdHVyZVBhcnNlcigpOwotCXByaXZhdGUgc3RhdGljIFBsdWdpblBhcnNlciBwbHVnaW5QYXJzZXIgPSBuZXcgUGx1Z2luUGFyc2VyKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc01hY09TID0gVXRpbHMuZ2V0T1MoKS5lcXVhbHMoQ29uc3RhbnRzLk9TX01BQ09TWCk7Ci0KLQlwdWJsaWMgU2l0ZUVudHJ5KFVSTCB1cmwpIHsKLQkJdGhpcyh1cmwsbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBTaXRlRW50cnkoVVJMIHVybCwgSVNpdGVQb2xpY3kgcG9saWN5KSB7Ci0JCWlmICh1cmwgPT0gbnVsbCkKLQkJCXRyeSB7Ci0JCQkJdXJsID0gbmV3IFVSTCgicGxhdGZvcm06L2Jhc2UvIik7IC8vJE5PTi1OTFMtMSQgdHJ5IHVzaW5nIHBsYXRmb3JtLXJlbGF0aXZlIFVSTAotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQl1cmwgPSBQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uZ2V0SW5zdGFsbFVSTCgpOyAvLyBlbnN1cmUgd2UgY29tZSB1cCAuLi4gdXNlIGFic29sdXRlIGZpbGUgVVJMCi0JCQl9Ci0JCQkKLQkJaWYgKHBvbGljeSA9PSBudWxsKQotCQkJcG9saWN5ID0gbmV3IFNpdGVQb2xpY3koUGxhdGZvcm1Db25maWd1cmF0aW9uLmdldERlZmF1bHRQb2xpY3koKSwgREVGQVVMVF9QT0xJQ1lfTElTVCk7Ci0KLQkJaWYgKHVybC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJLy8gVE9ETyByZW1vdmUgdGhpcyB3aGVuIHBsYXRmb3JtIGZpeGVzIGxvY2FsIGZpbGUgdXJsJ3MKLQkJCQl0aGlzLnVybCA9IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpLnRvVVJMKCk7IAotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUxKSB7Ci0JCQkJdGhpcy51cmwgPSB1cmw7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJdGhpcy51cmwgPSB1cmw7Ci0JCQotCQl0aGlzLnBvbGljeSA9IHBvbGljeTsKLQkJdGhpcy5yZXNvbHZlZFVSTCA9IHRoaXMudXJsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbmZpZyhDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJaWYgKHVybC5nZXRQcm90b2NvbCgpLmVxdWFscygicGxhdGZvcm0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0cnkgewotCQkJCS8vIHJlc29sdmUgdGhlIGNvbmZpZyBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgY29uZmlnVVJMCi0JCQkJaWYgKHVybC5nZXRQYXRoKCkuc3RhcnRzV2l0aCgiL2NvbmZpZyIpKSB7CQotCQkJCQlVUkwgY29uZmlnVVJMID0gY29uZmlnLmdldFVSTCgpOwotCQkJCQlVUkwgY29uZmlnX2xvYyA9IG5ldyBVUkwoY29uZmlnVVJMLCAiLi4iKTsKLQkJCQkJcmVzb2x2ZWRVUkwgPSBQbGF0Zm9ybUNvbmZpZ3VyYXRpb24ucmVzb2x2ZVBsYXRmb3JtVVJMKHVybCwgY29uZmlnX2xvYyk7IC8vIDE5NTM2Ci0JCQkJfQotCQkJCWVsc2UgCi0JCQkJCXJlc29sdmVkVVJMID0gUGxhdGZvcm1Db25maWd1cmF0aW9uLnJlc29sdmVQbGF0Zm9ybVVSTCh1cmwsIGNvbmZpZy5nZXRJbnN0YWxsVVJMKCkpOyAvLyAxOTUzNgotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIHdpbGwgdXNlIHRoZSBiYXNlbGluZSBVUkwgLi4uCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlnKCkgewotCQlyZXR1cm4gY29uZmlnOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSVNpdGVFbnRyeSNnZXRVUkwoKQotCSAqLwotCXB1YmxpYyBVUkwgZ2V0VVJMKCkgewotCQlyZXR1cm4gdXJsOwotCX0KLQotCS8qCi0JKiBAc2VlIElTaXRlRW50cnkjZ2V0U2l0ZVBvbGljeSgpCi0JKi8KLQlwdWJsaWMgSVNpdGVQb2xpY3kgZ2V0U2l0ZVBvbGljeSgpIHsKLQkJcmV0dXJuIHBvbGljeTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGVFbnRyeSNzZXRTaXRlUG9saWN5KElTaXRlUG9saWN5KQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTaXRlUG9saWN5KElTaXRlUG9saWN5IHBvbGljeSkgewotCQlpZiAocG9saWN5ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXRoaXMucG9saWN5ID0gcG9saWN5OwotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZUVudHJ5I2dldEZlYXR1cmVzKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RmVhdHVyZXMoKSB7Ci0JCXJldHVybiBnZXREZXRlY3RlZEZlYXR1cmVzKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTaXRlRW50cnkjZ2V0UGx1Z2lucygpCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFBsdWdpbnMoKSB7Ci0KLQkJSVNpdGVQb2xpY3kgcG9saWN5ID0gZ2V0U2l0ZVBvbGljeSgpOwotCi0JCWlmIChwb2xpY3kuZ2V0VHlwZSgpID09IElTaXRlUG9saWN5LlVTRVJfSU5DTFVERSkKLQkJCXJldHVybiBwb2xpY3kuZ2V0TGlzdCgpOwotCi0JCWlmIChwb2xpY3kuZ2V0VHlwZSgpID09IElTaXRlUG9saWN5LlVTRVJfRVhDTFVERSkgewotCQkJQXJyYXlMaXN0IGRldGVjdGVkUGx1Z2lucyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChnZXREZXRlY3RlZFBsdWdpbnMoKSkpOwotCQkJU3RyaW5nW10gZXhjbHVkZWRQbHVnaW5zID0gcG9saWN5LmdldExpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhjbHVkZWRQbHVnaW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGRldGVjdGVkUGx1Z2lucy5jb250YWlucyhleGNsdWRlZFBsdWdpbnNbaV0pKQotCQkJCQlkZXRlY3RlZFBsdWdpbnMucmVtb3ZlKGV4Y2x1ZGVkUGx1Z2luc1tpXSk7Ci0JCQl9Ci0JCQlyZXR1cm4gKFN0cmluZ1tdKSBkZXRlY3RlZFBsdWdpbnMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQkJfQotCQkKLQkJaWYgKHBvbGljeS5nZXRUeXBlKCkgPT0gSVNpdGVQb2xpY3kuTUFOQUdFRF9PTkxZKSB7Ci0JCQlQbHVnaW5FbnRyeVtdIG1hbmFnZWRQbHVnaW5zID0gZ2V0TWFuYWdlZFBsdWdpbnMoKTsKLQkJCVN0cmluZ1tdIG1hbmFnZWRQbHVnaW5zVVJMcyA9IG5ldyBTdHJpbmdbbWFuYWdlZFBsdWdpbnMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGk9MDsgaTxtYW5hZ2VkUGx1Z2lucy5sZW5ndGg7IGkrKykKLQkJCQltYW5hZ2VkUGx1Z2luc1VSTHNbaV0gPSBtYW5hZ2VkUGx1Z2luc1tpXS5nZXRVUkwoKTsKLQkJCQotCQkJcmV0dXJuIG1hbmFnZWRQbHVnaW5zVVJMczsKLQkJfQotCi0JCS8vIGJhZCBwb2xpY3kgdHlwZQotCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQl9Ci0KLQlwcml2YXRlIFBsdWdpbkVudHJ5W10gZ2V0TWFuYWdlZFBsdWdpbnMoKSB7Ci0JCS8vIE5vdGU6Ci0JCS8vIFdlIGRldGVjdCBhbGwgdGhlIHBsdWdpbnMgb24gdGhlIHNpdGUsIGJ1dCBpdCB3b3VsZCBiZSBmYXN0ZXIKLQkJLy8gdG8ganVzdCBsb29rdXAgdGhlIHBsdWdpbnMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBlbnRyaWVzIGZvdW5kIGluIGVhY2ggZmVhdHVyZS4KLQkJLy8gVE9ETyBmaXggdGhlIGFib3ZlCi0JCWlmIChwbHVnaW5FbnRyaWVzID09IG51bGwpCi0JCQlkZXRlY3RQbHVnaW5zKCk7Ci0JCWlmIChmZWF0dXJlRW50cmllcyA9PSBudWxsKQotCQkJZGV0ZWN0RmVhdHVyZXMoKTsKLQkJCi0JCS8vIGNhY2hlIGFsbCB0aGUgcGx1Z2luIGVudHJpZXMgZm9yIGZhc3RlciBsb29rdXAgbGF0ZXIKLQkJTWFwIGNhY2hlZFBsdWdpbnMgPSBuZXcgSGFzaE1hcChwbHVnaW5FbnRyaWVzLnNpemUoKSk7Ci0JCWZvciAoaW50IGk9MDsgaTxwbHVnaW5FbnRyaWVzLnNpemUoKTsgaSsrKSB7Ci0JCQlQbHVnaW5FbnRyeSBwID0gKFBsdWdpbkVudHJ5KXBsdWdpbkVudHJpZXMuZ2V0KGkpOwotCQkJY2FjaGVkUGx1Z2lucy5wdXQocC5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCksIHApOwotCQl9Ci0JCQotCQlBcnJheUxpc3QgbWFuYWdlZFBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3I9ZmVhdHVyZUVudHJpZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGZlYXR1cmUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoIShmZWF0dXJlIGluc3RhbmNlb2YgRmVhdHVyZUVudHJ5KSkKLQkJCQljb250aW51ZTsKLQkJCQotCQkJUGx1Z2luRW50cnlbXSBwbHVnaW5zID0gKChGZWF0dXJlRW50cnkpZmVhdHVyZSkuZ2V0UGx1Z2luRW50cmllcygpOwotCQkJZm9yIChpbnQgaT0wOyBpPHBsdWdpbnMubGVuZ3RoOyBpKyspCi0JCQkJaWYgKGNhY2hlZFBsdWdpbnMuY29udGFpbnNLZXkocGx1Z2luc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKQotCQkJCQltYW5hZ2VkUGx1Z2lucy5hZGQoY2FjaGVkUGx1Z2lucy5nZXQocGx1Z2luc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKTsKLQkJCQkJCi0JCX0KLQkJcmV0dXJuIChQbHVnaW5FbnRyeVtdKW1hbmFnZWRQbHVnaW5zLnRvQXJyYXkobmV3IFBsdWdpbkVudHJ5W21hbmFnZWRQbHVnaW5zLnNpemUoKV0pOwotCX0KLQkKLQlwdWJsaWMgUGx1Z2luRW50cnlbXSBnZXRQbHVnaW5FbnRyaWVzKCkgewotCQlTdHJpbmdbXSBwbHVnaW5VUkxzID0gZ2V0UGx1Z2lucygpOwotCQkvLyBoYXNoIHRoZSBhcnJheSwgZm9yIGZhc3RlciBsb29rdXBzCi0JCUhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAocGx1Z2luVVJMcy5sZW5ndGgpOwotCQlmb3IgKGludCBpPTA7IGk8cGx1Z2luVVJMcy5sZW5ndGg7IGkrKykKLQkJCW1hcC5wdXQocGx1Z2luVVJMc1tpXSwgcGx1Z2luVVJMc1tpXSk7Ci0JCQotCQlpZiAocGx1Z2luRW50cmllcyA9PSBudWxsKQotCQkJCWRldGVjdFBsdWdpbnMoKTsKLQkJCi0JCUFycmF5TGlzdCBwbHVnaW5zID0gbmV3IEFycmF5TGlzdChwbHVnaW5VUkxzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGk9MDsgaTxwbHVnaW5FbnRyaWVzLnNpemUoKTsgaSsrKSB7Ci0JCQlQbHVnaW5FbnRyeSBwID0gKFBsdWdpbkVudHJ5KXBsdWdpbkVudHJpZXMuZ2V0KGkpOwotCQkJaWYgKG1hcC5jb250YWluc0tleShwLmdldFVSTCgpKSkKLQkJCQlwbHVnaW5zLmFkZChwKTsKLQkJfQotCQlyZXR1cm4gKFBsdWdpbkVudHJ5W10pcGx1Z2lucy50b0FycmF5KG5ldyBQbHVnaW5FbnRyeVtwbHVnaW5zLnNpemUoKV0pOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSVNpdGVFbnRyeSNnZXRDaGFuZ2VTdGFtcCgpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0Q2hhbmdlU3RhbXAoKSB7Ci0JCWlmIChjaGFuZ2VTdGFtcCA9PSAwKQotCQkJY29tcHV0ZUNoYW5nZVN0YW1wKCk7Ci0JCXJldHVybiBjaGFuZ2VTdGFtcDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGVFbnRyeSNnZXRGZWF0dXJlc0NoYW5nZVN0YW1wKCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRGZWF0dXJlc0NoYW5nZVN0YW1wKCkgewotCQlpZiAoZmVhdHVyZXNDaGFuZ2VTdGFtcCA9PSAwKQotCQkJY29tcHV0ZUZlYXR1cmVzQ2hhbmdlU3RhbXAoKTsKLQkJcmV0dXJuIGZlYXR1cmVzQ2hhbmdlU3RhbXA7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTaXRlRW50cnkjZ2V0UGx1Z2luc0NoYW5nZVN0YW1wKCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRQbHVnaW5zQ2hhbmdlU3RhbXAoKSB7Ci0JCWlmIChwbHVnaW5zQ2hhbmdlU3RhbXAgPT0gMCkKLQkJCWNvbXB1dGVQbHVnaW5zQ2hhbmdlU3RhbXAoKTsKLQkJcmV0dXJuIHBsdWdpbnNDaGFuZ2VTdGFtcDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGVFbnRyeSNpc1VwZGF0ZWFibGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXBkYXRlYWJsZSgpIHsKLQkJcmV0dXJuIHVwZGF0ZWFibGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFVwZGF0ZWFibGUoYm9vbGVhbiB1cGRhdGVhYmxlKSB7Ci0JCXRoaXMudXBkYXRlYWJsZSA9IHVwZGF0ZWFibGU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTaXRlRW50cnkjaXNOYXRpdmVseUxpbmtlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOYXRpdmVseUxpbmtlZCgpIHsKLQkJcmV0dXJuIGlzRXh0ZXJuYWxseUxpbmtlZFNpdGUoKTsKLQl9Ci0KLQlwdWJsaWMgVVJMIGdldFJlc29sdmVkVVJMKCkgewotCQlyZXR1cm4gcmVzb2x2ZWRVUkw7Ci0JfQotCQotCS8qKgotCSAqIERldGVjdCBuZXcgZmVhdHVyZXMgKHRpbWVzdGFtcCA+IGN1cnJlbnQgc2l0ZSB0aW1lc3RhbXApCi0JICogYW5kIHZhbGlkYXRlcyBleGlzdGluZyBmZWF0dXJlcyAodGhleSBtaWdodCBoYXZlIGJlZW4gcmVtb3ZlZCkKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGV0ZWN0RmVhdHVyZXMoKSB7Ci0KLQkJaWYgKGZlYXR1cmVFbnRyaWVzICE9IG51bGwpCi0JCQl2YWxpZGF0ZUZlYXR1cmVFbnRyaWVzKCk7Ci0JCWVsc2UKLQkJCWZlYXR1cmVFbnRyaWVzID0gbmV3IEhhc2hNYXAoKTsKLQotCQlpZiAoIVBsYXRmb3JtQ29uZmlndXJhdGlvbi5zdXBwb3J0c0RldGVjdGlvbihyZXNvbHZlZFVSTCwgY29uZmlnLmdldEluc3RhbGxVUkwoKSkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gbG9jYXRlIGZlYXR1cmUgZW50cmllcyBvbiBzaXRlCi0JCUZpbGUgc2l0ZVJvb3QgPSBuZXcgRmlsZShyZXNvbHZlZFVSTC5nZXRGaWxlKCkucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcikpOwotCQlGaWxlIGZlYXR1cmVzRGlyID0gbmV3IEZpbGUoc2l0ZVJvb3QsIEZFQVRVUkVTKTsKLQkJaWYgKGZlYXR1cmVzRGlyLmV4aXN0cygpKSB7Ci0JCQkvLyBoYW5kbGUgdGhlIGluc3RhbGxlZCBmZWF0dXJlcyB1bmRlciB0aGUgZmVhdHVyZXMgZGlyZWN0b3J5Ci0JCQlGaWxlW10gZGlycyA9IGZlYXR1cmVzRGlyLmxpc3RGaWxlcyhuZXcgRmlsZUZpbHRlcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmKSB7Ci0JCQkJCS8vIG1hYyBvcyBmb2xkZXJzIGNvbnRhaW4gYSBmaWxlIC5EU19TdG9yZSBpbiBlYWNoIGZvbGRlciwgYW5kIHdlIG5lZWQgdG8gc2tpcCBpdCAoYnVnIDc2ODY5KSAKLQkJCQkJaWYgKGlzTWFjT1MgJiYgZi5nZXROYW1lKCkuZXF1YWxzKE1BQ19PU19NQVJLRVIpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlib29sZWFuIHZhbGlkID0gZi5pc0RpcmVjdG9yeSgpICYmIChuZXcgRmlsZShmLEZFQVRVUkVfWE1MKS5leGlzdHMoKSk7Ci0JCQkJCWlmICghdmFsaWQpCi0JCQkJCQlVdGlscy5sb2coTkxTLmJpbmQoTWVzc2FnZXMuU2l0ZUVudHJ5X2Nhbm5vdEZpbmRGZWF0dXJlSW5EaXIsIChuZXcgU3RyaW5nW10geyBmLmdldEFic29sdXRlUGF0aCgpIH0pKSk7Ci0JCQkJCXJldHVybiB2YWxpZDsKLQkJCQl9Ci0JCQl9KTsKLQkJCi0JCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZGlycy5sZW5ndGg7IGluZGV4KyspIHsKLQkJCQl0cnkgewotCQkJCQlGaWxlIGZlYXR1cmVYTUwgPSBuZXcgRmlsZShkaXJzW2luZGV4XSwgRkVBVFVSRV9YTUwpOwotCQkJCQlpZiAoZmVhdHVyZVhNTC5sYXN0TW9kaWZpZWQoKSA8PSBmZWF0dXJlc0NoYW5nZVN0YW1wICYmCi0JCQkJCQlkaXJzW2luZGV4XS5sYXN0TW9kaWZpZWQoKSA8PSBmZWF0dXJlc0NoYW5nZVN0YW1wKQotCQkJCQkJY29udGludWU7Ci0JCQkJCVVSTCBmZWF0dXJlVVJMID0gZmVhdHVyZVhNTC50b1VSTCgpOwotCQkJCQlGZWF0dXJlRW50cnkgZmVhdHVyZUVudHJ5ID0gZmVhdHVyZVBhcnNlci5wYXJzZShmZWF0dXJlVVJMKTsKLQkJCQkJaWYgKGZlYXR1cmVFbnRyeSAhPSBudWxsKQotCQkJCQkJYWRkRmVhdHVyZUVudHJ5KGZlYXR1cmVFbnRyeSk7Ci0JCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkJVXRpbHMubG9nKE5MUy5iaW5kKE1lc3NhZ2VzLkluc3RhbGxlZFNpdGVQYXJzZXJfVW5hYmxlVG9DcmVhdGVVUkxGb3JGaWxlLCAobmV3IFN0cmluZ1tdIHsgZmVhdHVyZXNEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgfSkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCVV0aWxzLmRlYnVnKHJlc29sdmVkVVJMLnRvU3RyaW5nKCkgKyAiIGxvY2F0ZWQgICIgKyBmZWF0dXJlRW50cmllcy5zaXplKCkgKyAiIGZlYXR1cmUocykiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCS8qKgotCSAqIERldGVjdCBuZXcgcGx1Z2lucyAodGltZXN0YW1wID4gY3VycmVudCBzaXRlIHRpbWVzdGFtcCkKLQkgKiBhbmQgdmFsaWRhdGVzIGV4aXN0aW5nIHBsdWdpbnMgKHRoZXkgbWlnaHQgaGF2ZSBiZWVuIHJlbW92ZWQpCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRldGVjdFBsdWdpbnMoKSB7Ci0JCWJvb2xlYW4gY29tcGFyZVRpbWVTdGFtcHMgPSBmYWxzZTsKLQkJaWYgKHBsdWdpbkVudHJpZXMgIT0gbnVsbCkgewotCQkJdmFsaWRhdGVQbHVnaW5FbnRyaWVzKCk7Ci0JCQljb21wYXJlVGltZVN0YW1wcyA9IHRydWU7IC8vIG9ubHkgcGljayB1cCBuZXdlciBwbHVnaW5zCi0JCX0gZWxzZQotCQkJcGx1Z2luRW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpZiAoIVBsYXRmb3JtQ29uZmlndXJhdGlvbi5zdXBwb3J0c0RldGVjdGlvbihyZXNvbHZlZFVSTCwgY29uZmlnLmdldEluc3RhbGxVUkwoKSkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gbG9jYXRlIHBsdWdpbiBlbnRyaWVzIG9uIHNpdGUKLQkJRmlsZSBwbHVnaW5zRGlyID0gbmV3IEZpbGUocmVzb2x2ZWRVUkwuZ2V0RmlsZSgpLCBQTFVHSU5TKTsKLQkJCi0JCWlmIChwbHVnaW5zRGlyLmV4aXN0cygpICYmIHBsdWdpbnNEaXIuaXNEaXJlY3RvcnkoKSkgewotCQkJRmlsZVtdIGZpbGVzID0gcGx1Z2luc0Rpci5saXN0RmlsZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZihmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKXsKLQkJCQkJZGV0ZWN0VW5wYWNrZWRQbHVnaW4oZmlsZXNbaV0sIGNvbXBhcmVUaW1lU3RhbXBzKTsKLQkJCQl9ZWxzZSBpZihmaWxlc1tpXS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXIiKSl7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZGV0ZWN0UGFja2VkUGx1Z2luKGZpbGVzW2ldLCBjb21wYXJlVGltZVN0YW1wcyk7Ci0JCQkJfWVsc2V7Ci0JCQkJCS8vIG5vdCBidW5kbGUgZmlsZQotCQkJCX0KLQkJCX0KLQkJfSAKLQkJCi0JCVV0aWxzLmRlYnVnKHJlc29sdmVkVVJMLnRvU3RyaW5nKCkgKyAiIGxvY2F0ZWQgICIgKyBwbHVnaW5FbnRyaWVzLnNpemUoKSArICIgcGx1Z2luKHMpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlIGEgcGx1Z2luIGphcgotCSAqIEBwYXJhbSBjb21wYXJlVGltZVN0YW1wcyBzZXQgdG8gdHJ1ZSB3aGVuIGxvb2tpbmcgZm9yIHBsdWdpbnMgY2hhbmdlZCBzaW5jZSBsYXN0IHRpbWUgdGhleSB3ZXJlIGRldGVjdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRldGVjdFBhY2tlZFBsdWdpbihGaWxlIGZpbGUsIGJvb2xlYW4gY29tcGFyZVRpbWVTdGFtcHMpIHsKLQkJLy8gcGx1Z2luIHRvIHJ1biBkaXJlY3RseSBmcm9tIGphcgotCQlpZiAoY29tcGFyZVRpbWVTdGFtcHMgJiYgZmlsZS5sYXN0TW9kaWZpZWQoKSA8PSBwbHVnaW5zQ2hhbmdlU3RhbXApIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgZW50cnlOYW1lID0gTUVUQV9NQU5JRkVTVF9NRjsKLQkJWmlwRmlsZSB6ID0gbnVsbDsKLQkJSW5wdXRTdHJlYW0gYnVuZGxlTWFuaWZlc3RJbiA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIHBsdWdpbk1hbmlmZXN0SW4gPSBudWxsOwotCQlTdHJpbmcgcGx1Z2luVVJMID0gUExVR0lOUyArICIvIiArIGZpbGUuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQkvLyBGaXJzdCwgY2hlY2sgaWYgaGFzIHZhbGlkIGJ1bmRsZSBtYW5pZmVzdAotCQkJeiA9IG5ldyBaaXBGaWxlKGZpbGUpOwotCQkJaWYgKHouZ2V0RW50cnkoZW50cnlOYW1lKSAhPSBudWxsKSB7Ci0JCQkJYnVuZGxlTWFuaWZlc3RJbiA9IHouZ2V0SW5wdXRTdHJlYW0obmV3IFppcEVudHJ5KGVudHJ5TmFtZSkpOwotCQkJCUJ1bmRsZU1hbmlmZXN0IG1hbmlmZXN0ID0gbmV3IEJ1bmRsZU1hbmlmZXN0KGJ1bmRsZU1hbmlmZXN0SW4sCi0JCQkJCQlwbHVnaW5VUkwpOwotCQkJCWlmIChtYW5pZmVzdC5leGlzdHMoKSkgewotCQkJCQlhZGRQbHVnaW5FbnRyeShtYW5pZmVzdC5nZXRQbHVnaW5FbnRyeSgpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCS8vIG5vIGJ1bmRsZSBtYW5pZmVzdCwgY2hlY2sgZm9yIHBsdWdpbi54bWwgb3IgZnJhZ21lbnQueG1sCi0JCQllbnRyeU5hbWUgPSBQTFVHSU5fWE1MOwotCQkJaWYgKHouZ2V0RW50cnkoZW50cnlOYW1lKSA9PSBudWxsKSB7Ci0JCQkJZW50cnlOYW1lID0gRlJBR01FTlRfWE1MOwotCQkJfQotCQkJaWYgKHouZ2V0RW50cnkoZW50cnlOYW1lKSAhPSBudWxsKSB7Ci0JCQkJcGx1Z2luTWFuaWZlc3RJbiA9IHouZ2V0SW5wdXRTdHJlYW0obmV3IFppcEVudHJ5KGVudHJ5TmFtZSkpOwotCQkJCVBsdWdpbkVudHJ5IGVudHJ5MSA9IHBsdWdpblBhcnNlci5wYXJzZShwbHVnaW5NYW5pZmVzdEluLAotCQkJCQkJcGx1Z2luVVJMKTsKLQkJCQlhZGRQbHVnaW5FbnRyeShlbnRyeTEpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlNSkgewotCQkJU3RyaW5nIHBsdWdpbkZpbGVTdHJpbmcyID0gcGx1Z2luVVJMICsgIiEiICsgZW50cnlOYW1lOyAvLyROT04tTkxTLTEkCi0JCQlVdGlscy5sb2coTkxTLmJpbmQoTWVzc2FnZXMuSW5zdGFsbGVkU2l0ZVBhcnNlcl9FcnJvckFjY2Vzc2luZywgKG5ldyBTdHJpbmdbXSB7IHBsdWdpbkZpbGVTdHJpbmcyIH0pKSk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlMykgewotCQkJU3RyaW5nIHBsdWdpbkZpbGVTdHJpbmcxID0gcGx1Z2luVVJMICsgIiEiICsgZW50cnlOYW1lOyAvLyROT04tTkxTLTEkCi0JCQlVdGlscy5sb2coTkxTLmJpbmQoTWVzc2FnZXMuSW5zdGFsbGVkU2l0ZVBhcnNlcl9FcnJvclBhcnNpbmdGaWxlLCAobmV3IFN0cmluZ1tdIHsgcGx1Z2luRmlsZVN0cmluZzEgfSkpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChidW5kbGVNYW5pZmVzdEluICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlidW5kbGVNYW5pZmVzdEluLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTQpIHsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocGx1Z2luTWFuaWZlc3RJbiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcGx1Z2luTWFuaWZlc3RJbi5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUyKSB7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHogIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXouY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiBAcGFyYW0gZmlsZSBhIHBsdWdpbiBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gY29tcGFyZVRpbWVTdGFtcHMgc2V0IHRvIHRydWUgd2hlbiBsb29raW5nIGZvciBwbHVnaW5zIGNoYW5nZWQgc2luY2UgbGFzdCB0aW1lIHRoZXkgd2VyZSBkZXRlY3RlZAotCSAqLwotCXByaXZhdGUgdm9pZCBkZXRlY3RVbnBhY2tlZFBsdWdpbihGaWxlIGZpbGUsIGJvb2xlYW4gY29tcGFyZVRpbWVTdGFtcHMpIHsKLQkJLy8gdW5wYWNrZWQgcGx1Z2luCi0JCWxvbmcgZGlyVGltZXN0YW1wID0gZmlsZS5sYXN0TW9kaWZpZWQoKTsKLQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoZmlsZSwgTUVUQV9NQU5JRkVTVF9NRik7Ci0JCXRyeSB7Ci0JCQkvLyBGaXJzdCwgY2hlY2sgaWYgaGFzIHZhbGlkIGJ1bmRsZSBtYW5pZmVzdAotCQkJQnVuZGxlTWFuaWZlc3QgYnVuZGxlTWFuaWZlc3QgPSBuZXcgQnVuZGxlTWFuaWZlc3QocGx1Z2luRmlsZSk7Ci0JCQlpZiAoYnVuZGxlTWFuaWZlc3QuZXhpc3RzKCkpIHsKLQkJCQlpZiAoY29tcGFyZVRpbWVTdGFtcHMKLQkJCQkJCSYmIGRpclRpbWVzdGFtcCA8PSBwbHVnaW5zQ2hhbmdlU3RhbXAKLQkJCQkJCSYmIHBsdWdpbkZpbGUubGFzdE1vZGlmaWVkKCkgPD0gcGx1Z2luc0NoYW5nZVN0YW1wKQotCQkJCQlyZXR1cm47Ci0JCQkJUGx1Z2luRW50cnkgZW50cnkgPSBidW5kbGVNYW5pZmVzdC5nZXRQbHVnaW5FbnRyeSgpOwotCQkJCWFkZFBsdWdpbkVudHJ5KGVudHJ5KTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gbm8gYnVuZGxlIG1hbmlmZXN0LCBjaGVjayBmb3IgcGx1Z2luLnhtbCBvciBmcmFnbWVudC54bWwKLQkJCQlwbHVnaW5GaWxlID0gbmV3IEZpbGUoZmlsZSwgUExVR0lOX1hNTCk7Ci0JCQkJaWYgKCFwbHVnaW5GaWxlLmV4aXN0cygpKSB7IAotCQkJCQlwbHVnaW5GaWxlID0gbmV3IEZpbGUoZmlsZSwgRlJBR01FTlRfWE1MKTsgCi0JCQkJfQotCQkJCWlmIChwbHVnaW5GaWxlLmV4aXN0cygpICYmICFwbHVnaW5GaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJLy8gVE9ETyBpbiB0aGUgZnV0dXJlLCBhc3N1bWUgdGhhdCB0aGUgdGltZXN0YW1wcyBhcmUgbm90Ci0JCQkJCS8vIHJlbGlhYmxlLAotCQkJCQkvLyBvciB0aGF0IHRoZSB1c2VyIG1hbnVhbGx5IG1vZGlmaWVkIGFuIGV4aXN0aW5nIHBsdWdpbiwKLQkJCQkJLy8gc28KLQkJCQkJLy8gdGhlIGFwcGFyZW50bHkgbW9kaWZlZCBwbHVnaW4gbWF5IGFjdHVhbGx5IGJlIGNvbmZpZ3VyZWQKLQkJCQkJLy8gYWxyZWFkeS4KLQkJCQkJLy8gV2Ugd2lsbCBuZWVkIHRvIGRvdWJsZSBjaGVjayBmb3IgdGhpcy4gRU5EIHRvIGRvLgotCQkJCQlpZiAoY29tcGFyZVRpbWVTdGFtcHMgCi0JCQkJCQkJJiYgZGlyVGltZXN0YW1wIDw9IHBsdWdpbnNDaGFuZ2VTdGFtcAotCQkJCQkJCSYmIHBsdWdpbkZpbGUubGFzdE1vZGlmaWVkKCkgPD0gcGx1Z2luc0NoYW5nZVN0YW1wKQotCQkJCQkJcmV0dXJuOwotCQkJCQlQbHVnaW5FbnRyeSBlbnRyeSA9IHBsdWdpblBhcnNlci5wYXJzZShwbHVnaW5GaWxlKTsKLQkJCQkJYWRkUGx1Z2luRW50cnkoZW50cnkpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIHBsdWdpbkZpbGVTdHJpbmcgPSBwbHVnaW5GaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJaWYgKENvbmZpZ3VyYXRpb25BY3RpdmF0b3IuREVCVUcpCi0JCQkJVXRpbHMubG9nKFV0aWxzLm5ld1N0YXR1cyhOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsZWRTaXRlUGFyc2VyX0Vycm9yUGFyc2luZ0ZpbGUsIChuZXcgU3RyaW5nW10geyBwbHVnaW5GaWxlU3RyaW5nIH0pKSwgZSkpOwotCQkJZWxzZQotCQkJCVV0aWxzLmxvZyhOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsZWRTaXRlUGFyc2VyX0Vycm9yQWNjZXNzaW5nLCAobmV3IFN0cmluZ1tdIHsgcGx1Z2luRmlsZVN0cmluZyB9KSkpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIHBsdWdpbkZpbGVTdHJpbmcgPSBwbHVnaW5GaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJVXRpbHMubG9nKE5MUy5iaW5kKE1lc3NhZ2VzLkluc3RhbGxlZFNpdGVQYXJzZXJfRXJyb3JQYXJzaW5nRmlsZSwgKG5ldyBTdHJpbmdbXSB7IHBsdWdpbkZpbGVTdHJpbmcgfSkpKTsKLSAgICAgICAgfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gbGlzdCBvZiBmZWF0dXJlIHVybCdzIChyZWxhdGl2ZSB0byBzaXRlKQotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIFN0cmluZ1tdIGdldERldGVjdGVkRmVhdHVyZXMoKSB7Ci0JCWlmIChmZWF0dXJlRW50cmllcyA9PSBudWxsKQotCQkJZGV0ZWN0RmVhdHVyZXMoKTsKLQkJU3RyaW5nW10gZmVhdHVyZXMgPSBuZXcgU3RyaW5nW2ZlYXR1cmVFbnRyaWVzLnNpemUoKV07Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZmVhdHVyZUVudHJpZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGZlYXR1cmVzLmxlbmd0aDsgaSsrKQotCQkJZmVhdHVyZXNbaV0gPSAoKEZlYXR1cmVFbnRyeSlpdGVyYXRvci5uZXh0KCkpLmdldFVSTCgpOwotCQlyZXR1cm4gZmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBsaXN0IG9mIHBsdWdpbiB1cmwncyAocmVsYXRpdmUgdG8gc2l0ZSkKLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCBTdHJpbmdbXSBnZXREZXRlY3RlZFBsdWdpbnMoKSB7Ci0JCWlmIChwbHVnaW5FbnRyaWVzID09IG51bGwpCi0JCQlkZXRlY3RQbHVnaW5zKCk7Ci0JCQotCQlTdHJpbmdbXSBwbHVnaW5zID0gbmV3IFN0cmluZ1twbHVnaW5FbnRyaWVzLnNpemUoKV07Ci0JCWZvciAoaW50IGk9MDsgaTxwbHVnaW5zLmxlbmd0aDsgaSsrKQotCQkJcGx1Z2luc1tpXSA9ICgoUGx1Z2luRW50cnkpcGx1Z2luRW50cmllcy5nZXQoaSkpLmdldFVSTCgpOwotCQlyZXR1cm4gcGx1Z2luczsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcHV0ZUNoYW5nZVN0YW1wKCkgewotCQljaGFuZ2VTdGFtcCA9IE1hdGgubWF4KGNvbXB1dGVGZWF0dXJlc0NoYW5nZVN0YW1wKCksIGNvbXB1dGVQbHVnaW5zQ2hhbmdlU3RhbXAoKSk7Ci0vLwkJY2hhbmdlU3RhbXBJc1ZhbGlkID0gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBsb25nIGNvbXB1dGVGZWF0dXJlc0NoYW5nZVN0YW1wKCkgewotCQlpZiAoZmVhdHVyZXNDaGFuZ2VTdGFtcCA+IDApCi0JCQlyZXR1cm4gZmVhdHVyZXNDaGFuZ2VTdGFtcDsKLQkJCi0JCWxvbmcgc3RhcnQgPSAwOwotCQlpZiAoQ29uZmlndXJhdGlvbkFjdGl2YXRvci5ERUJVRykKLQkJCXN0YXJ0ID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKLQkJU3RyaW5nW10gZmVhdHVyZXMgPSBnZXRGZWF0dXJlcygpOwotCQotCQkvLyBjb21wdXRlIHN0YW1wIGZvciB0aGUgZmVhdHVyZXMgZGlyZWN0b3J5Ci0JCWxvbmcgZGlyU3RhbXAgPSAwOwotCQlpZiAoUGxhdGZvcm1Db25maWd1cmF0aW9uLnN1cHBvcnRzRGV0ZWN0aW9uKHJlc29sdmVkVVJMLCBjb25maWcuZ2V0SW5zdGFsbFVSTCgpKSkgewotCQkJRmlsZSByb290ID0gbmV3IEZpbGUocmVzb2x2ZWRVUkwuZ2V0RmlsZSgpLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpKTsKLQkJCUZpbGUgZmVhdHVyZXNEaXIgPSBuZXcgRmlsZShyb290LCBGRUFUVVJFUyk7Ci0JCQlkaXJTdGFtcCA9IGZlYXR1cmVzRGlyLmxhc3RNb2RpZmllZCgpOwotCQl9Ci0JCWZlYXR1cmVzQ2hhbmdlU3RhbXAgPSBNYXRoLm1heChkaXJTdGFtcCwgY29tcHV0ZVN0YW1wKGZlYXR1cmVzKSk7Ci0JCWlmIChDb25maWd1cmF0aW9uQWN0aXZhdG9yLkRFQlVHKSB7Ci0JCQlsb25nIGVuZCA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7Ci0JCQlVdGlscy5kZWJ1ZyhyZXNvbHZlZFVSTC50b1N0cmluZygpICsgIiBmZWF0dXJlIHN0YW1wOiAiICsgZmVhdHVyZXNDaGFuZ2VTdGFtcCArICIgaW4gIiArIChlbmQgLSBzdGFydCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgICAKLQkJfQotCQlyZXR1cm4gZmVhdHVyZXNDaGFuZ2VTdGFtcDsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBsb25nIGNvbXB1dGVQbHVnaW5zQ2hhbmdlU3RhbXAoKSB7Ci0JCWlmIChwbHVnaW5zQ2hhbmdlU3RhbXAgPiAwKQotCQkJcmV0dXJuIHBsdWdpbnNDaGFuZ2VTdGFtcDsKLQkJCi0JCWlmICghUGxhdGZvcm1Db25maWd1cmF0aW9uLnN1cHBvcnRzRGV0ZWN0aW9uKHJlc29sdmVkVVJMLCBjb25maWcuZ2V0SW5zdGFsbFVSTCgpKSkgewotCQkJVXRpbHMubG9nKE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVFbnRyeV9jb21wdXRlUGx1Z2luU3RhbXAsIChuZXcgU3RyaW5nW10geyByZXNvbHZlZFVSTC50b0V4dGVybmFsRm9ybSgpIH0pKSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCS8vIGNvbXB1dGUgc3RhbXAgZm9yIHRoZSBwbHVnaW5zIGRpcmVjdG9yeQotCQlGaWxlIHJvb3QgPSBuZXcgRmlsZShyZXNvbHZlZFVSTC5nZXRGaWxlKCkucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcikpOwotCQlGaWxlIHBsdWdpbnNEaXIgPSBuZXcgRmlsZShyb290LCBQTFVHSU5TKTsKLQkJaWYgKCFwbHVnaW5zRGlyLmV4aXN0cygpIHx8ICFwbHVnaW5zRGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCVV0aWxzLmRlYnVnKE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVFbnRyeV9wbHVnaW5zRGlyLCAobmV3IFN0cmluZ1tdIHsgcGx1Z2luc0Rpci5nZXRBYnNvbHV0ZVBhdGgoKSB9KSkpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlwbHVnaW5zQ2hhbmdlU3RhbXAgPSBwbHVnaW5zRGlyLmxhc3RNb2RpZmllZCgpOwotCQlyZXR1cm4gcGx1Z2luc0NoYW5nZVN0YW1wOwotCX0KLQotCXByaXZhdGUgbG9uZyBjb21wdXRlU3RhbXAoU3RyaW5nW10gdGFyZ2V0cykgewotCi0JCWxvbmcgcmVzdWx0ID0gMDsKLQkJaWYgKCFQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uc3VwcG9ydHNEZXRlY3Rpb24ocmVzb2x2ZWRVUkwsIGNvbmZpZy5nZXRJbnN0YWxsVVJMKCkpKSB7Ci0JCQkvLyBOT1RFOiAgdGhpcyBwYXRoIHNob3VsZCBub3QgYmUgZXhlY3V0ZWQgdW50aWwgd2Ugc3VwcG9ydCBydW5uaW5nCi0JCQkvLyAgICAgICAgZnJvbSBhbiBhcmJpdHJhcnkgVVJMIChpbiBwYXJ0aWN1bGFyIGZyb20gaHR0cCBzZXJ2ZXIpLiBGb3IKLQkJCS8vICAgICAgICBub3cganVzdCBjb21wdXRlIHN0YW1wIGFjcm9zcyB0aGUgbGlzdCBvZiBuYW1lcy4gRXZlbnR1YWxseQotCQkJLy8gICAgICAgIHdoZW4gZ2VuZXJhbCBVUkxzIGFyZSBzdXBwb3J0ZWQgd2UgbmVlZCB0byBkbyBiZXR0ZXIgKGZhY3RvcgotCQkJLy8gICAgICAgIGluIGF0IGxlYXN0IHRoZSBleGlzdGVuY2Ugb2YgdGhlIHRhcmdldCkuIEhvd2V2ZXIsIGdpdmVuIHRoaXMKLQkJCS8vICAgICAgICBjb2RlIGV4ZWN1dGVzIGVhcmx5IG9uIHRoZSBzdGFydHVwIHNlcXVlbmNlIHdlIG5lZWQgdG8gYmUKLQkJCS8vICAgICAgICBleHRyZW1lbHkgbWluZGZ1bCBvZiBwZXJmb3JtYW5jZSBpc3N1ZXMuCi0JCQkvLyBJbiBmYWN0LCB3ZSBzaG91bGQgZ2V0IHRoZSBsYXN0IG1vZGlmaWVkIGZyb20gdGhlIGNvbm5lY3Rpb24KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFyZ2V0cy5sZW5ndGg7IGkrKykKLQkJCQlyZXN1bHQgXj0gdGFyZ2V0c1tpXS5oYXNoQ29kZSgpOwotCQkJVXRpbHMuZGVidWcoIipXQVJOSU5HKiBjb21wdXRpbmcgc3RhbXAgdXNpbmcgVVJMIGhhc2hjb2RlcyBvbmx5Iik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCS8vIGNvbXB1dGUgc3RhbXAgYWNyb3NzIGxvY2FsIHRhcmdldHMKLQkJCUZpbGUgcm9vdEZpbGUgPSBuZXcgRmlsZShyZXNvbHZlZFVSTC5nZXRGaWxlKCkucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcikpOwotCQkJaWYgKHJvb3RGaWxlLmV4aXN0cygpKSB7Ci0JCQkJRmlsZSBmID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRhcmdldHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZiA9IG5ldyBGaWxlKHJvb3RGaWxlLCB0YXJnZXRzW2ldKTsKLQkJCQkJaWYgKGYuZXhpc3RzKCkpCi0JCQkJCQlyZXN1bHQgPSBNYXRoLm1heChyZXN1bHQsIGYubGFzdE1vZGlmaWVkKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExpbmtGaWxlTmFtZShTdHJpbmcgbGlua0ZpbGVOYW1lKSB7Ci0JCXRoaXMubGlua0ZpbGVOYW1lID0gbGlua0ZpbGVOYW1lOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExpbmtGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIGxpbmtGaWxlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsbHlMaW5rZWRTaXRlKCkgewotCQlyZXR1cm4gKGxpbmtGaWxlTmFtZSAhPSBudWxsICYmICFsaW5rRmlsZU5hbWUudHJpbSgpLmVxdWFscygiIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlZnJlc2goKSB7Ci0JCS8vIHJlc2V0IGNvbXB1dGVkIHZhbHVlcy4gV2lsbCBiZSB1cGRhdGVkIG9uIG5leHQgYWNjZXNzLgotCQlmZWF0dXJlc0NoYW5nZVN0YW1wID0gMDsKLQkJcGx1Z2luc0NoYW5nZVN0YW1wID0gMDsKLQkJY2hhbmdlU3RhbXAgPSAwOwotCQlmZWF0dXJlRW50cmllcyA9IG51bGw7Ci0JCXBsdWdpbkVudHJpZXMgPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWZyZXNoUGx1Z2lucygpIHsKLQkJLy8gcmVzZXQgY29tcHV0ZWQgdmFsdWVzLiBXaWxsIGJlIHVwZGF0ZWQgb24gbmV4dCBhY2Nlc3MuCi0JCXBsdWdpbnNDaGFuZ2VTdGFtcCA9IDA7Ci0JCWNoYW5nZVN0YW1wID0gMDsKLQkJcGx1Z2luRW50cmllcyA9IG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZEZlYXR1cmVFbnRyeShJRmVhdHVyZUVudHJ5IGZlYXR1cmUpIHsKLQkJaWYgKGZlYXR1cmVFbnRyaWVzID09IG51bGwpCi0JCQlmZWF0dXJlRW50cmllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCS8vIE1ha2Ugc3VyZSB3ZSBrZWVwIHRoZSBsYXJnZXIgdmVyc2lvbiBvZiBzYW1lIGZlYXR1cmUKLQkJSUZlYXR1cmVFbnRyeSBleGlzdGluZyA9IChGZWF0dXJlRW50cnkpZmVhdHVyZUVudHJpZXMuZ2V0KGZlYXR1cmUuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSk7Ci0JCWlmIChleGlzdGluZyAhPSBudWxsKSB7Ci0JCQlWZXJzaW9uZWRJZGVudGlmaWVyIGV4aXN0aW5nVmVyc2lvbiA9IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKGV4aXN0aW5nLmdldEZlYXR1cmVJZGVudGlmaWVyKCksIGV4aXN0aW5nLmdldEZlYXR1cmVWZXJzaW9uKCkpOwotCQkJVmVyc2lvbmVkSWRlbnRpZmllciBuZXdWZXJzaW9uID0gbmV3IFZlcnNpb25lZElkZW50aWZpZXIoZmVhdHVyZS5nZXRGZWF0dXJlSWRlbnRpZmllcigpLCBmZWF0dXJlLmdldEZlYXR1cmVWZXJzaW9uKCkpOwotCQkJaWYgKGV4aXN0aW5nVmVyc2lvbi5nZXRWZXJzaW9uKCkuY29tcGFyZVRvKG5ld1ZlcnNpb24uZ2V0VmVyc2lvbigpKSA8IDApIHsKLQkJCQlmZWF0dXJlRW50cmllcy5wdXQoZmVhdHVyZS5nZXRGZWF0dXJlSWRlbnRpZmllcigpLCBmZWF0dXJlKTsKLQkJCQlwbHVnaW5zQ2hhbmdlU3RhbXAgPSAwOwotCQkJfSBlbHNlIGlmIChleGlzdGluZ1ZlcnNpb24uZXF1YWxzKG5ld1ZlcnNpb24pKSB7Ci0JCQkJLy8gbG9nIGVycm9yIGlmIHNhbWUgZmVhdHVyZSB2ZXJzaW9uL2lkIGJ1dCBhIGRpZmZlcmVudCB1cmwKLQkJCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEZlYXR1cmVFbnRyeSAmJiBleGlzdGluZyBpbnN0YW5jZW9mIEZlYXR1cmVFbnRyeSAmJgotCQkJCQkJISgoRmVhdHVyZUVudHJ5KWZlYXR1cmUpLmdldFVSTCgpLmVxdWFscygoKEZlYXR1cmVFbnRyeSlleGlzdGluZykuZ2V0VVJMKCkpKQotCQkJCVV0aWxzLmxvZyhOTFMuYmluZChNZXNzYWdlcy5TaXRlRW50cnlfZHVwbGljYXRlRmVhdHVyZSwgKG5ldyBTdHJpbmdbXSB7IGdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCksIGV4aXN0aW5nLmdldEZlYXR1cmVJZGVudGlmaWVyKCkgfSkpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZlYXR1cmVFbnRyaWVzLnB1dChmZWF0dXJlLmdldEZlYXR1cmVJZGVudGlmaWVyKCksIGZlYXR1cmUpOwotCQkJcGx1Z2luc0NoYW5nZVN0YW1wID0gMDsKLQkJfQotCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEZlYXR1cmVFbnRyeSkKLQkJCSgoRmVhdHVyZUVudHJ5KWZlYXR1cmUpLnNldFNpdGUodGhpcyk7Ci0JfQotCQotCXB1YmxpYyBGZWF0dXJlRW50cnlbXSBnZXRGZWF0dXJlRW50cmllcygpIHsKLQkJaWYgKGZlYXR1cmVFbnRyaWVzID09IG51bGwpCi0JCQlkZXRlY3RGZWF0dXJlcygpOwotCQkKLQkJaWYgKGZlYXR1cmVFbnRyaWVzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IEZlYXR1cmVFbnRyeVswXTsKLQkJcmV0dXJuIChGZWF0dXJlRW50cnlbXSlmZWF0dXJlRW50cmllcy52YWx1ZXMoKS50b0FycmF5KG5ldyBGZWF0dXJlRW50cnlbZmVhdHVyZUVudHJpZXMuc2l6ZSgpXSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFBsdWdpbkVudHJ5KFBsdWdpbkVudHJ5IHBsdWdpbikgewotCQlpZiAocGx1Z2luRW50cmllcyA9PSBudWxsKQotCQkJcGx1Z2luRW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gTm90ZTogd2UgY291bGQgdXNlIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgc2FtZSBwbHVnaW4sIGxpa2Ugd2UgZG8gZm9yIGZlYXR1cmVzLCBidXQgd2UgbGV0IHRoZSBydW50aW1lIGZpZ3VyZSBpdCBvdXQKLQkJcGx1Z2luRW50cmllcy5hZGQocGx1Z2luKTsKLQl9Ci0JCi0JcHVibGljIFBsdWdpbkVudHJ5W10gZ2V0QWxsUGx1Z2luRW50cmllcygpIHsKLQkJaWYgKHBsdWdpbkVudHJpZXMgPT0gbnVsbCkKLQkJCWRldGVjdFBsdWdpbnMoKTsKLQkJcmV0dXJuIChQbHVnaW5FbnRyeVtdKXBsdWdpbkVudHJpZXMudG9BcnJheShuZXcgUGx1Z2luRW50cnlbcGx1Z2luRW50cmllcy5zaXplKCldKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9hZEZyb21EaXNrKGxvbmcgbGFzdENoYW5nZSkgdGhyb3dzIENvcmVFeGNlcHRpb257Ci0JCWZlYXR1cmVzQ2hhbmdlU3RhbXAgPSBsYXN0Q2hhbmdlOwotCQlwbHVnaW5zQ2hhbmdlU3RhbXAgPSBsYXN0Q2hhbmdlOwotCQlkZXRlY3RGZWF0dXJlcygpOwotCQlkZXRlY3RQbHVnaW5zKCk7Ci0JfQotCQotCS8qKgotCSAqIFNhdmVzIHN0YXRlIGFzIHhtbCBjb250ZW50IGluIGEgZ2l2ZW4gcGFyZW50IGVsZW1lbnQKLQkgKiBAcGFyYW0gZG9jCi0JICovCi0JcHVibGljIEVsZW1lbnQgdG9YTUwoRG9jdW1lbnQgZG9jKSB7Ci0KLQkJRWxlbWVudCBzaXRlRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KENGR19TSVRFKTsKLQkJCi0JCWlmIChnZXRVUkwoKSAhPSBudWxsKSB7Ci0JCQlVUkwgdG9QZXJzaXN0ID0gKGNvbmZpZyA9PSBudWxsIHx8IGNvbmZpZy5pc1RyYW5zaWVudCgpKSA/IGdldFVSTCgpIDogVXRpbHMubWFrZVJlbGF0aXZlKFV0aWxzLmdldEluc3RhbGxVUkwoKSwgZ2V0VVJMKCkpOwotCQkJc2l0ZUVsZW1lbnQuc2V0QXR0cmlidXRlKENGR19VUkwsIHRvUGVyc2lzdC50b1N0cmluZygpKTsKLQkJfQotCQkKLQkJc2l0ZUVsZW1lbnQuc2V0QXR0cmlidXRlKENGR19FTkFCTEVELCBpc0VuYWJsZWQoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2l0ZUVsZW1lbnQuc2V0QXR0cmlidXRlKENGR19VUERBVEVBQkxFLCBpc1VwZGF0ZWFibGUoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKGlzRXh0ZXJuYWxseUxpbmtlZFNpdGUoKSkgCi0JCQlzaXRlRWxlbWVudC5zZXRBdHRyaWJ1dGUoQ0ZHX0xJTktfRklMRSwgZ2V0TGlua0ZpbGVOYW1lKCkudHJpbSgpLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpKTsgCi0KLQkJaW50IHR5cGUgPSBnZXRTaXRlUG9saWN5KCkuZ2V0VHlwZSgpOwotCQlTdHJpbmcgdHlwZVN0cmluZyA9IENGR19QT0xJQ1lfVFlQRV9VTktOT1dOOwotCQl0cnkgewotCQkJdHlwZVN0cmluZyA9IENGR19QT0xJQ1lfVFlQRVt0eXBlXTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUgYmFkIGF0dHJpYnV0ZSAuLi4KLQkJfQotCQlzaXRlRWxlbWVudC5zZXRBdHRyaWJ1dGUoQ0ZHX1BPTElDWSwgdHlwZVN0cmluZyk7IAotCQlTdHJpbmdbXSBsaXN0ID0gZ2V0U2l0ZVBvbGljeSgpLmdldExpc3QoKTsKLQkJaWYgKGxpc3QubGVuZ3RoID4gMCkgewotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigyNTYpOwotCQkJZm9yIChpbnQgaT0wOyBpPGxpc3QubGVuZ3RoLTE7IGkrKykgewotCQkJCXNiLmFwcGVuZChsaXN0W2ldKTsKLQkJCQlzYi5hcHBlbmQoJywnKTsKLQkJCX0KLQkJCXNiLmFwcGVuZChsaXN0W2xpc3QubGVuZ3RoLTFdKTsKLQkJCXNpdGVFbGVtZW50LnNldEF0dHJpYnV0ZShDRkdfTElTVCwgc2IudG9TdHJpbmcoKSk7Ci0JCX0KLS8vCQkvLyBub3RlOiB3ZSBkb24ndCBzYXZlIGZlYXR1cmVzIGluc2lkZSB0aGUgc2l0ZSBlbGVtZW50LgotCQkKLQkJLy8gY29sbGVjdCBmZWF0dXJlIGVudHJpZXMKLS8vCQljb25maWdFbGVtZW50LnNldEF0dHJpYnV0ZShDRkdfRkVBVFVSRV9FTlRSWV9ERUZBVUxULCBkZWZhdWx0RmVhdHVyZSk7Ci0JCUZlYXR1cmVFbnRyeVtdIGZlYXRzID0gZ2V0RmVhdHVyZUVudHJpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0cy5sZW5ndGg7IGkrKykgewotCQkJRWxlbWVudCBmZWF0dXJlRWxlbWVudCA9IGZlYXRzW2ldLnRvWE1MKGRvYyk7Ci0JCQlzaXRlRWxlbWVudC5hcHBlbmRDaGlsZChmZWF0dXJlRWxlbWVudCk7Ci0JCX0KLQkJCi0JCXJldHVybiBzaXRlRWxlbWVudDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRmVhdHVyZUVudHJpZXMoKSB7Ci0JCUZpbGUgcm9vdCA9IG5ldyBGaWxlKHJlc29sdmVkVVJMLmdldEZpbGUoKS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZmVhdHVyZUVudHJpZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJQ29sbGVjdGlvbiBkZWxldGVkRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJRmVhdHVyZUVudHJ5IGZlYXR1cmUgPSAoRmVhdHVyZUVudHJ5KWl0ZXJhdG9yLm5leHQoKTsKLQkJCS8vIE5vdGU6IGluIHRoZSBmdXR1cmUsIHdlIGNhbiBjaGVjayBmb3IgYWJzb2x1dGUgdXJsIGFzIHdlbGwuCi0JCQkvLyAgICAgICBGb3Igbm93LCBmZWF0dXJlIHVybCBpcyBmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28vZmVhdHVyZS54bWwKLQkJCUZpbGUgZmVhdHVyZVhNTCA9IG5ldyBGaWxlKHJvb3QsIGZlYXR1cmUuZ2V0VVJMKCkpOwotCQkJaWYgKCFmZWF0dXJlWE1MLmV4aXN0cygpKQotCQkJCWRlbGV0ZWRGZWF0dXJlcy5hZGQoZmVhdHVyZS5nZXRGZWF0dXJlSWRlbnRpZmllcigpKTsKLQkJfQotCQlmb3IoSXRlcmF0b3IgaXQ9ZGVsZXRlZEZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspewotCQkJZmVhdHVyZUVudHJpZXMucmVtb3ZlKGl0Lm5leHQoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUGx1Z2luRW50cmllcygpIHsKLQkJRmlsZSByb290ID0gbmV3IEZpbGUocmVzb2x2ZWRVUkwuZ2V0RmlsZSgpLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpKTsKLQkJQ29sbGVjdGlvbiBkZWxldGVkUGx1Z2lucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHBsdWdpbkVudHJpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVBsdWdpbkVudHJ5IHBsdWdpbiA9IChQbHVnaW5FbnRyeSlwbHVnaW5FbnRyaWVzLmdldChpKTsKLQkJCS8vIE5vdGU6IGluIHRoZSBmdXR1cmUsIHdlIGNhbiBjaGVjayBmb3IgYWJzb2x1dGUgdXJsIGFzIHdlbGwuCi0JCQkvLyAgICAgICBGb3Igbm93LCBmZWF0dXJlIHVybCBpcyBwbHVnaW5zL29yZy5lY2xpcHNlLmZvby9wbHVnaW4ueG1sCi0JCQlGaWxlIHBsdWdpbkxvY2F0aW9uID0gbmV3IEZpbGUocm9vdCwgcGx1Z2luLmdldFVSTCgpKTsKLQkJCWlmICghcGx1Z2luTG9jYXRpb24uZXhpc3RzKCkpCi0JCQkJZGVsZXRlZFBsdWdpbnMuYWRkKHBsdWdpbik7Ci0JCX0KLQkJZm9yKEl0ZXJhdG9yIGl0PWRlbGV0ZWRQbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspewotCQkJcGx1Z2luRW50cmllcy5yZW1vdmUoaXQubmV4dCgpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiBlbmFibGVkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCXRoaXMuZW5hYmxlZCA9IGVuYWJsZTsKLQl9Ci0JCi0JcHVibGljIEZlYXR1cmVFbnRyeSBnZXRGZWF0dXJlRW50cnkoU3RyaW5nIGlkKSB7Ci0JCUZlYXR1cmVFbnRyeVtdIGZlYXR1cmVzID0gZ2V0RmVhdHVyZUVudHJpZXMoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGZlYXR1cmVzLmxlbmd0aDsgaSsrKQotCQkJaWYgKGZlYXR1cmVzW2ldLmdldEZlYXR1cmVJZGVudGlmaWVyKCkuZXF1YWxzKGlkKSkgCi0JCQkJcmV0dXJuIGZlYXR1cmVzW2ldOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHVibGljIGJvb2xlYW4gdW5jb25maWd1cmVGZWF0dXJlRW50cnkoSUZlYXR1cmVFbnRyeSBmZWF0dXJlKSB7Ci0JCUZlYXR1cmVFbnRyeSBleGlzdGluZ0ZlYXR1cmUgPSBnZXRGZWF0dXJlRW50cnkoZmVhdHVyZS5nZXRGZWF0dXJlSWRlbnRpZmllcigpKTsKLQkJaWYgKGV4aXN0aW5nRmVhdHVyZSAhPSBudWxsKQotCQkJZmVhdHVyZUVudHJpZXMucmVtb3ZlKGV4aXN0aW5nRmVhdHVyZS5nZXRGZWF0dXJlSWRlbnRpZmllcigpKTsKLQkJcmV0dXJuIGV4aXN0aW5nRmVhdHVyZSAhPSBudWxsOwotCX0KLQkKLQkvKgotCSAqIFRoaXMgaXMgYSBiaXQgb2YgYSBoYWNrLgotCSAqIFdoZW4gbm8gZmVhdHVyZXMgd2VyZSBhZGRlZCB0byB0aGUgc2l0ZSwgYnV0IHRoZSBzaXRlIGlzIGluaXRpYWxpemVkIGZyb20gcGxhdGZvcm0ueG1sIAotCSAqIHdlIG5lZWQgdG8gc2V0IHRoZSBmZWF0dXJlIHNldCB0byBlbXB0eSwgc28gd2UgZG9uJ3QgdHJ5IHRvIGRldGVjdCB0aGVtLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVkKCkgeyAKLQkJaWYgKGZlYXR1cmVFbnRyaWVzID09IG51bGwpCi0JCQlmZWF0dXJlRW50cmllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvU2l0ZVBvbGljeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvU2l0ZVBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2MzN2I5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1NpdGVQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuSVBsYXRmb3JtQ29uZmlndXJhdGlvbi4qOwotCi0KLXB1YmxpYyBjbGFzcyBTaXRlUG9saWN5IGltcGxlbWVudHMgSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeSB7Ci0KLQlwcml2YXRlIGludCB0eXBlOwotCXByaXZhdGUgU3RyaW5nW10gbGlzdDsKLQotCXB1YmxpYyBTaXRlUG9saWN5KCkgewotCX0KLQlwdWJsaWMgU2l0ZVBvbGljeShpbnQgdHlwZSwgU3RyaW5nW10gbGlzdCkgewotCQlpZiAodHlwZSAhPSBJU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUgJiYgdHlwZSAhPSBJU2l0ZVBvbGljeS5VU0VSX0VYQ0xVREUgJiYgdHlwZSAhPSBJU2l0ZVBvbGljeS5NQU5BR0VEX09OTFkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0KLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXRoaXMubGlzdCA9IG5ldyBTdHJpbmdbMF07Ci0JCWVsc2UKLQkJCXRoaXMubGlzdCA9IGxpc3Q7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTaXRlUG9saWN5I2dldFR5cGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoKLQkqIEBzZWUgSVNpdGVQb2xpY3kjZ2V0TGlzdCgpCi0JKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0TGlzdCgpIHsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTaXRlUG9saWN5I3NldExpc3QoU3RyaW5nW10pCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldExpc3QoU3RyaW5nW10gbGlzdCkgewotCQlpZiAobGlzdCA9PSBudWxsKQotCQkJdGhpcy5saXN0ID0gbmV3IFN0cmluZ1swXTsKLQkJZWxzZQotCQkJdGhpcy5saXN0ID0gbGlzdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1VwZGF0ZVVSTERlY29kZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1VwZGF0ZVVSTERlY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzYjQ5Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9VcGRhdGVVUkxEZWNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlVVJMRGVjb2RlciB7Ci0Jc3RhdGljIGJvb2xlYW4gaW5pdD1mYWxzZTsKLQlzdGF0aWMgYm9vbGVhbiB1c2VFbmM9dHJ1ZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIHMsIFN0cmluZyBlbmMpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJaWYgKCFpbml0KSB7Ci0JCQlpbml0ID0gdHJ1ZTsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIFVSTERlY29kZXIuZGVjb2RlKHMsIGVuYyk7Ci0JCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFcnJvciBlKSB7Ci0JCQkJdXNlRW5jPWZhbHNlOwkJCQkKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHVzZUVuYykgewotCQkJcmV0dXJuIFVSTERlY29kZXIuZGVjb2RlKHMsIGVuYyk7Ci0JCX0gCQkJCi0JCXJldHVybiBVUkxEZWNvZGVyLmRlY29kZShzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1ZlcnNpb25lZElkZW50aWZpZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1ZlcnNpb25lZElkZW50aWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2ZTI1My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9WZXJzaW9uZWRJZGVudGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvcjsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgVmVyc2lvbmVkSWRlbnRpZmllciB7Ci0JcHJpdmF0ZSBTdHJpbmcgaWRlbnRpZmllcjsKLQlwcml2YXRlIFZlcnNpb24gdmVyc2lvbjsKLQotCXB1YmxpYyBWZXJzaW9uZWRJZGVudGlmaWVyKFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24pIHsKLQkJdGhpcy5pZGVudGlmaWVyID0gaWQ7Ci0JCXRoaXMudmVyc2lvbiA9IFZlcnNpb24ucGFyc2VWZXJzaW9uKHZlcnNpb24pOwotCX0KLQotCXB1YmxpYyBWZXJzaW9uIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIGlkZW50aWZpZXI7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGVxdWFsSWRlbnRpZmllcnMoVmVyc2lvbmVkSWRlbnRpZmllciBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXJldHVybiBpZGVudGlmaWVyID09IG51bGw7Ci0JCXJldHVybiBpZC5pZGVudGlmaWVyLmVxdWFscyhpZGVudGlmaWVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBWZXJzaW9uZWRJZGVudGlmaWVyKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlWZXJzaW9uZWRJZGVudGlmaWVyIG90aGVyID0gKFZlcnNpb25lZElkZW50aWZpZXIpIG9iajsKLQkJaWYgKCFlcXVhbElkZW50aWZpZXJzKG90aGVyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHZlcnNpb24uZXF1YWxzKG90aGVyLmdldFZlcnNpb24oKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIChpZGVudGlmaWVyICsgIl8iICsgZ2V0VmVyc2lvbigpKS5oYXNoQ29kZSgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGlkZW50aWZpZXIgKyAiXyIgKyBnZXRWZXJzaW9uKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvWE1MUHJpbnRIYW5kbGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9YTUxQcmludEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE0OTgyYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9YTUxQcmludEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLnczYy5kb20uKjsKLQotCi1wdWJsaWMgY2xhc3MgWE1MUHJpbnRIYW5kbGVyIHsKLQkvLwl1c2VkIHRvIHByaW50IFhNTCBmaWxlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0hFQUQgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9IRUFEX0VORF9UQUcgPSAiPz4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RCTF9RVU9URVMgPSAiXCIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1NQQUNFID0gIiAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0JFR0lOX1RBRyA9ICI8IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTkRfVEFHID0gIj4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VRVUFMID0gIj0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1NMQVNIID0gIi8iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRCZWdpbkVsZW1lbnQoV3JpdGVyIHhtbFdyaXRlciwgU3RyaW5nIGVsZW1lbnRTdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbnsKLQkJU3RyaW5nQnVmZmVyIHRlbXAgPSBuZXcgU3RyaW5nQnVmZmVyKFhNTF9CRUdJTl9UQUcpOwotCQl0ZW1wLmFwcGVuZChlbGVtZW50U3RyaW5nKS5hcHBlbmQoWE1MX0VORF9UQUcpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQl4bWxXcml0ZXIud3JpdGUodGVtcC50b1N0cmluZygpKTsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludEVuZEVsZW1lbnQoV3JpdGVyIHhtbFdyaXRlciwgU3RyaW5nIGVsZW1lbnRTdHJpbmcpIHRocm93cyBJT0V4Y2VwdGlvbnsKLQkJU3RyaW5nQnVmZmVyIHRlbXAgPSBuZXcgU3RyaW5nQnVmZmVyKFhNTF9CRUdJTl9UQUcpOwotCQl0ZW1wLmFwcGVuZChYTUxfU0xBU0gpLmFwcGVuZChlbGVtZW50U3RyaW5nKS5hcHBlbmQoWE1MX0VORF9UQUcpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQl4bWxXcml0ZXIud3JpdGUodGVtcC50b1N0cmluZygpKTsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludEhlYWQoV3JpdGVyIHhtbFdyaXRlciwgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmdCdWZmZXIgdGVtcCA9IG5ldyBTdHJpbmdCdWZmZXIoWE1MX0hFQUQpOwotCQl0ZW1wLmFwcGVuZChlbmNvZGluZykuYXBwZW5kKFhNTF9EQkxfUVVPVEVTKS5hcHBlbmQoWE1MX0hFQURfRU5EX1RBRykuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCXhtbFdyaXRlci53cml0ZSh0ZW1wLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdyYXBBdHRyaWJ1dGVGb3JQcmludChTdHJpbmcgYXR0cmlidXRlLCBTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1ZmZlciB0ZW1wID0gbmV3IFN0cmluZ0J1ZmZlcihYTUxfU1BBQ0UpOwotCQl0ZW1wLmFwcGVuZChhdHRyaWJ1dGUpLmFwcGVuZChYTUxfRVFVQUwpLmFwcGVuZChYTUxfREJMX1FVT1RFUykKLQkJCQkuYXBwZW5kKGVuY29kZSh2YWx1ZSkudG9TdHJpbmcoKSkuYXBwZW5kKFhNTF9EQkxfUVVPVEVTKTsKLQkJcmV0dXJuIHRlbXAudG9TdHJpbmcoKTsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludE5vZGUoV3JpdGVyIHhtbFdyaXRlciwgTm9kZSBub2RlLFN0cmluZyBlbmNvZGluZykgIHRocm93cyBFeGNlcHRpb257Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCWNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFOiB7Ci0JCQlwcmludEhlYWQoeG1sV3JpdGVyLGVuY29kaW5nKTsKLQkJCXByaW50Tm9kZSh4bWxXcml0ZXIsICgoRG9jdW1lbnQpIG5vZGUpLmdldERvY3VtZW50RWxlbWVudCgpLGVuY29kaW5nKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgTm9kZS5FTEVNRU5UX05PREU6IHsKLQkJCS8vZ2V0IHRoZSBhdHRyaWJ1dGUgbGlzdCBmb3IgdGhpcyBub2RlLgotCQkJU3RyaW5nQnVmZmVyIHRlbXBFbGVtZW50U3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcihub2RlLmdldE5vZGVOYW1lKCkpOwotCQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZUxpc3QgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWlmICggYXR0cmlidXRlTGlzdCAhPSBudWxsICkgewotCQkJCWZvcihpbnQgaT0gMDsgaSA8YXR0cmlidXRlTGlzdC5nZXRMZW5ndGgoKTtpKyspewotCQkJCQlOb2RlIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZUxpc3QuaXRlbShpKTsKLQkJCQkJdGVtcEVsZW1lbnRTdHJpbmcuYXBwZW5kKHdyYXBBdHRyaWJ1dGVGb3JQcmludChhdHRyaWJ1dGUuZ2V0Tm9kZU5hbWUoKSxhdHRyaWJ1dGUuZ2V0Tm9kZVZhbHVlKCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwcmludEJlZ2luRWxlbWVudCh4bWxXcml0ZXIsdGVtcEVsZW1lbnRTdHJpbmcudG9TdHJpbmcoKSk7Ci0JCQkKLQkJCS8vIGRvIHRoaXMgcmVjdXJzaXZlbHkgZm9yIHRoZSBjaGlsZCBub2Rlcy4KLQkJCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCWlmIChjaGlsZE5vZGVzICE9IG51bGwpIHsKLQkJCQlpbnQgbGVuZ3RoID0gY2hpbGROb2Rlcy5nZXRMZW5ndGgoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCXByaW50Tm9kZSh4bWxXcml0ZXIsIGNoaWxkTm9kZXMuaXRlbShpKSxlbmNvZGluZyk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlwcmludEVuZEVsZW1lbnQoeG1sV3JpdGVyLG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQlicmVhazsKLQkJfQotCQkKLQkJY2FzZSBOb2RlLlRFWFRfTk9ERTogewotCQkJeG1sV3JpdGVyLndyaXRlKGVuY29kZShub2RlLmdldE5vZGVWYWx1ZSgpKS50b1N0cmluZygpKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWRlZmF1bHQ6IHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5YTUxQcmludEhhbmRsZXJfdW5zdXBwb3J0ZWROb2RlVHlwZSk7Ci0JCQkKLQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciBlbmNvZGUoU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoKCk7IGkrKykgewotCQkJY2hhciBjID0gdmFsdWUuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjKSB7Ci0JCQkJY2FzZSAnJicgOgotCQkJCQlidWYuYXBwZW5kKCImYW1wOyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJzwnIDoKLQkJCQkJYnVmLmFwcGVuZCgiJmx0OyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJz4nIDoKLQkJCQkJYnVmLmFwcGVuZCgiJmd0OyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1wnJyA6Ci0JCQkJCWJ1Zi5hcHBlbmQoIiZhcG9zOyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1wiJyA6Ci0JCQkJCWJ1Zi5hcHBlbmQoIiZxdW90OyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlidWYuYXBwZW5kKGMpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYnVmOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL2JyYW5kaW5nL0Fib3V0SW5mby5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvYnJhbmRpbmcvQWJvdXRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NTUzMGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvYnJhbmRpbmcvQWJvdXRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuYnJhbmRpbmc7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotCi0vKioKLSAqIFRoZSBpbmZvcm1hdGlvbiB3aXRoaW4gdGhpcyBvYmplY3QgaXMgb2J0YWluZWQgZnJvbSB0aGUgYWJvdXQgSU5JIGZpbGUuCi0gKiBUaGlzIGZpbGUgcmVzaWRlcyB3aXRoaW4gYW4gaW5zdGFsbCBjb25maWd1cmF0aW9ucyBkaXJlY3RvcnkgYW5kIG11c3QgYmUgYSAKLSAqIHN0YW5kYXJkIGphdmEgcHJvcGVydHkgZmlsZS4gIAotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQWJvdXRJbmZvIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5JX0ZJTEVOQU1FID0gImFib3V0LmluaSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUEVSVElFU19GSUxFTkFNRSA9ICJhYm91dC5wcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBNQVBQSU5HU19GSUxFTkFNRSA9ICJhYm91dC5tYXBwaW5ncyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGZlYXR1cmVJZDsKLQlwcml2YXRlIFN0cmluZyB2ZXJzaW9uSWQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGZlYXR1cmVQbHVnaW5MYWJlbDsKLQlwcml2YXRlIFN0cmluZyBwcm92aWRlck5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgYXBwTmFtZTsKLQlwcml2YXRlIFVSTCB3aW5kb3dJbWFnZVVSTDsKLQlwcml2YXRlIFVSTFtdIHdpbmRvd0ltYWdlc1VSTHM7Ci0JcHJpdmF0ZSBVUkwgYWJvdXRJbWFnZVVSTDsKLQlwcml2YXRlIFVSTCBmZWF0dXJlSW1hZ2VVUkw7Ci0JcHJpdmF0ZSBVUkwgd2VsY29tZVBhZ2VVUkw7Ci0JcHJpdmF0ZSBTdHJpbmcgYWJvdXRUZXh0OwotCXByaXZhdGUgU3RyaW5nIHdlbGNvbWVQZXJzcGVjdGl2ZTsKLQlwcml2YXRlIFN0cmluZyB0aXBzQW5kVHJpY2tzSHJlZjsKLQotCi0JLyoKLQkgKiBDcmVhdGUgYSBuZXcgYWJvdXQgaW5mbyBmb3IgYSBmZWF0dXJlIHdpdGggdGhlIGdpdmVuIGlkLgotCSAqLwotCS8qIHBhY2thZ2UgKi8gQWJvdXRJbmZvKFN0cmluZyBmZWF0dXJlSWQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5mZWF0dXJlSWQgPSBmZWF0dXJlSWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGZlYXR1cmUgd2l0aCB0aGUgCi0JICogZ2l2ZW4gaWQuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmVJZCB0aGUgZmVhdHVyZSBpZAotCSAqIEBwYXJhbSB2ZXJzaW9uSWQgdGhlIHZlcnNpb24gaWQgKG9mIHRoZSBmZWF0dXJlKQotCSAqIEBwYXJhbSBwbHVnaW5JZCB0aGUgcGx1Zy1pbiBpZAotCSAqIEByZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBmZWF0dXJlCi0JICovCi0JcHVibGljIHN0YXRpYyBBYm91dEluZm8gcmVhZEZlYXR1cmVJbmZvKFN0cmluZyBmZWF0dXJlSWQsIFN0cmluZyB2ZXJzaW9uSWQsIFN0cmluZyBwbHVnaW5JZCkgewotLy8JCUFzc2VydC5pc05vdE51bGwoZmVhdHVyZUlkKTsKLS8vCQlBc3NlcnQuaXNOb3ROdWxsKHZlcnNpb25JZCk7Ci0vLwkJQXNzZXJ0LmlzTm90TnVsbChwbHVnaW5JZCk7Ci0JCUluaUZpbGVSZWFkZXIgcmVhZGVyID0gbmV3IEluaUZpbGVSZWFkZXIoZmVhdHVyZUlkLCBwbHVnaW5JZCwgSU5JX0ZJTEVOQU1FLCBQUk9QRVJUSUVTX0ZJTEVOQU1FLCBNQVBQSU5HU19GSUxFTkFNRSk7Ci0JCXJlYWRlci5sb2FkKCk7Ci0vLyBidWcgNzgwMzEKLS8vCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLS8vCQkJLy9yZXR1cm4gbnVsbDsKLS8vCQkJcmV0dXJuIG5ldyBBYm91dEluZm8oZmVhdHVyZUlkKTsgLy8gZHVtbXkgYWJvdXQgaW5mbwotLy8JCX0KLQkJCi0JCUFib3V0SW5mbyBpbmZvID0gbmV3IEFib3V0SW5mbyhmZWF0dXJlSWQpOwotCQlIYXNodGFibGUgcnVudGltZU1hcHBpbmdzICA9IG5ldyBIYXNodGFibGUoKTsKLQkJcnVudGltZU1hcHBpbmdzLnB1dCgie2ZlYXR1cmVWZXJzaW9ufSIsIHZlcnNpb25JZCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5mby52ZXJzaW9uSWQgPSB2ZXJzaW9uSWQ7Ci0JCWluZm8uZmVhdHVyZVBsdWdpbkxhYmVsID0gcmVhZGVyLmdldEZlYXR1cmVQbHVnaW5MYWJlbCgpOwotCQlpbmZvLnByb3ZpZGVyTmFtZSA9IHJlYWRlci5nZXRQcm92aWRlck5hbWUoKTsKLQkJaW5mby5hcHBOYW1lID0gcmVhZGVyLmdldFN0cmluZygiYXBwTmFtZSIsIHRydWUsIHJ1bnRpbWVNYXBwaW5ncyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5mby5hYm91dFRleHQgPSByZWFkZXIuZ2V0U3RyaW5nKCJhYm91dFRleHQiLCB0cnVlLCBydW50aW1lTWFwcGluZ3MpOyAvLyROT04tTkxTLTEkCi0JCWluZm8ud2luZG93SW1hZ2VVUkwgPSByZWFkZXIuZ2V0VVJMKCJ3aW5kb3dJbWFnZSIpOyAvLyROT04tTkxTLTEkCi0JCS8vIGxvb2sgZm9yIHRoZSBuZXdlciBhcnJheSwgYnV0IGlmIGl0cyBub3QgdGhlcmUgdGhlbiB1c2UgdGhlIG9sZGVyLAotCQkvLyBzaW5nbGUgaW1hZ2UgZGVmaW5pdGlvbgotCQlpbmZvLndpbmRvd0ltYWdlc1VSTHMgPSByZWFkZXIuZ2V0VVJMcygid2luZG93SW1hZ2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5mby5hYm91dEltYWdlVVJMID0gcmVhZGVyLmdldFVSTCgiYWJvdXRJbWFnZSIpOyAvLyROT04tTkxTLTEkCi0JCWluZm8uZmVhdHVyZUltYWdlVVJMID0gcmVhZGVyLmdldFVSTCgiZmVhdHVyZUltYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5mby53ZWxjb21lUGFnZVVSTCA9IHJlYWRlci5nZXRVUkwoIndlbGNvbWVQYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5mby53ZWxjb21lUGVyc3BlY3RpdmUgPSByZWFkZXIuZ2V0U3RyaW5nKCJ3ZWxjb21lUGVyc3BlY3RpdmUiLCBmYWxzZSwgcnVudGltZU1hcHBpbmdzKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZvLnRpcHNBbmRUcmlja3NIcmVmID0gcmVhZGVyLmdldFN0cmluZygidGlwc0FuZFRyaWNrc0hyZWYiLCBmYWxzZSwgcnVudGltZU1hcHBpbmdzKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gaW5mbzsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJMIGZvciBhbiBpbWFnZSB3aGljaCBjYW4gYmUgc2hvd24gaW4gYW4gImFib3V0IiBkaWFsb2cgCi0JICogZm9yIHRoaXMgcHJvZHVjdC4gUHJvZHVjdHMgZGVzaWduZWQgdG8gcnVuICJoZWFkbGVzcyIgdHlwaWNhbGx5IHdvdWxkIG5vdCAKLQkgKiBoYXZlIHN1Y2ggYW4gaW1hZ2UuCi0JICogCi0JICogQHJldHVybiB0aGUgVVJMIGZvciBhbiBhYm91dCBpbWFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyBVUkwgZ2V0QWJvdXRJbWFnZVVSTCgpIHsKLQkJcmV0dXJuIGFib3V0SW1hZ2VVUkw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJMIGZvciBhbiBpbWFnZSB3aGljaCBjYW4gYmUgc2hvd24gaW4gYW4gImFib3V0IGZlYXR1cmVzIiAKLQkgKiBkaWFsb2cuIFByb2R1Y3RzIGRlc2lnbmVkIHRvIHJ1biAiaGVhZGxlc3MiIHR5cGljYWxseSB3b3VsZCBub3QgaGF2ZSBzdWNoIGFuIGltYWdlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIFVSTCBmb3IgYSBmZWF0dXJlIGltYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIFVSTCBnZXRGZWF0dXJlSW1hZ2VVUkwoKSB7Ci0JCXJldHVybiBmZWF0dXJlSW1hZ2VVUkw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2ltcGxlIG5hbWUgb2YgdGhlIGZlYXR1cmUgaW1hZ2UgZmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgZmVhdHVyZSBpbWFnZSBmaWxlLAotCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVJbWFnZU5hbWUoKSB7Ci0JCWlmIChmZWF0dXJlSW1hZ2VVUkwgIT0gbnVsbCkgewotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGZlYXR1cmVJbWFnZVVSTC5nZXRQYXRoKCkpOwotCQkJcmV0dXJuIHBhdGgubGFzdFNlZ21lbnQoKTsKLQkJfSAKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JCQotCS8qKgotCSAqIFJldHVybnMgYSBsYWJlbCBmb3IgdGhlIGZlYXR1cmUgcGx1Z24sIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmVhdHVyZUxhYmVsKCkgewotCQlyZXR1cm4gZmVhdHVyZVBsdWdpbkxhYmVsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIGZvciB0aGlzIGZlYXR1cmUuCi0JICogCi0JICogQHJldHVybiB0aGUgZmVhdHVyZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmVhdHVyZUlkKCkgewotCQlyZXR1cm4gZmVhdHVyZUlkOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IHRvIHNob3cgaW4gYW4gImFib3V0IiBkaWFsb2cgZm9yIHRoaXMgcHJvZHVjdC4KLQkgKiBQcm9kdWN0cyBkZXNpZ25lZCB0byBydW4gImhlYWRsZXNzIiB0eXBpY2FsbHkgd291bGQgbm90IGhhdmUgc3VjaCB0ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFib3V0IHRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFib3V0VGV4dCgpIHsKLQkJcmV0dXJuIGFib3V0VGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhcHBsaWNhdGlvbiBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIE5vdGUgdGhpcyBpcyBuZXZlciBzaG93biB0byB0aGUgdXNlci4KLQkgKiBJdCBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIFNXVCBEaXNwbGF5LgotCSAqIDxwPgotCSAqIE9uIE1vdGlmLCBmb3IgZXhhbXBsZSwgdGhpcyBjYW4gYmUgdXNlZAotCSAqIHRvIHNldCB0aGUgbmFtZSB1c2VkIGZvciByZXNvdXJjZSBsb29rdXAuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiB0aGUgYXBwbGljYXRpb24gbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFwcE5hbWUoKSB7Ci0JCXJldHVybiBhcHBOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb2R1Y3QgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBUaGlzIGlzIHNob3duIGluIHRoZSB3aW5kb3cgdGl0bGUgYW5kIHRoZSBBYm91dCBhY3Rpb24uCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBwcm9kdWN0IG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9kdWN0TmFtZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmVQbHVnaW5MYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm92aWRlciBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqCi0JICogQHJldHVybiB0aGUgcHJvdmlkZXIgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3ZpZGVyTmFtZSgpIHsKLQkJcmV0dXJuIHByb3ZpZGVyTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIHZlcnNpb24gaWQuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSB2ZXJzaW9uIGlkIG9mIHRoZSBmZWF0dXJlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uSWQoKSB7Ci0JCXJldHVybiB2ZXJzaW9uSWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIDxjb2RlPlVSTDwvY29kZT4gZm9yIHRoZSB3ZWxjb21lIHBhZ2UuCi0JICogUHJvZHVjdHMgZGVzaWduZWQgdG8gcnVuICJoZWFkbGVzcyIgdHlwaWNhbGx5IHdvdWxkIG5vdCBoYXZlIHN1Y2ggYW4gcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB3ZWxjb21lIHBhZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgVVJMIGdldFdlbGNvbWVQYWdlVVJMKCkgewotCQlyZXR1cm4gd2VsY29tZVBhZ2VVUkw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUQgb2YgYSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0byBzaG93IHRoZSB3ZWxjb21lIHBhZ2UuCi0JICogTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHdlbGNvbWUgcGFnZSBwZXJzcGVjdGl2ZSBpZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2VsY29tZVBlcnNwZWN0aXZlSWQoKSB7Ci0JCXJldHVybiB3ZWxjb21lUGVyc3BlY3RpdmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIDxjb2RlPlN0cmluZzwvY29kZT4gZm9yIHRoZSB0aXBzIGFuZCB0cmljayBocmVmLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRpcHMgYW5kIHRyaWNrcyBocmVmLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXBzQW5kVHJpY2tzSHJlZigpIHsKLQkJcmV0dXJuIHRpcHNBbmRUcmlja3NIcmVmOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIHVybCBmb3IgdGhlIHdpbmRvdyBpbWFnZSB0byB1c2UgZm9yIHRoaXMgcHJvZHVjdC4KLQkgKiBQcm9kdWN0cyBkZXNpZ25lZCB0byBydW4gImhlYWRsZXNzIiB0eXBpY2FsbHkgd291bGQgbm90IGhhdmUgc3VjaCBhbiBpbWFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSB1cmwgZm9yIHRoZSB3aW5kb3cgaW1hZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgVVJMIGdldFdpbmRvd0ltYWdlVVJMKCkgewotCQlyZXR1cm4gd2luZG93SW1hZ2VVUkw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiBpbWFnZSBVUkxzIGZvciB0aGUgd2luZG93IGltYWdlcyB0byB1c2UgZm9yCi0JICogdGhpcyBwcm9kdWN0LiBUaGUgZXhwZWN0YXRpb25zIGlzIHRoYXQgdGhlIGVsZW1lbnRzIHdpbGwgYmUgdGhlIHNhbWUKLQkgKiBpbWFnZSByZW5kZXJlZCBhdCBkaWZmZXJlbnQgc2l6ZXMuIFByb2R1Y3RzIGRlc2lnbmVkIHRvIHJ1biAiaGVhZGxlc3MiCi0JICogdHlwaWNhbGx5IHdvdWxkIG5vdCBoYXZlIHN1Y2ggaW1hZ2VzLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGltYWdlIGRlc2NyaXB0b3JzIGZvciB0aGUgd2luZG93IGltYWdlcywgb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIFVSTFtdIGdldFdpbmRvd0ltYWdlc1VSTHMoKSB7Ci0JCXJldHVybiB3aW5kb3dJbWFnZXNVUkxzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL2JyYW5kaW5nL0lCdW5kbGVHcm91cENvbnN0YW50cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvYnJhbmRpbmcvSUJ1bmRsZUdyb3VwQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZjY2Y2QuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvYnJhbmRpbmcvSUJ1bmRsZUdyb3VwQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvci5icmFuZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JRmVhdHVyZUVudHJ5OwotCi0vKioKLSAqIFRoZXNlIGNvbnN0YW50cyBkZWZpbmUgdGhlIHNldCBvZiBwcm9wZXJ0aWVzIHRoYXQgdGhlIFVJIGV4cGVjdHMgdG8KLSAqIGJlIGF2YWlsYWJsZSB2aWEgPGNvZGU+SUJ1bmRsZUdyb3VwLmdldFByb3BlcnR5KFN0cmluZyk8L2NvZGU+LgotICogCi0gKiBAc2luY2UgMy4wCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQnVuZGxlR3JvdXAjZ2V0UHJvcGVydHkoU3RyaW5nKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCdW5kbGVHcm91cENvbnN0YW50cyB7Ci0JLyoqCi0JICogQW4gaW1hZ2Ugd2hpY2ggY2FuIGJlIHNob3duIGluIGFuICJhYm91dCBmZWF0dXJlcyIgZGlhbG9nICgzMngzMikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9JTUFHRSA9ICJmZWF0dXJlSW1hZ2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIGhlbHAgcmVmZXJlbmNlIGZvciB0aGUgZmVhdHVyZSdzIHRpcHMgYW5kIHRyaWNrcyBwYWdlIChvcHRpb25hbCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElQU19BTkRfVFJJQ0tTX0hSRUYgPSAidGlwc0FuZFRyaWNrc0hyZWYiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIFVSTCBmb3IgdGhlIGZlYXR1cmUncyB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSAgICAgKiAoJG5sJC8gcHJlZml4IHRvIHBlcm1pdCBsb2NhbGUtc3BlY2lmaWMgdHJhbnNsYXRpb25zIG9mIGVudGlyZSBmaWxlKS4KLQkgKiBQcm9kdWN0cyBkZXNpZ25lZCB0byBydW4gImhlYWRsZXNzIiB0eXBpY2FsbHkgd291bGQgbm90IGhhdmUgc3VjaCBhIHBhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VMQ09NRV9QQUdFID0gIndlbGNvbWVQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGlkIG9mIGEgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdG8gc2hvdyB0aGUgd2VsY29tZSBwYWdlCi0JICogKG9wdGlvbmFsKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUxDT01FX1BFUlNQRUNUSVZFID0gIndlbGNvbWVQZXJzcGVjdGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUgVVJMIG9mIHRoZSBsaWNlbnNlIHBhZ2UgZm9yIHRoZSBmZWF0dXJlCi0JICogKG9wdGlvbmFsKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUNFTlNFX0hSRUYgPSAibGljZW5zZUhyZWYiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGlkIG9mIHRoZSBidW5kbGUgZ3JvdXAncyBicmFuZGluZyBidW5kbGUuCi0JICogQHNlZSBJRmVhdHVyZUVudHJ5I2dldEZlYXR1cmVQbHVnaW5JZGVudGlmaWVyKCkKLQkgKiBAc2luY2UgMy4zCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJBTkRJTkdfQlVORExFX0lEPSAiYnJhbmRpbmdCdW5kbGVJZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBmZWF0dXJlIGJyYW5kaW5nIGJ1bmRsZS4KLQkgKiBAc2VlIElGZWF0dXJlRW50cnkjZ2V0RmVhdHVyZVBsdWdpblZlcnNpb24oKQotCSAqIEBzaW5jZSAzLjMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUkFORElOR19CVU5ETEVfVkVSU0lPTj0gImJyYW5kaW5nQnVuZGxlVmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL2JyYW5kaW5nL0lQcm9kdWN0Q29uc3RhbnRzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9icmFuZGluZy9JUHJvZHVjdENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTYyMGRiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL2JyYW5kaW5nL0lQcm9kdWN0Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvci5icmFuZGluZzsKLQotLyoqCi0gKiBUaGVzZSBjb25zdGFudHMgZGVmaW5lIHRoZSBzZXQgb2YgcHJvcGVydGllcyB0aGF0IHRoZSBVSSBleHBlY3RzIHRvCi0gKiBiZSBhdmFpbGFibGUgdmlhIDxjb2RlPklQcm9kdWN0LmdldFByb3BlcnR5KFN0cmluZyk8L2NvZGU+LgotICogCi0gKiBAc2luY2UgMy4wCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZHVjdCNnZXRQcm9wZXJ0eShTdHJpbmcpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2R1Y3RDb25zdGFudHMgewotCS8qKgotCSAqIFRoZSBhcHBsaWNhdGlvbiBuYW1lLCB1c2VkIHRvIGluaXRpYWxpemUgdGhlIFNXVCBEaXNwbGF5LiAgVGhpcwotCSAqIHZhbHVlIGlzIGRpc3RpbmN0IGZyb20gdGhlIHN0cmluZyBkaXNwbGF5ZWQgaW4gdGhlIGFwcGxpY2F0aW9uCi0JICogdGl0bGUgYmFyLgotCSAqIDxwPgotCSAqIEUuZy4sIE9uIG1vdGlmLCB0aGlzIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbmFtZSB1c2VkIGZvcgotCSAqIHJlc291cmNlIGxvb2t1cC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX05BTUUgPSAiYXBwTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSB0ZXh0IHRvIHNob3cgaW4gYW4gImFib3V0IiBkaWFsb2cgZm9yIHRoaXMgcHJvZHVjdC4KLQkgKiBQcm9kdWN0cyBkZXNpZ25lZCB0byBydW4gImhlYWRsZXNzIiB0eXBpY2FsbHkgd291bGQgbm90Ci0JICogaGF2ZSBzdWNoIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJPVVRfVEVYVCA9ICJhYm91dFRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBpbWFnZSB3aGljaCBjYW4gYmUgc2hvd24gaW4gYW4gImFib3V0IiBkaWFsb2cgZm9yIHRoaXMKLQkgKiBwcm9kdWN0LiBQcm9kdWN0cyBkZXNpZ25lZCB0byBydW4gImhlYWRsZXNzIiB0eXBpY2FsbHkgd291bGQgbm90IAotCSAqIGhhdmUgc3VjaCBhbiBpbWFnZS4KLQkgKiA8cD4KLSAgICAgKiBBIGZ1bGwtc2l6ZWQgcHJvZHVjdCBpbWFnZSAobm8gbGFyZ2VyIHRoYW4gNTAweDMzMCBwaXhlbHMpIGlzCi0gICAgICogc2hvd24gd2l0aG91dCB0aGUgImFib3V0VGV4dCIgYmx1cmIuICBBIGhhbGYtc2l6ZWQgcHJvZHVjdCBpbWFnZQotICAgICAqIChubyBsYXJnZXIgdGhhbiAyNTB4MzMwIHBpeGVscykgaXMgc2hvd24gd2l0aCB0aGUgImFib3V0VGV4dCIKLSAgICAgKiBibHVyYiBiZXNpZGUgaXQuCi0gICAgICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJPVVRfSU1BR0UgPSAiYWJvdXRJbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGltYWdlIHRvIGJlIHVzZWQgYXMgdGhlIHdpbmRvdyBpY29uIGZvciB0aGlzIHByb2R1Y3QgKDE2eDE2KS4gIAotCSAqIFByb2R1Y3RzIGRlc2lnbmVkIHRvIHJ1biAiaGVhZGxlc3MiIHR5cGljYWxseSB3b3VsZCBub3QgaGF2ZSBzdWNoIGFuIGltYWdlLgotCSAqIDxwPgotCSAqIElmIHRoZSA8Y29kZT5XSU5ET1dfSU1BR0VTPC9jb2RlPiBwcm9wZXJ0eSBpcyBnaXZlbiwgdGhlbiBpdCBzdXBlcmNlZGVzCi0JICogdGhpcyBvbmUuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTkRPV19JTUFHRSA9ICJ3aW5kb3dJbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIG9uZSBvciBtb3JlIGltYWdlcyB0byBiZSB1c2VkIGZvciB0aGlzIHByb2R1Y3QuICBUaGUKLQkgKiBleHBlY3RhdGlvbiBpcyB0aGF0IHRoZSBhcnJheSB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgaW1hZ2UgcmVuZGVyZWQKLQkgKiBhdCBkaWZmZXJlbnQgc2l6ZXMgKDE2eDE2IGFuZCAzMngzMikuICAKLQkgKiBQcm9kdWN0cyBkZXNpZ25lZCB0byBydW4gImhlYWRsZXNzIiB0eXBpY2FsbHkgd291bGQgbm90IGhhdmUgc3VjaCBpbWFnZXMuCi0JICogPHA+Ci0JICogSWYgdGhpcyBwcm9wZXJ0eSBpcyBnaXZlbiwgdGhlbiBpdCBzdXBlcmNlZGVzIDxjb2RlPldJTkRPV19JTUFHRTwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTkRPV19JTUFHRVMgPSAid2luZG93SW1hZ2VzIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEEgVVJMIGZvciB0aGUgcHJvZHVjdHMncyB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLQkgKiAoJG5sJC8gcHJlZml4IHRvIHBlcm1pdCBsb2NhbGUtc3BlY2lmaWMgdHJhbnNsYXRpb25zIG9mIGVudGlyZSBmaWxlKS4KLQkgKiBQcm9kdWN0cyBkZXNpZ25lZCB0byBydW4gImhlYWRsZXNzIiB0eXBpY2FsbHkgd291bGQgbm90IGhhdmUgc3VjaCBhIHBhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VMQ09NRV9QQUdFID0gIndlbGNvbWVQYWdlIjsgIC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL2JyYW5kaW5nL0luaUZpbGVSZWFkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL2JyYW5kaW5nL0luaUZpbGVSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUyZDRiZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9icmFuZGluZy9JbmlGaWxlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuYnJhbmRpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsgLy8gQ2FuJ3QgdXNlIElDVSwgcG9zc2libGUgbGF1bmNoIHByb2JsZW0/Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0eVJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvci5VdGlsczsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBSZWFkcyB0aGUgaW5mb3JtYXRpb24gZm91bmQgaW4gYW4gIklOSSIgZmlsZS4gVGhpcyBmaWxlIG11c3QgYmUgaW4gYQotICogc3RhbmRhcmQgSmF2YSBwcm9wZXJ0aWVzIGZvcm1hdC4gQSBwcm9wZXJ0aWVzIGZpbGUgbWF5IGFsc28gYmUgcHJvdmlkZWQKLSAqIHRvIE5MIHZhbHVlcyBpbiB0aGUgSU5JIGZpbGUgLSB2YWx1ZXMgbXVzdCBzdGFydCB3aXRoIHRoZSAlIHByZWZpeC4gQQotICogbWFwcGluZyBmaWxlIG1heSBhbHNvIGJlIHByb3ZpZGVkIHRoYXQgY29udGFpbnMgImZpbGwtaW5zIiBmb3IgdGhlCi0gKiBwcm9wZXJ0aWVzIGZpbGUgLSBmb3JtYXQgYmVpbmcgIm4gPSBzb21lIHRleHQiLCB3aGVyZSBuIGlzIGEgbnVtYmVyLgotICovCi1wdWJsaWMgY2xhc3MgSW5pRmlsZVJlYWRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJRCA9ICJvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0YXR1cyBPS19TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBJRCwgMCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QUkVGSVggPSAiJSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RPVUJMRV9QUkVGSVggPSAiJSUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5MU19UQUcgPSAiJG5sJCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGZlYXR1cmVJZDsKLQlwcml2YXRlIFN0cmluZyBwbHVnaW5JZDsKLQlwcml2YXRlIFN0cmluZyBpbmlGaWxlbmFtZTsKLQlwcml2YXRlIFN0cmluZyBwcm9wZXJ0aWVzRmlsZW5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgbWFwcGluZ3NGaWxlbmFtZTsKLQlwcml2YXRlIFByb3BlcnRpZXMgaW5pID0gbnVsbDsKLQlwcml2YXRlIFByb3BlcnR5UmVzb3VyY2VCdW5kbGUgcHJvcGVydGllcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBtYXBwaW5ncyA9IG51bGw7Ci0JcHJpdmF0ZSBCdW5kbGUgYnVuZGxlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBJTkkgZmlsZSByZWFkZXIgdGhhdCBjYW4gcGFyc2UgdGhlIGNvbnRlbnRzIGludG8ga2V5LHZhbHVlIHBhaXJzLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlSWQgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBmZWF0dXJlLCBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBwYXJhbSBwbHVnaW5JZCB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGZlYXR1cmUgcGx1Zy1pbiwgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gaW5pRmlsZW5hbWUgdGhlIElOSSBmaWxlIG5hbWUsIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIHByb3BlcnRpZXNGaWxlbmFtZSB0aGUgcHJvcGVydGllcyBmaWxlbmFtZSwgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCByZXF1aXJlZAotCSAqIEBwYXJhbSBtYXBwaW5nc0ZpbGVuYW1lIHRoZSBtYXBwaW5ncyBmaWxlbmFtZSwgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCByZXF1aXJlZAotCSAqLwotCXB1YmxpYyBJbmlGaWxlUmVhZGVyKFN0cmluZyBmZWF0dXJlSWQsIFN0cmluZyBwbHVnaW5JZCwgU3RyaW5nIGluaUZpbGVuYW1lLCBTdHJpbmcgcHJvcGVydGllc0ZpbGVuYW1lLCBTdHJpbmcgbWFwcGluZ3NGaWxlbmFtZSkgewotCQlzdXBlcigpOwotCQkKLQkJaWYgKGZlYXR1cmVJZCA9PSBudWxsIHx8IHBsdWdpbklkID09IG51bGwgfHwgaW5pRmlsZW5hbWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCQkKLQkJdGhpcy5mZWF0dXJlSWQgPSBmZWF0dXJlSWQ7Ci0JCXRoaXMucGx1Z2luSWQgPSBwbHVnaW5JZDsKLQkJdGhpcy5pbmlGaWxlbmFtZSA9IGluaUZpbGVuYW1lOwotCQl0aGlzLnByb3BlcnRpZXNGaWxlbmFtZSA9IHByb3BlcnRpZXNGaWxlbmFtZTsKLQkJdGhpcy5tYXBwaW5nc0ZpbGVuYW1lID0gbWFwcGluZ3NGaWxlbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgSU5JLCBwcm9wZXJ0aWVzLCBhbmQgbWFwcGluZ3MgZmlsZXMuCi0JICogRG9lcyBub3RoaW5nIGlmIHRoZSBjb250ZW50IGhhcyBhbHJlYWR5IGJlZW4gcmVhZCBhbmQgcGFyc2VkLgotCSAqIAotCSAqIEByZXR1cm4gYW4gPGNvZGU+SVN0YXR1czwvY29kZT4gaW5kaWNhdGluZyB0aGUgc3VjY2VzcyBvciBmYWlsdXJlCi0JICogCW9mIHJlYWRpbmcgYW5kIHBhcnNpbmcgdGhlIElOSSBmaWxlIGNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBsb2FkKCkgewotCQlpZiAoaW5pICE9IG51bGwpCi0JCQlyZXR1cm4gT0tfU1RBVFVTOwotCQkJCi0JCS8vIGF0dGVtcHQgdG8gbG9jYXRlIHRoZSBjb3JyZXNwb25kaW5nIHBsdWdpbgotCQlidW5kbGUgPSBVdGlscy5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQlpZiAoYnVuZGxlID09IG51bGwgfHwgYnVuZGxlLmdldFN0YXRlKCkgPT0gQnVuZGxlLlVOSU5TVEFMTEVEIHx8IGJ1bmRsZS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5JTlNUQUxMRUQpIHsKLQkJCWJ1bmRsZSA9IG51bGw7IC8vIG1ha2UgaXQgbnVsbCBmb3Igb3RoZXIgdGVzdCBkb3duIHRoZSByb2FkCi0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLkluaUZpbGVSZWFkZXJfTWlzc2luZ0Rlc2MsIChuZXcgU3RyaW5nW10geyBmZWF0dXJlSWQgfSkpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUElELCAwLCBtZXNzYWdlLCBudWxsKTsKLQkJfQotCi0JCS8vIERldGVybWluZSB0aGUgaW5pIGZpbGUgbG9jYXRpb24KLQkJVVJMIGluaVVSTCA9IG51bGw7Ci0JCUlPRXhjZXB0aW9uIGlvZSA9IG51bGw7Ci0JCWluaVVSTCA9IEZpbGVMb2NhdG9yLmZpbmQoYnVuZGxlLCBuZXcgUGF0aChOTFNfVEFHKS5hcHBlbmQoaW5pRmlsZW5hbWUpLCBudWxsKTsKLQkJaWYgKGluaVVSTCA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLkluaUZpbGVSZWFkZXJfT3BlbklOSUVycm9yLCAobmV3IFN0cmluZ1tdIHsgaW5pRmlsZW5hbWUgfSkpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUElELCAwLCBtZXNzYWdlLCBpb2UpOwotCQl9Ci0JCQotCQkvLyBEZXRlcm1pbmUgdGhlIHByb3BlcnRpZXMgZmlsZSBsb2NhdGlvbgotCQlVUkwgcHJvcGVydGllc1VSTCA9IG51bGw7Ci0JCWlmIChwcm9wZXJ0aWVzRmlsZW5hbWUgIT0gbnVsbCAmIHByb3BlcnRpZXNGaWxlbmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCXByb3BlcnRpZXNVUkwgPSBGaWxlTG9jYXRvci5maW5kKGJ1bmRsZSwgbmV3IFBhdGgoTkxTX1RBRykuYXBwZW5kKHByb3BlcnRpZXNGaWxlbmFtZSksIG51bGwpOwotCQl9Ci0KLQkJLy8gRGV0ZXJtaW5lIHRoZSBtYXBwaW5ncyBmaWxlIGxvY2F0aW9uCi0JCVVSTCBtYXBwaW5nc1VSTCA9IG51bGw7Ci0JCWlmIChtYXBwaW5nc0ZpbGVuYW1lICE9IG51bGwgJiYgbWFwcGluZ3NGaWxlbmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCW1hcHBpbmdzVVJMID0gRmlsZUxvY2F0b3IuZmluZChidW5kbGUsIG5ldyBQYXRoKE5MU19UQUcpLmFwcGVuZChtYXBwaW5nc0ZpbGVuYW1lKSwgbnVsbCk7Ci0JCX0KLQotCQkvLyBPSyB0byBwYXNzIG51bGwgcHJvcGVydGllcyBhbmQvb3IgbWFwcGluZyBmaWxlCi0JCXJldHVybiBsb2FkKGluaVVSTCwgcHJvcGVydGllc1VSTCwgbWFwcGluZ3NVUkwpOwotCX0KLQkJCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5LCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBUaGUgc3RyaW5nIHZhbHVlIGlzIE5MUyBpZiByZXF1ZXN0ZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgc3RyaW5nIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5LCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIGJvb2xlYW4gZG9ObHMsIEhhc2h0YWJsZSBydW50aW1lTWFwcGluZ3MpIHsKLQkJaWYgKGluaSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyB2YWx1ZSA9IGluaS5nZXRQcm9wZXJ0eShrZXkpOwotCQlpZiAodmFsdWUgIT0gbnVsbCAmJiBkb05scykKLQkJCXJldHVybiBnZXRSZXNvdXJjZVN0cmluZyh2YWx1ZSwgcnVudGltZU1hcHBpbmdzKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyBhIFVSTCBmb3IgdGhlIGdpdmVuIGtleSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHJldHVybiBhIFVSTCBmb3IgdGhlIGdpdmVuIGtleSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldFVSTChTdHJpbmcga2V5KSB7Ci0JCWlmIChpbmkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVVSTCB1cmwgPSBudWxsOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBpbmkuZ2V0UHJvcGVydHkoa2V5KTsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLQkJCWlmIChidW5kbGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXVybCA9IEZpbGVMb2NhdG9yLmZpbmQoYnVuZGxlLCBuZXcgUGF0aChmaWxlTmFtZSksIG51bGwpOwotCQl9Ci0JCXJldHVybiB1cmw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBhcnJheSBvZiBVUkwgZm9yIHRoZSBnaXZlbiBrZXksIG9yIDxjb2RlPm51bGw8L2NvZGU+LiBUaGUKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBzaG91bGQgYmUgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiB1cmxzLCB0b2tlbnMgZm9yCi0JICogd2hpY2ggYnVuZGxlIGNhbm5vdCBidWlsZCBhbiB1cmwgd2lsbCBoYXZlIGEgbnVsbCBlbnRyeS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5IG5hbWUgb2YgdGhlIHByb3BlcnR5IGNvbnRhaW5pbmcgdGhlIHJlcXVlc3RlZCB1cmxzCi0JICogQHJldHVybiBhIFVSTCBmb3IgdGhlIGdpdmVuIGtleSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIFVSTFtdIGdldFVSTHMoU3RyaW5nIGtleSkgewotCQlpZiAoaW5pID09IG51bGwgfHwgYnVuZGxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgdmFsdWUgPSBpbmkuZ2V0UHJvcGVydHkoa2V5KTsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQlBcnJheUxpc3QgYXJyYXkgPSBuZXcgQXJyYXlMaXN0KDEwKTsKLQkJd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyBzdHIgPSB0b2tlbnMubmV4dFRva2VuKCkudHJpbSgpOwotCQkJYXJyYXkuYWRkKEZpbGVMb2NhdG9yLmZpbmQoYnVuZGxlLCBuZXcgUGF0aChzdHIpLCBudWxsKSk7Ci0JCX0KLQotCQlVUkxbXSB1cmxzID0gbmV3IFVSTFthcnJheS5zaXplKCldOwotCQlhcnJheS50b0FycmF5KHVybHMpOwotCQlyZXR1cm4gdXJsczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIHBsdWdpbiBsYWJlbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB0aGUgZmVhdHVyZSBwbHVnaW4gbGFibGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGZWF0dXJlUGx1Z2luTGFiZWwoKSB7Ci0JCWlmIChidW5kbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKFN0cmluZylidW5kbGUuZ2V0SGVhZGVycygpLmdldChDb25zdGFudHMuQlVORExFX05BTUUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm92aWRlciBuYW1lIGZvciB0aGlzIGZlYXR1cmUsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb3ZpZGVyIG5hbWUgZm9yIHRoaXMgZmVhdHVyZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3ZpZGVyTmFtZSgpIHsKLQkJaWYgKGJ1bmRsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoU3RyaW5nKWJ1bmRsZS5nZXRIZWFkZXJzKCkuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVORE9SKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm5zIGEgcmVzb3VyY2Ugc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGFyZ3VtZW50IAotCSAqIHZhbHVlIGFuZCBidW5kbGUuCi0JICogSWYgdGhlIGFyZ3VtZW50IHZhbHVlIHNwZWNpZmllcyBhIHJlc291cmNlIGtleSwgdGhlIHN0cmluZwotCSAqIGlzIGxvb2tlZCB1cCBpbiB0aGUgZ2l2ZW4gcmVzb3VyY2UgYnVuZGxlLiBJZiB0aGUgYXJndW1lbnQgZG9lcyBub3QKLQkgKiBzcGVjaWZ5IGEgdmFsaWQga2V5LCB0aGUgYXJndW1lbnQgaXRzZWxmIGlzIHJldHVybmVkIGFzIHRoZQotCSAqIHJlc291cmNlIHN0cmluZy4gVGhlIGtleSBsb29rdXAgaXMgcGVyZm9ybWVkIGFnYWluc3QgdGhlCi0JICogc3BlY2lmaWVkIHJlc291cmNlIGJ1bmRsZS4gSWYgYSByZXNvdXJjZSBzdHJpbmcgCi0JICogY29ycmVzcG9uZGluZyB0byB0aGUga2V5IGlzIG5vdCBmb3VuZCBpbiB0aGUgcmVzb3VyY2UgYnVuZGxlCi0JICogdGhlIGtleSB2YWx1ZSwgb3IgYW55IGRlZmF1bHQgdGV4dCBmb2xsb3dpbmcgdGhlIGtleSBpbiB0aGUKLQkgKiBhcmd1bWVudCB2YWx1ZSBpcyByZXR1cm5lZCBhcyB0aGUgcmVzb3VyY2Ugc3RyaW5nLgotCSAqIEEga2V5IGlzIGlkZW50aWZpZWQgYXMgYSBzdHJpbmcgYmVnaW5pbmcgd2l0aCB0aGUgIiUiIGNoYXJhY3Rlci4KLQkgKiBOb3RlIHRoYXQgdGhlICIlIiBjaGFyYWN0ZXIgaXMgc3RyaXBwZWQgb2ZmIHByaW9yIHRvIGxvb2t1cAotCSAqIGluIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICogPHA+Ci0JICogRm9yIGV4YW1wbGUsIGFzc3VtZSByZXNvdXJjZSBidW5kbGUgcGx1Z2luLnByb3BlcnRpZXMgY29udGFpbnMKLQkgKiBuYW1lID0gUHJvamVjdCBOYW1lCi0JICogPHByZT4KLQkgKiAgICAgPGxpPmdldFJlc291cmNlU3RyaW5nKCJIZWxsbyBXb3JsZCIpIHJldHVybnMgIkhlbGxvIFdvcmxkIjwvbGk+Ci0JICogICAgIDxsaT5nZXRSZXNvdXJjZVN0cmluZygiJW5hbWUiKSByZXR1cm5zICJQcm9qZWN0IE5hbWUiPC9saT4KLQkgKiAgICAgPGxpPmdldFJlc291cmNlU3RyaW5nKCIlbmFtZSBIZWxsbyBXb3JsZCIpIHJldHVybnMgIlByb2plY3QgTmFtZSI8L2xpPgotCSAqICAgICA8bGk+Z2V0UmVzb3VyY2VTdHJpbmcoIiVhYmNkIEhlbGxvIFdvcmxkIikgcmV0dXJucyAiSGVsbG8gV29ybGQiPC9saT4KLQkgKiAgICAgPGxpPmdldFJlc291cmNlU3RyaW5nKCIlYWJjZCIpIHJldHVybnMgIiVhYmNkIjwvbGk+Ci0JICogICAgIDxsaT5nZXRSZXNvdXJjZVN0cmluZygiJSVuYW1lIikgcmV0dXJucyAiJW5hbWUiPC9saT4KLQkgKiAgICAgPGxpPmdldFJlc291cmNlU3RyaW5nKDxjb2RlPm51bGw8L2NvZGU+KSByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+PC9saT4KLQkgKiA8L3ByZT4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIHJ1bnRpbWVNYXBwaW5ncyBydW50aW1lIG1hcHBpbmdzIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgcmVzb3VyY2Ugc3RyaW5nCi0JICovCi0JIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIHZhbHVlLCBIYXNodGFibGUgcnVudGltZU1hcHBpbmdzKSB7Ci0JCQotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcyA9IHZhbHVlLnRyaW0oKTsKLQotCQlpZiAoIXMuc3RhcnRzV2l0aChLRVlfUFJFRklYKSkKLQkJCXJldHVybiBzOwotCi0JCWlmIChzLnN0YXJ0c1dpdGgoS0VZX0RPVUJMRV9QUkVGSVgpKQotCQkJcmV0dXJuIHMuc3Vic3RyaW5nKDEpOwotCi0JCWludCBpeCA9IHMuaW5kZXhPZigiICIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBrZXkgPSBpeCA9PSAtMSA/IHMgOiBzLnN1YnN0cmluZygwLCBpeCk7Ci0JCVN0cmluZyBkZmx0ID0gaXggPT0gLTEgPyBzIDogcy5zdWJzdHJpbmcoaXggKyAxKTsKLQotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQkJcmV0dXJuIGRmbHQ7Ci0KLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBwcm9wZXJ0aWVzLmdldFN0cmluZyhrZXkuc3Vic3RyaW5nKDEpKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBkZmx0OwotCQl9Ci0JCWlmIChydW50aW1lTWFwcGluZ3MgIT0gbnVsbCkgewotCQkJZm9yIChFbnVtZXJhdGlvbiBlID0gcnVudGltZU1hcHBpbmdzLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCQlTdHJpbmcga2V5VmFsdWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJaW50IGkgPSByZXN1bHQuaW5kZXhPZihrZXlWYWx1ZSk7Ci0JCQkJaWYgKGkgIT0gLTEpIHsKLQkJCQkJU3RyaW5nIHMxID0gcmVzdWx0LnN1YnN0cmluZygwLGkpOwotCQkJCQlTdHJpbmcgczIgPSAoU3RyaW5nKSBydW50aW1lTWFwcGluZ3MuZ2V0KGtleVZhbHVlKTsKLQkJCQkJU3RyaW5nIHMzID0gcmVzdWx0LnN1YnN0cmluZyhpK2tleVZhbHVlLmxlbmd0aCgpKTsKLQkJCQkJcmVzdWx0ID0gczEgKyBzMiArIHMzOwotCQkJCX0KLQkJCX0KLQkJfQotCQotCQlpZiAocmVzdWx0LmluZGV4T2YoJ3snKSAhPSAtMSkgewotCQkJLy8gV2UgdGVzdCBmb3IgdGhlIGN1cmx5IGJyYWNlcyBzaW5jZSBkdWUgdG8gTkwgaXNzdWVzIHdlIGRvIG5vdAotCQkJLy8gd2FudCB0byB1c2UgTWVzc2FnZUZvcm1hdCB1bmxlc3Mgd2UgaGF2ZSB0by4KLQkJCXRyeSB7Ci0JCQkJcmVzdWx0ID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQocmVzdWx0LCBtYXBwaW5ncyk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCS8vaWdub3JlIGFuZCByZXR1cm4gc3RyaW5nIHdpdGhvdXQgYm91bmQgcGFyYW1ldGVycwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQkvKgotCSAqIFJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbmksIHByb3BlcnRpZXMsIGFuZCBtYXBwaW5ncyBmaWxlcy4KLQkgKi8KLQlwcml2YXRlIElTdGF0dXMgbG9hZChVUkwgaW5pVVJMLCBVUkwgcHJvcGVydGllc1VSTCwgVVJMIG1hcHBpbmdzVVJMKSB7Ci0KLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQl0cnkgewotCQkJaXMgPSBpbmlVUkwub3BlblN0cmVhbSgpOwotCQkJaW5pID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCWluaS5sb2FkKGlzKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJaW5pID0gbnVsbDsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoTWVzc2FnZXMuSW5pRmlsZVJlYWRlcl9SZWFkSW5pRXJyb3IsIChuZXcgU3RyaW5nW10geyBpbmlVUkwudG9FeHRlcm5hbEZvcm0oKSB9KSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQSUQsIDAsIG1lc3NhZ2UsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoaXMgIT0gbnVsbCkKLQkJCQkJaXMuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9wZXJ0aWVzVVJMICE9IG51bGwpIHsKLQkJCWlzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaXMgPSBwcm9wZXJ0aWVzVVJMLm9wZW5TdHJlYW0oKTsKLQkJCQlwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnR5UmVzb3VyY2VCdW5kbGUoaXMpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXByb3BlcnRpZXMgPSBudWxsOwotCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoTWVzc2FnZXMuSW5pRmlsZVJlYWRlcl9SZWFkUHJvcEVycm9yLCAobmV3IFN0cmluZ1tdIHsgcHJvcGVydGllc1VSTC50b0V4dGVybmFsRm9ybSgpIH0pKTsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQSUQsIDAsIG1lc3NhZ2UsIGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQlpZiAoaXMgIT0gbnVsbCkKLQkJCQkJCWlzLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCi0JCVByb3BlcnR5UmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gbnVsbDsKLQkJaWYgKG1hcHBpbmdzVVJMICE9IG51bGwpIHsKLQkJCWlzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaXMgPSBtYXBwaW5nc1VSTC5vcGVuU3RyZWFtKCk7Ci0JCQkJYnVuZGxlID0gbmV3IFByb3BlcnR5UmVzb3VyY2VCdW5kbGUoaXMpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWJ1bmRsZSA9IG51bGw7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChNZXNzYWdlcy5JbmlGaWxlUmVhZGVyX1JlYWRNYXBFcnJvciwgKG5ldyBTdHJpbmdbXSB7IG1hcHBpbmdzVVJMLnRvRXh0ZXJuYWxGb3JtKCkgfSkpOwotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBJRCwgMCwgbWVzc2FnZSwgZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChpcyAhPSBudWxsKQotCQkJCQkJaXMuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJQXJyYXlMaXN0IG1hcHBpbmdzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGZvdW5kID0gdHJ1ZTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChmb3VuZCkgewotCQkJCXRyeSB7Ci0JCQkJCW1hcHBpbmdzTGlzdC5hZGQoYnVuZGxlLmdldFN0cmluZyhJbnRlZ2VyLnRvU3RyaW5nKGkpKSk7Ci0JCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQkJZm91bmQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0JCW1hcHBpbmdzID0gKFN0cmluZ1tdKW1hcHBpbmdzTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbbWFwcGluZ3NMaXN0LnNpemUoKV0pOwotCQkKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JjMGM2YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMjIEJvb3QgcGx1Z2luIG1lc3NhZ2UgY2F0YWxvZwotCi0jIyMgUGxhdGZvcm0gQ29uZmlndXJhdGlvbgotY2ZpZ191bmFibGVUb0xvYWRfbm9VUkw9Q29uZmlndXJhdGlvbiBmaWxlIGxvY2F0aW9uIG5vdCBzcGVjaWZpZWQKLWNmaWdfdW5hYmxlVG9TYXZlX25vVVJMPUNvbmZpZ3VyYXRpb24gZmlsZSBzYXZlIGxvY2F0aW9uIG5vdCBzcGVjaWZpZWQKLWNmaWdfdW5hYmxlVG9TYXZlPVVuYWJsZSB0byBzYXZlIGNvbmZpZ3VyYXRpb24gZmlsZSBcInswfVwiCi0KLUluc3RhbGxlZFNpdGVQYXJzZXJfVW5hYmxlVG9DcmVhdGVVUkw9IEludGVybmFsIEVycm9yLiBVbmFibGUgdG8gY3JlYXRlIFVSTCBmcm9tIFwiezB9XCIuCi1JbnN0YWxsZWRTaXRlUGFyc2VyX1VuYWJsZVRvQ3JlYXRlVVJMRm9yRmlsZT0gVW5hYmxlIHRvIGNyZWF0ZSBVUkwgZnJvbSBcInswfVwiLgotSW5zdGFsbGVkU2l0ZVBhcnNlcl9FcnJvclBhcnNpbmdGaWxlPSBVbmFibGUgdG8gcGFyc2UgZmlsZSBcInswfVwiLgotSW5zdGFsbGVkU2l0ZVBhcnNlcl9FcnJvckFjY2Vzc2luZz0gVW5hYmxlIHRvIGFjY2VzcyBmaWxlIFwiezB9XCIuCi1JbnN0YWxsZWRTaXRlUGFyc2VyX2RhdGUgPSBJbnZhbGlkIGRhdGUgYXR0cmlidXRlIHswfQotQnVuZGxlTWFuaWZlc3Rfbm9WZXJzaW9uID0gezB9IGF0dHJpYnV0ZSBub3QgZm91bmQgaW4gbWFuaWZlc3QgZm9yIGJ1bmRsZSBcInsxfVwiLiAgQnVuZGxlIHdpbGwgYmUgaWdub3JlZC4KLQotRmVhdHVyZVBhcnNlcl9JZE9yVmVyc2lvbkludmFsaWQ9IEVycm9yIHBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvciB0aGUgdmVyc2lvbiBpcyBudWxsIG9yIGVtcHR5OiB1bmlxdWUgaWRlbnRpZmllcj1cInswfVwiIHZlcnNpb249XCJ7MX1cIi4KLQotQnVuZGxlR3JvdXBQcm92aWRlcj1VcGRhdGUgTWFuYWdlciBDb25maWd1cmF0b3IKLQotQ29uZmlndXJhdGlvbkFjdGl2YXRvcl9pbml0aWFsaXplPUNhbm5vdCBpbml0aWFsaXplIHRoZSBVcGRhdGUgQ29uZmlndXJhdG9yCi1Db25maWd1cmF0aW9uQWN0aXZhdG9yX2NyZWF0ZUNvbmZpZz1DYW5ub3QgY3JlYXRlIGNvbmZpZ3VyYXRpb24gaW4gezB9Ci1Db25maWd1cmF0aW9uQWN0aXZhdG9yX3VuaW5zdGFsbEJ1bmRsZT1Db3VsZCBub3QgdW5pbnN0YWxsIHVudXNlZCBidW5kbGUgezB9Ci1Db25maWd1cmF0aW9uUGFyc2VyX2Nhbm5vdExvYWRTaGFyZWRJbnN0YWxsPUNvdWxkIG5vdCBsb2FkIGZyb20gc2hhcmVkIGluc3RhbGwKLUNvbmZpZ3VyYXRpb25BY3RpdmF0b3JfaW5zdGFsbEJ1bmRsZT1Db3VsZCBub3QgaW5zdGFsbCBidW5kbGUgezB9Ci1QbHVnaW5FbnRyeV92ZXJzaW9uRXJyb3I9VW5hYmxlIHRvIGNyZWF0ZSB2ZXJzaW9uZWQgaWRlbnRpZmllcjogezB9IHsxfQotCi1JbmlGaWxlUmVhZGVyX01pc3NpbmdEZXNjID0gQ2Fubm90IGZpbmQgcGx1Z2luIGZvciBmZWF0dXJlIHswfQotSW5pRmlsZVJlYWRlcl9PcGVuSU5JRXJyb3IgPSBDYW5ub3Qgb3BlbiBicmFuZGluZyBmaWxlIHswfQotSW5pRmlsZVJlYWRlcl9SZWFkSW5pRXJyb3IgPSBFcnJvciByZWFkaW5nIGJyYW5kaW5nIGZpbGUgezB9Ci1JbmlGaWxlUmVhZGVyX1JlYWRQcm9wRXJyb3IgPSBFcnJvciByZWFkaW5nIGJyYW5kaW5nIHByb3BlcnRpZXMgZmlsZSB7MH0KLUluaUZpbGVSZWFkZXJfUmVhZE1hcEVycm9yID0gRXJyb3IgcmVhZGluZyBtYXBwaW5nIGZpbGVzIHswfQotCi1TaXRlRW50cnlfY29tcHV0ZVBsdWdpblN0YW1wID0gQ2Fubm90IGNvbXB1dGUgcGx1Z2lucyBjaGFuZ2Ugc3RhbXAgZm9yIHNpdGUgezB9IGJlY2F1c2UgaXQgZG9lcyBub3Qgc3VwcG9ydCBwbHVnaW4gZGV0ZWN0aW9uLgotU2l0ZUVudHJ5X2Nhbm5vdEZpbmRGZWF0dXJlSW5EaXI9VW5hYmxlIHRvIGZpbmQgZmVhdHVyZS54bWwgaW4gZGlyZWN0b3J5OiB7MH0KLVNpdGVFbnRyeV9kdXBsaWNhdGVGZWF0dXJlPUR1cGxpY2F0ZSBmZWF0dXJlIGZvdW5kIG9uIHNpdGUgezB9IDogezF9Ci1TaXRlRW50cnlfcGx1Z2luc0RpciA9IHswfSBpcyBub3QgYSB2YWxpZCBwbHVnaW5zIGRpcmVjdG9yeS4KLVBsYXRmb3JtQ29uZmlndXJhdGlvbl9leHBlY3RpbmdQbGF0Zm9ybVhNTG9yRGlyZWN0b3J5PUVpdGhlciBzcGVjaWZ5IHRoZSBjb25maWd1cmF0aW9uIGRpcmVjdG9yeSBvciBhIGZpbGUgbmFtZWQgcGxhdGZvcm0ueG1sCi1QbGF0Zm9ybUNvbmZpZ3VyYXRpb25fY2Fubm90QmFja3VwQ29uZmlnPUNhbm5vdCBiYWNrdXAgY3VycmVudCBjb25maWd1cmF0aW9uCi1QbGF0Zm9ybUNvbmZpZ3VyYXRpb25fY2Fubm90Q2xvc2VTdHJlYW09Q291bGQgbm90IGNsb3NlIG91dHB1dCBzdHJlYW0gZm9yCi1QbGF0Zm9ybUNvbmZpZ3VyYXRpb25fY2Fubm90Q2xvc2VUZW1wRmlsZT1Db3VsZCBub3QgY2xvc2Ugb3V0cHV0IHN0cmVhbSBmb3IgdGVtcCBmaWxlCi1QbGF0Zm9ybUNvbmZpZ3VyYXRpb25fY2Fubm90UmVuYW1lVGVtcEZpbGU9Q291bGQgbm90IHJlbmFtZSBjb25maWd1cmF0aW9uIHRlbXAgZmlsZQotUGxhdGZvcm1Db25maWd1cmF0aW9uX2Nhbm5vdExvYWRDb25maWc9Q2Fubm90IGxvYWQgY29uZmlndXJhdGlvbiBmcm9tCi1QbGF0Zm9ybUNvbmZpZ3VyYXRpb25fY2Fubm90TG9hZERlZmF1bHRTaXRlPUNhbm5vdCBsb2FkIGRlZmF1bHQgc2l0ZQotUGxhdGZvcm1Db25maWd1cmF0aW9uX2Nhbm5vdEZpbmRDb25maWdGaWxlPVBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gZmlsZSBjYW5ub3QgYmUgZm91bmQKLVBsYXRmb3JtQ29uZmlndXJhdGlvbl9jYW5ub3RTYXZlTm9uRXhpc3RpbmdDb25maWc9Q29uZmlndXJhdGlvbiBjYW5ub3QgYmUgc2F2ZWQgYmVjYXVzZSBpdCBkb2VzIG5vdCBleGlzdAotCi1QbHVnaW5QYXJzZXJfcGx1Z2luX25vX2lkID0gUGx1Z2luIGRvZXMgbm90IGhhdmUgYSB2YWxpZCBpZGVudGlmaWVyOiB7MH0KLVBsdWdpblBhcnNlcl9wbHVnaW5fbm9fdmVyc2lvbiA9IFBsdWdpbiBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgdmVyc2lvbjogezB9Ci1YTUxQcmludEhhbmRsZXJfdW5zdXBwb3J0ZWROb2RlVHlwZT1VbnN1cHBvcnRlZCBYTUwgTm9kZSBUeXBlLgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4Ly5jbGFzc3BhdGggYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0ODI0OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvLmN2c2lnbm9yZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4Ly5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzhlMmI3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXg8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ib290PC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lPC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHk8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yPC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmU8L3Byb2plY3Q+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9hYm91dC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L2J1aWxkLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI1MDEwYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IG9zLyxcCi0gICAgICAgICAgICAgICBmcmFnbWVudC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zcmMuaW5jbHVkZXMgPSBzcmMvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9vcy9saW51eC94ODYvbGlidXBkYXRlLnNvIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L29zL2xpbnV4L3g4Ni9saWJ1cGRhdGUuc28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NzEwYmUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L29zL2xpbnV4L3g4Ni9saWJ1cGRhdGUuc28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvc3JjL2J1aWxkLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9zcmMvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWE0ZTYzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9zcmMvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9ImJ1aWxkbGlicmFyeSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4gCi0gIAotICA8IS0tIFRoZSBwcm9wZXJ0aWVzICR7ZWNsaXBzZS1ob21lfSAke2pkay1wYXRofSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0gIDwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uLy4uIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqZGstcGF0aCIgdmFsdWU9IiR7amF2YS5ob21lfSIvPgotICA8cHJvcGVydHkgbmFtZT0iaW5zdGFsbEFyY2giIHZhbHVlPSJ4ODYiIC8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJkZXN0aW5hdGlvbiIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9vcy9saW51eC8ke2luc3RhbGxBcmNofS8iLz4KLSAgPHByb3BlcnR5IG5hbWU9Im9iai1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L3NyYy8iLz4KLSAgPHByb3BlcnR5IG5hbWU9InNyYy1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L3NyYy8iLz4gIAotICAKLSAgPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIC0tPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1uYW1lIiB2YWx1ZT0ibGlidXBkYXRlIi8+ICAKLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktcGxhdGZvcm0iIHZhbHVlPSJzbyIvPiAgICAKLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7bGlicmFyeS1uYW1lfS4ke2xpYnJhcnktcGxhdGZvcm19Ii8+Ci0gIAotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0gIDwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0gIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgIDx0c3RhbXAvPgotICAgIDxkZWxldGU+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7b2JqLXBhdGh9IiBpbmNsdWRlcz0iJHtsaWJyYXJ5LWZpbGV9Ii8+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7b2JqLXBhdGh9IiBpbmNsdWRlcz0iJHtsaWJyYXJ5LW5hbWV9Lm8iLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0gIAotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gICAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke29iai1wYXRofSIgaW5jbHVkZXM9IiR7bGlicmFyeS1maWxlfSIvPgotICAgICAgPGZpbGVzZXQgZGlyPSIke29iai1wYXRofSIgaW5jbHVkZXM9IiR7bGlicmFyeS1uYW1lfS5vIi8+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotICAKLSAgCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgYnVpbGQuIC0tPgotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxidWlsZCxjbGVhbnVwIj4KLSAgPC90YXJnZXQ+Ci0gIAotICA8IS0tIFRoaXMgdGFyZ2V0IGJ1aWxkIHRoZSBsaWJyYXJ5IC0tPgotICA8dGFyZ2V0IG5hbWU9ImJ1aWxkIj4KLSAgICA8ZWNobyBtZXNzYWdlPSJCdWlsZGluZyAke2xpYnJhcnktZmlsZX0iLz4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkZXItcGF0aCIgdmFsdWU9IiR7amRrLXBhdGh9Ly4uL2luY2x1ZGUiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iaGVhZGVyLWxpbnV4LXBhdGgiIHZhbHVlPSIke2hlYWRlci1wYXRofS9saW51eCIgLz4KLQotCTxlY2hvIG1lc3NhZ2U9ImdjYyAtbyAgJHtsaWJyYXJ5LWZpbGV9IC1zaGFyZWQgLUkke3NyYy1wYXRofSAtSSR7aGVhZGVyLWxpbnV4LXBhdGh9IC1mUElDICR7bGlicmFyeS1maWxlfSIvPgotCi0gICAgPGFwcGx5IGV4ZWN1dGFibGU9ImdjYyIgZGVzdD0iJHtlY2xpcHNlLWhvbWV9LyIgcGFyYWxsZWw9ImZhbHNlIj4KLSAgICAgIDxhcmcgdmFsdWU9Ii1vIi8+Ci0gICAgICA8YXJnIHZhbHVlPSIke2xpYnJhcnktZmlsZX0iLz4KLSAgICAgIDxhcmcgdmFsdWU9Ii1zaGFyZWQiLz4KLSAgICAgIDxhcmcgdmFsdWU9Ii1JJHtzcmMtcGF0aH0iLz4KLSAgICAgIDxhcmcgdmFsdWU9Ii1JJHtoZWFkZXItcGF0aH0iLz4gICAgICAKLSAgICAgIDxhcmcgdmFsdWU9Ii1JJHtoZWFkZXItbGludXgtcGF0aH0iLz4KLSAgICAgIDxhcmcgdmFsdWU9Ii1mUElDIi8+Ci0JICA8c3JjZmlsZS8+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLXBhdGh9IiBpbmNsdWRlcz0iKi5jIi8+Ci0gICAgICA8bWFwcGVyIHR5cGU9Imdsb2IiIGZyb209IiouYyIgdG89IioubyIvPgotICAgIDwvYXBwbHk+Ci0gICAgCi0JPG1vdmUgZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiB0b2Rpcj0iJHtkZXN0aW5hdGlvbn0iLz4KLSAgPC90YXJnZXQ+Ci0gIAotICAKLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvc3JjL3VwZGF0ZS5oIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L3NyYy91cGRhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNkZGI4Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvc3JjL3VwZGF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyogRE8gTk9UIEVESVQgVEhJUyBGSUxFIC0gaXQgaXMgbWFjaGluZSBnZW5lcmF0ZWQgKi8NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLaAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSANCi0jaW5jbHVkZSA8am5pLmg+DQotLyogSGVhZGVyIGZvciBjbGFzcyBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8gKi8NCi0NCi0jaWZuZGVmIF9JbmNsdWRlZF9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0jZGVmaW5lIF9JbmNsdWRlZF9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi1leHRlcm4gIkMiIHsNCi0jZW5kaWYNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1NJWkVfVU5LTk9XTg0KLSNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1NJWkVfVU5LTk9XTiAtMUwNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9VTktOT1dODQotI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1VOS05PV04gLTFMDQotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfSU5WQUxJRF9QQVRIDQotI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0lOVkFMSURfUEFUSCAtMkwNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SRU1PVkFCTEUNCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkVNT1ZBQkxFIDFMDQotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfRklYRUQNCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfRklYRUQgMkwNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SRU1PVEUNCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkVNT1RFIDNMDQotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfQ0RST00NCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfQ0RST00gNEwNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SQU1ESVNLDQotI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1JBTURJU0sgNUwNCi0vKiBJbmFjY2Vzc2libGUgc3RhdGljOiBsaXN0ZW5lcnMgKi8NCi0vKiBJbmFjY2Vzc2libGUgc3RhdGljOiBoYXNOYXRpdmVzICovDQotLyoNCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSAqIE1ldGhvZDogICAgbmF0aXZlR2V0RnJlZVNwYWNlDQotICogU2lnbmF0dXJlOiAoTGphdmEvaW8vRmlsZTspSg0KLSAqLw0KLUpOSUVYUE9SVCBqbG9uZyBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX25hdGl2ZUdldEZyZWVTcGFjZQ0KLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpvYmplY3QpOw0KLQ0KLS8qDQotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0gKiBNZXRob2Q6ICAgIG5hdGl2ZUdldExhYmVsDQotICogU2lnbmF0dXJlOiAoTGphdmEvaW8vRmlsZTspTGphdmEvbGFuZy9TdHJpbmc7DQotICovDQotSk5JRVhQT1JUIGpzdHJpbmcgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVHZXRMYWJlbA0KLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpvYmplY3QpOw0KLQ0KLS8qDQotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0gKiBNZXRob2Q6ICAgIG5hdGl2ZUdldFR5cGUNCi0gKiBTaWduYXR1cmU6IChMamF2YS9pby9GaWxlOylJDQotICovDQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVHZXRUeXBlDQotICAoSk5JRW52ICosIGpjbGFzcywgam9iamVjdCk7DQotDQotLyoNCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSAqIE1ldGhvZDogICAgbmF0aXZlTGlzdE1vdW50UG9pbnRzDQotICogU2lnbmF0dXJlOiAoKVtMamF2YS9sYW5nL1N0cmluZzsNCi0gKi8NCi1KTklFWFBPUlQgam9iamVjdEFycmF5IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlTGlzdE1vdW50UG9pbnRzDQotICAoSk5JRW52ICosIGpjbGFzcyk7DQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLQ0KLSNlbmRpZg0KLSNlbmRpZg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM5YjI4Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvYWJvdXQuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9idWlsZC5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZGRhY2EuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBvcy8sXAotICAgICAgICAgICAgICAgZnJhZ21lbnQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBzcmMvCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvb3Mvd2luMzIvaWE2NC91cGRhdGUuZGxsIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL29zL3dpbjMyL2lhNjQvdXBkYXRlLmRsbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlNDY5NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvb3Mvd2luMzIvaWE2NC91cGRhdGUuZGxsCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL29zL3dpbjMyL3g4Ni91cGRhdGUuZGxsIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL29zL3dpbjMyL3g4Ni91cGRhdGUuZGxsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjE5NGQyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9vcy93aW4zMi94ODYvdXBkYXRlLmRsbAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9zcmMvYnVpbGQueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMjg2YjcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0iYnVpbGRsaWJyYXJ5IiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPiAKLSAgCi0gIDwhLS0gVGhlIHByb3BlcnRpZXMgJHtlY2xpcHNlLWhvbWV9ICR7amRrLXBhdGh9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLSAgPCEtLSBUaGUgUGF0aCBzaG91bGQgcG9pbnQgdG8gdGhlIGJpbiBkaXJlY3Rvcnkgb2YgQkNDNTUgLS0+Ci0gIDwhLS0gaHR0cDovL3d3dy5ib3JsYW5kLmNvbS9wcm9kdWN0cy9kb3dubG9hZHMvZG93bmxvYWRfY2J1aWxkZXIuaHRtbCAtLT4KLSAgCi0gIDwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uLy4uIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqZGstcGF0aCIgdmFsdWU9IiR7amF2YS5ob21lfSIvPiAgCi0gIDxwcm9wZXJ0eSBuYW1lPSJkZXN0aW5hdGlvbiIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9vcy93aW4zMi94ODYvIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJvYmotcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9zcmMiLz4KLSAgPHByb3BlcnR5IG5hbWU9InNyYy1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy8iLz4gIAotICAKLSAgPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIC0tPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1uYW1lIiB2YWx1ZT0idXBkYXRlIi8+ICAKLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktcGxhdGZvcm0iIHZhbHVlPSJkbGwiLz4gICAgCi0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiIHZhbHVlPSIke2xpYnJhcnktbmFtZX0uJHtsaWJyYXJ5LXBsYXRmb3JtfSIvPgotICAKLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke29iai1wYXRofSIgaW5jbHVkZXM9IiR7bGlicmFyeS1maWxlfSIvPgotICAgICAgPGZpbGVzZXQgZGlyPSIke29iai1wYXRofSIgaW5jbHVkZXM9IiR7bGlicmFyeS1uYW1lfS5vYmoiLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtvYmotcGF0aH0iIGluY2x1ZGVzPSIke2xpYnJhcnktbmFtZX0udGRzIi8+ICAgICAgICAgICAgCi0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLSAgPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotICAgICAgPGRlbGV0ZT4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtvYmotcGF0aH0iIGluY2x1ZGVzPSIke2xpYnJhcnktZmlsZX0iLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtvYmotcGF0aH0iIGluY2x1ZGVzPSIke2xpYnJhcnktbmFtZX0ub2JqIi8+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7b2JqLXBhdGh9IiBpbmNsdWRlcz0iJHtsaWJyYXJ5LW5hbWV9LnRkcyIvPiAgICAgICAgICAgIAotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLSAgCi0gIAotICA8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsYnVpbGQsY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSBUaGlzIHRhcmdldCBidWlsZCB0aGUgZGxsIC0tPgotICA8dGFyZ2V0IG5hbWU9ImJ1aWxkIj4KLSAgICA8ZWNobyBtZXNzYWdlPSJCdWlsZGluZyAke2xpYnJhcnktZmlsZX0iLz4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkZXItcGF0aCIgdmFsdWU9IiR7amRrLXBhdGh9L2luY2x1ZGUiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iaGVhZGVyLXdpbmRvd3MtcGF0aCIgdmFsdWU9IiR7aGVhZGVyLXBhdGh9L3dpbjMyIiAvPgotCi0JPGVjaG8gbWVzc2FnZT0iYmNjMzIgLUkke3NyYy1wYXRofSAtSSR7aGVhZGVyLXdpbmRvd3MtcGF0aH0gLVdEIi8+Ci0KLSAgICA8YXBwbHkgZXhlY3V0YWJsZT0iYmNjMzIiIGRlc3Q9IiR7ZWNsaXBzZS1ob21lfS8iIHBhcmFsbGVsPSJmYWxzZSI+Ci0gICAgICA8YXJnIHZhbHVlPSItSSR7c3JjLXBhdGh9Ii8+Ci0gICAgICA8YXJnIHZhbHVlPSItSSR7aGVhZGVyLXBhdGh9Ii8+ICAgICAgCi0gICAgICA8YXJnIHZhbHVlPSItSSR7aGVhZGVyLXdpbmRvd3MtcGF0aH0iLz4gCi0gICAgICA8IS0tIGFyZyB2YWx1ZT0iLURVTklDT0RFIiAtLT4gCi0JICA8YXJnIHZhbHVlPSItdy04MDU3Ii8+ICAgICAgICAgICAKLSAgICAgIDxhcmcgdmFsdWU9Ii1XRCIvPgotCSAgPHNyY2ZpbGUvPgotICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy1wYXRofSIgaW5jbHVkZXM9IiouY3BwIi8+Ci0gICAgICA8bWFwcGVyIHR5cGU9Imdsb2IiIGZyb209IiouY3BwIiB0bz0iKi5vYmoiLz4KLSAgICA8L2FwcGx5PgotICAgIAotCTxtb3ZlIGZpbGU9IiR7bGlicmFyeS1maWxlfSIgdG9kaXI9IiR7ZGVzdGluYXRpb259Ii8+Ci0gIDwvdGFyZ2V0PgotICAKLSAgCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy9tYWtlLmJhdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9zcmMvbWFrZS5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMTA1YjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy9tYWtlLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLXJlbSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1yZW0gIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLXJlbSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotcmVtICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLXJlbSAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLXJlbSAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLXJlbSAKLXJlbSAgQ29udHJpYnV0b3JzOgotcmVtICAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi1yZW0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotZGVsIHVwZGF0ZS5vYmoKLWRlbCB1cGRhdGUuZGxsCi1zZXQgd2luX2luY2x1ZGU9azpcbXN2YzYwXHZjOThcaW5jbHVkZQotc2V0IGxpYl9pbmNsdWRlcz1LOlxNc3ZjNjBcVkM5OFxMaWJcVVVJRC5MSUIgSzpcTXN2YzYwXFZDOThcTGliXExJQkNNVC5MSUIgSzpcTXN2YzYwXFZDOThcTGliXE9MRE5BTUVTLkxJQiBLOlxNc3ZjNjBcVkM5OFxMaWJcS0VSTkVMMzIuTElCCi1zZXQgamRrX2luY2x1ZGU9ZDpcdm1camRrMS40LjJcaW5jbHVkZQotc2V0IGRsbF9uYW1lPXVwZGF0ZQotY2wgLUkld2luX2luY2x1ZGUlIC1JJWpka19pbmNsdWRlJSAtSSVqZGtfaW5jbHVkZSVcd2luMzIgLUxEIHVwZGF0ZS5jcHAgLUZlJWRsbF9uYW1lJSAvbGluayAlbGliX2luY2x1ZGVzJQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy9zZXR1cC5iYXQgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvc3JjL3NldHVwLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZmNTc0Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvc3JjL3NldHVwLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLXJlbSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1yZW0gIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLXJlbSAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotcmVtICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLXJlbSAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLXJlbSAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLXJlbSAKLXJlbSAgQ29udHJpYnV0b3JzOgotcmVtICAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi1yZW0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotc2V0IHBhdGg9JXBhdGglO0s6XG1zdmM2MFx2Yzk4XGJpbjtLOlxtc3ZjNjBcQ29tbW9uXE1TRGV2OThcQmluCi1zZXQgdGVtcD1kOlx0ZW1wCi1zZXQgdG1wPWQ6XHRlbXAKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9zcmMvdXBkYXRlLmNwcCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9zcmMvdXBkYXRlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZjYWU0My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvc3JjL3VwZGF0ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0jIGluY2x1ZGUgInVwZGF0ZS5oIg0KLSMgaW5jbHVkZSA8d2luZG93cy5oPg0KLSMgaW5jbHVkZSA8d2luaW9jdGwuaD4gLy8gSU9DVEwgY29kZXM6IE1lZGlhVHlwZQ0KLQ0KLS8vIHNldCB0byAxIGZvciBERUJVRw0KLWludCBERUJVRyA9IDA7DQotDQotLy8gR0xPQkFMIE1FVEhPRFMNCi0vLyAtLS0tLS0tLS0tLS0tLS0NCi0NCi0vKg0KLSAqDQotICovDQotanN0cmluZyBXaW5kb3dzVG9qc3RyaW5nKCBKTklFbnYqIGpuaWVudiwgY2hhciogYnVmICkNCi17DQotICBqc3RyaW5nIHJ0biA9IDA7DQotICB3Y2hhcl90KiBidWZmZXIgPSAwOw0KLSAgaW50IGJ1ZmZlckxlbiA9IHN0cmxlbihidWYpOyAgDQotICBpZiggYnVmZmVyTGVuID09IDAgKXsNCi0gICAgcnRuID0gam5pZW52IC0+TmV3U3RyaW5nVVRGKGJ1Zik7DQotCWlmIChERUJVRykNCi0JCXByaW50ZigiV2luZG93c1RvSlN0cmluZyBCdWZmZXIgaXMgZW1wdHlcbiIpOyAgICANCi0gIH0gZWxzZSB7DQotICAgIGludCBsZW5ndGggPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIChMUENTVFIpYnVmLCBidWZmZXJMZW4sIE5VTEwsIDAgKTsNCi0gICAgYnVmZmVyID0gKHdjaGFyX3QqKW1hbGxvYyggbGVuZ3RoKjIgKyAxICk7DQotICAgIGlmKGludCBlcnI9TXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCAoTFBDU1RSKWJ1ZiwgYnVmZmVyTGVuLCAoTFBXU1RSKWJ1ZmZlciwgbGVuZ3RoICkgPjAgKXsNCi0gICAgICBydG4gPSBqbmllbnYtPk5ld1N0cmluZygoamNoYXIqKWJ1ZmZlciwgbGVuZ3RoICk7DQotICAgIH0gZWxzZSB7DQotCQlpZiAoREVCVUcpDQotCQkJcHJpbnRmKCJNdWx0aUJ5dGVUb1dpZGVDaGFyICVpXG4iLGVycik7ICAgIA0KLSAgICB9DQotICB9DQotICBpZiggYnVmZmVyICkNCi0gICBmcmVlKCBidWZmZXIgKTsNCi0gIHJldHVybiBydG47DQotfQ0KLQ0KLQ0KLQ0KLS8qDQotICogY2FsbHMgR2V0Vm9sdW1lSW5mb3JtYXRpb24gdG8gcmV0cml2ZSB0aGUgbGFiZWwgb2YgdGhlIHZvbHVtZQ0KLSAqIFJldHVybnMgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnMNCi0gKiBAcGFyYW0gZHJpdmVMZXR0ZXIgcGF0aCB0byB0aGUgZHJpdmUgImM6XFwiDQotICogQHByYW1hIGpuaWVudiBKTklFbnZpcm9ubWVudA0KLSAqLw0KLWpzdHJpbmcgZ2V0TGFiZWwoVENIQVIgZHJpdmVMZXR0ZXJbXSxKTklFbnYgKiBqbmllbnYpew0KLQ0KLQlqc3RyaW5nIHJlc3VsdCA9IE5VTEw7DQotCVRDSEFSIGJ1ZlsxMjhdOwkNCi0JDQotCS8vIGFsd2F5cyByZXR1cm4gbnVsbCBhcyBVTklDT0RFIGlzIG5vdCBpbXBsZW1lbnRlZA0KLQkvLyBob3cgY2FuIHdlIGdldCB0aGUgbGFiZWwgb2YgYSB2b2x1bWUgYXMgVU5JQ09ERSBjaGFyID8NCi0JcmV0dXJuIHJlc3VsdDsNCi0JDQotCWludCBlcnIgPSBHZXRWb2x1bWVJbmZvcm1hdGlvbigNCi0JCWRyaXZlTGV0dGVyLA0KLQkJYnVmLA0KLQkJc2l6ZW9mKGJ1ZikgLSAxLA0KLQkJTlVMTCwNCi0JCU5VTEwsDQotCQlOVUxMLA0KLQkJTlVMTCwNCi0JCTApOw0KLQlpZiAoZXJyKXsNCi0JCXJlc3VsdCA9IFdpbmRvd3NUb2pzdHJpbmcoam5pZW52LCBidWYpOw0KLQl9IGVsc2Ugew0KLQkJaWYgKERFQlVHKQ0KLQkJCXByaW50ZigiRXJyb3IgR2V0Vm9sdW1lSW5mb3JtYXRpb24gJWlcbiIsZXJyKTsJCQkJDQotIAl9DQotCXJldHVybiByZXN1bHQ7DQotfQ0KLQ0KLS8qDQotICogUmV0dXJucyB0aGUgdHlwZSBvZiBSZW1vdmFibGUgRHJpdmUgDQotICogUmV0dXJucyANCi0gKiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0ZMT1BQWV8zDQotICogb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9GTE9QUFlfNQ0KLSAqIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkVNT1ZBQkxFDQotICovDQotamxvbmcgZ2V0RmxvcHB5KFRDSEFSIGRyaXZlTGV0dGVyW10pew0KLQ0KLQlUQ0hBUiBmbG9wcHlQYXRoWzhdOw0KLQlIQU5ETEUgaGFuZGxlOw0KLQlESVNLX0dFT01FVFJZIGdlb21ldHJ5WzIwXTsNCi0JRFdPUkQgZHc7DQotCWpsb25nIFVOS05PV04gPSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1JFTU9WQUJMRTsNCi0NCi0Jc3ByaW50ZihmbG9wcHlQYXRoLCAiXFxcXC5cXCVjOiIsIGRyaXZlTGV0dGVyWzBdKTsNCi0JaWYgKERFQlVHKQ0KLQkJcHJpbnRmKCJQYXRoICVzXG4iLGZsb3BweVBhdGgpOw0KLQkvLyBCVUcgMjU3MTkNCi0gICAgU2V0RXJyb3JNb2RlKCBTRU1fRkFJTENSSVRJQ0FMRVJST1JTICk7IAkJDQotCWhhbmRsZT1DcmVhdGVGaWxlKGZsb3BweVBhdGgsMCxGSUxFX1NIQVJFX1JFQUQsTlVMTCxPUEVOX0FMV0FZUywwLE5VTEwpOw0KLQlpZiAoaGFuZGxlPT1JTlZBTElEX0hBTkRMRV9WQUxVRSl7DQotCQlpZiAoREVCVUcpDQotCQkJcHJpbnRmKCJJbnZhbGlkIEhhbmRsZSAlc1xuIixmbG9wcHlQYXRoKTsNCi0JCXJldHVybiBVTktOT1dOOw0KLQl9IGVsc2Ugew0KLQkJaWYoRGV2aWNlSW9Db250cm9sKGhhbmRsZSwNCi0JCQlJT0NUTF9ESVNLX0dFVF9NRURJQV9UWVBFUywwLDAsDQotCQkJZ2VvbWV0cnksc2l6ZW9mKGdlb21ldHJ5KSwmZHcsMCkgDQotCQkJJiYgZHc+MCkgew0KLQkJCXN3aXRjaChnZW9tZXRyeVswXS5NZWRpYVR5cGUpew0KLQkJCSBjYXNlIEY1XzE2MF81MTI6DQotCQkJIGNhc2UgRjVfMTgwXzUxMjoNCi0JCQkgY2FzZSBGNV8zMjBfNTEyOg0KLQkJCSBjYXNlIEY1XzMyMF8xMDI0Og0KLQkJCSBjYXNlIEY1XzM2MF81MTI6DQotCQkJIGNhc2UgRjVfMVB0Ml81MTI6DQotCQkJCWlmIChERUJVRykNCi0JCQkJCXByaW50ZigiRm91bmQgNSAxLzQgRHJpdmVcbiIpOwkJCQkgCQ0KLQkJCSAJcmV0dXJuIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfRkxPUFBZXzU7DQotCQkJIGNhc2UgRjNfNzIwXzUxMjoJCQkgCQkJCSAJCQkJIAkJCQkgCQkJCSANCi0JCQkgY2FzZSBGM18xUHQ0NF81MTI6DQotCQkJIGNhc2UgRjNfMlB0ODhfNTEyOg0KLQkJCSBjYXNlIEYzXzIwUHQ4XzUxMjoJCQkJIAkJCQkgCQkJCSANCi0JCQkJaWYgKERFQlVHKQ0KLQkJCQkJcHJpbnRmKCJGb3VuZCAzIDEvMiBEcml2ZVxuIik7CQkJCSAJDQotCQkJIAlyZXR1cm4gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9GTE9QUFlfMzsNCi0JCQkgZGVmYXVsdDoNCi0JCQkgCXJldHVybiBVTktOT1dOOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQlyZXR1cm4gVU5LTk9XTjsJDQotfQ0KLQ0KLS8qDQotICogUmV0dXJucyB0aGUgVU5DIG5hbWUgb2YgYSByZW1vdGUgZHJpdmUNCi0gKiAoXFxNYWNoaW5lXHBhdGhccGF0aDFccGF0aDIkKQ0KLSAqIHJldHVybnMgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnMNCi0gKi8NCi0ganN0cmluZyBnZXRSZW1vdGVOZXR3b3JrTmFtZShUQ0hBUiBkcml2ZUxldHRlcltdLEpOSUVudiAqIGpuaWVudil7DQotIAkNCi0gCXVuc2lnbmVkIGxvbmcgc2l6ZSA9MjU2Ow0KLSAJVENIQVIgYnVmWzI1Nl07CQ0KLSAJVENIQVIgZHJpdmVQYXRoWzJdOw0KLSAJRFdPUkQgZXJyOw0KLSAJanN0cmluZyByZXN1bHQgPSBOVUxMOw0KLSAJDQotIAkvLyBhbHdheXMgcmV0dXJuIE5VTEwgYXMgVU5JQ09ERSBub3QgaW1wbGVtZW50ZWQNCi0JLy8gaG93IGNhbiB3ZSBnZXQgdGhlIGxhYmVsIG9mIGEgcmVtb3RlIG5ldHdvcmsgbmFtZSBhcyBVTklDT0RFIGNoYXIgPyAJDQotIAlyZXR1cm4gcmVzdWx0Ow0KLSAJDQotCXNwcmludGYoZHJpdmVQYXRoLCAiJWM6IiwgZHJpdmVMZXR0ZXJbMF0pOyAJDQotIAllcnIgPSBXTmV0R2V0Q29ubmVjdGlvbihkcml2ZVBhdGgsYnVmLCZzaXplKTsNCi0gCQ0KLSAJaWYgKGVycj09V05fU1VDQ0VTUyl7DQotCQlyZXN1bHQgPSBXaW5kb3dzVG9qc3RyaW5nKGpuaWVudixidWYpOw0KLQl9IGVsc2Ugew0KLQkJaWYgKERFQlVHKQ0KLQkJCXByaW50ZigiRXJyb3IgV05FdEdldENvbm5lY3Rpb24gJWkiLGVycik7CQkJCQ0KLSAJfQ0KLQlyZXR1cm4gcmVzdWx0Ow0KLSB9DQotDQotDQotLy8gSk5JIE1FVEhPRFMNCi0vLyAtLS0tLS0tLS0tLS0tLS0NCi0NCi0vKg0KLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQotICogTWV0aG9kOiAgICBuYXRpdmVHZXRGcmVlU3BhY2UNCi0gKiBTaWduYXR1cmU6IChMamF2YS9pby9GaWxlOylKDQotICovDQotSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlR2V0RnJlZVNwYWNlKA0KLQlKTklFbnYgKiBqbmllbnYsDQotCWpjbGFzcyBqYXZhQ2xhc3MsDQotCWpvYmplY3QgZmlsZSkgew0KLQ0KLQkvLyB0byByZXRyaXZlIHRoZSBTdHJpbmcNCi0JamNsYXNzIGNsczsNCi0Jam1ldGhvZElEIGlkOw0KLQlqb2JqZWN0IG9iajsNCi0NCi0JLy8gamF2YS5pby5GaWxlLmdldEFic29sdXRlUGF0aCgpDQotCWNvbnN0IFRDSEFSICogbHBEaXJlY3RvcnlOYW1lOw0KLQ0KLQkvLyBXaW5kb3dzIFBhcmFtZXRlcnMNCi0JX19pbnQ2NCBpNjRGcmVlQnl0ZXNBdmFpbGFibGVUb0NhbGxlcjsNCi0JX19pbnQ2NCBpNjRUb3RhbE51bWJlck9mQnl0ZXM7DQotCV9faW50NjQgaTY0VG90YWxOdW1iZXJPZkZyZWVCeXRlczsNCi0NCi0JLy8gZmlyc3QsIG9idGFpbiB0aGUgUGF0aCBmcm9tIHRoZSBqYXZhLmlvLkZpbGUgcGFyYW1ldGVyDQotCWNscyA9IGpuaWVudiAtPiBHZXRPYmplY3RDbGFzcyhmaWxlKTsNCi0JaWQgPSBqbmllbnYgLT4gR2V0TWV0aG9kSUQoY2xzLCAiZ2V0QWJzb2x1dGVQYXRoIiwgIigpTGphdmEvbGFuZy9TdHJpbmc7Iik7DQotCW9iaiA9IGpuaWVudiAtPiBDYWxsT2JqZWN0TWV0aG9kKGZpbGUsIGlkKTsNCi0JbHBEaXJlY3RvcnlOYW1lID0gam5pZW52IC0+IEdldFN0cmluZ1VURkNoYXJzKChqc3RyaW5nKSBvYmosIDApOw0KLQlpZiAoREVCVUcpDQotCQlwcmludGYoIkRpcmVjdG9yeTogWyVzXVxuIixscERpcmVjdG9yeU5hbWUpOw0KLQ0KLQlpbnQgc3VjY2VzcyA9IEdldERpc2tGcmVlU3BhY2VFeCgNCi0JCQkJbHBEaXJlY3RvcnlOYW1lLA0KLQkJCQkoUFVMQVJHRV9JTlRFR0VSKSAmIGk2NEZyZWVCeXRlc0F2YWlsYWJsZVRvQ2FsbGVyLA0KLQkJCQkoUFVMQVJHRV9JTlRFR0VSKSAmIGk2NFRvdGFsTnVtYmVyT2ZCeXRlcywNCi0JCQkJKFBVTEFSR0VfSU5URUdFUikgJiBpNjRUb3RhbE51bWJlck9mRnJlZUJ5dGVzKTsNCi0JCQkNCi0JaWYgKHN1Y2Nlc3MpIHsNCi0JCXJldHVybiAoamxvbmcpIGk2NEZyZWVCeXRlc0F2YWlsYWJsZVRvQ2FsbGVyOw0KLQl9IGVsc2Ugew0KLQkJcmV0dXJuIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19TSVpFX1VOS05PV047DQotCX0NCi19DQotDQotLyoNCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSAqIE1ldGhvZDogICAgbmF0aXZlR2V0TGFiZWwNCi0gKiBTaWduYXR1cmU6IChMamF2YS9pby9GaWxlOylMamF2YS9sYW5nL1N0cmluZzsNCi0gKi8NCi1KTklFWFBPUlQganN0cmluZyBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX25hdGl2ZUdldExhYmVsKA0KLQlKTklFbnYgKiBqbmllbnYsDQotCWpjbGFzcyBqYXZhQ2xhc3MsDQotCWpvYmplY3QgZmlsZSkgew0KLQ0KLQkvLyB0byByZXRyaXZlIHRoZSBTdHJpbmcNCi0JamNsYXNzIGNsczsNCi0Jam1ldGhvZElEIGlkOw0KLQlqb2JqZWN0IG9iajsNCi0NCi0JLy8gamF2YS5pby5GaWxlLmdldEFic29sdXRlUGF0aCgpDQotCWNvbnN0IFRDSEFSICogbHBEaXJlY3RvcnlOYW1lOw0KLQ0KLQkvLyBvYnRhaW4gdGhlIFN0cmluZyBmcm9tIHRoZSBwYXJhbWV0ZXINCi0JY2xzID0gam5pZW52IC0+IEdldE9iamVjdENsYXNzKGZpbGUpOw0KLQlpZCA9IGpuaWVudiAtPiBHZXRNZXRob2RJRChjbHMsICJnZXRBYnNvbHV0ZVBhdGgiLCAiKClMamF2YS9sYW5nL1N0cmluZzsiKTsNCi0Jb2JqID0gam5pZW52IC0+IENhbGxPYmplY3RNZXRob2QoZmlsZSwgaWQpOw0KLQlscERpcmVjdG9yeU5hbWUgPSBqbmllbnYgLT4gR2V0U3RyaW5nVVRGQ2hhcnMoKGpzdHJpbmcpIG9iaiwgMCk7DQotCWlmIChERUJVRykNCi0JCXByaW50ZigiRGlyZWN0b3J5OiBbJXNdXG4iLGxwRGlyZWN0b3J5TmFtZSk7DQotDQotCS8vDQotCWpzdHJpbmcgcmVzdWx0ID0gTlVMTDsNCi0JDQotCS8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgU3RyaW5nIG9mIHRoZSBGb3JtOiA8bGV0dGVyPjoNCi0JaWYgKCc6JyA9PSBscERpcmVjdG9yeU5hbWVbMV0pIHsNCi0JCVRDSEFSIGRyaXZlTGV0dGVyWzRdOyAvLyBDOlxcIGZvciBleGFtcGxlDQotCQltZW1jcHkoZHJpdmVMZXR0ZXIsIGxwRGlyZWN0b3J5TmFtZSwgMik7DQotCQlzdHJjcHkoZHJpdmVMZXR0ZXIgKyAyLCAiXFwiKTsNCi0JCXN3aXRjaCAoR2V0RHJpdmVUeXBlKGRyaXZlTGV0dGVyKSkgew0KLQkJCWNhc2UgRFJJVkVfUkVNT1RFIDoNCi0JCQkJLy8gY2hlY2sgbmFtZSBvZiBtYWNoaW5lIGFuZCBwYXRoIG9mIHJlbW90ZQ0KLQkJCQlpZiAoREVCVUcpDQotCQkJCQlwcmludGYoIlJlbW90ZSBEcml2ZSIpOw0KLQkJCQlyZXN1bHQgPSBnZXRSZW1vdGVOZXR3b3JrTmFtZShkcml2ZUxldHRlcixqbmllbnYpOwkJCQkNCi0JCQkJYnJlYWs7DQotCQkJZGVmYXVsdCA6DQotCQkJCWlmIChERUJVRykNCi0JCQkJCXByaW50ZigiQW5vdGhlciBEcml2ZSBhdCAlcyIsIGRyaXZlTGV0dGVyKTsNCi0JCQkJcmVzdWx0ID0gZ2V0TGFiZWwoZHJpdmVMZXR0ZXIsam5pZW52KTsNCi0JCQkJYnJlYWs7DQotCQl9IA0KLQl9IA0KLQ0KLQlyZXR1cm4gcmVzdWx0Ow0KLX0NCi0NCi0vKg0KLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQotICogTWV0aG9kOiAgICBuYXRpdmVHZXRUeXBlDQotICogU2lnbmF0dXJlOiAoTGphdmEvaW8vRmlsZTspSQ0KLSAqLw0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlR2V0VHlwZSgNCi0JSk5JRW52ICogam5pZW52LA0KLQlqY2xhc3MgamF2YUNsYXNzLA0KLQlqb2JqZWN0IGZpbGUpIHsNCi0NCi0JLy8gdG8gcmV0cml2ZSB0aGUgU3RyaW5nDQotCWpjbGFzcyBjbHM7DQotCWptZXRob2RJRCBpZDsNCi0Jam9iamVjdCBvYmo7DQotDQotCS8vIGphdmEuaW8uRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQ0KLQljb25zdCBUQ0hBUiAqIGxwRGlyZWN0b3J5TmFtZTsNCi0NCi0JLy8gb2J0YWluIHRoZSBTdHJpbmcgZnJvbSB0aGUgcGFyYW1ldGVyDQotCWNscyA9IGpuaWVudiAtPiBHZXRPYmplY3RDbGFzcyhmaWxlKTsNCi0JaWQgPSBqbmllbnYgLT4gR2V0TWV0aG9kSUQoY2xzLCAiZ2V0QWJzb2x1dGVQYXRoIiwgIigpTGphdmEvbGFuZy9TdHJpbmc7Iik7DQotCW9iaiA9IGpuaWVudiAtPiBDYWxsT2JqZWN0TWV0aG9kKGZpbGUsIGlkKTsNCi0JbHBEaXJlY3RvcnlOYW1lID0gam5pZW52IC0+IEdldFN0cmluZ1VURkNoYXJzKChqc3RyaW5nKSBvYmosIDApOw0KLQlpZiAoREVCVUcpDQotCQlwcmludGYoIkRpcmVjdG9yeTogWyVzXVxuIixscERpcmVjdG9yeU5hbWUpOw0KLQ0KLQlpbnQgcmVzdWx0ID0gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9VTktOT1dOOw0KLQkNCi0JLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSBTdHJpbmcgb2YgdGhlIEZvcm06IDxsZXR0ZXI+Og0KLQlpZiAoJzonID09IGxwRGlyZWN0b3J5TmFtZVsxXSkgew0KLQkJVENIQVIgZHJpdmVMZXR0ZXJbNF07IC8vQzpcXCBmb3IgZXhhbXBsZQ0KLQkJbWVtY3B5KGRyaXZlTGV0dGVyLCBscERpcmVjdG9yeU5hbWUsIDIpOw0KLQkJc3RyY3B5KGRyaXZlTGV0dGVyICsgMiwgIlxcIik7DQotDQotCQlzd2l0Y2ggKEdldERyaXZlVHlwZShkcml2ZUxldHRlcikpIHsNCi0JCQljYXNlIERSSVZFX1JFTU9WQUJMRSA6DQotCQkJCS8vIGNoZWNrIGlmIGZsb3BweSAzLjUsIGZsb3BweSA1LjI1CQ0KLQkJCQkvLyBvciBvdGhlciByZW1vdmFibGUgZGV2aWNlIChVU0IsUENNQ0lBIC4uLikNCi0JCQkJaWYgKERFQlVHKQ0KLQkJCQkJcHJpbnRmKCJSZW1vdmFibGUgRGV2aWNlIik7DQotCQkJCXJlc3VsdCA9IGdldEZsb3BweShkcml2ZUxldHRlcik7CQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJY2FzZSBEUklWRV9DRFJPTSA6DQotCQkJCXJlc3VsdCA9IG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfQ0RST007DQotCQkJCWJyZWFrOw0KLQkJCWNhc2UgRFJJVkVfRklYRUQgOg0KLQkJCQlyZXN1bHQgPSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0ZJWEVEOw0KLQkJCQlicmVhazsNCi0JCQljYXNlIERSSVZFX1JFTU9URSA6DQotCQkJCXJlc3VsdCA9IG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkVNT1RFOw0KLQkJCQlicmVhazsNCi0JCQljYXNlIERSSVZFX05PX1JPT1RfRElSIDoNCi0JCQkJcmVzdWx0ID0gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9JTlZBTElEX1BBVEg7DQotCQkJCWJyZWFrOw0KLQkJCWNhc2UgRFJJVkVfUkFNRElTSyA6DQotCQkJCXJlc3VsdCA9IG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkFNRElTSzsNCi0JCQkJYnJlYWs7CQkJDQotCQkJY2FzZSBEUklWRV9VTktOT1dOIDoNCi0JCQlkZWZhdWx0IDoNCi0JCQkJcmVzdWx0ID0gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9VTktOT1dOOw0KLQkJCQlicmVhazsNCi0JCX0NCi0JfSBlbHNlIHsNCi0JCXJlc3VsdCA9IG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfSU5WQUxJRF9QQVRIOw0KLQl9DQotDQotCXJldHVybiByZXN1bHQ7DQotfQ0KLQ0KLS8qDQotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0gKiBNZXRob2Q6ICAgIG5hdGl2ZUxpc3RNb3VudFBvaW50cw0KLSAqIFNpZ25hdHVyZTogKClbTGphdmEvbGFuZy9TdHJpbmc7DQotICovDQotSk5JRVhQT1JUIGpvYmplY3RBcnJheSBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX25hdGl2ZUxpc3RNb3VudFBvaW50cygNCi0JSk5JRW52ICogam5pZW52LA0KLQlqY2xhc3MgamF2YUNsYXNzKSB7DQotDQotCS8vDQotCURXT1JEIGxvZ0RyaXZlczsNCi0JVUlOVCBkcml2ZTsNCi0JVENIQVIgZHJpdmVOYW1lWzEwMF07DQotCWpvYmplY3RBcnJheSByZXR1cm5BcnJheTsNCi0JaW50IG5Ecml2ZSA9IDA7DQotDQotCS8vIA0KLQlqY2xhc3Mgc3RyaW5nQ2xhc3M7DQotCWpvYmplY3QgZW1wdHk7DQotCWludCBpbmRleCA9IDA7DQotCWpvYmplY3Qgc3RyOw0KLQ0KLQ0KLQlsb2dEcml2ZXMgPSBHZXRMb2dpY2FsRHJpdmVzKCk7DQotCWZvciAoZHJpdmUgPSAwOyBkcml2ZSA8IDMyOyBkcml2ZSsrKSB7DQotCQlpZiAobG9nRHJpdmVzICYgKDEgPDwgZHJpdmUpKSB7DQotCQkJbkRyaXZlKys7DQotCQl9DQotCX0NCi0NCi0Jc3RyaW5nQ2xhc3MgPSBqbmllbnYgLT4gRmluZENsYXNzKCJqYXZhL2xhbmcvU3RyaW5nIik7DQotCWVtcHR5ID0gam5pZW52IC0+IE5ld1N0cmluZ1VURigiIik7DQotCXJldHVybkFycmF5ID0gam5pZW52IC0+IE5ld09iamVjdEFycmF5KG5Ecml2ZSwgc3RyaW5nQ2xhc3MsIGVtcHR5KTsNCi0NCi0JZm9yIChkcml2ZSA9IDA7IGRyaXZlIDwgMzI7IGRyaXZlKyspIHsNCi0JCWlmIChsb2dEcml2ZXMgJiAoMSA8PCBkcml2ZSkpIHsNCi0JCQlzcHJpbnRmKGRyaXZlTmFtZSwgIiVjOlxcIiwgZHJpdmUgKyAnQScpOw0KLQkJCXN0ciA9IGpuaWVudiAtPiBOZXdTdHJpbmdVVEYoZHJpdmVOYW1lKTsNCi0JCQlqbmllbnYgLT4gU2V0T2JqZWN0QXJyYXlFbGVtZW50KHJldHVybkFycmF5LCBpbmRleCwgc3RyKTsNCi0JCQlpbmRleCsrOw0KLQkJfQ0KLQl9DQotDQotCXJldHVybiByZXR1cm5BcnJheTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy91cGRhdGUuaCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9zcmMvdXBkYXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzY2E3ZTAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy91cGRhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qIERPIE5PVCBFRElUIFRISVMgRklMRSAtIGl0IGlzIG1hY2hpbmUgZ2VuZXJhdGVkICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotoCoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8am5pLmg+DQotLyogSGVhZGVyIGZvciBjbGFzcyBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8gKi8KLQotI2lmbmRlZiBfSW5jbHVkZWRfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvCi0jZGVmaW5lIF9JbmNsdWRlZF9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmDQotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19TSVpFX1VOS05PV04KLSNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1NJWkVfVU5LTk9XTiAtMUwNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9VTktOT1dOCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfVU5LTk9XTiAtMUwNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9JTlZBTElEX1BBVEgKLSNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9JTlZBTElEX1BBVEggLTJMDQotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkVNT1ZBQkxFCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkVNT1ZBQkxFIDFMDQotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfRklYRUQKLSNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9GSVhFRCAyTA0KLSN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1JFTU9URQotI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1JFTU9URSAzTAotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfQ0RST00KLSNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9DRFJPTSA0TAotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkFNRElTSwotI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1JBTURJU0sgNUwKLSN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0ZMT1BQWV81Ci0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfRkxPUFBZXzUgNkwKLSN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0ZMT1BQWV8zCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfRkxPUFBZXzMgN0wNCi0vKiBJbmFjY2Vzc2libGUgc3RhdGljOiBsaXN0ZW5lcnMgKi8NCi0vKiBJbmFjY2Vzc2libGUgc3RhdGljOiBoYXNOYXRpdmVzICovDQotLyoNCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSAqIE1ldGhvZDogICAgbmF0aXZlR2V0RnJlZVNwYWNlDQotICogU2lnbmF0dXJlOiAoTGphdmEvaW8vRmlsZTspSg0KLSAqLw0KLUpOSUVYUE9SVCBqbG9uZyBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX25hdGl2ZUdldEZyZWVTcGFjZQ0KLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpvYmplY3QpOwotDQotLyoNCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSAqIE1ldGhvZDogICAgbmF0aXZlR2V0TGFiZWwNCi0gKiBTaWduYXR1cmU6IChMamF2YS9pby9GaWxlOylMamF2YS9sYW5nL1N0cmluZzsNCi0gKi8NCi1KTklFWFBPUlQganN0cmluZyBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX25hdGl2ZUdldExhYmVsDQotICAoSk5JRW52ICosIGpjbGFzcywgam9iamVjdCk7Ci0NCi0vKg0KLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQotICogTWV0aG9kOiAgICBuYXRpdmVHZXRUeXBlDQotICogU2lnbmF0dXJlOiAoTGphdmEvaW8vRmlsZTspSQ0KLSAqLw0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlR2V0VHlwZQ0KLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpvYmplY3QpOwotDQotLyoNCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSAqIE1ldGhvZDogICAgbmF0aXZlTGlzdE1vdW50UG9pbnRzDQotICogU2lnbmF0dXJlOiAoKVtMamF2YS9sYW5nL1N0cmluZzsNCi0gKi8NCi1KTklFWFBPUlQgam9iamVjdEFycmF5IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlTGlzdE1vdW50UG9pbnRzDQotICAoSk5JRW52ICosIGpjbGFzcyk7Ci0NCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLQotI2VuZGlmDQotI2VuZGlmDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLy5jbGFzc3BhdGggYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU0YTA5NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iamFycHJvY2Vzc29yIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS8uY3ZzaWdub3JlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvLm9wdGlvbnMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZjYxOTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zz10cnVlDQotb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvd2FybmluZz1mYWxzZQ0KLW9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3BhcnNpbmc9ZmFsc2UNCi1vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9pbnN0YWxsPWZhbHNlDQotb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvY29uZmlndXJhdGlvbj1mYWxzZQ0KLW9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3R5cGU9ZmFsc2UNCi1vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy93ZWI9ZmFsc2UNCi1vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9pbnN0YWxsaGFuZGxlcj1mYWxzZQ0KLW9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3JlY29uY2lsZXI9ZmFsc2UNCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNThmZDQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS51cGRhdGUuY29yZTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNkNmU4Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotI1dlZCBGZWIgMTEgMTI6MDY6MTAgRVNUIDIwMDkKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uY29tcGFyaW5nSWRlbnRpY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVhZENvZGU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3M9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdIYXNoQ29kZU1ldGhvZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTeW5jaHJvbml6ZWRPbkluaGVyaXRlZE1ldGhvZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uRXhlbXB0RXhjZXB0aW9uQW5kVGhyb3dhYmxlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2Fib3V0Lmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzM1ZDA3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLXNvdXJjZS4uID0gc3JjLyxcDQotICAgICAgICAgICBqYXJwcm9jZXNzb3IvDQotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcDQotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXA0KLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwNCi0gICAgICAgICAgICAgICBNRVRBLUlORi8NCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sLFwNCi0gICAgICAgICAgICAgICBzY2hlbWEvDQotb3V0cHV0Li4gPSBiaW4vDQotY3VzdG9tQnVpbGRDYWxsYmFja3M9Y3VzdG9tQnVpbGRDYWxsYmFja3MueG1sDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNjQ1NmYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2N1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9Db21tYW5kU3RlcC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2phcnByb2Nlc3Nvci9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvamFycHJvY2Vzc29yL0NvbW1hbmRTdGVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YzE3ZDMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2phcnByb2Nlc3Nvci9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvamFycHJvY2Vzc29yL0NvbW1hbmRTdGVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5qYXJwcm9jZXNzb3I7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLS8qKgotICogQGF1dGhvciBhbmllZmVyQGNhLmlibS5jb20KLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21tYW5kU3RlcCBpbXBsZW1lbnRzIElQcm9jZXNzU3RlcCB7Ci0JcHJvdGVjdGVkIFN0cmluZyBjb21tYW5kID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGV4dGVuc2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSAgUHJvcGVydGllcyBvcHRpb25zID0gbnVsbDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0JCi0JcHVibGljIENvbW1hbmRTdGVwKFByb3BlcnRpZXMgb3B0aW9ucywgU3RyaW5nIGNvbW1hbmQsIFN0cmluZyBleHRlbnNpb24sIGJvb2xlYW4gdmVyYm9zZSkgewotCQl0aGlzLmNvbW1hbmQgPSBjb21tYW5kOwotCQl0aGlzLmV4dGVuc2lvbiA9IGV4dGVuc2lvbjsKLQkJdGhpcy5vcHRpb25zID0gb3B0aW9uczsKLQkJdGhpcy52ZXJib3NlID0gdmVyYm9zZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBleGVjdXRlKFN0cmluZ1tdIGNtZCkgewotCQlyZXR1cm4gZXhlY3V0ZShjbWQsIGZhbHNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgZXhlY3V0ZShTdHJpbmdbXSBjbWQsIGJvb2xlYW4gdmVyYm9zZSkgewotCQlSdW50aW1lIHJ1bnRpbWUgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsKLQkJUHJvY2VzcyBwcm9jID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXByb2MgPSBydW50aW1lLmV4ZWMoY21kKTsKLQkJCVN0cmVhbVByb2Nlc3NvciBlcnJvclN0cmVhbVByb2Nlc3NvciA9IG5ldyBTdHJlYW1Qcm9jZXNzb3IocHJvYy5nZXRFcnJvclN0cmVhbSgpLCBTdHJlYW1Qcm9jZXNzb3IuU1RERVJSLCB2ZXJib3NlKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyZWFtUHJvY2Vzc29yIG91dHB1dFN0cmVhbVByb2Nlc3NvciA9IG5ldyBTdHJlYW1Qcm9jZXNzb3IocHJvYy5nZXRJbnB1dFN0cmVhbSgpLCBTdHJlYW1Qcm9jZXNzb3IuU1RET1VULCB2ZXJib3NlKTsgLy8kTk9OLU5MUy0xJAotCQkJZXJyb3JTdHJlYW1Qcm9jZXNzb3Iuc3RhcnQoKTsKLQkJCW91dHB1dFN0cmVhbVByb2Nlc3Nvci5zdGFydCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYodmVyYm9zZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgZXhlY3V0aW5nIGNvbW1hbmQgIiArIFV0aWxzLmNvbmNhdChjbWQpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJdHJ5IHsKLQkJCWludCByZXN1bHQgPSBwcm9jLndhaXRGb3IoKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWlmKHZlcmJvc2UpCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCQotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldE9wdGlvbnMoKSB7Ci0JCWlmKG9wdGlvbnMgPT0gbnVsbCkKLQkJCW9wdGlvbnMgPSBuZXcgUHJvcGVydGllcygpOwotCQlyZXR1cm4gb3B0aW9uczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRqdXN0SW5mKEZpbGUgaW5wdXQsIFByb3BlcnRpZXMgaW5mLCBMaXN0IGNvbnRhaW5lcnMpIHsKLQkJLy9ub3RoaW5nCi0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2phcnByb2Nlc3Nvci9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvamFycHJvY2Vzc29yL0lQcm9jZXNzU3RlcC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2phcnByb2Nlc3Nvci9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvamFycHJvY2Vzc29yL0lQcm9jZXNzU3RlcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGM0MzhlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9JUHJvY2Vzc1N0ZXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmphcnByb2Nlc3NvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotLyoqCi0gKiBAYXV0aG9yIGFuaWVmZXJAY2EuaWJtLmNvbQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJvY2Vzc1N0ZXAgewotCQotCS8qKgotCSAqIFRoZSBlZmZlY3Qgb2YgdGhpcyBwcm9jZXNzaW5nIHN0ZXAgaWYgdGhlIEphclByb2Nlc3NvciB3YXMgdG8gcmVjdXJzZSBvbiB0aGlzIGVudHJ5LgotCSAqIFJldHVybiBudWxsIGlmIHRoaXMgc3RlcCB3aWxsIG5vdCBkbyBhbnl0aGluZyB3aXRoIHRoaXMgZW50cnkuCi0JICogUmV0dXJuIHRoZSBuZXcgZW50cnlOYW1lIGlmIHRoaXMgc3RlcCB3aWxsIG1vZGlmeSB0aGlzIGVudHJ5IG9uIHJlY3Vyc2lvbi4KLQkgKiBAcGFyYW0gZW50cnlOYW1lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgcmVjdXJzaW9uRWZmZWN0KFN0cmluZyBlbnRyeU5hbWUpOwotCQotCS8qKgotCSAqIFBlcmZvcm0gc29tZSBwcm9jZXNzaW5nIG9uIHRoZSBpbnB1dCBmaWxlIGJlZm9yZSB0aGUgSmFyUHJvY2Vzc29yIGNvbnNpZGVycyB0aGUgZW50cmllcyBmb3IgcmVjdXJzaW9uLgotCSAqICByZXR1cm4gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIHRoZSBwcm9jZXNzaW5nCi0JICogQHBhcmFtIGlucHV0Ci0JICogQHBhcmFtIHdvcmtpbmdEaXJlY3RvcnkKLQkgKiBAcGFyYW0gY29udGFpbmVyczogaW5mIHByb3BlcnRpZXMgZm9yIGNvbnRhaW5pbmcgamFycywgaW5uZXJtb3N0IGphciBpcyBmaXJzdCBvbiB0aGUgbGlzdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRmlsZSBwcmVQcm9jZXNzKEZpbGUgaW5wdXQsIEZpbGUgd29ya2luZ0RpcmVjdG9yeSwgTGlzdCBjb250YWluZXJzKTsKLQkKLQkvKioKLQkgKiBQZXJmb3JtIHNvbWUgcHJvY2Vzc2luZyBvbiB0aGUgaW5wdXQgZmlsZSBhZnRlciB0aGUgSmFyUHJvY2Vzc29yIHJldHVybnMgZnJvbSByZWN1cnNpb24KLQkgKiByZXR1cm4gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIHRoZSBwcm9jZXNzaW5nCi0JICogQHBhcmFtIGlucHV0Ci0JICogQHBhcmFtIHdvcmtpbmdEaXJlY3RvcnkKLQkgKiBAcGFyYW0gY29udGFpbmVyczogaW5mIHByb3BlcnRpZXMgZm9yIGNvbnRhaW5pbmcgamFycywgaW5uZXJtb3N0IGphciBpcyBmaXJzdCBvbiB0aGUgbGlzdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRmlsZSBwb3N0UHJvY2VzcyhGaWxlIGlucHV0LCBGaWxlIHdvcmtpbmdEaXJlY3RvcnksIExpc3QgY29udGFpbmVycyk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgcHJvY2VzcyBzdGVwCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RlcE5hbWUoKTsKLQotCS8qKgotCSAqIEFkanVzdCBhbnkgcHJvcGVydGllcyBpbiB0aGUgZWNsaXBzZS5pbmYgYXMgYXBwcm9wcmlhdGUgZm9yIHRoaXMgc3RlcAotCSAqIEBwYXJhbSBpbnB1dAotCSAqIEBwYXJhbSBpbmYKLQkgKiBAcGFyYW0gY29udGFpbmVyczogaW5mIHByb3BlcnRpZXMgZm9yIGNvbnRhaW5pbmcgamFycywgaW5uZXJtb3N0IGphciBpcyBmaXJzdCBvbiB0aGUgbGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIGFkanVzdEluZihGaWxlIGlucHV0LCBQcm9wZXJ0aWVzIGluZiwgTGlzdCBjb250YWluZXJzKTsKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9KYXJQcm9jZXNzb3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9KYXJQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVmMzcwNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvSmFyUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuamFycHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5qYXIuKjsKLQotLyoqCi0gKiBAYXV0aG9yIGFuaWVmZXJAY2EuaWJtLmNvbQotICoKLSAqLwotcHVibGljIGNsYXNzIEphclByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBMaXN0IHN0ZXBzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgU3RyaW5nIHdvcmtpbmdEaXJlY3RvcnkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgaW50IGRlcHRoID0gLTE7Ci0JcHJpdmF0ZSBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc0FsbCA9IGZhbHNlOwotCXByaXZhdGUgTGlua2VkTGlzdCBjb250YWluaW5nSW5mcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0KLQlzdGF0aWMgcHVibGljIEphclByb2Nlc3NvciBnZXRVbnBhY2tQcm9jZXNzb3IoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCWlmICghY2FuUGVyZm9ybVVucGFjaygpKQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCUphclByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSmFyUHJvY2Vzc29yKCk7Ci0JCXByb2Nlc3Nvci5hZGRQcm9jZXNzU3RlcChuZXcgVW5wYWNrU3RlcChwcm9wZXJ0aWVzKSk7Ci0JCXJldHVybiBwcm9jZXNzb3I7Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyBKYXJQcm9jZXNzb3IgZ2V0UGFja1Byb2Nlc3NvcihQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJaWYgKCFjYW5QZXJmb3JtUGFjaygpKQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCUphclByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSmFyUHJvY2Vzc29yKCk7Ci0JCXByb2Nlc3Nvci5hZGRQcm9jZXNzU3RlcChuZXcgUGFja1N0ZXAocHJvcGVydGllcykpOwotCQlyZXR1cm4gcHJvY2Vzc29yOwotCX0KLQotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBjYW5QZXJmb3JtUGFjaygpIHsKLQkJcmV0dXJuIFBhY2tTdGVwLmNhblBhY2soKTsKLQl9Ci0KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gY2FuUGVyZm9ybVVucGFjaygpIHsKLQkJcmV0dXJuIFVucGFja1N0ZXAuY2FuVW5wYWNrKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXb3JraW5nRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gd29ya2luZ0RpcmVjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXb3JraW5nRGlyZWN0b3J5KFN0cmluZyBkaXIpIHsKLQkJaWYoZGlyICE9IG51bGwpCi0JCQl3b3JraW5nRGlyZWN0b3J5ID0gZGlyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gdmVyYm9zZSkgewotCQl0aGlzLnZlcmJvc2UgPSB2ZXJib3NlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzQWxsKGJvb2xlYW4gYWxsKXsKLQkJdGhpcy5wcm9jZXNzQWxsID0gYWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFByb2Nlc3NTdGVwKElQcm9jZXNzU3RlcCBzdGVwKSB7Ci0JCXN0ZXBzLmFkZChzdGVwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhclByb2Nlc3NTdGVwcygpIHsKLQkJc3RlcHMuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWNyZWF0ZSBhIGphciBmaWxlLiAgVGhlIHJlcGxhY2VtZW50cyBtYXAgc3BlY2lmaWVzIGVudHJ5IG5hbWVzIHRvIGJlIHJlcGxhY2VkLCB0aGUgcmVwbGFjZW1lbnRzIGFyZQotCSAqIGV4cGVjdGVkIHRvIGJlIGZvdW5kIGluIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gamFyIC0gVGhlIGlucHV0IGphcgotCSAqIEBwYXJhbSBvdXRwdXRKYXIgLSB0aGUgb3V0cHV0Ci0JICogQHBhcmFtIHJlcGxhY2VtZW50cyAtIG1hcCBvZiBlbnRyeU5hbWUgLT4gbmV3IGVudHJ5TmFtZQotCSAqIEBwYXJhbSBkaXJlY3RvcnkgLSBsb2NhdGlvbiB0byBmaW5kIGZpbGUgZm9yIG5ldyBlbnRyeU5hbWUKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlY3JlYXRlSmFyKEphckZpbGUgamFyLCBKYXJPdXRwdXRTdHJlYW0gb3V0cHV0SmFyLCBNYXAgcmVwbGFjZW1lbnRzLCBGaWxlIGRpcmVjdG9yeSwgUHJvcGVydGllcyBpbmYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJYm9vbGVhbiBtYXJrZWQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUVudW1lcmF0aW9uIGVudHJpZXMgPSBqYXIuZW50cmllcygpOwotCQkJZm9yIChKYXJFbnRyeSBlbnRyeSA9IChKYXJFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpOyBlbnRyeSAhPSBudWxsOyBlbnRyeSA9IGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkgPyAoSmFyRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKSA6IG51bGwpIHsKLQkJCQlGaWxlIHJlcGxhY2VtZW50ID0gbnVsbDsKLQkJCQlKYXJFbnRyeSBuZXdFbnRyeSA9IG51bGw7Ci0JCQkJaWYgKHJlcGxhY2VtZW50cy5jb250YWluc0tleShlbnRyeS5nZXROYW1lKCkpKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgcmVwbGFjZW1lbnRzLmdldChlbnRyeS5nZXROYW1lKCkpOwotCQkJCQlyZXBsYWNlbWVudCA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgbmFtZSk7Ci0JCQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQkJCWlmIChyZXBsYWNlbWVudC5leGlzdHMoKSkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShyZXBsYWNlbWVudCkpOwotCQkJCQkJCQluZXdFbnRyeSA9IG5ldyBKYXJFbnRyeShuYW1lKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlpZiAodmVyYm9zZSkgewotCQkJCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZzogUHJvYmxlbSByZWFkaW5nICIgK3JlcGxhY2VtZW50LmdldFBhdGgoKSArICIsIHVzaW5nICIgKyBqYXIuZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3IgKyBlbnRyeS5nZXROYW1lKCkgICsgIiBpbnN0ZWFkLiIpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmICh2ZXJib3NlKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJXYXJuaW5nOiAiICsgcmVwbGFjZW1lbnQuZ2V0UGF0aCgpICsgIiBub3QgZm91bmQsIHVzaW5nICIgKyBqYXIuZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3IgKyBlbnRyeS5nZXROYW1lKCkgKyAiIGluc3RlYWQuIik7CQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChuZXdFbnRyeSA9PSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGphci5nZXRJbnB1dFN0cmVhbShlbnRyeSkpOwotCQkJCQkJbmV3RW50cnkgPSBuZXcgSmFyRW50cnkoZW50cnkuZ2V0TmFtZSgpKTsKLQkJCQkJfSBjYXRjaCggRXhjZXB0aW9uIGUgKSB7Ci0JCQkJCQlpZih2ZXJib3NlKSB7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVSUk9SOiBwcm9ibGVtIHJlYWRpbmcgIiArIGVudHJ5LmdldE5hbWUoKSArICIgZnJvbSAiICsgamFyLmdldE5hbWUoKSk7Ci0JCQkJCQl9Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQluZXdFbnRyeS5zZXRUaW1lKGVudHJ5LmdldFRpbWUoKSk7Ci0JCQkJb3V0cHV0SmFyLnB1dE5leHRFbnRyeShuZXdFbnRyeSk7Ci0JCQkJaWYgKGVudHJ5LmdldE5hbWUoKS5lcXVhbHMoVXRpbHMuTUFSS19GSUxFX05BTUUpKSB7Ci0JCQkJCS8vVGhlIGVjbGlwc2UuaW5mIGZpbGUgd2FzIHJlYWQgaW4gZWFybGllciwgZG9uJ3QgbmVlZCB0byByZXJlYWQgaXQsIGp1c3Qgd3JpdGUgaXQgb3V0IG5vdwotCQkJCQlVdGlscy5zdG9yZVByb3BlcnRpZXMoaW5mLCBvdXRwdXRKYXIpOwotCQkJCQltYXJrZWQgPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVV0aWxzLnRyYW5zZmVyU3RyZWFtcyhpbiwgb3V0cHV0SmFyLCBmYWxzZSk7Ci0JCQkJfQotCQkJCW91dHB1dEphci5jbG9zZUVudHJ5KCk7Ci0JCQkJaW4uY2xvc2UoKTsKLQotCQkJCS8vZGVsZXRlIHRoZSBuZXN0ZWQgamFyIGZpbGUKLQkJCQlpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgewotCQkJCQlyZXBsYWNlbWVudC5kZWxldGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIW1hcmtlZCkgewotCQkJCUphckVudHJ5IGVudHJ5ID0gbmV3IEphckVudHJ5KFV0aWxzLk1BUktfRklMRV9OQU1FKTsKLQkJCQlvdXRwdXRKYXIucHV0TmV4dEVudHJ5KGVudHJ5KTsKLQkJCQlVdGlscy5zdG9yZVByb3BlcnRpZXMoaW5mLCBvdXRwdXRKYXIpOwotCQkJCW91dHB1dEphci5jbG9zZUVudHJ5KCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlVdGlscy5jbG9zZShvdXRwdXRKYXIpOwotCQkJVXRpbHMuY2xvc2UoamFyKTsKLQkJCVV0aWxzLmNsb3NlKGluKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIHJlY3Vyc2lvbkVmZmVjdChTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdGVwcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlQcm9jZXNzU3RlcCBzdGVwID0gKElQcm9jZXNzU3RlcCkgaXRlci5uZXh0KCk7Ci0KLQkJCXJlc3VsdCA9IHN0ZXAucmVjdXJzaW9uRWZmZWN0KGVudHJ5TmFtZSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJZW50cnlOYW1lID0gcmVzdWx0OwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4dHJhY3RFbnRyaWVzKEphckZpbGUgamFyLCBGaWxlIHRlbXBEaXIsIE1hcCBkYXRhLCBQcm9wZXJ0aWVzIGluZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYoaW5mICE9IG51bGwgKSB7Ci0JCQkvL3NraXAgaWYgZXhjbHVkaW5nIGNoaWxkcmVuCi0JCQlpZihpbmYuY29udGFpbnNLZXkoVXRpbHMuTUFSS19FWENMVURFX0NISUxEUkVOKSl7Ci0JCQkJU3RyaW5nIGV4Y2x1ZGVDaGlsZHJlbiA9IGluZi5nZXRQcm9wZXJ0eShVdGlscy5NQVJLX0VYQ0xVREVfQ0hJTERSRU4pOwotCQkJCWlmKCBCb29sZWFuLnZhbHVlT2YoZXhjbHVkZUNoaWxkcmVuKS5ib29sZWFuVmFsdWUoKSApCi0JCQkJCWlmKHZlcmJvc2UpewotCQkJCQkJZm9yKGludCBpID0gMDsgaSA8PSBkZXB0aDsgaSsrKQotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoIiAgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2hpbGRyZW4gb2YgIiArIGphci5nZXROYW1lKCkgKyAiYXJlIGV4Y2x1ZGVkIGZyb20gcHJvY2Vzc2luZy4iKTsKLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JCUVudW1lcmF0aW9uIGVudHJpZXMgPSBqYXIuZW50cmllcygpOwotCQlpZiAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJZm9yIChKYXJFbnRyeSBlbnRyeSA9IChKYXJFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpOyBlbnRyeSAhPSBudWxsOyBlbnRyeSA9IGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkgPyAoSmFyRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKSA6IG51bGwpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKLQkJCQlTdHJpbmcgbmV3TmFtZSA9IHJlY3Vyc2lvbkVmZmVjdChuYW1lKTsKLQkJCQlpZiAobmV3TmFtZSAhPSBudWxsKSB7Ci0JCQkJCWlmKHZlcmJvc2UpewotCQkJCQkJZm9yKGludCBpID0gMDsgaSA8PSBkZXB0aDsgaSsrKQotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoIiAgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvY2Vzc2luZyBuZXN0ZWQgZmlsZTogIiArIG5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJLy9leHRyYWN0IGVudHJ5IHRvIHRlbXAgZGlyZWN0b3J5Ci0JCQkJCUZpbGUgZXh0cmFjdGVkID0gbmV3IEZpbGUodGVtcERpciwgbmFtZSk7Ci0JCQkJCUZpbGUgcGFyZW50RGlyID0gZXh0cmFjdGVkLmdldFBhcmVudEZpbGUoKTsKLQkJCQkJaWYgKCFwYXJlbnREaXIuZXhpc3RzKCkpCi0JCQkJCQlwYXJlbnREaXIubWtkaXJzKCk7Ci0KLQkJCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQkJCQlPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWluID0gamFyLmdldElucHV0U3RyZWFtKGVudHJ5KTsKLQkJCQkJCW91dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShleHRyYWN0ZWQpKTsKLQkJCQkJCVV0aWxzLnRyYW5zZmVyU3RyZWFtcyhpbiwgb3V0LCB0cnVlKTsgLy90aGlzIHdpbGwgY2xvc2UgYm90aCBzdHJlYW1zCi0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlVdGlscy5jbG9zZShpbik7Ci0JCQkJCQlVdGlscy5jbG9zZShvdXQpOwotCQkJCQl9Ci0JCQkJCWV4dHJhY3RlZC5zZXRMYXN0TW9kaWZpZWQoZW50cnkuZ2V0VGltZSgpKTsKLQotCQkJCQkvL3JlY3Vyc2UKLQkJCQkJY29udGFpbmluZ0luZnMuYWRkRmlyc3QoaW5mKTsKLQkJCQkJU3RyaW5nIGRpciA9IGdldFdvcmtpbmdEaXJlY3RvcnkoKTsKLQkJCQkJc2V0V29ya2luZ0RpcmVjdG9yeShwYXJlbnREaXIuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQkJCQkJRmlsZSByZXN1bHQgPSBwcm9jZXNzSmFyKGV4dHJhY3RlZCk7Ci0KLQkJCQkJbmV3TmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSBleHRyYWN0ZWQuZ2V0TmFtZSgpLmxlbmd0aCgpKSArIHJlc3VsdC5nZXROYW1lKCk7Ci0JCQkJCWRhdGEucHV0KG5hbWUsIG5ld05hbWUpOwotCi0JCQkJCXNldFdvcmtpbmdEaXJlY3RvcnkoZGlyKTsKLQkJCQkJY29udGFpbmluZ0luZnMucmVtb3ZlRmlyc3QoKTsKLQotCQkJCQkvL2RlbGV0ZSB0aGUgZXh0cmFjdGVkIGl0ZW0gbGVhdmluZyB0aGUgcmVjdXJzaW9uIHJlc3VsdAotCQkJCQlpZiAoIW5hbWUuZXF1YWxzKG5ld05hbWUpKQotCQkJCQkJZXh0cmFjdGVkLmRlbGV0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgRmlsZSBwcmVQcm9jZXNzKEZpbGUgaW5wdXQsIEZpbGUgdGVtcERpcikgewotCQlGaWxlIHJlc3VsdCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHN0ZXBzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSVByb2Nlc3NTdGVwIHN0ZXAgPSAoSVByb2Nlc3NTdGVwKSBpdGVyLm5leHQoKTsKLQkJCXJlc3VsdCA9IHN0ZXAucHJlUHJvY2VzcyhpbnB1dCwgdGVtcERpciwgY29udGFpbmluZ0luZnMpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCWlucHV0ID0gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBpbnB1dDsKLQl9Ci0KLQlwcml2YXRlIEZpbGUgcG9zdFByb2Nlc3MoRmlsZSBpbnB1dCwgRmlsZSB0ZW1wRGlyKSB7Ci0JCUZpbGUgcmVzdWx0ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3RlcHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJUHJvY2Vzc1N0ZXAgc3RlcCA9IChJUHJvY2Vzc1N0ZXApIGl0ZXIubmV4dCgpOwotCQkJcmVzdWx0ID0gc3RlcC5wb3N0UHJvY2VzcyhpbnB1dCwgdGVtcERpciwgY29udGFpbmluZ0luZnMpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCWlucHV0ID0gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBpbnB1dDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRqdXN0SW5mKEZpbGUgaW5wdXQsIFByb3BlcnRpZXMgaW5mKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHN0ZXBzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSVByb2Nlc3NTdGVwIHN0ZXAgPSAoSVByb2Nlc3NTdGVwKSBpdGVyLm5leHQoKTsKLQkJCXN0ZXAuYWRqdXN0SW5mKGlucHV0LCBpbmYsIGNvbnRhaW5pbmdJbmZzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBGaWxlIHByb2Nlc3NKYXIoRmlsZSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJKytkZXB0aDsKLQkJbG9uZyBsYXN0TW9kaWZpZWQgPSBpbnB1dC5sYXN0TW9kaWZpZWQoKTsKLQkJRmlsZSB3b3JraW5nRGlyID0gbmV3IEZpbGUoZ2V0V29ya2luZ0RpcmVjdG9yeSgpKTsKLQkJaWYgKCF3b3JraW5nRGlyLmV4aXN0cygpKQotCQkJd29ya2luZ0Rpci5ta2RpcnMoKTsKLQotCQlib29sZWFuIHNraXAgPSBVdGlscy5zaG91bGRTa2lwSmFyKGlucHV0LCBwcm9jZXNzQWxsLCB2ZXJib3NlKTsKLQkJaWYgKGRlcHRoID09IDAgJiYgdmVyYm9zZSkgewotCQkJaWYgKHNraXApCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTa2lwcGluZyAiICsgaW5wdXQuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludCgiUnVubmluZyAiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdGVwcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJSVByb2Nlc3NTdGVwIHN0ZXAgPSAoSVByb2Nlc3NTdGVwKSBpdGVyLm5leHQoKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludChzdGVwLmdldFN0ZXBOYW1lKCkgKyAiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigib24gIiArIGlucHV0LmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCWlmIChza2lwKSB7Ci0JCQkvL1RoaXMgamFyIHdhcyBub3QgbWFya2VkIGFzIGNvbmRpdGlvbmVkLCBhbmQgd2UgYXJlIG9ubHkgcHJvY2Vzc2luZyBjb25kaXRpb25lZCBqYXJzLCBzbyBkbyBub3RoaW5nCi0JCQktLWRlcHRoOwotCQkJcmV0dXJuIGlucHV0OwotCQl9Ci0KLQkJLy9wcmUKLQkJRmlsZSB3b3JraW5nRmlsZSA9IHByZVByb2Nlc3MoaW5wdXQsIHdvcmtpbmdEaXIpOwotCi0JCS8vRXh0cmFjdCBlbnRyaWVzIGZyb20gamFyIGFuZCByZWN1cnNlIG9uIHRoZW0KLQkJRmlsZSB0ZW1wRGlyID0gbnVsbDsKLQkJaWYgKGRlcHRoID09IDApIHsKLQkJCXRlbXBEaXIgPSBuZXcgRmlsZSh3b3JraW5nRGlyLCAidGVtcC4iICsgd29ya2luZ0ZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJRmlsZSBwYXJlbnQgPSB3b3JraW5nRGlyLmdldFBhcmVudEZpbGUoKTsKLQkJCXRlbXBEaXIgPSBuZXcgRmlsZShwYXJlbnQsICJ0ZW1wXyIgKyBkZXB0aCArICdfJyArIHdvcmtpbmdGaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUphckZpbGUgamFyID0gbmV3IEphckZpbGUod29ya2luZ0ZpbGUsIGZhbHNlKTsKLQkJTWFwIHJlcGxhY2VtZW50cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCVByb3BlcnRpZXMgaW5mID0gVXRpbHMuZ2V0RWNsaXBzZUluZih3b3JraW5nRmlsZSwgdmVyYm9zZSk7Ci0JCWV4dHJhY3RFbnRyaWVzKGphciwgdGVtcERpciwgcmVwbGFjZW1lbnRzLCBpbmYpOwotCi0JCWlmIChpbmYgIT0gbnVsbCkKLQkJCWFkanVzdEluZih3b3JraW5nRmlsZSwgaW5mKTsKLQotCQkvL1JlY3JlYXRlIHRoZSBqYXIgd2l0aCByZXBsYWNlbWVudHMuIAotCQkvL1RPRE86IFRoaXMgaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSBpZiB3ZSBkaWRuJ3QgY2hhbmdlIHRoZSBpbmYgZmlsZSBhbmQgZGlkbid0IGNoYW5nZSBhbnkgY29udGVudAotCQlGaWxlIHRlbXBKYXIgPSBudWxsOwotCQl0ZW1wSmFyID0gbmV3IEZpbGUodGVtcERpciwgd29ya2luZ0ZpbGUuZ2V0TmFtZSgpKTsKLQkJRmlsZSBwYXJlbnQgPSB0ZW1wSmFyLmdldFBhcmVudEZpbGUoKTsKLQkJaWYgKCFwYXJlbnQuZXhpc3RzKCkpCi0JCQlwYXJlbnQubWtkaXJzKCk7Ci0JCUphck91dHB1dFN0cmVhbSBqYXJPdXQgPSBuZXcgSmFyT3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wSmFyKSkpOwotCQlyZWNyZWF0ZUphcihqYXIsIGphck91dCwgcmVwbGFjZW1lbnRzLCB0ZW1wRGlyLCBpbmYpOwotCi0JCWphci5jbG9zZSgpOwotCQlpZiAodGVtcEphciAhPSBudWxsKSB7Ci0JCQlpZiAoIXdvcmtpbmdGaWxlLmVxdWFscyhpbnB1dCkpIHsKLQkJCQl3b3JraW5nRmlsZS5kZWxldGUoKTsKLQkJCX0KLQkJCXdvcmtpbmdGaWxlID0gdGVtcEphcjsKLQkJfQotCi0JCS8vcG9zdAotCQlGaWxlIHJlc3VsdCA9IHBvc3RQcm9jZXNzKHdvcmtpbmdGaWxlLCB3b3JraW5nRGlyKTsKLQkJCi0JCS8vaGF2ZSB0byBub3JtYWxpemUgYWZ0ZXIgdGhlIHBvc3Qgc3RlcHMKLQkJbm9ybWFsaXplKHJlc3VsdCwgd29ya2luZ0Rpcik7Ci0JCQotCQlpZiAoIXJlc3VsdC5lcXVhbHMod29ya2luZ0ZpbGUpICYmICF3b3JraW5nRmlsZS5lcXVhbHMoaW5wdXQpKQotCQkJd29ya2luZ0ZpbGUuZGVsZXRlKCk7Ci0JCWlmICghcmVzdWx0LmdldFBhcmVudEZpbGUoKS5lcXVhbHMod29ya2luZ0RpcikpIHsKLQkJCUZpbGUgZmluYWxGaWxlID0gbmV3IEZpbGUod29ya2luZ0RpciwgcmVzdWx0LmdldE5hbWUoKSk7Ci0JCQlpZiAoZmluYWxGaWxlLmV4aXN0cygpKQotCQkJCWZpbmFsRmlsZS5kZWxldGUoKTsKLQkJCXJlc3VsdC5yZW5hbWVUbyhmaW5hbEZpbGUpOwotCQkJcmVzdWx0ID0gZmluYWxGaWxlOwotCQl9Ci0KLQkJaWYgKHRlbXBEaXIuZXhpc3RzKCkpCi0JCQlVdGlscy5jbGVhcih0ZW1wRGlyKTsKLQotCQlyZXN1bHQuc2V0TGFzdE1vZGlmaWVkKGxhc3RNb2RpZmllZCk7Ci0JCS0tZGVwdGg7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBub3JtYWxpemUoRmlsZSBpbnB1dCwgRmlsZSB3b3JraW5nRGlyZWN0b3J5KSB7Ci0JCWlmKGlucHV0LmdldE5hbWUoKS5lbmRzV2l0aChVdGlscy5QQUNLRURfU1VGRklYKSkgewotCQkJLy9ub3QgYSBqYXIKLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJRmlsZSB0ZW1wSmFyID0gbmV3IEZpbGUod29ya2luZ0RpcmVjdG9yeSwgInRlbXBfIiArIGlucHV0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUphckZpbGUgamFyID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJamFyID0gbmV3IEphckZpbGUoaW5wdXQsIGZhbHNlKTsKLQkJCX0gY2F0Y2ggKEphckV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9ub3QgYSBqYXIKLQkJCQlyZXR1cm4gOwotCQkJfQotCQkJSmFyT3V0cHV0U3RyZWFtIGphck91dCA9IG5ldyBKYXJPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBKYXIpKSk7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCUVudW1lcmF0aW9uIGVudHJpZXMgPSBqYXIuZW50cmllcygpOwotCQkJCWZvciAoSmFyRW50cnkgZW50cnkgPSAoSmFyRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKTsgZW50cnkgIT0gbnVsbDsgZW50cnkgPSBlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpID8gKEphckVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCkgOiBudWxsKSB7Ci0JCQkJCUphckVudHJ5IG5ld0VudHJ5ID0gbmV3IEphckVudHJ5KGVudHJ5LmdldE5hbWUoKSk7Ci0JCQkJCW5ld0VudHJ5LnNldFRpbWUoZW50cnkuZ2V0VGltZSgpKTsKLQkJCQkJaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShqYXIuZ2V0SW5wdXRTdHJlYW0oZW50cnkpKTsKLQkJCQkJamFyT3V0LnB1dE5leHRFbnRyeShuZXdFbnRyeSk7Ci0JCQkJCVV0aWxzLnRyYW5zZmVyU3RyZWFtcyhpbiwgamFyT3V0LCBmYWxzZSk7Ci0JCQkJCWphck91dC5jbG9zZUVudHJ5KCk7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlVdGlscy5jbG9zZShqYXJPdXQpOwotCQkJCVV0aWxzLmNsb3NlKGphcik7Ci0JCQkJVXRpbHMuY2xvc2UoaW4pOwotCQkJfQotCQkJdGVtcEphci5zZXRMYXN0TW9kaWZpZWQoaW5wdXQubGFzdE1vZGlmaWVkKCkpOwotCQkJaW5wdXQuZGVsZXRlKCk7Ci0JCQl0ZW1wSmFyLnJlbmFtZVRvKGlucHV0KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJaWYgKHZlcmJvc2UpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIG5vcm1hbGl6aW5nIGphciAiICsgaW5wdXQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvSmFyUHJvY2Vzc29yRXhlY3V0b3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9KYXJQcm9jZXNzb3JFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjA3ODVkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9KYXJQcm9jZXNzb3JFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuamFycHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5qYXJwcm9jZXNzb3IuTWFpbi5PcHRpb25zOwotCi1wdWJsaWMgY2xhc3MgSmFyUHJvY2Vzc29yRXhlY3V0b3IgewotCXB1YmxpYyB2b2lkIHJ1bkphclByb2Nlc3NvcihPcHRpb25zIG9wdGlvbnMpIHsKLQkJaWYgKG9wdGlvbnMuaW5wdXQuaXNGaWxlKCkgJiYgb3B0aW9ucy5pbnB1dC5nZXROYW1lKCkuZW5kc1dpdGgoIi56aXAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlaaXBQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFppcFByb2Nlc3NvcigpOwotCQkJcHJvY2Vzc29yLnNldFdvcmtpbmdEaXJlY3Rvcnkob3B0aW9ucy5vdXRwdXREaXIpOwotCQkJcHJvY2Vzc29yLnNldFNpZ25Db21tYW5kKG9wdGlvbnMuc2lnbkNvbW1hbmQpOwotCQkJcHJvY2Vzc29yLnNldFBhY2sob3B0aW9ucy5wYWNrKTsKLQkJCXByb2Nlc3Nvci5zZXRSZXBhY2sob3B0aW9ucy5yZXBhY2sgfHwgKG9wdGlvbnMucGFjayAmJiBvcHRpb25zLnNpZ25Db21tYW5kICE9IG51bGwpKTsKLQkJCXByb2Nlc3Nvci5zZXRVbnBhY2sob3B0aW9ucy51bnBhY2spOwotCQkJcHJvY2Vzc29yLnNldFZlcmJvc2Uob3B0aW9ucy52ZXJib3NlKTsKLQkJCXByb2Nlc3Nvci5zZXRQcm9jZXNzQWxsKG9wdGlvbnMucHJvY2Vzc0FsbCk7Ci0JCQl0cnkgewotCQkJCXByb2Nlc3Nvci5wcm9jZXNzWmlwKG9wdGlvbnMuaW5wdXQpOwotCQkJfSBjYXRjaCAoWmlwRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAob3B0aW9ucy52ZXJib3NlKQotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWlmIChvcHRpb25zLnZlcmJvc2UpCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlKYXJQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IEphclByb2Nlc3NvcigpOwotCQkJSmFyUHJvY2Vzc29yIHBhY2tQcm9jZXNzb3IgPSBudWxsOwotCi0JCQlwcm9jZXNzb3Iuc2V0V29ya2luZ0RpcmVjdG9yeShvcHRpb25zLm91dHB1dERpcik7Ci0JCQlwcm9jZXNzb3Iuc2V0UHJvY2Vzc0FsbChvcHRpb25zLnByb2Nlc3NBbGwpOwotCQkJcHJvY2Vzc29yLnNldFZlcmJvc2Uob3B0aW9ucy52ZXJib3NlKTsKLQotCQkJLy9sb2FkIG9wdGlvbnMgZmlsZQotCQkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCWlmIChvcHRpb25zLmlucHV0LmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlGaWxlIHBhY2tQcm9wZXJ0aWVzID0gbmV3IEZpbGUob3B0aW9ucy5pbnB1dCwgInBhY2sucHJvcGVydGllcyIpOwotCQkJCWlmIChwYWNrUHJvcGVydGllcy5leGlzdHMoKSAmJiBwYWNrUHJvcGVydGllcy5pc0ZpbGUoKSkgewotCQkJCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0ocGFja1Byb3BlcnRpZXMpKTsKLQkJCQkJCXByb3BlcnRpZXMubG9hZChpbik7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWlmIChvcHRpb25zLnZlcmJvc2UpCi0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCVV0aWxzLmNsb3NlKGluKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG9wdGlvbnMudW5wYWNrKQotCQkJCWFkZFVucGFja1N0ZXAocHJvY2Vzc29yLCBwcm9wZXJ0aWVzLCBvcHRpb25zKTsKLQotCQkJaWYgKG9wdGlvbnMucmVwYWNrIHx8IChvcHRpb25zLnBhY2sgJiYgb3B0aW9ucy5zaWduQ29tbWFuZCAhPSBudWxsKSkKLQkJCQlhZGRQYWNrVW5wYWNrU3RlcChwcm9jZXNzb3IsIHByb3BlcnRpZXMsIG9wdGlvbnMpOwotCi0JCQlpZiAob3B0aW9ucy5zaWduQ29tbWFuZCAhPSBudWxsKQotCQkJCWFkZFNpZ25TdGVwKHByb2Nlc3NvciwgcHJvcGVydGllcywgb3B0aW9ucyk7Ci0KLQkJCWlmIChvcHRpb25zLnBhY2spIHsKLQkJCQlwYWNrUHJvY2Vzc29yID0gbmV3IEphclByb2Nlc3NvcigpOwotCQkJCXBhY2tQcm9jZXNzb3Iuc2V0V29ya2luZ0RpcmVjdG9yeShvcHRpb25zLm91dHB1dERpcik7Ci0JCQkJcGFja1Byb2Nlc3Nvci5zZXRQcm9jZXNzQWxsKG9wdGlvbnMucHJvY2Vzc0FsbCk7Ci0JCQkJcGFja1Byb2Nlc3Nvci5zZXRWZXJib3NlKG9wdGlvbnMudmVyYm9zZSk7Ci0JCQkJYWRkUGFja1N0ZXAocGFja1Byb2Nlc3NvciwgcHJvcGVydGllcywgb3B0aW9ucyk7Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJcHJvY2VzcyhvcHRpb25zLmlucHV0LCBvcHRpb25zLnVucGFjayA/IFV0aWxzLlBBQ0tfR1pfRklMVEVSIDogVXRpbHMuSkFSX0ZJTFRFUiwgb3B0aW9ucy52ZXJib3NlLCBwcm9jZXNzb3IsIHBhY2tQcm9jZXNzb3IpOwotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAob3B0aW9ucy52ZXJib3NlKQotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2VzcyhGaWxlIGlucHV0LCBGaWxlRmlsdGVyIGZpbHRlciwgYm9vbGVhbiB2ZXJib3NlLCBKYXJQcm9jZXNzb3IgcHJvY2Vzc29yLCBKYXJQcm9jZXNzb3IgcGFja1Byb2Nlc3NvcikgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmICghaW5wdXQuZXhpc3RzKCkpCi0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCk7Ci0KLQkJRmlsZVtdIGZpbGVzID0gbnVsbDsKLQkJaWYgKGlucHV0LmlzRGlyZWN0b3J5KCkpIHsKLQkJCWZpbGVzID0gaW5wdXQubGlzdEZpbGVzKCk7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyLmFjY2VwdChpbnB1dCkpIHsKLQkJCWZpbGVzID0gbmV3IEZpbGVbXSB7aW5wdXR9OwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJU3RyaW5nIGRpciA9IHByb2Nlc3Nvci5nZXRXb3JraW5nRGlyZWN0b3J5KCk7Ci0JCQkJcHJvY2Vzc29yLnNldFdvcmtpbmdEaXJlY3RvcnkoZGlyICsgIi8iICsgZmlsZXNbaV0uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYWNrUHJvY2Vzc29yICE9IG51bGwpCi0JCQkJCXBhY2tQcm9jZXNzb3Iuc2V0V29ya2luZ0RpcmVjdG9yeShkaXIgKyAiLyIgKyBmaWxlc1tpXS5nZXROYW1lKCkpOwotCQkJCXByb2Nlc3MoZmlsZXNbaV0sIGZpbHRlciwgdmVyYm9zZSwgcHJvY2Vzc29yLCBwYWNrUHJvY2Vzc29yKTsKLQkJCQlwcm9jZXNzb3Iuc2V0V29ya2luZ0RpcmVjdG9yeShkaXIpOwotCQkJCWlmIChwYWNrUHJvY2Vzc29yICE9IG51bGwpCi0JCQkJCXBhY2tQcm9jZXNzb3Iuc2V0V29ya2luZ0RpcmVjdG9yeShkaXIpOwotCQkJfSBlbHNlIGlmIChmaWx0ZXIuYWNjZXB0KGZpbGVzW2ldKSkgewotCQkJCXRyeSB7Ci0JCQkJCUZpbGUgcmVzdWx0ID0gcHJvY2Vzc29yLnByb2Nlc3NKYXIoZmlsZXNbaV0pOwotCQkJCQlpZiAocGFja1Byb2Nlc3NvciAhPSBudWxsICYmIHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5leGlzdHMoKSkgewotCQkJCQkJcGFja1Byb2Nlc3Nvci5wcm9jZXNzSmFyKHJlc3VsdCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmICh2ZXJib3NlKQotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWNrVW5wYWNrU3RlcChKYXJQcm9jZXNzb3IgcHJvY2Vzc29yLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIE9wdGlvbnMgb3B0aW9ucykgewotCQlwcm9jZXNzb3IuYWRkUHJvY2Vzc1N0ZXAobmV3IFBhY2tVbnBhY2tTdGVwKHByb3BlcnRpZXMsIG9wdGlvbnMudmVyYm9zZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFNpZ25TdGVwKEphclByb2Nlc3NvciBwcm9jZXNzb3IsIFByb3BlcnRpZXMgcHJvcGVydGllcywgT3B0aW9ucyBvcHRpb25zKSB7Ci0JCXByb2Nlc3Nvci5hZGRQcm9jZXNzU3RlcChuZXcgU2lnbkNvbW1hbmRTdGVwKHByb3BlcnRpZXMsIG9wdGlvbnMuc2lnbkNvbW1hbmQsIG9wdGlvbnMudmVyYm9zZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhY2tTdGVwKEphclByb2Nlc3NvciBwcm9jZXNzb3IsIFByb3BlcnRpZXMgcHJvcGVydGllcywgT3B0aW9ucyBvcHRpb25zKSB7Ci0JCXByb2Nlc3Nvci5hZGRQcm9jZXNzU3RlcChuZXcgUGFja1N0ZXAocHJvcGVydGllcywgb3B0aW9ucy52ZXJib3NlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkVW5wYWNrU3RlcChKYXJQcm9jZXNzb3IgcHJvY2Vzc29yLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIE9wdGlvbnMgb3B0aW9ucykgewotCQlwcm9jZXNzb3IuYWRkUHJvY2Vzc1N0ZXAobmV3IFVucGFja1N0ZXAocHJvcGVydGllcywgb3B0aW9ucy52ZXJib3NlKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2phcnByb2Nlc3Nvci9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvamFycHJvY2Vzc29yL01haW4uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9NYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZDhlMGEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2phcnByb2Nlc3Nvci9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvamFycHJvY2Vzc29yL01haW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmphcnByb2Nlc3NvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcHVibGljIGNsYXNzIE1haW4gewotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBPcHRpb25zIHsKLQkJcHVibGljIFN0cmluZyBvdXRwdXREaXIgPSAiLiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIFN0cmluZyBzaWduQ29tbWFuZCA9IG51bGw7Ci0JCXB1YmxpYyBib29sZWFuIHBhY2sgPSBmYWxzZTsKLQkJcHVibGljIGJvb2xlYW4gcmVwYWNrID0gZmFsc2U7Ci0JCXB1YmxpYyBib29sZWFuIHVucGFjayA9IGZhbHNlOwotCQlwdWJsaWMgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0JCXB1YmxpYyBib29sZWFuIHByb2Nlc3NBbGwgPSBmYWxzZTsKLQkJcHVibGljIEZpbGUgaW5wdXQgPSBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRVc2FnZSgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJbLW9wdGlvbiAuLi5dLi4uIGlucHV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHN1cHBvcnRlZDoiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi1wcm9jZXNzQWxsICAgICBwcm9jZXNzIGFsbCBqYXJzLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSB3ZXJlIHByZXZpb3VzbHkgbm9ybWFsaXplZCIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgb25seSBub3JtYWxpemVkIGphcnMgd2lsbCBiZSBwcm9jZXNzZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCItcmVwYWNrICAgICAgICAgbm9ybWFsaXplIGphcnMgIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCItc2lnbiA8Y29tbWFuZD4gc2lnbiBqYXJzIHVzaW5nIDxjb21tYW5kPiIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiLXBhY2sgICAgICAgICAgIHBhY2sgdGhlIGphcnMuICBwYWNrIGFuZCByZXBhY2sgYXJlIHJlZHVuZGFudCB1bmxlc3MiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAgICAgICAgICBzaWduIGlzIGFsc28gc3BlY2lmaWVkLiIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiLXVucGFjayAgICAgICAgIHVucGFjayBwYWNrLmd6IGZpbGVzLiBVbnBhY2sgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgICAgICAgICAgd2l0aCByZXBhY2ssIHNpZ24gYW5kIHBhY2suIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiLW91dHB1dERpciA8ZGlyPiAgdGhlIG91dHB1dCBkaXJlY3RvcnkiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi12ZXJib3NlICAgICAgICB2ZXJib3NlIG1vZGUgIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9wdGlvbnMgcHJvY2Vzc0FyZ3VtZW50cyhTdHJpbmdbXSBhcmdzKSB7Ci0JCWlmIChhcmdzLmxlbmd0aCA9PSAwKSB7Ci0JCQlwcmludFVzYWdlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7Ci0JCWludCBpID0gMDsKLQkJZm9yICg7IGkgPCBhcmdzLmxlbmd0aCAtIDE7IGkrKykgewotCQkJaWYgKGFyZ3NbaV0uZXF1YWxzKCItcGFjayIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCW9wdGlvbnMucGFjayA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItdW5wYWNrIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW9wdGlvbnMudW5wYWNrID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1zaWduIikgJiYgaSA8IGFyZ3MubGVuZ3RoIC0gMikgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGFyZ3NbaSArIDFdLnN0YXJ0c1dpdGgoIi0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXByaW50VXNhZ2UoKTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCW9wdGlvbnMuc2lnbkNvbW1hbmQgPSBhcmdzWysraV07Ci0JCQl9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItcmVwYWNrIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW9wdGlvbnMucmVwYWNrID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1vdXRwdXREaXIiKSAmJiBpIDwgYXJncy5sZW5ndGggLSAyKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYXJnc1tpICsgMV0uc3RhcnRzV2l0aCgiLSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJpbnRVc2FnZSgpOwotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJb3B0aW9ucy5vdXRwdXREaXIgPSBhcmdzWysraV07Ci0JCQl9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItdmVyYm9zZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlvcHRpb25zLnZlcmJvc2UgPSB0cnVlOwotCQkJfSAgZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1wcm9jZXNzQWxsIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW9wdGlvbnMucHJvY2Vzc0FsbCA9IHRydWU7Ci0JCQl9IAotCQl9Ci0KLQkJb3B0aW9ucy5pbnB1dCA9IG5ldyBGaWxlKGFyZ3NbaV0pOwotCi0JCVN0cmluZyBwcm9ibGVtTWVzc2FnZSA9IG51bGw7Ci0JCVN0cmluZyBpbnB1dE5hbWUgPSBvcHRpb25zLmlucHV0LmdldE5hbWUoKTsKLQkJaWYgKG9wdGlvbnMudW5wYWNrKSB7Ci0JCQlpZiAoIUphclByb2Nlc3Nvci5jYW5QZXJmb3JtVW5wYWNrKCkpIHsKLQkJCQlwcm9ibGVtTWVzc2FnZSA9ICJUaGUgdW5wYWNrMjAwIGNvbW1hbmQgY2Fubm90IGJlIGZvdW5kLiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSAJaWYgKG9wdGlvbnMuaW5wdXQuaXNGaWxlKCkgJiYgIWlucHV0TmFtZS5lbmRzV2l0aCgiLnppcCIpICYmICFpbnB1dE5hbWUuZW5kc1dpdGgoIi5wYWNrLmd6IikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcHJvYmxlbU1lc3NhZ2UgPSAiSW5wdXQgZmlsZSBpcyBub3QgYSBwYWNrLmd6IGZpbGUuIjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIAlpZiAob3B0aW9ucy5wYWNrIHx8IG9wdGlvbnMucmVwYWNrIHx8IG9wdGlvbnMuc2lnbkNvbW1hbmQgIT0gbnVsbCkgewotCQkJCXByb2JsZW1NZXNzYWdlID0gIlBhY2ssIHJlcGFjayBvciBzaWduIGNhbm5vdCBiZSBzcGVjaWZpZWQgd2l0aCB1bnBhY2suIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKG9wdGlvbnMuaW5wdXQuaXNGaWxlKCkgJiYgIWlucHV0TmFtZS5lbmRzV2l0aCgiLnppcCIpICYmICFpbnB1dE5hbWUuZW5kc1dpdGgoIi5qYXIiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlwcm9ibGVtTWVzc2FnZSA9ICJJbnB1dCBmaWxlIGlzIG5vdCBhIGphciBmaWxlLiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZQlpZiAoKG9wdGlvbnMucGFjayB8fCBvcHRpb25zLnJlcGFjaykgJiYgIUphclByb2Nlc3Nvci5jYW5QZXJmb3JtUGFjaygpKSB7Ci0JCQkJcHJvYmxlbU1lc3NhZ2UgPSAiVGhlIHBhY2syMDAgY29tbWFuZCBjYW4gbm90IGJlIGZvdW5kLiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlpZihwcm9ibGVtTWVzc2FnZSAhPSBudWxsKXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihwcm9ibGVtTWVzc2FnZSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCXByaW50VXNhZ2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIG9wdGlvbnM7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBhcmdzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlPcHRpb25zIG9wdGlvbnMgPSBwcm9jZXNzQXJndW1lbnRzKGFyZ3MpOwotCQlpZiAob3B0aW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQluZXcgSmFyUHJvY2Vzc29yRXhlY3V0b3IoKS5ydW5KYXJQcm9jZXNzb3Iob3B0aW9ucyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvUGFja1N0ZXAuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9QYWNrU3RlcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWZkNjM4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9QYWNrU3RlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuamFycHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1wdWJsaWMgY2xhc3MgUGFja1N0ZXAgZXh0ZW5kcyBDb21tYW5kU3RlcCB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBwYWNrQ29tbWFuZCA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiBjYW5QYWNrID0gbnVsbDsKLQotCXByaXZhdGUgU2V0IGV4Y2x1c2lvbnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuUGFjaygpIHsKLQkJaWYgKGNhblBhY2sgIT0gbnVsbCkKLQkJCXJldHVybiBjYW5QYWNrLmJvb2xlYW5WYWx1ZSgpOwotCi0JCVN0cmluZ1tdIGxvY2F0aW9ucyA9IFV0aWxzLmdldFBhY2syMDBDb21tYW5kcygicGFjazIwMCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChsb2NhdGlvbnMgPT0gbnVsbCkgewotCQkJY2FuUGFjayA9IEJvb2xlYW4uRkFMU0U7Ci0JCQlwYWNrQ29tbWFuZCA9IG51bGw7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpbnQgcmVzdWx0OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2F0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGxvY2F0aW9uc1tpXSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJcmVzdWx0ID0gZXhlY3V0ZShuZXcgU3RyaW5nW10ge2xvY2F0aW9uc1tpXSwgIi1WIn0pOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocmVzdWx0ID09IDApIHsKLQkJCQlwYWNrQ29tbWFuZCA9IGxvY2F0aW9uc1tpXTsKLQkJCQljYW5QYWNrID0gQm9vbGVhbi5UUlVFOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJY2FuUGFjayA9IEJvb2xlYW4uRkFMU0U7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgUGFja1N0ZXAoUHJvcGVydGllcyBvcHRpb25zKSB7Ci0JCXN1cGVyKG9wdGlvbnMsIG51bGwsIG51bGwsIGZhbHNlKTsKLQkJZXhjbHVzaW9ucyA9IFV0aWxzLmdldFBhY2tFeGNsdXNpb25zKG9wdGlvbnMpOwotCX0KLQotCXB1YmxpYyBQYWNrU3RlcChQcm9wZXJ0aWVzIG9wdGlvbnMsIGJvb2xlYW4gdmVyYm9zZSkgewotCQlzdXBlcihvcHRpb25zLCBudWxsLCBudWxsLCB2ZXJib3NlKTsKLQkJZXhjbHVzaW9ucyA9IFV0aWxzLmdldFBhY2tFeGNsdXNpb25zKG9wdGlvbnMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgcmVjdXJzaW9uRWZmZWN0KFN0cmluZyBlbnRyeU5hbWUpIHsKLQkJaWYgKGNhblBhY2soKSAmJiBlbnRyeU5hbWUuZW5kc1dpdGgoIi5qYXIiKSAmJiAhZXhjbHVzaW9ucy5jb250YWlucyhlbnRyeU5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBlbnRyeU5hbWUgKyBVdGlscy5QQUNLRURfU1VGRklYOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBGaWxlIHByZVByb2Nlc3MoRmlsZSBpbnB1dCwgRmlsZSB3b3JraW5nRGlyZWN0b3J5LCBMaXN0IGNvbnRhaW5lcnMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEZpbGUgcG9zdFByb2Nlc3MoRmlsZSBpbnB1dCwgRmlsZSB3b3JraW5nRGlyZWN0b3J5LCBMaXN0IGNvbnRhaW5lcnMpIHsKLQkJaWYgKGNhblBhY2soKSAmJiBwYWNrQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQlQcm9wZXJ0aWVzIGluZiA9IFV0aWxzLmdldEVjbGlwc2VJbmYoaW5wdXQsIHZlcmJvc2UpOwotCQkJaWYgKCFzaG91bGRQYWNrKGlucHV0LCBjb250YWluZXJzLCBpbmYpKQotCQkJCXJldHVybiBudWxsOwotCQkJRmlsZSBvdXRwdXRGaWxlID0gbmV3IEZpbGUod29ya2luZ0RpcmVjdG9yeSwgaW5wdXQuZ2V0TmFtZSgpICsgVXRpbHMuUEFDS0VEX1NVRkZJWCk7Ci0JCQl0cnkgewotCQkJCVN0cmluZ1tdIGNtZCA9IGdldENvbW1hbmQoaW5wdXQsIG91dHB1dEZpbGUsIGluZiwgY29udGFpbmVycyk7Ci0JCQkJaW50IHJlc3VsdCA9IGV4ZWN1dGUoY21kLCB2ZXJib3NlKTsKLQkJCQlpZiAocmVzdWx0ICE9IDAgJiYgdmVyYm9zZSkKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogIiArIHJlc3VsdCArICIgd2FzIHJldHVybmVkIGZyb20gY29tbWFuZDogIiArIFV0aWxzLmNvbmNhdChjbWQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKHZlcmJvc2UpCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gb3V0cHV0RmlsZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRQYWNrKEZpbGUgaW5wdXQsIExpc3QgY29udGFpbmVycywgUHJvcGVydGllcyBpbmYpIHsKLQkJLy8xOiBleGNsdWRlIGJ5IGNvbnRhaW5lcnMKLQkJLy8gaW5uZXJtb3N0IGphciBpcyBmaXJzdCBvbiB0aGUgbGlzdCwgaXQgY2FuIG92ZXJyaWRlIG91dGVyIGphcnMKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbnRhaW5lcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJUHJvcGVydGllcyBjb250YWluZXIgPSAoUHJvcGVydGllcykgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGNvbnRhaW5lci5jb250YWluc0tleShVdGlscy5NQVJLX0VYQ0xVREVfQ0hJTERSRU5fUEFDSykpIHsKLQkJCQlpZiAoQm9vbGVhbi52YWx1ZU9mKGNvbnRhaW5lci5nZXRQcm9wZXJ0eShVdGlscy5NQVJLX0VYQ0xVREVfQ0hJTERSRU5fUEFDSykpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCWlmICh2ZXJib3NlKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGlucHV0LmdldE5hbWUoKSArICIgaXMgZXhjbHVkZWQgZnJvbSBwYWNrMjAwIGJ5IGl0cyBjb250YWluZXJzLiIpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJLy8yOiBleGNsdWRlZCBieSBzZWxmCi0JCWlmIChpbmYgIT0gbnVsbCAmJiBpbmYuY29udGFpbnNLZXkoVXRpbHMuTUFSS19FWENMVURFX1BBQ0spICYmIEJvb2xlYW4udmFsdWVPZihpbmYuZ2V0UHJvcGVydHkoVXRpbHMuTUFSS19FWENMVURFX1BBQ0spKS5ib29sZWFuVmFsdWUoKSkgewotCQkJaWYgKHZlcmJvc2UpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeGNsdWRpbmcgIiArIGlucHV0LmdldE5hbWUoKSArICIgZnJvbSAiICsgZ2V0U3RlcE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldENvbW1hbmQoRmlsZSBpbnB1dCwgRmlsZSBvdXRwdXRGaWxlLCBQcm9wZXJ0aWVzIGluZiwgTGlzdCBjb250YWluZXJzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmdbXSBjbWQgPSBudWxsOwotCQlTdHJpbmcgYXJndW1lbnRzID0gZ2V0QXJndW1lbnRzKGlucHV0LCBpbmYsIGNvbnRhaW5lcnMpOwotCQlpZiAoYXJndW1lbnRzICE9IG51bGwgJiYgYXJndW1lbnRzLmxlbmd0aCgpID4gMCkgewotCQkJU3RyaW5nW10gYXJncyA9IFV0aWxzLnRvU3RyaW5nQXJyYXkoYXJndW1lbnRzLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQljbWQgPSBuZXcgU3RyaW5nWzMgKyBhcmdzLmxlbmd0aF07Ci0JCQljbWRbMF0gPSBwYWNrQ29tbWFuZDsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJncywgMCwgY21kLCAxLCBhcmdzLmxlbmd0aCk7Ci0JCQljbWRbY21kLmxlbmd0aCAtIDJdID0gb3V0cHV0RmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCQljbWRbY21kLmxlbmd0aCAtIDFdID0gaW5wdXQuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQl9IGVsc2UgewotCQkJY21kID0gbmV3IFN0cmluZ1tdIHtwYWNrQ29tbWFuZCwgb3V0cHV0RmlsZS5nZXRDYW5vbmljYWxQYXRoKCksIGlucHV0LmdldENhbm9uaWNhbFBhdGgoKX07Ci0JCX0KLQkJcmV0dXJuIGNtZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFyZ3VtZW50cyhGaWxlIGlucHV0LCBQcm9wZXJ0aWVzIGluZiwgTGlzdCBjb250YWluZXJzKSB7CQotCQkvLzE6IEV4cGxpY2l0bHkgbWFya2VkIGluIG91ciAuaW5mIGZpbGUKLQkJaWYgKGluZiAhPSBudWxsICYmIGluZi5jb250YWluc0tleShVdGlscy5QQUNLX0FSR1MpKSB7Ci0JCQlyZXR1cm4gIGluZi5nZXRQcm9wZXJ0eShVdGlscy5QQUNLX0FSR1MpOwotCQl9Ci0KLQkJLy8yOiBEZWZhdWx0cyBzZXQgaW4gb25lIG9mIG91ciBjb250YWluaW5nIGphcnMKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbnRhaW5lcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJUHJvcGVydGllcyBjb250YWluZXIgPSAoUHJvcGVydGllcykgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGNvbnRhaW5lci5jb250YWluc0tleShVdGlscy5ERUZBVUxUX1BBQ0tfQVJHUykpIHsKLQkJCQlyZXR1cm4gY29udGFpbmVyLmdldFByb3BlcnR5KFV0aWxzLkRFRkFVTFRfUEFDS19BUkdTKTsKLQkJCX0KLQkJfQotCi0JCS8vMzogU2V0IGJ5IG5hbWUgaW4gb3V0c2lkZSBwYWNrLnByb3BlcnRpZXMgZmlsZQotCQlQcm9wZXJ0aWVzIG9wdGlvbnMgPSBnZXRPcHRpb25zKCk7Ci0JCVN0cmluZyBhcmdzS2V5ID0gaW5wdXQuZ2V0TmFtZSgpICsgVXRpbHMuUEFDS19BUkdTX1NVRkZJWDsKLQkJaWYgKG9wdGlvbnMuY29udGFpbnNLZXkoYXJnc0tleSkpIHsKLQkJCXJldHVybiBvcHRpb25zLmdldFByb3BlcnR5KGFyZ3NLZXkpOwotCQl9Ci0KLQkJLy80OiBTZXQgYnkgZGVmYXVsdCBpbiBvdXRzaWRlIHBhY2sucHJvcGVydGllcyBmaWxlCi0JCWlmIChvcHRpb25zLmNvbnRhaW5zS2V5KFV0aWxzLkRFRkFVTFRfUEFDS19BUkdTKSkgewotCQkJcmV0dXJuIG9wdGlvbnMuZ2V0UHJvcGVydHkoVXRpbHMuREVGQVVMVF9QQUNLX0FSR1MpOwotCQl9Ci0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdGVwTmFtZSgpIHsKLQkJcmV0dXJuICJQYWNrIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdEluZihGaWxlIGlucHV0LCBQcm9wZXJ0aWVzIGluZiwgTGlzdCBjb250YWluZXJzKSB7Ci0JCWlmIChpbnB1dCA9PSBudWxsIHx8IGluZiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vZG9uJ3QgYmUgdmVyYm9zZSB0byBjaGVjayBpZiB3ZSBzaG91bGQgbWFyayB0aGUgaW5mCi0JCWJvb2xlYW4gdiA9IHZlcmJvc2U7Ci0JCXZlcmJvc2UgPSBmYWxzZTsKLQkJaWYgKCFzaG91bGRQYWNrKGlucHV0LCBjb250YWluZXJzLCBpbmYpKSB7Ci0JCQl2ZXJib3NlID0gdjsKLQkJCXJldHVybjsKLQkJfQotCQl2ZXJib3NlID0gdjsKLQotCQkvL21hcmsgYXMgY29uZGl0aW9uZWQgaWYgbm90IHByZXZpb3VzbHkgbWFya2VkLiAgQSBzaWduZWQgamFyIGlzIGFzc3VtZWQgdG8gYmUgcHJldmlvdXNseSBjb25kaXRpb25lZC4KLQkJaWYgKGluZi5nZXRQcm9wZXJ0eShVdGlscy5NQVJLX1BST1BFUlRZKSA9PSBudWxsKSB7Ci0JCQlpbmYucHV0KFV0aWxzLk1BUktfUFJPUEVSVFksICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkJCS8vcmVjb3JkIGFyZ3VtZW50cyB1c2VkCi0JCQlTdHJpbmcgYXJndW1lbnRzID0gaW5mLmdldFByb3BlcnR5KFV0aWxzLlBBQ0tfQVJHUyk7Ci0JCQlpZiAoYXJndW1lbnRzID09IG51bGwpIHsKLQkJCQlhcmd1bWVudHMgPSBnZXRBcmd1bWVudHMoaW5wdXQsIGluZiwgY29udGFpbmVycyk7Ci0JCQkJaWYgKGFyZ3VtZW50cyAhPSBudWxsICYmIGFyZ3VtZW50cy5sZW5ndGgoKSA+IDApCi0JCQkJCWluZi5wdXQoVXRpbHMuUEFDS19BUkdTLCBhcmd1bWVudHMpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2phcnByb2Nlc3Nvci9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvamFycHJvY2Vzc29yL1BhY2tVbnBhY2tTdGVwLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvUGFja1VucGFja1N0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE5ODEyYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvUGFja1VucGFja1N0ZXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuamFycHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBAYXV0aG9yIGFuaWVmZXJAY2EuaWJtLmNvbQotICoKLSAqLwotcHVibGljIGNsYXNzIFBhY2tVbnBhY2tTdGVwIGV4dGVuZHMgUGFja1N0ZXAgewotCXByaXZhdGUgU2V0IGV4Y2x1c2lvbnMgPSBudWxsOwotCi0JcHVibGljIFBhY2tVbnBhY2tTdGVwKFByb3BlcnRpZXMgb3B0aW9ucykgewotCQlzdXBlcihvcHRpb25zKTsKLQkJZXhjbHVzaW9ucyA9IFV0aWxzLmdldFBhY2tFeGNsdXNpb25zKG9wdGlvbnMpOwotCX0KLQotCXB1YmxpYyBQYWNrVW5wYWNrU3RlcChQcm9wZXJ0aWVzIG9wdGlvbnMsIGJvb2xlYW4gdmVyYm9zZSkgewotCQlzdXBlcihvcHRpb25zLCB2ZXJib3NlKTsKLQkJZXhjbHVzaW9ucyA9IFV0aWxzLmdldFBhY2tFeGNsdXNpb25zKG9wdGlvbnMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgcmVjdXJzaW9uRWZmZWN0KFN0cmluZyBlbnRyeU5hbWUpIHsKLQkJaWYgKGNhblBhY2soKSAmJiBlbnRyeU5hbWUuZW5kc1dpdGgoIi5qYXIiKSAmJiAhZXhjbHVzaW9ucy5jb250YWlucyhlbnRyeU5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBlbnRyeU5hbWU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmphcnByb2Nlc3Nvci5QYWNrU3RlcCNwb3N0UHJvY2VzcyhqYXZhLmlvLkZpbGUsIGphdmEuaW8uRmlsZSwgamF2YS51dGlsLkxpbmtlZExpc3QpCi0JICovCi0JcHVibGljIEZpbGUgcG9zdFByb2Nlc3MoRmlsZSBpbnB1dCwgRmlsZSB3b3JraW5nRGlyZWN0b3J5LCBMaXN0IGNvbnRhaW5lcnMpIHsKLQkJaWYgKGNhblBhY2soKSAmJiBwYWNrQ29tbWFuZCAhPSBudWxsICYmIGlucHV0ICE9IG51bGwpIHsKLQkJCVByb3BlcnRpZXMgaW5mID0gVXRpbHMuZ2V0RWNsaXBzZUluZihpbnB1dCwgdmVyYm9zZSk7Ci0JCQlpZiAoIXNob3VsZFBhY2soaW5wdXQsIGNvbnRhaW5lcnMsIGluZikpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlGaWxlIHRlbXBGaWxlID0gbmV3IEZpbGUod29ya2luZ0RpcmVjdG9yeSwgInRlbXBfIiArIGlucHV0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nW10gdG1wID0gZ2V0Q29tbWFuZChpbnB1dCwgdGVtcEZpbGUsIGluZiwgY29udGFpbmVycyk7Ci0JCQkJU3RyaW5nW10gY21kID0gbmV3IFN0cmluZ1t0bXAubGVuZ3RoICsgMV07Ci0JCQkJY21kWzBdID0gdG1wWzBdOwotCQkJCWNtZFsxXSA9ICItciI7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHRtcCwgMSwgY21kLCAyLCB0bXAubGVuZ3RoIC0gMSk7Ci0KLQkJCQlpbnQgcmVzdWx0ID0gZXhlY3V0ZShjbWQsIHZlcmJvc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gMCAmJiB0ZW1wRmlsZS5leGlzdHMoKSkgewotCQkJCQlGaWxlIGZpbmFsRmlsZSA9IG5ldyBGaWxlKHdvcmtpbmdEaXJlY3RvcnksIGlucHV0LmdldE5hbWUoKSk7Ci0JCQkJCWlmIChmaW5hbEZpbGUuZXhpc3RzKCkpCi0JCQkJCQlmaW5hbEZpbGUuZGVsZXRlKCk7Ci0JCQkJCXRlbXBGaWxlLnJlbmFtZVRvKGZpbmFsRmlsZSk7Ci0JCQkJCXJldHVybiBmaW5hbEZpbGU7Ci0JCQkJfSBlbHNlIGlmICh2ZXJib3NlKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6ICIgKyByZXN1bHQgKyAiIHdhcyByZXR1cm5lZCBmcm9tIGNvbW1hbmQ6ICIgKyBVdGlscy5jb25jYXQoY21kKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAodmVyYm9zZSkKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuamFycHJvY2Vzc29yLlBhY2tTdGVwI3ByZVByb2Nlc3MoamF2YS5pby5GaWxlLCBqYXZhLmlvLkZpbGUsIGphdmEudXRpbC5MaW5rZWRMaXN0KQotCSAqLwotCXB1YmxpYyBGaWxlIHByZVByb2Nlc3MoRmlsZSBpbnB1dCwgRmlsZSB3b3JraW5nRGlyZWN0b3J5LCBMaXN0IGNvbnRhaW5lcnMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdGVwTmFtZSgpIHsKLQkJcmV0dXJuICJSZXBhY2siOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2phcnByb2Nlc3Nvci9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvamFycHJvY2Vzc29yL1NpZ25Db21tYW5kU3RlcC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2phcnByb2Nlc3Nvci9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvamFycHJvY2Vzc29yL1NpZ25Db21tYW5kU3RlcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODJlZDc1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9TaWduQ29tbWFuZFN0ZXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmphcnByb2Nlc3NvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1wdWJsaWMgY2xhc3MgU2lnbkNvbW1hbmRTdGVwIGV4dGVuZHMgQ29tbWFuZFN0ZXAgewotCXByaXZhdGUgU2V0IGV4Y2x1c2lvbnMgPSBudWxsOwotCi0JcHVibGljIFNpZ25Db21tYW5kU3RlcChQcm9wZXJ0aWVzIG9wdGlvbnMsIFN0cmluZyBjb21tYW5kKSB7Ci0JCXN1cGVyKG9wdGlvbnMsIGNvbW1hbmQsICIuamFyIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCWV4Y2x1c2lvbnMgPSBVdGlscy5nZXRTaWduRXhjbHVzaW9ucyhvcHRpb25zKTsKLQl9Ci0KLQlwdWJsaWMgU2lnbkNvbW1hbmRTdGVwKFByb3BlcnRpZXMgb3B0aW9ucywgU3RyaW5nIGNvbW1hbmQsIGJvb2xlYW4gdmVyYm9zZSkgewotCQlzdXBlcihvcHRpb25zLCBjb21tYW5kLCAiLmphciIsIHZlcmJvc2UpOyAvLyROT04tTkxTLTEkCi0JCWV4Y2x1c2lvbnMgPSBVdGlscy5nZXRTaWduRXhjbHVzaW9ucyhvcHRpb25zKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuamFycHJvY2Vzc29yLklQcm9jZXNzU3RlcCNyZWN1cnNpb25FZmZlY3QoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlY3Vyc2lvbkVmZmVjdChTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCWlmIChlbnRyeU5hbWUuZW5kc1dpdGgoZXh0ZW5zaW9uKSAmJiAhZXhjbHVzaW9ucy5jb250YWlucyhlbnRyeU5hbWUpKQotCQkJcmV0dXJuIGVudHJ5TmFtZTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmphcnByb2Nlc3Nvci5JUHJvY2Vzc1N0ZXAjcHJlUHJvY2VzcyhqYXZhLmlvLkZpbGUsIGphdmEuaW8uRmlsZSkKLQkgKi8KLQlwdWJsaWMgRmlsZSBwcmVQcm9jZXNzKEZpbGUgaW5wdXQsIEZpbGUgd29ya2luZ0RpcmVjdG9yeSwgTGlzdCBjb250YWluZXJzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5qYXJwcm9jZXNzb3IuSVByb2Nlc3NTdGVwI3Bvc3RQcm9jZXNzKGphdmEuaW8uRmlsZSwgamF2YS5pby5GaWxlKQotCSAqLwotCXB1YmxpYyBGaWxlIHBvc3RQcm9jZXNzKEZpbGUgaW5wdXQsIEZpbGUgd29ya2luZ0RpcmVjdG9yeSwgTGlzdCBjb250YWluZXJzKSB7Ci0JCWlmIChjb21tYW5kICE9IG51bGwgJiYgaW5wdXQgIT0gbnVsbCAmJiBzaG91bGRTaWduKGlucHV0LCBjb250YWluZXJzKSkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmdbXSBjbWQgPSBuZXcgU3RyaW5nW10ge2NvbW1hbmQsIGlucHV0LmdldENhbm9uaWNhbFBhdGgoKX07Ci0JCQkJaW50IHJlc3VsdCA9IGV4ZWN1dGUoY21kLCB2ZXJib3NlKTsKLQkJCQlpZiAocmVzdWx0ID09IDApIHsKLQkJCQkJcmV0dXJuIGlucHV0OwotCQkJCX0gZWxzZSBpZiAodmVyYm9zZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiAiICsgcmVzdWx0ICsgIiB3YXMgcmV0dXJuZWQgZnJvbSBjb21tYW5kOiAiICsgVXRpbHMuY29uY2F0KGNtZCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKHZlcmJvc2UpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkU2lnbihGaWxlIGlucHV0LCBMaXN0IGNvbnRhaW5lcnMpIHsKLQkJUHJvcGVydGllcyBpbmYgPSBudWxsOwotCi0JCS8vMTogQXJlIHdlIGV4Y2x1ZGVkIGZyb20gc2lnbmluZyBieSBvdXIgcGFyZW50cz8KLQkJLy9pbm5lcm1vc3QgamFyIGlzIGZpcnN0IG9uIHRoZSBsaXN0LCBpdCBvdmVycmlkZXMgb3V0ZXIgamFycwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29udGFpbmVycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlpbmYgPSAoUHJvcGVydGllcykgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGluZi5jb250YWluc0tleShVdGlscy5NQVJLX0VYQ0xVREVfQ0hJTERSRU5fU0lHTikpewotCQkJCWlmKEJvb2xlYW4udmFsdWVPZihpbmYuZ2V0UHJvcGVydHkoVXRpbHMuTUFSS19FWENMVURFX0NISUxEUkVOX1NJR04pKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlpZiAodmVyYm9zZSkKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihpbnB1dC5nZXROYW1lKCkgKyAiaXMgZXhjbHVkZWQgZnJvbSBzaWduaW5nIGJ5IGl0cyBjb250YWluZXJzLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8vMjogSXMgdGhpcyBqYXIgaXRzZWxmIG1hcmtlZCBhcyBleGNsdWRlPwotCQlpbmYgPSBVdGlscy5nZXRFY2xpcHNlSW5mKGlucHV0LCB2ZXJib3NlKTsKLQkJaWYgKGluZiAhPSBudWxsICYmIGluZi5jb250YWluc0tleShVdGlscy5NQVJLX0VYQ0xVREVfU0lHTikgJiYgQm9vbGVhbi52YWx1ZU9mKGluZi5nZXRQcm9wZXJ0eShVdGlscy5NQVJLX0VYQ0xVREVfU0lHTikpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQlpZiAodmVyYm9zZSkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2x1ZGluZyAiICsgaW5wdXQuZ2V0TmFtZSgpICsgIiBmcm9tIHNpZ25pbmcuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RlcE5hbWUoKSB7Ci0JCXJldHVybiAiU2lnbiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvU3RyZWFtUHJvY2Vzc29yLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvU3RyZWFtUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYjVjM2EuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2phcnByb2Nlc3Nvci9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvamFycHJvY2Vzc29yL1N0cmVhbVByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuamFycHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLQotcHVibGljIGNsYXNzIFN0cmVhbVByb2Nlc3NvciBleHRlbmRzIFRocmVhZCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RERVJSID0gIlNUREVSUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVERPVVQgPSAiU1RET1VUIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbTsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgYm9vbGVhbiB2ZXJib3NlOwotCi0JcHVibGljIFN0cmVhbVByb2Nlc3NvcihJbnB1dFN0cmVhbSBpcywgU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmVyYm9zZSkgewotCQl0aGlzLmlucHV0U3RyZWFtID0gaXM7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMudmVyYm9zZSA9IHZlcmJvc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl0cnkgewotCQkJSW5wdXRTdHJlYW1SZWFkZXIgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtKTsKLQkJCUJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlzcik7Ci0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCVN0cmluZyBzID0gYnIucmVhZExpbmUoKTsKLQkJCQlpZiAocyA9PSBudWxsKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAodmVyYm9zZSkgewotCQkJCQlpZiAoU1RERVJSLmVxdWFscyhuYW1lKSkKLQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbihuYW1lICsgIjogIiArIHMpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVsc2UKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihuYW1lICsgIjogIiArIHMpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvVW5wYWNrU3RlcC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2phcnByb2Nlc3Nvci9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvamFycHJvY2Vzc29yL1VucGFja1N0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQzMGRkOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvVW5wYWNrU3RlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmphcnByb2Nlc3NvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi0vKioKLSAqIEBhdXRob3IgYW5pZWZlcgotICoKLSAqLwotcHVibGljIGNsYXNzIFVucGFja1N0ZXAgZXh0ZW5kcyBDb21tYW5kU3RlcCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5QQUNLRVJfUFJPUEVSVFkgPSAib3JnLmVjbGlwc2UudXBkYXRlLmphcnByb2Nlc3Nvci5VbnBhY2tlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBCb29sZWFuIGNhblVucGFjayA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHVucGFja0NvbW1hbmQgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhblVucGFjaygpIHsKLQkJaWYgKGNhblVucGFjayAhPSBudWxsKQotCQkJcmV0dXJuIGNhblVucGFjay5ib29sZWFuVmFsdWUoKTsKLQotCQlTdHJpbmdbXSBsb2NhdGlvbnMgPSBVdGlscy5nZXRQYWNrMjAwQ29tbWFuZHMoInVucGFjazIwMCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChsb2NhdGlvbnMgPT0gbnVsbCkgewotCQkJY2FuVW5wYWNrID0gQm9vbGVhbi5GQUxTRTsKLQkJCXVucGFja0NvbW1hbmQgPSBudWxsOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaW50IHJlc3VsdDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChsb2NhdGlvbnNbaV0gPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCXJlc3VsdCA9IGV4ZWN1dGUobmV3IFN0cmluZ1tdIHtsb2NhdGlvbnNbaV0sICItViJ9KTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHJlc3VsdCA9PSAwKSB7Ci0JCQkJdW5wYWNrQ29tbWFuZCA9IGxvY2F0aW9uc1tpXTsKLQkJCQljYW5VbnBhY2sgPSBCb29sZWFuLlRSVUU7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQljYW5VbnBhY2sgPSBCb29sZWFuLkZBTFNFOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFVucGFja1N0ZXAoUHJvcGVydGllcyBvcHRpb25zKSB7Ci0JCXN1cGVyKG9wdGlvbnMsIG51bGwsIG51bGwsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgVW5wYWNrU3RlcChQcm9wZXJ0aWVzIG9wdGlvbnMsIGJvb2xlYW4gdmVyYm9zZSkgewotCQlzdXBlcihvcHRpb25zLCBudWxsLCBudWxsLCB2ZXJib3NlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuamFycHJvY2Vzc29yLklQcm9jZXNzU3RlcCNyZWN1cnNpb25FZmZlY3QoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlY3Vyc2lvbkVmZmVjdChTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCWlmIChjYW5VbnBhY2soKSAmJiBlbnRyeU5hbWUuZW5kc1dpdGgoVXRpbHMuUEFDS0VEX1NVRkZJWCkpIHsKLQkJCXJldHVybiBlbnRyeU5hbWUuc3Vic3RyaW5nKDAsIGVudHJ5TmFtZS5sZW5ndGgoKSAtIFV0aWxzLlBBQ0tFRF9TVUZGSVgubGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5qYXJwcm9jZXNzb3IuSVByb2Nlc3NTdGVwI3ByZVByb2Nlc3MoamF2YS5pby5GaWxlLCBqYXZhLmlvLkZpbGUpCi0JICovCi0JcHVibGljIEZpbGUgcHJlUHJvY2VzcyhGaWxlIGlucHV0LCBGaWxlIHdvcmtpbmdEaXJlY3RvcnksIExpc3QgY29udGFpbmVycykgewotCQlpZiAoY2FuVW5wYWNrKCkgJiYgdW5wYWNrQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGlucHV0LmdldE5hbWUoKTsKLQkJCWlmIChuYW1lLmVuZHNXaXRoKFV0aWxzLlBBQ0tFRF9TVUZGSVgpKSB7Ci0JCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSBVdGlscy5QQUNLRURfU1VGRklYLmxlbmd0aCgpKTsKLQotCQkJCUZpbGUgdW5wYWNrZWQgPSBuZXcgRmlsZSh3b3JraW5nRGlyZWN0b3J5LCBuYW1lKTsKLQkJCQlGaWxlIHBhcmVudCA9IHVucGFja2VkLmdldFBhcmVudEZpbGUoKTsKLQkJCQlpZiAoIXBhcmVudC5leGlzdHMoKSkKLQkJCQkJcGFyZW50Lm1rZGlycygpOwotCQkJCXRyeSB7Ci0JCQkJCVN0cmluZyBvcHRpb25zID0gZ2V0T3B0aW9ucygpLmdldFByb3BlcnR5KGlucHV0LmdldE5hbWUoKSArICIudW5wYWNrLmFyZ3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmdbXSBjbWQgPSBudWxsOwotCQkJCQlpZiAob3B0aW9ucyAhPSBudWxsKSB7Ci0JCQkJCQljbWQgPSBuZXcgU3RyaW5nW10ge3VucGFja0NvbW1hbmQsIG9wdGlvbnMsIGlucHV0LmdldENhbm9uaWNhbFBhdGgoKSwgdW5wYWNrZWQuZ2V0Q2Fub25pY2FsUGF0aCgpfTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNtZCA9IG5ldyBTdHJpbmdbXSB7dW5wYWNrQ29tbWFuZCwgaW5wdXQuZ2V0Q2Fub25pY2FsUGF0aCgpLCB1bnBhY2tlZC5nZXRDYW5vbmljYWxQYXRoKCl9OwotCQkJCQl9Ci0JCQkJCWludCByZXN1bHQgPSBleGVjdXRlKGNtZCwgdmVyYm9zZSk7Ci0JCQkJCWlmIChyZXN1bHQgIT0gMCAmJiB2ZXJib3NlKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogIiArIHJlc3VsdCArICIgd2FzIHJldHVybmVkIGZyb20gY29tbWFuZDogIiArIFV0aWxzLmNvbmNhdChjbWQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlpZiAodmVyYm9zZSkKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gdW5wYWNrZWQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmphcnByb2Nlc3Nvci5JUHJvY2Vzc1N0ZXAjcG9zdFByb2Nlc3MoamF2YS5pby5GaWxlLCBqYXZhLmlvLkZpbGUpCi0JICovCi0JcHVibGljIEZpbGUgcG9zdFByb2Nlc3MoRmlsZSBpbnB1dCwgRmlsZSB3b3JraW5nRGlyZWN0b3J5LCBMaXN0IGNvbnRhaW5lcnMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdGVwTmFtZSgpIHsKLQkJcmV0dXJuICJVbnBhY2siOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2phcnByb2Nlc3Nvci9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvamFycHJvY2Vzc29yL1V0aWxzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY0ZWJiZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmphcnByb2Nlc3NvcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBhbmllZmVyQGNhLmlibS5jb20KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBVdGlscyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS19GSUxFX05BTUUgPSAiTUVUQS1JTkYvZWNsaXBzZS5pbmYiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoKLQkgKiBQcm9wZXJ0aWVzIGZvdW5kIGluIG91dGVyIHBhY2sucHJvcGVydGllcyBmaWxlCi0JICovCi0JLy9jb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBqYXJzIHRvIGV4Y2x1ZGUgZnJvbSBzaWdpbmluZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR05fRVhDTFVERVMgPSAic2lnbi5leGNsdWRlcyI7IC8vJE5PTi1OTFMtMSQKLQkvL2NvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGphcnMgdG8gZXhsY2x1ZGUgZnJvbSBwYWNraW5nCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS19FWENMVURFUyA9ICJwYWNrLmV4Y2x1ZGVzIjsgLy8kTk9OLU5MUy0xJAotCS8vU3VmZml4IHVzZWQgd2hlbiBzcGVjaWZ5aW5nIGFyZ3VtZW50cyB0byB1c2Ugd2hlbiBydW5uaW5nIHBhY2syMDAgb24gYSBqYXIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLX0FSR1NfU1VGRklYID0gIi5wYWNrLmFyZ3MiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoKLQkgKiBQcm9wZXJ0aWVzIGZvdW5kIGluIGJvdGggcGFjay5wcm9wZXJ0aWVzIGFuZCBlY2xpcHNlLmluZgotCSAqLwotCS8vCURlZmF1bHQgYXJndW1lbnRzIHRvIHVzZSB3aGVuIHJ1bm5pbmcgcGFjazIwMC4KLQkvLyBBZmZlY3RzIGFsbCBqYXJzIHdoZW4gc3BlY2lmaWVkIGluIHBhY2sucHJvcGVydGllcywgYWZmZWN0cyBjaGlsZHJlbiB3aGVuIHNwZWNpZmllZCBpbiBlY2xpcHNlLmluZgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUEFDS19BUkdTID0gInBhY2syMDAuZGVmYXVsdC5hcmdzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qCi0JICogUHJvcGVydGllcyBmb3VuZCBpbiBlY2xpcHNlLmluZiBmaWxlCi0JICovCi0JLy9UaGlzIGphciBoYXMgYmVlbiBjb25kaXRpb25lZCB3aXRoIHBhY2syMDAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLX1BST1BFUlRZID0gInBhY2syMDAuY29uZGl0aW9uZWQiOyAvLyROT04tTkxTLTEkCi0JLy9FeGNsdWRlIHRoaXMgamFyIGZyb20gcHJvY2Vzc2luZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktfRVhDTFVERSA9ICJqYXJwcm9jZXNzb3IuZXhjbHVkZSI7IC8vJE5PTi1OTFMtMSQKLQkvL0V4Y2x1ZGUgdGhpcyBqYXIgZnJvbSBwYWNrMjAwCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS19FWENMVURFX1BBQ0sgPSAiamFycHJvY2Vzc29yLmV4Y2x1ZGUucGFjayI7IC8vJE5PTi1OTFMtMSQKLQkvL0V4Y2x1ZGUgdGhpcyBqYXIgZnJvbSBzaWduaW5nCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS19FWENMVURFX1NJR04gPSAiamFycHJvY2Vzc29yLmV4Y2x1ZGUuc2lnbiI7IC8vJE5PTi1OTFMtMSQKLQkvL0V4Y2x1ZGUgdGhpcyBqYXIncyBjaGlsZHJlbiBmcm9tIHByb2Nlc3NpbmcKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLX0VYQ0xVREVfQ0hJTERSRU4gPSAiamFycHJvY2Vzc29yLmV4Y2x1ZGUuY2hpbGRyZW4iOwotCS8vRXhjbHVkZSB0aGlzIGphcidzIGNoaWxkcmVuIGZyb20gcGFjazIwMAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktfRVhDTFVERV9DSElMRFJFTl9QQUNLID0gImphcnByb2Nlc3Nvci5leGNsdWRlLmNoaWxkcmVuLnBhY2siOwotCS8vRXhjbHVkZSB0aGlzIGphcidzIGNoaWxkcmVuIGZyb20gc2lnbmluZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktfRVhDTFVERV9DSElMRFJFTl9TSUdOID0gImphcnByb2Nlc3Nvci5leGNsdWRlLmNoaWxkcmVuLnNpZ24iOwotCS8vQXJndW1lbnRzIHVzZWQgaW4gcGFjazIwMCBmb3IgdGhpcyBqYXIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLX0FSR1MgPSAicGFjazIwMC5hcmdzIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0syMDBfUFJPUEVSVFkgPSAib3JnLmVjbGlwc2UudXBkYXRlLmphcnByb2Nlc3Nvci5wYWNrMjAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpSRSA9ICJAanJlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEggPSAiQHBhdGgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORSA9ICJAbm9uZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tFRF9TVUZGSVggPSAiLnBhY2suZ3oiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX1NVRkZJWCA9ICIuamFyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlRmlsdGVyIEpBUl9GSUxURVIgPSBuZXcgRmlsZUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKLQkJCXJldHVybiBwYXRobmFtZS5pc0ZpbGUoKSAmJiBwYXRobmFtZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsZUZpbHRlciBQQUNLX0daX0ZJTFRFUiA9IG5ldyBGaWxlRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkgewotCQkJcmV0dXJuIHBhdGhuYW1lLmlzRmlsZSgpICYmIHBhdGhuYW1lLmdldE5hbWUoKS5lbmRzV2l0aChQQUNLRURfU1VGRklYKTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoT2JqZWN0IHN0cmVhbSkgewotCQlpZiAoc3RyZWFtICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHN0cmVhbSBpbnN0YW5jZW9mIElucHV0U3RyZWFtKQotCQkJCQkoKElucHV0U3RyZWFtKSBzdHJlYW0pLmNsb3NlKCk7Ci0JCQkJZWxzZSBpZiAoc3RyZWFtIGluc3RhbmNlb2YgT3V0cHV0U3RyZWFtKQotCQkJCQkoKE91dHB1dFN0cmVhbSkgc3RyZWFtKS5jbG9zZSgpOwotCQkJCWVsc2UgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIEphckZpbGUpCi0JCQkJCSgoSmFyRmlsZSkgc3RyZWFtKS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHNldCBvZiBjb21tYW5kcyB0byB0cnkgdG8gZXhlY3V0ZSBwYWNrL3VucGFjayAKLQkgKiBAcGFyYW0gY21kLCB0aGUgY29tbWFuZCwgZWl0aGVyICJwYWNrMjAwIiBvciAidW5wYWNrMjAwIgotCSAqIEByZXR1cm4gU3RyaW5nIFtdIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFBhY2syMDBDb21tYW5kcyhTdHJpbmcgY21kKSB7Ci0JCVN0cmluZ1tdIGxvY2F0aW9ucyA9IG51bGw7Ci0JCVN0cmluZyBwcm9wID0gU3lzdGVtLmdldFByb3BlcnR5KFBBQ0syMDBfUFJPUEVSVFkpOwotCQlTdHJpbmcgamF2YUhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChOT05FLmVxdWFscyhwcm9wKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSBpZiAoSlJFLmVxdWFscyhwcm9wKSkgewotCQkJbG9jYXRpb25zID0gbmV3IFN0cmluZ1tdIHtqYXZhSG9tZSArICIvYmluLyIgKyBjbWR9OyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoUEFUSC5lcXVhbHMocHJvcCkpIHsKLQkJCWxvY2F0aW9ucyA9IG5ldyBTdHJpbmdbXSB7Y21kfTsKLQkJfSBlbHNlIGlmIChwcm9wID09IG51bGwpIHsKLQkJCWxvY2F0aW9ucyA9IG5ldyBTdHJpbmdbXSB7amF2YUhvbWUgKyAiL2Jpbi8iICsgY21kLCBjbWR9OyAvLyROT04tTkxTLTEkIAotCQl9IGVsc2UgewotCQkJbG9jYXRpb25zID0gbmV3IFN0cmluZ1tdIHtwcm9wICsgIi8iICsgY21kfTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBsb2NhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmZXJzIGFsbCBhdmFpbGFibGUgYnl0ZXMgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBnaXZlbgotCSAqIG91dHB1dCBzdHJlYW0uIENsb3NlcyBib3RoIHN0cmVhbXMgaWYgY2xvc2UgPT0gdHJ1ZSwgcmVnYXJkbGVzcyBvZiBmYWlsdXJlLiAKLQkgKiBGbHVzaGVzIHRoZSBkZXN0aW5hdGlvbiBzdHJlYW0gaWYgY2xvc2UgPT0gZmFsc2UKLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogQHBhcmFtIGRlc3RpbmF0aW9uCi0JICogQHBhcmFtIGNsb3NlIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmZXJTdHJlYW1zKElucHV0U3RyZWFtIHNvdXJjZSwgT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uLCBib29sZWFuIGNsb3NlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzb3VyY2UgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzb3VyY2UpOwotCQlkZXN0aW5hdGlvbiA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShkZXN0aW5hdGlvbik7Ci0JCXRyeSB7Ci0JCQlieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbODE5Ml07Ci0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCWludCBieXRlc1JlYWQgPSAtMTsKLQkJCQlpZiAoKGJ5dGVzUmVhZCA9IHNvdXJjZS5yZWFkKGJ1ZmZlcikpID09IC0xKQotCQkJCQlicmVhazsKLQkJCQlkZXN0aW5hdGlvbi53cml0ZShidWZmZXIsIDAsIGJ5dGVzUmVhZCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoY2xvc2UpIHsKLQkJCQljbG9zZShzb3VyY2UpOwotCQkJCWNsb3NlKGRlc3RpbmF0aW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGVzdGluYXRpb24uZmx1c2goKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIERlbGV0ZXMgYWxsIHRoZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgZnJvbSB0aGUgZ2l2ZW4gcm9vdCBkb3duIChpbmNsdXNpdmUpLgotCSAqIFJldHVybnMgZmFsc2UgaWYgd2UgY291bGQgbm90IGRlbGV0ZSBzb21lIGZpbGUgb3IgYW4gZXhjZXB0aW9uIG9jY3VycmVkCi0JICogYXQgYW55IHBvaW50IGluIHRoZSBkZWxldGlvbi4KLQkgKiBFdmVuIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMsIGEgYmVzdCBlZmZvcnQgaXMgbWFkZSB0byBjb250aW51ZSBkZWxldGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xlYXIoamF2YS5pby5GaWxlIHJvb3QpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBjbGVhckNoaWxkcmVuKHJvb3QpOwotCQl0cnkgewotCQkJaWYgKHJvb3QuZXhpc3RzKCkpCi0JCQkJcmVzdWx0ICY9IHJvb3QuZGVsZXRlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIERlbGV0ZXMgYWxsIHRoZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgZnJvbSB0aGUgZ2l2ZW4gcm9vdCBkb3duLCBleGNlcHQgZm9yIAotCSAqIHRoZSByb290IGl0c2VsZi4KLQkgKiBSZXR1cm5zIGZhbHNlIGlmIHdlIGNvdWxkIG5vdCBkZWxldGUgc29tZSBmaWxlIG9yIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZAotCSAqIGF0IGFueSBwb2ludCBpbiB0aGUgZGVsZXRpb24uCi0JICogRXZlbiBpZiBhbiBleGNlcHRpb24gb2NjdXJzLCBhIGJlc3QgZWZmb3J0IGlzIG1hZGUgdG8gY29udGludWUgZGVsZXRpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsZWFyQ2hpbGRyZW4oamF2YS5pby5GaWxlIHJvb3QpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlpZiAocm9vdC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlTdHJpbmdbXSBsaXN0ID0gcm9vdC5saXN0KCk7Ci0JCQkvLyBmb3Igc29tZSB1bmtub3duIHJlYXNvbiwgbGlzdCgpIGNhbiByZXR1cm4gbnVsbC4gIAotCQkJLy8gSnVzdCBza2lwIHRoZSBjaGlsZHJlbiBJZiBpdCBkb2VzLgotCQkJaWYgKGxpc3QgIT0gbnVsbCkKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspCi0JCQkJCXJlc3VsdCAmPSBjbGVhcihuZXcgamF2YS5pby5GaWxlKHJvb3QsIGxpc3RbaV0pKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU2V0IGdldFBhY2tFeGNsdXNpb25zKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQotCQlTdHJpbmcgcGFja0V4Y2x1ZGVzID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShQQUNLX0VYQ0xVREVTKTsKLQkJaWYgKHBhY2tFeGNsdWRlcyAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBleGNsdWRlcyA9IHRvU3RyaW5nQXJyYXkocGFja0V4Y2x1ZGVzLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQlTZXQgcGFja0V4Y2x1c2lvbnMgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdWRlcy5sZW5ndGg7IGkrKykgewotCQkJCXBhY2tFeGNsdXNpb25zLmFkZChleGNsdWRlc1tpXSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcGFja0V4Y2x1c2lvbnM7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNldCBnZXRTaWduRXhjbHVzaW9ucyhQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JCVN0cmluZyBzaWduRXhjbHVkZXMgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KFNJR05fRVhDTFVERVMpOwotCQlpZiAoc2lnbkV4Y2x1ZGVzICE9IG51bGwpIHsKLQkJCVN0cmluZ1tdIGV4Y2x1ZGVzID0gdG9TdHJpbmdBcnJheShzaWduRXhjbHVkZXMsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCVNldCBzaWduRXhjbHVzaW9ucyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1ZGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc2lnbkV4Y2x1c2lvbnMuYWRkKGV4Y2x1ZGVzW2ldKTsKLQkJCX0KLQkJCXJldHVybiBzaWduRXhjbHVzaW9uczsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNhdChTdHJpbmdbXSBhcnJheSkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSA+IDApCi0JCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJYnVmZmVyLmFwcGVuZChhcnJheVtpXSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gdG9TdHJpbmdBcnJheShTdHJpbmcgaW5wdXQsIFN0cmluZyBzZXBhcmF0b3IpIHsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW5wdXQsIHNlcGFyYXRvcik7Ci0JCWludCBjb3VudCA9IHRva2VuaXplci5jb3VudFRva2VucygpOwotCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2NvdW50XTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhlIGVjbGlwc2UuaW5mIGZpbGUgZnJvbSB0aGUgZ2l2ZW4gamFyLiAgSWYgdGhlIGZpbGUgaXMgbm90IGEgamFyLCBudWxsIGlzIHJldHVybmVkLgotCSAqIElmIHRoZSBmaWxlIGlzIGEgamFyLCBidXQgZG9lcyBub3QgY29udGFpbiBhbiBlY2xpcHNlLmluZiBmaWxlLCBhbiBlbXB0eSBQcm9wZXJ0aWVzIG9iamVjdCBpcyByZXR1cm5lZC4KLQkgKiBAcGFyYW0gamFyRmlsZQotCSAqIEByZXR1cm4gVGhlIGVjbGlwc2UuaW5mIHByb3BlcnRpZXMgZm9yIHRoZSBnaXZlbiBqYXIgZmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvcGVydGllcyBnZXRFY2xpcHNlSW5mKEZpbGUgamFyRmlsZSwgYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCWlmIChqYXJGaWxlID09IG51bGwgfHwgIWphckZpbGUuZXhpc3RzKCkpIHsKLQkJCWlmICh2ZXJib3NlKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmFpbGVkIHRvIG9idGFpbiBlY2xpcHNlLmluZiBkdWUgdG8gbWlzc2luZyBqYXIgZmlsZTogIiArIGphckZpbGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSmFyRmlsZSBqYXIgPSBudWxsOwotCQl0cnkgewotCQkJamFyID0gbmV3IEphckZpbGUoamFyRmlsZSwgZmFsc2UpOwotCQl9IGNhdGNoIChaaXBFeGNlcHRpb24gZSkgewotCQkJLy9ub3QgYSBqYXIsIGRvbid0IGJvdGhlciBsb2dnaW5nIHRoaXMuCi0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJaWYgKHZlcmJvc2UpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWxlZCB0byBvYnRhaW4gZWNsaXBzZS5pbmYgZHVlIHRvIElPRXhjZXB0aW9uOiAiICsgamFyRmlsZSk7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXRyeSB7Ci0JCQlKYXJFbnRyeSBtYXJrID0gamFyLmdldEphckVudHJ5KE1BUktfRklMRV9OQU1FKTsKLQkJCWlmIChtYXJrICE9IG51bGwpIHsKLQkJCQlJbnB1dFN0cmVhbSBpbiA9IGphci5nZXRJbnB1dFN0cmVhbShtYXJrKTsKLQkJCQlQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCQlwcm9wcy5sb2FkKGluKTsKLQkJCQlpbi5jbG9zZSgpOwotCQkJCXJldHVybiBwcm9wczsKLQkJCX0KLQkJCXJldHVybiBuZXcgUHJvcGVydGllcygpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAodmVyYm9zZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmFpbGVkIHRvIG9idGFpbiBlY2xpcHNlLmluZiBkdWUgdG8gSU9FeGNlcHRpb246ICIgKyBqYXJGaWxlKTsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZmluYWxseSB7Ci0JCQljbG9zZShqYXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNob3VsZFNraXBKYXIoRmlsZSBpbnB1dCwgYm9vbGVhbiBwcm9jZXNzQWxsLCBib29sZWFuIHZlcmJvc2UpIHsKLQkJUHJvcGVydGllcyBpbmYgPSBnZXRFY2xpcHNlSW5mKGlucHV0LCB2ZXJib3NlKTsKLQkJaWYgKGluZiA9PSBudWxsKSB7Ci0JCQkvL25vdCBhIGphciwgY291bGQgYmUgYSBwYWNrLmd6Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGV4Y2x1ZGUgPSBpbmYuZ2V0UHJvcGVydHkoTUFSS19FWENMVURFKTsKLQotCQkvL3dhcyBtYXJrZWQgYXMgZXhjbHVkZSwgd2Ugc2hvdWxkIHNraXAKLQkJaWYgKGV4Y2x1ZGUgIT0gbnVsbCAmJiBCb29sZWFuLnZhbHVlT2YoZXhjbHVkZSkuYm9vbGVhblZhbHVlKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQkvL3Byb2Nlc3MgYWxsIHdhcyBzZXQsIGRvbid0IHNraXAKLQkJaWYgKHByb2Nlc3NBbGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy9vdGhlcndpc2UsIHdlIHNraXAgaWYgbm90IG1hcmtlZCBtYXJrZWQKLQkJU3RyaW5nIG1hcmtlZCA9IGluZi5nZXRQcm9wZXJ0eShNQVJLX1BST1BFUlRZKTsKLQkJcmV0dXJuICFCb29sZWFuLnZhbHVlT2YobWFya2VkKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9yZXMgdGhlIGdpdmVuIHByb3BlcnRpZXMgaW4gdGhlIG91dHB1dCBzdHJlYW0uICBXZSBzdG9yZSB0aGUgcHJvcGVydGllcyAKLQkgKiBpbiBzb3J0ZWQgb3JkZXIgc28gdGhhdCB0aGUgc2lnbmluZyBoYXNoIGRvZXNuJ3QgY2hhbmdlIGlmIHRoZSBwcm9wZXJ0aWVzIGRpZG4ndCBjaGFuZ2UuIAotCSAqIEBwYXJhbSBwcm9wcwotCSAqIEBwYXJhbSBzdHJlYW0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc3RvcmVQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcHMsIE91dHB1dFN0cmVhbSBzdHJlYW0pIHsKLQkJUHJpbnRTdHJlYW0gcHJpbnRTdHJlYW0gPSBuZXcgUHJpbnRTdHJlYW0oc3RyZWFtKTsKLQkJcHJpbnRTdHJlYW0ucHJpbnQoIiNQcm9jZXNzZWQgdXNpbmcgSmFycHJvY2Vzc29yXG4iKTsgLy8kTk9OLU5MUy0xJAotCQlTb3J0ZWRNYXAgc29ydGVkID0gbmV3IFRyZWVNYXAocHJvcHMpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzb3J0ZWQua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlwcmludFN0cmVhbS5wcmludChrZXkpOwotCQkJcHJpbnRTdHJlYW0ucHJpbnQoIiA9ICIpOyAvLyROT04tTkxTLTEkCi0JCQlwcmludFN0cmVhbS5wcmludChzb3J0ZWQuZ2V0KGtleSkpOwotCQkJcHJpbnRTdHJlYW0ucHJpbnQoIlxuIik7Ci0KLQkJfQotCQlwcmludFN0cmVhbS5mbHVzaCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9aaXBQcm9jZXNzb3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9qYXJwcm9jZXNzb3Ivb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2phcnByb2Nlc3Nvci9aaXBQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4YjY2Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvWmlwUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuamFycHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuKjsKLQotLyoqCi0gKiBAYXV0aG9yIGFuaWVmZXJAY2EuaWJtLmNvbQotICoKLSAqLwotcHVibGljIGNsYXNzIFppcFByb2Nlc3NvciB7Ci0KLQlwcml2YXRlIElQcm9jZXNzU3RlcCBzaWduU3RlcCA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvY2Vzc1N0ZXAgcGFja1N0ZXAgPSBudWxsOwotCXByaXZhdGUgSVByb2Nlc3NTdGVwIHBhY2tVbnBhY2tTdGVwID0gbnVsbDsKLQlwcml2YXRlIElQcm9jZXNzU3RlcCB1bnBhY2tTdGVwID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIHdvcmtpbmdEaXJlY3RvcnkgPSBudWxsOwotCXByaXZhdGUgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbnVsbDsKLQlwcml2YXRlIFNldCBwYWNrRXhjbHVzaW9ucyA9IG51bGw7Ci0JcHJpdmF0ZSBTZXQgc2lnbkV4Y2x1c2lvbnMgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGNvbW1hbmQgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBwYWNraW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHNpZ25pbmcgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gcmVwYWNraW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHVucGFja2luZyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NBbGwgPSBmYWxzZTsKLQotCXB1YmxpYyB2b2lkIHNldFdvcmtpbmdEaXJlY3RvcnkoU3RyaW5nIGRpcikgewotCQl3b3JraW5nRGlyZWN0b3J5ID0gZGlyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V29ya2luZ0RpcmVjdG9yeSgpIHsKLQkJaWYgKHdvcmtpbmdEaXJlY3RvcnkgPT0gbnVsbCkKLQkJCXdvcmtpbmdEaXJlY3RvcnkgPSAiLiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHdvcmtpbmdEaXJlY3Rvcnk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2lnbkNvbW1hbmQoU3RyaW5nIGNvbW1hbmQpIHsKLQkJdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLQkJdGhpcy5zaWduaW5nID0gKGNvbW1hbmQgIT0gbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFjayhib29sZWFuIHBhY2spIHsKLQkJdGhpcy5wYWNraW5nID0gcGFjazsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXBhY2soYm9vbGVhbiByZXBhY2spIHsKLQkJdGhpcy5yZXBhY2tpbmcgPSByZXBhY2s7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VW5wYWNrKGJvb2xlYW4gdW5wYWNrKSB7Ci0JCXRoaXMudW5wYWNraW5nID0gdW5wYWNrOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCXRoaXMudmVyYm9zZSA9IHZlcmJvc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvY2Vzc0FsbChib29sZWFuIGFsbCkgewotCQl0aGlzLnByb2Nlc3NBbGwgPSBhbGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvY2Vzc1ppcChGaWxlIHppcEZpbGUpIHRocm93cyBaaXBFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYgKHZlcmJvc2UpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3NpbmcgIiArIHppcEZpbGUuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQlaaXBGaWxlIHppcCA9IG5ldyBaaXBGaWxlKHppcEZpbGUpOwotCQlpbml0aWFsaXplKHppcCk7Ci0KLQkJU3RyaW5nIGV4dGVuc2lvbiA9IHVucGFja2luZyA/ICJwYWNrLmd6IiA6ICIuamFyIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUZpbGUgdGVtcERpciA9IG5ldyBGaWxlKGdldFdvcmtpbmdEaXJlY3RvcnkoKSwgInRlbXBfIiArIHppcEZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlKYXJQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IEphclByb2Nlc3NvcigpOwotCQlwcm9jZXNzb3Iuc2V0VmVyYm9zZSh2ZXJib3NlKTsKLQkJcHJvY2Vzc29yLnNldFByb2Nlc3NBbGwocHJvY2Vzc0FsbCk7Ci0JCXByb2Nlc3Nvci5zZXRXb3JraW5nRGlyZWN0b3J5KHRlbXBEaXIuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQkJaWYgKHVucGFja2luZykgewotCQkJcHJvY2Vzc29yLmFkZFByb2Nlc3NTdGVwKHVucGFja1N0ZXApOwotCQl9Ci0KLQkJRmlsZSBvdXRwdXRGaWxlID0gbmV3IEZpbGUoZ2V0V29ya2luZ0RpcmVjdG9yeSgpLCB6aXBGaWxlLmdldE5hbWUoKSArICIudGVtcCIpOyAvLyROT04tTkxTLTEkCi0JCUZpbGUgcGFyZW50ID0gb3V0cHV0RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCWlmICghcGFyZW50LmV4aXN0cygpKQotCQkJcGFyZW50Lm1rZGlycygpOwotCQlaaXBPdXRwdXRTdHJlYW0gemlwT3V0ID0gbmV3IFppcE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKSk7Ci0JCUVudW1lcmF0aW9uIGVudHJpZXMgPSB6aXAuZW50cmllcygpOwotCQlpZiAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJZm9yIChaaXBFbnRyeSBlbnRyeSA9IChaaXBFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpOyBlbnRyeSAhPSBudWxsOyBlbnRyeSA9IGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkgPyAoWmlwRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKSA6IG51bGwpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKLQotCQkJCUlucHV0U3RyZWFtIGVudHJ5U3RyZWFtID0gemlwLmdldElucHV0U3RyZWFtKGVudHJ5KTsKLQotCQkJCWJvb2xlYW4gcGFjayA9IHBhY2tpbmcgJiYgIXBhY2tFeGNsdXNpb25zLmNvbnRhaW5zKG5hbWUpOwotCQkJCWJvb2xlYW4gc2lnbiA9IHNpZ25pbmcgJiYgIXNpZ25FeGNsdXNpb25zLmNvbnRhaW5zKG5hbWUpOwotCQkJCWJvb2xlYW4gcmVwYWNrID0gcmVwYWNraW5nICYmICFwYWNrRXhjbHVzaW9ucy5jb250YWlucyhuYW1lKTsKLQotCQkJCUZpbGUgZXh0cmFjdGVkRmlsZSA9IG51bGw7Ci0KLQkJCQlpZiAoZW50cnkuZ2V0TmFtZSgpLmVuZHNXaXRoKGV4dGVuc2lvbikgJiYgKHBhY2sgfHwgc2lnbiB8fCByZXBhY2sgfHwgdW5wYWNraW5nKSkgewotCQkJCQlleHRyYWN0ZWRGaWxlID0gbmV3IEZpbGUodGVtcERpciwgbmFtZSk7Ci0JCQkJCXBhcmVudCA9IGV4dHJhY3RlZEZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQkJCQlpZiAoIXBhcmVudC5leGlzdHMoKSkKLQkJCQkJCXBhcmVudC5ta2RpcnMoKTsKLQkJCQkJaWYgKHZlcmJvc2UpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4dHJhY3RpbmcgIiArIGVudHJ5LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJRmlsZU91dHB1dFN0cmVhbSBleHRyYWN0ZWQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShleHRyYWN0ZWRGaWxlKTsKLQkJCQkJVXRpbHMudHJhbnNmZXJTdHJlYW1zKGVudHJ5U3RyZWFtLCBleHRyYWN0ZWQsIHRydWUpOyAvLyB0aGlzIHdpbGwgY2xvc2UgdGhlIHN0cmVhbQotCQkJCQllbnRyeVN0cmVhbSA9IG51bGw7Ci0KLQkJCQkJYm9vbGVhbiBza2lwID0gVXRpbHMuc2hvdWxkU2tpcEphcihleHRyYWN0ZWRGaWxlLCBwcm9jZXNzQWxsLCB2ZXJib3NlKTsKLQkJCQkJaWYgKHNraXApIHsKLQkJCQkJCS8vc2tpcHBpbmcgdGhpcyBmaWxlIAotCQkJCQkJZW50cnlTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGV4dHJhY3RlZEZpbGUpOwotCQkJCQkJaWYgKHZlcmJvc2UpCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGVudHJ5LmdldE5hbWUoKSArICIgaXMgbm90IG1hcmtlZCwgc2tpcHBpbmcuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmICh1bnBhY2tpbmcpIHsKLQkJCQkJCQlGaWxlIHJlc3VsdCA9IHByb2Nlc3Nvci5wcm9jZXNzSmFyKGV4dHJhY3RlZEZpbGUpOwotCQkJCQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gZXh0cmFjdGVkRmlsZS5nZXROYW1lKCkubGVuZ3RoKCkpICsgcmVzdWx0LmdldE5hbWUoKTsKLQkJCQkJCQlleHRyYWN0ZWRGaWxlID0gcmVzdWx0OwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpZiAocmVwYWNrIHx8IHNpZ24pIHsKLQkJCQkJCQkJcHJvY2Vzc29yLmNsZWFyUHJvY2Vzc1N0ZXBzKCk7Ci0JCQkJCQkJCWlmIChyZXBhY2spCi0JCQkJCQkJCQlwcm9jZXNzb3IuYWRkUHJvY2Vzc1N0ZXAocGFja1VucGFja1N0ZXApOwotCQkJCQkJCQlpZiAoc2lnbikKLQkJCQkJCQkJCXByb2Nlc3Nvci5hZGRQcm9jZXNzU3RlcChzaWduU3RlcCk7Ci0JCQkJCQkJCWV4dHJhY3RlZEZpbGUgPSBwcm9jZXNzb3IucHJvY2Vzc0phcihleHRyYWN0ZWRGaWxlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHBhY2spIHsKLQkJCQkJCQkJcHJvY2Vzc29yLmNsZWFyUHJvY2Vzc1N0ZXBzKCk7Ci0JCQkJCQkJCXByb2Nlc3Nvci5hZGRQcm9jZXNzU3RlcChwYWNrU3RlcCk7Ci0JCQkJCQkJCUZpbGUgbW9kaWZpZWRGaWxlID0gcHJvY2Vzc29yLnByb2Nlc3NKYXIoZXh0cmFjdGVkRmlsZSk7Ci0JCQkJCQkJCWlmIChtb2RpZmllZEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJU3RyaW5nIG5ld05hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gZXh0cmFjdGVkRmlsZS5nZXROYW1lKCkubGVuZ3RoKCkpICsgbW9kaWZpZWRGaWxlLmdldE5hbWUoKTsKLQkJCQkJCQkJCQlpZiAodmVyYm9zZSkgewotCQkJCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyAiICsgbmV3TmFtZSArICIgdG8gIiArIG91dHB1dEZpbGUuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlaaXBFbnRyeSB6aXBFbnRyeSA9IG5ldyBaaXBFbnRyeShuZXdOYW1lKTsKLQkJCQkJCQkJCQllbnRyeVN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obW9kaWZpZWRGaWxlKTsKLQkJCQkJCQkJCQl6aXBPdXQucHV0TmV4dEVudHJ5KHppcEVudHJ5KTsKLQkJCQkJCQkJCQlVdGlscy50cmFuc2ZlclN0cmVhbXMoZW50cnlTdHJlYW0sIHppcE91dCwgZmFsc2UpOyAvL3dlIHdhbnQgdG8ga2VlcCB6aXBPdXQgb3BlbgotCQkJCQkJCQkJCWVudHJ5U3RyZWFtLmNsb3NlKCk7Ci0JCQkJCQkJCQkJVXRpbHMuY2xlYXIobW9kaWZpZWRGaWxlKTsKLQkJCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQlVdGlscy5jbG9zZShlbnRyeVN0cmVhbSk7Ci0JCQkJCQkJCQkJaWYgKHZlcmJvc2UpIHsKLQkJCQkJCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJXYXJuaW5nOiBQcm9ibGVtIHJlYWRpbmcgIiArIG1vZGlmaWVkRmlsZS5nZXRQYXRoKCkgKyAiLiIpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVudHJ5U3RyZWFtID0gbnVsbDsKLQkJCQkJCQkJfSBlbHNlIGlmICh2ZXJib3NlKSB7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc6ICIgKyBtb2RpZmllZEZpbGUuZ2V0UGF0aCgpICsgIiBub3QgZm91bmQuIik7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZXh0cmFjdGVkRmlsZS5leGlzdHMoKSkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWVudHJ5U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShleHRyYWN0ZWRGaWxlKTsKLQkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCWlmICh2ZXJib3NlKSB7Ci0JCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJXYXJuaW5nOiBQcm9ibGVtIHJlYWRpbmcgIiArIGV4dHJhY3RlZEZpbGUuZ2V0UGF0aCgpICsgIi4iKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJaWYgKHZlcmJvc2UgJiYgZW50cnlTdHJlYW0gIT0gbnVsbCkgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWRkaW5nICIgKyBuYW1lICsgIiB0byAiICsgb3V0cHV0RmlsZS5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZW50cnlTdHJlYW0gIT0gbnVsbCkgewotCQkJCQlaaXBFbnRyeSBuZXdFbnRyeSA9IG5ldyBaaXBFbnRyeShuYW1lKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXppcE91dC5wdXROZXh0RW50cnkobmV3RW50cnkpOwotCQkJCQkJVXRpbHMudHJhbnNmZXJTdHJlYW1zKGVudHJ5U3RyZWFtLCB6aXBPdXQsIGZhbHNlKTsKLQkJCQkJCXppcE91dC5jbG9zZUVudHJ5KCk7Ci0JCQkJCX0gY2F0Y2ggKFppcEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlpZih2ZXJib3NlKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJXYXJuaW5nOiAiICsgbmFtZSArICIgYWxyZWFkeSBleGlzdHMgaW4gIiArIG91dHB1dEZpbGUuZ2V0TmFtZSgpICsgIi4gIFNraXBwaW5nLiIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVudHJ5U3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQotCi0JCQkJaWYgKGV4dHJhY3RlZEZpbGUgIT0gbnVsbCkKLQkJCQkJVXRpbHMuY2xlYXIoZXh0cmFjdGVkRmlsZSk7Ci0JCQkJCi0JCQkJaWYgKHZlcmJvc2UpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvY2Vzc2luZyAiICsgemlwRmlsZS5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCXppcE91dC5jbG9zZSgpOwotCQl6aXAuY2xvc2UoKTsKLQotCQlGaWxlIGZpbmFsRmlsZSA9IG5ldyBGaWxlKGdldFdvcmtpbmdEaXJlY3RvcnkoKSwgemlwRmlsZS5nZXROYW1lKCkpOwotCQlpZiAoZmluYWxGaWxlLmV4aXN0cygpKQotCQkJZmluYWxGaWxlLmRlbGV0ZSgpOwotCQlvdXRwdXRGaWxlLnJlbmFtZVRvKGZpbmFsRmlsZSk7Ci0JCVV0aWxzLmNsZWFyKHRlbXBEaXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKFppcEZpbGUgemlwKSB7Ci0JCVppcEVudHJ5IGVudHJ5ID0gemlwLmdldEVudHJ5KCJwYWNrLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXN0cmVhbSA9IHppcC5nZXRJbnB1dFN0cmVhbShlbnRyeSk7Ci0JCQkJcHJvcGVydGllcy5sb2FkKHN0cmVhbSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKHZlcmJvc2UpCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCVV0aWxzLmNsb3NlKHN0cmVhbSk7Ci0JCQl9Ci0JCX0KLQotCQlwYWNrRXhjbHVzaW9ucyA9IFV0aWxzLmdldFBhY2tFeGNsdXNpb25zKHByb3BlcnRpZXMpOwotCQlzaWduRXhjbHVzaW9ucyA9IFV0aWxzLmdldFNpZ25FeGNsdXNpb25zKHByb3BlcnRpZXMpOwotCi0JCXBhY2tVbnBhY2tTdGVwID0gbmV3IFBhY2tVbnBhY2tTdGVwKHByb3BlcnRpZXMsIHZlcmJvc2UpOwotCQlwYWNrU3RlcCA9IG5ldyBQYWNrU3RlcChwcm9wZXJ0aWVzLCB2ZXJib3NlKTsKLQkJc2lnblN0ZXAgPSBuZXcgU2lnbkNvbW1hbmRTdGVwKHByb3BlcnRpZXMsIGNvbW1hbmQsIHZlcmJvc2UpOwotCQl1bnBhY2tTdGVwID0gbmV3IFVucGFja1N0ZXAocHJvcGVydGllcywgdmVyYm9zZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2phcnByb2Nlc3Nvci9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvamFycHJvY2Vzc29yL3BhY2stcmVhZG1lLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvcGFjay1yZWFkbWUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1ZmU1ZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvamFycHJvY2Vzc29yL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9qYXJwcm9jZXNzb3IvcGFjay1yZWFkbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgPHRpdGxlPkVjbGlwc2UgdXBkYXRlIHBhY2tpbmcgdG9vbCByZWFkbWU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+RWNsaXBzZSB1cGRhdGUgcGFja2luZyB0b29sPC9oMT4KLQotPGgzPk92ZXJ2aWV3PC9oMz4KLVRoZSB1cGRhdGUgcGFja2luZyB0b29sIHByb2Nlc3NlcyBhIGhpZXJhcmNoeSBvZiBhcmJpdHJhcmlseSBuZXN0ZWQKLUpBUnMgYW5kIFpJUCBmaWxlcy4gIEl0IGlzIGEgZ2VuZXJpYyB1dGlsaXR5IHRoYXQgcGVyZm9ybXMgYSBkZXB0aCBmaXJzdCB0cmF2ZXJzYWwgb2YgCi1hIG5lc3RlZCBoaWVyYXJjaHkgb2YgWklQcyBhbmQgSkFScywgcGVyZm9ybXMgdmFyaW91cyBjb21tYW5kcyBvbgotZWFjaCBvZiB0aGUgSkFScyBpbiB0aGUgaGllcmFyY2h5LCBhbmQgdGhlbiByZWJ1aWxkcyB0aGUgc2FtZSBoaWVyYXJjaHkKLW9mIFpJUHMgYW5kIEpBUnMgYWdhaW4uICBDdXJyZW50bHkgaXRzIG1haW4gZnVuY3Rpb25zIGFyZToKLTx1bD4KLQk8bGk+UGFja2luZyBKQVJzIHVzaW5nIHRoZSBKYXZhIDEuNSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy90b29sZG9jcy9zaGFyZS9wYWNrMjAwLmh0bWwiPnBhY2syMDA8L2E+Ci0JIGNvbW1hbmQuPC9saT4KLQkgPGxpPlVucGFja2luZyBQQUNLLkdacyB1c2luZyB0aGUgSmF2YSAxLjUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvdG9vbGRvY3Mvc2hhcmUvdW5wYWNrMjAwLmh0bWwiPnVucGFjazIwMDwvYT4KLQkgY29tbWFuZC48L2xpPgotCSA8bGk+Tm9ybWFsaXppbmcgSkFScyBmb3IgZnV0dXJlIGNvbXByZXNzaW9uIGJ5IHBhY2syMDAuIFRoaXMgaXMgYWNjb21wbGlzaGVkCi0JIGJ5IHJ1bm5pbmcgdGhlIHBhY2syMDAgY29tbWFuZCB3aXRoIHRoZSA8dHQ+LS1yZXBhY2s8L3R0PiBjb21tYW5kIGxpbmUgYXJndW1lbnQuPC9saT4KLQkgPGxpPlNpZ25pbmcgSkFScyB0byBhbGxvdyBmb3IgYXV0aGVudGljYXRpb24gb2YgdGhlIG9yaWdpbiBvZiBKQVJzLiBUaGlzIGlzIGFjY29tcGxpc2hlZCBieQotCSBydW5uaW5nIGEgc3VwcGxpZWQgY29tbWFuZCAodHlwaWNhbGx5IHRoZSBjb21tYW5kIHdpbGwganVzdCBiZSBhIHdyYXBwZXIgYXJvdW5kCi0JIHRoZSBKYXZhIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy90b29sZG9jcy93aW4zMi9qYXJzaWduZXIuaHRtbCI+amFyc2lnbmVyPC9hPiB0b29sKS48L2xpPgotPC91bD4KLVRoZSBwYWNraW5nIHRvb2wgaXMgdXNlZCBpbiB0aGUgZm9sbG93aW5nIGNvbnRleHRzOgotPHVsPgotCTxsaT5EdXJpbmcgYSBQREUgYnVpbGQsIHRvIHByZXBhcmUgSkFScyBmb3IgdXBsb2FkaW5nIHRvIGFuIEVjbGlwc2UKLQl1cGRhdGUgc2l0ZS4gIEluIHRoaXMgdXNhZ2UsIGl0IGlzIHVzZWQgdG8gYm90aCBub21hbGl6ZSBKQVIgY29udGVudHMKLQkocGFjazIwMCAtcmVwYWNrKSwgYW5kIHNpZ24gSkFScy48L2xpPgotCTxsaT5PbiBhbiB1cGRhdGUgc2l0ZSwgdG8gY29udmVydCB0cmFkaXRpb25hbCBKQVIgY29udGVudCBpbnRvIHRoZSAKLQljb21wcmVzc2VkIHBhY2syMDAgZm9ybWF0LjwvbGk+Ci0JPGxpPkZyb20gYW4gRWNsaXBzZSBjbGllbnQgYXBwbGljYXRpb24gZHVyaW5nIHVwZGF0ZSwgdG8gY29udmVydAotCWNvbXByZXNzZWQgcGFjazIwMCBmb3JtYXQgY29udGVudCBpbnRvIGV4ZWN1dGFibGUgSkFSIGZpbGVzLjwvbGk+Ci08L3VsPgotPGgzPlRvb2wgdXNhZ2U8L2gzPgotVG8gcnVuIHRoZSBwYWNraW5nIHRvb2wsIHlvdSBuZWVkIGEgMS41IEpSRSBpbnN0YWxsZWQuIFRoZSB0b29sIGlzIHJ1bgotYnkgaW52b2tpbmcgSmF2YSBhcyBmb2xsb3dzOgotCi08cHJlPgotCWphdmEgamFycHJvY2Vzc29yLmphciBbb3B0aW9uc10gaW5wdXQKLTwvcHJlPgotCi1XaGVyZSA8dHQ+aW5wdXQ8L3R0PiBpcyBlaXRoZXIgYSB6aXAgZmlsZSwgYSBkaXJlY3RvcnksIG9yIGEgSkFSIChvciBhIHBhY2suZ3ogZmlsZSkuIEFsbCBmaWxlcyBlbmRpbmcgCi1pbiAiLmphciIgb3IgIi5wYWNrLmd6IiBpbiB0aGUgcHJvdmlkZWQgemlwIG9yIGRpcmVjdG9yeSBoaWVyYXJjaHkKLXdpbGwgYmUgcHJvY2Vzc2VkLiAKLVRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFyZSBzdXBwb3J0ZWQ6Ci08dWw+Ci08bGk+LXJlcGFjayA6IE5vcm1hbGl6ZSB0aGUgamFycyB1c2luZyBwYWNrMjAwIDx0dD4tLXJlcGFjazwvdHQ+PC9saT4KLTxsaT4tc2lnbiAmbHQ7Y21kJmd0OyA6IHNpZ25zIHRoZSBqYXJzIGJ5IGV4ZWN1dGluZyB0aGUgcHJvdmlkZWQgY29tbWFuZC4gIAotVGhlIGNvbW1hbmQgd2lsbCBiZSBwcm92aWRlZCBhIHNpbmdsZSBhcmd1bWVudCB0aGF0IHdpbGwgYmUgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgSkFSIHRvIHByb2Nlc3MuCi08L2xpPgotPGxpPi1wYWNrIDogZm9yIGVhY2ggaW5wdXQgaW4gSkFSIGZvcm0sIHByb2R1Y2UgYSBjb3JyZXNwb25kaW5nIG91dHB1dAotaW4gcGFja2VkIGZvcm0uICBGb3IgYW4gaW5wdXQgImEuamFyIiwgdGhlIG91dHB1dCBpcyBhLmphci5wYWNrLmd6LiAgCi08L2xpPgotPGxpPi11bnBhY2sgOiBmb3IgZWFjaCBpbnB1dCBpbiBwYWNrZWQgZm9ybSwgcHJvZHVjZSBhIGNvcnJlc3BvbmRpbmcgb3V0cHV0Ci1pbiB1bnBhY2tlZCBmb3JtLiAgRm9yIGFuIGlucHV0ICJhLmphci5wYWNrLmd6IiwgdGhlIG91dHB1dCBpcyAiYS5qYXIiLiAtdW5wYWNrIGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIC1yZXBhY2ssIC1wYWNrIGFuZCAtc2lnbi48L2xpPgotPGxpPi1vdXRwdXREaXIgJmx0O2RpciZndDsgOiBUaGUgZGlyZWN0b3J5IHRvIHB1dCB0aGUgdG9vbCdzIG91dHB1dCBpbnRvLiAgSWYgdGhlIGlucHV0IHdhcyBhIHppcCBmaWxlLCB0aGVuIGFuIG91dHB1dCB6aXAgZmlsZSB3aWxsIGJlCi1jcmVhdGVkIGNvbnRhaW5nIGFsbCB0aGUgb3V0cHV0IGZpbGVzLiAgSWYgdGhlIGlucHV0IHdhcyBhIGRpcmVjdG9yeSwgZm9yIGVhY2ggaW5wdXQgZmlsZSB0aGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgb3V0cHV0IGZpbGUgaW4gdGhlIG91dHB1dCBkaXJlY3RvcnkuIEJ5IGRlZmF1bHQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaXMgdXNlZC4gIElmIHRoZSBpbnB1dCBpcyBpbiB0aGUgc2FtZQotZGlyZWN0b3J5IGFzIHRoZSBvdXRwdXQsIHRoZSBpbnB1dCBmaWxlcyBtYXkgYmUgb3ZlcndyaXR0ZW4uPC9saT4KLTwvdWw+Ci0KLUFkZGl0aW9uYWxseSwgd2hlbiB0aGUgaW5wdXQgaXMgYSB6aXAgZmlsZSwgaXQgbWF5IGNvbnRhaW4gYSBmaWxlIGNhbGxlZAotPHR0PnBhY2sucHJvcGVydGllczwvdHQ+LiAgVGhlIHBhY2sucHJvcGVydGllcyBmaWxlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotPHVsPgotPGxpPnBhY2suZXhjbHVkZXMgPSAgamFyTmFtZVssIGphck5hbWVdKiA6IEEgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgSkFScyB0aGF0IHNob3VsZCBub3QgYmUgcGFja2VkIG9yIHJlcGFja2VkLgotPC9saT4KLTxsaT5zaWduLmV4Y2x1ZGVzID0gIGphck5hbWVbLCBqYXJOYW1lXSogOiBBIGNvbW1hLWRlbGltaXRlZCBsaXN0IG9mIEpBUnMgdGhhdCBzaG91bGQgbm90IGJlIHNpZ25lZC4KLTwvbGk+Ci08bGk+Jmx0O2phcm5hbWUmZ3Q7LnBhY2suYXJncyA9IG9wdGlvblssIG9wdGlvbl0qIDogQSBjb21tYS1kZWxpbWl0ZWQgbGlzdCBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0aGF0IHNob3VsZAotYmUgcGFzc2VkIHRvIHBhY2syMDAgd2hlbiBwYWNraW5nIGFueSBqYXIgd2l0aCBuYW1lICZsdDtqYXJuYW1lJmd0Oy4KLTwvdWw+Ci08L3A+Ci08cD4KLTxmb250IHNpemU9LTE+Ci1Db3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIAotPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMDwvYT4uCi08L2ZvbnQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvcHJlZmVyZW5jZXMuaW5pIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3ByZWZlcmVuY2VzLmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkzNmU3Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvcHJlZmVyZW5jZXMuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIFRoZSBwb3J0IG51bWJlciBvbiB3aGljaCB0aGUgc2V2ZXIgbGlzdGVucyBmb3IgaHR0cCByZXF1ZXN0cy4KLSMgSWYgdGhlIHBvcnQgaXMgMCBhbmQgYXJiaXRyYXJ5IHBvcnQgaXMgcGlja2VkIGJ5IHRoZSBzeXN0ZW0uCi0KLSMgRGVmaW5lcyB0aGUgcG9saWN5IHVybCB0aGF0IGNvbnRhaW5zIGRpcmVjdGl2ZXMgZm9yIHJlZGlyZWN0aW5nIAotIyB1cGRhdGVzIHRvIGRpZmZlcmVudCB1cGRhdGUgc2l0ZXMuCi0jdXBkYXRlUG9saWN5VVJMPQotCi0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zY2hlbWEvZmVhdHVyZVR5cGVzLmV4c2QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc2NoZW1hL2ZlYXR1cmVUeXBlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTE3ZjEwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zY2hlbWEvZmVhdHVyZVR5cGVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiIGlkPSJmZWF0dXJlVHlwZXMiIG5hbWU9IkZlYXR1cmUgVHlwZSBGYWN0b3J5Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBwbGF0Zm9ybSB1cGRhdGUgbWVjaGFuaXNtIHN1cHBvcnRzIHBsdWdnYWJsZSBmZWF0dXJlIHR5cGUKLWltcGxlbWVudGF0aW9ucy4gQSBuZXcgZmVhdHVyZSB0eXBlIGNhbiBiZSByZWdpc3RlcmVkIGluIG9yZGVyCi10byBzdXBwb3J0Ci1hbHRlcm5hdGUgcGFja2FnaW5nIGFuZCB2ZXJpZmljYXRpb24gc2NoZW1lcy4KLSZsdDtwJmd0OwotVGhlICZsdDtjb2RlJmd0O2ZlYXR1cmVUeXBlcyZsdDsvY29kZSZndDsKLWV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYWx0ZXJuYXRlIGZlYXR1cmUgaW1wbGVtZW50YXRpb25zIHRvIGJlCi1yZWdpc3RlcmVkIHVzaW5nIGEgc3ltYm9saWMgdHlwZSBpZGVudGlmaWVyLiBXaGVuZXZlciB0aGUgCi10eXBlIGlzIHJlZmVyZW5jZWQgdXNpbmcgdGhpcyBpZGVudGlmaWVyLCB0aGUgc3VwcGxpZWQgZmFjdG9yeQotaXMgdXNlZCB0byBjcmVhdGUgdGhlIGNvcnJlY3QgY29uY3JldGUgZmVhdHVyZSBpbXBsZW1lbnRhdGlvbi4KLSZsdDsvcCZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZlYXR1cmUtZmFjdG9yeSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBtdXN0IGJlIHNwZWNpZmllZCBhcyAmbHQ7YiZndDtvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlVHlwZXMmbHQ7L2ImZ3Q7DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG11c3QgYmUgc3BlY2lmaWVkLiBJZGVudGlmaWVzIHRoZSBuZXcgZmVhdHVyZSB0eXBlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgZGlzcGxheWFibGUgbGFiZWwgZm9yIHRoZSBuZXcgZmVhdHVyZSB0eXBlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImZlYXR1cmUtZmFjdG9yeSI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGZhY3RvcnkgY2xhc3MgZm9yIHRoZSBpZGVudGlmaWVkIGZlYXR1cmUgdHlwZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUluc3RhbGxEZWx0YUhhbmRsZXIiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIG5ldyBmZWF0dXJlIHR5cGUgcmVnaXN0cmF0aW9uOgotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbgotICAgICAgaWQ9JnF1b3Q7Y3VzdG9tJnF1b3Q7Ci0gICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlVHlwZXMmcXVvdDsKLSAgICAgIG5hbWU9JnF1b3Q7Q3VzdG9tIHBhY2thZ2VkIGZlYXR1cmUmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7ZmVhdHVyZS1mYWN0b3J5Ci0gICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLnh5ei51cGRhdGUuQ3VzdG9tRmVhdHVyZUZhY3RvcnkmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7L2ZlYXR1cmUtZmFjdG9yeSZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgUmVnaXN0ZXJlZCBmYWN0b3J5IGNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgCi0mbHQ7Y29kZSZndDsmbHQ7YiZndDtvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZUZhY3RvcnkmbHQ7L2ImZ3Q7Jmx0Oy9jb2RlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgcGxhdGZvcm0gc3VwcGxpZXMgdHdvIHN0YW5kYXJkIGltcGxlbWVudGF0aW9ucyBvZiBmZWF0dXJlCi10eXBlcy4gT25lIHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdCBwYWNrYWdlZCBmZWF0dXJlIHR5cGUsIGFuZAotdGhlIG90aGVyIHJlcHJlc2VudGluZyBhbiBpbnN0YWxsZWQgZmVhdHVyZSB0eXBlLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0Oy4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zY2hlbWEvaW5zdGFsbEhhbmRsZXJzLmV4c2QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc2NoZW1hL2luc3RhbGxIYW5kbGVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODRhMjVmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zY2hlbWEvaW5zdGFsbEhhbmRsZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiIGlkPSJpbnN0YWxsSGFuZGxlcnMiIG5hbWU9Ikdsb2JhbCBJbnN0YWxsIEhhbmRsZXJzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIEV4dGVuc2lvbiBwb2ludCBmb3IgcmVnaXN0ZXJpbmcgZ2xvYmFsIGluc3RhbGwgaGFuZGxlcnMuIEdsb2JhbAotaW5zdGFsbCBoYW5kbGVycyBjYW4gYmUgcmVmZXJlbmNlZCBieSBmZWF0dXJlcyAKLSh1c2luZyB0aGUgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtmZWF0dXJlJmFtcDtndDsgJmFtcDtsdDtpbnN0YWxsLWhhbmRsZXImYW1wO2d0OyZsdDsvY29kZSZndDsKLXRhZ3MpIHdpdGhvdXQgaGF2aW5nIHRvIGluY2x1ZGUgYSBjb3B5IG9mIHRoZSBoYW5kbGVyIGNvZGUgYXMKLXBhcnQgb2YgdGhlIGRvd25sb2FkYWJsZSBmZWF0dXJlLg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iaW5zdGFsbC1oYW5kbGVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG11c3QgYmUgc3BlY2lmaWVkIGFzICZsdDtiJmd0O29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmluc3RhbGxIYW5kbGVycyZsdDsvYiZndDsNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgbXVzdCBiZSBzcGVjaWZpZWQuIElkZW50aWZpZXMgdGhlIG5ldyBpbnN0YWxsIGhhbmRsZXINCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBvcHRpb25hbCBkaXNwbGF5YWJsZSBsYWJlbCBmb3IgdGhlIG5ldyBpbnN0YWxsIGhhbmRsZXINCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iaW5zdGFsbC1oYW5kbGVyIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgaGFuZGxlciBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgdGhlIGlkZW50aWZpZWQKLWluc3RhbGwgaGFuZGxlcg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgbmV3IGdsb2JhbCBpbnN0YWxsIGhhbmRsZXIgcmVnaXN0cmF0aW9uOgotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbgotICAgICAgICBpZD0mcXVvdDtjdXN0b20mcXVvdDsKLSAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuaW5zdGFsbEhhbmRsZXJzJnF1b3Q7Ci0gICAgICAgIG5hbWU9JnF1b3Q7Q3VzdG9tIGluc3RhbGwgaGFuZGxlciZxdW90OyZndDsKLSAgICAgJmx0O2luc3RhbGwtaGFuZGxlcgotICAgICAgICBjbGFzcz0mcXVvdDtjb20ueHl6LnVwZGF0ZS5DdXN0b21JbnN0YWxsSGFuZGxlciZxdW90OyZndDsKLSAgICAgJmx0Oy9pbnN0YWxsLWhhbmRsZXImZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFJlZ2lzdGVyZWQgaW5zdGFsbCBoYW5kbGVyIGNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgCi0mbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5zdGFsbEhhbmRsZXImbHQ7L2NvZGUmZ3Q7IGludGVyZmFjZS4KLUltcGxlbWVudGVycyBzaG91bGQgZXh0ZW5kIGJhc2UgY2xhc3MgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQmFzZUluc3RhbGxIYW5kbGVyJmx0Oy9jb2RlJmd0Oy4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIHBsYXRmb3JtIHN1cHBsaWVzIGEgc2ltcGxlIGluc3RhbGwgaGFuZGxlciB0aGF0IGlzIHJlZ2lzdGVyZWQgYXMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuRGVmYXVsdEluc3RhbGxIYW5kbGVyJmx0Oy9jb2RlJmd0Oy4gSWYgdXNlZCwgaXQgd2lsbCBjb3B5IGFueSBub24tcGx1Zy1pbiBkYXRhIGVudHJpZXMgcHJvdmlkZWQgd2l0aCB0aGUgZmVhdHVyZSBpbnRvIHRoZSBmZWF0dXJlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi1BbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Lg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NjaGVtYS9zaXRlVHlwZXMuZXhzZCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zY2hlbWEvc2l0ZVR5cGVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMmRjMTYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NjaGVtYS9zaXRlVHlwZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIj4NCi08YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSIgaWQ9InNpdGVUeXBlcyIgbmFtZT0iU2l0ZSBUeXBlIEZhY3RvcnkiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIHBsYXRmb3JtIHVwZGF0ZSBtZWNoYW5pc20gc3VwcG9ydHMgcGx1Z2dhYmxlIHNpdGUgdHlwZQotaW1wbGVtZW50YXRpb25zLiBBIG5ldyBzaXRlIHR5cGUgY2FuIGJlIHJlZ2lzdGVyZWQgaW4gb3JkZXIKLXRvIHN1cHBvcnQgYWx0ZXJuYXRlIHNpdGUgbGF5b3V0IHNjaGVtZXMuCi0mbHQ7cCZndDsKLVRoZSAmbHQ7Y29kZSZndDtzaXRlVHlwZXMmbHQ7L2NvZGUmZ3Q7Ci1leHRlbnNpb24gcG9pbnQgYWxsb3dzIGFsdGVybmF0ZSBzaXRlIGltcGxlbWVudGF0aW9ucyB0byBiZQotcmVnaXN0ZXJlZCB1c2luZyBhIHN5bWJvbGljIHR5cGUgaWRlbnRpZmllci4gV2hlbmV2ZXIgdGhlIAotdHlwZSBpcyByZWZlcmVuY2VkIHVzaW5nIHRoaXMgaWRlbnRpZmllciwgdGhlIHN1cHBsaWVkIGZhY3RvcnkKLWlzIHVzZWQgdG8gY3JlYXRlIHRoZSBjb3JyZWN0IGNvbmNyZXRlIHNpdGUgaW1wbGVtZW50YXRpb24uCi0mbHQ7L3AmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzaXRlLWZhY3RvcnkiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgbXVzdCBiZSBzcGVjaWZpZWQgYXMgJmx0O2ImZ3Q7b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuc2l0ZVR5cGVzJmx0Oy9iJmd0Ow0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBtdXN0IGJlIHNwZWNpZmllZC4gSWRlbnRpZmllcyB0aGUgbmV3IHNpdGUgdHlwZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGRpc3BsYXlhYmxlIGxhYmVsIGZvciB0aGUgbmV3IHNpdGUgdHlwZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJzaXRlLWZhY3RvcnkiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBmYWN0b3J5IGNsYXNzIGZvciB0aGUgaWRlbnRpZmllZAotc2l0ZSB0eXBlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBuZXcgc2l0ZSB0eXBlIHJlZ2lzdHJhdGlvbi4KLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgaWQ9JnF1b3Q7Y3VzdG9tJnF1b3Q7Ci0gICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnNpdGVUeXBlcyZxdW90OwotICAgICAgICBuYW1lPSZxdW90O0N1c3RvbSBzaXRlJnF1b3Q7Jmd0OwotICAgICAgJmx0O3NpdGUtZmFjdG9yeQotICAgICAgICAgIGNsYXNzPSZxdW90O2NvbS54eXoudXBkYXRlLkN1c3RvbVNpdGVGYWN0b3J5JnF1b3Q7Jmd0OwotICAgICAgJmx0Oy9zaXRlLWZhY3RvcnkmZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFJlZ2lzdGVyZWQgZmFjdG9yeSBjbGFzc2VzIG11c3QgaW1wbGVtZW50IAotJmx0O2NvZGUmZ3Q7Jmx0O2ImZ3Q7b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGVGYWN0b3J5Jmx0Oy9iJmd0OyZsdDsvY29kZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIHBsYXRmb3JtIHN1cHBsaWVzIHR3byBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbnMgb2Ygc2l0ZQotdHlwZXMuIE9uZSByZXByZXNlbnRpbmcgdGhlIGRlZmF1bHQgdXBkYXRlIHNlcnZlciB0eXBlLCBhbmQKLXRoZSBvdGhlciByZXByZXNlbnRpbmcgdGhlIGxvY2FsIGZpbGUgc3lzdGVtIHNpdGUuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi1BbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Lg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9CYXNlU2l0ZUxvY2FsRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9CYXNlU2l0ZUxvY2FsRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWI1NzE0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQmFzZVNpdGVMb2NhbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC4qOwotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEJhc2VTaXRlTG9jYWxGYWN0b3J5IHsKLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGNyZWF0ZUluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgSW5zdGFsbENvbmZpZ3VyYXRpb24oKTsKLQl9Ci0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkFjdGl2aXR5TW9kZWwgY3JlYXRlQ29uZmlndXJhdGlvbkFjdGl2aXR5TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgQ29uZmlndXJhdGlvbkFjdGl2aXR5KCk7Ci0JfQotCS8qCi0JICogCi0JICovCi0JcHVibGljIENvbmZpZ3VyZWRTaXRlTW9kZWwgY3JlYXRlQ29uZmlndXJhdGlvblNpdGVNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBDb25maWd1cmVkU2l0ZSgpOwotCX0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uUG9saWN5TW9kZWwgY3JlYXRlQ29uZmlndXJhdGlvblBvbGljeU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IENvbmZpZ3VyYXRpb25Qb2xpY3koKTsKLQl9Ci0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENvbmZpZ3VyZWRTaXRlTW9kZWwgY3JlYXRlQ29uZmlndXJhdGlvblNpdGVNb2RlbChTaXRlTW9kZWwgc2l0ZSwgaW50IHBvbGljeSkgewotCQkvL2NyZWF0ZSBjb25maWcgc2l0ZQotCQlDb25maWd1cmVkU2l0ZU1vZGVsIGNvbmZpZ1NpdGUgPSB0aGlzLmNyZWF0ZUNvbmZpZ3VyYXRpb25TaXRlTW9kZWwoKTsKLQkJY29uZmlnU2l0ZS5zZXRTaXRlTW9kZWwoc2l0ZSk7Ci0JCUNvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCBwb2xpY3lNb2RlbCA9IHRoaXMuY3JlYXRlQ29uZmlndXJhdGlvblBvbGljeU1vZGVsKCk7Ci0JCXBvbGljeU1vZGVsLnNldFBvbGljeShwb2xpY3kpOwotCQljb25maWdTaXRlLnNldENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbChwb2xpY3lNb2RlbCk7Ci0JCSgoQ29uZmlndXJhdGlvblBvbGljeSkgcG9saWN5TW9kZWwpLnNldENvbmZpZ3VyZWRTaXRlTW9kZWwoY29uZmlnU2l0ZSk7Ci0JCXJldHVybiBjb25maWdTaXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQ29uZmlndXJhdGlvbkFjdGl2aXR5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0NvbmZpZ3VyYXRpb25BY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmJiYzg0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQ29uZmlndXJhdGlvbkFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklJbnN0YWxsQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWwuQ29uZmlndXJhdGlvbkFjdGl2aXR5TW9kZWw7Ci1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkFjdGl2aXR5Ci0JZXh0ZW5kcyBDb25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbAotCWltcGxlbWVudHMgSUFjdGl2aXR5IHsKLQkJCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqLwkJCi0JcHVibGljIENvbmZpZ3VyYXRpb25BY3Rpdml0eSgpIHsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0b3Igd2l0aCBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkFjdGl2aXR5KGludCBhY3Rpb24pIHsKLQkJc3VwZXIoKTsKLQkJc2V0QWN0aW9uKGFjdGlvbik7Ci0JCXNldFN0YXR1cyhTVEFUVVNfTk9LKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElBY3Rpdml0eSNnZXRJbnN0YWxsQ29uZmlndXJhdGlvbigpCi0JICovCi0JcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBnZXRJbnN0YWxsQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIChJSW5zdGFsbENvbmZpZ3VyYXRpb24pIGdldEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewotCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25BY3Rpdml0eSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh0aGlzID09IG90aGVyKQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlDb25maWd1cmF0aW9uQWN0aXZpdHkgYWN0aXZpdHkgPSAoQ29uZmlndXJhdGlvbkFjdGl2aXR5KSBvdGhlcjsKLQkJcmV0dXJuIGdldEFjdGlvbigpID09IGFjdGl2aXR5LmdldEFjdGlvbigpCi0JCQkJJiYgZ2V0TGFiZWwoKS5lcXVhbHMoYWN0aXZpdHkuZ2V0TGFiZWwoKSkKLQkJCQkmJiBnZXRTdGF0dXMoKSA9PSBhY3Rpdml0eS5nZXRTdGF0dXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0NvbmZpZ3VyYXRpb25Qb2xpY3kuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQ29uZmlndXJhdGlvblBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDdlNDgyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQ29uZmlndXJhdGlvblBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC4qOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblBvbGljeSBleHRlbmRzIENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ29uZmlndXJhdGlvblBvbGljeU1vZGVsLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uUG9saWN5KCkgewotCX0KLQotCS8qKgotCSAqIENvcHkgQ29uc3RydWN0b3IgZm9yIENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbC4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblBvbGljeShDb25maWd1cmF0aW9uUG9saWN5IGNvbmZpZ1BvbGljeSkgewotCQlzdXBlcigpOwotCQlzZXRQb2xpY3koY29uZmlnUG9saWN5LmdldFBvbGljeSgpKTsKLQkJc2V0Q29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzKGNvbmZpZ1BvbGljeS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKSk7Ci0JCXNldFVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzKGNvbmZpZ1BvbGljeS5nZXRVbmNvbmZpZ3VyZWRGZWF0dXJlcygpKTsKLQkJc2V0Q29uZmlndXJlZFNpdGVNb2RlbChjb25maWdQb2xpY3kuZ2V0Q29uZmlndXJlZFNpdGVNb2RlbCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVW5jb25maWd1cmVkKElGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWZlcmVuY2UpIHsKLQotCQlpZiAoZmVhdHVyZVJlZmVyZW5jZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgZmVhdHVyZSBpcyBwYXJ0IG9mIHRoZSBjb25maWd1cmVkIGxpc3QKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0gZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmVhdHVyZVJlZmVyZW5jZS5lcXVhbHMocmVmc1tpXSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29uZmlndXJlZChJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmZXJlbmNlKSB7Ci0KLQkJaWYgKGZlYXR1cmVSZWZlcmVuY2UgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyByZXR1cm5zIHRydWUgaWYgdGhlIGZlYXR1cmUgaXMgcGFydCBvZiB0aGUgY29uZmlndXJlZCBsaXN0Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmZWF0dXJlUmVmZXJlbmNlLmVxdWFscyhyZWZzW2ldKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBhZGRzIHRoZSBmZWF0dXJlIHRvIHRoZSBsaXN0IG9mIGZlYXR1cmVzIGlmIHRoZSBwb2xpY3kgaXMgVVNFUl9JTkNMVURFCi0JICovCi0JcHVibGljIHZvaWQgY29uZmlndXJlKElGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWZlcmVuY2UsIGJvb2xlYW4gY2FsbEluc3RhbGxIYW5kbGVyLCBib29sZWFuIGNyZWF0ZUFjdGl2aXR5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKGlzQ29uZmlndXJlZChmZWF0dXJlUmVmZXJlbmNlKSkgLy8gYWxyZWFkeSBjb25maWd1cmVkCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGZlYXR1cmVSZWZlcmVuY2UgPT0gbnVsbCkgewotCQkJVXBkYXRlQ29yZS53YXJuKCJUaGUgZmVhdHVyZSByZWZlcmVuY2UgdG8gY29uZmlndXJlIGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSUZlYXR1cmUgZmVhdHVyZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmZWF0dXJlID0gZmVhdHVyZVJlZmVyZW5jZS5nZXRGZWF0dXJlKG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWlmICghVXBkYXRlTWFuYWdlclV0aWxzLmlzT3B0aW9uYWwoZmVhdHVyZVJlZmVyZW5jZSkpIHsKLQkJCQlVUkwgdXJsID0gZmVhdHVyZVJlZmVyZW5jZS5nZXRVUkwoKTsKLQkJCQlTdHJpbmcgdXJsU3RyaW5nID0gKHVybCAhPSBudWxsKSA/IHVybC50b0V4dGVybmFsRm9ybSgpIDogIjxubyBmZWF0dXJlIHJlZmVyZW5jZSB1cmw+IjsgLy8kTk9OLU5MUy0xJAotCQkJCVVwZGF0ZUNvcmUud2FybigiRXJyb3IgcmV0cmlldmluZyBmZWF0dXJlOiIgKyB1cmxTdHJpbmcsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCVVSTCB1cmwgPSBmZWF0dXJlUmVmZXJlbmNlLmdldFVSTCgpOwotCQkJU3RyaW5nIHVybFN0cmluZyA9ICh1cmwgIT0gbnVsbCkgPyB1cmwudG9FeHRlcm5hbEZvcm0oKSA6ICI8bm8gZmVhdHVyZSByZWZlcmVuY2UgdXJsPiI7IC8vJE5PTi1OTFMtMSQKLQkJCVVwZGF0ZUNvcmUud2FybigiVGhlIGZlYXR1cmUgdG8gdW5jb25maWd1cmUgaXMgbnVsbDogZmVhdHVyZSByZWZlcmVuY2UgaXM6IiArIHVybFN0cmluZyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIFNldHVwIG9wdGlvbmFsIGluc3RhbGwgaGFuZGxlcgotCQlJbnN0YWxsSGFuZGxlclByb3h5IGhhbmRsZXIgPSBudWxsOwotCQlpZiAoY2FsbEluc3RhbGxIYW5kbGVyICYmIGZlYXR1cmUuZ2V0SW5zdGFsbEhhbmRsZXJFbnRyeSgpICE9IG51bGwpCi0JCQloYW5kbGVyID0gbmV3IEluc3RhbGxIYW5kbGVyUHJveHkoSUluc3RhbGxIYW5kbGVyLkhBTkRMRVJfQUNUSU9OX0NPTkZJR1VSRSwgZmVhdHVyZSwgZmVhdHVyZS5nZXRJbnN0YWxsSGFuZGxlckVudHJ5KCksIG51bGwpOwotCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLQkJVGhyb3dhYmxlIG9yaWdpbmFsRXhjZXB0aW9uID0gbnVsbDsKLQotCQkvLyBkbyB0aGUgY29uZmlndXJlIGFjdGlvbgotCQl0cnkgewotCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkKLQkJCQloYW5kbGVyLmNvbmZpZ3VyZUluaXRpYXRlZCgpOwotCi0JCQlDb25maWd1cmF0aW9uQWN0aXZpdHkgYWN0aXZpdHkgPSBudWxsOwotCQkJaWYgKGNyZWF0ZUFjdGl2aXR5KSB7Ci0JCQkJYWN0aXZpdHkgPSBuZXcgQ29uZmlndXJhdGlvbkFjdGl2aXR5KElBY3Rpdml0eS5BQ1RJT05fQ09ORklHVVJFKTsKLQkJCQlhY3Rpdml0eS5zZXRMYWJlbChmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJCQlhY3Rpdml0eS5zZXREYXRlKG5ldyBEYXRlKCkpOwotCQkJfQotCi0JCQlhZGRDb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZSgoRmVhdHVyZVJlZmVyZW5jZU1vZGVsKSBmZWF0dXJlUmVmZXJlbmNlKTsKLQotCQkJLy8gZXZlcnl0aGluZyBkb25lIG9rCi0JCQlpZiAoYWN0aXZpdHkgIT0gbnVsbCkgewotCQkJCUluc3RhbGxDb25maWd1cmF0aW9uIGluc3RhbGxDb25maWcgPSAoSW5zdGFsbENvbmZpZ3VyYXRpb24pIFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCQkJYWN0aXZpdHkuc2V0U3RhdHVzKElBY3Rpdml0eS5TVEFUVVNfT0spOwotCQkJCWluc3RhbGxDb25maWcuYWRkQWN0aXZpdHkoYWN0aXZpdHkpOwotCQkJfQotCi0JCQlpZiAoaGFuZGxlciAhPSBudWxsKQotCQkJCWhhbmRsZXIuY29tcGxldGVDb25maWd1cmUoKTsKLQotCQkJc3VjY2VzcyA9IHRydWU7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlvcmlnaW5hbEV4Y2VwdGlvbiA9IHQ7Ci0JCX0gZmluYWxseSB7Ci0JCQlUaHJvd2FibGUgbmV3RXhjZXB0aW9uID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkKLQkJCQkJaGFuZGxlci5jb25maWd1cmVDb21wbGV0ZWQoc3VjY2Vzcyk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCW5ld0V4Y2VwdGlvbiA9IHQ7Ci0JCQl9Ci0JCQlpZiAob3JpZ2luYWxFeGNlcHRpb24gIT0gbnVsbCkgLy8gb3JpZ2luYWwgZXhjZXB0aW9uIHdpbnMKLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsSGFuZGxlcl9lcnJvciwgKG5ldyBTdHJpbmdbXSB7IGZlYXR1cmUuZ2V0TGFiZWwoKSB9KSksIG9yaWdpbmFsRXhjZXB0aW9uKTsKLQkJCWlmIChuZXdFeGNlcHRpb24gIT0gbnVsbCkKLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsSGFuZGxlcl9lcnJvciwgKG5ldyBTdHJpbmdbXSB7IGZlYXR1cmUuZ2V0TGFiZWwoKSB9KSksIG5ld0V4Y2VwdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgcGx1Z2lucyB0byB1bmNvbmZpZ3VyZSBhcmUgcmVxdWlyZWQgYnkgb3RoZXIgY29uZmlndXJlZCBmZWF0dXJlIGFuZAotCSAqIGFkZHMgdGhlIGZlYXR1cmUgdG8gdGhlIGxpc3Qgb2YgdW5jb25maWd1cmVkIGZlYXR1cmVzIAotCSAqLwotCXB1YmxpYyBib29sZWFuIHVuY29uZmlndXJlKElGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWZlcmVuY2UsIGJvb2xlYW4gY2FsbEluc3RhbGxIYW5kbGVyLCBib29sZWFuIGNyZWF0ZUFjdGl2aXR5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKGlzVW5jb25maWd1cmVkKGZlYXR1cmVSZWZlcmVuY2UpKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIkZlYXR1cmUgYWxyZWFkeSB1bmNvbmZpZ3VyZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlpZiAoZmVhdHVyZVJlZmVyZW5jZSA9PSBudWxsKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIlRoZSBmZWF0dXJlIHJlZmVyZW5jZSB0byB1bmNvbmZpZ3VyZSBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUlGZWF0dXJlIGZlYXR1cmUgPSBudWxsOwotCQl0cnkgewotCQkJZmVhdHVyZSA9IGZlYXR1cmVSZWZlcmVuY2UuZ2V0RmVhdHVyZShudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoIVVwZGF0ZU1hbmFnZXJVdGlscy5pc09wdGlvbmFsKGZlYXR1cmVSZWZlcmVuY2UpKSB7Ci0JCQkJVVJMIHVybCA9IGZlYXR1cmVSZWZlcmVuY2UuZ2V0VVJMKCk7Ci0JCQkJU3RyaW5nIHVybFN0cmluZyA9ICh1cmwgIT0gbnVsbCkgPyB1cmwudG9FeHRlcm5hbEZvcm0oKSA6ICI8bm8gZmVhdHVyZSByZWZlcmVuY2UgdXJsPiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlVcGRhdGVDb3JlLndhcm4oIkVycm9yIHJldHJpZXZpbmcgZmVhdHVyZToiICsgdXJsU3RyaW5nLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCVVSTCB1cmwgPSBmZWF0dXJlUmVmZXJlbmNlLmdldFVSTCgpOwotCQkJU3RyaW5nIHVybFN0cmluZyA9ICh1cmwgIT0gbnVsbCkgPyB1cmwudG9FeHRlcm5hbEZvcm0oKSA6ICI8bm8gZmVhdHVyZSByZWZlcmVuY2UgdXJsPiI7IC8vJE5PTi1OTFMtMSQKLQkJCVVwZGF0ZUNvcmUud2FybigiVGhlIGZlYXR1cmUgdG8gdW5jb25maWd1cmUgaXMgbnVsbDogZmVhdHVyZSByZWZlcmVuY2UgaXM6IiArIHVybFN0cmluZyk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIFNldHVwIG9wdGlvbmFsIGluc3RhbGwgaGFuZGxlcgotCQlJbnN0YWxsSGFuZGxlclByb3h5IGhhbmRsZXIgPSBudWxsOwotCQlpZiAoY2FsbEluc3RhbGxIYW5kbGVyICYmIGZlYXR1cmUuZ2V0SW5zdGFsbEhhbmRsZXJFbnRyeSgpICE9IG51bGwpIHsKLQkJCWhhbmRsZXIgPSBuZXcgSW5zdGFsbEhhbmRsZXJQcm94eShJSW5zdGFsbEhhbmRsZXIuSEFORExFUl9BQ1RJT05fVU5DT05GSUdVUkUsIGZlYXR1cmUsIGZlYXR1cmUuZ2V0SW5zdGFsbEhhbmRsZXJFbnRyeSgpLCBudWxsKTsKLQkJfQotCi0JCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCQlUaHJvd2FibGUgb3JpZ2luYWxFeGNlcHRpb24gPSBudWxsOwotCi0JCS8vIGRvIHRoZSB1bmNvbmZpZ3VyZSBhY3Rpb24KLQkJdHJ5IHsKLQotCQkJQ29uZmlndXJhdGlvbkFjdGl2aXR5IGFjdGl2aXR5ID0gbnVsbDsKLQkJCWlmIChjcmVhdGVBY3Rpdml0eSkgewotCQkJCWFjdGl2aXR5ID0gbmV3IENvbmZpZ3VyYXRpb25BY3Rpdml0eShJQWN0aXZpdHkuQUNUSU9OX1VOQ09ORklHVVJFKTsKLQkJCQlhY3Rpdml0eS5zZXRMYWJlbChmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJCQlhY3Rpdml0eS5zZXREYXRlKG5ldyBEYXRlKCkpOwotCQkJfQotCi0JCQlJbnN0YWxsQ29uZmlndXJhdGlvbiBpbnN0YWxsQ29uZmlnID0gbnVsbDsKLQotCQkJLy8gb25seSBhc2sgZm9yIGluc3RhbGwgY29uZmlnIGlzIGFjdGl2aXR5IGNyZWF0ZWQuCi0JCQkvLyBwcmV2ZW50cyBsb29wcyBkdXJpbmcgcmVjb25jaWxpYXRpb24KLQkJCWlmIChhY3Rpdml0eSAhPSBudWxsKQotCQkJCWluc3RhbGxDb25maWcgPSAoKEluc3RhbGxDb25maWd1cmF0aW9uKSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpKTsKLQotCQkJLy8gQWxsb3cgdW5jb25maWd1cmUgaWYgdGhlIGZlYXR1cmUgaXMgb3B0aW9uYWwgZnJvbSBhbGwgdGhlIHBhcmVudHMKLQkJCS8vIG9yIGlmIHRoZSBmZWF0dXJlIGlzIG1hbmRhdG9yeSBhbmQgbm9uIG9mIGl0cyBwYXJlbnQgYXJlIGNvbmZpZ3VyZWQKLQkJCS8vIHJlbW92ZWQsIG5vdCBhIGNvcmUgaXNzdWUgKHNvIGRlZXAgZG93bikKLQkJCS8vaWYgKHZhbGlkYXRlTm9Db25maWd1cmVkUGFyZW50cyhmZWF0dXJlKSkgewotCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkKLQkJCQloYW5kbGVyLnVuY29uZmlndXJlSW5pdGlhdGVkKCk7Ci0JCQlhZGRVbmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlKChGZWF0dXJlUmVmZXJlbmNlTW9kZWwpIGZlYXR1cmVSZWZlcmVuY2UpOwotCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkKLQkJCQloYW5kbGVyLmNvbXBsZXRlVW5jb25maWd1cmUoKTsKLQotCQkJLy8gZXZlcnl0aGluZyBkb25lIG9rCi0JCQlpZiAoYWN0aXZpdHkgIT0gbnVsbCkgewotCQkJCWFjdGl2aXR5LnNldFN0YXR1cyhJQWN0aXZpdHkuU1RBVFVTX09LKTsKLQkJCQlpbnN0YWxsQ29uZmlnLmFkZEFjdGl2aXR5KGFjdGl2aXR5KTsKLQkJCX0KLQkJCXN1Y2Nlc3MgPSB0cnVlOwotCQkJLy99IGVsc2UgewotCQkJLy8JaWYgKGFjdGl2aXR5ICE9IG51bGwpIHsKLQkJCS8vCQlhY3Rpdml0eS5zZXRTdGF0dXMoSUFjdGl2aXR5LlNUQVRVU19OT0spOwotCQkJLy8JCWluc3RhbGxDb25maWcuYWRkQWN0aXZpdHlNb2RlbCgoQ29uZmlndXJhdGlvbkFjdGl2aXR5TW9kZWwpIGFjdGl2aXR5KTsKLQkJCS8vCX0KLQkJCS8vfQotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJb3JpZ2luYWxFeGNlcHRpb24gPSB0OwotCQl9IGZpbmFsbHkgewotCQkJVGhyb3dhYmxlIG5ld0V4Y2VwdGlvbiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWlmIChoYW5kbGVyICE9IG51bGwpCi0JCQkJCWhhbmRsZXIudW5jb25maWd1cmVDb21wbGV0ZWQoc3VjY2Vzcyk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCW5ld0V4Y2VwdGlvbiA9IHQ7Ci0JCQl9Ci0JCQlpZiAob3JpZ2luYWxFeGNlcHRpb24gIT0gbnVsbCkgLy8gb3JpZ2luYWwgZXhjZXB0aW9uIHdpbnMKLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsSGFuZGxlcl9lcnJvciwgKG5ldyBTdHJpbmdbXSB7IGZlYXR1cmUuZ2V0TGFiZWwoKSB9KSksIG9yaWdpbmFsRXhjZXB0aW9uKTsKLQkJCWlmIChuZXdFeGNlcHRpb24gIT0gbnVsbCkKLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsSGFuZGxlcl9lcnJvciwgKG5ldyBTdHJpbmdbXSB7IGZlYXR1cmUuZ2V0TGFiZWwoKSB9KSksIG5ld0V4Y2VwdGlvbik7Ci0JCX0KLQotCQlpZiAoIXN1Y2Nlc3MpIHsKLQkJCVVSTCB1cmwgPSBmZWF0dXJlUmVmZXJlbmNlLmdldFVSTCgpOwotCQkJU3RyaW5nIHVybFN0cmluZyA9ICh1cmwgIT0gbnVsbCkgPyB1cmwudG9FeHRlcm5hbEZvcm0oKSA6ICI8bm8gZmVhdHVyZSByZWZlcmVuY2UgdXJsPiI7IC8vJE5PTi1OTFMtMSQKLQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIHVuY29uZmlndXJlOiIgKyB1cmxTdHJpbmcpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlcyB0aGUgcGx1Z2luIGxpc3QgZm9yIHRoZSBwb2xpY3kuIEZvciAiSU5DTFVERSIgcG9saWN5LCB0aGlzCi0JICogY29ycmVzcG9uZHMgdG8gdGhlIHBsdWdpbnMgZm9yIGNvbmZpZ3VyZWQgZmVhdHVyZXMuIEZvciAiRVhDTFVERSIKLQkgKiBwb2xpY3ksIHRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIHBsdWdpbnMgZm9yIHVuY29uZmlndXJlZCBmZWF0dXJlcyB0aGF0Ci0JICogYXJlIG5vdCByZWZlcmVuY2VkIGJ5IGFueSBjb25maWd1cmVkIGZlYXR1cmVzLgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRQbHVnaW5QYXRoKElTaXRlIHNpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyB3ZSBtYXkgbmVlZCB0byBleGNsdWRlIHBhdGNoZWQgcGx1Z2lucyBoZXJlLCBidXQgdGhpcyBzaG91bGQgYmUgZ29vZCBlbm91Z2ggZm9yIG5vdwotCQlpZiAoZ2V0UG9saWN5KCkgPT0gSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeS5NQU5BR0VEX09OTFkpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJCQotCQlTdHJpbmdbXSBwbHVnaW5QYXRoczsKLQkJLy8gTm90ZTogU2luY2UgMy4wTTcgd2UgbGVhdmUgcGF0Y2hlZCBmZWF0dXJlcyBjb25maWd1cmVkLAotCQkvLyBhbmQgdGFrZSB0aGlzIGludG8gYWNjb3VudCB3aGVuIGNvbXB1dGluZyBjb25maWd1cmVkIHBsdWdpbnMKLQkJLy8gYWxsIHVuY29uZmlndXJlZCBmZWF0dXJlcy4gTm90ZSB0aGF0IHBhdGNoZWQgZmVhdHVyZXMgYXJlIHN0aWxsCi0JCS8vIGNvbmZpZ3VyZWQKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSB1bmNvbmZpZ3VyZWRGZWF0dXJlcyA9IGdldFVuY29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCS8vIGFsbCBjb25maWd1cmVkIGZlYXR1cmVzLCBpbmNsdWRpbmcgcGF0Y2hlcyBhbmQgcGF0Y2hlZCBmZWF0dXJlcwotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNvbmZpZ3VyZWRGZWF0dXJlcyA9IGdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlpZiAoIWlzRW5hYmxlZCgpKSB7Ci0JCQlpZiAoZ2V0UG9saWN5KCkgPT0gSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUpIHsKLQkJCQkvLyBkaXNhYmxlZCBzaXRlLCBJTkNMVURFIHBvbGljeQotCQkJCXBsdWdpblBhdGhzID0gbmV3IFN0cmluZ1swXTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gZGlzYWJsZWQgc2l0ZSwgRVhDTFVERSBwb2xpY3kKLQkJCQlwbHVnaW5QYXRocyA9IGdldEFsbEtub3duUGx1Z2luU3RyaW5ncyhzaXRlLAotCQkJCQkJY29uZmlndXJlZEZlYXR1cmVzLCB1bmNvbmZpZ3VyZWRGZWF0dXJlcyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBQYXRjaGVkRmVhdHVyZXMgKG1heSBoYXZlIG5vIHBhdGNoZXMpIHdpdGggY29ycmVzcG9uZGluZyBwYXRjaGVzCi0JCQlQYXRjaGVkRmVhdHVyZVtdIHBhdGNoZWRGZWF0dXJlcyA9IGJ1aWxkUGF0Y2hlZEZlYXR1cmVzKGNvbmZpZ3VyZWRGZWF0dXJlcyk7Ci0JCQlpZiAoZ2V0UG9saWN5KCkgPT0gSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUpIHsKLQkJCQkvLyBlbmFibGVkIHNpdGUsIElOQ0xVREUgcG9saWN5Ci0JCQkJcGx1Z2luUGF0aHMgPSBnZXRDb25maWd1cmVkUGx1Z2luU3RyaW5ncyhzaXRlLCBwYXRjaGVkRmVhdHVyZXMpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBlbmFibGVkIHNpdGUsIEVYQ0xVREUgcG9saWN5IC0gdGhlIHVzdWFsIHNjZW5hcmlvIGZvciBsb2NhbAotCQkJCS8vIHNpdGUuCi0JCQkJLy8gcmV0dXJuIGFsbCBrbm93biBNSU5VUyBjb25maWd1cmVkIHBsdWdpbnMKLQkJCQlwbHVnaW5QYXRocyA9IHN1YnRyYWN0KGdldEFsbEtub3duUGx1Z2luU3RyaW5ncyhzaXRlLAotCQkJCQkJY29uZmlndXJlZEZlYXR1cmVzLCB1bmNvbmZpZ3VyZWRGZWF0dXJlcyksCi0JCQkJCQlnZXRDb25maWd1cmVkUGx1Z2luU3RyaW5ncyhzaXRlLCBwYXRjaGVkRmVhdHVyZXMpKTsKLQkJCX0KLQkJfQotCQkvL1RSQUNFCi0JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19SRUNPTkNJTEVSKSB7Ci0JCQlVcGRhdGVDb3JlCi0JCQkJCS5kZWJ1ZygiR2V0UGx1Z2luUGF0aCBmb3I6ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgKChzaXRlID09IG51bGwpID8gIjxObyBzaXRlPiIgOiBzaXRlLmdldFVSTCgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCS50b1N0cmluZygpKSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpblBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVXBkYXRlQ29yZS5kZWJ1ZygiVG8gd3JpdGU6IiArIHBsdWdpblBhdGhzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBwbHVnaW5QYXRoczsKLQl9Ci0JCi0JLyoqCi0JICogT2J0YWlucyBQYXRjaGVkRmVhdHVyZXMgLSBub24gcGF0Y2ggZmVhdHVyZXMgd2l0aCBjb3JyZXNwb25kaW5nIHBhdGNoZXMgaWYgYW55Ci0JICogCi0JICogQHBhcmFtIGZlYXR1cmVzCi0JICogICAgICAgICAgICBhcnJheSBvZiBmZWF0dXJlcyB0byBvcGVyYXRlIHdpdGgKLQkgKiBAcmV0dXJuIFBhdGNoZXMKLQkgKi8KLQlwcml2YXRlIFBhdGNoZWRGZWF0dXJlW10gYnVpbGRQYXRjaGVkRmVhdHVyZXMoSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcykgewotCQkvLyBQYXRjaGVkRmVhdHVyZXMgYnkgVmVyc2lvbmVkSWRlbnRpZmllcgotCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJLy8gQ3JlYXRlIGEgbWFwIG9mIGZlYXR1cmVzIChub3QgcGF0Y2hlcykKLQkJZm9yIChpbnQgZiA9IDA7IGYgPCBmZWF0dXJlcy5sZW5ndGg7IGYrKykgewotCQkJSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZiA9IGZlYXR1cmVzW2ZdOwotCQkJdHJ5IHsKLQkJCQlpZihmZWF0dXJlUmVmLmlzUGF0Y2goKSl7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpID0gZmVhdHVyZVJlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQkJbWFwLnB1dCh2aSwgbmV3IFBhdGNoZWRGZWF0dXJlKGZlYXR1cmVzW2ZdKSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlVcGRhdGVDb3JlLndhcm4obnVsbCwgZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gYXR0YWNoIHBhdGNoZXMgdG8gZmVhdHVyZXMKLQkJZm9yIChpbnQgZiA9IDA7IGYgPCBmZWF0dXJlcy5sZW5ndGg7IGYrKykgewotCQkJSUZlYXR1cmVSZWZlcmVuY2UgcGF0Y2hDYW5kaWRhdGUgPSBmZWF0dXJlc1tmXTsKLQkJCXRyeSB7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IHBhdGNoQ2FuZGlkYXRlLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJSUltcG9ydFtdIGltcG9ydHMgPSBmZWF0dXJlLmdldEltcG9ydHMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUltcG9ydCBvbmVJbXBvcnQgPSBpbXBvcnRzW2ldOwotCQkJCQlpZiAoIW9uZUltcG9ydC5pc1BhdGNoKCkpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJLy8gaXQgaXMgYSBwYXRjaCBmb3IKLQkJCQkJVmVyc2lvbmVkSWRlbnRpZmllciBwYXRjaGVkSWRlbnRpZmllciA9Ci0JCQkJCQlvbmVJbXBvcnQuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJCQlQYXRjaGVkRmVhdHVyZSBwZj0oUGF0Y2hlZEZlYXR1cmUpIG1hcC5nZXQocGF0Y2hlZElkZW50aWZpZXIpOwotCQkJCQlpZiAocGYhPW51bGwpIHsKLQkJCQkJCXBmLmFkZFBhdGNoKHBhdGNoQ2FuZGlkYXRlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIHBhdGNoZWQgZmVhdHVyZSBub3QgZW5hYmxlZAotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJVXBkYXRlQ29yZS53YXJuKG51bGwsIGUpOwotCQkJfQotCQl9Ci0JCUNvbGxlY3Rpb24gcGF0Y2hlZEZlYXR1cmVzPW1hcC52YWx1ZXMoKTsKLQkJcmV0dXJuIChQYXRjaGVkRmVhdHVyZVtdKXBhdGNoZWRGZWF0dXJlcy50b0FycmF5KG5ldyBQYXRjaGVkRmVhdHVyZVtwYXRjaGVkRmVhdHVyZXMuc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRDb25maWd1cmVkRmVhdHVyZXMoKSB7Ci0JCUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIHJlc3VsdCA9IGdldENvbmZpZ3VyZWRGZWF0dXJlc01vZGVsKCk7Ci0JCWlmIChyZXN1bHQubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbmV3IElGZWF0dXJlUmVmZXJlbmNlWzBdOwotCQllbHNlCi0JCQlyZXR1cm4gKElGZWF0dXJlUmVmZXJlbmNlW10pIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlW10gZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKSB7Ci0JCUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIHJlc3VsdCA9IGdldFVuY29uZmlndXJlZEZlYXR1cmVzTW9kZWwoKTsKLQkJaWYgKHJlc3VsdC5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBuZXcgSUZlYXR1cmVSZWZlcmVuY2VbMF07Ci0JCWVsc2UKLQkJCXJldHVybiAoSUZlYXR1cmVSZWZlcmVuY2VbXSkgcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbmZpZ3VyZWRTaXRlLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIElDb25maWd1cmVkU2l0ZQotCSAqLwotCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgZ2V0Q29uZmlndXJlZFNpdGUoKSB7Ci0JCXJldHVybiAoSUNvbmZpZ3VyZWRTaXRlKSBnZXRDb25maWd1cmVkU2l0ZU1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlcyBhIGZlYXR1cmUgcmVmZXJlbmNlCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRmVhdHVyZVJlZmVyZW5jZShJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmKSB7Ci0JCWlmIChmZWF0dXJlUmVmIGluc3RhbmNlb2YgRmVhdHVyZVJlZmVyZW5jZU1vZGVsKSB7Ci0JCQlyZW1vdmVGZWF0dXJlUmVmZXJlbmNlKChGZWF0dXJlUmVmZXJlbmNlTW9kZWwpIGZlYXR1cmVSZWYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBwbHVnaW4gcGF0aCBmb3IgdGhlIGFycmF5IG9mIGZlYXR1cmUgcmVmZXJlbmNlLiBGb3IKLQkgKiAgICAgICAgIGZlYXR1cmVzIHRoYXQgaGF2ZSBwYXRjaGVzLCBwbHVnaW4gcGF0aCB3aWxsCi0JICogICAgICAgICBwb2ludCB0byBwbHVnaW4gd2l0aCB0aGUgc2FtZSBJRCBwcm92aWRlZCBieSB0aGUgcGF0Y2ggaWYgaXQKLQkgKiAgICAgICAgIGV4aXN0cy4gRWFjaCBwbHVnaW4gcGF0aCBvbmx5IGFwcGVhcnMgb25jZSBbYnVnIDIxNzUwXQotCSAqLwotCXByaXZhdGUgU3RyaW5nW10gZ2V0Q29uZmlndXJlZFBsdWdpblN0cmluZ3MoSVNpdGUgc2l0ZSwgUGF0Y2hlZEZlYXR1cmVbXSBmZWF0dXJlcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfQ09ORklHVVJBVElPTil7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIkNPTkZJR1VSRUQgUExVR0lOUyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkKLQkJLy8gVXNlIHNldCB0byBlbGltaW5hdGUgcGx1Z2lucyB3aXRoIHNhbWUgSUQgYW5kIHZlcnNpb24uCi0JCS8vIERpZmZlcmVudCB2ZXJzaW9ucyBvZiBwbHVnaW5zIHdpdGggc2FtZSBJRCBhcmUgYWxsb3dlZCBpZiBjb21pbmcgZnJvbSBkaWZmZXJlbnQgZmVhdHVyZXMKLQkJU2V0IGZlYXR1cmVQbHVnaW5zID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJRmVhdHVyZVBsdWdpbltdIHBsdWdpbnMgPSBmZWF0dXJlc1tpXS5nZXRQbHVnaW5zKCk7Ci0JCQlmZWF0dXJlUGx1Z2lucy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwbHVnaW5zKSk7Ci0JCX0KLQkJU2V0IHBsdWdpblN0cmluZ3MgPSBnZXRQbHVnaW5TdHJpbmdzKHNpdGUsIChGZWF0dXJlUGx1Z2luW10pIGZlYXR1cmVQbHVnaW5zLnRvQXJyYXkobmV3IEZlYXR1cmVQbHVnaW5bZmVhdHVyZVBsdWdpbnMuc2l6ZSgpXSkpOwotCQlyZXR1cm4gKFN0cmluZ1tdKSBwbHVnaW5TdHJpbmdzLnRvQXJyYXkobmV3IFN0cmluZ1twbHVnaW5TdHJpbmdzLnNpemUoKV0pOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHBsdWdpbiBwYXRoIGZvciBldmVyeSBwbHVnaW4gaW4ga25vd24gZmVhdHVyZXMKLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGdldEFsbEtub3duUGx1Z2luU3RyaW5ncyhJU2l0ZSBzaXRlLCBJRmVhdHVyZVJlZmVyZW5jZVtdIGNvbmZpZ3VyZWQsSUZlYXR1cmVSZWZlcmVuY2VbXSB1bmNvbmZpZ3VyZWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0NPTkZJR1VSQVRJT04pewotCQkJVXBkYXRlQ29yZS53YXJuKCJBTEwgUExVR0lOUyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gQWRkIGZlYXR1cmVzLCBwYXRjaGVkIGZlYXR1cmVzLCBvciBwYXRjaGVzCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gYWxsPW5ldyBJRmVhdHVyZVJlZmVyZW5jZVtjb25maWd1cmVkLmxlbmd0aCt1bmNvbmZpZ3VyZWQubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShjb25maWd1cmVkLCAwLCBhbGwsIDAsIGNvbmZpZ3VyZWQubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weSh1bmNvbmZpZ3VyZWQsIDAsIGFsbCwgY29uZmlndXJlZC5sZW5ndGgsIHVuY29uZmlndXJlZC5sZW5ndGgpOwotCQkvLwotCQlTZXQgcGF0Y2hlZFBsdWdpbnMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKGludCBpPTA7IGk8IGFsbC5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gYWxsW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgewotCQkJCQlVcGRhdGVDb3JlLndhcm4oIk51bGwgRmVhdHVyZSIsIG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQkJCS8vIGFkZCBldmVyeSBwbHVnaW4gdG8gdGhlIG1hcAotCQkJCWZvciAoaW50IGVudHIgPSAwOyBlbnRyIDwgZW50cmllcy5sZW5ndGg7IGVudHIrKykgewotCQkJCQlwYXRjaGVkUGx1Z2lucy5hZGQobmV3IEZlYXR1cmVQbHVnaW4oZW50cmllc1tlbnRyXSwgZmVhdHVyZSkpOwotCQkJCX0KLQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJVXBkYXRlQ29yZS53YXJuKG51bGwsIGUpOwotCQkJfQotCQl9Ci0JCVNldCBwbHVnaW5TdHJpbmdzID0gZ2V0UGx1Z2luU3RyaW5ncyhzaXRlLCAgKEZlYXR1cmVQbHVnaW5bXSlwYXRjaGVkUGx1Z2lucy50b0FycmF5KG5ldyBGZWF0dXJlUGx1Z2luW3BhdGNoZWRQbHVnaW5zLnNpemUoKV0pKTsKLQkJcmV0dXJuIChTdHJpbmdbXSkgcGx1Z2luU3RyaW5ncy50b0FycmF5KG5ldyBTdHJpbmdbcGx1Z2luU3RyaW5ncy5zaXplKCldKTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHNpdGUKLQkgKiBAcGFyYW0gcGx1Z2luc1tdCi0JICogQHJldHVybiB2YWxpZCBzdHJpbmcgcG9pbnRpbmcgdG8gcGx1Z2lucyBpbiBnaXZlbiBmZWF0dXJlcwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgU2V0IGdldFBsdWdpblN0cmluZ3MoSVNpdGUgc2l0ZSwgRmVhdHVyZVBsdWdpbltdIHBsdWdpbnMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU2V0IHBsdWdpblN0cmluZ3M9bmV3IEhhc2hTZXQoKTsKLQkJZm9yIChpbnQgaT0wOyBpPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUGx1Z2luRW50cnkgZW50cnkgPSBwbHVnaW5zW2ldLmdldEVudHJ5KCk7Ci0JCQlJRmVhdHVyZSBmZWF0dXJlPXBsdWdpbnNbaV0uZ2V0RmVhdHVyZSgpOwotCi0JCQkvLyBvYnRhaW4gdGhlIHBhdGggb2YgdGhlIHBsdWdpbiBkaXJlY3RvcmllcyBvbiB0aGUgc2l0ZQotCQkJQ29udGVudFJlZmVyZW5jZVtdIGZlYXR1cmVDb250ZW50UmVmZXJlbmNlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZmVhdHVyZUNvbnRlbnRSZWZlcmVuY2UgPSBmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKS5nZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKGVudHJ5LCBudWxsIC8qSVByb2dyZXNzTW9uaXRvciovCi0JCQkJKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsKLQkJCX0KLQotCQkJLy8gdHJhbnNmb3JtIGludG8gYSB2YWxpZCBTdHJpbmcKLQkJCWlmIChmZWF0dXJlQ29udGVudFJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmZWF0dXJlQ29udGVudFJlZmVyZW5jZS5sZW5ndGg7IGorKykgewotCQkJCQlVUkwgdXJsID0gc2l0ZS5nZXRTaXRlQ29udGVudFByb3ZpZGVyKCkuZ2V0QXJjaGl2ZVJlZmVyZW5jZShmZWF0dXJlQ29udGVudFJlZmVyZW5jZVtqXS5nZXRJZGVudGlmaWVyKCkpOwotCQkJCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQkJCS8vIG1ha2UgaXQgcmVsYXRpdmUgdG8gdGhlIHNpdGUKLQkJCQkJCVN0cmluZyBwYXRoID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTEFzU3RyaW5nKHNpdGUuZ2V0VVJMKCksIHVybCk7Ci0JCQkJCQkvLyBhZGQgZW5kICIvIgotCQkJCQkJaWYoIXBhdGguZW5kc1dpdGgoIi5qYXIiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXBhdGggKz0gKHBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpIHx8IHBhdGguZW5kc1dpdGgoIi8iKSkgPyAiIiA6ICIvIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCXBsdWdpblN0cmluZ3MuYWRkKHBhdGgpOwotCQkJCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0NPTkZJR1VSQVRJT04pCi0JCQkJCQkJVXBkYXRlQ29yZS53YXJuKCJBZGQgcGx1Z2luOiAiICsgcGF0aCArICIgdG8gdGhlIGxpc3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBsdWdpblN0cmluZ3M7Ci0JfQotCi0JLyoqCi0JICoJIE9idGFpbnMgc3RyaW5ncyBleGlzdGluZyBpbiB0aGUgYWxsU3RyaW5ncyBhcnJheSwgYnV0IG5vdCBpbiB0aGUgc3RyaW5nc1RvUmVtb3ZlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBzdWJ0cmFjdChTdHJpbmdbXSBhbGxTdHJpbmdzLCBTdHJpbmdbXSBzdHJpbmdzVG9SZW1vdmUpIHsKLQkJSGFzaFNldCByZXN1bHRMaXN0ID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChhbGxTdHJpbmdzKSk7Ci0JCXJlc3VsdExpc3QucmVtb3ZlQWxsKEFycmF5cy5hc0xpc3Qoc3RyaW5nc1RvUmVtb3ZlKSk7Ci0JCXJldHVybiAoU3RyaW5nW10pcmVzdWx0TGlzdC50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0TGlzdC5zaXplKCldKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0NvbmZpZ3VyZWRTaXRlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0NvbmZpZ3VyZWRTaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNTkyNzAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Db25maWd1cmVkU2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydHlSZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUluc3RhbGxDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklQcm9ibGVtSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLkNvbmZpZ3VyYXRvclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuSVBsYXRmb3JtQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklQbHVnaW5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZUZlYXR1cmVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVZlcmlmaWNhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5WZXJzaW9uZWRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkluc3RhbGxBYm9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC5Db25maWd1cmVkU2l0ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZVV0aWxzOwotCi0vKioKLSAqIEEgQ29uZmlndXJlZCBzaXRlIG1hbmFnZXMgdGhlIENvbmZpZ3VyZWQgYW5kIHVuY29uZmlndXJlZCBmZWF0dXJlcyBvZiBhIFNpdGUKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyZWRTaXRlIGV4dGVuZHMgQ29uZmlndXJlZFNpdGVNb2RlbCBpbXBsZW1lbnRzIElDb25maWd1cmVkU2l0ZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9TSVRFX01BUktFUiA9ICIuZWNsaXBzZXByb2R1Y3QiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9TSVRFX01BUktFUiA9ICIuZWNsaXBzZWV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGxpc3RlbmVycwkKLQlwcml2YXRlIExpc3RlbmVyTGlzdCBsaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KExpc3RlbmVyTGlzdC5JREVOVElUWSk7Ci0KLQkvLyB2ZXJpZmljYXRpb24gc3RhdHVzCi0JcHJpdmF0ZSBJU3RhdHVzIHZlcmlmeVN0YXR1czsKLQotCS8vIHRyYW5zaWVudDogdHJ1ZSBpZiB0aGUgc2l0ZSB3YXMganVzdCBjcmVhdGVkIHNvIHdlIGNhbiByZW1vdmUgaXQKLQlwcml2YXRlIHRyYW5zaWVudCBib29sZWFuIGp1c3RDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKgotCSAqIERlZmF1bHQgQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJlZFNpdGUoKSB7Ci0JfQotCi0JLyoKLQkgKiBDb3B5IENvbnN0cnVjdG9yCi0JICogQXMgb2Ygbm93LCBjb25maWdTaXRlIGNhbiBvbmx5IGJlIG9mIHR5cGUgQ29uZmlndXJlZFNpdGUKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJlZFNpdGUoSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUpIHsKLQkJQ29uZmlndXJlZFNpdGUgY1NpdGUgPSAoQ29uZmlndXJlZFNpdGUpIGNvbmZpZ1NpdGU7Ci0JCXNldFNpdGVNb2RlbChjU2l0ZS5nZXRTaXRlTW9kZWwoKSk7Ci0JCXNldENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbChuZXcgQ29uZmlndXJhdGlvblBvbGljeShjU2l0ZS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCkpKTsKLQkJc2V0VXBkYXRhYmxlKGNTaXRlLmlzVXBkYXRhYmxlKCkpOwotCQlzZXRFbmFibGVkKGNTaXRlLmlzRW5hYmxlZCgpKTsKLQkJc2V0UHJldmlvdXNQbHVnaW5QYXRoKGNTaXRlLmdldFByZXZpb3VzUGx1Z2luUGF0aCgpKTsKLQkJc2V0UGxhdGZvcm1VUkxTdHJpbmcoY1NpdGUuZ2V0UGxhdGZvcm1VUkxTdHJpbmcoKSk7Ci0JfQotCi0JLyoKLQkgKiAgQWRkcyBhIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIoSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCS8qCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIoSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qCi0JICogQHNlZSBJQ29uZmlndXJlZFNpdGUjaW5zdGFsbChJRmVhdHVyZSxJVmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGwoSUZlYXR1cmUgZmVhdHVyZSwgSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWNhdGlvbkxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBpbnN0YWxsKGZlYXR1cmUsIG51bGwsIHZlcmlmaWNhdGlvbkxpc3RlbmVyLCBtb25pdG9yKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUNvbmZpZ3VyZWRTaXRlI2luc3RhbGwoSUZlYXR1cmUsIElGZWF0dXJlUmVmZXJlbmNlLCBJVmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGwoSUZlYXR1cmUgZmVhdHVyZSwgSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbEZlYXR1cmVzLCBJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQkvLyBjaGFuZ2UgdGhlIHN0YXR1cyBpZiBqdXN0Q3JlYXRlZAotCQlpZiAoanVzdENyZWF0ZWQpIGp1c3RDcmVhdGVkPWZhbHNlOwotCi0JCS8vIENvbmZpZ1NpdGUgaXMgcmVhZCBvbmx5IAotCQlpZiAoIWlzVXBkYXRhYmxlKCkpIHsKLQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBOTFMuYmluZChNZXNzYWdlcy5Db25maWd1cmVkU2l0ZV9Ob25JbnN0YWxsYWJsZVNpdGUsIChuZXcgU3RyaW5nW10geyBnZXRTaXRlKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSB9KSk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IHZlcmlmeVVwZGF0YWJsZVN0YXR1cygpOwotCQkJaWYgKHN0YXR1cyAhPSBudWxsKQotCQkJCWVycm9yTWVzc2FnZSArPSAiICIgKyBzdGF0dXMuZ2V0TWVzc2FnZSgpOyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihlcnJvck1lc3NhZ2UsIG51bGwpOwotCQl9Ci0KLQkJLy8gZmVhdHVyZSBpcyBudWxsCi0JCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBNZXNzYWdlcy5Db25maWd1cmVkU2l0ZV9OdWxsRmVhdHVyZVRvSW5zdGFsbDsgCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihlcnJvck1lc3NhZ2UsIG51bGwpOwotCQl9Ci0KLQkJLy8gZmVhdHVyZSByZWZlcmVuY2UgdG8gcmV0dXJuCi0JCUlGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGxlZEZlYXR1cmVSZWY7Ci0JCUlGZWF0dXJlIGluc3RhbGxlZEZlYXR1cmUgPSBudWxsOwotCi0JCS8vIGNyZWF0ZSB0aGUgQWN0aXZpdHkgKElOU1RBTEwpCi0JCUNvbmZpZ3VyYXRpb25BY3Rpdml0eSBhY3Rpdml0eSA9IG5ldyBDb25maWd1cmF0aW9uQWN0aXZpdHkoSUFjdGl2aXR5LkFDVElPTl9GRUFUVVJFX0lOU1RBTEwpOwotCQlhY3Rpdml0eS5zZXRMYWJlbChmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJYWN0aXZpdHkuc2V0RGF0ZShuZXcgRGF0ZSgpKTsKLQotCQl0cnkgewotCQkJaW5zdGFsbGVkRmVhdHVyZVJlZiA9IGdldFNpdGUoKS5pbnN0YWxsKGZlYXR1cmUsIG9wdGlvbmFsRmVhdHVyZXMsIHZlcmlmaWNhdGlvbkxpc3RlbmVyLCBtb25pdG9yKTsKLQotCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0lOU1RBTEwpIHsKLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJTdWNlc3NmdWxseSBpbnN0YWxsZWQ6ICIgKyBpbnN0YWxsZWRGZWF0dXJlUmVmLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmIChpbnN0YWxsZWRGZWF0dXJlUmVmICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbnN0YWxsZWRGZWF0dXJlID0gaW5zdGFsbGVkRmVhdHVyZVJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlVcGRhdGVDb3JlLndhcm4obnVsbCwgZSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBldmVyeXRoaW5nIGRvbmUgb2sKLQkJCWFjdGl2aXR5LnNldFN0YXR1cyhJQWN0aXZpdHkuU1RBVFVTX09LKTsKLQotCQkJLy8gbm90aWZ5IGxpc3RlbmVycwotCQkJT2JqZWN0W10gc2l0ZUxpc3RlbmVycyA9IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZUxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpbnN0YWxsZWRGZWF0dXJlICE9IG51bGwpIHsKLQkJCQkJSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKChJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIpIHNpdGVMaXN0ZW5lcnNbaV0pOwotCQkJCQlsaXN0ZW5lci5mZWF0dXJlSW5zdGFsbGVkKGluc3RhbGxlZEZlYXR1cmUpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBub3Qgb2ssIHNldCBBY3Rpdml0eSBzdGF0dXMKLQkJCWFjdGl2aXR5LnNldFN0YXR1cyhJQWN0aXZpdHkuU1RBVFVTX05PSyk7Ci0JCQl0aHJvdyBlOwotCQl9IGZpbmFsbHkgewotCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGN1cnJlbnQgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQkJKChJbnN0YWxsQ29uZmlndXJhdGlvbikgY3VycmVudCkuYWRkQWN0aXZpdHkoYWN0aXZpdHkpOwotCQl9Ci0JCS8vIGNhbGwgdGhlIGNvbmZpZ3VyZSB0YXNrCQotCQlpZiAoaW5zdGFsbGVkRmVhdHVyZSAhPSBudWxsKQotCQkJY29uZmlndXJlKGluc3RhbGxlZEZlYXR1cmUsIG9wdGlvbmFsRmVhdHVyZXMsIHRydWUpOwotCQkvKmNhbGxJbnN0YWxsSGFuZGxlciovCi0KLQkJcmV0dXJuIGluc3RhbGxlZEZlYXR1cmVSZWY7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElDb25maWd1cmVkU2l0ZSNyZW1vdmUoSUZlYXR1cmUsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKElGZWF0dXJlIGZlYXR1cmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCS8vIENvbmZpZ1NpdGUgaXMgcmVhZCBvbmx5Ci0JCWlmICghaXNVcGRhdGFibGUoKSkgewotCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLkNvbmZpZ3VyZWRTaXRlX05vblVuaW5zdGFsbGFibGVTaXRlLCAobmV3IFN0cmluZ1tdIHsgZ2V0U2l0ZSgpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkgfSkpOwotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oZXJyb3JNZXNzYWdlLCBudWxsKTsKLQkJfQotCi0JCS8vIGNyZWF0ZSB0aGUgQWN0aXZpdHkKLQkJQ29uZmlndXJhdGlvbkFjdGl2aXR5IGFjdGl2aXR5ID0gbmV3IENvbmZpZ3VyYXRpb25BY3Rpdml0eShJQWN0aXZpdHkuQUNUSU9OX0ZFQVRVUkVfUkVNT1ZFKTsKLQkJYWN0aXZpdHkuc2V0TGFiZWwoZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCWFjdGl2aXR5LnNldERhdGUobmV3IERhdGUoKSk7Ci0KLQkJdHJ5IHsKLQkJCUlGZWF0dXJlUmVmZXJlbmNlIHJlZmVyZW5jZVRvUmVtb3ZlID0gbnVsbDsKLQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVSZWYgPSBnZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBnZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZShmZWF0dXJlKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZVJlZi5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmZWF0dXJlUmVmW2ldLmVxdWFscyhyZWYpKSB7Ci0JCQkJCXJlZmVyZW5jZVRvUmVtb3ZlID0gZmVhdHVyZVJlZltpXTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyB3ZSBmb3VuZCBhIGZlYXR1cmUgcmVmZXJlbmNlIG9uIHRoZSBzaXRlIG1hdGNoaW5nIHRoZSBmZWF0dXJlCQkJCi0JCQlpZiAocmVmZXJlbmNlVG9SZW1vdmUgIT0gbnVsbCkgewotCQkJCS8vIENoZWNrIGlmIGZlYXR1cmUgaXMgdW5jb25maWd1cmVkIGJlZm9yZSB3ZSByZW1vdmUgaXQKLQkJCQkvLyBvdXIgVUkgd2lsbCBjaGVjay4KLQkJCQkvLyBGb3Igbm9uLVVJIGFwcGxpY2F0aW9uLCB0aHJvdyBlcnJvciBpcyBmZWF0dXJlIGlzIGNvbmZpZ3VyZWQKLQkJCQlpZiAoZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpLmlzQ29uZmlndXJlZChyZWZlcmVuY2VUb1JlbW92ZSkpIHsKLQkJCQkJSUZlYXR1cmUgZmVhdHVyZVRvUmVtb3ZlID0gcmVmZXJlbmNlVG9SZW1vdmUuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJU3RyaW5nIGZlYXR1cmVMYWJlbCA9IChmZWF0dXJlVG9SZW1vdmUgPT0gbnVsbCkgPyBudWxsIDogZmVhdHVyZVRvUmVtb3ZlLmdldExhYmVsKCk7Ci0JCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkNvbmZpZ3VyZWRTaXRlX1VuYWJsZVRvUmVtb3ZlQ29uZmlndXJlZEZlYXR1cmUsIChuZXcgU3RyaW5nW10geyBmZWF0dXJlTGFiZWwgfSkpLCBudWxsKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkNvbmZpZ3VyZWRTaXRlX1VuYWJsZVRvRmluZEZlYXR1cmUsIChuZXcgU3RyaW5nW10geyBmZWF0dXJlLmdldFVSTCgpLnRvU3RyaW5nKCkgfSkpLAotCQkJCW51bGwpOwotCQkJfQotCi0JCQkvLyByZW1vdmUgdGhlIGZlYXR1cmUKLQkJCWdldFNpdGUoKS5yZW1vdmUoZmVhdHVyZSwgbW9uaXRvcik7Ci0JCQlnZXRDb25maWd1cmF0aW9uUG9saWN5KCkucmVtb3ZlRmVhdHVyZVJlZmVyZW5jZShyZWZlcmVuY2VUb1JlbW92ZSk7Ci0JCQkvLyBldmVyeXRoaW5nIGRvbmUgb2sKLQkJCWFjdGl2aXR5LnNldFN0YXR1cyhJQWN0aXZpdHkuU1RBVFVTX09LKTsKLQkJCS8vIG5vdGlmeSBsaXN0ZW5lcnMKLQkJCU9iamVjdFtdIHNpdGVMaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkoKElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcikgc2l0ZUxpc3RlbmVyc1tpXSkuZmVhdHVyZVJlbW92ZWQoZmVhdHVyZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJYWN0aXZpdHkuc2V0U3RhdHVzKElBY3Rpdml0eS5TVEFUVVNfTk9LKTsKLQkJCXRocm93IGU7Ci0JCX0gZmluYWxseSB7Ci0JCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCQkoKEluc3RhbGxDb25maWd1cmF0aW9uKSBjdXJyZW50KS5hZGRBY3Rpdml0eShhY3Rpdml0eSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUNvbmZpZ3VyZWRTaXRlI2NvbmZpZ3VyZShJRmVhdHVyZSkgCi0JICovCi0JcHVibGljIHZvaWQgY29uZmlndXJlKElGZWF0dXJlIGZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJY29uZmlndXJlKGZlYXR1cmUsIG51bGwsIHRydWUgLypjYWxsSW5zdGFsbEhhbmRsZXIqLwotCQkpOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZShJRmVhdHVyZSBmZWF0dXJlLCBJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMsIGJvb2xlYW4gY2FsbEluc3RhbGxIYW5kbGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgewotCQkJVXBkYXRlQ29yZS53YXJuKCJBdHRlbXB0aW5nIHRvIGNvbmZpZ3VyZSBhIG51bGwgZmVhdHVyZSBpbiBzaXRlOiIgKyBnZXRTaXRlKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCUNvbmZpZ3VyYXRpb25Qb2xpY3kgY29uZmlnUG9saWN5ID0gZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpOwotCQlpZiAoY29uZmlnUG9saWN5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gYm90dG9tIHVwIGFwcHJvYWNoLCBzYW1lIGNvbmZpZ3VyZWRTaXRlCi0JCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlblJlZiA9IGZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlpZiAob3B0aW9uYWxGZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQljaGlsZHJlblJlZiA9IGNoaWxkcmVuVG9Db25maWd1cmUoY2hpbGRyZW5SZWYsIG9wdGlvbmFsRmVhdHVyZXMpOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlblJlZi5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlJRmVhdHVyZSBjaGlsZCA9IGNoaWxkcmVuUmVmW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJY29uZmlndXJlKGNoaWxkLCBvcHRpb25hbEZlYXR1cmVzLCBjYWxsSW5zdGFsbEhhbmRsZXIpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWYgbm90IGFuIG9wdGlvbmFsIGZlYXR1cmUsIHRocm93IGV4Y2VwdGlvbgotCQkJCWlmICghY2hpbGRyZW5SZWZbaV0uaXNPcHRpb25hbCgpKSB7Ci0JCQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIGNvbmZpZ3VyZSBjaGlsZCBmZWF0dXJlOiAiICsgY2hpbGRyZW5SZWZbaV0gKyAiICIgKyBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXRocm93IGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gY29uZmlndXJlIHJvb3QgZmVhdHVyZSAJCi0JCUlGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWZlcmVuY2UgPSBnZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZShmZWF0dXJlKTsKLQkJY29uZmlnUG9saWN5LmNvbmZpZ3VyZShmZWF0dXJlUmVmZXJlbmNlLCBjYWxsSW5zdGFsbEhhbmRsZXIsIHRydWUpOwotCi0JCS8vIG5vdGlmeSBsaXN0ZW5lcnMKLQkJT2JqZWN0W10gc2l0ZUxpc3RlbmVycyA9IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkoKElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcikgc2l0ZUxpc3RlbmVyc1tpXSkuZmVhdHVyZUNvbmZpZ3VyZWQoZmVhdHVyZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFJldHVybiB0aGUgb3B0aW9uYWwgY2hpbGRyZW4gdG8gY29uZmlndXJlCi0JICogCi0JICogQHBhcmFtIGNoaWxkcmVuIGFsbCB0aGUgbmVzdGVkIGZlYXR1cmVzCi0JICogQHBhcmFtIG9wdGlvbmFsZmVhdHVyZXMgb3B0aW9uYWwgZmVhdHVyZXMgdG8gaW5zdGFsbAotCSAqIEByZXR1cm4gSUZlYXR1cmVSZWZlcmVuY2VbXQotCSAqLwotCXByaXZhdGUgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuVG9Db25maWd1cmUoSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuLCBJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsZmVhdHVyZXMpIHsKLQotCQlMaXN0IGNoaWxkcmVuVG9JbnN0YWxsID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlIG9wdGlvbmFsRmVhdHVyZVRvQ29uZmlndXJlID0gY2hpbGRyZW5baV07Ci0JCQlpZiAoIW9wdGlvbmFsRmVhdHVyZVRvQ29uZmlndXJlLmlzT3B0aW9uYWwoKSkgewotCQkJCWNoaWxkcmVuVG9JbnN0YWxsLmFkZChvcHRpb25hbEZlYXR1cmVUb0NvbmZpZ3VyZSk7Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgb3B0aW9uYWxmZWF0dXJlcy5sZW5ndGg7IGorKykgewotCQkJCQkvLyBtdXN0IGNvbXBhcmUgZmVhdHVyZSBhcyBvcHRpb25hbEZlYXR1cmVzIGFyZSBmcm9tIHRoZSBpbnN0YWxsIHNpdGUKLQkJCQkJLy8gd2hlcmUgY2hpbGRyZW4gYXJlIG9uIHRoZSBsb2NhbCBzaXRlCi0JCQkJCXRyeSB7Ci0JCQkJCQlJRmVhdHVyZSBpbnN0YWxsZWRDaGlsZHJlbiA9IG9wdGlvbmFsZmVhdHVyZXNbal0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJCWlmIChpbnN0YWxsZWRDaGlsZHJlbi5lcXVhbHMob3B0aW9uYWxGZWF0dXJlVG9Db25maWd1cmUuZ2V0RmVhdHVyZShudWxsKSkpIHsKLQkJCQkJCQljaGlsZHJlblRvSW5zdGFsbC5hZGQob3B0aW9uYWxGZWF0dXJlVG9Db25maWd1cmUpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSByZXN1bHQgPSBuZXcgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtjaGlsZHJlblRvSW5zdGFsbC5zaXplKCldOwotCQlpZiAoY2hpbGRyZW5Ub0luc3RhbGwuc2l6ZSgpID4gMCkgewotCQkJY2hpbGRyZW5Ub0luc3RhbGwudG9BcnJheShyZXN1bHQpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUNvbmZpZ3VyZWRTaXRlI3VuY29uZmlndXJlKElGZWF0dXJlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVuY29uZmlndXJlKElGZWF0dXJlIGZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gdGhlIGZpcnN0IGNhbGwgc291bGQgZGlzYWJsZSB3aXRob3V0IGNoZWNraW5nIGZvciBlbmFibGUgcGFyZW50Ci0JCXJldHVybiB1bmNvbmZpZ3VyZShmZWF0dXJlLCB0cnVlLCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHVuY29uZmlndXJlKElGZWF0dXJlIGZlYXR1cmUsIGJvb2xlYW4gaW5jbHVkZVBhdGNoZXMsIGJvb2xlYW4gdmVyaWZ5RW5hYmxlUGFyZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWZlcmVuY2UgPSBnZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZShmZWF0dXJlKTsKLQotCQlpZiAoZmVhdHVyZVJlZmVyZW5jZSA9PSBudWxsKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byByZXRyaWV2ZSBGZWF0dXJlIFJlZmVyZW5jZSBmb3IgZmVhdHVyZSIgKyBmZWF0dXJlKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJQ29uZmlndXJhdGlvblBvbGljeSBjb25maWdQb2xpY3kgPSBnZXRDb25maWd1cmF0aW9uUG9saWN5KCk7Ci0JCWlmIChjb25maWdQb2xpY3kgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyB2ZXJpZnkgbm8gZW5hYmxlIHBhcmVudAotCQlpZiAodmVyaWZ5RW5hYmxlUGFyZW50ICYmICF2YWxpZGF0ZU5vQ29uZmlndXJlZFBhcmVudHMoZmVhdHVyZSkpIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiVGhlIGZlYXR1cmUgIiArIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpICsgIiB0byBkaXNhYmxlIGlzIG5lZWRlZCBieSBhbm90aGVyIGVuYWJsZSBmZWF0dXJlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJYm9vbGVhbiBzdWNlc3NmdWxseVVuY29uZmlndXJlZCA9IGZhbHNlOwotCQl0cnkgewotCQkJc3VjZXNzZnVsbHlVbmNvbmZpZ3VyZWQgPSBjb25maWdQb2xpY3kudW5jb25maWd1cmUoZmVhdHVyZVJlZmVyZW5jZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVVJMIHVybCA9IGZlYXR1cmVSZWZlcmVuY2UuZ2V0VVJMKCk7Ci0JCQlTdHJpbmcgdXJsU3RyaW5nID0gKHVybCAhPSBudWxsKSA/IHVybC50b0V4dGVybmFsRm9ybSgpIDogIjxubyBmZWF0dXJlIHJlZmVyZW5jZSB1cmw+IjsgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlQ29yZS53YXJuKCJVbmFibGUgdG8gdW5jb25maWd1cmUiICsgdXJsU3RyaW5nLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgZTsKLQkJfQotCQlpZiAoc3VjZXNzZnVsbHlVbmNvbmZpZ3VyZWQpIHsKLQkJCS8vIDIuMC4yOiB1bmNvbmZpZ3VyZSBwYXRjaGVzIHRoYXQgcmVmZXJlbmNlIHRoaXMgZmVhdHVyZS4KLQkJCS8vIEEgcGF0Y2ggaXMgYSBmZWF0dXJlIHRoYXQgY29udGFpbnMgYW4gaW1wb3J0Ci0JCQkvLyBzdGF0ZW1lbnQgd2l0aCBwYXRjaD0idHJ1ZSIgYW5kIGFuIGlkL3ZlcnNpb24KLQkJCS8vIHRoYXQgbWF0Y2hlcyBhbiBhbHJlYWR5IGluc3RhbGxlZCBhbmQgY29uZmlndXJlZAotCQkJLy8gZmVhdHVyZS4gV2hlbiBwYXRjaGVkIGZlYXR1cmUgaXMgdW5jb25maWd1cmVkLAotCQkJLy8gYWxsIHRoZSBwYXRjaGVzIHRoYXQgcmVmZXJlbmNlIGl0IG11c3QgYmUgCi0JCQkvLyB1bmNvbmZpZ3VyZWQgYXMgd2VsbAotCQkJLy8gKGluIGNvbnRyYXN0LCBwYXRjaGVkIGZlYXR1cmVzIGNhbiBiZQotCQkJLy8gY29uZmlndXJlZCB3aXRob3V0IHRoZSBwYXRjaGVzKS4KLQkJCWlmIChpbmNsdWRlUGF0Y2hlcykKLQkJCQl1bmNvbmZpZ3VyZVBhdGNoZXMoZmVhdHVyZSk7Ci0KLQkJCS8vIHRvcCBkb3duIGFwcHJvYWNoLCBzYW1lIGNvbmZpZ3VyZWRTaXRlCi0JCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW5SZWYgPSBmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW5SZWYubGVuZ3RoOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQlJRmVhdHVyZSBjaGlsZCA9IGNoaWxkcmVuUmVmW2ldLmdldEZlYXR1cmUobnVsbCk7IC8vIGRpc2FibGUgdGhlIGV4YWN0IGZlYXR1cmUKLQkJCQkJdW5jb25maWd1cmUoY2hpbGQsIGluY2x1ZGVQYXRjaGVzLCB0cnVlKTsgLy8gY2hlY2sgZm9yIHBhcmVudCBhcyB3ZSBzaG91bGQgYmUgdGhlIG9ubHkgcGFyZW50LgotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBza2lwIGFueSBiYWQgY2hpbGRyZW4KLQkJCQkJVXBkYXRlQ29yZS53YXJuKCJVbmFibGUgdG8gdW5jb25maWd1cmUgY2hpbGQgZmVhdHVyZTogIiArIGNoaWxkcmVuUmVmW2ldICsgIiAiICsgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQotCQkJLy8gbm90aWZ5IGxpc3RlbmVycwotCQkJT2JqZWN0W10gc2l0ZUxpc3RlbmVycyA9IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZUxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCUlDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9ICgoSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyKSBzaXRlTGlzdGVuZXJzW2ldKTsKLQkJCQlsaXN0ZW5lci5mZWF0dXJlVW5jb25maWd1cmVkKGZlYXR1cmUpOwotCQkJfQotCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCVVSTCB1cmwgPSBmZWF0dXJlUmVmZXJlbmNlLmdldFVSTCgpOwotCQkJU3RyaW5nIHVybFN0cmluZyA9ICh1cmwgIT0gbnVsbCkgPyB1cmwudG9FeHRlcm5hbEZvcm0oKSA6ICI8bm8gZmVhdHVyZSByZWZlcmVuY2UgdXJsPiI7IC8vJE5PTi1OTFMtMSQKLQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIHVuY29uZmlndXJlOiIgKyB1cmxTdHJpbmcpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIExvb2sgZm9yIGZlYXR1cmVzIHRoYXQgaGF2ZSBhbiBpbXBvcnQgcmVmZXJlbmNlCi0JICogdGhhdCBwb2ludHMgdG8gdGhpcyBmZWF0dXJlIGFuZCB3aGVyZSBwYXRjaD10cnVlLgotCSAqIFVuY29uZmlndXJlIGFsbCB0aGUgbWF0Y2hpbmcgcGF0Y2hlcywgYnV0Ci0JICogZG8gbm90IGRvIHRoZSBzYW1lIGxvb2t1cCBmb3IgdGhlbQotCSAqIGJlY2F1c2UgcGF0Y2hlcyBjYW5ub3QgaGF2ZSBwYXRjaGVzIHRoZW1zZWx2ZXMuCi0JICovCi0KLQlwcml2YXRlIHZvaWQgdW5jb25maWd1cmVQYXRjaGVzKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmcmVmcyA9IGdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZyZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZSBmcmVmID0gZnJlZnNbaV07Ci0JCQl0cnkgewotCQkJCUlGZWF0dXJlIGNhbmRpZGF0ZSA9IGZyZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQlpZiAoY2FuZGlkYXRlLmVxdWFscyhmZWF0dXJlKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlpZiAoVXBkYXRlVXRpbHMuaXNQYXRjaChmZWF0dXJlLCBjYW5kaWRhdGUpKQotCQkJCQl1bmNvbmZpZ3VyZShjYW5kaWRhdGUsIGZhbHNlLCBmYWxzZSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlVcGRhdGVDb3JlLndhcm4oIiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUNvbmZpZ3VyZWRTaXRlI2dldENvbmZpZ3VyZWRGZWF0dXJlcygpCi0JICovCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlW10gZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCkgewotCQlpZiAoaXNFbmFibGVkKCkpCi0JCQlyZXR1cm4gZ2V0UmF3Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgSVNpdGVGZWF0dXJlUmVmZXJlbmNlWzBdOwotCX0KLQotCS8qCi0JICogQHNlZSBJQ29uZmlndXJlZFNpdGUjZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCkKLQkgKi8KLQlwcml2YXRlIElGZWF0dXJlUmVmZXJlbmNlW10gZ2V0UmF3Q29uZmlndXJlZEZlYXR1cmVzKCkgewotCQlDb25maWd1cmF0aW9uUG9saWN5IGNvbmZpZ1BvbGljeSA9IGdldENvbmZpZ3VyYXRpb25Qb2xpY3koKTsKLQkJaWYgKGNvbmZpZ1BvbGljeSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbMF07Ci0KLQkJcmV0dXJuIGNvbmZpZ1BvbGljeS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQl9Ci0KLQkvKgotCSAqIGFkZHMgY29uZmlndXJlZCBhbmQgdW5jb25maWd1cmVkIGZlYXR1cmUgcmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZVtdIGdldEZlYXR1cmVSZWZlcmVuY2VzKCkgewotCi0JCUNvbmZpZ3VyYXRpb25Qb2xpY3kgY29uZmlnUG9saWN5ID0gZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpOwotCQlpZiAoY29uZmlnUG9saWN5ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElTaXRlRmVhdHVyZVJlZmVyZW5jZVswXTsKLQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNvbmZpZ3VyZWRGZWF0dXJlcyA9IGdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlpbnQgY29uZkxlbiA9IGNvbmZpZ3VyZWRGZWF0dXJlcy5sZW5ndGg7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gdW5jb25maWd1cmVkRmVhdHVyZXMgPSBjb25maWdQb2xpY3kuZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJaW50IHVuY29uZkxlbiA9IHVuY29uZmlndXJlZEZlYXR1cmVzLmxlbmd0aDsKLQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlc3VsdCA9IG5ldyBJRmVhdHVyZVJlZmVyZW5jZVtjb25mTGVuICsgdW5jb25mTGVuXTsKLQkJaWYgKGNvbmZMZW4gPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGNvbmZpZ3VyZWRGZWF0dXJlcywgMCwgcmVzdWx0LCAwLCBjb25mTGVuKTsKLQkJfQotCQlpZiAodW5jb25mTGVuID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weSh1bmNvbmZpZ3VyZWRGZWF0dXJlcywgMCwgcmVzdWx0LCBjb25mTGVuLCB1bmNvbmZMZW4pOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIENvbmZpZ3VyZSBhbmQgdW5jb25maWd1cmUgYXBwcm9wcmlhdGUgZmVhdHVyZSB0bwotCSAqIGJlY29tZSAnbGlrZScgY3VycmVudENvbmZpZ3VyYXRpb24gd2hpY2ggaXMgdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiB0aGUgdXNlciB3YW50cyB0byByZXZlcnQgdG8uCi0JICogCi0JICogQWxsIGZlYXR1cmVzIGZyb20gY3VycmVudENvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIGNvbmZpZ3VyZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXZlcnRUbyhJQ29uZmlndXJlZFNpdGUgb2xkQ29uZmlndXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvYmxlbUhhbmRsZXIgaGFuZGxlcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQotCQlDb25maWd1cmVkU2l0ZSBvbGRDb25maWd1cmVkU2l0ZSA9IChDb25maWd1cmVkU2l0ZSkgb2xkQ29uZmlndXJhdGlvbjsKLQotCQkvLyByZXRyaWV2ZSB0aGUgZmVhdHVyZSB0aGF0IHdlcmUgY29uZmlndXJlZAotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNvbmZpZ3VyZWRGZWF0dXJlcyA9IG9sZENvbmZpZ3VyZWRTaXRlLnZhbGlkQ29uZmlndXJlZEZlYXR1cmVzKGhhbmRsZXIpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJlZEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlnZXRDb25maWd1cmF0aW9uUG9saWN5KCkuY29uZmlndXJlKGNvbmZpZ3VyZWRGZWF0dXJlc1tpXSwgdHJ1ZSwgdHJ1ZSk7Ci0JCX0KLQotCQkvLyBjYWxjdWxhdGUgYWxsIHRoZSBmZWF0dXJlcyB3ZSBoYXZlIHRvIHVuY29uZmlndXJlIGZyb20gdGhlIGN1cnJlbnQgc3RhdGUgdG8gdGhpcyBzdGF0ZQotCQkvLyBpbiB0aGUgaGlzdG9yeS4gCQkJCQotCQlMaXN0IGZlYXR1cmVUb1VuY29uZmlndXJlID0gb2xkQ29uZmlndXJlZFNpdGUuY2FsY3VsYXRlVW5jb25maWd1cmVkRmVhdHVyZXMoY29uZmlndXJlZEZlYXR1cmVzKTsKLQotCQkvLyBmb3IgZWFjaCB1bmNvbmZpZ3VyZWQgZmVhdHVyZSBjaGVjayBpZiBpdCBzdGlsbCBleGlzdHMKLQkJLy8gaWYgc28gYWRkIGFzIHVuY29uZmlndXJlZAotCQlJdGVyYXRvciBpdGVyID0gZmVhdHVyZVRvVW5jb25maWd1cmUuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZSBlbGVtZW50ID0gKElGZWF0dXJlUmVmZXJlbmNlKSBpdGVyLm5leHQoKTsKLQkJCXRyeSB7Ci0JCQkJLy8gZG8gbm90IGxvZyBhY3Rpdml0eQotCQkJCWdldENvbmZpZ3VyYXRpb25Qb2xpY3koKS51bmNvbmZpZ3VyZShlbGVtZW50LCB0cnVlLCB0cnVlKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIGxvZyBubyBmZWF0dXJlIHRvIHVuY29uZmlndXJlCi0JCQkJU3RyaW5nIHVybCA9IGVsZW1lbnQuZ2V0VVJMKCkudG9TdHJpbmcoKTsKLQkJCQlJU2l0ZSBzaXRlID0gZWxlbWVudC5nZXRTaXRlKCk7Ci0JCQkJU3RyaW5nIHNpdGVTdHJpbmcgPSAoc2l0ZSAhPSBudWxsKSA/IHNpdGUuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSA6IE1lc3NhZ2VzLkNvbmZpZ3VyZWRTaXRlX05vU2l0ZTsgCi0JCQkJVXBkYXRlQ29yZS53YXJuKE5MUy5iaW5kKE1lc3NhZ2VzLkNvbmZpZ3VyZWRTaXRlX0Nhbm5vdEZpbmRGZWF0dXJlVG9VbmNvbmZpZ3VyZSwgKG5ldyBTdHJpbmdbXSB7IHVybCwgc2l0ZVN0cmluZyB9KSksIGUpOyAKLQkJCX0KLQkJfQotCQkvL30gLy8gZW5kIFVTRVJfRVhDTFVERQotCX0KLQotCS8qCi0JICogV2UgaGF2ZSB0byBrZWVwIG91ciBjb25maWd1cmVkIGZlYXR1cmUKLQkgKiBjaGVjayBpZiB0aGV5IGFyZSBhbGwgdmFsaWQKLQkgKiBSZXR1cm4gdGhlIHZhbGlkIGNvbmZpZ3VyZWQgZmVhdHVyZXMKLQkgKi8KLQlwcml2YXRlIElGZWF0dXJlUmVmZXJlbmNlW10gdmFsaWRDb25maWd1cmVkRmVhdHVyZXMoSVByb2JsZW1IYW5kbGVyIGhhbmRsZXIpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjb25maWd1cmVkRmVhdHVyZXMgPSBnZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJaWYgKGNvbmZpZ3VyZWRGZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3VyZWRGZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBudWxsOwotCi0JCQkJLy8gYXR0ZW1wdCB0byBhY2Nlc3MgdGhlIGZlYXR1cmUKLQkJCQl0cnkgewotCQkJCQlmZWF0dXJlID0gY29uZmlndXJlZEZlYXR1cmVzW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIG5vdGlmeSB3ZSBjYW5ub3QgZmluZCB0aGUgZmVhdHVyZQotCQkJCQlVcGRhdGVDb3JlLndhcm4obnVsbCwgZSk7Ci0JCQkJCVN0cmluZyBmZWF0dXJlU3RyaW5nID0gY29uZmlndXJlZEZlYXR1cmVzW2ldLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQkJCWlmICghaGFuZGxlci5yZXBvcnRQcm9ibGVtKE5MUy5iaW5kKE1lc3NhZ2VzLkNvbmZpZ3VyZWRTaXRlX0Nhbm5vdEZpbmRGZWF0dXJlVG9Db25maWd1cmUsIChuZXcgU3RyaW5nW10geyBmZWF0dXJlU3RyaW5nIH0pKSkpIHsKLQkJCQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gdmVyaWZ5IGFsbCB0aGUgcGx1Z2lucyBzdGlsbCBleGlzdAotCQkJCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCQkJLy8gZ2V0IHBsdWdpbiBpZGVudGlmaWVyCi0JCQkJCUxpc3Qgc2l0ZVBsdWdpbklkZW50aWZpZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlJU2l0ZSBzaXRlID0gZmVhdHVyZS5nZXRTaXRlKCk7Ci0JCQkJCUlQbHVnaW5FbnRyeVtdIHNpdGVQbHVnaW5FbnRyaWVzID0gbnVsbDsKLQotCQkJCQlpZiAoc2l0ZSAhPSBudWxsKSB7Ci0JCQkJCQlzaXRlUGx1Z2luRW50cmllcyA9IHNpdGUuZ2V0UGx1Z2luRW50cmllcygpOwotCQkJCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHNpdGVQbHVnaW5FbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykgewotCQkJCQkJCUlQbHVnaW5FbnRyeSBlbnRyeSA9IHNpdGVQbHVnaW5FbnRyaWVzW2luZGV4XTsKLQkJCQkJCQlzaXRlUGx1Z2luSWRlbnRpZmllcnMuYWRkKGVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAoc2l0ZVBsdWdpbkVudHJpZXMubGVuZ3RoID4gMCkgewotCQkJCQkJSVBsdWdpbkVudHJ5W10gZmVhdHVyZVBsdWdpbkVudHJpZXMgPSBmZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKLQkJCQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBmZWF0dXJlUGx1Z2luRW50cmllcy5sZW5ndGg7IGluZGV4KyspIHsKLQkJCQkJCQlJUGx1Z2luRW50cnkgY3VycmVudEZlYXR1cmVQbHVnaW5FbnRyeSA9IGZlYXR1cmVQbHVnaW5FbnRyaWVzW2luZGV4XTsKLQkJCQkJCQlpZiAoIWNvbnRhaW5zKGN1cnJlbnRGZWF0dXJlUGx1Z2luRW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLCBzaXRlUGx1Z2luSWRlbnRpZmllcnMpKSB7Ci0JCQkJCQkJCS8vIHRoZSBwbHVnaW4gZGVmaW5lZCBieSB0aGUgZmVhdHVyZQotCQkJCQkJCQkvLyBkb2Vzbid0IHNlZW0gdG8gZXhpc3Qgb24gdGhlIHNpdGUKLQkJCQkJCQkJU3RyaW5nIG1zZyA9ICJFcnJvciB2ZXJpZnlpbmcgZXhpc3RlbmNlIG9mIHBsdWdpbjoiICsgY3VycmVudEZlYXR1cmVQbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlVcGRhdGVDb3JlLmxvZyhtc2csIG5ldyBFeGNlcHRpb24oKSk7Ci0KLQkJCQkJCQkJU3RyaW5nIHNpdGVTdHJpbmcgPSAoc2l0ZSAhPSBudWxsKSA/IHNpdGUuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSA6IE1lc3NhZ2VzLkNvbmZpZ3VyZWRTaXRlX05vU2l0ZTsJCi0JCQkJCQkJCVN0cmluZyBlcnJvckxhYmVsID0gTkxTLmJpbmQoTWVzc2FnZXMuQ29uZmlndXJlZFNpdGVfQ2Fubm90RmluZFBsdWdpbkVudHJ5LCAobmV3IFN0cmluZ1tdIHsgY3VycmVudEZlYXR1cmVQbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSwgc2l0ZVN0cmluZyB9KSk7Ci0JCQkJCQkJCWlmIChoYW5kbGVyID09IG51bGwpIHsKLQkJCQkJCQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbihlcnJvckxhYmVsKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAoIWhhbmRsZXIucmVwb3J0UHJvYmxlbShlcnJvckxhYmVsKSkgewotCQkJCQkJCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IC8vIGVuZCBpZiBub3QgZm91bmQgaW4gc2l0ZQotCQkJCQkJfSAvLyBlbmQgZm9yCi0JCQkJCX0KLQkJCQl9Ci0JCQl9IC8vIGVuZCBmb3IgY29uZmlndXJlZCBmZWF0dXJlCi0JCX0KLQkJcmV0dXJuIGNvbmZpZ3VyZWRGZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIFdlIGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBjYWxjdWxhdGluZyB0aGUgZGVsdGEgYmV0d2VlbiB3aGF0IHdhcyBjb25maWd1cmVkIGluIHRoZSBjdXJyZW50Ci0JICogY29uZmlndXJhdGlvbiB0aGF0IGlzIG5vdCBjb25maWd1cmVkIG5vdwotCSAqIAotCSAqIHdlIGhhdmUgdG8gZmlndXJlIG91dCB3aGF0IGZlYXR1cmUgaGF2ZSBiZWVuIHVuY29uZmlndXJlZCBmb3IgdGhlIHdob2xlCi0JICogaGlzdG9yeSBiZXR3ZWVuIGN1cnJlbnQgYW5kIHVzLi4uIAotCSAqIAotCSAqIGlzIGl0IGFzIHNpbXBsZSBhcyAgZ2V0IGFsbCBjb25maWd1cmVkLCBhbmQgdW5jb25maWd1cmVkLAotCSAqIHRoZSBkbyB0aGUgZGVsdGEgd2l0aCB3aGF0IHNob3VsZCBiZSBjb25maWd1cmVkCi0JICogCi0JICovCi0JcHJpdmF0ZSBMaXN0IGNhbGN1bGF0ZVVuY29uZmlndXJlZEZlYXR1cmVzKElGZWF0dXJlUmVmZXJlbmNlW10gY29uZmlndXJlZEZlYXR1cmVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJU2V0IGZlYXR1cmVUb1VuY29uZmlndXJlU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQotCQkvLyBsb29wIGZvciBhbGwgaGlzdG9yeQotCQkvLyB0cnkgdG8gc2VlIGlmIHRoZSBjb25maWd1cmVkIHNpdGUgZXhpc3RlZAotCQkvLyBpZiBpdCBkb2VzLCBnZXQgdGhlIHVuY29uZmlndXJlZCBmZWF0dXJlcyAKLQkJLy8gYW5kIHRoZSBjb25maWd1cmVkIG9uZQotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb25bXSBoaXN0b3J5ID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGhpc3RvcnkubGVuZ3RoOyBpKyspIHsKLQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBlbGVtZW50ID0gaGlzdG9yeVtpXTsKLQkJCUlDb25maWd1cmVkU2l0ZVtdIGNvbmZpZ1NpdGVzID0gZWxlbWVudC5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnU2l0ZXMubGVuZ3RoOyBqKyspIHsKLQkJCQlDb25maWd1cmVkU2l0ZSBjb25maWdTaXRlID0gKENvbmZpZ3VyZWRTaXRlKSBjb25maWdTaXRlc1tqXTsKLQkJCQlpZiAoY29uZmlnU2l0ZS5nZXRTaXRlKCkuZXF1YWxzKGdldFNpdGUoKSkpIHsKLQkJCQkJZmVhdHVyZVRvVW5jb25maWd1cmVTZXQuYWRkQWxsKEFycmF5cy5hc0xpc3QoY29uZmlnU2l0ZS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCkuZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKSkpOwotCQkJCQlmZWF0dXJlVG9VbmNvbmZpZ3VyZVNldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChjb25maWdTaXRlLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHJlbW92ZSB0aGUgdW5jb25maWd1cmVkIGZlYXR1cmUgd2UgZm91bmQgdGhhdCBhcmUgbm93IHRvIGJlIGNvbmZpZ3VyZWQgCi0JCS8vICh0aGV5IG1heSBoYXZlIGJlZW4gdW5jb25maWd1cmVkIGluIHRoZSBwYXN0LCBidXQgdGhlIHJldmVydCBtYWtlcyB0aGVtIGNvbmZpZ3VyZWQpCi0JCUxpc3QgZmVhdHVyZVRvVW5jb25maWd1cmVMaXN0ID0gcmVtb3ZlKGNvbmZpZ3VyZWRGZWF0dXJlcywgZmVhdHVyZVRvVW5jb25maWd1cmVTZXQpOwotCi0JCXJldHVybiBmZWF0dXJlVG9VbmNvbmZpZ3VyZUxpc3Q7Ci0JfQotCi0JLyoKLQkgKiBVdGlsaXRpZXM6IFJlbW92ZSBhbiBhcnJheSBvZiBmZWF0dXJlIHJlZmVyZW5jZXMKLQkgKiBmcm9tIGEgbGlzdAotCSAqLwotCXByaXZhdGUgTGlzdCByZW1vdmUoSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlUmVmcywgU2V0IHNldCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpZiAoc2V0ID09IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCi0JCS8vIGlmIGFuIGVsZW1lbnQgb2YgdGhlIGxpc3QgaXMgTk9UIGZvdW5kIGluIHRoZSBhcnJheSwKLQkJLy8gYWRkIGl0IHRvIHRoZSByZXN1bHQgbGlzdAkJCQotCQlJdGVyYXRvciBpdGVyID0gc2V0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSUZlYXR1cmVSZWZlcmVuY2UgZWxlbWVudCA9IChJRmVhdHVyZVJlZmVyZW5jZSkgaXRlci5uZXh0KCk7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGVsZW1lbnQuZXF1YWxzKGZlYXR1cmVSZWZzW2ldKSkgewotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIWZvdW5kKQotCQkJCXJlc3VsdC5hZGQoZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEkgaGF2ZSBpc3N1ZXMgd2hlbiBydW5uaW5nIGxpc3QuY29udGFpbih2ZXJzaW9uZWRJZGVudGlmaWVyKQotCSAqIFRoZSBjb2RlIHJ1bnMgdGhlIE9iamVjdC5lcXVhbHMgaW5zdGVhZCBvZiB0aGUgVmVyc2lvbmVkSWRlbnRpZmllci5lcXVhbHMKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbnMoVmVyc2lvbmVkSWRlbnRpZmllciBpZCwgTGlzdCBsaXN0KSB7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiAhbGlzdC5pc0VtcHR5KCkpIHsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkgJiYgIWZvdW5kKSB7Ci0JCQkJVmVyc2lvbmVkSWRlbnRpZmllciBlbGVtZW50ID0gKFZlcnNpb25lZElkZW50aWZpZXIpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50LmVxdWFscyhpZCkpIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZm91bmQ7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblBvbGljeSBnZXRDb25maWd1cmF0aW9uUG9saWN5KCkgewotCQlyZXR1cm4gKENvbmZpZ3VyYXRpb25Qb2xpY3kpIGdldENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCgpOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIElTaXRlIGdldFNpdGUoKSB7Ci0JCXJldHVybiAoSVNpdGUpIGdldFNpdGVNb2RlbCgpOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBnZXRJbnN0YWxsQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIChJSW5zdGFsbENvbmZpZ3VyYXRpb24pIGdldEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwoKTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGdldEJyb2tlblN0YXR1cyhJRmVhdHVyZSBmZWF0dXJlKSB7Ci0KLQkJSVN0YXR1cyBmZWF0dXJlU3RhdHVzID0gY3JlYXRlU3RhdHVzKElTdGF0dXMuT0ssIElGZWF0dXJlLlNUQVRVU19IQVBQWSwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gY2hlY2sgdGhlIFBsdWdpbnMgb2YgYWxsIHRoZSBmZWF0dXJlcwotCQkvLyBldmVyeSBwbHVnaW4gb2YgdGhlIGZlYXR1cmUgbXVzdCBiZSBvbiB0aGUgc2l0ZQotCQlJUGx1Z2luRW50cnlbXSBzaXRlRW50cmllcyA9IGdldFNpdGUoKS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCUlQbHVnaW5FbnRyeVtdIGZlYXR1cmVzRW50cmllcyA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQlJUGx1Z2luRW50cnlbXSByZXN1bHQgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZGlmZihmZWF0dXJlc0VudHJpZXMsIHNpdGVFbnRyaWVzKTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIChyZXN1bHQubGVuZ3RoICE9IDApKSB7Ci0JCQlTdHJpbmcgbXNnID0gTWVzc2FnZXMuU2l0ZUxvY2FsX0ZlYXR1cmVVbkhhcHB5OyAKLQkJCU11bHRpU3RhdHVzIG11bHRpID0gbmV3IE11bHRpU3RhdHVzKGZlYXR1cmVTdGF0dXMuZ2V0UGx1Z2luKCksIElGZWF0dXJlLlNUQVRVU19VTkhBUFBZLCBtc2csIG51bGwpOwotCi0JCQlmb3IgKGludCBrID0gMDsgayA8IHJlc3VsdC5sZW5ndGg7IGsrKykgewotCQkJCVZlcnNpb25lZElkZW50aWZpZXIgaWQgPSByZXN1bHRba10uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJCU9iamVjdFtdIHZhbHVlcyA9IG5ldyBTdHJpbmdbXSB7ICIiLCAiIiB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJCQl2YWx1ZXMgPSBuZXcgT2JqZWN0W10geyBpZC5nZXRJZGVudGlmaWVyKCksIGlkLmdldFZlcnNpb24oKX07Ci0JCQkJfQotCQkJCVN0cmluZyBtc2cxID0gTkxTLmJpbmQoTWVzc2FnZXMuQ29uZmlndXJlZFNpdGVfTWlzc2luZ1BsdWdpbnNCcm9rZW5GZWF0dXJlLCB2YWx1ZXMpOwotCQkJCVVwZGF0ZUNvcmUud2Fybihtc2cxKTsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBJRmVhdHVyZS5TVEFUVVNfVU5IQVBQWSwgbXNnMSwgbnVsbCk7Ci0JCQkJbXVsdGkuYWRkKHN0YXR1cyk7Ci0JCQl9Ci0JCQlyZXR1cm4gbXVsdGk7Ci0JCX0KLQotCQkvLyBjaGVjayBvcywgYXJjaCwgYW5kIHdzCi0KLQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VzLlNpdGVMb2NhbF9GZWF0dXJlSGFwcHk7IAotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuT0ssIElGZWF0dXJlLlNUQVRVU19IQVBQWSwgbXNnLCBudWxsKTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29uZmlndXJlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWlmICghaXNFbmFibGVkKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGdldENvbmZpZ3VyYXRpb25Qb2xpY3koKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmZXJlbmNlID0gZ2V0U2l0ZSgpLmdldEZlYXR1cmVSZWZlcmVuY2UoZmVhdHVyZSk7Ci0JCWlmIChmZWF0dXJlUmVmZXJlbmNlID09IG51bGwpIHsKLQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19XQVJOSU5HUykKLQkJCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byByZXRyaWV2ZSBmZWF0dXJlUmVmZXJlbmNlIGZvciBmZWF0dXJlOiIgKyBmZWF0dXJlKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBnZXRDb25maWd1cmF0aW9uUG9saWN5KCkuaXNDb25maWd1cmVkKGZlYXR1cmVSZWZlcmVuY2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZ2V0U2l0ZSgpID09IG51bGwpCi0JCQlyZXR1cm4gIk5vIFNpdGUiOyAvLyROT04tTkxTLTEkCi0JCWlmIChnZXRTaXRlKCkuZ2V0VVJMKCkgPT0gbnVsbCkKLQkJCXJldHVybiAiTm8gVVJMIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZ2V0U2l0ZSgpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQ29uZmlndXJlZFNpdGUjdmVyaWZ5VXBkYXRhYmxlU3RhdHVzKCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2ZXJpZnlVcGRhdGFibGVTdGF0dXMoKSB7Ci0KLQkJaWYgKHZlcmlmeVN0YXR1cyAhPSBudWxsKQotCQkJcmV0dXJuIHZlcmlmeVN0YXR1czsKLQotCQlVUkwgc2l0ZVVSTCA9IGdldFNpdGUoKS5nZXRVUkwoKTsKLQkJaWYgKHNpdGVVUkwgPT0gbnVsbCkgewotCQkJdmVyaWZ5U3RhdHVzID0gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIE1lc3NhZ2VzLkNvbmZpZ3VyZWRTaXRlX1NpdGVVUkxOdWxsLCBudWxsKTsgCi0JCQlyZXR1cm4gdmVyaWZ5U3RhdHVzOwotCQl9Ci0KLQkJaWYgKCEiZmlsZSIuZXF1YWxzSWdub3JlQ2FzZShzaXRlVVJMLmdldFByb3RvY29sKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZlcmlmeVN0YXR1cyA9IGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBNZXNzYWdlcy5Db25maWd1cmVkU2l0ZV9Ob25Mb2NhbFNpdGUsIG51bGwpOyAKLQkJCXJldHVybiB2ZXJpZnlTdGF0dXM7Ci0JCX0KLQotCQlTdHJpbmcgc2l0ZUxvY2F0aW9uID0gc2l0ZVVSTC5nZXRGaWxlKCk7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHNpdGVMb2NhdGlvbik7Ci0KLQkJLy8gZ2V0IHRoZSBwcm9kdWN0IG5hbWUgb2YgdGhlIHByaXZhdGUgbWFya2VyCi0JCS8vIGlmIHRoZXJlIGlzIG5vIHByaXZhdGUgbWFya2VyLCBjaGVjayBpZiB0aGUgc2l0ZSBpcyBjb250YWluZWQgaW4gYW5vdGhlciBzaXRlCi0JCS8vIGlmIHRoZXJlIGlzIGEgbWFya2VyIGFuZCB0aGlzIGlzIGEgZGlmZmVyZW50IHByb2R1Y3QsIHJldHVybiBmYWxzZQotCQkvLyBvdGhlcndpc2UgZG9uJ3QgY2hlY2sgaWYgd2UgYXJlIGNvbnRhaW5lZCBpbiBhbm90aGVyIHNpdGUKLQkJU3RyaW5nIHByb2R1Y3ROYW1lID0gZ2V0UHJvZHVjdE5hbWUoZmlsZSk7Ci0JCWlmIChwcm9kdWN0TmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoIXByb2R1Y3ROYW1lLmVxdWFscyhnZXRQcm9kdWN0SWRlbnRpZmllcigiaWQiLCBnZXRQcm9kdWN0RmlsZSgpKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXZlcmlmeVN0YXR1cyA9IGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBOTFMuYmluZChNZXNzYWdlcy5Db25maWd1cmVkU2l0ZV9Ob3RTYW1lUHJvZHVjdElkLCAobmV3IFN0cmluZ1tdIHsgcHJvZHVjdE5hbWUgfSkpLCBudWxsKTsKLQkJCQlyZXR1cm4gdmVyaWZ5U3RhdHVzOwotCQkJfQotCQl9IGVsc2UgewotCQkJRmlsZSBjb250YWluZXIgPSBnZXRTaXRlQ29udGFpbmluZyhmaWxlKTsKLQkJCS8vIGFsbG93IHRoZSBpbnN0YWxsIGxvY2F0aW9uIHRvIHBhc3MgZXZlbiB0aG91Z2ggaXQgbG9va3MgbGlrZSB0aGlzCi0JCQkvLyBzaXRlIGlzIGNvbnRhaW5lZCBpbiBhbm90aGVyIHNpdGUKLQkJCWlmIChjb250YWluZXIgIT0gbnVsbCAmJiAhc2l0ZUxvY2F0aW9uLmVxdWFscyhQbGF0Zm9ybS5nZXRJbnN0YWxsTG9jYXRpb24oKS5nZXRVUkwoKS5nZXRGaWxlKCkpKSB7Ci0JCQkJdmVyaWZ5U3RhdHVzID0gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIE5MUy5iaW5kKE1lc3NhZ2VzLkNvbmZpZ3VyZWRTaXRlX0NvbnRhaW5lZEluQW5vdGhlclNpdGUsIChuZXcgU3RyaW5nW10geyBjb250YWluZXIuZ2V0QWJzb2x1dGVQYXRoKCkgfSkpLCBudWxsKTsKLQkJCQlyZXR1cm4gdmVyaWZ5U3RhdHVzOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFjYW5Xcml0ZShmaWxlKSkgewotCQkJdmVyaWZ5U3RhdHVzID0gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIE1lc3NhZ2VzLkNvbmZpZ3VyZWRTaXRlX1JlYWRPbmx5U2l0ZSwgbnVsbCk7IAotCQkJcmV0dXJuIHZlcmlmeVN0YXR1czsKLQkJfQotCi0JCXZlcmlmeVN0YXR1cyA9IGNyZWF0ZVN0YXR1cyhJU3RhdHVzLk9LLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VXBkYXRhYmxlKHRydWUpOwotCQlyZXR1cm4gdmVyaWZ5U3RhdHVzOwotCX0KLQotCS8qCi0JICogVmVyaWZ5IHdlIGNhbiB3cml0ZSBvbiB0aGUgZmlsZSBzeXN0ZW0KLQkgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuV3JpdGUoRmlsZSBmaWxlKSB7Ci0gICAgICAgIGlmIChmaWxlLmNhbldyaXRlKCkgPT0gZmFsc2UpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgaWYgKCFmaWxlLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgRmlsZSBmaWxlVGVzdCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgIAkvLyB3ZSB1c2UgdGhlIC5kbGwgc3VmZml4IHRvIHByb3Blcmx5IHRlc3Qgb24gVmlzdGEgdmlydHVhbCBkaXJlY3RvcmllcwotICAgICAgICAJLy8gb24gVmlzdGEgeW91IGFyZSBub3QgYWxsb3dlZCB0byB3cml0ZSBleGVjdXRhYmxlIGZpbGVzIG9uIHZpcnR1YWwgZGlyZWN0b3JpZXMgbGlrZSAiUHJvZ3JhbSBGaWxlcyIKLSAgICAgICAgICAgIGZpbGVUZXN0ID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgid3JpdHRhYmxlQXJlYSIsICIuZGxsIiwgZmlsZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL0lmIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gY3JlYXRlIHRoZSBmaWxlLCBpdCBtZWFucyB0aGF0IGl0IGlzIG5vdCB3cml0YWJsZQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGZpbGVUZXN0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgZmlsZVRlc3QuZGVsZXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0JLyoKLQkgKiBDaGVjayBpZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5zIGEgbWFya2VyCi0JICogaWYgbm90IGFzayBhbGwgZGlyZWN0b3J5IGNoaWxkcmVuIHRvIGNoZWNrCi0JICogaWYgb25lIHZhbGlkYXRlcyB0aGUgY29uZGl0aW9uLCByZXR1cm5zIHRoZSBtYXJrZXIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBGaWxlIGdldFNpdGVDb250YWluaW5nKEZpbGUgZmlsZSkgewotCi0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlVcGRhdGVDb3JlLndhcm4oIklzQ29udGFpbmVkOiBDaGVja2luZyBmb3IgbWFya2VycyBhdDoiICsgZmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGZpbGUuZXhpc3RzKCkgJiYgZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlGaWxlIHByb2R1Y3RGaWxlID0gbmV3IEZpbGUoZmlsZSwgUFJPRFVDVF9TSVRFX01BUktFUik7Ci0JCQlGaWxlIGV4dGVuc2lvbkZpbGUgPSBuZXcgRmlsZShmaWxlLCBFWFRFTlNJT05fU0lURV9NQVJLRVIpOwotCQkJaWYgKHByb2R1Y3RGaWxlLmV4aXN0cygpIHx8IGV4dGVuc2lvbkZpbGUuZXhpc3RzKCkpCi0JCQkJcmV0dXJuIGZpbGU7Ci0vLwkJCS8vIGRvIG5vdCBjaGVjayBpZiBhIG1hcmtlciBleGlzdHMgaW4gdGhlIGN1cnJlbnQgYnV0IHN0YXJ0IGZyb20gdGhlIHBhcmVudAotLy8JCQkvLyB0aGUgY3VycmVudCBpcyBhbmFseXplIGJ5IGdldFByb2R1Y3RuYW1lKCkKLS8vCQkJaWYgKGZpbGUuZ2V0UGFyZW50RmlsZSgpICE9IG51bGwpIHsKLS8vCQkJCUZpbGUgcHJpdmF0ZUZpbGUgPSBuZXcgRmlsZShmaWxlLmdldFBhcmVudEZpbGUoKSwgUFJJVkFURV9TSVRFX01BUktFUik7Ci0vLwkJCQlpZiAocHJpdmF0ZUZpbGUuZXhpc3RzKCkpCi0vLwkJCQkJcmV0dXJuIGZpbGUuZ2V0UGFyZW50RmlsZSgpOwotLy8JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldFNpdGVDb250YWluaW5nKGZpbGUuZ2V0UGFyZW50RmlsZSgpKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHByb2R1Y3QgaWYgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHByaXZhdGUgU2l0ZSBtYXJrdXAgaXMgbm90Ci0JICogdGhlIHNhbWUgYXMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHByb2R1Y3QgdGhlIHdvcmtiZW5jaCB3YXMgc3RhcnRlZCB3aXRoLgotCSAqIElmIHRoZSBwcm9kdWN0IGlzIHRoZSBzYW1lLCByZXR1cm4gbnVsbC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UHJvZHVjdE5hbWUoRmlsZSBmaWxlKSB7Ci0KLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUZpbGUgbWFya2VyRmlsZSA9IG5ldyBGaWxlKGZpbGUsIEVYVEVOU0lPTl9TSVRFX01BUktFUiApOwotCQlpZiAoIW1hcmtlckZpbGUuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJRmlsZSBwcm9kdWN0RmlsZSA9IGdldFByb2R1Y3RGaWxlKCk7Ci0JCVN0cmluZyBwcm9kdWN0SWQgPSBudWxsOwotCQlTdHJpbmcgcHJpdmF0ZUlkID0gbnVsbDsKLQkJaWYgKHByb2R1Y3RGaWxlICE9IG51bGwpIHsKLQkJCXByb2R1Y3RJZCA9IGdldFByb2R1Y3RJZGVudGlmaWVyKCJpZCIsIHByb2R1Y3RGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJcHJpdmF0ZUlkID0gZ2V0UHJvZHVjdElkZW50aWZpZXIoImlkIiwgbWFya2VyRmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChwcm9kdWN0SWQgPT0gbnVsbCkgewotCQkJCVVwZGF0ZUNvcmUud2FybigiUHJvZHVjdCBJRCBpcyBudWxsIGF0OiIgKyBwcm9kdWN0RmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWlmICghcHJvZHVjdElkLmVxdWFsc0lnbm9yZUNhc2UocHJpdmF0ZUlkKSkgewotCQkJCVVwZGF0ZUNvcmUud2FybigiUHJvZHVjdCBpZCBhdCIgKyBwcm9kdWN0RmlsZSArICIgRGlmZmVyZW50IHRoYW46IiArIG1hcmtlckZpbGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTdHJpbmcgbmFtZSA9IGdldFByb2R1Y3RJZGVudGlmaWVyKCJuYW1lIiwgbWFya2VyRmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgdmVyc2lvbiA9IGdldFByb2R1Y3RJZGVudGlmaWVyKCJ2ZXJzaW9uIiwgbWFya2VyRmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgbWFya2VySUQgPSAobmFtZSA9PSBudWxsKSA/IHZlcnNpb24gOiBuYW1lICsgIjoiICsgdmVyc2lvbjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChtYXJrZXJJRCA9PSBudWxsKQotCQkJCQltYXJrZXJJRCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG1hcmtlcklEOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gcHJpdmF0ZUlkOwotCQkJfQotCQl9IGVsc2UgewotCQkJVXBkYXRlQ29yZS53YXJuKCJQcm9kdWN0IE1hcmtlciBkb2Vzbid0IGV4aXN0OiIgKyBwcm9kdWN0RmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgaWRlbnRpZmllciBvZiB0aGUgcHJvZHVjdCBmcm9tIHRoZSBwcm9wZXJ0eSBmaWxlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFByb2R1Y3RJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyLCBGaWxlIHByb3BlcnR5RmlsZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGlkZW50aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwcm9wZXJ0eUZpbGUpOwotCQkJUHJvcGVydHlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBuZXcgUHJvcGVydHlSZXNvdXJjZUJ1bmRsZShpbik7Ci0JCQlyZXN1bHQgPSBidW5kbGUuZ2V0U3RyaW5nKGlkZW50aWZpZXIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfSU5TVEFMTCkKLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJFeGNlcHRpb24gcmVhZGluZyBwcm9wZXJ0eSBmaWxlOiIgKyBwcm9wZXJ0eUZpbGUpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfSU5TVEFMTCkKLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJFeGNlcHRpb24gcmVhZGluZyAnIiArIGlkZW50aWZpZXIgKyAiJyBmcm9tIHByb3BlcnR5IGZpbGU6IiArIHByb3BlcnR5RmlsZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgaWRlbnRpZmllciBvZiB0aGUgcHJvZHVjdCBmcm9tIHRoZSBwcm9wZXJ0eSBmaWxlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRQcm9kdWN0RmlsZSgpIHsKLQotCQlTdHJpbmcgcHJvZHVjdEluc3RhbGxEaXJlY3RvcnkgPSBDb25maWd1cmF0b3JVdGlscy5nZXRJbnN0YWxsVVJMKCkuZ2V0RmlsZSgpOwotCQlpZiAocHJvZHVjdEluc3RhbGxEaXJlY3RvcnkgIT0gbnVsbCkgewotCQkJRmlsZSBwcm9kdWN0RmlsZSA9IG5ldyBGaWxlKHByb2R1Y3RJbnN0YWxsRGlyZWN0b3J5LCBQUk9EVUNUX1NJVEVfTUFSS0VSKTsKLQkJCWlmIChwcm9kdWN0RmlsZS5leGlzdHMoKSkgewotCQkJCXJldHVybiBwcm9kdWN0RmlsZTsKLQkJCX0gZWxzZSB7Ci0JCQkJVXBkYXRlQ29yZS53YXJuKCJQcm9kdWN0IG1hcmtlciBkb2Vzbid0IGV4aXN0OiIgKyBwcm9kdWN0RmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiQ2Fubm90IHJldHJpZXZlIGluc3RhbGwgVVJMIGZyb20gQm9vdExvYWRlciIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQkvKnBhY2thZ2UqLwotCWJvb2xlYW4gY3JlYXRlUHJpdmF0ZVNpdGVNYXJrZXIoKSB7Ci0JCVVSTCBzaXRlVVJMID0gZ2V0U2l0ZSgpLmdldFVSTCgpOwotCQlpZiAoc2l0ZVVSTCA9PSBudWxsKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byBjcmVhdGUgbWFya2VyLiBUaGUgU2l0ZSB1cmwgaXMgbnVsbC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCEiZmlsZSIuZXF1YWxzSWdub3JlQ2FzZShzaXRlVVJMLmdldFByb3RvY29sKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIGNyZWF0ZSBwcml2YXRlIG1hcmtlci4gVGhlIFNpdGUgaXMgbm90IG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIHNpdGVMb2NhdGlvbiA9IHNpdGVVUkwuZ2V0RmlsZSgpOwotCQlGaWxlIHByb2R1Y3RGaWxlID0gZ2V0UHJvZHVjdEZpbGUoKTsKLQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCWlmIChwcm9kdWN0RmlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJvZHVjdElkID0gZ2V0UHJvZHVjdElkZW50aWZpZXIoImlkIiwgcHJvZHVjdEZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgcHJvZHVjdE5hbWUgPSBnZXRQcm9kdWN0SWRlbnRpZmllcigibmFtZSIsIHByb2R1Y3RGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHByb2R1Y3RWZXIgPSBnZXRQcm9kdWN0SWRlbnRpZmllcigidmVyc2lvbiIsIHByb2R1Y3RGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHByb2R1Y3RJZCAhPSBudWxsKSB7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoc2l0ZUxvY2F0aW9uLCBFWFRFTlNJT05fU0lURV9NQVJLRVIpOwotCQkJCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJCQlPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLQkJCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dFdyaXRlciA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLQkJCQkJCW91dFdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCAiVVRGOCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlvdXRXcml0ZXIud3JpdGUoImlkPSIgKyBwcm9kdWN0SWQrIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJaWYgKHByb2R1Y3ROYW1lICE9IG51bGwpCi0JCQkJCQkJb3V0V3JpdGVyLndyaXRlKCJuYW1lPSIgKyBwcm9kdWN0TmFtZSsiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlpZiAocHJvZHVjdFZlciAhPSBudWxsKQotCQkJCQkJCW91dFdyaXRlci53cml0ZSgidmVyc2lvbj0iICsgcHJvZHVjdFZlcisiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlzdWNjZXNzID0gdHJ1ZTsKLQkJCQkJCWp1c3RDcmVhdGVkID0gdHJ1ZTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIGNyZWF0ZSBwcml2YXRlIE1hcmtlciBhdDoiICsgZmlsZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaWYgKG91dFdyaXRlciAhPSBudWxsKQotCQkJCQkJCQlvdXRXcml0ZXIuY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQl9Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlmIChvdXQgIT0gbnVsbCkKLQkJCQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMikgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdWNjZXNzOwotCX0KLQotCi0JLyoKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRpcmVjdG9yeSBvZiB0aGUgU2l0ZSBjb250YWlucwotCSAqIC5lY2xpcHNlZXh0ZW5zaW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeHRlbnNpb25TaXRlKCkgewotCQlyZXR1cm4gY29udGFpbnNNYXJrZXIoRVhURU5TSU9OX1NJVEVfTUFSS0VSKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGlyZWN0b3J5IG9mIHRoZSBTaXRlIGNvbnRhaW5zCi0JICogLmVjbGlwc2VleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb2R1Y3RTaXRlKCkgewotCQlyZXR1cm4gY29udGFpbnNNYXJrZXIoUFJPRFVDVF9TSVRFX01BUktFUik7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRpcmVjdG9yeSBvZiB0aGUgU2l0ZSBjb250YWlucwotCSAqIC5lY2xpcHNlZXh0ZW5zaW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcml2YXRlU2l0ZSgpIHsKLQkJcmV0dXJuIGlzRXh0ZW5zaW9uU2l0ZSgpOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zTWFya2VyKFN0cmluZyBtYXJrZXIpIHsKLQkJSVNpdGUgc2l0ZSA9IGdldFNpdGUoKTsKLQkJaWYgKHNpdGUgPT0gbnVsbCkgewotCQkJVXBkYXRlQ29yZS53YXJuKCJDb250YWlucyBNYXJrZXJzOlRoZSBzaXRlIGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJVVJMIHVybCA9IHNpdGUuZ2V0VVJMKCk7Ci0JCWlmICh1cmwgPT0gbnVsbCkgewotCQkJVXBkYXRlQ29yZS53YXJuKCJDb250YWlucyBNYXJrZXJzOlNpdGUgVVJMIGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICghImZpbGUiLmVxdWFsc0lnbm9yZUNhc2UodXJsLmdldFByb3RvY29sKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVVwZGF0ZUNvcmUud2FybigiQ29udGFpbnMgTWFya2VyczpOb24gZmlsZSBwcm90b2NvbCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSk7Ci0JCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJVXBkYXRlQ29yZS53YXJuKCJDb250YWlucyBNYXJrZXJzOlRoZSBzaXRlIGRvZXNuJ3QgZXhpc3Q6IiArIGZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJRmlsZSBleHRlbnNpb24gPSBuZXcgRmlsZShmaWxlLCBtYXJrZXIpOwotCQlpZiAoIWV4dGVuc2lvbi5leGlzdHMoKSkgewotCQkJVXBkYXRlQ29yZS53YXJuKCJDb250YWlucyBNYXJrZXJzOlRoZSBleHRlbnNpb25maWxlIGRvZXMgbm90IGV4aXN0OiIgKyBleHRlbnNpb24pOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIFNpdGUgaXMgYWxyZWFkeSBuYXRpdmVseSBsaW5rZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05hdGl2ZWx5TGlua2VkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgcGxhdGZvcm1TdHJpbmcgPSBnZXRQbGF0Zm9ybVVSTFN0cmluZygpOwotCQlpZiAocGxhdGZvcm1TdHJpbmcgPT0gbnVsbCkgewotCQkJVXBkYXRlQ29yZS53YXJuKCJVbmFibGUgdG8gcmV0cmlldmUgcGxhdGZvcm1TdHJpbmciKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJVVJMIHNpdGVVUkwgPSBudWxsOwotCQl0cnkgewotCQkJLy8gY2hlY2sgaWYgdGhlIHNpdGUgZXhpc3RzIGFuZCBpcyB1cGRhdGVhYmxlCi0JCQkvLyB1cGRhdGUgY29uZmlnU2l0ZQotCQkJVVJMIHVybFRvQ2hlY2sgPSBuZXcgVVJMKHBsYXRmb3JtU3RyaW5nKTsKLQkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcnVudGltZUNvbmZpZyA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKLQkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVFbnRyeSBlbnRyeSA9IHJ1bnRpbWVDb25maWcuZmluZENvbmZpZ3VyZWRTaXRlKHVybFRvQ2hlY2spOwotCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZW50cnkuaXNOYXRpdmVseUxpbmtlZCgpOwotCQkJfSBlbHNlIHsKLQkJCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byByZXRyaWV2ZSBzaXRlOiIgKyBwbGF0Zm9ybVN0cmluZyArICIgZnJvbSBwbGF0Zm9ybS4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCS8vIGNoZWNrIGJ5IGNvbXBhcmluZyBVUkxzCi0JCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlRW50cnlbXSBzaXRlcyA9IHJ1bnRpbWVDb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc2l0ZVVSTCA9IHNpdGVzW2ldLmdldFVSTCgpOwotCQkJCVVSTCByZXNvbHZlZFVSTCA9IEZpbGVMb2NhdG9yLnJlc29sdmUoc2l0ZVVSTCk7Ci0JCQkJaWYgKFVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKHJlc29sdmVkVVJMLCB1cmxUb0NoZWNrKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMuQ29uZmlndXJlZFNpdGVfVW5hYmxlUmVzb2x2ZVVSTCwgKG5ldyBTdHJpbmdbXSB7IHBsYXRmb3JtU3RyaW5nIH0pKTsKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKG1zZywgZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5Db25maWd1cmVkU2l0ZV9VbmFibGVUb0FjY2Vzc1NpdGUsIChuZXcgT2JqZWN0W10geyBzaXRlVVJMIH0pKTsKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKG1zZywgZSk7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkqIHdlIGhhdmUgdG8gY2hlY2sgdGhhdCBubyBjb25maWd1cmVkL2VuYWJsZSBwYXJlbnQgaW5jbHVkZSB0aGlzIGZlYXR1cmUKLQkqLwotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZU5vQ29uZmlndXJlZFBhcmVudHMoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIkNvbmZpZ3VyYXRpb25Qb2xpY3k6IHZhbGlkYXRlIEZlYXR1cmUgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcGFyZW50cyA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRQYXJlbnRGZWF0dXJlcyhmZWF0dXJlLCBnZXRDb25maWd1cmVkRmVhdHVyZXMoKSwgZmFsc2UpOwotCQlyZXR1cm4gKHBhcmVudHMubGVuZ3RoID09IDApOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Db250ZW50Q29uc3VtZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQ29udGVudENvbnN1bWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNzhhN2MuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Db250ZW50Q29uc3VtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLQotLyoqCi0gKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIElGZWF0dXJlQ29udGVudENvbnN1bWVyCi0gKiA8L3A+Ci0gKiBAc2luY2UgMi4wCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRlbnRDb25zdW1lciBpbXBsZW1lbnRzIElDb250ZW50Q29uc3VtZXIgewotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0NvcmVFeGNlcHRpb25XaXRoUm9vdENhdXNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0NvcmVFeGNlcHRpb25XaXRoUm9vdENhdXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MjI5NTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Db3JlRXhjZXB0aW9uV2l0aFJvb3RDYXVzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLXB1YmxpYyBjbGFzcyBDb3JlRXhjZXB0aW9uV2l0aFJvb3RDYXVzZSBleHRlbmRzIENvcmVFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjgzMjk5MzIzOTkyNjc2NzQwM0w7Ci0JCi0JcHJpdmF0ZSBUaHJvd2FibGUgZSA9IG51bGw7Ci0JCi0JcHVibGljIENvcmVFeGNlcHRpb25XaXRoUm9vdENhdXNlKElTdGF0dXMgc3RhdHVzKSB7Ci0JCXN1cGVyKHN0YXR1cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Um9vdEV4Y2VwdGlvbihUaHJvd2FibGUgZSkgewotCQl0aGlzLmUgPSBlOwkKLQl9Ci0KLQlwdWJsaWMgVGhyb3dhYmxlIGdldFJvb3RFeGNlcHRpb24oKSB7Ci0JCXJldHVybiBlOwotCX0KLQotCQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9EZWZhdWx0SW5zdGFsbEhhbmRsZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRGVmYXVsdEluc3RhbGxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMjliMDQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9EZWZhdWx0SW5zdGFsbEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSmFyQ29udGVudFJlZmVyZW5jZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci0KLS8qKgotICogRGVmYXVsdCBJbXBsZW1lbnRhdGlvbiBvZiBJbnN0YWxsSGFuZGxlcgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEluc3RhbGxIYW5kbGVyIGV4dGVuZHMgQmFzZUluc3RhbGxIYW5kbGVyIHsKLQotCS8qCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjbm9uUGx1Z2luRGF0YURvd25sb2FkZWQoSU5vblBsdWdpbkVudHJ5W10sIElWZXJpZmljYXRpb25MaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub25QbHVnaW5EYXRhRG93bmxvYWRlZCgKLQkJSU5vblBsdWdpbkVudHJ5W10gbm9uUGx1Z2luRGF0YSwKLQkJSVZlcmlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJLy8gdmVyaWZ5IG5vbi1wbHVnaW4gYXJjaGl2ZXMuIFRoZSBEZWZhdWx0SW5zdGFsbEhhbmRsZXIgYXNzdW1lcwotCQkvLyB0aGUgdmVyaWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBmZWF0dXJlIGlzIGFibGUgdG8gdmVyaWZ5IHRoZQotCQkvLyBkYXRhIGFyY2hpdmVzLgotCQlpZiAobm9uUGx1Z2luRGF0YSA9PSBudWxsIHx8IG5vblBsdWdpbkRhdGEubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0KLQkJdGhpcy5ub25QbHVnaW5FbnRyaWVzID0gbm9uUGx1Z2luRGF0YTsKLQkJSUZlYXR1cmVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSB0aGlzLmZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpOwotCQlJVmVyaWZpZXIgdmVyaWZpZXIgPSBwcm92aWRlci5nZXRWZXJpZmllcigpOwotCQlpZiAodmVyaWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMubm9uUGx1Z2luRW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJQ29udGVudFJlZmVyZW5jZVtdIGFyY2hpdmVzID0KLQkJCQlwcm92aWRlci5nZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKG5vblBsdWdpbkVudHJpZXNbaV0sIHRoaXMubW9uaXRvcik7Ci0JCQlJVmVyaWZpY2F0aW9uUmVzdWx0IHJlc3VsdDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgYXJjaGl2ZXMubGVuZ3RoOyBqKyspIHsKLQotCQkJCS8vIHNlZSBpZiB0aGUgZGF0YSBlbnRyeSBpcyBhIGphcgotCQkJCUNvbnRlbnRSZWZlcmVuY2UgYXJjaGl2ZSA9IGFyY2hpdmVzW2pdOwotCQkJCWlmICghKGFyY2hpdmVzW2pdIGluc3RhbmNlb2YgSmFyQ29udGVudFJlZmVyZW5jZSkKLQkJCQkJJiYgYXJjaGl2ZXNbal0uZ2V0SWRlbnRpZmllcigpLmVuZHNXaXRoKCIuamFyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQl0cnkgewotCQkJCQkJYXJjaGl2ZSA9Ci0JCQkJCQkJbmV3IEphckNvbnRlbnRSZWZlcmVuY2UoYXJjaGl2ZXNbal0uZ2V0SWRlbnRpZmllcigpLCBhcmNoaXZlc1tqXS5hc0ZpbGUoKSk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXJlc3VsdCA9IHZlcmlmaWVyLnZlcmlmeSh0aGlzLmZlYXR1cmUsIGFyY2hpdmUsIGZhbHNlLCB0aGlzLm1vbml0b3IpOwotCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQkJcHJvbXB0Rm9yVmVyaWZpY2F0aW9uKHJlc3VsdCwgbGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNjb21wbGV0ZUluc3RhbGwoSUZlYXR1cmVDb250ZW50Q29uc3VtZXIpCi0JICovCi0JcHVibGljIHZvaWQgY29tcGxldGVJbnN0YWxsKElGZWF0dXJlQ29udGVudENvbnN1bWVyIGNvbnN1bWVyKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJLy8gcGx1Z2lucyBoYXZlIGJlZW4gaW5zdGFsbGVkLiBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbnkKLQkJLy8gbm9uLXBsdWdpbiBlbnRyaWVzIHRoYXQgbmVlZCB0byBiZSBoYW5kbGVkLgotCQlpZiAodGhpcy5ub25QbHVnaW5FbnRyaWVzID09IG51bGwgfHwgdGhpcy5ub25QbHVnaW5FbnRyaWVzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCi0JCS8vIGluc3RhbGwgbm9uLXBsdWdpbiBhcmNoaXZlcwotCQlJRmVhdHVyZUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IHRoaXMuZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5ub25QbHVnaW5FbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb250ZW50UmVmZXJlbmNlW10gYXJjaGl2ZSA9Ci0JCQkJcHJvdmlkZXIuZ2V0Tm9uUGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhub25QbHVnaW5FbnRyaWVzW2ldLCB0aGlzLm1vbml0b3IpOwotCQkJSUNvbnRlbnRDb25zdW1lciBub25QbHVnaW5Db25zdW1lciA9IGNvbnN1bWVyLm9wZW4obm9uUGx1Z2luRW50cmllc1tpXSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGFyY2hpdmUubGVuZ3RoOyBqKyspIHsKLQkJCQlTdHJpbmcgaWQgPSBhcmNoaXZlW2pdLmdldElkZW50aWZpZXIoKTsKLQkJCQlpZiAoaWQuZW5kc1dpdGgoIi5qYXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIHRoZSBub24tcGx1Z2luIGFyY2hpdmUgaXMgYSBqYXIuIFVucGFjayBpdCBpbnRvCi0JCQkJCS8vIGEgZGlyZWN0b3J5IGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBhcmNoaXZlIGlkCi0JCQkJCXRyeSB7Ci0JCQkJCQlmaW5hbCBTdHJpbmcgcHJlZml4ID0gaWQuc3Vic3RyaW5nKDAsIGlkLmxlbmd0aCgpIC0gNCkgKyAiLyI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCUphckNvbnRlbnRSZWZlcmVuY2UgamFyUmVmID0gbmV3IEphckNvbnRlbnRSZWZlcmVuY2UoIiIsIGFyY2hpdmVbal0uYXNGaWxlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlDb250ZW50U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgQ29udGVudFNlbGVjdG9yKCkgewotCQkJCQkJCXB1YmxpYyBTdHJpbmcgZGVmaW5lSWRlbnRpZmllcihKYXJFbnRyeSBlbnRyeSkgewotCQkJCQkJCQlpZiAoZW50cnkgPT0gbnVsbCkKLQkJCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJCQllbHNlCi0JCQkJCQkJCQlyZXR1cm4gcHJlZml4ICsgZW50cnkuZ2V0TmFtZSgpOwotCQkJCQkJCX0KLQkJCQkJCX07Ci0JCQkJCQlDb250ZW50UmVmZXJlbmNlW10gZW50cmllcyA9IGphclJlZi5wZWVrKHNlbGVjdG9yLCB0aGlzLm1vbml0b3IpOwotCQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBlbnRyaWVzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQkJbm9uUGx1Z2luQ29uc3VtZXIuc3RvcmUoZW50cmllc1trXSwgdGhpcy5tb25pdG9yKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgVXRpbGl0aWVzCi0JCQkJCQkJLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uU2VydmljZV9DYW5jZWxJbnN0YWxsLCAobmV3IFN0cmluZ1tdIHsgaWQgfSkpLAotCQkJCQkJZSk7Ci0JCQkJCX0KLQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHRoZSBub24tcGx1Z2luIGFyY2hpdmUgaXMgbm90IGEgamFyLiBJbnN0YWxsIGl0IGFzaXMuCi0JCQkJCW5vblBsdWdpbkNvbnN1bWVyLnN0b3JlKGFyY2hpdmVbal0sIHRoaXMubW9uaXRvcik7Ci0JCQkJfQotCQkJfQotCQkJbm9uUGx1Z2luQ29uc3VtZXIuY2xvc2UoKTsKLQkJfQotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb21wdEZvclZlcmlmaWNhdGlvbigKLQkJSVZlcmlmaWNhdGlvblJlc3VsdCB2ZXJpZmljYXRpb25SZXN1bHQsCi0JCUlWZXJpZmljYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWlmIChsaXN0ZW5lciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgcmVzdWx0ID0gbGlzdGVuZXIucHJvbXB0KHZlcmlmaWNhdGlvblJlc3VsdCk7Ci0KLQkJaWYgKHJlc3VsdCA9PSBJVmVyaWZpY2F0aW9uTGlzdGVuZXIuQ0hPSUNFX0FCT1JUKSB7Ci0JCQlFeGNlcHRpb24gZSA9IHZlcmlmaWNhdGlvblJlc3VsdC5nZXRWZXJpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJCXRocm93IG5ldyBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbihNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25TZXJ2aWNlX0NhbmNlbEluc3RhbGwsZSk7IAotCQl9Ci0JCWlmIChyZXN1bHQgPT0gSVZlcmlmaWNhdGlvbkxpc3RlbmVyLkNIT0lDRV9FUlJPUikgewotCQkJdGhyb3cgVXRpbGl0aWVzCi0JCQkJLm5ld0NvcmVFeGNlcHRpb24oTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uU2VydmljZV9VbnN1Y2Vzc2Z1bFZlcmlmaWNhdGlvbiwgCi0JCQl2ZXJpZmljYXRpb25SZXN1bHQuZ2V0VmVyaWZpY2F0aW9uRXhjZXB0aW9uKCkpOwotCQl9Ci0KLQkJcmV0dXJuOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRGVsdGFJbnN0YWxsSGFuZGxlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9EZWx0YUluc3RhbGxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MmQ3MzUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9EZWx0YUluc3RhbGxIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5CYXNlSW5zdGFsbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQ29udGVudFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZUNvbnRlbnRDb25zdW1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuUGx1Z2luRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy5VcGRhdGVVdGlsczsKLQotLyoqCi0gKiBJbnN0YWxsIGhhbmRsZXIgZm9yIHBhcnRpYWwgcGx1Z2luIGRlbGl2ZXJ5OiBjb3B5IGRlbHRhIGNvbnRlbnQgZnJvbSBvbGQgcGx1Z2luIGludG8gdGhlIG5ldyBvbmUuCi0gKiBUaGUgbmV3IHBsdWdpbiBzaG91bGQgb25seSBjb250YWluIGZpbGVzIHRoYXQgaGF2ZSBjaGFuZ2VkLgotICovCi1wdWJsaWMgY2xhc3MgRGVsdGFJbnN0YWxsSGFuZGxlciBleHRlbmRzIEJhc2VJbnN0YWxsSGFuZGxlciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBMVUdJTl9YTUwgPSAicGx1Z2luLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRlJBR01FTlRfWE1MID0gImZyYWdtZW50LnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUVUQV9NQU5JRkVTVCA9ICJNRVRBLUlORi9NQU5JRkVTVC5NRiI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBJRmVhdHVyZSBvbGRGZWF0dXJlOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyI2NvbXBsZXRlSW5zdGFsbChvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZUNvbnRlbnRDb25zdW1lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wbGV0ZUluc3RhbGwoSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgY29uc3VtZXIpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWlmIChwbHVnaW5FbnRyaWVzID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQlpZiAoIWZlYXR1cmUuaXNQYXRjaCgpKSB7Ci0JCQkJLy8gR2V0IHRoZSBvbGQgZmVhdHVyZQotCQkJCUlGZWF0dXJlW10gb2xkRmVhdHVyZXMgPSBVcGRhdGVVdGlscwotCQkJCQkJLmdldEluc3RhbGxlZEZlYXR1cmVzKGZlYXR1cmUpOwotCQkJCWlmIChvbGRGZWF0dXJlcy5sZW5ndGggPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJCW9sZEZlYXR1cmUgPSBvbGRGZWF0dXJlc1swXTsKLQkJCX0gZWxzZSB7Ci0JCQkJb2xkRmVhdHVyZSA9IFVwZGF0ZVV0aWxzLmdldFBhdGNoZWRGZWF0dXJlKGZlYXR1cmUpOwotCQkJCWlmIChvbGRGZWF0dXJlID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJSVBsdWdpbkVudHJ5W10gb2xkUGx1Z2lucyA9IG9sZEZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5FbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVBsdWdpbkVudHJ5IG5ld1BsdWdpbiA9IHBsdWdpbkVudHJpZXNbaV07Ci0JCQkJSVBsdWdpbkVudHJ5IG9sZFBsdWdpbiA9Ci0JCQkJCWdldFBsdWdpbkVudHJ5KAotCQkJCQkJb2xkUGx1Z2lucywKLQkJCQkJCW5ld1BsdWdpbi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpKTsKLQkJCQlpZiAob2xkUGx1Z2luID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCXRyeSB7Ci0JCQkJCW92ZXJsYXlQbHVnaW4ob2xkUGx1Z2luLCBuZXdQbHVnaW4sIGNvbnN1bWVyKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQkJbmV3IFN0YXR1cygKLQkJCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJCVVwZGF0ZVV0aWxzLmdldFBsdWdpbklkKCksCi0JCQkJCQkJMSwKLQkJCQkJCQkiIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWUpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQkvL2lmIChjb250ZW50Q29uc3VtZXIgIT0gbnVsbCkKLQkJCS8vCWNvbnRlbnRDb25zdW1lci5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElQbHVnaW5FbnRyeSBnZXRQbHVnaW5FbnRyeShJUGx1Z2luRW50cnlbXSBwbHVnaW5zLCBTdHJpbmcgaWQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKQotCQkJaWYgKHBsdWdpbnNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKS5lcXVhbHMoaWQpKQotCQkJCXJldHVybiBwbHVnaW5zW2ldOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWZlcmVuY2VFeGlzdHMoCi0JCUNvbnRlbnRSZWZlcmVuY2VbXSByZWZlcmVuY2VzLAotCQlDb250ZW50UmVmZXJlbmNlIHJlZikgewotCQlTdHJpbmcgaWQgPSByZWYuZ2V0SWRlbnRpZmllcigpOwotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMubGVuZ3RoOyBpKyspCi0JCQlpZiAoaWQuZXF1YWxzKHJlZmVyZW5jZXNbaV0uZ2V0SWRlbnRpZmllcigpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG92ZXJsYXlQbHVnaW4oCi0JCUlQbHVnaW5FbnRyeSBvbGRQbHVnaW4sCi0JCUlQbHVnaW5FbnRyeSBuZXdQbHVnaW4sCi0JCUlGZWF0dXJlQ29udGVudENvbnN1bWVyIGNvbnN1bWVyKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpZihuZXdQbHVnaW4gaW5zdGFuY2VvZiBQbHVnaW5FbnRyeSAmJiAhKChQbHVnaW5FbnRyeSluZXdQbHVnaW4pLmlzVW5wYWNrKCkpewotCQkJLy8gcGFydGlhbCBwbHVnLWlucyAoaW4gcGF0Y2hlcykgbXVzdCBhbHdheXMgYmUgdW5wYWNrZWQKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gY29weSB0aGUgY29udGVudCBvZiB0aGUgb2xkIHBsdWdpbiBvdmVyIHRoZSBuZXcgb25lLCBidXQgb25seQotCQkvLyB0aG9zZSBmaWxlcyB0aGF0IGRvIG5vdCBleGlzdCBvbiB0aGUgdGFyZ2V0Ci0JCUNvbnRlbnRSZWZlcmVuY2VbXSBvbGRSZWZlcmVuY2VzID0KLQkJCW9sZEZlYXR1cmUKLQkJCQkuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpCi0JCQkJLmdldFBsdWdpbkVudHJ5Q29udGVudFJlZmVyZW5jZXMoCi0JCQkJb2xkUGx1Z2luLAotCQkJCW51bGwpOwotCQlDb250ZW50UmVmZXJlbmNlW10gbmV3UmVmZXJlbmNlcyA9Ci0JCQlmZWF0dXJlCi0JCQkJLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKQotCQkJCS5nZXRQbHVnaW5FbnRyeUNvbnRlbnRSZWZlcmVuY2VzKAotCQkJCW5ld1BsdWdpbiwKLQkJCQludWxsKTsKLQotCQlVUkwgbmV3VVJMID0gbmV3IFVSTChjb25zdW1lci5nZXRGZWF0dXJlKCkuZ2V0U2l0ZSgpLmdldFVSTCgpLAotCQkJCVNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSAotCQkJCQkJKyBuZXdQbHVnaW4uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQlTdHJpbmcgcGx1Z2luUGF0aCA9IG5ld1VSTC5nZXRGaWxlKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGlzUGx1Z2luTWFuaWZlc3Qob2xkUmVmZXJlbmNlc1tpXSkKLQkJCQl8fCByZWZlcmVuY2VFeGlzdHMobmV3UmVmZXJlbmNlcywgb2xkUmVmZXJlbmNlc1tpXSkpCi0JCQkJY29udGludWU7Ci0KLQkJCUlucHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaW5wdXQgPSBvbGRSZWZlcmVuY2VzW2ldLmdldElucHV0U3RyZWFtKCk7Ci0JCQkJRmlsZSB0YXJnZXRGaWxlID0KLQkJCQkJbmV3IEZpbGUocGx1Z2luUGF0aCwgb2xkUmVmZXJlbmNlc1tpXS5nZXRJZGVudGlmaWVyKCkpOwotCQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5jb3B5VG9Mb2NhbCgKLQkJCQkJaW5wdXQsCi0JCQkJCXRhcmdldEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksCi0JCQkJCW51bGwpOwotCQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5jaGVja1Blcm1pc3Npb25zKAotCQkJCQlvbGRSZWZlcmVuY2VzW2ldLAotCQkJCQlwbHVnaW5QYXRoKTsKLQkJCQkvLyAyMDMwNQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWNvbnRpbnVlOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZihpbnB1dCAhPSBudWxsKXsKLQkJCQkJdHJ5ewotCQkJCQkJaW5wdXQuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BsdWdpbk1hbmlmZXN0KENvbnRlbnRSZWZlcmVuY2UgcmVmKSB7Ci0JCVN0cmluZyBpZCA9IHJlZi5nZXRJZGVudGlmaWVyKCk7Ci0JCXJldHVybiBQTFVHSU5fWE1MLmVxdWFscyhpZCkgfHwgRlJBR01FTlRfWE1MLmVxdWFscyhpZCkgfHwgTUVUQV9NQU5JRkVTVC5lcXVhbHMoaWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRGlnZXN0LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0RpZ2VzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2UxNjE2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRGlnZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkphckNvbnRlbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuRmVhdHVyZU1vZGVsOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIERpZ2VzdCB7Ci0JCi0JcHJpdmF0ZSBVUkwgc291cmNlOwotCXByaXZhdGUgRmlsZSBsb2NhbFNvdXJjZTsKLQlwcml2YXRlIEphckZpbGUgZGlnZXN0SmFyOwotCXByaXZhdGUgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW07Ci0JCi0KLQlwdWJsaWMgRGlnZXN0KFVSTCBzb3VyY2UpewotCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLQl9Ci0JCi0JcHVibGljIEZlYXR1cmVNb2RlbFtdIHBhcnNlRGlnZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCQlEaWdlc3RDb250ZW50UHJvdmlkZXIgZGlnZXN0Q29udGVudFByb3ZpZGVyID0gbmV3IERpZ2VzdENvbnRlbnRQcm92aWRlcihzb3VyY2UpOwotCQlsb2NhbFNvdXJjZSA9IGRpZ2VzdENvbnRlbnRQcm92aWRlci5hc0xvY2FsUmVmZXJlbmNlKG5ldyBKYXJDb250ZW50UmVmZXJlbmNlKCBudWxsLCBzb3VyY2UpLCBudWxsKS5hc0ZpbGUoKTsKLQkJZGlnZXN0SmFyID0gbmV3IEphckZpbGUobG9jYWxTb3VyY2UpOwotCQkKLQkJWmlwRW50cnkgZGlnZXN0RW50cnkgPSBkaWdlc3RKYXIuZ2V0RW50cnkoImRpZ2VzdC54bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYgKGRpZ2VzdEVudHJ5ICE9IG51bGwpIHsKLQkJCWlucHV0U3RyZWFtID0gZGlnZXN0SmFyLmdldElucHV0U3RyZWFtKGRpZ2VzdEVudHJ5KTsKLQkJCURpZ2VzdFBhcnNlciBkaWdlc3QgPSBuZXcgRGlnZXN0UGFyc2VyKCk7Ci0JCQlkaWdlc3QuaW5pdChuZXcgTGl0ZUZlYXR1cmVGYWN0b3J5KCkpOwotCQkJcmV0dXJuIGRpZ2VzdC5wYXJzZShpbnB1dFN0cmVhbSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihudWxsKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9EaWdlc3RDb250ZW50UHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRGlnZXN0Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjODQ4YWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9EaWdlc3RDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQ29udGVudFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5GZWF0dXJlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklOb25QbHVnaW5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVZlcmlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkluc3RhbGxNb25pdG9yOwotCi1wdWJsaWMgY2xhc3MgRGlnZXN0Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgRmVhdHVyZUNvbnRlbnRQcm92aWRlciB7Ci0KLQlwdWJsaWMgRGlnZXN0Q29udGVudFByb3ZpZGVyKFVSTCBiYXNlKSB7Ci0JCXN1cGVyKGJhc2UpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JCi0JCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2UgYXNMb2NhbFJlZmVyZW5jZSggQ29udGVudFJlZmVyZW5jZSByZWYsCi0JCQlJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gc3VwZXIuYXNMb2NhbFJlZmVyZW5jZShyZWYsIG1vbml0b3IpOwotCX0KLQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0QXJjaGl2ZVJlZmVyZW5jZXMoSW5zdGFsbE1vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldEZlYXR1cmVFbnRyeUFyY2hpdmVSZWZlcmVuY2VzKAotCQkJSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0RmVhdHVyZUVudHJ5Q29udGVudFJlZmVyZW5jZXMoCi0JCQlJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2UgZ2V0RmVhdHVyZU1hbmlmZXN0UmVmZXJlbmNlKEluc3RhbGxNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKAotCQkJSU5vblBsdWdpbkVudHJ5IG5vblBsdWdpbkVudHJ5LCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0UGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcygKLQkJCUlQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldFBsdWdpbkVudHJ5Q29udGVudFJlZmVyZW5jZXMoCi0JCQlJUGx1Z2luRW50cnkgcGx1Z2luRW50cnksIEluc3RhbGxNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElWZXJpZmllciBnZXRWZXJpZmllcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRGlnZXN0UGFyc2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0RpZ2VzdFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTA3ODJiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRGlnZXN0UGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkZlYXR1cmVNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotcHVibGljIGNsYXNzIERpZ2VzdFBhcnNlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKLQotCXByaXZhdGUgSW50ZXJuYWxGZWF0dXJlUGFyc2VyIGZlYXR1cmVQYXJzZXI7Ci0JCi0JcHJpdmF0ZSBBcnJheUxpc3QgZmVhdHVyZU1vZGVsczsKLQotCXByaXZhdGUgU0FYUGFyc2VyIHBhcnNlcjsKLQotCXByaXZhdGUgRmVhdHVyZU1vZGVsRmFjdG9yeSBmYWN0b3J5OwotCi0JcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb247Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU0FYUGFyc2VyRmFjdG9yeSBwYXJzZXJGYWN0b3J5ID0KLQkJU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQotCXB1YmxpYyBEaWdlc3RQYXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZlYXR1cmVQYXJzZXIgPSBuZXcgSW50ZXJuYWxGZWF0dXJlUGFyc2VyKCk7Ci0JCXRyeSB7Ci0JCQlwYXJzZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCQkJdGhpcy5wYXJzZXIgPSBwYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZUNvcmUubG9nKGUpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS5sb2coZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEZlYXR1cmVNb2RlbEZhY3RvcnkgZmFjdG9yeSkgewotCQlpbml0KGZhY3RvcnksIG51bGwpOwotCX0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZmFjdG9yeQotICAgICAqIEBwYXJhbSBsb2NhdGlvbgotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KEZlYXR1cmVNb2RlbEZhY3RvcnkgZmFjdG9yeSwgU3RyaW5nIGxvY2F0aW9uKSB7Ci0gICAgCQotICAgIAl0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwotICAgIAl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0gICAgCWZhY3RvcnkgPSBuZXcgTGl0ZUZlYXR1cmVGYWN0b3J5KCk7Ci0gICAgCWZlYXR1cmVNb2RlbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgCWZlYXR1cmVQYXJzZXIuaW50ZXJuYWxJbml0KGZhY3RvcnksIGxvY2F0aW9uKTsKLSAgICB9Ci0KLQkvKioKLQkgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCBpbnB1dCBzdGVhbSBhbmQgY29uc3RydWN0cyBhIGZlYXR1cmUgbW9kZWwuCi0JICogVGhlIGlucHV0IHN0cmVhbSBpcyBub3QgY2xvc2VkIGFzIHBhcnQgb2YgdGhpcyBvcGVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGluIGlucHV0IHN0cmVhbQotCSAqIEByZXR1cm4gZmVhdHVyZSBtb2RlbAotCSAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgTGl0ZUZlYXR1cmVbXSBwYXJzZShJbnB1dFN0cmVhbSBpbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkKLQkJcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbiksIHRoaXMpOwkKLQkJcmV0dXJuIChMaXRlRmVhdHVyZVtdKWZlYXR1cmVNb2RlbHMudG9BcnJheSggbmV3IExpdGVGZWF0dXJlW2ZlYXR1cmVNb2RlbHMuc2l6ZSgpXSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBzdGF0dXMgb2JqZWN0cyBhY2N1bXVsYXRlZCBieSB0aGUgcGFyc2VyLgotCSAqCi0JICogQHJldHVybiBtdWx0aS1zdGF0dXMgY29udGFpbmluZyBhY2N1bXVsYXRlZCBzdGF0dXMsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgTXVsdGlTdGF0dXMgZ2V0U3RhdHVzKCkgewotCQlyZXR1cm4gZmVhdHVyZVBhcnNlci5nZXRTdGF0dXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgc3RhcnQgb2YgZWxlbWVudCB0YWdzCi0JICogQHNlZSBEZWZhdWx0SGFuZGxlciNzdGFydEVsZW1lbnQoU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgQXR0cmlidXRlcykKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJaWYobG9jYWxOYW1lLmVxdWFscygiZGlnZXN0IikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJaWYobG9jYWxOYW1lLmVxdWFscygiZmVhdHVyZSIpKSAvLyROT04tTkxTLTEkCi0JCQlmZWF0dXJlUGFyc2VyLmludGVybmFsSW5pdChmYWN0b3J5LCBsb2NhdGlvbik7Ci0JCQotCQlmZWF0dXJlUGFyc2VyLnN0YXJ0RWxlbWVudCh1cmksIGxvY2FsTmFtZSwgcU5hbWUsIGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBlbmQgb2YgZWxlbWVudCB0YWdzCi0JICogQHNlZSBEZWZhdWx0SGFuZGxlciNlbmRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcpCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB7Ci0JCWlmKGxvY2FsTmFtZS5lcXVhbHMoImRpZ2VzdCIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCWZlYXR1cmVQYXJzZXIuZW5kRWxlbWVudCh1cmksIGxvY2FsTmFtZSwgcU5hbWUpOwotCQlpZihsb2NhbE5hbWUuZXF1YWxzKCJmZWF0dXJlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdHJ5IHsKLQkJCQlmZWF0dXJlTW9kZWxzLmFkZChmZWF0dXJlUGFyc2VyLmdldEZlYXR1cmVNb2RlbCgpKTsKLQkJCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gCi0JCX0KLQl9Ci0JCi0KLQkvKioKLQkgKiBIYW5kbGUgY2hhcmFjdGVyIHRleHQKLQkgKiBAc2VlIERlZmF1bHRIYW5kbGVyI2NoYXJhY3RlcnMoY2hhcltdLCBpbnQsIGludCkKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlmZWF0dXJlUGFyc2VyLmNoYXJhY3RlcnMoY2gsIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBlcnJvcnMKLQkgKiBAc2VlIERlZmF1bHRIYW5kbGVyI2Vycm9yKFNBWFBhcnNlRXhjZXB0aW9uKQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleCkgewotCQlmZWF0dXJlUGFyc2VyLmVycm9yKGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgZmF0YWwgZXJyb3JzCi0JICogQHNlZSBEZWZhdWx0SGFuZGxlciNmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uKQotCSAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlmZWF0dXJlUGFyc2VyLmZhdGFsRXJyb3IoZXgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjaWdub3JhYmxlV2hpdGVzcGFjZShjaGFyW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGlnbm9yYWJsZVdoaXRlc3BhY2UoY2hhcltdIGFyZzAsIGludCBhcmcxLCBpbnQgYXJnMikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWZlYXR1cmVQYXJzZXIuaWdub3JhYmxlV2hpdGVzcGFjZShhcmcwLCBhcmcxLCBhcmcyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0VtcHR5RGlyZWN0b3J5RXhjZXB0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0VtcHR5RGlyZWN0b3J5RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMmUxNzQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9FbXB0eURpcmVjdG9yeUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLXB1YmxpYyBjbGFzcyBFbXB0eURpcmVjdG9yeUV4Y2VwdGlvbiBleHRlbmRzIENvcmVFeGNlcHRpb24gewotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTc2MjkzMDY2Nzg4MzI2NTIyOEw7Ci0KLQlwdWJsaWMgRW1wdHlEaXJlY3RvcnlFeGNlcHRpb24oSVN0YXR1cyBzdGF0dXMpIHsKLQkJc3VwZXIoc3RhdHVzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRXJyb3JSZWNvdmVyeUxvZy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9FcnJvclJlY292ZXJ5TG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Nzc2NGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9FcnJvclJlY292ZXJ5TG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuQ29uZmlndXJhdG9yVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5JUGxhdGZvcm1Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlV0aWxpdGllczsKLQotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGVycm9yL3JlY292ZXIgbG9nIGZpbGUKLSAqLwotcHVibGljIGNsYXNzIEVycm9yUmVjb3ZlcnlMb2cgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9SRUNPVkVSWV9MT0cgPSAiZXJyb3JfcmVjb3ZlcnkubG9nIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfRU5UUllfS0VZID0gIkxvZ0VudHJ5LiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUVVJOX0NBUlJJQUdFID0gIlxyXG4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9PRl9GSUxFID0gImVvZj1lb2YiOyAvLyROT04tTkxTLTEkCi0KLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX0lOU1RBTExfTE9HID0gCSJTVEFSVF9JTlNUQUxMX0xPRyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fRU5UUlkgPSAJCSJQTFVHSU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJBR01FTlRfRU5UUlkgPSAJCSJGUkFHTUVOVCI7CSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX01BTklGRVNUX0VOVFJZID0gCQkiQlVORExFX01BTklGRVNUIjsJIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfSkFSX0VOVFJZID0gCQkJIkJVTkRMRSI7CSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9FTlRSWSA9IAkJIkZFQVRVUkUiOyAvLyROT04tTkxTLTEkMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTF9JTlNUQUxMRUQgPSAJCSJBTExfRkVBVFVSRVNfSU5TVEFMTEVEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTkFNRV9FTlRSWSA9IAkJIlJFTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfSU5TVEFMTF9MT0cgPSAJIkVORF9JTlNUQUxMX0xPRyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVF9SRU1PVkVfTE9HID0gCSJSRU1PVkVfTE9HIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9BQk9VVF9SRU1PVkUgPQkiRU5EX0FCT1VUX1RPX1JFTU9WRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfRU5UUlkgPSAJCSJERUxFVEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX1JFTU9WRV9MT0cgPSAJCSJFTkRfUkVNT1ZFX0xPRyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIEVycm9yUmVjb3ZlcnlMb2cgaW5zdDsKLQlwcml2YXRlIEZpbGVXcml0ZXIgb3V0OwotCXByaXZhdGUgaW50IGluZGV4OwotCXByaXZhdGUgTGlzdCBwYXRoczsKLQkKLQlwcml2YXRlIGJvb2xlYW4gb3BlbiA9IGZhbHNlOwotCXByaXZhdGUgaW50IG5iT2ZPcGVuID0gMDsKLQkKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBFcnJvclJlY292ZXJ5TG9nLgotCSAqLwotCXByaXZhdGUgRXJyb3JSZWNvdmVyeUxvZygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBTaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVycm9yUmVjb3ZlcnlMb2cgZ2V0TG9nKCkgewotCQlpZiAoaW5zdCA9PSBudWxsKXsKLQkJCWluc3QgPSBuZXcgRXJyb3JSZWNvdmVyeUxvZygpOwotCQl9Ci0JCXJldHVybiBpbnN0OwotCX0KLQotCS8qKgotCSAqIGdldCBhIHVuaXF1ZSBpZGVudGlmZXIgZm9yIHRoZSBmaWxlLCBlbnN1cmUgdW5pcXVlbmVzcyB1cCB0byBub3cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMb2NhbFJhbmRvbUlkZW50aWZpZXIoU3RyaW5nIHBhdGgpIHsKLQkJCi0JCWlmIChwYXRoPT1udWxsKSByZXR1cm4gbnVsbDsKLQkJCi0JCS8vIHZlcmlmeSBpZiBpdCB3aWxsIGJlIGEgZGlyZWN0b3J5IHdpdGhvdXQgY3JlYXRpbmcgdGhlIGZpbGUKLQkJLy8gYXMgaXQgZG9lc24ndCBleGlzdCB5ZXQKLQkJaWYgKHBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpIHx8IHBhdGguZW5kc1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHBhdGg7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotCQlTdHJpbmcgbmV3TmFtZSA9Ci0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0TG9jYWxSYW5kb21JZGVudGlmaWVyKGZpbGUuZ2V0TmFtZSgpLCBuZXcgRGF0ZSgpKTsKLQkJd2hpbGUgKG5ldyBGaWxlKGZpbGUuZ2V0UGFyZW50RmlsZSgpLCBuZXdOYW1lKS5leGlzdHMoKSkgewotCQkJbmV3TmFtZSA9Ci0JCQkJVXBkYXRlTWFuYWdlclV0aWxzLmdldExvY2FsUmFuZG9tSWRlbnRpZmllcihmaWxlLmdldE5hbWUoKSwgbmV3IERhdGUoKSk7Ci0JCX0KLQkJRmlsZSBuZXdGaWxlID0gbmV3IEZpbGUoZmlsZS5nZXRQYXJlbnRGaWxlKCksbmV3TmFtZSk7Ci0JCXJldHVybiBuZXdGaWxlLmdldEFic29sdXRlUGF0aCgpOwotCX0KLQotCS8qKgotCSAqIHJldHVybnMgdGhlIGxvZyBmaWxlIAotCSAqIFdlIGRvIG5vdCBjaGVjayBpZiB0aGUgZmlsZSBleGlzdHMKLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRSZWNvdmVyeUxvZ0ZpbGUoKSB7Ci0JCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9Ci0JCQlDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7Ci0JCVVSTCBsb2NhdGlvbiA9IGNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCk7Ci0JCVN0cmluZyBsb2NhdGlvblN0cmluZyA9IGxvY2F0aW9uLmdldEZpbGUoKTsKLQkJRmlsZSBwbGF0Zm9ybUNvbmZpZ3VyYXRpb24gPSBuZXcgRmlsZShsb2NhdGlvblN0cmluZyk7Ci0JCWlmICghcGxhdGZvcm1Db25maWd1cmF0aW9uLmlzRGlyZWN0b3J5KCkpIHBsYXRmb3JtQ29uZmlndXJhdGlvbiA9IHBsYXRmb3JtQ29uZmlndXJhdGlvbi5nZXRQYXJlbnRGaWxlKCk7Ci0JCXJldHVybiBuZXcgRmlsZShwbGF0Zm9ybUNvbmZpZ3VyYXRpb24sIEVSUk9SX1JFQ09WRVJZX0xPRyk7Ci0JfQotCi0KLQkvKioKLQkgKiBPcGVuIHRoZSBsb2cKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuKFN0cmluZyBsb2dFbnRyeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAob3BlbikgewotCQkJbmJPZk9wZW4rKzsJCQkKLQkJCVVwZGF0ZUNvcmUud2FybigiT3BlbiBuZXN0ZWQgRXJyb3IvUmVjb3ZlcnkgbG9nICMiK25iT2ZPcGVuKyI6Iitsb2dFbnRyeSk7CQkJCSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJRmlsZSBsb2dGaWxlID0gbnVsbDsJCQotCQl0cnkgewotCQkJbG9nRmlsZSA9IGdldFJlY292ZXJ5TG9nRmlsZSgpOwotCQkJb3V0ID0gbmV3IEZpbGVXcml0ZXIobG9nRmlsZSk7Ci0JCQlpbmRleCA9IDA7Ci0JCQlwYXRocz1udWxsOwotCQkJb3Blbj10cnVlOwotCQkJbmJPZk9wZW49MDsKLQkJCVVwZGF0ZUNvcmUud2FybigiU3RhcnQgbmV3IEVycm9yL1JlY292ZXJ5IGxvZyAjIituYk9mT3BlbisiOiIrbG9nRW50cnkpOwkJCQkJCQkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLlVwZGF0ZU1hbmFnZXJVdGlsc19VbmFibGVUb0xvZywgKG5ldyBPYmplY3RbXSB7IGxvZ0ZpbGUgfSkpLAotCQkJCWUpOwotCQl9Ci0JCQotCQlhcHBlbmQobG9nRW50cnkpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3RyaW5nIHRvIHRoZSBsb2cgYW5kIGZsdXNoCi0JICovCi0JcHVibGljIHZvaWQgYXBwZW5kKFN0cmluZyBsb2dFbnRyeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlGaWxlIGxvZ0ZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKCFvcGVuKSB7Ci0JCQkJVXBkYXRlQ29yZS53YXJuKCJJbnRlcm5hbCBFcnJvcjogVGhlIEVycm9yL1JlY292ZXJ5IGxvZyBpcyBub3Qgb3BlbjoiK2xvZ0VudHJ5KTsJCQkJIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKExPR19FTlRSWV9LRVkpOwotCQkJYnVmZmVyLmFwcGVuZChpbmRleCk7Ci0JCQlidWZmZXIuYXBwZW5kKCI9Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQobG9nRW50cnkpOwotCQkJYnVmZmVyLmFwcGVuZChSRVRVUk5fQ0FSUklBR0UpOwotCi0JCQlvdXQud3JpdGUoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJb3V0LmZsdXNoKCk7Ci0JCQlpbmRleCsrOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQlOTFMuYmluZChNZXNzYWdlcy5VcGRhdGVNYW5hZ2VyVXRpbHNfVW5hYmxlVG9Mb2csIChuZXcgT2JqZWN0W10geyBsb2dGaWxlIH0pKSwKLQkJCQllKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3RyaW5nIHRvIHRoZSBsb2cgYW5kIGZsdXNoCi0JICovCi0JcHVibGljIHZvaWQgYXBwZW5kUGF0aChTdHJpbmcgbG9nRW50cnksIFN0cmluZyBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChwYXRoID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxvZ0VudHJ5KTsKLQkJYnVmZmVyLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQocGF0aCk7Ci0JCWFwcGVuZChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQotCQlhZGRQYXRoKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIENsb3NlIGFueSBvcGVuIHJlY292ZXJ5IGxvZwotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKFN0cmluZyBsb2dFbnRyeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJaWYgKG5iT2ZPcGVuPjApewotCQkJVXBkYXRlQ29yZS53YXJuKCJDbG9zZSBuZXN0ZWQgRXJyb3IvUmVjb3ZlcnkgbG9nICMiK25iT2ZPcGVuKyI6Iitsb2dFbnRyeSk7CQkJIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbmJPZk9wZW4tLTsJCQkKLQkJCXJldHVybjsKLQkJfQkJCQotCQkKLQkJVXBkYXRlQ29yZS53YXJuKCJDbG9zZSBFcnJvci9SZWNvdmVyeSBsb2cgIyIrbmJPZk9wZW4rIjoiK2xvZ0VudHJ5KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFwcGVuZChsb2dFbnRyeSk7Ci0JCWlmIChvdXQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlvdXQud3JpdGUoRU5EX09GX0ZJTEUpOwotCQkJCW91dC5mbHVzaCgpOwotCQkJCW91dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeyAvL2VhdCB0aGUgZXhjZXB0aW9uCi0JCQl9IGZpbmFsbHkgewotCQkJCW91dCA9IG51bGw7Ci0JCQkJb3Blbj1mYWxzZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIERlbGV0ZSB0aGUgZmlsZSBmcm9tIHRoZSBmaWxlIHN5c3RlbQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZSgpIHsKLQkJLy9GaWxlIGxvZ0ZpbGUgPSBnZXRSZWNvdmVyeUxvZ0ZpbGUoKTsKLQkJZ2V0UmVjb3ZlcnlMb2dGaWxlKCk7Ci0JCS8vaWYgKGxvZ0ZpbGUuZXhpc3RzKCkpCi0JCQkvL2xvZ0ZpbGUuZGVsZXRlKCk7CQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRQYXRoKFN0cmluZyBwYXRoKXsKLQkJaWYgKHBhdGhzPT1udWxsKSBwYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcGF0aHMuYWRkKHBhdGgpOwotCX0KLQkKLQkvKgotCSAqIGNyZWF0ZXMgYSBTdGF0dXMKLQkgKi8KLQlwcml2YXRlIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzdGF0dXNTZXZlcml0eSwgU3RyaW5nIG1zZywgRXhjZXB0aW9uIGUpewotCQlTdHJpbmcgaWQgPQotCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQkKLQkJU3RyaW5nQnVmZmVyIGNvbXBsZXRlU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1zZyE9bnVsbCkKLQkJCWNvbXBsZXRlU3RyaW5nLmFwcGVuZChtc2cpOwotCQlpZiAoZSE9bnVsbCl7Ci0JCQljb21wbGV0ZVN0cmluZy5hcHBlbmQoIlxyXG5bIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNvbXBsZXRlU3RyaW5nLmFwcGVuZChlLnRvU3RyaW5nKCkpOwotCQkJY29tcGxldGVTdHJpbmcuYXBwZW5kKCJdXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG5ldyBTdGF0dXMoc3RhdHVzU2V2ZXJpdHksIGlkLCBJU3RhdHVzLk9LLCBjb21wbGV0ZVN0cmluZy50b1N0cmluZygpLCBlKTsKLQl9CQotCQotCS8qKgotCSAqIHJldHVybiBhIG11bHRpIHN0YXR1cywgCi0JICogdGhlIGNoaWxkcmVuIGFyZSB0aGUgZmlsZSB0aGF0IGNvdWxkbid0IGJlIHJlbW92ZWQKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyByZW1vdmVGcm9tRmlsZVN5c3RlbShGaWxlIGZpbGUpIHsKLQkJCi0JCUlTdGF0dXMgbWFpblN0YXR1cyA9IGNyZWF0ZVN0YXR1cyhJU3RhdHVzLk9LLCIiLG51bGwpOyAvLyROT04tTkxTLTEkCi0JCU11bHRpU3RhdHVzIG11bHRpID0gbmV3IE11bHRpU3RhdHVzKG1haW5TdGF0dXMuZ2V0UGx1Z2luKCksbWFpblN0YXR1cy5nZXRDb2RlKCksIiIsbnVsbCk7CQkgLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYgKCFmaWxlLmV4aXN0cygpKXsKLQkJCW11bHRpLmFkZChjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUixNZXNzYWdlcy5FcnJvclJlY292ZXJ5TG9nX25vRmlsZXRvUmVtb3ZlK2ZpbGUsbnVsbCkpOyAKLQkJCXJldHVybiBtdWx0aTsKLQkJfQotCQkJCi0JCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCVN0cmluZ1tdIGZpbGVzID0gZmlsZS5saXN0KCk7Ci0JCQlpZiAoZmlsZXMgIT0gbnVsbCkgLy8gYmUgY2FyZWZ1bCBzaW5jZSBmaWxlLmxpc3QoKSBjYW4gcmV0dXJuIG51bGwKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgKytpKXsKLQkJCQkJbXVsdGkuYWRkQWxsKHJlbW92ZUZyb21GaWxlU3lzdGVtKG5ldyBGaWxlKGZpbGUsIGZpbGVzW2ldKSkpOwotCQkJCX0KLQkJfQotCQkKLQkJaWYgKCFmaWxlLmRlbGV0ZSgpKSB7Ci0JCQlTdHJpbmcgbXNnID0gIlVuYWJsZSB0byByZW1vdmUgZmlsZSIgK2ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7IC8vJE5PTi1OTFMtMSQgCi0JCQltdWx0aS5hZGQoY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsbXNnLG51bGwpKTsKLQkJfQotCQlyZXR1cm4gbXVsdGk7Ci0JfQkKLQkKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRXh0ZW5kZWRTaXRlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0V4dGVuZGVkU2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDEwYmFiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRXh0ZW5kZWRTaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklVUkxFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5WZXJzaW9uZWRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC5TaXRlV2l0aFRpbWVzdGFtcDsKLQotcHVibGljIGNsYXNzIEV4dGVuZGVkU2l0ZSBleHRlbmRzIFNpdGVXaXRoVGltZXN0YW1wIC8qU2l0ZSovIHsKLQkKLQlwcml2YXRlIGJvb2xlYW4gZGlnZXN0RXhpc3Q7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBhdmFpbGFibGVMb2NhbHM7Ci0JcHJpdmF0ZSBTdHJpbmcgZGlnZXN0VVJMOwotCXByaXZhdGUgTGl0ZUZlYXR1cmVbXSBsaXRlRmVhdHVyZXM7Ci0JcHJpdmF0ZSBMaXRlRmVhdHVyZVtdIGFsbExpdGVGZWF0dXJlczsKLQlwcml2YXRlIElVUkxFbnRyeVtdIGFzc29jaWF0ZVNpdGVzOwotCXByaXZhdGUgYm9vbGVhbiBwYWNrMjAwID0gZmFsc2U7Ci0JcHJpdmF0ZSBJVVJMRW50cnkgc2VsZWN0ZWRNaXJyb3I7Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXREaWdlc3RVUkwoKSB7Ci0JCXJldHVybiBkaWdlc3RVUkw7Ci0JfQotCXB1YmxpYyB2b2lkIHNldERpZ2VzdFVSTChTdHJpbmcgZGlnZXN0VVJMKSB7Ci0JCXRoaXMuZGlnZXN0VVJMID0gZGlnZXN0VVJMOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRBdmFpbGFibGVMb2NhbHMoKSB7Ci0JCXJldHVybiBhdmFpbGFibGVMb2NhbHM7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEF2YWlsYWJsZUxvY2FscyhTdHJpbmdbXSBhdmFpbGFibGVMb2NhbHMpIHsKLQkJdGhpcy5hdmFpbGFibGVMb2NhbHMgPSBhdmFpbGFibGVMb2NhbHM7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzRGlnZXN0RXhpc3QoKSB7Ci0JCXJldHVybiBkaWdlc3RFeGlzdDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0RGlnZXN0RXhpc3QoYm9vbGVhbiBkaWdlc3RFeGlzdCkgewotCQl0aGlzLmRpZ2VzdEV4aXN0ID0gZGlnZXN0RXhpc3Q7Ci0JfQotCXB1YmxpYyBMaXRlRmVhdHVyZVtdIGdldExpdGVGZWF0dXJlcygpIHsKLQkJaWYgKGdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpIT1udWxsKQotCQkJcmV0dXJuIGZpbHRlckZlYXR1cmVzKGdldE5vbkZpbHRlcmVkTGl0ZUZlYXR1cmVzKCkpOwotCQllbHNlIAotCQkJcmV0dXJuIGdldE5vbkZpbHRlcmVkTGl0ZUZlYXR1cmVzKCk7Ci0JfQotCXB1YmxpYyB2b2lkIHNldExpdGVGZWF0dXJlcyhMaXRlRmVhdHVyZVtdIGxpdGVGZWF0dXJlcykgewotCQkKLQkJaWYgKChsaXRlRmVhdHVyZXMgPT0gbnVsbCkgfHwgKGxpdGVGZWF0dXJlcy5sZW5ndGggPT0gMCkpCi0JCQlyZXR1cm47Ci0JCXRoaXMuYWxsTGl0ZUZlYXR1cmVzID0gbGl0ZUZlYXR1cmVzOwotCQlMaXN0IHRlbXAgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBhbGxMaXRlRmVhdHVyZXMubGVuZ3RoIDsgaSsrKSB7Ci0JCQlpZiAoZ2V0RmVhdHVyZVJlZmVyZW5jZShhbGxMaXRlRmVhdHVyZXNbaV0pICE9IG51bGwpIHsKLQkJCQl0ZW1wLmFkZChhbGxMaXRlRmVhdHVyZXNbaV0pOwotCQkJfQotCQl9Ci0JCWlmICghdGVtcC5pc0VtcHR5KCkpIHsKLQkJCXRoaXMubGl0ZUZlYXR1cmVzID0gKExpdGVGZWF0dXJlW10pdGVtcC50b0FycmF5KCBuZXcgTGl0ZUZlYXR1cmVbdGVtcC5zaXplKCldKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgTGl0ZUZlYXR1cmUgZ2V0TGl0ZUZlYXR1cmUoVmVyc2lvbmVkSWRlbnRpZmllciB2aWQpIHsKLQkJaWYgKGFsbExpdGVGZWF0dXJlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlmb3IoaW50IGkgPSAwOyBpIDwgYWxsTGl0ZUZlYXR1cmVzLmxlbmd0aCA7IGkrKykgewotCQkJaWYgKHZpZC5lcXVhbHMoYWxsTGl0ZUZlYXR1cmVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpIHsKLQkJCQlyZXR1cm4gYWxsTGl0ZUZlYXR1cmVzW2ldOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgTGl0ZUZlYXR1cmVbXSBnZXROb25GaWx0ZXJlZExpdGVGZWF0dXJlcygpIHsKLQkJcmV0dXJuIGxpdGVGZWF0dXJlczsKLQl9Ci0JcHVibGljIHZvaWQgc2V0Tm9uRmlsdGVyZWRMaXRlRmVhdHVyZXMoTGl0ZUZlYXR1cmVbXSBsaXRlRmVhdHVyZXMpIHsKLQkJdGhpcy5saXRlRmVhdHVyZXMgPSBsaXRlRmVhdHVyZXM7Ci0JfQotCQotCQotCS8qKgotCSAqIEdldCB3aGV0aGVyIG9yIG5vdCB0aGlzIHNpdGUgbWF5IGNvbnRhaW4gamFycyBwYWNrZWQgd2l0aCBwYWNrMjAwLgotCSAqIFRoZSBwYWNrZWQgdmVyc2lvbiBvZiBmb28uamFyLCBpcyBleHBlY3RlZCB0byBiZSBmb28uamFyLnBhY2suZ3oKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNQYWNrMjAwKCkgewotCQlyZXR1cm4gcGFjazIwMDsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHdoZXRoZXIgb3Igbm90IHRoaXMgc2l0ZSBtYXkgY29udGFpbiBqYXJzIHBhY2tlZCB3aXRoIHBhY2syMDAKLQkgKiBUaGUgcGFja2VkIHZlcnNpb24gb2YgZm9vLmphciBpcyBleHBlY3RlZCB0byBiZSBmb28uamFyLnBhY2suZ3oKLQkgKiBAcGFyYW0gcGFjawotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1cHBvcnRzUGFjazIwMChib29sZWFuIHBhY2spewotCQlwYWNrMjAwID0gcGFjazsKLQl9Ci0JCi0JLyoKLQkgKiBNZXRob2QgZmlsdGVyRmVhdHVyZXMuCi0JICogQWxzbyBpbXBsZW1lbnRlZCBpbiBGZWF0dXJlCi0JICogIAotCSAqIEBwYXJhbSBsaXN0Ci0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHJpdmF0ZSBMaXRlRmVhdHVyZVtdIGZpbHRlckZlYXR1cmVzKExpdGVGZWF0dXJlW10gYWxsSW5jbHVkZWQpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoYWxsSW5jbHVkZWQhPW51bGwpewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxJbmNsdWRlZC5sZW5ndGg7IGkrKykgewotCQkJCUxpdGVGZWF0dXJlIGluY2x1ZGVkID0gYWxsSW5jbHVkZWRbaV07Ci0JCQkJaWYgKFVwZGF0ZU1hbmFnZXJVdGlscy5pc1ZhbGlkRW52aXJvbm1lbnQoaW5jbHVkZWQpKQotCQkJCQlsaXN0LmFkZChpbmNsdWRlZCk7Ci0JCQkJZWxzZXsKLQkJCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1dBUk5JTkdTKXsKLQkJCQkJCVVwZGF0ZUNvcmUud2FybigiRmlsdGVyZWQgb3V0IGZlYXR1cmUgcmVmZXJlbmNlOiIraW5jbHVkZWQpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCUxpdGVGZWF0dXJlW10gcmVzdWx0ID0gbmV3IExpdGVGZWF0dXJlW2xpc3Quc2l6ZSgpXTsKLQkJaWYgKCFsaXN0LmlzRW1wdHkoKSl7Ci0JCQlsaXN0LnRvQXJyYXkocmVzdWx0KTsKLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsJCi0JfQotCXB1YmxpYyBJVVJMRW50cnlbXSBnZXRBc3NvY2lhdGVTaXRlcygpIHsKLQkJcmV0dXJuIGFzc29jaWF0ZVNpdGVzOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRBc3NvY2lhdGVTaXRlcyhJVVJMRW50cnlbXSBhc3NvY2lhdGVTaXRlcykgewotCQl0aGlzLmFzc29jaWF0ZVNpdGVzID0gYXNzb2NpYXRlU2l0ZXM7Ci0JfQotCQotCXB1YmxpYyBJVVJMRW50cnkgZ2V0U2VsZWN0ZWRNaXJyb3IoKSB7Ci0JCXJldHVybiBzZWxlY3RlZE1pcnJvcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRNaXJyb3IoSVVSTEVudHJ5IHNlbGVjdGVkTWlycm9yKSB7Ci0JCXRoaXMuc2VsZWN0ZWRNaXJyb3IgPSBzZWxlY3RlZE1pcnJvcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRXh0ZW5kZWRTaXRlVVJMRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9FeHRlbmRlZFNpdGVVUkxGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYTM5ODEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9FeHRlbmRlZFNpdGVVUkxGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5TaXRlTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZFNpdGVVUkxGYWN0b3J5IGV4dGVuZHMgU2l0ZVVSTEZhY3RvcnkgewotCQotCXB1YmxpYyBTaXRlTW9kZWwgY3JlYXRlU2l0ZU1hcE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IEV4dGVuZGVkU2l0ZSgpOwotCX0KLQotCQotICAgIC8vcHVibGljIFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgY3JlYXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKCkgewotICAgIC8vICAgIHJldHVybiBuZXcgVXBkYXRlU2l0ZUxpdGVGZWF0dXJlUmVmZXJlbmNlKCk7Ci0gICAgLy99Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZhdGFsSU9FeGNlcHRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmF0YWxJT0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODJlZTA2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmF0YWxJT0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIEZhdGFsSU9FeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNzY5MDMxODA4NzUwNTQ3OTAzOUw7Ci0KLQlwdWJsaWMgRmF0YWxJT0V4Y2VwdGlvbihTdHJpbmcgc3RyaW5nKSB7Ci0JCXN1cGVyKHN0cmluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlQ29udGVudENvbnN1bWVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVDb250ZW50Q29uc3VtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc4ZGU2OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVDb250ZW50Q29uc3VtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotCi0vKioKLSAqIEEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIKLSAqIDwvcD4KLSAqIEBzaW5jZSAyLjAKLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmVhdHVyZUNvbnRlbnRDb25zdW1lciBleHRlbmRzIE1vZGVsT2JqZWN0Ci0JaW1wbGVtZW50cyBJRmVhdHVyZUNvbnRlbnRDb25zdW1lciB7Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZURvd25sb2FkRXhjZXB0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVEb3dubG9hZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWYxZDYxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZURvd25sb2FkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotLyoqCi0gKiBFeGNlcHRpb24gdGhyb3duIHdoZW4gSU9FeGNlcHRpb24gZHVyaW5nIGRvd25sb2FkaW5nIGZlYXR1cmVzCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIEZlYXR1cmVEb3dubG9hZEV4Y2VwdGlvbiBleHRlbmRzIENvcmVFeGNlcHRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAvKioKLQkgKiBDb25zdHJ1Y3QgdGhlIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIGVuY2xvc2luZyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBGZWF0dXJlRG93bmxvYWRFeGNlcHRpb24oU3RyaW5nIG1zZywgRXhjZXB0aW9uIGUpIHsKLQkJc3VwZXIoCi0JCQluZXcgU3RhdHVzKAotCQkJCUlTdGF0dXMuSU5GTywKLQkJCQkib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiLCAvLyROT04tTkxTLTEkCi0JCQkJSVN0YXR1cy5PSywKLQkJCQltc2csCi0JCQkJZSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlRW50cnlXcmFwcGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVFbnRyeVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExZWNhNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVFbnRyeVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuRmVhdHVyZUVudHJ5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogQ2xhc3MgdXNlZCB0byB3cmFwcGVyIGZlYXR1cmUgZW50cnkgb2JqZWN0cy4gVGhpcyBjbGFzcyBpcyBuZWNlc3NhcnkKLSAqIHRvIHJlbW92ZSB0aGUgZGVwZWRhbmN5IG9mIHRoZSBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yIG9uIAotICogdGhlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSBidW5kbGUuCi0gKgotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgRmVhdHVyZUVudHJ5V3JhcHBlciBpbXBsZW1lbnRzIElQcm9kdWN0IHsKLQotCXByaXZhdGUgRmVhdHVyZUVudHJ5IGVudHJ5OwotCi0JLyoKLQkgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNsYXNzLgotCSAqLwotCXB1YmxpYyBGZWF0dXJlRW50cnlXcmFwcGVyKEZlYXR1cmVFbnRyeSBlbnRyeSkgewotCQlzdXBlcigpOwotCQl0aGlzLmVudHJ5ID0gZW50cnk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9kdWN0I2dldEFwcGxpY2F0aW9uKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFwcGxpY2F0aW9uKCkgewotCQlyZXR1cm4gZW50cnkuZ2V0QXBwbGljYXRpb24oKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2R1Y3QjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZW50cnkuZ2V0TmFtZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZHVjdCNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGVudHJ5LmdldERlc2NyaXB0aW9uKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9kdWN0I2dldElkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZW50cnkuZ2V0SWQoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2R1Y3QjZ2V0UHJvcGVydHkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGVudHJ5LmdldFByb3BlcnR5KGtleSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9kdWN0I2dldERlZmluaW5nQnVuZGxlKCkKLQkgKi8KLQlwdWJsaWMgQnVuZGxlIGdldERlZmluaW5nQnVuZGxlKCkgewotCQlyZXR1cm4gZW50cnkuZ2V0RGVmaW5pbmdCdW5kbGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVFeGVjdXRhYmxlQ29udGVudENvbnN1bWVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVFeGVjdXRhYmxlQ29udGVudENvbnN1bWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMjZkODcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRDb25zdW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5Db250ZW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklDb250ZW50Q29uc3VtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVDb250ZW50Q29uc3VtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSU5vblBsdWdpbkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklQbHVnaW5FbnRyeTsKLQotLyoqCi0gKiBDb250ZW50Q29uc3VtZXIgSW1wbGVtZW50YXRpb24gZm9yIGEgRmVhdHVyZUV4ZWN1dGFibGUKLSAqLwotCi1wdWJsaWMgY2xhc3MgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50Q29uc3VtZXIgZXh0ZW5kcyBGZWF0dXJlQ29udGVudENvbnN1bWVyIHsKLQotCXByaXZhdGUgSUZlYXR1cmUgZmVhdHVyZTsKLQlwcml2YXRlIGJvb2xlYW4gY2xvc2VkPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gYWJvcnRlZD0gZmFsc2U7CQotCXByaXZhdGUgSVNpdGVDb250ZW50Q29uc3VtZXIgY29udGVudENvbnN1bWVyOwotCXByaXZhdGUgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgcGFyZW50ID0gbnVsbDsKLQlwcml2YXRlIExpc3QgLyogb2YgSUZlYXR1cmVDb250ZW50Q09uc3VtZXIgKi8gY2hpbGRyZW47Ci0KLQkvKgotCSAqIEBzZWUgSUNvbnRlbnRDb25zdW1lciNvcGVuKElOb25QbHVnaW5FbnRyeSkKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRDb25zdW1lciBvcGVuKElOb25QbHVnaW5FbnRyeSBub25QbHVnaW5FbnRyeSkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlDb250ZW50Q29uc3VtZXIgY29ucyA9IG5ldyBOb25QbHVnaW5FbnRyeUNvbnRlbnRDb25zdW1lcigKLQkJCWdldENvbnRlbnRDb25zdW1lcigpLm9wZW4obm9uUGx1Z2luRW50cnkpKTsKLQkJcmV0dXJuIGNvbnM7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElDb250ZW50Q29uc3VtZXIjb3BlbihJUGx1Z2luRW50cnkpCi0JICovCi0JcHVibGljIElDb250ZW50Q29uc3VtZXIgb3BlbihJUGx1Z2luRW50cnkgcGx1Z2luRW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQ29udGVudENvbnN1bWVyIGNvbnMgPSBuZXcgUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIoZ2V0Q29udGVudENvbnN1bWVyKCkub3BlbihwbHVnaW5FbnRyeSkpOwotCQlyZXR1cm4gY29uczsJCQotCX0KLQotCS8qCi0JICogQHNlZSBJQ29udGVudENvbnN1bWVyI2FkZENoaWxkKElGZWF0dXJlKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoaWxkKElGZWF0dXJlIGNoaWxkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGZWF0dXJlQ29udGVudENvbnN1bWVyIGNoaWxkQ29uc3VtZXIgPSBjaGlsZC5nZXRGZWF0dXJlQ29udGVudENvbnN1bWVyKCk7Ci0JCWNoaWxkQ29uc3VtZXIuc2V0UGFyZW50KHRoaXMpOwotCQlpZiAoY2hpbGRyZW49PW51bGwpIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQljaGlsZHJlbi5hZGQoY2hpbGRDb25zdW1lcik7Ci0JCXJldHVybjsKLQl9Ci0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRDb25zdW1lciNzdG9yZShDb250ZW50UmVmZXJlbmNlLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3JlKENvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWdldENvbnRlbnRDb25zdW1lcigpLnN0b3JlKGNvbnRlbnRSZWZlcmVuY2UsIG1vbml0b3IpOwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRDb25zdW1lciNjbG9zZSgpCi0JICovCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGNsb3NlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJaWYgKCFjbG9zZWQgJiYgZ2V0UGFyZW50KCkhPW51bGwpewotCQkJY2xvc2VkPXRydWU7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJLy8gcGFyZW50IGNvbnN1bWVyLCBsb2cgd2UgYXJlIGFib3V0IHRvIHJlbmFtZQotCQkvLyBsb2cgZmlsZXMgaGF2ZSBiZWVuIGRvd25sb2FkZWQKLQkJaWYgKGdldFBhcmVudCgpPT1udWxsKXsKLQkJCUVycm9yUmVjb3ZlcnlMb2cuZ2V0TG9nKCkuYXBwZW5kKEVycm9yUmVjb3ZlcnlMb2cuQUxMX0lOU1RBTExFRCk7Ci0JCX0KLQkJCi0JCUlGZWF0dXJlUmVmZXJlbmNlIHJlZj0gbnVsbDsKLQkJaWYgKGNvbnRlbnRDb25zdW1lciAhPSBudWxsKQotCQkJcmVmID0gY29udGVudENvbnN1bWVyLmNsb3NlKCk7Ci0JCQotCQkvLyBjbG9zZSBuZXN0ZWQgZmVhdHVyZQotCQlJRmVhdHVyZUNvbnRlbnRDb25zdW1lcltdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJY2hpbGRyZW5baV0uY2xvc2UoKTsKLQkJfQotCQkJCQkJCQotCQlyZXR1cm4gcmVmOwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRDb25zdW1lciNzZXRGZWF0dXJlKElGZWF0dXJlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoSUZlYXR1cmUgZmVhdHVyZSkgewotCQl0aGlzLmZlYXR1cmU9IGZlYXR1cmU7Ci0JfQotCi0JLyoKLQkgKiBTZXRzIHRoZSBwYXJlbnQgCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KElGZWF0dXJlQ29udGVudENvbnN1bWVyIGZlYXR1cmVDb250ZW50Q29uc3VtZXIpIHsKLQkJdGhpcy5wYXJlbnQ9IGZlYXR1cmVDb250ZW50Q29uc3VtZXI7Ci0JfQotCi0JLyoKLQkgKiByZXR1cm5zIHRoZSBDb250ZW50IENvbnN1bWVyIGZvciB0aGUgZmVhdHVyZQotCSAqIAotCSAqIFJpZ2h0IG5vdyB3ZSBhcmUgdGhlIG9ubHkgb25lIHRvIGltcGxlbWVudCBTaXRlQ29udGVudENvbnN1bWVyCi0JICogTmVlZCB0byBiZSBleHBvc2VkIGFzIEFQSSBwb3N0IHYyLjAKLQkgKi8KLQlwcml2YXRlIElTaXRlQ29udGVudENvbnN1bWVyIGdldENvbnRlbnRDb25zdW1lcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGNvbnRlbnRDb25zdW1lciA9PSBudWxsKQotCQkJaWYgKGZlYXR1cmUuZ2V0U2l0ZSgpIGluc3RhbmNlb2YgU2l0ZUZpbGUpIHsKLQkJCQlTaXRlRmlsZSBzaXRlPSAoU2l0ZUZpbGUpIGZlYXR1cmUuZ2V0U2l0ZSgpOwotCQkJCWNvbnRlbnRDb25zdW1lcj0gc2l0ZS5jcmVhdGVTaXRlQ29udGVudENvbnN1bWVyKGZlYXR1cmUpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJcmV0dXJuIGNvbnRlbnRDb25zdW1lcjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIjYWJvcnQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFib3J0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWlmIChhYm9ydGVkKSByZXR1cm47Ci0JCQotCQlJRmVhdHVyZUNvbnRlbnRDb25zdW1lcltdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCWNoaWxkcmVuW2ldLmFib3J0KCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQkJLy9kbyBOb3RoaW5nCi0JCQl9Ci0JCX0KLQotCQkvLyBkbyBub3QgY2xvc2UgcGx1Z2luIGFuZCBub24gcGx1Z2luIGNvbnRlbnQgY29uc3VtZXIKLQkJLy8gdGhlIGNvbnRlbnRDb25zdW1lciB3aWxsIGFib3J0IHRoZW0KLQkJLy8gd2UgZG8gbm90IG5lZWQgdG8gYWJvcnQgdGhlIE5vblBsdWdpbkVudHJ5Q29udGVudENvbnN1bWVyIGFuZCBQbHVnaW5FbnRyeUNvbnRlbnRDb25zdW1lCi0KLQkJLy9pbXBsZW1lbnQgdGhlIGNsZWFudXAKLQkJaWYgKGNvbnRlbnRDb25zdW1lciE9bnVsbCkKLQkJCWNvbnRlbnRDb25zdW1lci5hYm9ydCgpOwotCQkKLQkJYWJvcnRlZCA9IHRydWU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudENvbnN1bWVyI2dldEZlYXR1cmUoKQotCSAqLwotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKCl7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRDb25zdW1lciNnZXRQYXJlbnQoKQotCSAqLwotCXB1YmxpYyBJRmVhdHVyZUNvbnRlbnRDb25zdW1lciBnZXRQYXJlbnQoKXsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIjZ2V0Q2hpbGRyZW4oKQotCSAqLwotCXB1YmxpYyBJRmVhdHVyZUNvbnRlbnRDb25zdW1lcltdIGdldENoaWxkcmVuKCl7Ci0JCWlmIChjaGlsZHJlbj09bnVsbCB8fCBjaGlsZHJlbi5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBuZXcgSUZlYXR1cmVDb250ZW50Q29uc3VtZXJbMF07Ci0KLQkJcmV0dXJuIChJRmVhdHVyZUNvbnRlbnRDb25zdW1lcltdKSBjaGlsZHJlbi50b0FycmF5KGFycmF5VHlwZUZvcihjaGlsZHJlbikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJmNGM3MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLQotLyoqCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGEgRXhlY3V0YWJsZSBGZWF0dXJlIENvbnRlbnQgUHJvdmlkZXIKLSAqLwotCi1wdWJsaWMgY2xhc3MgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBGZWF0dXJlQ29udGVudFByb3ZpZGVyIHsKLQotCS8qCi0JICogQ29uc3RydWN0b3IgCi0JICovCi0JcHVibGljIEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyKFVSTCB1cmwpIHsKLQkJc3VwZXIodXJsKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiB0aGUgcGF0aCBmb3IgYSBwbHVnaW5FbnRyeQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFBhdGgoSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5KQotCQl0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCS8vIGdldCB0aGUgVVJMIG9mIHRoZSBBcmNoaXZlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgcGx1Z2luIGVudHJ5Ci0JCUlTaXRlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0RmVhdHVyZSgpLmdldFNpdGUoKS5nZXRTaXRlQ29udGVudFByb3ZpZGVyKCk7Ci0JCVVSTCBmaWxlVVJMID0gcHJvdmlkZXIuZ2V0QXJjaGl2ZVJlZmVyZW5jZShnZXRQYXRoSUQocGx1Z2luRW50cnkpKTsKLQkJU3RyaW5nIHJlc3VsdCA9IGZpbGVVUkwuZ2V0RmlsZSgpOwotCi0JCWlmICghcmVzdWx0LmVuZHNXaXRoKCIuamFyIikgJiYgIXJlc3VsdC5lbmRzV2l0aCgiLyIpICYmICFyZXN1bHQuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJlc3VsdCArPSBGaWxlLnNlcGFyYXRvcjsKLQkJRmlsZSBwbHVnaW5QYXRoID0gbmV3IEZpbGUocmVzdWx0KTsKLQkJaWYgKCFwbHVnaW5QYXRoLmV4aXN0cygpKQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKAotCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLkZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyX0ZpbGVEb2VzTm90RXhpc3QsIChuZXcgU3RyaW5nW10geyByZXN1bHQgfSkpKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgcGF0aCBmb3IgdGhlIEZlYXR1cmUKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRGZWF0dXJlUGF0aCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyByZXN1bHQgPSBnZXRGZWF0dXJlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOwotCi0JCS8vIHJldHVybiB0aGUgbGlzdCBvZiBhbGwgc3ViZGlyZWN0b3JpZXMKLQkJaWYgKCEocmVzdWx0LmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSB8fCByZXN1bHQuZW5kc1dpdGgoIi8iKSkpIC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdCArPSBGaWxlLnNlcGFyYXRvcjsKLQkJRmlsZSBwbHVnaW5EaXIgPSBuZXcgRmlsZShyZXN1bHQpOwotCQlpZiAoIXBsdWdpbkRpci5leGlzdHMoKSkKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigKLQkJCQlOTFMuYmluZChNZXNzYWdlcy5GZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcl9GaWxlRG9lc05vdEV4aXN0LCAobmV3IFN0cmluZ1tdIHsgcmVzdWx0IH0pKSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgYWxsIHRoZSBmaWxlcyB1bmRlciB0aGUgZGlyZWN0b3J5Ci0JICogUmVjdXJzaXZlIGNhbGwKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0RmlsZXMoRmlsZSBkaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmICghZGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCVN0cmluZyBtc2cgPQotCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLkZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyX0ludmFsaWREaXJlY3RvcnksIChuZXcgU3RyaW5nW10geyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkgfSkpOwotCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24obXNnKTsKLQotCQl9Ci0KLQkJRmlsZVtdIGZpbGVzID0gZGlyLmxpc3RGaWxlcygpOwotCQlpZiAoZmlsZXMgIT0gbnVsbCkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyArK2kpIHsKLQkJCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCQlyZXN1bHQuYWRkQWxsKGdldEZpbGVzKGZpbGVzW2ldKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzdWx0LmFkZChmaWxlc1tpXSk7Ci0JCQkJfQotCQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldFZlcmlmaWVyKCkKLQkgKi8KLQlwdWJsaWMgSVZlcmlmaWVyIGdldFZlcmlmaWVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0RmVhdHVyZU1hbmlmZXN0UmVmZXJlbmNlKCkKLQkgKi8KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZSBnZXRGZWF0dXJlTWFuaWZlc3RSZWZlcmVuY2UoSW5zdGFsbE1vbml0b3IgbW9uaXRvcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlDb250ZW50UmVmZXJlbmNlIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBuZXcgQ29udGVudFJlZmVyZW5jZShGZWF0dXJlLkZFQVRVUkVfWE1MLCBuZXcgVVJMKGdldFVSTCgpLCBGZWF0dXJlLkZFQVRVUkVfWE1MKSk7Ci0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLkZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyX1VuYWJsZVRvQ3JlYXRlVVJMRm9yLCAobmV3IFN0cmluZ1tdIHsgZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSArICIgIiArIEZlYXR1cmUuRkVBVFVSRV9YTUwgfSkpLCAvLyROT04tTkxTLTEkCi0JCQkJZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0QXJjaGl2ZVJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0QXJjaGl2ZVJlZmVyZW5jZXMoSW5zdGFsbE1vbml0b3IgbW9uaXRvcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBleGVjdXRhYmxlIGZlYXR1cmUgZG9lcyBub3QgY29udGFpbiBhcmNoaXZlcwotCQlyZXR1cm4gbmV3IENvbnRlbnRSZWZlcmVuY2VbMF07Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoSVBsdWdpbkVudHJ5KQotCSAqLwotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0UGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcygKLQkJSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5LAotCQlJbnN0YWxsTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUNvbnRlbnRSZWZlcmVuY2VbXSByZXN1bHQgPSBuZXcgQ29udGVudFJlZmVyZW5jZVsxXTsKLQkJU3RyaW5nIGFyY2hpdmVJRCA9IGdldFBhdGhJRChwbHVnaW5FbnRyeSk7Ci0JCXRyeSB7Ci0JCQlGaWxlIGFyY2hpdmVGaWxlID0gbmV3IEZpbGUoZ2V0UGF0aChwbHVnaW5FbnRyeSkpOwotCQkJaWYoIWFyY2hpdmVGaWxlLmlzRGlyZWN0b3J5KCkgJiYgYXJjaGl2ZUZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamFyIikpeyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0WzBdID0gbmV3IEphckNvbnRlbnRSZWZlcmVuY2UoYXJjaGl2ZUlELCBhcmNoaXZlRmlsZSk7CQkJCQotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHRbMF0gPQotCQkJCQluZXcgQ29udGVudFJlZmVyZW5jZShhcmNoaXZlSUQsIGFyY2hpdmVGaWxlKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLkZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyX1VuYWJsZVRvUmV0cmlldmVQbHVnaW5FbnRyeSwgKG5ldyBTdHJpbmdbXSB7IHBsdWdpbkVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpIH0pKSwKLQkJCQkJZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0Tm9uUGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhJTm9uUGx1Z2luRW50cnkpCi0JICovCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKAotCQlJTm9uUGx1Z2luRW50cnkgbm9uUGx1Z2luRW50cnksCi0JCUluc3RhbGxNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlDb250ZW50UmVmZXJlbmNlW10gcmVzdWx0ID0gbmV3IENvbnRlbnRSZWZlcmVuY2VbMV07Ci0JCVVSTCBmaWxlVVJMOwotCi0JCS8vdHJ5IHsKLQkJLy8gZ2V0IHRoZSBVUkwgb2YgdGhlIEFyY2hpdmUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBwbHVnaW4gZW50cnkKLQkJSVNpdGVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRGZWF0dXJlKCkuZ2V0U2l0ZSgpLmdldFNpdGVDb250ZW50UHJvdmlkZXIoKTsKLQkJZmlsZVVSTCA9IHByb3ZpZGVyLmdldEFyY2hpdmVSZWZlcmVuY2UoZ2V0UGF0aElEKG5vblBsdWdpbkVudHJ5KSk7Ci0KLQkJU3RyaW5nIGZpbGVTdHJpbmcgPSBmaWxlVVJMLmdldEZpbGUoKTsKLQkJRmlsZSBub25QbHVnaW5EYXRhID0gbmV3IEZpbGUoZmlsZVN0cmluZyk7Ci0JCWlmICghbm9uUGx1Z2luRGF0YS5leGlzdHMoKSkKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLkZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyX0ZpbGVEb2VzTm90RXhpc3QsIChuZXcgU3RyaW5nW10geyBmaWxlU3RyaW5nIH0pKSwgCi0JCQkJbnVsbCk7IAotCi0JCXRyeSB7Ci0JCQlyZXN1bHRbMF0gPQotCQkJCW5ldyBDb250ZW50UmVmZXJlbmNlKG5vblBsdWdpbkVudHJ5LmdldElkZW50aWZpZXIoKSwgbm9uUGx1Z2luRGF0YS50b1VSTCgpKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLkZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyX1VuYWJsZVRvUmV0cmlldmVOb25QbHVnaW5FbnRyeSwgKG5ldyBTdHJpbmdbXSB7IG5vblBsdWdpbkVudHJ5LmdldElkZW50aWZpZXIoKS50b1N0cmluZygpIH0pKSwKLQkJCQllKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhJbnN0YWxsTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUNvbnRlbnRSZWZlcmVuY2VbXSBjb250ZW50UmVmZXJlbmNlcyA9IG5ldyBDb250ZW50UmVmZXJlbmNlWzFdOwotCQljb250ZW50UmVmZXJlbmNlc1swXSA9IG5ldyBDb250ZW50UmVmZXJlbmNlKG51bGwsIGdldFVSTCgpKTsKLQkJcmV0dXJuIGNvbnRlbnRSZWZlcmVuY2VzOwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRGZWF0dXJlRW50cnlBcmNoaXZlc0NvbnRlbnRSZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldEZlYXR1cmVFbnRyeUNvbnRlbnRSZWZlcmVuY2VzKEluc3RhbGxNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQ29udGVudFJlZmVyZW5jZVtdIHJlc3VsdCA9IG5ldyBDb250ZW50UmVmZXJlbmNlWzBdOwotCQl0cnkgewotCQkJRmlsZSBmZWF0dXJlRGlyID0gbmV3IEZpbGUoZ2V0RmVhdHVyZVBhdGgoKSk7Ci0JCQlMaXN0IGZpbGVzID0gZ2V0RmlsZXMoZmVhdHVyZURpcik7Ci0JCQlyZXN1bHQgPSBuZXcgQ29udGVudFJlZmVyZW5jZVtmaWxlcy5zaXplKCldOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKLQkJCQlGaWxlIGN1cnJlbnRGaWxlID0gKEZpbGUpIGZpbGVzLmdldChpKTsKLQkJCQlyZXN1bHRbaV0gPSBuZXcgQ29udGVudFJlZmVyZW5jZShjdXJyZW50RmlsZS5nZXROYW1lKCksIGN1cnJlbnRGaWxlLnRvVVJMKCkpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQlOTFMuYmluZChNZXNzYWdlcy5GZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcl9VbmFibGVUb1JldHJpZXZlRmVhdHVyZUVudHJ5LCAobmV3IFN0cmluZ1tdIHsgZ2V0RmVhdHVyZSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpIH0pKSwKLQkJCQllKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRQbHVnaW5FbnRyeUNvbnRlbnRSZWZlcmVuY2VzKElQbHVnaW5FbnRyeSkKLQkgKi8KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldFBsdWdpbkVudHJ5Q29udGVudFJlZmVyZW5jZXMoCi0JCUlQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSwKLQkJSW5zdGFsbE1vbml0b3IgbW9uaXRvcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUNvbnRlbnRSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gZ2V0UGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhwbHVnaW5FbnRyeSwgbW9uaXRvcik7Ci0JCUNvbnRlbnRSZWZlcmVuY2VbXSByZXN1bHQgPSBuZXcgQ29udGVudFJlZmVyZW5jZVswXTsKLQotCQl0cnkgewotCQkJaWYgKHJlZmVyZW5jZXNbMF0gaW5zdGFuY2VvZiBKYXJDb250ZW50UmVmZXJlbmNlKSB7Ci0JCQkJcmVzdWx0ID0gKChKYXJDb250ZW50UmVmZXJlbmNlKXJlZmVyZW5jZXNbMF0pLnBlZWsobnVsbCwgbW9uaXRvcik7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHJldHVybiB0aGUgbGlzdCBvZiBhbGwgc3ViZGlyZWN0b3JpZXMKLQkJCQlGaWxlIHBsdWdpbkRpciA9IG5ldyBGaWxlKGdldFBhdGgocGx1Z2luRW50cnkpKTsKLQkJCQlVUkwgcGx1Z2luVVJMID0gcGx1Z2luRGlyLnRvVVJMKCk7Ci0JCQkJTGlzdCBmaWxlcyA9IGdldEZpbGVzKHBsdWdpbkRpcik7Ci0JCQkJcmVzdWx0ID0gbmV3IENvbnRlbnRSZWZlcmVuY2VbZmlsZXMuc2l6ZSgpXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotCQkJCQlGaWxlIGN1cnJlbnRGaWxlID0gKEZpbGUpIGZpbGVzLmdldChpKTsKLQkJCQkJU3RyaW5nIHJlbGF0aXZlU3RyaW5nID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTEFzU3RyaW5nKHBsdWdpblVSTCwgY3VycmVudEZpbGUudG9VUkwoKSk7Ci0JCQkJCXJlc3VsdFtpXSA9IG5ldyBDb250ZW50UmVmZXJlbmNlKHJlbGF0aXZlU3RyaW5nLCBjdXJyZW50RmlsZS50b1VSTCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJCU1lc3NhZ2VzLkZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyX1VuYWJsZVRvUmV0cml2ZUFyY2hpdmVDb250ZW50UmVmCi0JCQkJCSsgcGx1Z2luRW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCksCi0JCQkJZSk7Ci0JCX0KLQkJCi0JCS8vWzIwODY2XSB3ZSBkaWQgbm90IHByZXNlcnZlIGV4ZWN1dGFibGUgYml0Ci0JCXZhbGlkYXRlUGVybWlzc2lvbnMocmVzdWx0KTsKLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MGE2ODguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkJhc2VGZWF0dXJlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlQ29udGVudENvbnN1bWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5GZWF0dXJlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuY29ubmVjdGlvbi5Db25uZWN0aW9uRmFjdG9yeTsKLQotLyoqCi0gKiBGZWF0dXJlRmFjdG9yeSBmb3IgRXhlY3V0YWJsZSBGZWF0dXJlcwotICovCi1wdWJsaWMgY2xhc3MgRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5IGV4dGVuZHMgQmFzZUZlYXR1cmVGYWN0b3J5IHsKLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZUZhY3RvcnkjY3JlYXRlRmVhdHVyZShVUkwsSVNpdGUsSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmUgY3JlYXRlRmVhdHVyZShVUkwgdXJsLCBJU2l0ZSBzaXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlUYXJnZXRGZWF0dXJlIGZlYXR1cmUgPSBudWxsOwotCQlJbnB1dFN0cmVhbSBmZWF0dXJlU3RyZWFtID0gbnVsbDsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCi0JCWlmICh1cmwgPT0gbnVsbCkKLQkJCXJldHVybiBjcmVhdGVGZWF0dXJlKHNpdGUpOwotCi0JCS8vIHRoZSBVUkwgc2hvdWxkIHBvaW50IHRvIGEgZGlyZWN0b3J5Ci0JCXVybCA9IHZhbGlkYXRlKHVybCk7Ci0KLQkJdHJ5IHsKLQkJCUlGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcih1cmwpOwotLy8JCQkvLyBQRVJGOiBEbyBub3QgY3JlYXRlIEZlYXR1cmVDb250ZW50Q29uc3VtZXIKLS8vIGJ1ZyA3OTg5MwotCQkJSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgY29udGVudENvbnN1bWVyID1uZXcgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50Q29uc3VtZXIoKTsKLQotCQkJVVJMIG5vblJlc29sdmVkVVJMID0gY29udGVudFByb3ZpZGVyLmdldEZlYXR1cmVNYW5pZmVzdFJlZmVyZW5jZShudWxsKS5hc1VSTCgpOwotCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUobm9uUmVzb2x2ZWRVUkwpOwotCQkJZmVhdHVyZVN0cmVhbSA9IENvbm5lY3Rpb25GYWN0b3J5LmdldChyZXNvbHZlZFVSTCkuZ2V0SW5wdXRTdHJlYW0oKTsKLQotCQkJZmVhdHVyZSA9IChUYXJnZXRGZWF0dXJlKSB0aGlzLnBhcnNlRmVhdHVyZShmZWF0dXJlU3RyZWFtLCByZXNvbHZlZFVSTC50b0V4dGVybmFsRm9ybSgpKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJZmVhdHVyZS5zZXRTaXRlKHNpdGUpOwotCi0JCQlmZWF0dXJlLnNldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLS8vCQkJLy8gUEVSRjogRmVhdHVyZUNvbnRlbnRDb25zdW1lcgotLy8gYnVnIDc5ODkzCi0JCQlmZWF0dXJlLnNldENvbnRlbnRDb25zdW1lcihjb250ZW50Q29uc3VtZXIpOwotCi0JCQlmZWF0dXJlLnJlc29sdmUodXJsLCB1cmwpOwotCQkJZmVhdHVyZS5tYXJrUmVhZE9ubHkoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuRmVhdHVyZUZhY3RvcnlfQ3JlYXRpbmdFcnJvciwgKG5ldyBTdHJpbmdbXSB7IHVybC50b0V4dGVybmFsRm9ybSgpIH0pKSwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChmZWF0dXJlU3RyZWFtICE9IG51bGwpCi0JCQkJCWZlYXR1cmVTdHJlYW0uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRmVhdHVyZU1vZGVsRmFjdG9yeSNjcmVhdGVGZWF0dXJlTW9kZWwoKQotCSAqLwotCXB1YmxpYyBGZWF0dXJlTW9kZWwgY3JlYXRlRmVhdHVyZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFRhcmdldEZlYXR1cmUoKTsKLQl9Ci0KLQkvKgotCSAqIENyZWF0ZXMgYW4gZW1wdHkgZmVhdHVyZSBvbiB0aGUgc2l0ZSAKLQkgKi8KLQlwcml2YXRlIElGZWF0dXJlIGNyZWF0ZUZlYXR1cmUoSVNpdGUgc2l0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXJnZXRGZWF0dXJlIGZlYXR1cmUgPSBudWxsOwotCi0JCUlGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcihudWxsKTsKLQkJSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgY29udGVudENvbnN1bWVyID0gbmV3IEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudENvbnN1bWVyKCk7Ci0JCWZlYXR1cmUgPSAoVGFyZ2V0RmVhdHVyZSkgY3JlYXRlRmVhdHVyZU1vZGVsKCk7Ci0JCWZlYXR1cmUuc2V0U2l0ZShzaXRlKTsKLQkJZmVhdHVyZS5zZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCWZlYXR1cmUuc2V0Q29udGVudENvbnN1bWVyKGNvbnRlbnRDb25zdW1lcik7Ci0KLQkJLy8gZG8gbm90IG1hcmsgcmVhZCBvbmx5IHlldC4uLgkKLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotCi0JLyoKLQkgKiB2YWxpZGF0ZXMgYSBVUkwgYXMgYSBkaXJlY3RvcnkgVVJMCi0JICovCi0JcHJpdmF0ZSBVUkwgdmFsaWRhdGUoVVJMIHVybCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWlmICh1cmwgPT0gbnVsbCkKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE1lc3NhZ2VzLkZlYXR1cmVFeGVjdXRhYmxlRmFjdG9yeV9OdWxsVVJMLCBudWxsKTsgCi0KLQkJaWYgKCEodXJsLmdldEZpbGUoKS5lbmRzV2l0aCgiLyIpIHx8IHVybC5nZXRGaWxlKCkuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpIHx8IHVybC5nZXRGaWxlKCkuZW5kc1dpdGgoRmVhdHVyZS5GRUFUVVJFX1hNTCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHBhdGggPSB1cmwuZ2V0RmlsZSgpICsgIi8iOyAvLyROT04tTkxTLTEkCi0JCQkJdXJsID0gbmV3IFVSTCh1cmwuZ2V0UHJvdG9jb2woKSwgdXJsLmdldEhvc3QoKSwgdXJsLmdldFBvcnQoKSwgcGF0aCk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkZlYXR1cmVFeGVjdXRhYmxlRmFjdG9yeV9DYW5ub3RDcmVhdGVVUkwsIChuZXcgU3RyaW5nW10geyB1cmwudG9FeHRlcm5hbEZvcm0oKSB9KSksIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB1cmw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNmYzE4MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkZlYXR1cmVDb250ZW50UHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2lnbmVkY29udGVudC5TaWduZWRDb250ZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmphcnByb2Nlc3Nvci5KYXJQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmphcnByb2Nlc3Nvci5VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VjdXJpdHkuSmFyVmVyaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnZlcmlmaWVyLkNlcnRWZXJpZmllcjsKLQotLyoqCi0gKiBDb250ZW50IFByb3ZpZGVyIG9mIGEgRmVhdHVyZSBQYWNrYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBGZWF0dXJlQ29udGVudFByb3ZpZGVyIHsKLQotCXByaXZhdGUgQ29udGVudFJlZmVyZW5jZSBsb2NhbE1hbmlmZXN0ID0gbnVsbDsKLQlwcml2YXRlIENvbnRlbnRSZWZlcmVuY2VbXSBsb2NhbEZlYXR1cmVGaWxlcyA9IG5ldyBDb250ZW50UmVmZXJlbmNlWzBdOwotCXByaXZhdGUgSVZlcmlmaWVyIGphclZlcmlmaWVyID0gbnVsbDsKLQlwcml2YXRlIEV4dGVuZGVkU2l0ZSBzaXRlTW9kZWwgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBjb250aW51ZU9uRXJyb3I7Ci0JLyoKLQkgKiBmaWx0ZXIgZm9yIGZpbGUgd2l0aCAuamFyCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlbmFtZUZpbHRlciBmaWx0ZXIgPSBuZXcgRmlsZW5hbWVGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKLQkJCXJldHVybiBuYW1lLmVuZHNXaXRoKEZlYXR1cmVDb250ZW50UHJvdmlkZXIuSkFSX0VYVEVOU0lPTik7Ci0JCX0KLQl9OwotCi0JLyoKLQkgKiBDb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIoVVJMIHVybCwgSVNpdGUgc2l0ZSkgewotCQlzdXBlcih1cmwpOwotCQlpZiAoc2l0ZSBpbnN0YW5jZW9mIEV4dGVuZGVkU2l0ZSkgewotCQkJdGhpcy5zaXRlTW9kZWwgPSAoRXh0ZW5kZWRTaXRlKSBzaXRlOwotCQl9Ci0JfQotCQotCS8qCi0JICogUmV0dXJucyBhIG5ldyB2ZXJpZmllciBmb3IgZWFjaCB0b3AtbGV2ZWwgaW5zdGFsbAotCSAqIChpZiB0aGUgdmVyaWZpZXIgaGFzIGEgcGFyZW50LCByZXR1cm4gdGhlIHZlcmlmaWVyCi0JICogb3RoZXJ3aXNlIHJlaW5pdGlhbGl6ZSkKLQkgKi8KLQlwdWJsaWMgSVZlcmlmaWVyIGdldFZlcmlmaWVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTaWduZWRDb250ZW50RmFjdG9yeSBmYWN0b3J5ID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRTaWduZWRDb250ZW50RmFjdG9yeSgpOwotCQlpZiAoamFyVmVyaWZpZXIgPT0gbnVsbCB8fCBqYXJWZXJpZmllci5nZXRQYXJlbnQoKSA9PSBudWxsKSB7Ci0JCQlpZiAoZmFjdG9yeSAhPSBudWxsKQotCQkJCWphclZlcmlmaWVyID0gbmV3IENlcnRWZXJpZmllcihVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFNpZ25lZENvbnRlbnRGYWN0b3J5KCkpOwotCQkJZWxzZQotCQkJCWphclZlcmlmaWVyID0gbmV3IEphclZlcmlmaWVyKCk7Ci0JCQlyZXR1cm4gamFyVmVyaWZpZXI7Ci0JCX0KLQotCQkvLyByZS1pbml0IHdpbGwgYmUgZG9uZSBpZiB0aGUgcGFyZW50IGNoYW5nZXMKLQkJcmV0dXJuIGphclZlcmlmaWVyOwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRGZWF0dXJlTWFuaWZlc3RSZWZlcmVuY2UoKQotCSAqLwotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlIGdldEZlYXR1cmVNYW5pZmVzdFJlZmVyZW5jZShJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJLy8gY2hlY2sgdG8gc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBsb2NhbCBjb3B5IG9mIHRoZSBtYW5pZmVzdAotCQlpZiAobG9jYWxNYW5pZmVzdCAhPSBudWxsKQotCQkJcmV0dXJuIGxvY2FsTWFuaWZlc3Q7Ci0JCUNvbnRlbnRSZWZlcmVuY2VbXSBmZWF0dXJlQXJjaGl2ZVJlZmVyZW5jZSA9IGdldEZlYXR1cmVFbnRyeUFyY2hpdmVSZWZlcmVuY2VzKG1vbml0b3IpOwotCQlKYXJDb250ZW50UmVmZXJlbmNlIGZlYXR1cmVKYXJSZWZlcmVuY2UgPSBudWxsOwotCQl0cnkgewotCi0JCQkvLyBmb3JjZSBmZWF0dXJlIGFyY2hpdmUgdG8gbG9jYWwuCi0JCQkvLyBUaGlzIGNvbnRlbnQgcHJvdmlkZXIgYWx3YXlzIGFzc3VtZXMgZXhhY3RseSAxIGFyY2hpdmUgZmlsZSAoaW5kZXggWzBdKQkJCi0JCQlmZWF0dXJlSmFyUmVmZXJlbmNlID0gKEphckNvbnRlbnRSZWZlcmVuY2UpIGFzTG9jYWxSZWZlcmVuY2UoZmVhdHVyZUFyY2hpdmVSZWZlcmVuY2VbMF0sIG51bGwpOwotCQkJLy8gd2UgbmVlZCB0byB1bnBhY2sgYXJjaGl2ZSBsb2NhbGx5IGZvciBVSSBicm93c2VyIHJlZmVyZW5jZXMgdG8gYmUgcmVzb2x2ZWQgY29ycmVjdGx5Ci0JCQlsb2NhbEZlYXR1cmVGaWxlcyA9IGZlYXR1cmVKYXJSZWZlcmVuY2UudW5wYWNrKGdldFdvcmtpbmdEaXJlY3RvcnkoKSwgbnVsbCwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGVycm9yUmV0cmlldmluZyhGZWF0dXJlLkZFQVRVUkVfWE1MLCBmZWF0dXJlSmFyUmVmZXJlbmNlLCBlKTsgCi0JCX0KLQotCQkvLyBmaW5kIHRoZSBtYW5pZmVzdCBpbiB0aGUgdW5wYWNrZWQgZmVhdHVyZSBmaWxlcwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsRmVhdHVyZUZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobG9jYWxGZWF0dXJlRmlsZXNbaV0uZ2V0SWRlbnRpZmllcigpLmVxdWFscyhGZWF0dXJlLkZFQVRVUkVfWE1MKSkgewotCQkJCWxvY2FsTWFuaWZlc3QgPSBsb2NhbEZlYXR1cmVGaWxlc1tpXTsKLQkJCQkvLyBjYWNoZSByZWZlcmVuY2UgdG8gbWFuaWZlc3QKLQkJCQlyZXR1cm4gbG9jYWxNYW5pZmVzdDsKLQkJCX0KLQkJfQotCi0JCS8vIHRoZSBtYW5pZmVzdCBoYXMgbm90IGJlZW4gZm91bmQKLQkJU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1tdIHsgRmVhdHVyZS5GRUFUVVJFX1hNTCwgZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKX07Ci0JCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlcl9Ob01hbmlmZXN0RmlsZSwgdmFsdWVzKSwgbmV3IEV4Y2VwdGlvbigpKTsgCi0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0QXJjaGl2ZVJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0QXJjaGl2ZVJlZmVyZW5jZXMoSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSBnZXRGZWF0dXJlKCkuZ2V0UGx1Z2luRW50cmllcygpOwotCQlJTm9uUGx1Z2luRW50cnlbXSBub25FbnRyaWVzID0gZ2V0RmVhdHVyZSgpLmdldE5vblBsdWdpbkVudHJpZXMoKTsKLQkJTGlzdCBsaXN0QWxsQ29udGVudFJlZiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ29udGVudFJlZmVyZW5jZVtdIGFsbENvbnRlbnRSZWYgPSBuZXcgQ29udGVudFJlZmVyZW5jZVswXTsKLQotCQkvLyBmZWF0dXJlCi0JCWxpc3RBbGxDb250ZW50UmVmLmFkZEFsbChBcnJheXMuYXNMaXN0KGdldEZlYXR1cmVFbnRyeUFyY2hpdmVSZWZlcmVuY2VzKG1vbml0b3IpKSk7Ci0KLQkJLy8gcGx1Z2lucwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWxpc3RBbGxDb250ZW50UmVmLmFkZEFsbChBcnJheXMuYXNMaXN0KGdldFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoZW50cmllc1tpXSwgbW9uaXRvcikpKTsKLQkJfQotCi0JCS8vIG5vbiBwbHVnaW5zCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9uRW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJbGlzdEFsbENvbnRlbnRSZWYuYWRkQWxsKEFycmF5cy5hc0xpc3QoZ2V0Tm9uUGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhub25FbnRyaWVzW2ldLCBtb25pdG9yKSkpOwotCQl9Ci0KLQkJLy8gdHJhbnNmb3JtIExpc3QgaW4gQXJyYXkKLQkJaWYgKGxpc3RBbGxDb250ZW50UmVmLnNpemUoKSA+IDApIHsKLQkJCWFsbENvbnRlbnRSZWYgPSBuZXcgQ29udGVudFJlZmVyZW5jZVtsaXN0QWxsQ29udGVudFJlZi5zaXplKCldOwotCQkJbGlzdEFsbENvbnRlbnRSZWYudG9BcnJheShhbGxDb250ZW50UmVmKTsKLQkJfQotCi0JCXJldHVybiBhbGxDb250ZW50UmVmOwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJLy8xIGphciBmaWxlIDwtPiAxIGZlYXR1cmUKLQkJLy8gd2Ugd2lsbCByZXR1cm4gdGhlIEpBUiBmaWxlIAotCQlDb250ZW50UmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IG5ldyBDb250ZW50UmVmZXJlbmNlWzFdOwotCQlDb250ZW50UmVmZXJlbmNlIGN1cnJlbnRSZWZlcmVuY2UgPSBudWxsOwotCQlTdHJpbmcgYXJjaGl2ZUlEID0gbnVsbDsKLQotCQl0cnkgewotCQkJYXJjaGl2ZUlEID0gKGdldEZlYXR1cmUoKSAhPSBudWxsKSA/IGdldEZlYXR1cmUoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSA6ICIiOwkvLyROT04tTkxTLTEkCi0JCQljdXJyZW50UmVmZXJlbmNlID0gbmV3IEphckNvbnRlbnRSZWZlcmVuY2UoYXJjaGl2ZUlELCBnZXRVUkwoKSk7Ci0JCQljdXJyZW50UmVmZXJlbmNlID0gYXNMb2NhbFJlZmVyZW5jZShjdXJyZW50UmVmZXJlbmNlLCBtb25pdG9yKTsKLQkJCXJlZmVyZW5jZXNbMF0gPSBjdXJyZW50UmVmZXJlbmNlOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZWZlcmVuY2VzWzBdID0gY29udGludWVPbkVycm9yT3JSZXRocm93KGFyY2hpdmVJRCwgZSk7IAotCQl9CQkKLQkJcmV0dXJuIHJlZmVyZW5jZXM7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoSVBsdWdpbkVudHJ5KQotCSAqLwotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0UGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhJUGx1Z2luRW50cnkgcGx1Z2luRW50cnksIEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkvLyAxIHBsdWdpbiA8LT4gMSBqYXIKLQkJLy8gd2UgcmV0dXJuIHRoZSBKQVIgZmlsZQkKLQkJQ29udGVudFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBuZXcgQ29udGVudFJlZmVyZW5jZVsxXTsKLQkJU3RyaW5nIGFyY2hpdmVJRCA9IGdldFBhdGhJRChwbHVnaW5FbnRyeSk7Ci0JCUlTaXRlIHNpdGUgPSAoZ2V0RmVhdHVyZSgpID09IG51bGwpID8gbnVsbCA6IGdldEZlYXR1cmUoKS5nZXRTaXRlKCk7Ci0JCUlTaXRlQ29udGVudFByb3ZpZGVyIHNpdGVDb250ZW50UHJvdmlkZXIgPSAoc2l0ZSA9PSBudWxsKSA/IG51bGwgOiBzaXRlLmdldFNpdGVDb250ZW50UHJvdmlkZXIoKTsKLQkJVVJMIHVybCA9IChzaXRlQ29udGVudFByb3ZpZGVyID09IG51bGwpID8gbnVsbCA6IHNpdGVDb250ZW50UHJvdmlkZXIuZ2V0QXJjaGl2ZVJlZmVyZW5jZShhcmNoaXZlSUQpOwotCi0JCXRyeSB7Ci0JCQlyZWZlcmVuY2VzWzBdID0gcmV0cmlldmVMb2NhbEphcihuZXcgSmFyQ29udGVudFJlZmVyZW5jZShhcmNoaXZlSUQsIHVybCksIG1vbml0b3IpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZWZlcmVuY2VzWzBdID0gY29udGludWVPbkVycm9yT3JSZXRocm93KGFyY2hpdmVJRCwgZSk7Ci0JCX0KLQkJcmV0dXJuIHJlZmVyZW5jZXM7Ci0JfQotCi0JcHJpdmF0ZSBDb250ZW50UmVmZXJlbmNlIHJldHJpZXZlTG9jYWxKYXIoSmFyQ29udGVudFJlZmVyZW5jZSByZWZlcmVuY2UsIEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vSWYgdGhlIHNpdGUgZG9lcyBub3Qgc3VwcG9ydCBwYWNrMjAwLCBqdXN0IGdldCB0aGUgamFyIGFzIG5vcm1hbAotCQlpZihzaXRlTW9kZWwgPT0gbnVsbCB8fCAhc2l0ZU1vZGVsLnN1cHBvcnRzUGFjazIwMCgpIHx8ICFKYXJQcm9jZXNzb3IuY2FuUGVyZm9ybVVucGFjaygpKSB7Ci0JCQlDb250ZW50UmVmZXJlbmNlIGNvbnRlbnRSZWZlcmVuY2UgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQljb250ZW50UmVmZXJlbmNlID0gYXNMb2NhbFJlZmVyZW5jZShyZWZlcmVuY2UsIG1vbml0b3IpOwotCQkJfQotCQkJY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJY29udGVudFJlZmVyZW5jZSA9IGNvbnRpbnVlT25FcnJvck9yUmV0aHJvdyhyZWZlcmVuY2UuZ2V0SWRlbnRpZmllcigpLCBlKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJY29udGVudFJlZmVyZW5jZSA9IGNvbnRpbnVlT25FcnJvck9yUmV0aHJvdyhyZWZlcmVuY2UuZ2V0SWRlbnRpZmllcigpLCBlKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQljb250ZW50UmVmZXJlbmNlID0gY29udGludWVPbkVycm9yT3JSZXRocm93KHJlZmVyZW5jZS5nZXRJZGVudGlmaWVyKCksIGUpOwotCQkJfQotCQkJcmV0dXJuIGNvbnRlbnRSZWZlcmVuY2U7Ci0JCX0KLQkJCi0JCUNvbnRlbnRSZWZlcmVuY2UgcGFja2VkUmVmID0gbnVsbDsKLQkJU3RyaW5nIGtleSA9IHJlZmVyZW5jZS50b1N0cmluZygpOwotCQlPYmplY3QgamFyTG9jayA9IExvY2tNYW5hZ2VyLmdldExvY2soa2V5KTsKLQkJc3luY2hyb25pemVkIChqYXJMb2NrKSB7Ci0JCQkvL2RvIHdlIGhhdmUgdGhpcyBqYXIgYWxyZWFkeT8KLQkJCUZpbGUgbG9jYWxGaWxlID0gVXRpbGl0aWVzLmxvb2t1cExvY2FsRmlsZShrZXkpOwotCQkJaWYgKGxvY2FsRmlsZSAhPSBudWxsKSB7Ci0JCQkJLy8gY2hlY2sgaWYgdGhlIGNhY2hlZCBmaWxlIGlzIHN0aWxsIHZhbGlkIChubyBuZXdlciB2ZXJzaW9uIG9uIHNlcnZlcikKLQkJCQlpZiAoVXBkYXRlTWFuYWdlclV0aWxzLmlzU2FtZVRpbWVzdGFtcChyZWZlcmVuY2UuYXNVUkwoKSwgbG9jYWxGaWxlLmxhc3RNb2RpZmllZCgpKSkgewotCQkJCQlMb2NrTWFuYWdlci5yZXR1cm5Mb2NrKGtleSk7Ci0JCQkJCXJldHVybiByZWZlcmVuY2UuY3JlYXRlQ29udGVudFJlZmVyZW5jZShyZWZlcmVuY2UuZ2V0SWRlbnRpZmllcigpLCBsb2NhbEZpbGUpOwotCQkJCX0KLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQkvL2Rvbid0IGhhdmUgamFyLCBjaGVjayBmb3IgcGFjay5negotCQkJCVVSTCBwYWNrR1pVUkwgPSBuZXcgVVJMKHJlZmVyZW5jZS5hc1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCkgKyAiLnBhY2suZ3oiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXBhY2tlZFJlZiA9IGFzTG9jYWxSZWZlcmVuY2UobmV3IEphckNvbnRlbnRSZWZlcmVuY2UocmVmZXJlbmNlLmdldElkZW50aWZpZXIoKSwgcGFja0daVVJMKSwgbW9uaXRvcik7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9ubyBwYWNrLmd6Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpewotCQkJCS8vbm8gcGFjay5negotCQkJfQotCQl9Ci0JCQotCQlpZiAocGFja2VkUmVmID09IG51bGwpIHsKLQkJCS8vbm8gcGFjay5neiBvbiBzZXJ2ZXIsIGdldCBub3JtYWwgamFyCi0JCQlDb250ZW50UmVmZXJlbmNlIGNvbnRlbnRSZWZlcmVuY2UgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQljb250ZW50UmVmZXJlbmNlID0gYXNMb2NhbFJlZmVyZW5jZShyZWZlcmVuY2UsIG1vbml0b3IpOwotCQkJfQotCQkJY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJY29udGVudFJlZmVyZW5jZSA9IGNvbnRpbnVlT25FcnJvck9yUmV0aHJvdyhyZWZlcmVuY2UuZ2V0SWRlbnRpZmllcigpLCBlKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJY29udGVudFJlZmVyZW5jZSA9IGNvbnRpbnVlT25FcnJvck9yUmV0aHJvdyhyZWZlcmVuY2UuZ2V0SWRlbnRpZmllcigpLCBlKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQljb250ZW50UmVmZXJlbmNlID0gY29udGludWVPbkVycm9yT3JSZXRocm93KHJlZmVyZW5jZS5nZXRJZGVudGlmaWVyKCksIGUpOwotCQkJfQotCQkJcmV0dXJuIGNvbnRlbnRSZWZlcmVuY2U7Ci0JCX0KLQotCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLQkJc3luY2hyb25pemVkIChqYXJMb2NrKSB7Ci0JCQlTdHJpbmcgcGFja2VkID0gcGFja2VkUmVmLnRvU3RyaW5nKCk7Ci0JCQlPYmplY3QgcGFja2VkTG9jayA9IExvY2tNYW5hZ2VyLmdldExvY2socGFja2VkKTsKLQkJCXN5bmNocm9uaXplZCAocGFja2VkTG9jaykgewotCQkJCXRyeSB7Ci0JCQkJCUZpbGUgdGVtcEZpbGUgPSBwYWNrZWRSZWYuYXNGaWxlKCk7Ci0JCQkJCWxvbmcgdGltZVN0YW1wID0gdGVtcEZpbGUubGFzdE1vZGlmaWVkKCk7Ci0JCi0JCQkJCUphclByb2Nlc3NvciBwcm9jZXNzb3IgPSBKYXJQcm9jZXNzb3IuZ2V0VW5wYWNrUHJvY2Vzc29yKG51bGwpOwotCQkJCQlwcm9jZXNzb3Iuc2V0V29ya2luZ0RpcmVjdG9yeSh0ZW1wRmlsZS5nZXRQYXJlbnQoKSk7Ci0JCi0JCQkJCUZpbGUgcGFja2VkRmlsZSA9IG5ldyBGaWxlKHRlbXBGaWxlLnRvU3RyaW5nKCkgKyBVdGlscy5QQUNLRURfU1VGRklYKTsKLQkJCQkJdGVtcEZpbGUucmVuYW1lVG8ocGFja2VkRmlsZSk7Ci0JCQkJCQotCQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJCQltb25pdG9yLnNhdmVTdGF0ZSgpOwotCQkJCQkJbW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VzLkphckNvbnRlbnRSZWZlcmVuY2VfVW5wYWNraW5nICsgIiAiICsgcmVmZXJlbmNlLmdldElkZW50aWZpZXIoKSArIFV0aWxzLlBBQ0tFRF9TVUZGSVgpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQkJbW9uaXRvci5zaG93Q29weURldGFpbHMoZmFsc2UpOwotCQkJCQl9Ci0JCQkJCS8vdW5wYWNraW5nIHRoZSBqYXIgd2lsbCBzdHJpcCB0aGUgIi5wYWNrLmd6IiBhbmQgbGVhdmUgdXMgYmFjayB3aXRoIHRoZSBvcmlnaW5hbCBmaWxlbmFtZQotCQkJCQl0cnkgewotCQkJCQkJcHJvY2Vzc29yLnByb2Nlc3NKYXIocGFja2VkRmlsZSk7Ci0JCQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCQkvL3NvbWV0aGluZyBpcyB3cm9uZyB1bnBhY2tpbmcKLQkJCQkJfQotCQotCQkJCQlpZih0ZW1wRmlsZS5leGlzdHMoKSAmJiB0ZW1wRmlsZS5sZW5ndGgoKSA+IDApewotCQkJCQkJc3VjY2VzcyA9IHRydWU7Ci0JCQkJCQl0ZW1wRmlsZS5zZXRMYXN0TW9kaWZpZWQodGltZVN0YW1wKTsKLQkJCQkJCVV0aWxpdGllcy5tYXBMb2NhbEZpbGUoa2V5LCB0ZW1wRmlsZSk7Ci0JCQkJCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFVwZGF0ZVNlc3Npb24oKS5tYXJrVmlzaXRlZChyZWZlcmVuY2UuYXNVUkwoKSk7Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQlMb2NrTWFuYWdlci5yZXR1cm5Mb2NrKHBhY2tlZCk7Ci0JCQkJCUxvY2tNYW5hZ2VyLnJldHVybkxvY2soa2V5KTsKLQkJCQkJaWYobW9uaXRvciAhPSBudWxsKQotCQkJCQkJbW9uaXRvci5yZXN0b3JlU3RhdGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYoIXN1Y2Nlc3MpewotCQkJLy9Tb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHRoZSB1bnBhY2ssIGdldCB0aGUgbm9ybWFsIGphci4KLQkJCUNvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZmVyZW5jZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWNvbnRlbnRSZWZlcmVuY2UgPSBhc0xvY2FsUmVmZXJlbmNlKHJlZmVyZW5jZSwgbW9uaXRvcik7Ci0JCQl9Ci0JCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQljb250ZW50UmVmZXJlbmNlID0gY29udGludWVPbkVycm9yT3JSZXRocm93KHJlZmVyZW5jZS5nZXRJZGVudGlmaWVyKCksIGUpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQljb250ZW50UmVmZXJlbmNlID0gY29udGludWVPbkVycm9yT3JSZXRocm93KHJlZmVyZW5jZS5nZXRJZGVudGlmaWVyKCksIGUpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWNvbnRlbnRSZWZlcmVuY2UgPSBjb250aW51ZU9uRXJyb3JPclJldGhyb3cocmVmZXJlbmNlLmdldElkZW50aWZpZXIoKSwgZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY29udGVudFJlZmVyZW5jZTsKLQkJfQotCQlyZXR1cm4gcGFja2VkUmVmOwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKElOb25QbHVnaW5FbnRyeSkKLQkgKi8KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldE5vblBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoSU5vblBsdWdpbkVudHJ5IG5vblBsdWdpbkVudHJ5LCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJLy8gYXJjaGl2ZSA9IGZlYXR1cmUvPGlkPl88dmVyPi88ZmlsZT4KLQkJU3RyaW5nIGFyY2hpdmVJRCA9IFNpdGUuREVGQVVMVF9GRUFUVVJFX1BBVEggKyAoKGdldEZlYXR1cmUoKSAhPSBudWxsKSA/IGdldEZlYXR1cmUoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCQlhcmNoaXZlSUQgKz0gIi8iICsgbm9uUGx1Z2luRW50cnkuZ2V0SWRlbnRpZmllcigpOyAvLyROT04tTkxTLTEkCi0KLQkJQ29udGVudFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBuZXcgQ29udGVudFJlZmVyZW5jZVsxXTsKLQkJQ29udGVudFJlZmVyZW5jZSBjdXJyZW50UmVmZXJlbmNlID0gbnVsbDsKLQotCQl0cnkgewotCQkJSVNpdGUgc2l0ZSA9IChnZXRGZWF0dXJlKCkgPT0gbnVsbCkgPyBudWxsIDogZ2V0RmVhdHVyZSgpLmdldFNpdGUoKTsKLQkJCUlTaXRlQ29udGVudFByb3ZpZGVyIHNpdGVDb250ZW50UHJvdmlkZXIgPSAoc2l0ZSA9PSBudWxsKSA/IG51bGwgOiBzaXRlLmdldFNpdGVDb250ZW50UHJvdmlkZXIoKTsKLQkJCVVSTCB1cmwgPSAoc2l0ZUNvbnRlbnRQcm92aWRlciA9PSBudWxsKSA/IG51bGwgOiBzaXRlQ29udGVudFByb3ZpZGVyLmdldEFyY2hpdmVSZWZlcmVuY2UoYXJjaGl2ZUlEKTsKLQotCQkJY3VycmVudFJlZmVyZW5jZSA9IG5ldyBDb250ZW50UmVmZXJlbmNlKG5vblBsdWdpbkVudHJ5LmdldElkZW50aWZpZXIoKSwgdXJsKTsKLQkJCWN1cnJlbnRSZWZlcmVuY2UgPSBhc0xvY2FsUmVmZXJlbmNlKGN1cnJlbnRSZWZlcmVuY2UsIG1vbml0b3IpOwotCQkJcmVmZXJlbmNlc1swXSA9IGN1cnJlbnRSZWZlcmVuY2U7Ci0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJcmVmZXJlbmNlc1swXSA9IGNvbnRpbnVlT25FcnJvck9yUmV0aHJvdyhhcmNoaXZlSUQsIGUpOwotCQl9Ci0KLQkJcmV0dXJuIHJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0RmVhdHVyZUVudHJ5Q29udGVudFJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0RmVhdHVyZUVudHJ5Q29udGVudFJlZmVyZW5jZXMoSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCXJldHVybiBsb2NhbEZlYXR1cmVGaWxlczsgLy8gcmV0dXJuIGNhY2hlZCBmZWF0dXJlIHJlZmVyZW5jZXMKLQkJLy8gTm90ZTogYXNzdW1lcyB0aGlzIGNvbnRlbnQgcHJvdmlkZXIgaXMgYWx3YXlzIGNhbGxlZCBmaXJzdCB0bwotCQkvLyAgICAgICBnZXQgdGhlIGZlYXR1cmUgbWFuaWZlc3QuIFRoaXMgZm9yY2VzIHRoZSBmZWF0dXJlIGZpbGVzCi0JCS8vICAgICAgIHRvIGJlIHVucGFja2VkIGFuZCBjYWNoZXMgdGhlIHJlZmVyZW5jZXMKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0UGx1Z2luRW50cnlDb250ZW50UmVmZXJlbmNlcyhJUGx1Z2luRW50cnkpCi0JICovCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRQbHVnaW5FbnRyeUNvbnRlbnRSZWZlcmVuY2VzKElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUNvbnRlbnRSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gZ2V0UGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhwbHVnaW5FbnRyeSwgbW9uaXRvcik7Ci0JCUNvbnRlbnRSZWZlcmVuY2VbXSBwbHVnaW5SZWZlcmVuY2VzID0gbmV3IENvbnRlbnRSZWZlcmVuY2VbMF07Ci0KLQkJdHJ5IHsKLQkJCWlmIChyZWZlcmVuY2VzWzBdIGluc3RhbmNlb2YgSmFyQ29udGVudFJlZmVyZW5jZSkgewotCQkJCUphckNvbnRlbnRSZWZlcmVuY2UgbG9jYWxSZWYgPSAoSmFyQ29udGVudFJlZmVyZW5jZSkgYXNMb2NhbFJlZmVyZW5jZShyZWZlcmVuY2VzWzBdLCBtb25pdG9yKTsKLQkJCQlwbHVnaW5SZWZlcmVuY2VzID0gbG9jYWxSZWYucGVlayhudWxsLCBtb25pdG9yKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gcmV0dXJuIHRoZSBsaXN0IG9mIGFsbCBzdWJkaXJlY3RvcmllcwotCQkJCUxpc3QgZmlsZXMgPSBnZXRGaWxlcyhyZWZlcmVuY2VzWzBdLmFzRmlsZSgpKTsKLQkJCQlwbHVnaW5SZWZlcmVuY2VzID0gbmV3IENvbnRlbnRSZWZlcmVuY2VbZmlsZXMuc2l6ZSgpXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpblJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJRmlsZSBjdXJyZW50RmlsZSA9IChGaWxlKSBmaWxlcy5nZXQoaSk7Ci0JCQkJCXBsdWdpblJlZmVyZW5jZXNbaV0gPSBuZXcgQ29udGVudFJlZmVyZW5jZShudWxsLCBjdXJyZW50RmlsZS50b1VSTCgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vWzIwODY2XSB3ZSBkaWQgbm90IHByZXNlcnZlIGV4ZWN1dGFibGUgYml0Ci0JCQl2YWxpZGF0ZVBlcm1pc3Npb25zKHBsdWdpblJlZmVyZW5jZXMpOwotCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGVycm9yUmV0cmlldmluZyhwbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSwgcmVmZXJlbmNlc1swXSwgZSk7Ci0JCX0KLQkJcmV0dXJuIHBsdWdpblJlZmVyZW5jZXM7Ci0JfQotCi0JLyoKLQkgKiByZXR1cm4gYWxsIHRoZSBmaWxlcyB1bmRlciB0aGUgZGlyZWN0b3J5Ci0JICovCi0JcHJpdmF0ZSBMaXN0IGdldEZpbGVzKEZpbGUgZGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpZiAoIWRpci5pc0RpcmVjdG9yeSgpKQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlcl9JbnZhbGlkRGlyZWN0b3J5LCAobmV3IFN0cmluZ1tdIHsgZGlyLmdldFBhdGgoKSB9KSkpOwotCi0JCUZpbGVbXSBmaWxlcyA9IGRpci5saXN0RmlsZXMoKTsKLQkJaWYgKGZpbGVzICE9IG51bGwpIC8vIGJlIGNhcmVmdWwgc2luY2UgaXQgY2FuIGJlIG51bGwKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyArK2kpIHsKLQkJCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCQlyZXN1bHQuYWRkQWxsKGdldEZpbGVzKGZpbGVzW2ldKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzdWx0LmFkZChmaWxlc1tpXSk7Ci0JCQkJfQotCQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSBDb3JlRXhjZXB0aW9uIGVycm9yUmV0cmlldmluZyhTdHJpbmcgb2JqLCBDb250ZW50UmVmZXJlbmNlIGFyY2hpdmUsIEV4Y2VwdGlvbiBlKSB7Ci0KLQkJU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1tdIHsgb2JqIH07Ci0KLQkJcmV0dXJuIFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlcl9FcnJvclJldHJpZXZpbmcsIHZhbHVlcyksIGUpOwkgCQotCi0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXRDb250aW51ZU9uRXJyb3IoYm9vbGVhbiBjb250aW51ZU9uRXJyb3IpIHsKLQkJdGhpcy5jb250aW51ZU9uRXJyb3IgPSBjb250aW51ZU9uRXJyb3I7Ci0JfQotCQotCS8qKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciB3aGVuIGEgY29yZSBleGNlcHRpb24gaXMgZGV0ZWN0ZWQsIHNvLCBpZiBpdHMgZGVjaWRlZCB0byByZXRocm93LCB0aGVuIAotCSAqIGEgY29yZSBleGNlcHRpb24gb2RlcyBub3QgaGF2ZSB0byBiZSByZWNyZWF0ZWQuIAotCSAqIAotCSAqIEBwYXJhbSBhcmNoaXZlSUQgaWQgb2YgdGhlIGFyY2hpdmUgZmlsZQotCSAqIEBwYXJhbSBDb3JlRXhjZXB0aW9uIAotCSAqIEByZXR1cm4gTnVsbFJlZmVyZW5jZSBpZiBpdHMgZGVjaWRlZCBub3QgdG8gY29udGludWUKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQkvKnByaXZhdGUgQ29udGVudFJlZmVyZW5jZSBjb250aW51ZU9yRXJyb3JPclJldGhyb3coU3RyaW5nIGFyY2hpdmVJRCwgQ29yZUV4Y2VwdGlvbiBjb3JlRXhjZXB0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUNvbnRlbnRSZWZlcmVuY2UgcmVmZXJlbmNlID0gbnVsbDsKLQotCQlpZiAoY29udGludWVPbkVycm9yKSB7Ci0JCQkvLyB0aGlzIENvbnRlbnRSZWZlcmVuY2Ugd2l0aG91dCBhIGZpbGUgb3IgVVJMIGlzIHB1cmVseSBhCi0JCQkvLyAibWlzc2luZyBqYXIiIHJlZmVyZW5jZS4KLQkJCXJlZmVyZW5jZSA9IG5ldyBOdWxsQ29udGVudFJlZmVyZW5jZShhcmNoaXZlSUQpOwotCi0JCQlTdHJpbmcgbXNnID0gIiAgICBDb250aW51ZU9uRXJyb3I6IFRoZSBmb2xsb3dpbmcgSUQgd2FzIG5vdCBmb3VuZCwgc28gd2FzIHNraXBwZWQsIGFuZCBpcyBub3Qgb24gbWlyb3Igc2l0ZTogIiArIGFyY2hpdmVJRDsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGlkID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIGlkICwgMCwgbXNnLCBudWxsKTsKLQkJCVVwZGF0ZUNvcmUubG9nKHN0YXR1cyk7Ci0JCQkKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IGNvcmVFeGNlcHRpb247Ci0JCX0KLQkJcmV0dXJuIHJlZmVyZW5jZTsKLQl9Ki8KLQkKLQlwcml2YXRlIENvbnRlbnRSZWZlcmVuY2UgY29udGludWVPbkVycm9yT3JSZXRocm93KFN0cmluZyBhcmNoaXZlSUQsIEV4Y2VwdGlvbiBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUNvbnRlbnRSZWZlcmVuY2UgcmVmZXJlbmNlID0gbnVsbDsKLQotCQlpZiAoY29udGludWVPbkVycm9yKSB7IAotCQkJLy8gdGhpcyBDb250ZW50UmVmZXJlbmNlIHdpdGhvdXQgYSBmaWxlIG9yIFVSTCBpcyBwdXJlbHkgYQotCQkJLy8gIm1pc3NpbmcgamFyIiByZWZlcmVuY2UuCi0JCQlyZWZlcmVuY2UgPSBuZXcgTnVsbENvbnRlbnRSZWZlcmVuY2UoYXJjaGl2ZUlEKTsKLQkJCQotCQkJU3RyaW5nIG1zZyA9ICIgICAgQ29udGludWVPbkVycm9yOiBUaGUgZm9sbG93aW5nIElEIHdhcyBub3QgZm91bmQsIHNvIHdhcyBza2lwcGVkLCBhbmQgaXMgbm90IG9uIG1pcm9yIHNpdGU6ICIgKyBhcmNoaXZlSUQ7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBpZCA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBpZCAsIDAsIG1zZywgbnVsbCk7Ci0JCQlVcGRhdGVDb3JlLmxvZyhzdGF0dXMpOwkKLQkJCQotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgZXJyb3JSZXRyaWV2aW5nKGFyY2hpdmVJRCwgcmVmZXJlbmNlLCBlKTsKLQkJfQotCQlyZXR1cm4gcmVmZXJlbmNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlUGFja2FnZWRGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVQYWNrYWdlZEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1NTY1MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVQYWNrYWdlZEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIEZlYXR1cmUgUGFja2FnZWQKLSAqLwotcHVibGljIGNsYXNzIEZlYXR1cmVQYWNrYWdlZEZhY3RvcnkgZXh0ZW5kcyBCYXNlRmVhdHVyZUZhY3RvcnkgewotCi0JLyoKLQkgKiBAc2VlIElGZWF0dXJlRmFjdG9yeSNjcmVhdGVGZWF0dXJlKFVSTCxJU2l0ZSxJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJRmVhdHVyZSBjcmVhdGVGZWF0dXJlKFVSTCB1cmwsSVNpdGUgc2l0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUZlYXR1cmUgZmVhdHVyZSA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIGZlYXR1cmVTdHJlYW0gPSBudWxsOwotCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKG51bGwsMik7Ci0JCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCi0JCQkJCQotCQl0cnkgewkKLQkJCUlGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIodXJsLCBzaXRlKTsJCi0JCQlDb250ZW50UmVmZXJlbmNlIG1hbmlmZXN0ID0gY29udGVudFByb3ZpZGVyLmdldEZlYXR1cmVNYW5pZmVzdFJlZmVyZW5jZShudWxsLypJUHJvZ3Jlc3NNb25pdG9yKi8pOwotCQkJZmVhdHVyZVN0cmVhbSA9IG1hbmlmZXN0LmdldElucHV0U3RyZWFtKCk7Ci0JCQlmZWF0dXJlID0gKEZlYXR1cmUpcGFyc2VGZWF0dXJlKGZlYXR1cmVTdHJlYW0pOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCi0JCQkvLyBpZiB0aGVyZSBpcyBubyB1cGRhdGUgVVJMIGZvciB0aGUgRmVhdHVyZQotCQkJLy8gdXNlIHRoZSBTaXRlIFVSTAotCQkJaWYgKGZlYXR1cmUuZ2V0VXBkYXRlU2l0ZUVudHJ5KCk9PW51bGwpewotCQkJCVVSTEVudHJ5TW9kZWwgZW50cnlNb2RlbCA9IGNyZWF0ZVVSTEVudHJ5TW9kZWwoKTsKLQkJCQlVUkwgc2l0ZVVybCA9IHNpdGUuZ2V0VVJMKCk7Ci0JCQkJaWYgKHNpdGVVcmwhPW51bGwpewotCQkJCQllbnRyeU1vZGVsLnNldFVSTFN0cmluZyhzaXRlVXJsLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJCQllbnRyeU1vZGVsLnJlc29sdmUoc2l0ZVVybCxudWxsKTsKLQkJCQkJZmVhdHVyZS5zZXRVcGRhdGVTaXRlRW50cnlNb2RlbChlbnRyeU1vZGVsKTsKLQkJCQl9Ci0JCQl9CQotCQkJZmVhdHVyZS5zZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCQlmZWF0dXJlLnNldFNpdGUoc2l0ZSk7CQkJCQkJCi0JCQlVUkwgYmFzZVVybCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWJhc2VVcmwgPSBuZXcgVVJMKG1hbmlmZXN0LmFzVVJMKCksIi4iKTsgLy8gbWFrZSBzdXJlIHdlIGhhdmUgVVJMIHRvIGZlYXR1cmUgZGlyZWN0b3J5IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2goTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsJCi0JCQl9Ci0JCQlmZWF0dXJlLnJlc29sdmUoYmFzZVVybCwgYmFzZVVybCk7Ci0JCQlmZWF0dXJlLm1hcmtSZWFkT25seSgpOwkJCQotCQl9ICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuRmVhdHVyZUZhY3RvcnlfQ3JlYXRpbmdFcnJvciwgKG5ldyBTdHJpbmdbXSB7IHVybC50b0V4dGVybmFsRm9ybSgpIH0pKSwgZSk7Ci0JCX1maW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGZlYXR1cmVTdHJlYW0hPW51bGwpCQotCQkJCQlmZWF0dXJlU3RyZWFtLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotICAgIAotICAgIHB1YmxpYyBJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbCBjcmVhdGVJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbCgpIHsKLSAgICAgcmV0dXJuIG5ldyBVcGRhdGVTaXRlSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlUGx1Z2luLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAwMmVkNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotLyoqCi0gKiBBbiBJUGx1Z2luRW50cnkgLSBJRmVhdHVyZSBwYWlyLgotICogVGhlIElGZWF0dXJlIGlzIGEgZmVhdHVlIG9yIGEgcGF0Y2ggd2ljaCBkZWxpdmVyZWQgdGhlIHBsdWdpbgotICovCi1wdWJsaWMgY2xhc3MgRmVhdHVyZVBsdWdpbiB7Ci0JcHJpdmF0ZSBJUGx1Z2luRW50cnkgcGx1Z2luRW50cnk7Ci0JcHJpdmF0ZSBJRmVhdHVyZSBmZWF0dXJlOwotCXB1YmxpYyBGZWF0dXJlUGx1Z2luKElQbHVnaW5FbnRyeSBlbnRyeSwgSUZlYXR1cmUgZmVhdHVyZSkgewotCQlwbHVnaW5FbnRyeSA9IGVudHJ5OwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCX0KLQlwdWJsaWMgSVBsdWdpbkVudHJ5IGdldEVudHJ5KCkgewotCQlyZXR1cm4gcGx1Z2luRW50cnk7Ci0JfQotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0JLyoqCi0JICogUGx1Z2lucyBhcmUgZXF1YWwgaWYgdGhlaXIgSURzIGFuZCB2ZXJzaW9ucyBhcmUgdGhlIHNhbWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgRmVhdHVyZVBsdWdpbikgewotCQkJRmVhdHVyZVBsdWdpbiBwID0gKEZlYXR1cmVQbHVnaW4pIG87Ci0JCQlyZXR1cm4gZ2V0RW50cnkoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZXF1YWxzKHAuZ2V0RW50cnkoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGdldEVudHJ5KCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmhhc2hDb2RlKCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBwbHVnaW5FbnRyeSArICIgaW4gIiArIGZlYXR1cmU7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVUeXBlRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlVHlwZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZhZWFjNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVUeXBlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLQotLyoqCi0gKiBNYW5hZ2VzIEZlYXR1cmVGYWN0b3J5IGV4dGVuc2lvbiBwb2ludAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRmVhdHVyZVR5cGVGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIEZlYXR1cmVUeXBlRmFjdG9yeSBpbnN0OwotCXByaXZhdGUgTWFwIGZhY3RvcmllczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSU1QTEVfRVhURU5TSU9OX0lEID0gImZlYXR1cmVUeXBlcyI7CS8vJE5PTi1OTFMtMSQJCi0KLQkvKgotCSAqIGhpZGUgY29uc3RydWN0b3IKLQkgKi8KLQlwcml2YXRlIEZlYXR1cmVUeXBlRmFjdG9yeSgpIHsKLQl9Ci0KLQkvKgotCSAqIFNpbmdsZXRvbiBwYXR0ZXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBGZWF0dXJlVHlwZUZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0ID09IG51bGwpCi0JCQlpbnN0ID0gbmV3IEZlYXR1cmVUeXBlRmFjdG9yeSgpOwotCQlyZXR1cm4gaW5zdDsKLQl9Ci0KLQkvKgotCSAqIHJldHVybiB0aGUgZmFjdG9yeSBmb3IgdGhlIGFzc29jaWF0ZWQgdHlwZQotCSAqLwotCXB1YmxpYyBJRmVhdHVyZUZhY3RvcnkgZ2V0RmFjdG9yeShTdHJpbmcgdHlwZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLwotCQlPYmplY3QgaW5zdGFuY2UgPSBnZXRGYWN0b3JpZXMoKS5nZXQodHlwZSk7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IGNyZWF0ZUZhY3RvcnlGb3IodHlwZSk7Ci0JCQlnZXRGYWN0b3JpZXMoKS5wdXQodHlwZSwgaW5zdGFuY2UpOwotCQl9Ci0JCXJldHVybiAoSUZlYXR1cmVGYWN0b3J5KSBpbnN0YW5jZTsKLQl9Ci0KLQkvKgotCSAqIGNyZWF0ZXMgYSBmYWN0b3J5IGZvciB0aGUgYXNzb2NpYXRlZCB0eXBlIGFuZCBjYWNoZSBpdCAKLQkgKi8KLQlwcml2YXRlIElGZWF0dXJlRmFjdG9yeSBjcmVhdGVGYWN0b3J5Rm9yKFN0cmluZyB0eXBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGZWF0dXJlRmFjdG9yeSByZXN1bHQgPSBudWxsOwotCi0JCVN0cmluZyBwbHVnaW5JRCA9Ci0JCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9Ci0JCQlyZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IocGx1Z2luSUQsIFNJTVBMRV9FWFRFTlNJT05fSUQsIHR5cGUpOwotCi0JCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmxlbmd0aCA9PSAwKSB7Ci0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuRmVhdHVyZVR5cGVGYWN0b3J5X1VuYWJsZVRvRmluZEZlYXR1cmVGYWN0b3J5LCAobmV3IFN0cmluZ1tdIHsgdHlwZSB9KSksCi0JCQkJCW51bGwpOwotCQl9IAotCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbMF07Ci0JCXJlc3VsdCA9IChJRmVhdHVyZUZhY3RvcnkpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsJLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSBNYXAgZ2V0RmFjdG9yaWVzKCkgewotCQlpZiAoZmFjdG9yaWVzID09IG51bGwpCi0JCQlmYWN0b3JpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZmFjdG9yaWVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmlsZUZyYWdtZW50LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZpbGVGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDkyNTBmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmlsZUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotCi1wdWJsaWMgY2xhc3MgRmlsZUZyYWdtZW50ewotCXByaXZhdGUgRmlsZSBmaWxlOwotCXByaXZhdGUgbG9uZyBieXRlczsKLQlwdWJsaWMgRmlsZUZyYWdtZW50KEZpbGUgZmlsZSwgbG9uZyBzaXplKXsKLQkJdGhpcy5maWxlPWZpbGU7Ci0JCXRoaXMuYnl0ZXM9c2l6ZTsKLQl9Ci0JcHVibGljIEZpbGUgZ2V0RmlsZSgpewotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JcHVibGljIGxvbmcgZ2V0U2l6ZSgpewotCQlyZXR1cm4gYnl0ZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GcmFnbWVudEVudHJ5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZyYWdtZW50RW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE3NTExZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZyYWdtZW50RW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgZnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIHBsdWdpbi4KLSAqLwotcHVibGljIGNsYXNzIEZyYWdtZW50RW50cnkgewotCQotCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkOwotCXByaXZhdGUgU3RyaW5nIHBsdWdpblZlcnNpb247Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsgCi0JcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb247Ci0JCi0JcHVibGljIEZyYWdtZW50RW50cnkoU3RyaW5nIGlkLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyBsb2NhdGlvbikgewotCQl0aGlzLnBsdWdpbklkID0gaWQ7Ci0JCXRoaXMucGx1Z2luVmVyc2lvbiA9IHZlcnNpb247Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBwbHVnaW4gdHJhbnNsYXRhYmxlIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUgcGx1Z2luCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnLWluIGlkZW50aWZpZXIgZm9yIHRoaXMgZW50cnkuCi0JICogCi0JICogQHJldHVybiB0aGUgcGx1Zy1pbiBpZGVudGlmaWVyLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIHBsdWdpbklkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWctaW4gdmVyc2lvbiBmb3IgdGhpcyBlbnRyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwbHVnLWluIHZlcnNpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5WZXJzaW9uKCkgewotCQlyZXR1cm4gcGx1Z2luVmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIG1zZyA9IChnZXRQbHVnaW5JZGVudGlmaWVyKCkhPW51bGwpP2dldFBsdWdpbklkZW50aWZpZXIoKS50b1N0cmluZygpOiIiOyAvLyROT04tTkxTLTEkCi0JCW1zZyArPSBnZXRQbHVnaW5WZXJzaW9uKCkhPW51bGw/IiAiK2dldFBsdWdpblZlcnNpb24oKS50b1N0cmluZygpOiIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcmV0dXJuIG1zZzsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0lTaXRlQ29udGVudENvbnN1bWVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0lTaXRlQ29udGVudENvbnN1bWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjOGJhN2QuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JU2l0ZUNvbnRlbnRDb25zdW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi0gCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLSAKLSAvKioKLSAgKiBBIHNpdGUgY29udGVudCBjb25zdW1lciBtYW5hZ2VzIHRoZSBzdG9yYWdlIG9yIGFyY2hpdmVzLCBwbHVnaW5zIGFuZAotICAqIGZlYXR1cmUgaW5zaWRlIGFuIDxjb2RlPiBJU2l0ZTwvY29kZT4KLSAgKi8KLSAKLXB1YmxpYyBpbnRlcmZhY2UgSVNpdGVDb250ZW50Q29uc3VtZXIgewotCi0JLyoqCi0JICogU3RvcmVzIGEgY29udGVudCByZWZlcmVuY2UgaW50byB0aGUgU2l0ZUNvbnRlbnRDb25zdW1lcgotCSAqIEBwYXJhbSBjb250ZW50UmVmZXJlbmNlIHRoZSBjb250ZW50IHJlZmVyZW5jZSB0byBzdG9yZQotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyBzdG9yaW5nIHRoZSBjb250ZW50IHJlZmVyZW5jZQotCSAqIEBzaW5jZSAyLjAgCi0JICovCi0JcHVibGljIHZvaWQgc3RvcmUoQ29udGVudFJlZmVyZW5jZSBjb250ZW50UmVmZXJlbmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogb3BlbnMgYSBOb24gcGx1Z2luIEVudHJ5IGZvciBzdG9yYWdlCi0JICogQHJldHVybiB0aGUgbmV3IEZlYXR1cmVDb250ZW50Q29uc3VtZXIgZm9yIHRoaXMgPGNvZGU+SU5vblBsdWdpbkVudHJ5PC9jb2RlPgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgb3BlbnMgaXMgZG9uZSBvbiBhIEZlYXR1cmVDb250ZW50Q29uc3VtZXIgcGFyZW50IG90aGVyIHRoYW4gYW4gSUZlYXR1cmUuCi0JICogQHNpbmNlIDIuMCAKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRDb25zdW1lciBvcGVuKElOb25QbHVnaW5FbnRyeSBub25QbHVnaW5FbnRyeSkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBvcGVucyBhIE5vbiBwbHVnaW4gRW50cnkgZm9yIHN0b3JhZ2UKLQkgKiBAcmV0dXJuIHRoZSBuZXcgRmVhdHVyZUNvbnRlbnRDb25zdW1lciBmb3IgdGhpcyA8Y29kZT5JUGx1Z2luRW50cnk8L2NvZGU+Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZSBvcGVucyBpcyBkb25lIG9uIGEgRmVhdHVyZUNvbnRlbnRDb25zdW1lciBwYXJlbnQgb3RoZXIgdGhhbiBhbiBJRmVhdHVyZS4KLQkgKiBAc2luY2UgMi4wIAotCSAqLwotCXB1YmxpYyBJQ29udGVudENvbnN1bWVyIG9wZW4oSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBjbG9zZXMgdGhlIG9wZW5lZCBTaXRlQ29udGVudENvbnN1bWVyCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogQHNpbmNlIDIuMCAKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgY2xvc2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiA7CQotCQotCi0JLyoqCi0JICogYWJvcnRzIHRoZSBvcGVuZWQgU2l0ZUNvbnRlbnRDb25zdW1lcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAyLjAgCi0JICovCi0JcHVibGljIHZvaWQgYWJvcnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsJCQotCQotfQotCi0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSW5zdGFsbENvbmZpZ3VyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSW5zdGFsbENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4MDFkZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0luc3RhbGxDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLlNpdGVMb2NhbE1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkxpc3RlbmVyTGlzdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklBY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUluc3RhbGxDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JUHJvYmxlbUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5Db25maWd1cmF0b3JVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuRmVhdHVyZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGVGZWF0dXJlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlZlcnNpb25lZElkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuU2l0ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuQ29uZmlndXJhdGlvbkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yLkZlYXR1cmVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yLlBsYXRmb3JtQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yLlBsdWdpbkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuU2l0ZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC5Db25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWwuQ29uZmlndXJlZFNpdGVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWwuSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIE1hbmFnZXMgQ29uZmlndXJlZFNpdGVzCi0gKgotICovCi0KLXB1YmxpYyBjbGFzcyBJbnN0YWxsQ29uZmlndXJhdGlvbiBleHRlbmRzIEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgaW1wbGVtZW50cyBJSW5zdGFsbENvbmZpZ3VyYXRpb24gewotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNXaW5kb3dzID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikuc3RhcnRzV2l0aCgiV2luIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXByaXZhdGUgTGlzdGVuZXJMaXN0IGxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoTGlzdGVuZXJMaXN0LklERU5USVRZKTsKLQotCS8qCi0JICogZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgSW5zdGFsbENvbmZpZ3VyYXRpb24oKSB7Ci0JfQotCi0JLyoKLQkgKiBDb3B5IGNvbnN0cnVjdG9yIAotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwdWJsaWMgSW5zdGFsbENvbmZpZ3VyYXRpb24oSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRoaXMoY29uZmlnLCBudWxsLCBudWxsKTsKLQl9Ci0JCi0JLyoKLQkgKiBjb3B5IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEluc3RhbGxDb25maWd1cmF0aW9uKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsIFVSTCBuZXdMb2NhdGlvbiwgU3RyaW5nIGxhYmVsKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJLy8gc2V0IGN1cnJlbnQgZGF0ZSBhbmQgdGltZWxpbmUgYXMgY2FsbGVyIGNhbiBjYWxsIHNldERhdGUgaWYgdGhlCi0JCS8vIGRhdGUgb24gdGhlIFVSTCBzdHJpbmcgaGFzIHRvIGJlIHRoZSBzYW1lCi0JCURhdGUgbm93ID0gbmV3IERhdGUoKTsKLQkJc2V0Q3JlYXRpb25EYXRlKG5vdyk7Ci0JCXNldEN1cnJlbnQoZmFsc2UpOwotCQkKLQkJaWYgKG5ld0xvY2F0aW9uID09IG51bGwpIHsKLQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRMb2NhbFJhbmRvbUlkZW50aWZpZXIoU2l0ZUxvY2FsTW9kZWwuQ09ORklHX0ZJTEUsIG5vdyk7Ci0JCQluZXdMb2NhdGlvbiA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCksIG5ld0ZpbGVOYW1lLCBudWxsKTsKLQkJfQotCQlzZXRMb2NhdGlvblVSTFN0cmluZyhuZXdMb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpKTsKLQkJCi0JCWlmIChsYWJlbCA9PSBudWxsKQotCQkJbGFiZWwgPSBVdGlsaXRpZXMuZm9ybWF0KG5vdyk7Ci0JCXNldExhYmVsKGxhYmVsKTsKLQotCQkvLyBkbyBub3QgY29weSBsaXN0IG9mIGxpc3RlbmVycyBub3IgYWN0aXZpdGllcwotCQkvLyBtYWtlIGEgY29weSBvZiB0aGUgc2l0ZUNvbmZpZ3VyYXRpb24gb2JqZWN0Ci0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyZWRTaXRlW10gY3NpdGVzID0gY29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQkJaWYgKGNzaXRlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJQ29uZmlndXJlZFNpdGUgY29uZmlnU2l0ZSA9IG5ldyBDb25maWd1cmVkU2l0ZShjc2l0ZXNbaV0pOwotCQkJCQlhZGRDb25maWd1cmF0aW9uU2l0ZU1vZGVsKGNvbmZpZ1NpdGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJlc29sdmUobmV3TG9jYXRpb24sIG51bGwpOwotCQkvLyBubyBuZWVkIHRvIHBhcnNlIGZpbGUsIGFsbCBkYXRhIGFyZSBpbml0aWFsaXplZAotCQlpbml0aWFsaXplZCA9IHRydWU7Ci0JfQotCQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGNvbmZpZ3VyZWQgc2l0ZXMgb3IgYW4gZW1wdHkgYXJyYXkKLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlW10gZ2V0Q29uZmlndXJlZFNpdGVzKCkgewotCQlDb25maWd1cmVkU2l0ZU1vZGVsW10gcmVzdWx0ID0gZ2V0Q29uZmlndXJhdGlvblNpdGVzTW9kZWwoKTsKLQkJaWYgKHJlc3VsdC5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBuZXcgSUNvbmZpZ3VyZWRTaXRlWzBdOwotCQllbHNlCi0JCQlyZXR1cm4gKElDb25maWd1cmVkU2l0ZVtdKSByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHNpdGUgcG9saWN5Ci0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0RGVmYXVsdFBvbGljeSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtQ29uZmlndXJhdGlvbi5nZXREZWZhdWx0UG9saWN5KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIENvbmZpZ3VyYXRpb24gU2l0ZSBhbmQgYSBuZXcgU2l0ZQotCSAqIFRoZSBwb2xpY3kgaXMgZnJvbSA8Y29kZT4gb3JnLmVjbGlwc2UuY29yZS5ib290LklQbGF0Zm9ybUNvbmZpZ3VyYXRpb248L2NvZGU+Ci0JICovCi0JcHVibGljIElDb25maWd1cmVkU2l0ZSBjcmVhdGVDb25maWd1cmVkU2l0ZShGaWxlIGZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlpZiAoIWZpbGUuZ2V0TmFtZSgpLmVxdWFscygiZWNsaXBzZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZpbGUgPSBuZXcgRmlsZShmaWxlLCAiZWNsaXBzZSIpOyAvLyROT04tTkxTLTEkCi0JCQlmaWxlLm1rZGlycygpOwotCQl9Ci0JCQotCQlpZiAoaXNEdXBsaWNhdGVTaXRlKGZpbGUpKQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuSW5zdGFsbENvbmZpZ3VyYXRpb25fbG9jYXRpb25fZXhpc3RzLCAobmV3IFN0cmluZ1tdIHsgZmlsZS5nZXRQYXRoKCkgfSkpLG51bGwpOwotCQlJU2l0ZSBzaXRlID0gSW50ZXJuYWxTaXRlTWFuYWdlci5jcmVhdGVTaXRlKGZpbGUpOwotCi0JCS8vY3JlYXRlIGEgY29uZmlnIHNpdGUgYXJvdW5kIHRoZSBzaXRlCi0JCS8vIGV2ZW4gaWYgdGhlIHNpdGUgPT0gbnVsbAotCQlCYXNlU2l0ZUxvY2FsRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEJhc2VTaXRlTG9jYWxGYWN0b3J5KCk7Ci0JCUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUgPSAoQ29uZmlndXJlZFNpdGUpIGZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvblNpdGVNb2RlbCgoU2l0ZU1vZGVsKSBzaXRlLCBnZXREZWZhdWx0UG9saWN5KCkpOwotCi0JCWlmIChjb25maWdTaXRlLmlzTmF0aXZlbHlMaW5rZWQoKSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTWVzc2FnZXMuSW5zdGFsbENvbmZpZ3VyYXRpb25fQWxyZWFkeU5hdGl2ZWx5TGlua2VkLCBudWxsKTsgCi0JCX0KLQkJCi0JCWlmIChjb25maWdTaXRlLmlzUHJvZHVjdFNpdGUoKSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTWVzc2FnZXMuSW5zdGFsbENvbmZpZ3VyYXRpb25fQWxyZWFkeVByb2R1Y3RTaXRlLCBudWxsKTsgCi0JCX0KLQkJCi0JCWlmIChzaXRlICE9IG51bGwpIHsKLQkJCWNvbmZpZ1NpdGUuc2V0UGxhdGZvcm1VUkxTdHJpbmcoc2l0ZS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLQotCQkJLy8gb2J0YWluIHRoZSBsaXN0IG9mIHBsdWdpbnMKLQkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcnVudGltZUNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7Ci0JCQlDb25maWd1cmF0aW9uUG9saWN5IGNvbmZpZ3VyYXRpb25Qb2xpY3kgPSBjb25maWdTaXRlLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKTsKLQkJCVN0cmluZ1tdIHBsdWdpblBhdGggPSBuZXcgU3RyaW5nWzBdOwotCQkJaWYgKGNvbmZpZ3VyYXRpb25Qb2xpY3kuZ2V0UG9saWN5KCkgPT0gSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUpCi0JCQkJcGx1Z2luUGF0aCA9IGNvbmZpZ3VyYXRpb25Qb2xpY3kuZ2V0UGx1Z2luUGF0aChzaXRlKTsKLQotCQkJLy8gY3JlYXRlIG5ldyBTaXRlIGluIGNvbmZpZ3VyYXRpb24KLQkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVQb2xpY3kgc2l0ZVBvbGljeSA9IHJ1bnRpbWVDb25maWd1cmF0aW9uLmNyZWF0ZVNpdGVQb2xpY3koY29uZmlndXJhdGlvblBvbGljeS5nZXRQb2xpY3koKSwgcGx1Z2luUGF0aCk7Ci0KLQkJCS8vIGNoYW5nZSBydW50aW1lCi0JCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlRW50cnkgc2l0ZUVudHJ5ID0gcnVudGltZUNvbmZpZ3VyYXRpb24uY3JlYXRlU2l0ZUVudHJ5KHNpdGUuZ2V0VVJMKCksIHNpdGVQb2xpY3kpOwotCQkJcnVudGltZUNvbmZpZ3VyYXRpb24uY29uZmlndXJlU2l0ZShzaXRlRW50cnkpOwotCi0JCQkvLyBpZiB0aGUgcHJpdmF0cmUgbWFya2VyIGRvZXNuJ3QgYWxyZWFkeSBleGlzdCBjcmVhdGUgaXQKLQkJCWNvbmZpZ1NpdGUuY3JlYXRlUHJpdmF0ZVNpdGVNYXJrZXIoKTsKLQkJCSgoU2l0ZU1vZGVsKXNpdGUpLnNldENvbmZpZ3VyZWRTaXRlTW9kZWwoY29uZmlnU2l0ZSk7Ci0JCX0KLQkJLy8gY29uZmlndXJlIGFsbCBmZWF0dXJlcyBhcyBlbmFibGUKLQkJY29uZmlndXJlKGNvbmZpZ1NpdGUpOwotCQkKLQkJcmV0dXJuIGNvbmZpZ1NpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIENvbmZpZ3VyYXRpb24gU2l0ZSBhbmQgYSBuZXcgU2l0ZSBhcyBhIHByaXZhdGUgbGluayBzaXRlCi0JICogVGhlIHBvbGljeSBpcyBmcm9tIDxjb2RlPiBvcmcuZWNsaXBzZS5jb3JlLmJvb3QuSVBsYXRmb3JtQ29uZmlndXJhdGlvbjwvY29kZT4KLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlIGNyZWF0ZUxpbmtlZENvbmZpZ3VyZWRTaXRlKEZpbGUgZmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlQ29uZmlndXJlZFNpdGUoZmlsZSk7Ci0vLwkJaWYgKGlzRHVwbGljYXRlU2l0ZShmaWxlKSkKLS8vCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oVXBkYXRlVXRpbHMuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgiSW5zdGFsbENvbmZpZ3VyYXRpb24ubG9jYXRpb24uZXhpc3RzIiwgZmlsZS5nZXRQYXRoKCkpLG51bGwpOwotLy8JCQotLy8JCUlTaXRlIHNpdGUgPSBJbnRlcm5hbFNpdGVNYW5hZ2VyLmNyZWF0ZVNpdGUoZmlsZSk7Ci0vLwotLy8JCS8vY3JlYXRlIGEgY29uZmlnIHNpdGUgYXJvdW5kIHRoZSBzaXRlCi0vLwkJLy8gZXZlbiBpZiB0aGUgc2l0ZSA9PSBudWxsCi0vLwkJQmFzZVNpdGVMb2NhbEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBCYXNlU2l0ZUxvY2FsRmFjdG9yeSgpOwotLy8JCUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUgPSAoQ29uZmlndXJlZFNpdGUpIGZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdGlvblNpdGVNb2RlbCgoU2l0ZU1vZGVsKSBzaXRlLCBnZXREZWZhdWx0UG9saWN5KCkpOwotLy8KLS8vCQlpZiAoIWNvbmZpZ1NpdGUuaXNFeHRlbnNpb25TaXRlKCkpIHsKLS8vCQkJU3RyaW5nIG1zZyA9IFBvbGljeS5iaW5kKCJJbnN0YWxsQ29uZmlndXJhdGlvbi5Ob3RBbkV4dGVuc2lvblNpdGUiKTsKLS8vCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24obXNnLCBudWxsKTsKLS8vCQl9Ci0vLwotLy8JCWlmIChjb25maWdTaXRlLmlzTmF0aXZlbHlMaW5rZWQoKSkgewotLy8JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigiSW5zdGFsbENvbmZpZ3VyYXRpb24uQWxyZWFkeU5hdGl2ZWx5TGlua2VkIiwgbnVsbCk7Ci0vLwkJfQotLy8KLS8vCQlpZiAoc2l0ZSAhPSBudWxsKSB7Ci0vLwkJCWNvbmZpZ1NpdGUuc2V0UGxhdGZvcm1VUkxTdHJpbmcoc2l0ZS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLS8vCi0vLwkJCS8vIG9idGFpbiB0aGUgbGlzdCBvZiBwbHVnaW5zCi0vLwkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcnVudGltZUNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7Ci0vLwkJCUNvbmZpZ3VyYXRpb25Qb2xpY3kgY29uZmlndXJhdGlvblBvbGljeSA9IGNvbmZpZ1NpdGUuZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpOwotLy8JCQlTdHJpbmdbXSBwbHVnaW5QYXRoID0gbmV3IFN0cmluZ1swXTsKLS8vCQkJaWYgKGNvbmZpZ3VyYXRpb25Qb2xpY3kuZ2V0UG9saWN5KCkgPT0gSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUpCi0vLwkJCQlwbHVnaW5QYXRoID0gY29uZmlndXJhdGlvblBvbGljeS5nZXRQbHVnaW5QYXRoKHNpdGUpOwotLy8KLS8vCQkJLy8gY3JlYXRlIG5ldyBTaXRlIGluIGNvbmZpZ3VyYXRpb24KLS8vCQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeSBzaXRlUG9saWN5ID0gcnVudGltZUNvbmZpZ3VyYXRpb24uY3JlYXRlU2l0ZVBvbGljeShjb25maWd1cmF0aW9uUG9saWN5LmdldFBvbGljeSgpLCBwbHVnaW5QYXRoKTsKLS8vCi0vLwkJCS8vIGNoYW5nZSBydW50aW1lCi0vLwkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVFbnRyeSBzaXRlRW50cnkgPSBydW50aW1lQ29uZmlndXJhdGlvbi5jcmVhdGVTaXRlRW50cnkoc2l0ZS5nZXRVUkwoKSwgc2l0ZVBvbGljeSk7Ci0vLwkJCXJ1bnRpbWVDb25maWd1cmF0aW9uLmNvbmZpZ3VyZVNpdGUoc2l0ZUVudHJ5KTsKLS8vCi0vLwkJfQotLy8KLS8vCQkvLyBjb25maWd1cmUgYWxsIGZlYXR1cmVzIGFzIGVuYWJsZQotLy8JCWNvbmZpZ3VyZShjb25maWdTaXRlKTsKLS8vCi0vLwkJcmV0dXJuIGNvbmZpZ1NpdGU7Ci0JfQotCi0JLyoKLQkgKkNvbmZpZ3VyZSBhbGwgZmVhdHVyZXMgYXMgRW5hYmxlIENoZWNrIHdlIG9ubHkgZW5hYmxlIGhpZ2hlc3QgdmVyc2lvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmUoQ29uZmlndXJlZFNpdGUgbGlua2VkU2l0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU2l0ZSBzaXRlID0gbGlua2VkU2l0ZS5nZXRTaXRlKCk7Ci0JCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIG5ld0ZlYXR1cmVzUmVmID0gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3RmVhdHVyZXNSZWYubGVuZ3RoOyBpKyspIHsKLQkJCS8vIFRSQUNFCi0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUkVDT05DSUxFUikgewotCQkJCVN0cmluZyByZWNvbmNpbGlhdGlvblR5cGUgPSAiZW5hYmxlIChvcHRpbWlzdGljKSI7IC8vJE5PTi1OTFMtMSQKLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJOZXcgTGlua2VkIFNpdGU6TmV3IEZlYXR1cmU6ICIgKyBuZXdGZWF0dXJlc1JlZltpXS5nZXRVUkwoKSArICIgYXMgIiArIHJlY29uY2lsaWF0aW9uVHlwZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJQ29uZmlndXJhdGlvblBvbGljeSBwb2xpY3kgPSBsaW5rZWRTaXRlLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKTsKLQkJCXBvbGljeS5jb25maWd1cmUobmV3RmVhdHVyZXNSZWZbaV0sIHRydWUsIGZhbHNlKTsKLQkJfQotCQlTaXRlUmVjb25jaWxlci5jaGVja0NvbmZpZ3VyZWRGZWF0dXJlcyhsaW5rZWRTaXRlKTsKLQl9Ci0KLQkvKgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFNpdGUoSUNvbmZpZ3VyZWRTaXRlIHNpdGUpIHsKLQkJaWYgKCFpc0N1cnJlbnQoKSAmJiBpc1JlYWRPbmx5KCkpCi0JCQlyZXR1cm47Ci0KLQkJQ29uZmlndXJhdGlvbkFjdGl2aXR5IGFjdGl2aXR5ID0gbmV3IENvbmZpZ3VyYXRpb25BY3Rpdml0eShJQWN0aXZpdHkuQUNUSU9OX1NJVEVfSU5TVEFMTCk7Ci0JCWFjdGl2aXR5LnNldExhYmVsKHNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQlhY3Rpdml0eS5zZXREYXRlKG5ldyBEYXRlKCkpOwotCQlDb25maWd1cmVkU2l0ZU1vZGVsIGNvbmZpZ1NpdGVNb2RlbCA9IChDb25maWd1cmVkU2l0ZU1vZGVsKSBzaXRlOwotCQlhZGRDb25maWd1cmF0aW9uU2l0ZU1vZGVsKGNvbmZpZ1NpdGVNb2RlbCk7Ci0JCWNvbmZpZ1NpdGVNb2RlbC5zZXRJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKHRoaXMpOwotCi0JCS8vIG5vdGlmeSBsaXN0ZW5lcnMKLQkJT2JqZWN0W10gY29uZmlndXJhdGlvbkxpc3RlbmVycyA9IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmF0aW9uTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoKElJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcikgY29uZmlndXJhdGlvbkxpc3RlbmVyc1tpXSk7Ci0JCQlsaXN0ZW5lci5pbnN0YWxsU2l0ZUFkZGVkKHNpdGUpOwotCQl9Ci0KLQkJLy8gZXZlcnl0aGluZyBkb25lIG9rCi0JCWFjdGl2aXR5LnNldFN0YXR1cyhJQWN0aXZpdHkuU1RBVFVTX09LKTsKLQkJdGhpcy5hZGRBY3Rpdml0eShhY3Rpdml0eSk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGFkZEFjdGl2aXR5LgotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFjdGl2aXR5KElBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlhZGRBY3Rpdml0eU1vZGVsKChDb25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbClhY3Rpdml0eSk7Ci0JfQotCi0JLyoKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbmZpZ3VyZWRTaXRlKElDb25maWd1cmVkU2l0ZSBzaXRlKSB7Ci0JCWlmICghaXNDdXJyZW50KCkgJiYgaXNSZWFkT25seSgpKQotCQkJcmV0dXJuOwotCi0JCWlmIChyZW1vdmVDb25maWd1cmF0aW9uU2l0ZU1vZGVsKChDb25maWd1cmVkU2l0ZU1vZGVsKSBzaXRlKSkgewotCQkJLy8gbm90aWZ5IGxpc3RlbmVycwotCQkJT2JqZWN0W10gY29uZmlndXJhdGlvbkxpc3RlbmVycyA9IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvbkxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9ICgoSUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKSBjb25maWd1cmF0aW9uTGlzdGVuZXJzW2ldKTsKLQkJCQlsaXN0ZW5lci5pbnN0YWxsU2l0ZVJlbW92ZWQoc2l0ZSk7Ci0JCQl9Ci0JCQkKLQkJCS8vYWN0aXZpdHkKLQkJCUNvbmZpZ3VyYXRpb25BY3Rpdml0eSBhY3Rpdml0eSA9IG5ldyBDb25maWd1cmF0aW9uQWN0aXZpdHkoSUFjdGl2aXR5LkFDVElPTl9TSVRFX1JFTU9WRSk7Ci0JCQlhY3Rpdml0eS5zZXRMYWJlbChzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJCWFjdGl2aXR5LnNldERhdGUobmV3IERhdGUoKSk7Ci0JCQlhY3Rpdml0eS5zZXRTdGF0dXMoSUFjdGl2aXR5LlNUQVRVU19PSyk7Ci0JCQl0aGlzLmFkZEFjdGl2aXR5KGFjdGl2aXR5KTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJSW5zdGFsbENvbmZpZ3VyYXRpb24jYWRkSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIoSUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKElJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUluc3RhbGxDb25maWd1cmF0aW9uI3JlbW92ZUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKElJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcihJSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0KLQkvKgotCSAqIERlbGV0ZXMgdGhlIGNvbmZpZ3VyYXRpb24gZnJvbSBpdHMgVVJML2xvY2F0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkvLyBzYXZlIHRoZSBjb25maWd1cmF0aW9uCi0JCWlmICgiZmlsZSIuZXF1YWxzSWdub3JlQ2FzZShnZXRVUkwoKS5nZXRQcm90b2NvbCgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyB0aGUgbG9jYXRpb24gcG9pbnRzIHRvIGEgZmlsZQotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZ2V0VVJMKCkuZ2V0RmlsZSgpKTsKLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBjb25maWd1cmF0aW9uIGludG8gaXRzIFVSTC9sb2NhdGlvbgotCSAqIGFuZCBjaGFuZ2VzIHRoZSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uLgotCSAqIFRoZSBydW50aW1lIHNpdGUgZW50cmllcyBmcm9tIHBsYXRmb3JtLnhtbCBhcmUgdXBkYXRlZCBhcyByZXF1aXJlZAotCSAqIChjYW5ub3QgcmVjcmVhdGUgdGhlc2UgYmVjYXVzZSBtdXN0IHByZXNlcnZlIG90aGVyIHJ1bnRpbWUgc3RhdGUpIFsxODUyMF0KLQkgKiBAcmV0dXJuIHRydWUgaWYgcmVzdGFydCBpcyBuZWVkZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYXZlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJLy8gV3JpdGUgaW5mbyAgaW50byBwbGF0Zm9ybSBmb3IgdGhlIG5leHQgcnVudGltZQotCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIHJ1bnRpbWVDb25maWd1cmF0aW9uID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOwotCQlDb25maWd1cmVkU2l0ZU1vZGVsW10gY29uZmlndXJhdGlvblNpdGVzID0gZ2V0Q29uZmlndXJhdGlvblNpdGVzTW9kZWwoKTsKLQotCQkvLyBjbGVhbiBjb25maWd1cmVkIEVudHJpZXMgZnJvbSBwbGF0Zm9ybSBydW50aW1lCi0JCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSUZlYXR1cmVFbnRyeVtdIGNvbmZpZ3VyZWRGZWF0dXJlRW50cmllcyA9IHJ1bnRpbWVDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRGZWF0dXJlRW50cmllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3VyZWRGZWF0dXJlRW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJcnVudGltZUNvbmZpZ3VyYXRpb24udW5jb25maWd1cmVGZWF0dXJlRW50cnkoY29uZmlndXJlZEZlYXR1cmVFbnRyaWVzW2ldKTsKLQkJfQotCi0JCS8vIFsxOTk1OF0gcmVtZW1iZXIgc2l0ZXMgY3VycmVudGx5IGNvbmZpZ3VyZWQgYnkgcnVudGltZSAodXNlCi0JCS8vIHRlbXAgY29uZmlndXJhdGlvbiBvYmplY3QgcmF0aGVyIHRoYW4gYSBzdHJhaWdodCBsaXN0IHRvIGVuc3VyZQotCQkvLyBjb3JyZWN0IGxvb2t1cCkKLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiB0ZW1wQ29uZmlnID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRlbXBDb25maWcgPSBDb25maWd1cmF0b3JVdGlscy5nZXRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24obnVsbCk7Ci0JCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlRW50cnlbXSB0bXBTaXRlcyA9IHJ1bnRpbWVDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0bXBTaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCXRlbXBDb25maWcuY29uZmlndXJlU2l0ZSh0bXBTaXRlc1tpXSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGFzc3VtZSBubyBjdXJyZW50bHkgY29uZmlndXJlZCBzaXRlcwotCQl9Ci0KLQkJLy9jaGVjayBzaXRlcwotCQljaGVja1NpdGVzKGNvbmZpZ3VyYXRpb25TaXRlcywgcnVudGltZUNvbmZpZ3VyYXRpb24pOwotCi0JCS8vIFNhdmUgdGhlIHBsdWdpbiBwYXRoLCBwcmltYXJ5IGZlYXR1cmUgYW5kIHBsYXRmb3JtCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvblNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb25maWd1cmVkU2l0ZSBjU2l0ZSA9ICgoQ29uZmlndXJlZFNpdGUpIGNvbmZpZ3VyYXRpb25TaXRlc1tpXSk7Ci0JCQlDb25maWd1cmF0aW9uUG9saWN5IGNvbmZpZ3VyYXRpb25Qb2xpY3kgPSBjU2l0ZS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCk7Ci0KLQkJCXNhdmVQbHVnaW5QYXRoKGNTaXRlLCBydW50aW1lQ29uZmlndXJhdGlvbiwgdGVtcENvbmZpZyk7Ci0KLQkJCS8vIElGIHByaW1hcnkgZmVhdHVyZSBVUkwgb3IgcGxhdGZvcm0gZmVhdHVyZSBVUkwgdGhhdCB3ZSBuZWVkIHRvIHBhc3MgdG8gcnVudGltZSBjb25maWcKLQkJCS8vIGlzIHBhcnQgb2YgcGxhdGZvcm06YmFzZTosIHdyaXRlIGl0IGFzIHBsYXRmb3JtOmJhc2U6IFVSTAotCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjb25maWd1cmVkRmVhdHVyZXNSZWYgPSBjb25maWd1cmF0aW9uUG9saWN5LmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWd1cmVkRmVhdHVyZXNSZWYubGVuZ3RoOyBqKyspIHsKLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlmZWF0dXJlID0gY29uZmlndXJlZEZlYXR1cmVzUmVmW2pdLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsKLQkJCQl9Ci0JCQkJc2F2ZUZlYXR1cmVFbnRyeShjU2l0ZSwgZmVhdHVyZSwgcnVudGltZUNvbmZpZ3VyYXRpb24pOwotCQkJfQotCQl9Ci0KLQkJLy8gWzE5OTU4XSByZW1vdmUgYW55IGV4dHJhIHNpdGUgZW50cmllcyBmcm9tIHJ1bnRpbWUgY29uZmlndXJhdGlvbgotCQkvLyAoc2l0ZSBlbnRyaWVzIHRoYXQgbm8gbG9uZ2VyIGV4aXN0IGluIHRoaXMgY29uZmlndXJhdGlvbikKLQkJaWYgKHRlbXBDb25maWcgIT0gbnVsbCkgewotCQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZUVudHJ5W10gdG1wU2l0ZXMgPSB0ZW1wQ29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0bXBTaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCXJ1bnRpbWVDb25maWd1cmF0aW9uLnVuY29uZmlndXJlU2l0ZSh0bXBTaXRlc1tpXSk7Ci0JCQl9Ci0JCX0KLQotCQl0cnkgewotCQkJcnVudGltZUNvbmZpZ3VyYXRpb24uc2F2ZSgpOwotCQkJLy8gbG9nIGNvbmZpZ3VyYXRpb24gYW5kIGFjdGl2aXRpZXMKLQkJCXRoaXMuZGF0ZSA9IG5ldyBEYXRlKHJ1bnRpbWVDb25maWd1cmF0aW9uLmdldENoYW5nZVN0YW1wKCkpOwotCQkJaWYgKCJmaWxlIi5lcXVhbHNJZ25vcmVDYXNlKGdldFVSTCgpLmdldFByb3RvY29sKCkpKSAvLyROT04tTkxTLTEkCi0JCQkJVXBkYXRlQ29yZS5sb2codGhpcyk7Ci0JCQlyZXNldEFjdGl2aXRpZXMoKTsKLQkJCXJldHVybiBpc1Jlc3RhcnROZWVkZWQocnVudGltZUNvbmZpZ3VyYXRpb24pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlDb3JlRXhjZXB0aW9uIGV4YyA9IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkluc3RhbGxDb25maWd1cmF0aW9uX1VuYWJsZVRvU2F2ZVBsYXRmb3JtQ29uZmlndXJhdGlvbiwgKG5ldyBTdHJpbmdbXSB7IHJ1bnRpbWVDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpLnRvRXh0ZXJuYWxGb3JtKCkgfSkpLCBlKTsKLQkJCVVwZGF0ZUNvcmUud2FybigiIixleGMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiBXcml0ZSB0aGUgcGx1Z2luIHBhdGggZm9yIGVhY2ggc2l0ZQotCSAqIERvIG5vdCBjaGVjayBpZiB0aGUgc2l0ZSBhbHJlYWR5IGV4aXN0ZWQgYmVmb3JlIFsxNjY5Nl0uCi0JICogUmV1c2UgYW55IHJ1bnRpbWUgc2l0ZSBvYmplY3RzIGluIHBsYXRmb3JtLmNmZyAodG8gcHJlc2VydmUgc3RhdGUpIFsxODUyMF0uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNhdmVQbHVnaW5QYXRoKENvbmZpZ3VyZWRTaXRlIGNTaXRlLCBJUGxhdGZvcm1Db25maWd1cmF0aW9uIHJ1bnRpbWVDb25maWd1cmF0aW9uLCBJUGxhdGZvcm1Db25maWd1cmF0aW9uIHRlbXBDb25maWcpIC8vIFsxOTk1OF0KLQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJQ29uZmlndXJhdGlvblBvbGljeSBjb25maWd1cmF0aW9uUG9saWN5ID0gY1NpdGUuZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpOwotCi0JCS8vIGNyZWF0ZSBhIElTaXRlUG9saWN5IChwb2xpY3ksIHBsdWdpblBhdGgpCi0JCS8vIGZvciB0aGUgc2l0ZQotCQlTdHJpbmdbXSBwbHVnaW5QYXRoID0gY29uZmlndXJhdGlvblBvbGljeS5nZXRQbHVnaW5QYXRoKGNTaXRlLmdldFNpdGUoKSk7Ci0JCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVQb2xpY3kgc2l0ZVBvbGljeSA9IHJ1bnRpbWVDb25maWd1cmF0aW9uLmNyZWF0ZVNpdGVQb2xpY3koY29uZmlndXJhdGlvblBvbGljeS5nZXRQb2xpY3koKSwgcGx1Z2luUGF0aCk7Ci0KLQkJLy8gZ2V0IHRoZSBVUkwgb2YgdGhlIHNpdGUgdGhhdCBtYXRjaGVzIHRoZSBvbmUgcGxhdGZvcm0uY2ZnIGdhdmUgdXMKLQkJVVJMIHVybFRvQ2hlY2sgPSBudWxsOwotCQl0cnkgewotCQkJdXJsVG9DaGVjayA9IG5ldyBVUkwoY1NpdGUuZ2V0UGxhdGZvcm1VUkxTdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsQ29uZmlndXJhdGlvbl9VbmFibGVUb0NyZWF0ZVVSTCwgKG5ldyBTdHJpbmdbXSB7IGNTaXRlLmdldFBsYXRmb3JtVVJMU3RyaW5nKCkgfSkpLCBlKTsKLQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE1lc3NhZ2VzLkluc3RhbGxDb25maWd1cmF0aW9uX1VuYWJsZVRvQ2FzdCwgZSk7CQotCQl9Ci0KLQkJLy8gdXBkYXRlIHJ1bnRpbWUgY29uZmlndXJhdGlvbiBbMTg1MjBdCi0JCS8vIE5vdGU6IHdlIG11c3Qgbm90IGJsaW5kbHkgcmVwbGFjZSB0aGUgc2l0ZSBlbnRyaWVzIGJlY2F1c2UgdGhleQotCQkvLyAgICAgICBjb250YWluIGFkZGl0aW9uYWwgcnVudGltZSBzdGF0ZSB0aGF0IG5lZWRzIHRvIGJlIHByZXNlcnZlZC4KLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZUVudHJ5IHNpdGVFbnRyeSA9IHJ1bnRpbWVDb25maWd1cmF0aW9uLmZpbmRDb25maWd1cmVkU2l0ZSh1cmxUb0NoZWNrKTsKLQkJaWYgKHNpdGVFbnRyeSA9PSBudWxsKQotCQkJc2l0ZUVudHJ5ID0gcnVudGltZUNvbmZpZ3VyYXRpb24uY3JlYXRlU2l0ZUVudHJ5KHVybFRvQ2hlY2ssIHNpdGVQb2xpY3kpOwotCQllbHNlIHsKLQkJCXNpdGVFbnRyeS5zZXRTaXRlUG9saWN5KHNpdGVQb2xpY3kpOwotCQkJKChTaXRlRW50cnkpc2l0ZUVudHJ5KS5yZWZyZXNoUGx1Z2lucygpOwotCQkJaWYgKHRlbXBDb25maWcgIT0gbnVsbCkgLy8gWzE5OTU4XSByZW1vdmUgcmV1c2VkIGVudHJpZXMgZnJvbSBsaXN0Ci0JCQkJdGVtcENvbmZpZy51bmNvbmZpZ3VyZVNpdGUoc2l0ZUVudHJ5KTsKLQkJfQotCQkoKFNpdGVFbnRyeSlzaXRlRW50cnkpLnNldEVuYWJsZWQoY1NpdGUuaXNFbmFibGVkKCkpOwotCQlydW50aW1lQ29uZmlndXJhdGlvbi5jb25maWd1cmVTaXRlKHNpdGVFbnRyeSwgdHJ1ZSAvKnJlcGxhY2UgaWYgZXhpc3RzKi8pOwotCX0KLQotCS8qCi0JICogU2F2ZSB0aGUgRmVhdHVyZSBlbnRyeQotCSAqIFRoZSBmZWF0dXJlIGNhbiBiZSBhIHByaW1hcnkgZmVhdHVyZSBhbmQvb3IgYSBwbGF0Zm9ybSBmZWF0dXJlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNhdmVGZWF0dXJlRW50cnkoQ29uZmlndXJlZFNpdGUgY1NpdGUsIElGZWF0dXJlIGZlYXR1cmUsIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcnVudGltZUNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBnZXQgdGhlIFVSTCBvZiB0aGUgcGx1Z2luIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGZlYXR1cmUgKHBsdWdpbmlkID0gZmVhdHVyZWlkKQotCQlTdHJpbmcgaWQgPSBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCk7Ci0JCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSBmZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKLQkJVVJMIHVybCA9IG51bGw7Ci0JCUlQbHVnaW5FbnRyeSBmZWF0dXJlUGx1Z2luID0gbnVsbDsKLQkJZm9yIChpbnQgayA9IDA7IGsgPCBlbnRyaWVzLmxlbmd0aDsgaysrKSB7Ci0JCQlpZiAoaWQuZXF1YWxzSWdub3JlQ2FzZShlbnRyaWVzW2tdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkpKSB7Ci0JCQkJdXJsID0gZ2V0UnVudGltZUNvbmZpZ3VyYXRpb25VUkwoZW50cmllc1trXSwgY1NpdGUpOwotCQkJCWZlYXR1cmVQbHVnaW4gPSBlbnRyaWVzW2tdOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCVN0cmluZyBwbHVnaW5WZXJzaW9uID0gbnVsbDsKLQkJaWYgKGZlYXR1cmVQbHVnaW4gIT0gbnVsbCkKLQkJCXBsdWdpblZlcnNpb24gPSBmZWF0dXJlUGx1Z2luLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsKLQotICAgICAgICAvLyBGaW5kIHRoZSBzaXRlCi0gICAgICAgIFNpdGVFbnRyeSBzaXRlRW50cnkgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgVVJMIGZlYXR1cmVVcmwgPSBuZXcgVVJMKGNTaXRlLmdldFBsYXRmb3JtVVJMU3RyaW5nKCkpOwotICAgICAgICAgICAgc2l0ZUVudHJ5ID0gKFNpdGVFbnRyeSlydW50aW1lQ29uZmlndXJhdGlvbi5maW5kQ29uZmlndXJlZFNpdGUoZmVhdHVyZVVybCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsQ29uZmlndXJhdGlvbl9VbmFibGVUb0NyZWF0ZVVSTCwgKG5ldyBTdHJpbmdbXSB7IGNTaXRlLmdldFBsYXRmb3JtVVJMU3RyaW5nKCkgfSkpLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE1lc3NhZ2VzLkluc3RhbGxDb25maWd1cmF0aW9uX1VuYWJsZVRvQ2FzdCwgZSk7ICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgdGhlIFVSTCBkb2Vzbid0IGV4aXN0IHRocm93IGEgQ29yZUV4Y2VwdGlvbgotICAgICAgICBpZiAoc2l0ZUVudHJ5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTkxTLmJpbmQoTWVzc2FnZXMuSW5zdGFsbENvbmZpZ3VyYXRpb25fdW5hYmxlVG9GaW5kU2l0ZSwgKG5ldyBTdHJpbmdbXSB7IGNTaXRlLmdldFNpdGUoKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpLCBydW50aW1lQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKS50b0V4dGVybmFsRm9ybSgpIH0pKSkpOwotICAgICAgICB9Ci0KLQkJLy8gd3JpdGUgdGhlIHByaW1hcnkgZmVhdHVyZXMKLQkJaWYgKGZlYXR1cmUuaXNQcmltYXJ5KCkpIHsKLQkJCS8vIGdldCBhbnkgZnJhZ21lbnRzIGZvciB0aGUgZmVhdHVyZSBwbHVnaW4KLQkJCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKHVybCAhPSBudWxsKQotCQkJCWxpc3QuYWRkKHVybCk7Ci0JCQlpZiAoZmVhdHVyZVBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJVVJMW10gZnJhZ21lbnRzID0gZ2V0UnVudGltZUZyYWdtZW50VVJMcyhmZWF0dXJlUGx1Z2luKTsKLQkJCQlsaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KGZyYWdtZW50cykpOwotCQkJfQotCQkJVVJMW10gcm9vdHMgPSAoVVJMW10pIGxpc3QudG9BcnJheShuZXcgVVJMWzBdKTsKLQkJCVN0cmluZyBwbHVnaW5JZGVudGlmaWVyID0gZmVhdHVyZS5nZXRQcmltYXJ5UGx1Z2luSUQoKTsKLQotCQkJLy8gc2F2ZSBpbmZvcm1hdGlvbiBpbiBydW50aW1lIHBsYXRmb3JtIHN0YXRlCi0JCQlTdHJpbmcgdmVyc2lvbiA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpOwotCQkJU3RyaW5nIGFwcGxpY2F0aW9uID0gZmVhdHVyZS5nZXRBcHBsaWNhdGlvbigpOwotCQkJRmVhdHVyZUVudHJ5IGZlYXR1cmVFbnRyeSA9IChGZWF0dXJlRW50cnkpcnVudGltZUNvbmZpZ3VyYXRpb24uY3JlYXRlRmVhdHVyZUVudHJ5KGlkLCB2ZXJzaW9uLCBwbHVnaW5JZGVudGlmaWVyLCBwbHVnaW5WZXJzaW9uLCB0cnVlLCBhcHBsaWNhdGlvbiwgcm9vdHMpOwotCQkJZmVhdHVyZUVudHJ5LnNldFVSTChnZXRGZWF0dXJlUmVsYXRpdmVVUkwoZmVhdHVyZSkpOwotCQkJc2l0ZUVudHJ5LmFkZEZlYXR1cmVFbnRyeShmZWF0dXJlRW50cnkpOwotCQl9IGVsc2UgewotCQkJLy8gd3JpdGUgbm9uLXByaW1hcnkgZmVhdHVyZSBlbnRyaWVzCi0JCQlTdHJpbmcgdmVyc2lvbiA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpOwotCQkJU3RyaW5nIHBsdWdpbklkZW50aWZpZXIgPSBmZWF0dXJlLmdldFByaW1hcnlQbHVnaW5JRCgpOwotCQkJRmVhdHVyZUVudHJ5IGZlYXR1cmVFbnRyeSA9IChGZWF0dXJlRW50cnkpcnVudGltZUNvbmZpZ3VyYXRpb24uY3JlYXRlRmVhdHVyZUVudHJ5KGlkLCB2ZXJzaW9uLCBwbHVnaW5JZGVudGlmaWVyLCBwbHVnaW5WZXJzaW9uLCBmYWxzZSwgbnVsbCwgbnVsbCk7Ci0JCQlmZWF0dXJlRW50cnkuc2V0VVJMKGdldEZlYXR1cmVSZWxhdGl2ZVVSTChmZWF0dXJlKSk7Ci0JCQlzaXRlRW50cnkuYWRkRmVhdHVyZUVudHJ5KGZlYXR1cmVFbnRyeSk7Ci0JCX0KLQotCQkvLyB3cml0ZSB0aGUgcGxhdGZvcm0gZmVhdHVyZXMgKGZlYXR1cmVzIHRoYXQgY29udGFpbiBzcGVjaWFsIHBsYXRmb3JtIHBsdWdpbnMpCi0JCUlQbHVnaW5FbnRyeVtdIHBsYXRmb3JtUGx1Z2lucyA9IGdldFBsYXRmb3JtUGx1Z2lucyhmZWF0dXJlLCBydW50aW1lQ29uZmlndXJhdGlvbik7Ci0JCWZvciAoaW50IGsgPSAwOyBrIDwgcGxhdGZvcm1QbHVnaW5zLmxlbmd0aDsgaysrKSB7Ci0JCQlpZCA9IHBsYXRmb3JtUGx1Z2luc1trXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpOwotCQkJdXJsID0gZ2V0UnVudGltZUNvbmZpZ3VyYXRpb25VUkwocGxhdGZvcm1QbHVnaW5zW2tdLCBjU2l0ZSk7Ci0JCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQlydW50aW1lQ29uZmlndXJhdGlvbi5zZXRCb290c3RyYXBQbHVnaW5Mb2NhdGlvbihpZCwgdXJsKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogTG9nIGlmIHdlIGFyZSBhYm91dCB0byBjcmVhdGUgYSBzaXRlIHRoYXQgZGlkbid0IGV4aXN0IGJlZm9yZQotCSAqIGluIHBsYXRmb3JtLmNmZyBbMTY2OTZdLgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja1NpdGVzKENvbmZpZ3VyZWRTaXRlTW9kZWxbXSBjb25maWd1cmF0aW9uU2l0ZXMsIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcnVudGltZUNvbmZpZ3VyYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkvLyBjaGVjayBhbGwgdGhlIHNpdGVzIHdlIGFyZSBhYm91dCB0byB3cml0ZSBhbHJlYWR5IGV4aXN0ZWQKLQkJLy8gdGhleSBzaG91bGQgaGF2ZSBleGlzdGVkIGVpdGhlciBiZWNhdXNlIHRoZXkgd2VyZSBjcmVhdGVkIGJ5Ci0JCS8vIHVwZGF0ZU1hbmFnZXIgb3IgYmVjYXVzZSB3ZSByZWFkIHRoZW0gZnJvbSBwbGF0Zm9ybS5jZmcKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmF0aW9uU2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCS8vIGdldCB0aGUgVVJMIG9mIHRoZSBzaXRlIHRoYXQgbWF0Y2hlcyB0aGUgb25lIHBsYXRmb3JtLmNmZyBnYXZlIHVzCi0JCQlVUkwgdXJsVG9DaGVjayA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXVybFRvQ2hlY2sgPSBuZXcgVVJMKGNvbmZpZ3VyYXRpb25TaXRlc1tpXS5nZXRQbGF0Zm9ybVVSTFN0cmluZygpKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVXBkYXRlQ29yZS53YXJuKE5MUy5iaW5kKE1lc3NhZ2VzLkluc3RhbGxDb25maWd1cmF0aW9uX1VuYWJsZVRvQ3JlYXRlVVJMLCAobmV3IFN0cmluZ1tdIHsgY29uZmlndXJhdGlvblNpdGVzW2ldLmdldFBsYXRmb3JtVVJMU3RyaW5nKCkgfSkpLCBlKTsKLQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVXBkYXRlQ29yZS53YXJuKE1lc3NhZ2VzLkluc3RhbGxDb25maWd1cmF0aW9uX1VuYWJsZVRvQ2FzdCwgZSk7Ci0JCQl9Ci0KLQkJCS8vIGlmIHRoZSBVUkwgZG9lc24ndCBleGl0cyBsb2cgaXQKLQkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVFbnRyeSBzaXRlRW50cnkgPSBydW50aW1lQ29uZmlndXJhdGlvbi5maW5kQ29uZmlndXJlZFNpdGUodXJsVG9DaGVjayk7Ci0JCQlpZiAoc2l0ZUVudHJ5ID09IG51bGwpIHsKLQkJCQlVcGRhdGVDb3JlLndhcm4oTkxTLmJpbmQoTWVzc2FnZXMuSW5zdGFsbENvbmZpZ3VyYXRpb25fdW5hYmxlVG9GaW5kU2l0ZSwgKG5ldyBTdHJpbmdbXSB7IHVybFRvQ2hlY2sudG9FeHRlcm5hbEZvcm0oKSwgcnVudGltZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCkudG9FeHRlcm5hbEZvcm0oKSB9KSkpOyAKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoKLQkgKiByZXZlcnRzIHRoaXMgY29uZmlndXJhdGlvbiB0byB0aGUgbWF0Y2ggdGhlIG5ldyBvbmUKLQkgKgotCSAqIENvbXBhcmUgdGhlIG9sZFNpdGVzIHdpdGggdGhlIGN1cnJlbnRPbmUuIHRoZSBvbGQgc3RhdGUgaXMgdGhlIHN0YXRlIHdlIHdhbnQgdG8gcmV2ZXJ0IHRvLgotCSAqCi0JICogSWYgYSBzaXRlIHdhcyBpbiBvbGQgc3RhdGUsIGJ1dCBub3QgaW4gdGhlIGN1cnJlbnRPbmUsIGtlZXAgaXQgaW4gdGhlIGhhc2guCi0JICogSWYgYSBzaXRlIGlzIGluIHRoZSBjdXJyZW50T25lIGJ1dCB3YXMgbm90IGluIHRoZSBvbGQgc3RhdGUsIHVuY29uZmlndXJlIGFsbCBmZWF0dXJlcyBhbmQgYWRkIGl0IGluIHRoZSBoYXNoCi0JICogSWYgYSBzaXRlIHdhcyBpbiBiYW90aCBzdGF0ZSwgY2FsY3VsYXRlIHRoZSAnZGVsdGEnIGFuZCByZS1zZXQgaXQgaW4gdGhlIGhhc2ggbWFwCi0JICoKLQkgKiBBdCB0aGUgZW5kLCBzZXQgdGhlIGNvbmZpZ3VyZWQgc2l0ZSBmcm9tIHRoZSBuZXcgc2l0ZXMgaGFzaCBtYXAKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHJldmVydFRvKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9ibGVtSGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCi0JCUlDb25maWd1cmVkU2l0ZVtdIG9sZENvbmZpZ1NpdGVzID0gY29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJSUNvbmZpZ3VyZWRTaXRlW10gbm93Q29uZmlnU2l0ZXMgPSB0aGlzLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCi0JCS8vIGNyZWF0ZSBhIGhhc2h0YWJsZSBvZiB0aGUgKm9sZCogYW5kICpuZXcqIHNpdGVzCi0JCU1hcCBvbGRTaXRlc01hcCA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCU1hcCBuZXdTaXRlc01hcCA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkQ29uZmlnU2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmVkU2l0ZSBlbGVtZW50ID0gb2xkQ29uZmlnU2l0ZXNbaV07Ci0JCQlvbGRTaXRlc01hcC5wdXQoZWxlbWVudC5nZXRTaXRlKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSwgZWxlbWVudCk7Ci0JCQluZXdTaXRlc01hcC5wdXQoZWxlbWVudC5nZXRTaXRlKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSwgZWxlbWVudCk7Ci0JCX0KLQkJLy8gY3JlYXRlIGxpc3Qgb2YgYWxsIHRoZSBzaXRlcyB0aGF0IG1hcCB0aGUgKm9sZCogc2l0ZXMKLQkJLy8gd2Ugd2FudCB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gdGhlIG9sZCBzaXRlcyBhbmQgdGhlIGN1cnJlbnQgc2l0ZXMKLQkJaWYgKG5vd0NvbmZpZ1NpdGVzICE9IG51bGwpIHsKLQkJCVN0cmluZyBrZXkgPSBudWxsOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vd0NvbmZpZ1NpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJa2V5ID0gbm93Q29uZmlnU2l0ZXNbaV0uZ2V0U2l0ZSgpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQkJSUNvbmZpZ3VyZWRTaXRlIG9sZFNpdGUgPSAoSUNvbmZpZ3VyZWRTaXRlKSBvbGRTaXRlc01hcC5nZXQoa2V5KTsKLQkJCQlpZiAob2xkU2l0ZSAhPSBudWxsKSB7Ci0JCQkJCS8vIHRoZSBTaXRlIGV4aXN0ZWQgYmVmb3JlLCBjYWxjdWxhdGUgdGhlIGRlbHRhIGJldHdlZW4gaXRzIGN1cnJlbnQgc3RhdGUgYW5kIHRoZQotCQkJCQkvLyBzdGF0ZSB3ZSBhcmUgcmV2ZXJ0aW5nIHRvIGFuZCBwdXQgaXQgYmFjayBpbnRvIHRoZSBtYXAKLQkJCQkJICgoQ29uZmlndXJlZFNpdGUpIG5vd0NvbmZpZ1NpdGVzW2ldKS5yZXZlcnRUbyhvbGRTaXRlLCBtb25pdG9yLCBoYW5kbGVyKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyB0aGUgc2l0ZSBkaWRuJ3QgZXhpc3QgaW4gdGhlIEluc3RhbGxDb25maWd1cmF0aW9uIHdlIGFyZSByZXZlcnRpbmcgdG8KLQkJCQkJLy8gdW5jb25maWd1cmUgZXZlcnl0aGluZyBmcm9tIHRoaXMgc2l0ZSBzbyBpdCBpcyBzdGlsbCBwcmVzZW50Ci0JCQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzVG9VbmNvbmZpZ3VyZSA9IG5vd0NvbmZpZ1NpdGVzW2ldLmdldFNpdGUoKS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGZlYXR1cmVzVG9VbmNvbmZpZ3VyZS5sZW5ndGg7IGorKykgewotCQkJCQkJSUZlYXR1cmUgZmVhdHVyZVRvVW5jb25maWd1cmUgPSBudWxsOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlmZWF0dXJlVG9VbmNvbmZpZ3VyZSA9IGZlYXR1cmVzVG9VbmNvbmZpZ3VyZVtqXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJVXBkYXRlQ29yZS53YXJuKG51bGwsIGUpOwotCQkJCQkJfQotCQkJCQkJaWYgKGZlYXR1cmVUb1VuY29uZmlndXJlICE9IG51bGwpCi0JCQkJCQkJbm93Q29uZmlnU2l0ZXNbaV0udW5jb25maWd1cmUoZmVhdHVyZVRvVW5jb25maWd1cmUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCW5ld1NpdGVzTWFwLnB1dChrZXksbm93Q29uZmlnU2l0ZXNbaV0pOwotCQkJfQotCi0JCQkvLyB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gaGFzIHRoZSBleGFjdCBzYW1lIHNpdGVzIGFzIHRoZSBvbGQgY29uZmlndXJhdGlvbgotCQkJLy8gdGhlIG9sZCBjb25maWd1cmF0aW9uIGluIHRoZSBNYXAgYXJlIGVpdGhlciBhcy1pcyBiZWNhdXNlIHRoZXkgZG9uJ3QgZXhpc3QKLQkJCS8vIGluIHRoZSBjdXJyZW50IG9uZSwgb3IgdGhleSBhcmUgdGhlIGRlbHRhIGZyb20gdGhlIGN1cnJlbnQgb25lIHRvIHRoZSBvbGQgb25lCi0JCQlDb2xsZWN0aW9uIHNpdGVzID0gbmV3U2l0ZXNNYXAudmFsdWVzKCk7Ci0JCQlpZiAoc2l0ZXMgIT0gbnVsbCAmJiAhc2l0ZXMuaXNFbXB0eSgpKSB7Ci0JCQkJQ29uZmlndXJlZFNpdGVNb2RlbFtdIHNpdGVzTW9kZWwgPSBuZXcgQ29uZmlndXJlZFNpdGVNb2RlbFtzaXRlcy5zaXplKCldOwotCQkJCXNpdGVzLnRvQXJyYXkoc2l0ZXNNb2RlbCk7Ci0JCQkJc2V0Q29uZmlndXJhdGlvblNpdGVNb2RlbChzaXRlc01vZGVsKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJSW5zdGFsbENvbmZpZ3VyYXRpb24jZ2V0QWN0aXZpdGllcygpCi0JICovCi0JcHVibGljIElBY3Rpdml0eVtdIGdldEFjdGl2aXRpZXMoKSB7Ci0JCWlmIChnZXRBY3Rpdml0eU1vZGVsKCkubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbmV3IElBY3Rpdml0eVswXTsKLQkJcmV0dXJuIChJQWN0aXZpdHlbXSkgZ2V0QWN0aXZpdHlNb2RlbCgpOwotCX0KLQotCS8qCi0JICogcmV0dXJucyB0aGUgbGlzdCBvZiBwbGF0Zm9ybSBwbHVnaW5zIG9mIHRoZSBmZWF0dXJlIG9yIGFuIGVtcHR5IGxpc3QKLQkgKiBpZiB0aGUgZmVhdHVyZSBkb2Vzbid0IGNvbnRhaW4gYW55IHBsYXRmb3JtIHBsdWdpbnMKLQkgKi8KLQlwcml2YXRlIElQbHVnaW5FbnRyeVtdIGdldFBsYXRmb3JtUGx1Z2lucyhJRmVhdHVyZSBmZWF0dXJlLCBJUGxhdGZvcm1Db25maWd1cmF0aW9uIHJ1bnRpbWVDb25maWd1cmF0aW9uKSB7Ci0JCU1hcCBmZWF0dXJlUGxhdGZvcm1QbHVnaW5zID0gbmV3IEhhc2hNYXAoKTsKLQkJU3RyaW5nW10gcGxhdGZvcm1QbHVnaW5JRCA9IHJ1bnRpbWVDb25maWd1cmF0aW9uLmdldEJvb3RzdHJhcFBsdWdpbklkZW50aWZpZXJzKCk7Ci0JCUlQbHVnaW5FbnRyeVtdIGZlYXR1cmVQbHVnaW5zID0gZmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbGF0Zm9ybVBsdWdpbklELmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgZmVhdHVyZVBsdWdpbklkID0gbnVsbDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZmVhdHVyZVBsdWdpbnMubGVuZ3RoOyBqKyspIHsKLQkJCQlmZWF0dXJlUGx1Z2luSWQgPSBmZWF0dXJlUGx1Z2luc1tqXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpOwotCQkJCWlmIChwbGF0Zm9ybVBsdWdpbklEW2ldLmVxdWFscyhmZWF0dXJlUGx1Z2luSWQpKSB7Ci0JCQkJCWZlYXR1cmVQbGF0Zm9ybVBsdWdpbnMucHV0KHBsYXRmb3JtUGx1Z2luSURbaV0sIGZlYXR1cmVQbHVnaW5zW2pdKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlDb2xsZWN0aW9uIHZhbHVlcyA9IGZlYXR1cmVQbGF0Zm9ybVBsdWdpbnMudmFsdWVzKCk7Ci0JCWlmICh2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbmV3IElQbHVnaW5FbnRyeVswXTsKLQotCQlJUGx1Z2luRW50cnlbXSByZXN1bHQgPSBuZXcgSVBsdWdpbkVudHJ5W3ZhbHVlcy5zaXplKCldOwotCQlJdGVyYXRvciBpdGVyID0gdmFsdWVzLml0ZXJhdG9yKCk7Ci0JCWludCBpbmRleCA9IDA7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJcmVzdWx0W2luZGV4XSA9ICgoSVBsdWdpbkVudHJ5KSBpdGVyLm5leHQoKSk7Ci0JCQlpbmRleCsrOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiByZXR1cm5zIHRoZSBVUkwgb2YgdGhlIHBsdWdpbkVudHJ5IG9uIHRoZSBzaXRlCi0JICogVHJhbnNmb3JtIHRoZSBVUkwgdG8gdXNlIHBsYXRmb3JtOiBwcm90b2NvbCBpZiBuZWVkZWQKLQkgKiByZXR1cm4gbnVsbCBpZiB0aGUgVVJMIHRvIHdyaXRlIGlzIG5vdCB2YWxpZAotCSAqLwotCXByaXZhdGUgVVJMIGdldFJ1bnRpbWVDb25maWd1cmF0aW9uVVJMKElQbHVnaW5FbnRyeSBlbnRyeSwgQ29uZmlndXJlZFNpdGUgY1NpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgcm9vdFN0cmluZyA9IGNTaXRlLmdldFBsYXRmb3JtVVJMU3RyaW5nKCk7Ci0JCVN0cmluZyBwbHVnaW5QYXRoSUQgPSBnZXRQYXRoSUQoZW50cnkpOwotCQl0cnkgewotCQkJSVNpdGVDb250ZW50UHJvdmlkZXIgc2l0ZUNvbnRlbnRQcm92aWRlciA9IGNTaXRlLmdldFNpdGUoKS5nZXRTaXRlQ29udGVudFByb3ZpZGVyKCk7Ci0JCQlVUkwgcGx1Z2luRW50cnlmdWxsVVJMID0gc2l0ZUNvbnRlbnRQcm92aWRlci5nZXRBcmNoaXZlUmVmZXJlbmNlKHBsdWdpblBhdGhJRCk7Ci0KLQkJCS8vCi0JCQlpZiAoIXJvb3RTdHJpbmcuc3RhcnRzV2l0aCgicGxhdGZvcm0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJLy8gREVCVUc6Ci0JCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0NPTkZJR1VSQVRJT04pCi0JCQkJCVVwZGF0ZUNvcmUuZGVidWcoImdldFJ1bnRpbWVDb25maWd1cmF0aW9uIFBsdWdpbiBFbnRyeSBGdWxsIFVSTDoiICsgcGx1Z2luRW50cnlmdWxsVVJMICsgIiBQbGF0Zm9ybSBTdHJpbmc6IiArIHJvb3RTdHJpbmcgKyAiIFtOT04gUExBVEZPUk0gVVJMXS4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQlyZXR1cm4gcGx1Z2luRW50cnlmdWxsVVJMOwotCQkJfQotCi0JCQkvL1VSTCBwbHVnaW5FbnRyeVJvb3RVUkwgPSBQbGF0Zm9ybS5yZXNvbHZlKG5ldyBVUkwocm9vdFN0cmluZykpOwotCQkJLy8gRG8gbm90IHJlc29sdmUgWzE2NTA3XSwganVzdCB1c2UgcGxhdGZvcm06YmFzZS8gYXMgYSByb290Ci0JCQkvLyByb290U3RyaW5nID0gcGxhdGZvcm06YmFzZQotCQkJLy8gcGx1Z2luUm9vdCA9IC9ob21lL2EKLQkJCS8vIHBsdWdpbkZ1bGwgPSAvaG9tZS9hL2MvYm9vdC5qYXIKLQkJCS8vIHJlbGF0aXZlID0gcGxhdGZvcm06L2Jhc2UvYy9ib290LmphcgotCQkJVVJMIHBsdWdpbkVudHJ5Um9vdFVSTCA9IGNTaXRlLmdldFNpdGUoKS5nZXRVUkwoKTsKLQkJCVN0cmluZyByZWxhdGl2ZVN0cmluZyA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkxBc1N0cmluZyhwbHVnaW5FbnRyeVJvb3RVUkwsIHBsdWdpbkVudHJ5ZnVsbFVSTCk7Ci0JCQlVUkwgcmVzdWx0ID0gbmV3IFVSTChuZXcgVVJMKHJvb3RTdHJpbmcpLCByZWxhdGl2ZVN0cmluZyk7Ci0KLQkJCS8vIERFQlVHOgotCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0NPTkZJR1VSQVRJT04pCi0JCQkJVXBkYXRlQ29yZS5kZWJ1ZygiZ2V0UnVudGltZUNvbmZpZ3VyYXRpb24gcGx1Z2luIEVudHJ5IEZ1bGwgVVJMOiIgKyBwbHVnaW5FbnRyeWZ1bGxVUkwgKyAiIFBsYXRmb3JtIFN0cmluZzoiICsgcm9vdFN0cmluZyArICIgU2l0ZSBVUkw6IiArIHBsdWdpbkVudHJ5Um9vdFVSTCArICIgUmVsYXRpdmU6IiArIHJlbGF0aXZlU3RyaW5nKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCi0JCQkvLyB2ZXJpZnkgd2UgYXJlIGFib3V0IHRvIHdyaXRlIGEgdmFsaWQgZmlsZSBVUkwKLQkJCS8vIGNoZWNrIHdpdGggZnVsbFVSTCBhcyBpdCBpcyBub3QgcmVzb2x2ZWQgdG8gcGxhdGZvcm06YmFzZS8KLQkJCWlmIChwbHVnaW5FbnRyeWZ1bGxVUkwgIT0gbnVsbCkgewotCQkJCWlmICgiZmlsZSIuZXF1YWxzKHBsdWdpbkVudHJ5ZnVsbFVSTC5nZXRQcm90b2NvbCgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBmaWxlU3RyaW5nID0gcGx1Z2luRW50cnlmdWxsVVJMLmdldEZpbGUoKTsKLQkJCQkJaWYgKCFuZXcgRmlsZShmaWxlU3RyaW5nKS5leGlzdHMoKSkgewotCQkJCQkJVXBkYXRlQ29yZS53YXJuKCJUaGUgVVJMOiIgKyByZXN1bHQgKyAiIGRvZXNuJ3QgcG9pbnQgdG8gYSB2YWxpZCBwbGF0Zm9ybSBwbHVnaW4uVGhlIFVSTCB3aWxsIG5vdCBiZSB3cml0dGVuIGluIHRoZSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uIiwgbmV3IEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuSW5zdGFsbENvbmZpZ3VyYXRpb25fVW5hYmxlVG9DcmVhdGVVUkwsIChuZXcgU3RyaW5nW10geyByb290U3RyaW5nIH0pKSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFJldHVybiBVUkxzIGZvciBhbnkgZnJhZ21lbnRzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHBsdWdpbiBlbnRyeQotCSAqLwotCXByaXZhdGUgVVJMW10gZ2V0UnVudGltZUZyYWdtZW50VVJMcyhJUGx1Z2luRW50cnkgZW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkvLyBnZXQgdGhlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRyeQotCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9IGVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQotCQkvLyBnZXQgdGhlIHBsdWdpbiBkZXNjcmlwdG9yIGZyb20gdGhlIHJlZ2lzdHJ5Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUodmlkLmdldElkZW50aWZpZXIoKSk7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoYnVuZGxlICE9IG51bGwgJiYgYnVuZGxlLmdldFN0YXRlKCkgIT0gQnVuZGxlLlVOSU5TVEFMTEVEICYmIGJ1bmRsZS5nZXRTdGF0ZSgpICE9IEJ1bmRsZS5JTlNUQUxMRUQpIHsKLQkJCUZyYWdtZW50RW50cnlbXSBmcmFnbWVudHMgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0RnJhZ21lbnRzKGJ1bmRsZSk7Ci0JCQlmb3IgKGludCBpID0gMDsgZnJhZ21lbnRzICE9IG51bGwgJiYgaSA8IGZyYWdtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBsb2NhdGlvbiA9IGZyYWdtZW50c1tpXS5nZXRMb2NhdGlvbigpOwotCQkJCXRyeSB7Ci0JCQkJCVVSTCBsb2NhdGlvblVSTCA9IG5ldyBVUkwobG9jYXRpb24pOwotCQkJCQlsb2NhdGlvblVSTCA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTChGaWxlTG9jYXRvci5yZXNvbHZlKGxvY2F0aW9uVVJMKSk7Ci0JCQkJCWxpc3QuYWRkKGFzSW5zdGFsbFJlbGF0aXZlVVJMKGxvY2F0aW9uVVJMKSk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvLyBza2lwIGJhZCBmcmFnbWVudHMKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChVUkxbXSkgbGlzdC50b0FycmF5KG5ldyBVUkxbMF0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGggaWRlbnRpZmllciBmb3IgYSBwbHVnaW4gZW50cnkuCi0JICogPGNvZGU+cGx1Z2lucy8mbHQ7cGx1Z2luSWQ+XyZsdDtwbHVnaW5WZXJzaW9uPi5qYXI8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgcGF0aCBpZGVudGlmaWVyCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGF0aElEKElQbHVnaW5FbnRyeSBlbnRyeSkgewotCQlyZXR1cm4gU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgZW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkgKyBGZWF0dXJlQ29udGVudFByb3ZpZGVyLkpBUl9FWFRFTlNJT047Ci0JfQotCi0JLyoqCi0JICogVHJ5IHRvIHJlY2FzdCBVUkwgYXMgcGxhdGZvcm06L2Jhc2UvCi0JICovCi0JcHJpdmF0ZSBVUkwgYXNJbnN0YWxsUmVsYXRpdmVVUkwoVVJMIHVybCkgewotCQkvLyBnZXQgbG9jYXRpb24gb2YgaW5zdGFsbAotCQlVUkwgaW5zdGFsbCA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEluc3RhbGxVUkwoKTsKLQotCQkvLyB0cnkgdG8gZGV0ZXJtaW5lIGlmIHN1cHBsaWVkIFVSTCBjYW4gYmUgcmVjYXN0IGFzIGluc3RhbGwtcmVsYXRpdmUKLQkJaWYgKGluc3RhbGwuZ2V0UHJvdG9jb2woKS5lcXVhbHModXJsLmdldFByb3RvY29sKCkpKSB7Ci0JCQlpZiAoaW5zdGFsbC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgaW5zdGFsbFMgPSBuZXcgRmlsZShpbnN0YWxsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCQkJaWYgKCFpbnN0YWxsUy5lbmRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCWluc3RhbGxTICs9ICIvIjsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyB1cmxTID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCQkJaWYgKCF1cmxTLmVuZHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJdXJsUyArPSAiLyI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbnQgaXggPSBpbnN0YWxsUy5sYXN0SW5kZXhPZigiLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGl4ICE9IC0xKSB7Ci0JCQkJCWluc3RhbGxTID0gaW5zdGFsbFMuc3Vic3RyaW5nKDAsIGl4ICsgMSk7Ci0JCQkJCWlmICh1cmxTLnN0YXJ0c1dpdGgoaW5zdGFsbFMpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXJldHVybiBuZXcgVVJMKCJwbGF0Zm9ybTovYmFzZS8iICsgdXJsUy5zdWJzdHJpbmcoaW5zdGFsbFMubGVuZ3RoKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNEdXBsaWNhdGVTaXRlKEZpbGUgc2l0ZURpcmVjdG9yeSkgewotCQlJQ29uZmlndXJlZFNpdGVbXSBzaXRlcyA9IGdldENvbmZpZ3VyZWRTaXRlcygpOwotCQlVUkwgZmlsZVVSTDsKLQkJdHJ5IHsKLQkJCWZpbGVVUkwgPSBzaXRlRGlyZWN0b3J5LnRvVVJMKCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJVVJMIHVybCA9IHNpdGVzW2ldLmdldFNpdGUoKS5nZXRVUkwoKTsKLQkJCWlmIChVcGRhdGVNYW5hZ2VyVXRpbHMuc2FtZVVSTChmaWxlVVJMLCB1cmwpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIHVybCByZWxhdGl2ZSB0byB0aGUgc2l0ZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRGZWF0dXJlUmVsYXRpdmVVUkwoSUZlYXR1cmUgZmVhdHVyZSkgewotCQlTdHJpbmcgdXJsID0gZmVhdHVyZS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpOwotCQlTdHJpbmcgc2l0ZVVSTCA9IGZlYXR1cmUuZ2V0U2l0ZSgpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCS8vIFRPRE8gZml4IHRoaXMuIHRvVVJMKCkgcmV0dXJucyBmaWxlOi9kOi9lY2xpcHNlL2V0Yy4uLiB3aGVhcmVhcyB0aGUgCi0JCS8vIHBsYXRmb3JtLmFzTG9jYWxVUkwoKSByZXR1cm5zIGZpbGU6ZDovZWNsaXBzZS9ldGMuLi4gKG5vIGxlYWRpbmcgLyApCi0vLwkJaWYgKHVybC5zdGFydHNXaXRoKCJmaWxlOi8iKSAmJiBQbGF0Zm9ybS5nZXRPUygpLmVxdWFscygid2luMzIiKSkKLS8vCQkJdXJsID0gImZpbGU6IiArIHVybC5zdWJzdHJpbmcoNik7Ci0JCQotCQlpZiAodXJsLnN0YXJ0c1dpdGgoc2l0ZVVSTCkpCi0JCQlyZXR1cm4gdXJsLnN1YnN0cmluZyhzaXRlVVJMLmxlbmd0aCgpKTsKLQkJZWxzZQotCQkJcmV0dXJuIHVybDsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHJlc3RhcnQgaXMgbmVlZGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVzdGFydE5lZWRlZChJUGxhdGZvcm1Db25maWd1cmF0aW9uIHJ1bnRpbWVDb25maWcpIHsKLQotCQkvLyBGaXJzdCwgY3JlYXRlIGEgbWFwIGZvciBmYXN0ZXIgbG9va3VwcwotCQlTZXQgbmV3UGx1Z2luc1NldCA9IG51bGw7Ci0JCWlmIChydW50aW1lQ29uZmlnIGluc3RhbmNlb2YgUGxhdGZvcm1Db25maWd1cmF0aW9uKSB7Ci0JCQluZXdQbHVnaW5zU2V0ID0gKChQbGF0Zm9ybUNvbmZpZ3VyYXRpb24pcnVudGltZUNvbmZpZykuZ2V0UGx1Z2luUGF0aHMoKTsKLQkJCS8vIE9uIHdpbmRvd3MsIHdlIHdpbGwgYmUgZG9pbmcgY2FzZSBpbnNlbnNpdGl2ZSBzZWFyY2ggYXMgd2VsbCwgc28gbG93ZXIgaXQgbm93Ci0JCQlpZiAoaXNXaW5kb3dzKSB7Ci0JCQkJU3RyaW5nW10gbmV3UGx1Z2luc1NldEFycmF5ID0gKFN0cmluZ1tdKW5ld1BsdWdpbnNTZXQudG9BcnJheSggbmV3IFN0cmluZ1tuZXdQbHVnaW5zU2V0LnNpemUoKV0pOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3UGx1Z2luc1NldEFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCW5ld1BsdWdpbnNTZXQuYWRkKG5ld1BsdWdpbnNTZXRBcnJheVtpXS50b0xvd2VyQ2FzZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlVUkxbXSBuZXdCdW5kbGVQYXRocyA9IHJ1bnRpbWVDb25maWcuZ2V0UGx1Z2luUGF0aCgpOwotCQkJbmV3UGx1Z2luc1NldCA9IG5ldyBIYXNoU2V0KG5ld0J1bmRsZVBhdGhzLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8bmV3QnVuZGxlUGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCQkKLQkJCQlTdHJpbmcgcGx1Z2luTG9jYXRpb24gPSBuZXdCdW5kbGVQYXRoc1tpXS5nZXRGaWxlKCk7Ci0JCQkJbmV3UGx1Z2luc1NldC5hZGQocGx1Z2luTG9jYXRpb24pOwotCQkJCS8vIE9uIHdpbmRvd3MsIHdlIHdpbGwgYmUgZG9pbmcgY2FzZSBpbnNlbnNpdGl2ZSBzZWFyY2ggYXMgd2VsbCwgc28gbG93ZXIgaXQgbm93Ci0JCQkJaWYgKGlzV2luZG93cykKLQkJCQkJbmV3UGx1Z2luc1NldC5hZGQocGx1Z2luTG9jYXRpb24udG9Mb3dlckNhc2UoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCQotCQkKLQkJQnVuZGxlW10gb2xkQnVuZGxlcyA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlQ29udGV4dCgpLmdldEJ1bmRsZXMoKTsKLQotCQlpbnQgb2Zmc2V0ID0gQ29uZmlndXJhdGlvbkFjdGl2YXRvci5VUERBVEVfUFJFRklYLmxlbmd0aCgpOwotCQlmb3IgKGludCBpPTA7IGk8b2xkQnVuZGxlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG9sZEJ1bmRsZXNbaV0uZ2V0QnVuZGxlSWQoKSA9PSAwKQotCQkJCWNvbnRpbnVlOyAvLyBza2lwIHRoZSBzeXN0ZW0gYnVuZGxlCi0JCQlTdHJpbmcgb2xkQnVuZGxlTG9jYXRpb24gPSBvbGRCdW5kbGVzW2ldLmdldExvY2F0aW9uKCk7Ci0JCQkvLyBEb24ndCB3b3JyeSBhYm91dCBidW5kbGVzIHdlIGRpZCBub3QgaW5zdGFsbAotCQkJaWYgKCFvbGRCdW5kbGVMb2NhdGlvbi5zdGFydHNXaXRoKENvbmZpZ3VyYXRpb25BY3RpdmF0b3IuVVBEQVRFX1BSRUZJWCkpCi0JCQkJY29udGludWU7Ci0JCQlvbGRCdW5kbGVMb2NhdGlvbiA9IG9sZEJ1bmRsZUxvY2F0aW9uLnN1YnN0cmluZyhvZmZzZXQpOwotCQkJCi0JCQlpZiAobmV3UGx1Z2luc1NldC5jb250YWlucyhvbGRCdW5kbGVMb2NhdGlvbikpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoaXNXaW5kb3dzICYmIG5ld1BsdWdpbnNTZXQuY29udGFpbnMob2xkQnVuZGxlTG9jYXRpb24udG9Mb3dlckNhc2UoKSkpCi0JCQkJY29udGludWU7Ci0JCQkKLQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19DT05GSUdVUkFUSU9OKQotCQkJCVVwZGF0ZUNvcmUuZGVidWcoIkJ1bmRsZSAiICsgb2xkQnVuZGxlTG9jYXRpb24gKyAiIGhhcyBiZWVuIHJlbW92ZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKHJ1bnRpbWVDb25maWcgaW5zdGFuY2VvZiBQbGF0Zm9ybUNvbmZpZ3VyYXRpb24pIHsKLQkJCXJldHVybiBhcmVUaGVyZU5ld1ZlcnNpb25PZk9sZFBsdWdpbnMoICgoUGxhdGZvcm1Db25maWd1cmF0aW9uKXJ1bnRpbWVDb25maWcpLmdldFBsdWdpbnMoKSwgb2xkQnVuZGxlcyk7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFRoZSBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGFsbCBvbGQgcGx1Zy1pbnMgZXhpc3QgaW4gdGhlIG5ldwotCSAqIGNvbmZpZ3VyYXRpb24uIERldGVybWluZXMgaWYgYSBuZXcgdmVyc2lvbiB3YXMgYWRkZWQgdG8gYW55IHBsdWdpbiBJRCwgc28KLQkgKiBtb3JlIHZlcnNpb25zIGFyZSBlbmFibGVkIGZvciBhbnkgZ2l2ZW4gcGx1Zy1pbiBpZCB0aGVuIGluIG9sZAotCSAqIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIG5ld0NvbmZpZ3VyYXRpb25QbHVnaW5zCi0JICogQHBhcmFtIG9sZENvbmZpZ3VyYXRpb25CdW5kbGVzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBhcmVUaGVyZU5ld1ZlcnNpb25PZk9sZFBsdWdpbnMoUGx1Z2luRW50cnlbXSBuZXdDb25maWd1cmF0aW9uUGx1Z2lucywgQnVuZGxlW10gb2xkQ29uZmlndXJhdGlvbkJ1bmRsZXMpIHsKLQotCQkKLQkJZm9yICggaW50IGkgPSAwOyBpIDwgb2xkQ29uZmlndXJhdGlvbkJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChvbGRDb25maWd1cmF0aW9uQnVuZGxlc1tpXS5nZXRCdW5kbGVJZCgpID09IDApCi0JCQkJY29udGludWU7IC8vIHNraXAgdGhlIHN5c3RlbSBidW5kbGUKLQkJCWlmICggZ2V0TnVtYmVyT2ZQbHVnaW5zKG9sZENvbmZpZ3VyYXRpb25CdW5kbGVzW2ldLmdldFN5bWJvbGljTmFtZSgpLCBvbGRDb25maWd1cmF0aW9uQnVuZGxlcykgIT0gZ2V0TnVtYmVyT2ZQbHVnaW5zKG9sZENvbmZpZ3VyYXRpb25CdW5kbGVzW2ldLmdldFN5bWJvbGljTmFtZSgpLCBuZXdDb25maWd1cmF0aW9uUGx1Z2lucykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7CQkJCQotCX0KLQotCXByaXZhdGUgaW50IGdldE51bWJlck9mUGx1Z2lucyhTdHJpbmcgc3ltYm9saWNOYW1lLCBQbHVnaW5FbnRyeVtdIG5ld0NvbmZpZ3VyYXRpb25QbHVnaW5zKSB7Ci0JCQotCQlpbnQgbnVtYmVyT2ZQbHVnaW5zID0gMDsKLQkJCi0JCWZvciAoIGludCBpID0gMDsgaSA8IG5ld0NvbmZpZ3VyYXRpb25QbHVnaW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIHN5bWJvbGljTmFtZS5lcXVhbHMobmV3Q29uZmlndXJhdGlvblBsdWdpbnNbaV0uZ2V0UGx1Z2luSWRlbnRpZmllcigpKSkgewotCQkJCW51bWJlck9mUGx1Z2lucysrOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVtYmVyT2ZQbHVnaW5zOwotCX0KLQotCXByaXZhdGUgaW50IGdldE51bWJlck9mUGx1Z2lucyhTdHJpbmcgc3ltYm9saWNOYW1lLCBCdW5kbGVbXSBvbGRDb25maWd1cmF0aW9uQnVuZGxlcykgewotCi0JCWludCBudW1iZXJPZlBsdWdpbnMgPSAwOwotCQkKLQkJZm9yICggaW50IGkgPSAwOyBpIDwgb2xkQ29uZmlndXJhdGlvbkJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICggc3ltYm9saWNOYW1lLmVxdWFscyhvbGRDb25maWd1cmF0aW9uQnVuZGxlc1tpXS5nZXRTeW1ib2xpY05hbWUoKSkpIHsKLQkJCQludW1iZXJPZlBsdWdpbnMrKzsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bWJlck9mUGx1Z2luczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJbnN0YWxsQ29uZmlndXJhdGlvbikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSAoSW5zdGFsbENvbmZpZ3VyYXRpb24pb2JqOwotCQotCQlyZXR1cm4gZ2V0Q3JlYXRpb25EYXRlKCkuZXF1YWxzKGNvbmZpZy5nZXRDcmVhdGlvbkRhdGUoKSkgJiYgCi0JCQkJZ2V0TGFiZWwoKS5lcXVhbHMoY29uZmlnLmdldExhYmVsKCkpICYmCi0JCQkJZ2V0TG9jYXRpb25VUkxTdHJpbmcoKS5lcXVhbHMoY29uZmlnLmdldExvY2F0aW9uVVJMU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSW5zdGFsbEhhbmRsZXJQcm94eS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JbnN0YWxsSGFuZGxlclByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNDdmMzQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JbnN0YWxsSGFuZGxlclByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQ29udGVudFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZUNvbnRlbnRDb25zdW1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5zdGFsbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyV2l0aEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JTm9uUGx1Z2luRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVBsdWdpbkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklWZXJpZmljYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JbnN0YWxsTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIEluc3RhbGxIYW5kbGVyUHJveHkgaW1wbGVtZW50cyBJSW5zdGFsbEhhbmRsZXJXaXRoRmlsdGVyIHsKLQotCXByaXZhdGUgSUZlYXR1cmUgZmVhdHVyZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgdHlwZTsKLQlwcml2YXRlIElJbnN0YWxsSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQlwcml2YXRlIElTdGF0dXMgc2F2ZWRTdGF0dXMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVF9QTFVHSU4gPSAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX1BMVUdJTiA9ICJvcmcuZWNsaXBzZS51aSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUX1BPSU5UID0gImluc3RhbGxIYW5kbGVycyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIE1ldGhvZCBub25QbHVnaW5EYXRhQWNjZXB0b3IgPSBudWxsOwotCi0JLyoqCi0JICogQSBjbGFzcyBsb2FkZXIgdGhhdCBjb21iaW5lcyBhIHRoZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZSBwbHVnaW4gY2xhc3MgbG9hZGVyIHdpdGggdGhlCi0JICogb3JnLmVjbGlwc2UudWkgY2xhc3MgbG9hZGVyIChvbmx5IHdoZW4gVUkgaXMgYWN0aXZlKS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJbnN0YWxsSGFuZGxlckNsYXNzTG9hZGVyIGV4dGVuZHMgVVJMQ2xhc3NMb2FkZXIgewotCQlwcml2YXRlIEJ1bmRsZSB1cGRhdGVDb3JlOwotCQlwcml2YXRlIEJ1bmRsZSBlY2xpcHNlVUk7Ci0KLQkJcHVibGljIEluc3RhbGxIYW5kbGVyQ2xhc3NMb2FkZXIoVVJMW10gY2xhc3NwYXRoKSB7Ci0JCQlzdXBlcihjbGFzc3BhdGgpOwotCQkJdXBkYXRlQ29yZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShFWFRfUExVR0lOKTsKLQkJCWVjbGlwc2VVSSA9IFBsYXRmb3JtLmdldEJ1bmRsZShVSV9QTFVHSU4pOwotCQkJaWYgKGVjbGlwc2VVSSAhPSBudWxsICYmIGVjbGlwc2VVSS5nZXRTdGF0ZSgpICE9IEJ1bmRsZS5BQ1RJVkUpIAotCQkJCWVjbGlwc2VVSSA9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgQ2xhc3MgbG9hZENsYXNzKFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJCS8vIEZpcnN0IGNoZWNrIHVwZGF0ZSBjb3JlIHBsdWdpbiBsb2FkZXIsIHRoZW4gdGhlIGVjbGlwc2UgdWkgcGx1Z2luIGxvYWRlcgotCQkJQ2xhc3MgYyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWMgPSB1cGRhdGVDb3JlLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYoZWNsaXBzZVVJICE9IG51bGwpCi0JCQkJCQljID0gZWNsaXBzZVVJLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZTIpIHsKLQkJCQl9IGZpbmFsbHkgewotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQl9Ci0JCQlpZiAoYyAhPSBudWxsKQotCQkJCXJldHVybiBjOwotCQkJZWxzZQotCQkJCXJldHVybiBzdXBlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBVUkwgZ2V0UmVzb3VyY2UoU3RyaW5nIHJlc05hbWUpIHsKLQkJCS8vIEZpcnN0IGNoZWNrIHVwZGF0ZSBjb3JlIHBsdWdpbiBsb2FkZXIsIHRoZW4gdGhlIGVjbGlwc2UgdWkgcGx1Z2luIGxvYWRlcgotCQkJVVJMIHUgPSB1cGRhdGVDb3JlLmdldFJlc291cmNlKHJlc05hbWUpOwotCQkJaWYodSA9PSBudWxsICYmIGVjbGlwc2VVSSAhPSBudWxsKQotCQkJCXUgPSBlY2xpcHNlVUkuZ2V0UmVzb3VyY2UocmVzTmFtZSk7Ci0JCQkJCi0JCQlpZiAodSAhPSBudWxsKQotCQkJCXJldHVybiB1OwotCQkJZWxzZQotCQkJCXJldHVybiBzdXBlci5nZXRSZXNvdXJjZShyZXNOYW1lKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgSW5zdGFsbEhhbmRsZXJQcm94eSgKLQkJaW50IHR5cGUsCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUlJbnN0YWxsSGFuZGxlckVudHJ5IGVudHJ5LAotCQlJbnN0YWxsTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaW5pdGlhbGl6ZSh0eXBlLCBmZWF0dXJlLCBlbnRyeSwgbW9uaXRvcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNpbml0aWFsaXplCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgKLQkJaW50IHR5cGUsCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUlJbnN0YWxsSGFuZGxlckVudHJ5IGVudHJ5LAotCQlJbnN0YWxsTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJREVCVUcgPSBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfSUhBTkRMRVI7Ci0JCS8vIHZhbGlkYXRlIGFyZ3VtZW50cwotCQlpZiAoZmVhdHVyZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCi0JCS8vICBjaGVjayBpZiB3ZSBoYXZlIGEgaGFuZGxlciBlbnRyeSBzcGVjaWZpZWQgaW4gdGhlIGZlYXR1cmUueG1sCi0JCWlmIChlbnRyeSA9PSBudWxsKSB7Ci0JCQlpZiAoREVCVUcpCi0JCQkJZGVidWcoIm5vdCBzcGVjaWZpZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOyAvLyBubyBoYW5kbGVyIGVudHJ5Ci0JCX0KLQotCQlTdHJpbmcgbGlicmFyeSA9IGVudHJ5LmdldExpYnJhcnkoKTsKLQkJU3RyaW5nIGhhbmRsZXJOYW1lID0gZW50cnkuZ2V0SGFuZGxlck5hbWUoKTsKLQkJaWYgKGhhbmRsZXJOYW1lID09IG51bGwgfHwgaGFuZGxlck5hbWUudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKERFQlVHKQotCQkJCWRlYnVnKCJub3Qgc3BlY2lmaWVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsgLy8gbm8gaGFuZGxlciBjbGFzcyBzcGFjaWZpZWQgaW4gZW50cnkKLQkJfQotCQlpZiAoREVCVUcpIHsKLQkJCWRlYnVnKCJoYW5kbGVyPSIgKyBoYW5kbGVyTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRlYnVnKCJwYXRoPSAgICIgKyBsaWJyYXJ5KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gZ2V0IGhhbmRsZXIgaW5zdGFuY2UKLQkJdHJ5IHsKLQkJCWlmIChsaWJyYXJ5ID09IG51bGwgfHwgbGlicmFyeS50cmltKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXRoaXMuaGFuZGxlciA9IGdldEdsb2JhbEhhbmRsZXIoaGFuZGxlck5hbWUpOwotCQkJZWxzZQotCQkJCXRoaXMuaGFuZGxlciA9IGdldExvY2FsSGFuZGxlcihsaWJyYXJ5LCBoYW5kbGVyTmFtZSk7Ci0JCQlpZiAodGhpcy5oYW5kbGVyID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJaGFuZGxlci5pbml0aWFsaXplKHR5cGUsIGZlYXR1cmUsIGVudHJ5LCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb25JbkluaXQoCi0JCQkJTkxTLmJpbmQoTWVzc2FnZXMuSW5zdGFsbEhhbmRsZXJfbm90Rm91bmQsIChuZXcgU3RyaW5nW10geyBmZWF0dXJlLmdldExhYmVsKCkgfSkpLAotCQkJCWUpOwotCi0JCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb25JbkluaXQoCi0JCQkJTkxTLmJpbmQoTWVzc2FnZXMuSW5zdGFsbEhhbmRsZXJfaW52YWxpZEhhbmRsZXIsIChuZXcgU3RyaW5nW10geyBmZWF0dXJlLmdldExhYmVsKCkgfSkpLAotCQkJCWUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbkluSW5pdChudWxsLCBlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbkluSW5pdCgKLQkJCQlOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsSGFuZGxlcl91bmFibGVUb0NyZWF0ZUhhbmRsZXIsIChuZXcgU3RyaW5nW10geyBmZWF0dXJlLmdldExhYmVsKCkgfSkpLAotCQkJCWUpOwotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2luc3RhbGxJbml0aWF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsSW5pdGlhdGVkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaGFuZGxlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlkZWJ1ZygiY2FsbGluZyBpbnN0YWxsSW5pdGlhdGVkKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWhhbmRsZXIuaW5zdGFsbEluaXRpYXRlZCgpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQloYW5kbGVFeGNlcHRpb25JbkNhbGwoZSwgZmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2FsbFBsdWdpbnNEb3dubG9hZGVkCi0JICovCi0JcHVibGljIHZvaWQgcGx1Z2luc0Rvd25sb2FkZWQoSVBsdWdpbkVudHJ5W10gcGx1Z2lucykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaGFuZGxlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlkZWJ1ZygiY2FsbGluZyBwbHVnaW5zRG93bmxvYWRlZCgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQloYW5kbGVyLnBsdWdpbnNEb3dubG9hZGVkKHBsdWdpbnMpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQloYW5kbGVFeGNlcHRpb25JbkNhbGwoZSwgZmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2FsbFBsdWdpbnNJbnN0YWxsZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wbGV0ZUluc3RhbGwoSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgY29uc3VtZXIpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCWlmIChERUJVRykKLQkJCQkJZGVidWcoImNhbGxpbmcgY29tcGxldGVJbnN0YWxsKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWhhbmRsZXIuY29tcGxldGVJbnN0YWxsKGNvbnN1bWVyKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uSW5DYWxsKGUsIGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNhbGxEYXRhRG93bmxvYWRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vblBsdWdpbkRhdGFEb3dubG9hZGVkKAotCQlJTm9uUGx1Z2luRW50cnlbXSBub25QbHVnaW5EYXRhLAotCQlJVmVyaWZpY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCWlmIChERUJVRykKLQkJCQkJZGVidWcoImNhbGxpbmcgbm9uUGx1Z2luRGF0YURvd25sb2FkZWQoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaGFuZGxlci5ub25QbHVnaW5EYXRhRG93bmxvYWRlZChub25QbHVnaW5EYXRhLCBsaXN0ZW5lcik7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCWhhbmRsZUV4Y2VwdGlvbkluQ2FsbChlLCBmZWF0dXJlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjaW5zdGFsbENvbXBsZXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGxDb21wbGV0ZWQoYm9vbGVhbiBzdWNjZXNzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChoYW5kbGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVsc2UgewotCQkJdHJ5IHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCWRlYnVnKCJjYWxsaW5nIGluc3RhbGxDb21wbGV0ZWQoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaGFuZGxlci5pbnN0YWxsQ29tcGxldGVkKHN1Y2Nlc3MpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQloYW5kbGVFeGNlcHRpb25JbkNhbGwoZSwgZmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2NvbmZpZ3VyZUluaXRpYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUluaXRpYXRlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCWlmIChERUJVRykKLQkJCQkJZGVidWcoImNhbGxpbmcgY29uZmlndXJlSW5pdGlhdGVkKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWhhbmRsZXIuY29uZmlndXJlSW5pdGlhdGVkKCk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCWhhbmRsZUV4Y2VwdGlvbkluQ2FsbChlLCBmZWF0dXJlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjY29tcGxldGVDb25maWd1cmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wbGV0ZUNvbmZpZ3VyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCWlmIChERUJVRykKLQkJCQkJZGVidWcoImNhbGxpbmcgY29tcGxldGVDb25maWd1cmUoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaGFuZGxlci5jb21wbGV0ZUNvbmZpZ3VyZSgpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQloYW5kbGVFeGNlcHRpb25JbkNhbGwoZSwgZmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2NvbmZpZ3VyZUNvbXBsZXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbXBsZXRlZChib29sZWFuIHN1Y2Nlc3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCWlmIChERUJVRykKLQkJCQkJZGVidWcoImNhbGxpbmcgY29uZmlndXJlQ29tcGxldGVkKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWhhbmRsZXIuY29uZmlndXJlQ29tcGxldGVkKHN1Y2Nlc3MpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQloYW5kbGVFeGNlcHRpb25JbkNhbGwoZSwgZmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI3VuY29uZmlndXJlSW5pdGlhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5jb25maWd1cmVJbml0aWF0ZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChoYW5kbGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVsc2UgewotCQkJdHJ5IHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCWRlYnVnKCJjYWxsaW5nIHVuY29uZmlndXJlSW5pdGlhdGVkKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWhhbmRsZXIudW5jb25maWd1cmVJbml0aWF0ZWQoKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uSW5DYWxsKGUsIGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNjb21wbGV0ZVVuY29uZmlndXJlCi0JICovCi0JcHVibGljIHZvaWQgY29tcGxldGVVbmNvbmZpZ3VyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCWlmIChERUJVRykKLQkJCQkJZGVidWcoImNhbGxpbmcgY29tcGxldGVVbmNvbmZpZ3VyZSgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQloYW5kbGVyLmNvbXBsZXRlVW5jb25maWd1cmUoKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uSW5DYWxsKGUsIGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciN1bmNvbmZpZ3VyZUNvbXBsZXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuY29uZmlndXJlQ29tcGxldGVkKGJvb2xlYW4gc3VjY2VzcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaGFuZGxlciA9PSBudWxsKSB7Ci0JCQlpZiAoc2F2ZWRTdGF0dXMgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQllbHNlCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc2F2ZWRTdGF0dXMpOyAvLyBkZWxheWVkIGV4Y2VwdGlvbgotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCWRlYnVnKCJjYWxsaW5nIHVuY29uZmlndXJlQ29tcGxldGVkKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWhhbmRsZXIudW5jb25maWd1cmVDb21wbGV0ZWQoc3VjY2Vzcyk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCWhhbmRsZUV4Y2VwdGlvbkluQ2FsbChlLCBmZWF0dXJlKTsKLQkJCX0KLQkJCWlmIChzYXZlZFN0YXR1cyAhPSBudWxsKQotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHNhdmVkU3RhdHVzKTsgLy8gZGVsYXllZCBleGNlcHRpb24KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjdW5pbnN0YWxsSW5pdGlhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsSW5pdGlhdGVkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaGFuZGxlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlkZWJ1ZygiY2FsbGluZyB1bmluc3RhbGxJbml0aWF0ZWQoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaGFuZGxlci51bmluc3RhbGxJbml0aWF0ZWQoKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uSW5DYWxsKGUsIGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNjb21wbGV0ZVVuaW5zdGFsbAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbXBsZXRlVW5pbnN0YWxsKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaGFuZGxlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlkZWJ1ZygiY2FsbGluZyBjb21wbGV0ZVVuaW5zdGFsbCgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQloYW5kbGVyLmNvbXBsZXRlVW5pbnN0YWxsKCk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCWhhbmRsZUV4Y2VwdGlvbkluQ2FsbChlLCBmZWF0dXJlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjdW5pbnN0YWxsQ29tcGxldGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsQ29tcGxldGVkKGJvb2xlYW4gc3VjY2VzcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaGFuZGxlciA9PSBudWxsKSB7Ci0JCQlpZiAoc2F2ZWRTdGF0dXMgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQllbHNlCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc2F2ZWRTdGF0dXMpOyAvLyBkZWxheWVkIGV4Y2VwdGlvbgotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCWRlYnVnKCJjYWxsaW5nIHVuaW5zdGFsbENvbXBsZXRlZCgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQloYW5kbGVyLnVuaW5zdGFsbENvbXBsZXRlZChzdWNjZXNzKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uSW5DYWxsKGUsIGZlYXR1cmUpOwotCQkJfQotCQkJaWYgKHNhdmVkU3RhdHVzICE9IG51bGwpCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc2F2ZWRTdGF0dXMpOyAvLyBkZWxheWVkIGV4Y2VwdGlvbgotCQl9Ci0JfQotCi0JLyoKLQkgKiBjb21tb24gZXhjZXB0aW9uIGhhbmRsaW5nIGZvciBpbml0aWFsaXphdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVFeGNlcHRpb25JbkluaXQoU3RyaW5nIHMsIEV4Y2VwdGlvbiBlKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJQ29yZUV4Y2VwdGlvbiBjZTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKQotCQkJY2UgPSAoQ29yZUV4Y2VwdGlvbikgZTsKLQkJZWxzZQotCQkJY2UgPSBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihzLCBlKTsKLQotCQlpZiAoaXNVbmRvQWN0aW9uKCkpIHsKLQkJCS8vIGZvciAidW5kbyIgb3BlcmF0aW9ucywgZGVhY3RpdmF0ZSBoYW5kbGVyIGFuZCBsb2cgZXJyb3IKLQkJCVN0cmluZyBpZCA9Ci0JCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0KLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGlkLCAwLCAiSW5zdGFsbEhhbmRsZXIuZGVhY3RpdmF0ZWQiLCBjZSk7CS8vJE5PTi1OTFMtMSQKLQkJCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JCQloYW5kbGVyID0gbnVsbDsgLy8gZGlzYWJsZSBzdWJzZXF1ZW50IGhhbmRsZXIgY2FsbHMKLQkJCXNhdmVkU3RhdHVzID0gc3RhdHVzOwotCQl9IGVsc2UKLQkJCS8vIGZvciAiZG8iIG9wZXJhdGlvbnMsIGh1cmwgLi4uCi0JCQl0aHJvdyBjZTsKLQl9Ci0KLQkvKgotCSAqIGNvbW1vbiBleGNlcHRpb24gaGFuZGxpbmcgZm9yIGNhbGxzIHRvIGluc3RhbGwgaGFuZGxlcgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVFeGNlcHRpb25JbkNhbGwoVGhyb3dhYmxlIGUsIElGZWF0dXJlIGZlYXR1cmUpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlDb3JlRXhjZXB0aW9uIGNlOwotCQlpZiAoZSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pCi0JCQljZSA9IChDb3JlRXhjZXB0aW9uKSBlOwotCQllbHNlCi0JCQljZSA9Ci0JCQkJVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLkluc3RhbGxIYW5kbGVyX2NhbGxFeGNlcHRpb24sIChuZXcgU3RyaW5nW10geyBmZWF0dXJlLmdldExhYmVsKCkgfSkpLAotCQkJCQllKTsKLQkJCi0JCWlmIChpc1VuZG9BY3Rpb24oKSkgewotCQkJLy8gZm9yICJ1bmRvIiBvcGVyYXRpb25zLCBkZWFjdGl2YXRlIGhhbmRsZXIgYW5kIGxvZyBlcnJvcgotCQkJU3RyaW5nIGlkID0KLQkJCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCQkJSVN0YXR1cyBzdGF0dXMgPQotCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgaWQsIDAsICJJbnN0YWxsSGFuZGxlci5kZWFjdGl2YXRlZCIsIGNlKTsJLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQkJCWhhbmRsZXIgPSBudWxsOyAvLyBkaXNhYmxlIHN1YnNlcXVlbnQgaGFuZGxlciBjYWxscwotCQkJc2F2ZWRTdGF0dXMgPSBzdGF0dXM7Ci0JCX0gZWxzZQotCQkJLy8gZm9yICJkbyIgb3BlcmF0aW9ucywgaHVybCAuLi4KLQkJCXRocm93IGNlOwotCX0KLQotCS8qCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgd2UgYXJlIGRvaW5nIChpbnN0YWxsLCBjb25maWd1cmUpIG9yIAotCSAqIHVuZG9pbmcgKHVuaW5zdGFsbCwgdW5jb25maWd1cmUpCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVW5kb0FjdGlvbigpIHsKLQkJaWYgKHRoaXMudHlwZSA9PSBJSW5zdGFsbEhhbmRsZXIuSEFORExFUl9BQ1RJT05fSU5TVEFMTAotCQkJfHwgdGhpcy50eXBlID09IElJbnN0YWxsSGFuZGxlci5IQU5ETEVSX0FDVElPTl9DT05GSUdVUkUpCi0JCQlyZXR1cm4gZmFsc2U7IC8vIGNhdXNlcyBleGNlcHRpb24gdG8gYmUgdGhyb3duIGFuZCBhY3Rpb24gYWJvcnRlZAotCQllbHNlCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gY2F1c2VzIGV4Y2VwdGlvbiB0byBiZSBsb2dnZWQgYW5kIGFjdGlvbiBjb250aW51ZXMKLQl9Ci0KLQkvKgotCSAqIGdldCBhbiBpbnN0YW5jZSBvZiBoYW5kbGVyIGRvd25sb2FkZWQgYXMgcGFydCBvZiB0aGUgZmVhdHVyZQotCSAqLwotCXByaXZhdGUgSUluc3RhbGxIYW5kbGVyIGdldExvY2FsSGFuZGxlcihTdHJpbmcgbGlicywgU3RyaW5nIG5hbWUpCi0JCXRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0KLQkJLy8gR2V0IGJhc2VsaW5lIFVSTCBmb3IgaGFuZGxlciAocmVsYXRpdmUgdG8gZmVhdHVyZS54bWwpLiBGb3IKLQkJLy8gZmVhdHVyZXMgYmVpbmcgaW5zdGFsbGVkIGZyb20gYSBzZXJ2ZXIgKGVnLiBodHRwIHByb3RvY29sKQotCQkvLyB0aGUgVVJMIHdpbGwgbW9zdCBsaWtlbHkgYmUgdG8gYSBsb2NhbCBmaWxlIGNvcHkgY29udGFpbmluZyB0aGUKLQkJLy8gdW5wYWNrZWQgZmVhdHVyZSBqYXIuCi0JCUNvbnRlbnRSZWZlcmVuY2UgYmFzZVJlZiA9Ci0JCQlmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKS5nZXRGZWF0dXJlTWFuaWZlc3RSZWZlcmVuY2UobnVsbCk7Ci0JCVVSTCBiYXNlID0gbnVsbDsKLQkJaWYgKGJhc2VSZWYgIT0gbnVsbCkKLQkJCWJhc2UgPSBiYXNlUmVmLmFzVVJMKCk7Ci0JCWlmIChiYXNlID09IG51bGwpCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQlOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsSGFuZGxlcl91bmFibGVUb0NyZWF0ZUhhbmRsZXIsIChuZXcgU3RyaW5nW10geyB0aGlzLmZlYXR1cmUuZ2V0TGFiZWwoKSB9KSksCi0JCQkJbnVsbCk7Ci0KLQotCQkvLyBkZXRlcm1pbmUgbG9hZGVyIGNsYXNzIHBhdGgKLQkJU3RyaW5nVG9rZW5pemVyIGxpYnJhcmllcyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobGlicywgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQlVUkxbXSBjcCA9IG5ldyBVUkxbbGlicmFyaWVzLmNvdW50VG9rZW5zKCldOwotCQlmb3IoIGludCB0b2tlbiA9IDA7IHRva2VuIDwgY3AubGVuZ3RoOyB0b2tlbisrKSB7Ci0JCQljcFt0b2tlbl0gPSBuZXcgVVJMKGJhc2UsIGxpYnJhcmllcy5uZXh0VG9rZW4oKSk7Ci0JCX0KLQkJaWYgKHRoaXMudHlwZSA9PSBJSW5zdGFsbEhhbmRsZXIuSEFORExFUl9BQ1RJT05fVU5JTlNUQUxMKSB7Ci0JCQkvLyBjaGVjayBpZiB3ZSBhcmUgZG9pbmcgdW5pbnN0YWxsCi0JCQkvLyAuLi4gbmVlZCB0byBtYWtlIHRlbXAgY29weSBvZiBsaWJyYXJ5IChiZWluZyByZW1vdmVkKQotCQkJVVJMW10gamFycyA9IG5ldyBVUkxbY3AubGVuZ3RoXTsKLQkJCWZvciggaW50IGphciA9IDA7IGphciA8IGNwLmxlbmd0aDsgamFyKyspIHsKLQkJCQlGaWxlIHRlbXBMaWIgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0bXAiICsgamFyLCAiLmphciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl0ZW1wTGliLmRlbGV0ZU9uRXhpdCgpOwotCQkJCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKLQkJCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGVtcExpYik7Ci0JCQkJCWlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShjcFtqYXJdLmdldFBhdGgoKSk7Ci0JCQkJCVV0aWxpdGllcy5jb3B5KGlzLCBmb3MsIG51bGwpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChmb3MgIT0gbnVsbCkKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZm9zLmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCQlpZiAoaXMgIT0gbnVsbCkKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaXMuY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJfQotCQkJCWphcnNbamFyXSA9IHRlbXBMaWIudG9VUkwoKTsKLQkJCX0KLQkJCWNwID0gamFyczsKLQkJfQotCi0JCS8vIGNyZWF0ZSBjbGFzcyBsb2FkZXIsIGxvYWQgYW5kIGluc3RhbnRpYXRlIGhhbmRsZXIKLQkJQ2xhc3NMb2FkZXIgbG9hZGVyID0gbmV3IEluc3RhbGxIYW5kbGVyQ2xhc3NMb2FkZXIoY3ApOwotCQlDbGFzcyBjbGF6eiA9IGxvYWRlci5sb2FkQ2xhc3MobmFtZSk7Ci0JCUlJbnN0YWxsSGFuZGxlciBoYW5kbGVyID0gKElJbnN0YWxsSGFuZGxlcikgY2xhenoubmV3SW5zdGFuY2UoKTsKLQkJcmV0dXJuIGhhbmRsZXI7Ci0JfQotCi0JLyoKLQkgKiBnZXQgaW5zdGFuY2Ugb2YgZ2xvYmFsIGhhbmRsZXIgcmVnaXN0ZXJlZCB2aWEgZXh0ZW5zaW9uIHBvaW50Ci0JICovCi0JcHJpdmF0ZSBJSW5zdGFsbEhhbmRsZXIgZ2V0R2xvYmFsSGFuZGxlcihTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGhhbmRsZXJFeHRlbnNpb24gPQotCQkJcmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihFWFRfUExVR0lOLCBFWFRfUE9JTlQsIG5hbWUpOwotCQlpZiAoaGFuZGxlckV4dGVuc2lvbiA9PSBudWxsIHx8IGhhbmRsZXJFeHRlbnNpb24ubGVuZ3RoIDw9IDApCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQlOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsSGFuZGxlcl91bmFibGVUb0NyZWF0ZUhhbmRsZXIsIChuZXcgU3RyaW5nW10geyB0aGlzLmZlYXR1cmUuZ2V0TGFiZWwoKSB9KSksCi0JCQkJbnVsbCk7Ci0KLQkJcmV0dXJuIChJSW5zdGFsbEhhbmRsZXIpIGhhbmRsZXJFeHRlbnNpb25bMF0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGVidWcoU3RyaW5nIHMpIHsKLQkJU3RyaW5nIHBmeCA9IChmZWF0dXJlPT1udWxsKSA/ICIiIDogZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkluc3RhbGxIYW5kbGVyWyIrcGZ4KyJdOiAiICsgcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdE5vblBsdWdpbkRhdGEoSU5vblBsdWdpbkVudHJ5IGRhdGEpIHsKLQkJQm9vbGVhbiByZXN1bHQgPSBuZXcgQm9vbGVhbih0cnVlKTsKLQkJaWYgKGhhbmRsZXIgIT0gbnVsbCl7Ci0JCQlpZiAoREVCVUcpCi0JCQkJZGVidWcoImNhbGxpbmcgYWNjZXB0Tm9uUGx1Z2luRGF0YSgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKGhhbmRsZXIgaW5zdGFuY2VvZiBJSW5zdGFsbEhhbmRsZXJXaXRoRmlsdGVyKQotCQkJCXJldHVybiAoKElJbnN0YWxsSGFuZGxlcldpdGhGaWx0ZXIpaGFuZGxlcikuYWNjZXB0Tm9uUGx1Z2luRGF0YShkYXRhKTsKLQkJCWVsc2V7IC8vc3VwcG9ydCB1cGdyYWRlIGZyb20gbGVnYWN5IHZlcnNpb25zCi0JCQkJaWYoZ2V0Tm9uUGx1Z2luRGF0YUFjY2VwdG9yKCkgIT0gbnVsbCl7Ci0JCQkJCXRyeXsKLQkJCQkJCU9iamVjdFtdIHBhcmFtID0ge2RhdGF9OwotCQkJCQkJcmVzdWx0ID0gKEJvb2xlYW4pZ2V0Tm9uUGx1Z2luRGF0YUFjY2VwdG9yKCkuaW52b2tlKGhhbmRsZXIscGFyYW0pOwotCQkJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewotCQkJCQkJLy90b2RvCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdC5ib29sZWFuVmFsdWUoKTsKLQl9Ci0JcHJpdmF0ZSBNZXRob2QgZ2V0Tm9uUGx1Z2luRGF0YUFjY2VwdG9yKCl7Ci0JCWlmKG5vblBsdWdpbkRhdGFBY2NlcHRvciA9PSBudWxsKXsKLQkJCXRyeXsKLQkJCQlDbGFzc1tdIHR5cGVzID0ge0lOb25QbHVnaW5FbnRyeS5jbGFzc307Ci0JCQkJbm9uUGx1Z2luRGF0YUFjY2VwdG9yID0gaGFuZGxlci5nZXRDbGFzcygpLmdldE1ldGhvZCgiYWNjZXB0Tm9uUGx1Z2luRGF0YSIsdHlwZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Y2F0Y2goTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpewotCQkJfQotCQl9Ci0JCXJldHVybiBub25QbHVnaW5EYXRhQWNjZXB0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JbnN0YWxsTG9nUGFyc2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0luc3RhbGxMb2dQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1ZDM4Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0luc3RhbGxMb2dQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLio7Ci0KLQotLyoqCi0gKiBQYXJzZXMgdGhlIGluc3RhbGxhdGlvbiBsb2cgYW5kIGNyZWF0ZXMgaW5zdGFsbGF0aW9uIGNvbmZpZ3VyYXRpb24gb2JqZWN0cwotICovCi1wdWJsaWMgY2xhc3MgSW5zdGFsbExvZ1BhcnNlciB7Ci0JcHJpdmF0ZSBJUGF0aCBsb2dQYXRoOwotCXByaXZhdGUgQnVmZmVyZWRSZWFkZXIgYnVmZlJlYWQ7Ci0JcHJpdmF0ZSBJbnN0YWxsQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlndXJhdGlvbjsKLQlwcml2YXRlIEhhc2hNYXAgaW5zdGFsbENvbmZpZ01hcDsKLQlwcml2YXRlIENvbXBhcmF0b3IgY29tcGFyYXRvcjsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9JTlNUQUxMID0gImZlYXR1cmUtaW5zdGFsbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9SRU1PVkUgPSAiZmVhdHVyZS1yZW1vdmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJVEVfSU5TVEFMTCA9ICJzaXRlLWluc3RhbGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJVEVfUkVNT1ZFID0gInNpdGUtcmVtb3ZlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTkNPTkZJR1VSRSA9ICJmZWF0dXJlLWRpc2FibGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSRSA9ICJmZWF0dXJlLWVuYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVWRVJUID0gInJldmVydCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDT05DSUxJQVRJT04gPSAicmVjb25jaWxpYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVNFUlZFRCA9ICJwcmVzZXJ2ZS1jb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAkKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZJVFkgPSAiIUFDVElWSVRZIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQ0NFU1MgPSAic3VjY2VzcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMVVJFID0gImZhaWx1cmUiOyAvLyROT04tTkxTLTEkCi0KLQkKLQlwdWJsaWMgSW5zdGFsbExvZ1BhcnNlcigpewotCQlTdHJpbmcgbG9jID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpLmdldEZpbGUoKTsKLQkJbG9nUGF0aCA9IG5ldyBQYXRoKGxvYykucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmFwcGVuZCgiaW5zdGFsbC5sb2ciKTsgIC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbENvbmZpZ01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXRyeSB7Ci0JCQlJbnN0YWxsQ29uZmlndXJhdGlvbltdIGNvbmZpZ3MgPSAoSW5zdGFsbENvbmZpZ3VyYXRpb25bXSlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpOwotCQkJZm9yIChpbnQgaT0wO2k8Y29uZmlncy5sZW5ndGg7IGkrKyl7Ci0JCQkJaWYgKCFjb25maWdzW2ldLmlzQ3VycmVudCgpKQotCQkJCQlpbnN0YWxsQ29uZmlnTWFwLnB1dChuZXcgTG9uZyhjb25maWdzW2ldLmdldENyZWF0aW9uRGF0ZSgpLmdldFRpbWUoKSksIGNvbmZpZ3NbaV0pOwotCQkJfQotCQkJLy8gTmVlZCB0byBtYWtlIGEgY29weSBvZiB0aGUgY3VycmVudCBjb25maWcgaW5zdGVhZAotCQkJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0Q29uZmlnQ29weSgoSW5zdGFsbENvbmZpZ3VyYXRpb24pU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSk7Ci0JCQlpbnN0YWxsQ29uZmlnTWFwLnB1dChuZXcgTG9uZyhjb25maWcuZ2V0Q3JlYXRpb25EYXRlKCkuZ2V0VGltZSgpKSwgY29uZmlnKTsKLQkJCQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZUNvcmUubG9nKGUpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7Ci0JCQlVcGRhdGVDb3JlLmxvZyhlKTsKLQkJfQotCQljb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKXsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQkJCURhdGUgZGF0ZTEgPSAoKEluc3RhbGxDb25maWd1cmF0aW9uKWUxKS5nZXRDcmVhdGlvbkRhdGUoKTsKLQkJCQlEYXRlIGRhdGUyID0gKChJbnN0YWxsQ29uZmlndXJhdGlvbillMikuZ2V0Q3JlYXRpb25EYXRlKCk7Ci0JCQkJcmV0dXJuIGRhdGUxLmJlZm9yZShkYXRlMikgPyAxIDogLTE7Ci0JCQl9Ci0JCX07Ci0JfQotCXByaXZhdGUgSW5zdGFsbENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlnQ29weShJbnN0YWxsQ29uZmlndXJhdGlvbiBvcmlnQ29uZmlnKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uewotCQlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgSW5zdGFsbENvbmZpZ3VyYXRpb24ob3JpZ0NvbmZpZywgb3JpZ0NvbmZpZy5nZXRVUkwoKSwgb3JpZ0NvbmZpZy5nZXRMYWJlbCgpICk7Ci0JCWNvbmZpZy5zZXRDcmVhdGlvbkRhdGUob3JpZ0NvbmZpZy5nZXRDcmVhdGlvbkRhdGUoKSk7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCXB1YmxpYyB2b2lkIHBhcnNlSW5zdGFsbGF0aW9uTG9nKCl7Ci0JCXRyeSB7Ci0JCQlvcGVuTG9nKCk7Ci0JCQlwYXJzZUxvZygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVV0aWxzLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWNsb3NlTG9nKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG9wZW5Mb2coKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCSAgICAvLyB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotCQkgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGxvZ1BhdGgudG9PU1N0cmluZygpKTsKLQkJICAgIC8vIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0JCSAgICBJbnB1dFN0cmVhbVJlYWRlciBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMsIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJICAgIGJ1ZmZSZWFkID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlzcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvd0NvcmVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHRocm93Q29yZUV4Y2VwdGlvbihUaHJvd2FibGUgZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCW5ldyBTdGF0dXMoCi0JCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQlVcGRhdGVVdGlscy5nZXRQbHVnaW5JZCgpLAotCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJTWVzc2FnZXMuSW5zdGFsbExvZ1BhcnNlcl9lcnJvcnMsIAotCQkJCWUpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBhcnNlTG9nKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyAJCS5pbnN0YWxsLWxvZyB0ZW1wbGF0ZQotCQkvLwkJIUNPTkZJR1VSQVRJT04gPGNvbmZpZ3VyYXRpb24tZGF0ZT4KLQkJLy8JCSFBQ1RJVklUWSA8ZGF0ZT4gPHRhcmdldD4gPGFjdGlvbj4gPHN0YXR1cz4KLQotCQl0cnkgewotCQkJU3RyaW5nIHR5cGUsIHN0YXR1cywgYWN0aW9uOwotCQkJU3RyaW5nVG9rZW5pemVyIGh0bWxDb2RlOwotCi0JCQl3aGlsZSAoYnVmZlJlYWQucmVhZHkoKSkgewotCi0JCQkJaHRtbENvZGUgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGJ1ZmZSZWFkLnJlYWRMaW5lKCkpOwotCQkJCXdoaWxlICghKGh0bWxDb2RlLmhhc01vcmVFbGVtZW50cygpKSkgewotCQkJCQlpZiAoIWJ1ZmZSZWFkLnJlYWR5KCkpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCWh0bWxDb2RlID0gbmV3IFN0cmluZ1Rva2VuaXplcihidWZmUmVhZC5yZWFkTGluZSgpKTsKLQkJCQl9Ci0KLQkJCQl0eXBlID0gaHRtbENvZGUubmV4dFRva2VuKCkudHJpbSgpOwotCi0JCQkJaWYgKHR5cGUuZXF1YWxzKEFDVElWSVRZKSkgewotCQkJCQlTdHJpbmcgdGltZSA9IGh0bWxDb2RlLm5leHRUb2tlbigpOwotCQkJCQlTdHJpbmcgZGF0ZTsKLQkJCQkJU3RyaW5nQnVmZmVyIHRhcmdldCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJZGF0ZSA9IGh0bWxDb2RlLm5leHRUb2tlbigiLiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlodG1sQ29kZS5uZXh0VG9rZW4oIiAiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJd2hpbGUgKGh0bWxDb2RlLmNvdW50VG9rZW5zKCkgPiAyKXsKLQkJCQkJCXRhcmdldC5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdGFyZ2V0LmFwcGVuZChodG1sQ29kZS5uZXh0VG9rZW4oKSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWFjdGlvbiA9IGh0bWxDb2RlLm5leHRUb2tlbigpOwotCQkJCQlzdGF0dXMgPSBodG1sQ29kZS5uZXh0VG9rZW4oKTsKLQkJCQkJY3JlYXRlQWN0aXZpdHkoYWN0aW9uLCB0aW1lLCBkYXRlLCBzdGF0dXMsIHRhcmdldC50b1N0cmluZygpLCBjdXJyZW50Q29uZmlndXJhdGlvbik7Ci0JCQkJfSAgZWxzZSB7Ci0JCQkJCVN0cmluZyB0aW1lID0gaHRtbENvZGUubmV4dFRva2VuKCk7Ci0JCQkJCVN0cmluZ0J1ZmZlciBkYXRlOwotCQkJCQlkYXRlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQl3aGlsZSAoaHRtbENvZGUuY291bnRUb2tlbnMoKSA+IDApewotCQkJCQkJaWYgKGRhdGUubGVuZ3RoKCkgIT0gMCkKLQkJCQkJCQlkYXRlLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlkYXRlLmFwcGVuZChodG1sQ29kZS5uZXh0VG9rZW4oKSk7Ci0JCQkJCX0KLQkJCQkJY3VycmVudENvbmZpZ3VyYXRpb24gPSAoSW5zdGFsbENvbmZpZ3VyYXRpb24paW5zdGFsbENvbmZpZ01hcC5nZXQobmV3IExvbmcodGltZSkpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93Q29yZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY2xvc2VMb2coKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoYnVmZlJlYWQgIT0gbnVsbCkKLQkJCQlidWZmUmVhZC5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0gZmluYWxseSB7Ci0JCQlidWZmUmVhZCA9IG51bGw7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBJQWN0aXZpdHkgY3JlYXRlQWN0aXZpdHkoU3RyaW5nIGFjdGlvbiwgU3RyaW5nIHRpbWUsIFN0cmluZyBkYXRlLCBTdHJpbmcgc3RhdHVzLCBTdHJpbmcgdGFyZ2V0LCBJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpewotCQlDb25maWd1cmF0aW9uQWN0aXZpdHkgYSA9IG5ldyBDb25maWd1cmF0aW9uQWN0aXZpdHkoKTsKLQotCQlpbnQgY29kZSA9IDA7Ci0JCWlmIChGRUFUVVJFX0lOU1RBTEwuZXF1YWxzKGFjdGlvbikpCi0JCQljb2RlID0gSUFjdGl2aXR5LkFDVElPTl9GRUFUVVJFX0lOU1RBTEw7Ci0JCWVsc2UgaWYgKEZFQVRVUkVfUkVNT1ZFLmVxdWFscyhhY3Rpb24pKQotCQkJY29kZSA9IElBY3Rpdml0eS5BQ1RJT05fRkVBVFVSRV9SRU1PVkU7Ci0JCWVsc2UgaWYgKFNJVEVfSU5TVEFMTC5lcXVhbHMoYWN0aW9uKSkKLQkJCWNvZGUgPSBJQWN0aXZpdHkuQUNUSU9OX1NJVEVfSU5TVEFMTDsKLQkJZWxzZSBpZiAoU0lURV9SRU1PVkUuZXF1YWxzKGFjdGlvbikpCi0JCQljb2RlID0gSUFjdGl2aXR5LkFDVElPTl9TSVRFX1JFTU9WRTsKLQkJZWxzZSBpZiAoVU5DT05GSUdVUkUuZXF1YWxzKGFjdGlvbikpCi0JCQljb2RlID0gSUFjdGl2aXR5LkFDVElPTl9VTkNPTkZJR1VSRTsKLQkJZWxzZSBpZiAoQ09ORklHVVJFLmVxdWFscyhhY3Rpb24pKQotCQkJY29kZSA9IElBY3Rpdml0eS5BQ1RJT05fQ09ORklHVVJFOwotCQllbHNlIGlmIChSRVZFUlQuZXF1YWxzKGFjdGlvbikpCi0JCQljb2RlID0gSUFjdGl2aXR5LkFDVElPTl9SRVZFUlQ7Ci0JCWVsc2UgaWYgKFJFQ09OQ0lMSUFUSU9OLmVxdWFscyhhY3Rpb24pKQotCQkJY29kZSA9IElBY3Rpdml0eS5BQ1RJT05fUkVDT05DSUxJQVRJT047Ci0JCWVsc2UgaWYgKFBSRVNFUlZFRC5lcXVhbHMoYWN0aW9uKSkKLQkJCWNvZGUgPSBJQWN0aXZpdHkuQUNUSU9OX0FERF9QUkVTRVJWRUQ7Ci0JCQotCQlhLnNldEFjdGlvbihjb2RlKTsKLQkJdHJ5IHsKLQkJCWxvbmcgYWN0aXZpdHlUaW1lID0gTG9uZy5wYXJzZUxvbmcodGltZSk7Ci0JCQlhLnNldERhdGUobmV3IERhdGUoYWN0aXZpdHlUaW1lKSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1BBTCBmb3VuZGF0aW9uCi0JCQkvL2Euc2V0RGF0ZShuZXcgRGF0ZShkYXRlKSk7Ci0JCQl0cnkgewotCQkJCWEuc2V0RGF0ZShuZXcgU2ltcGxlRGF0ZUZvcm1hdCgpLnBhcnNlKGRhdGUpKTsKLQkJCX0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUxKSB7Ci0JCQkJLy9pZ25vcmUKLQkJCX0KLQkJfQotCQlhLnNldFN0YXR1cyhTVUNDRVNTLmVxdWFscyhzdGF0dXMpID8gSUFjdGl2aXR5LlNUQVRVU19PSyA6IElBY3Rpdml0eS5TVEFUVVNfTk9LKTsKLQkJYS5zZXRMYWJlbCh0YXJnZXQpOwotCQlhLnNldEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwoY29uZmlnKTsKLQkJCi0JCWlmIChjb25maWcgIT0gbnVsbCAmJiAhY29uZmlnQ29udGFpbnNBY3Rpdml0eShjb25maWcsIGEpKXsKLQkJCWNvbmZpZy5hZGRBY3Rpdml0eShhKTsKLQkJfQotCQkKLQkJcmV0dXJuIGE7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjb25maWdDb250YWluc0FjdGl2aXR5KEluc3RhbGxDb25maWd1cmF0aW9uIGMsIElBY3Rpdml0eSBhKXsKLQkJSUFjdGl2aXR5W10gYWN0aXZpdGllcyA9IGMuZ2V0QWN0aXZpdGllcygpOwotCQlmb3IgKGludCBpID0gMCA7IGk8YWN0aXZpdGllcy5sZW5ndGg7IGkrKyl7Ci0JCQlpZiAoYS5lcXVhbHMoYWN0aXZpdGllc1tpXSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJbnN0YWxsQ29uZmlndXJhdGlvbltdIGdldENvbmZpZ3VyYXRpb25zKCl7Ci0JCUNvbGxlY3Rpb24gY29uZmlnU2V0ID0gaW5zdGFsbENvbmZpZ01hcC52YWx1ZXMoKTsKLQkJSW5zdGFsbENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gKEluc3RhbGxDb25maWd1cmF0aW9uW10pIGNvbmZpZ1NldC50b0FycmF5KG5ldyBJbnN0YWxsQ29uZmlndXJhdGlvbltjb25maWdTZXQuc2l6ZSgpXSk7Ci0JCUFycmF5cy5zb3J0KGNvbmZpZ3MsIGNvbXBhcmF0b3IpOwotCQlyZXR1cm4gY29uZmlnczsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0luc3RhbGxSZWdpc3RyeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JbnN0YWxsUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRlNzNlOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0luc3RhbGxSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi0vKioKLSAqIEtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgZmVhdHVyZXMgYW5kIHBsdWdpbnMgaW5zdGFsbGVkIGJ5IFVwZGF0ZSBtZ3IKLSAqIHNvIHRoZXkgY2FuIGJlIHVuaW5zdGFsbGVkIGxhdGVyLgotICogVGhlIGluZm8gaXMgcGVyc2lzdGVkIGluIHRoZSAuY29uZmlnL3JlZ2lzdHJ5IGZpbGUgYW5kIGVhY2ggZW50cnkgaGFzIGEga2V5PWtleSB3aGVyZQotICogZm9yIGZlYXR1cmUgdGhpcyBrZXkgaXMgZmVhdHVyZV88aWQ+Xzx2ZXJzaW9uPiBhbmQgZm9yIHBsdWdpbnMKLSAqIGtleSBpcyBwbHVnaW5fPGlkPl88dmVyc2lvbj4uIE5vcm1hbGx5LCBnZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkgd2lsbAotICogcmV0dXJuIDxpZD5fPHZlcnNpb24+LiBFZzogZmVhdHVyZV9vcmcuZWNsaXBzZS5wbGF0Zm9ybV8zLjAuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnN0YWxsUmVnaXN0cnkgZXh0ZW5kcyBQcm9wZXJ0aWVzIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICAgIHByaXZhdGUgRmlsZSBmaWxlID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVHSVNUUlkgPSAicmVnaXN0cnkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgSW5zdGFsbFJlZ2lzdHJ5IGluc3RhbmNlOwotCQotCS8vIHBsdWdpbnMgaW5zdGFsbGVkIGluIHRoaXMgZWNsaXBzZSBzZXNzaW9uCi0JcHJpdmF0ZSBIYXNoTWFwIGp1c3RJbnN0YWxsZWRQbHVnaW5zID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGVtcHR5IFByb3BlcnRpZXMuCi0JICovCi0JcHJpdmF0ZSBJbnN0YWxsUmVnaXN0cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JCVN0cmluZyBjb25maWdGaWxlID0KLQkJCUNvbmZpZ3VyYXRvclV0aWxzCi0JCQkJLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKQotCQkJCS5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKQotCQkJCS5nZXRGaWxlKCk7Ci0JCWZpbGUgPSBuZXcgRmlsZShjb25maWdGaWxlKTsKLQkJZmlsZSA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQlmaWxlID0gbmV3IEZpbGUoZmlsZSwgUkVHSVNUUlkpOwotCQlyZXN0b3JlKCk7Ci0JfQotCi0JLyoqCi0JICogU2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJbnN0YWxsUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgSW5zdGFsbFJlZ2lzdHJ5KCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlcyBjb250ZW50cyBvZiB0aGUgUHJvcGVydGllcyBmcm9tIGEgZmlsZS4KLQkgKiBAcmV0dXJuIHRydWUgaWYgcGVyc2lzdGFudCBkYXRhIHdhcyByZWFkIGluCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVzdG9yZSgpIHsKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQlib29sZWFuIGxvYWRlZCA9IGZhbHNlOwotCQljbGVhcigpOwotCQkvLyBUZXN0IGlmIHdlIGhhdmUgYSBjb250cmlidXRpb24gZmlsZSB0byBzdGFydCB3aXRoCi0JCS8vIElmIHRoaXMgaXMgYSBjbGVhbiBzdGFydCwgdGhlbiB3ZSB3aWxsIG5vdCBoYXZlIGEgCi0JCS8vIGNvbnRyaWJ1dGlvbiBmaWxlLiByZXR1cm4gZmFsc2UuCi0JCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiBsb2FkZWQ7Ci0JCXRyeSB7Ci0JCQlpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCQlzdXBlci5sb2FkKGluKTsKLQkJCWxvYWRlZCA9IHRydWU7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZUNvcmUubG9nKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQl9Ci0JCXJldHVybiBsb2FkZWQ7Ci0JfQotCS8qKgotCSAqIFNhdmVzIGNvbnRlbnRzIG9mIHRoZSB0YWJsZSB0byBhIGZpbGUuCi0JICogQHJldHVybiB0cnVlIGlmIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzYXZlKCkgewotCQlPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCW91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQkJc3VwZXIuc3RvcmUob3V0LCAiVGhpcyBpcyBhIGdlbmVyYXRlZCBmaWxlOyBkbyBub3QgZWRpdC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0ID0gdHJ1ZTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS5sb2coZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChvdXQgIT0gbnVsbCkgewotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXJzIGFuIGluc3RhbGxlZCBmZWF0dXJlIHNvIGl0IGNhbiBiZSB1bmluc3RhbGxlZCBsYXRlci4KLQkgKiBAcGFyYW0gZmVhdHVyZSBmZWF0dXJlIHRvIHJlZ2lzdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgcmVnaXN0ZXJGZWF0dXJlKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJU3RyaW5nIG5hbWUgPSAiZmVhdHVyZV8iK2ZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOyAvLyROT04tTkxTLTEkCi0JCWlmIChJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXQobmFtZSkgPT0gbnVsbCkgewotCQkJSW5zdGFsbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkucHV0KG5hbWUsIG5hbWUpOwotCQkJLy8gd2Ugc2F2ZSBhZnRlciBlYWNoIHJlZ2lzdHJhdGlvbgotCQkJSW5zdGFsbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuc2F2ZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVycyBhbiBpbnN0YWxsZWQgZmVhdHVyZSBzbyBpdCBjYW4gYmUgdW5pbnN0YWxsZWQgbGF0ZXIuCi0JICogQHBhcmFtIHBsdWdpbkVudHJ5IHBsdWdpbiB0byByZWdpc3Rlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHJlZ2lzdGVyUGx1Z2luKElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSkgewotCQlTdHJpbmcgbmFtZSA9ICJwbHVnaW5fIitwbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKEluc3RhbGxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldChuYW1lKSA9PSBudWxsKSB7Ci0JCQlJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5wdXQobmFtZSwgbmFtZSk7Ci0JCQkvLyB3ZSBzYXZlIGFmdGVyIGVhY2ggcmVnaXN0cmF0aW9uCi0JCQlJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5zYXZlKCk7Ci0JCX0KLQkJCi0JCS8vIGFkZCBwbHVnaW4gdG8gdGhlIGxpc3Qgb2YganVzdCBpbnN0YWxsZWQgcGx1Z2lucyAuCi0JCUluc3RhbGxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmp1c3RJbnN0YWxsZWRQbHVnaW5zLnB1dChuYW1lLG5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHNwZWNpZmllZCBmZWF0dXJlIGZyb20gcmVnaXN0cnkKLQkgKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgdW5yZWdpc3RlckZlYXR1cmUoSUZlYXR1cmUgZmVhdHVyZSkgewotCQlTdHJpbmcgbmFtZSA9ICJmZWF0dXJlXyIrZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7IC8vJE5PTi1OTFMtMSQKLQkJSW5zdGFsbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkucmVtb3ZlKG5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHNwZWNpZmllZCBwbHVnaW4gZnJvbSByZWdpc3RyeQotCSAqCi0JICovCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCB1bnJlZ2lzdGVyUGx1Z2luKElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSkgewotCQlTdHJpbmcgbmFtZSA9ICJwbHVnaW5fIitwbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7IC8vJE5PTi1OTFMtMSQKLQkJSW5zdGFsbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkucmVtb3ZlKG5hbWUpOwotCQkKLQkJLy8gcmVtb3ZlIHRoZSBwbHVnaW4gZnJvbSB0aGUgbGlzdCBvZiBqdXN0IGluc3RhbGxlZCBwbHVnaW5zIChpZiBuZWVkZWQpLgotCQlJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5qdXN0SW5zdGFsbGVkUGx1Z2lucy5yZW1vdmUobmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGx1Z2luIHdhcyBpbnN0YWxsZWQgZHVyaW5nIHRoaXMgZWNsaXBzZSBzZXNzaW9uCi0JICogQHBhcmFtIHBsdWdpbkVudHJ5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGx1Z2luSnVzdEluc3RhbGxlZChJUGx1Z2luRW50cnkgcGx1Z2luRW50cnkpIHsKLQkJU3RyaW5nIG5hbWUgPSAicGx1Z2luXyIrcGx1Z2luRW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5qdXN0SW5zdGFsbGVkUGx1Z2lucy5nZXQobmFtZSkgIT0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgb25seSBuZWVkZWQgZm9yIHRoZSB1cGRhdGUgSlVuaXQgdGVzdHMuCi0JICoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xlYW51cCgpIHsKLQkJSW5zdGFsbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuanVzdEluc3RhbGxlZFBsdWdpbnMuY2xlYXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ludGVybmFsU2l0ZU1hbmFnZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSW50ZXJuYWxTaXRlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDE2NTAxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSW50ZXJuYWxTaXRlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklMb2NhbFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlRmFjdG9yeUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5KYXJDb250ZW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5jb25uZWN0aW9uLkNvbm5lY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLmNvbm5lY3Rpb24uSVJlc3BvbnNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC5JVGltZXN0YW1wOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSW50ZXJuYWxTaXRlTWFuYWdlciB7Ci0KLQlwdWJsaWMgc3RhdGljIElMb2NhbFNpdGUgbG9jYWxTaXRlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TSVRFX1RZUEUgPSBTaXRlVVJMQ29udGVudFByb3ZpZGVyLlNJVEVfVFlQRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FWEVDVVRBQkxFX1NJVEVfVFlQRSA9IFNpdGVGaWxlQ29udGVudFByb3ZpZGVyLlNJVEVfVFlQRTsKLQotCXByaXZhdGUgc3RhdGljIE1hcCBlc3RpbWF0ZXM7Ci0KLQkvLyBjYWNoZSBmb3VuZCBzaXRlcwotCXByaXZhdGUgc3RhdGljIE1hcCBzaXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JLy8gY2FjaGUgaHR0cCB1cGRhdGVkIHVybAotCXByaXZhdGUgc3RhdGljIE1hcCBodHRwU2l0ZXNVcGRhdGVkVXJscyA9IG5ldyBIYXNoTWFwKCk7Ci0JLy8gY2FjaGUgdGltZXN0YW1wcwotCXByaXZhdGUgc3RhdGljIE1hcCBzaXRlVGltZXN0YW1wcyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGdsb2JhbFVzZUNhY2hlID0gdHJ1ZTsKLQotCS8vIHRydWUgaWYgYW4gZXhjZXB0aW9uIG9jY3VyZWQgY3JlYXRpbmcgbG9jYWxTaXRlCi0JLy8gc28gd2UgY2FjaGUgaXQgYW5kIGRvbid0IGF0dGVtcHQgdG8gY3JlYXRlIGl0IGFnYWluCi0JcHJpdmF0ZSBzdGF0aWMgQ29yZUV4Y2VwdGlvbiBleGNlcHRpb25PY2N1cmVkID0gbnVsbDsKLQotCS8qCi0JICogQHNlZSBTaXRlTWFuYWdlciNnZXRMb2NhbFNpdGUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUxvY2FsU2l0ZSBnZXRMb2NhbFNpdGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBpbnRlcm5hbEdldExvY2FsU2l0ZSgpOwotCX0KLQotCS8qCi0JICogSW50ZXJuYWwgY2FsbCBpZiBvcHRpbWlzdGljIHJlY29uY2lsaWF0aW9uIG5lZWRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIElMb2NhbFNpdGUgaW50ZXJuYWxHZXRMb2NhbFNpdGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJLy8gaWYgYW4gZXhjZXB0aW9uIG9jY3VyZWQgd2hpbGUgcmV0cmlldmluZyB0aGUgU2l0ZQotCQkvLyByZXRocm93IGl0Ci0JCWlmIChleGNlcHRpb25PY2N1cmVkICE9IG51bGwpCi0JCQl0aHJvdyBleGNlcHRpb25PY2N1cmVkOwotCi0JCWlmIChsb2NhbFNpdGUgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlsb2NhbFNpdGUgPSBMb2NhbFNpdGUuaW50ZXJuYWxHZXRMb2NhbFNpdGUoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWV4Y2VwdGlvbk9jY3VyZWQgPSBlOwotCQkJCXRocm93IGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxvY2FsU2l0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQ2FjaGVkU2l0ZShVUkwgc2l0ZVVSTCkgewotCQlpZiAoIXNpdGVzLmNvbnRhaW5zS2V5KHNpdGVVUkwudG9FeHRlcm5hbEZvcm0oKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJTG9uZyB0aW1lc3RhbXAgPSAoTG9uZylzaXRlVGltZXN0YW1wcy5nZXQoc2l0ZVVSTCk7Ci0JCWlmICh0aW1lc3RhbXAgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJbG9uZyBsb2NhbExhc3RNb2RpZmllZCA9IHRpbWVzdGFtcC5sb25nVmFsdWUoKTsKLQkJCi0JCXJldHVybiBVcGRhdGVNYW5hZ2VyVXRpbHMuaXNTYW1lVGltZXN0YW1wKHNpdGVVUkwsIGxvY2FsTGFzdE1vZGlmaWVkKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUxvY2FsU2l0ZSNnZXRTaXRlKFVSTCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTaXRlIGdldFNpdGUoVVJMIHNpdGVVUkwsIGJvb2xlYW4gdXNlQ2FjaGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU2l0ZSBzaXRlID0gbnVsbDsKLQkJaWYgKG1vbml0b3I9PW51bGwpIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCi0JCWlmIChzaXRlVVJMID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyB1c2UgY2FjaGUgaWYgc2V0IHVwIGdsb2JhbGx5IChnbG9iYWxVc2VDYWNoZT10cnVlKQotCQkvLyBhbmQgcGFzc2VkIGFzIHBhcmFtZXRlciAodXNlQ2FjaGU9dHJ1ZSkKLQkJaWYgKGh0dHBTaXRlc1VwZGF0ZWRVcmxzLmNvbnRhaW5zS2V5KHNpdGVVUkwudG9FeHRlcm5hbEZvcm0oKSkpIHsKLQkJCXNpdGVVUkwgPSAoVVJMKWh0dHBTaXRlc1VwZGF0ZWRVcmxzLmdldChzaXRlVVJMLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQl9Ci0JCVN0cmluZyBzaXRlVVJMU3RyaW5nID0gc2l0ZVVSTC50b0V4dGVybmFsRm9ybSgpOwotCQlpZiAoKHVzZUNhY2hlICYmIGdsb2JhbFVzZUNhY2hlKSAmJiBpc1ZhbGlkQ2FjaGVkU2l0ZShzaXRlVVJMKSkgewotCQkJc2l0ZSA9IChJU2l0ZSkgc2l0ZXMuZ2V0KHNpdGVVUkxTdHJpbmcpOwotCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRVcGRhdGVTZXNzaW9uKCkubWFya1Zpc2l0ZWQoc2l0ZS5nZXRVUkwoKSk7Ci0JCQlyZXR1cm4gc2l0ZTsKLQkJfQotCQkKLQkJLy8gdHJ5IGFkZGluZyAiZWNsaXBzZSIgdG8gdGhlIHNpdGUgdXJsLCBpbiBjYXNlIHRoaXMgaXMgYW4gZXh0ZW5zaW9uIHNpdGUKLQkJaWYgKCJmaWxlIi5lcXVhbHMoc2l0ZVVSTC5nZXRQcm90b2NvbCgpKSApIHsgLy8kTk9OLU5MUy0xJAotCQkJRmlsZSBmID0gbmV3IEZpbGUoc2l0ZVVSTC5nZXRGaWxlKCkpOwotCQkJaWYgKGYuaXNEaXJlY3RvcnkoKSAmJiAhImVjbGlwc2UiLmVxdWFscyhmLmdldE5hbWUoKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWYgPSBuZXcgRmlsZShmLCAiZWNsaXBzZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJdHJ5IHsKLQkJCQkJaWYgKCh1c2VDYWNoZSAmJiBnbG9iYWxVc2VDYWNoZSkgJiYgaXNWYWxpZENhY2hlZFNpdGUoZi50b1VSTCgpKSkgewotCQkJCQkJc2l0ZSA9IChJU2l0ZSkgc2l0ZXMuZ2V0KGYudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJCQkJCXJldHVybiBzaXRlOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQl9CQotCQkJfQotCQl9Ci0KLQkJLy8gY29uc2lkZXIgZmlsZSBwcm90b2NvbCBhbHNvIGlmIHRoZSBVUkwgcG9pbnRzIHRvIGEgZGlyZWN0b3J5Ci0JCS8vIGFuZCBubyBzaXRlLnhtbCBleGlzdAotCQkvLyBpZiB0aGUgdXNlciBwb2ludHMgdG8gYSBmaWxlLCBjb25zaWRlciBERUZBVUxUX1NJVEVfVFlQRQotCQkvLyBzaXRlLnhtbCB3aWxsIGhhdmUgdG8gc3BlY2lmeSB0aGUgdHlwZQotCQlib29sZWFuIGZpbGVQcm90b2NvbCA9ICJmaWxlIi5lcXVhbHNJZ25vcmVDYXNlKHNpdGVVUkwuZ2V0UHJvdG9jb2woKSk7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBkaXJlY3RvcnlFeGlzdHMgPSBmYWxzZTsKLQkJaWYgKGZpbGVQcm90b2NvbCkgewotCQkJRmlsZSBkaXI7Ci0JCQlkaXIgPSBuZXcgRmlsZShzaXRlVVJMLmdldEZpbGUoKSk7Ci0JCQlpZiAoZGlyICE9IG51bGwgJiYgZGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlpZiAoIShuZXcgRmlsZShkaXIsIFNpdGUuU0lURV9YTUwpLmV4aXN0cygpKSkKLQkJCQkJZGlyZWN0b3J5RXhpc3RzID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCS8vUEVSRjogaWYgZmlsZTogPHBhdGg+LyBhbmQgZGlyZWN0b3J5IGV4aXN0cyB0aGVuIGNvbnNpZGVyIGV4ZWN1dGFibGUKLQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuSW50ZXJuYWxTaXRlTWFuYWdlcl9Db25uZWN0aW5nVG9TaXRlLCA4KTsgCi0JCWlmIChmaWxlUHJvdG9jb2wgJiYgZGlyZWN0b3J5RXhpc3RzKSB7Ci0JCQlzaXRlID0gYXR0ZW1wdENyZWF0ZVNpdGUoREVGQVVMVF9FWEVDVVRBQkxFX1NJVEVfVFlQRSwgc2l0ZVVSTCwgbW9uaXRvcik7Ci0JCQltb25pdG9yLndvcmtlZCg0KTsgLy8gb25seSBvbmUgYXR0ZW1wdAotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQltb25pdG9yLndvcmtlZCgzKTsKLQkJCQlzaXRlID0gYXR0ZW1wdENyZWF0ZVNpdGUoREVGQVVMVF9TSVRFX1RZUEUsIHNpdGVVUkwsIG1vbml0b3IpOwotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBwcmVzZXJ2ZWRFeGNlcHRpb24pIHsKLQkJCQlpZiAoIW1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCS8vIGF0dGVtcHQgYSByZXRyeSBpcyB0aGUgcHJvdG9jb2wgaXMgZmlsZSwgd2l0aCBleGVjdXRiYWxlIHR5cGUKLQkJCQkJaWYgKCFmaWxlUHJvdG9jb2wpCi0JCQkJCQl0aHJvdyBwcmVzZXJ2ZWRFeGNlcHRpb247Ci0KLQkJCQkJdHJ5IHsKLQkJCQkJCXNpdGUgPSBhdHRlbXB0Q3JlYXRlU2l0ZShERUZBVUxUX0VYRUNVVEFCTEVfU0lURV9UWVBFLCBzaXRlVVJMLCBtb25pdG9yKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiByZXRyeUV4Y2VwdGlvbikgewotCQkJCQkJSVN0YXR1cyBmaXJzdFN0YXR1cyA9IHByZXNlcnZlZEV4Y2VwdGlvbi5nZXRTdGF0dXMoKTsKLQkJCQkJCU11bHRpU3RhdHVzIG11bHRpID0gbmV3IE11bHRpU3RhdHVzKGZpcnN0U3RhdHVzLmdldFBsdWdpbigpLCBJU3RhdHVzLk9LLCBNZXNzYWdlcy5JbnRlcm5hbFNpdGVNYW5hZ2VyX0ZhaWxlZFJldHJ5QWNjZXNzaW5nU2l0ZSwgcmV0cnlFeGNlcHRpb24pOyAKLQkJCQkJCW11bHRpLmFkZEFsbChmaXJzdFN0YXR1cyk7Ci0JCQkJCQl0aHJvdyBwcmVzZXJ2ZWRFeGNlcHRpb247Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc2l0ZSAhPSBudWxsKSB7Ci0JCQlzaXRlcy5wdXQoc2l0ZS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpLCBzaXRlKTsKLQkJCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0VXBkYXRlU2Vzc2lvbigpLm1hcmtWaXNpdGVkKHNpdGUuZ2V0VVJMKCkpOwotCQkJaWYgKHNpdGUgaW5zdGFuY2VvZiBJVGltZXN0YW1wKSB7Ci0JCQkJc2l0ZVRpbWVzdGFtcHMucHV0KHNpdGUuZ2V0VVJMKCksIG5ldyBMb25nKCgoSVRpbWVzdGFtcClzaXRlKS5nZXRUaW1lc3RhbXAoKS5nZXRUaW1lKCkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVJlc3BvbnNlIHJlc3BvbnNlID0gQ29ubmVjdGlvbkZhY3RvcnkuZ2V0KFVSTEVuY29kZXIuZW5jb2RlKHNpdGVVUkwpKTsKLQkJCQkJc2l0ZVRpbWVzdGFtcHMucHV0KHNpdGVVUkwsIG5ldyBMb25nKHJlc3BvbnNlLmdldExhc3RNb2RpZmllZCgpKSk7Ci0JCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy9mbHVzaCB0aGUgSmFyRmlsZSB3ZSBtYXkgaG9sZCBvbiB0bwotCQkvLyB3ZSBrZWVwIHRoZSB0ZW1wIG5vdCB0byBjcmVhdGUgdGhlbSBhZ2FpbgotCQlKYXJDb250ZW50UmVmZXJlbmNlLnNodXRkb3duKCk7IC8vIG1ha2Ugc3VyZSB3ZSBhcmUgbm90IGxlYXZpbmcgamFycyBvcGVuIGZvciB0aGlzIHNpdGUKLQotCQkvL2ZsdXNoIG1hcHBpbmcgb2YgZG93bmxvYWRlZCBKQVIgZmlsZXMKLQkJLy8gRklYTUUgOiBwcm92aWRlIGJldHRlciBjYWNoZSBmbHVzaGluZyBhZnRlciAyLjEKLQkJLy8gRklYRUQ6IGV2ZXJ5dGhpbmcgZG93bmxvYWRlZCBpcyBjYWNoZWQgYW5kIHRpbWVzdGFtcGVkLgotCQkvLyAgICAgICAgVGltZXN0YW1wcyBhcmUgY29tcGFyZWQgdG8gbGFzdE1vZGlmZWQgb24gdGhlIHNlcnZlcgotCQkvLyAgICAgICAgYW5kIHdlIGRvd25sb2FkIG9ubHkgd2hlbiB0aGVyZSBpcyBhIGRpZmZlcmVuYwotCQkvLyBVdGlsaXRpZXMuZmx1c2hMb2NhbEZpbGUoKTsKLQotCQlyZXR1cm4gc2l0ZTsKLQl9Ci0KLQkvKgotCSAqIEF0dGVtcHQgdG8gY3JlYXRlIGEgc2l0ZQotCSAqIGlmIHRoZSBzaXRlIGd1ZXNzZWQgaXMgbm90IHRoZSB0eXBlIGZvdW5kLAotCSAqIGF0dGVtcHQgdG8gY3JlYXRlIGEgdHlwZSB3aXRoIHRoZSB0eXBlIGZvdW5kIGluIHRoZSBzaXRlLnhtbAotCSAqLwotCXByaXZhdGUgc3RhdGljIElTaXRlIGF0dGVtcHRDcmVhdGVTaXRlKFN0cmluZyBndWVzc2VkVHlwZVNpdGUsIFVSTCBzaXRlVVJMLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCUlTaXRlIHNpdGUgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCXNpdGUgPSBjcmVhdGVTaXRlKGd1ZXNzZWRUeXBlU2l0ZSwgc2l0ZVVSTCwgbW9uaXRvcik7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsgLy8gaWYgbm8gZXJyb3IsIG9jY3VycyB0aGUgcmV0cnkgYnJhbmNoIGRvZXNuJ3QgbmVlZCB0byBiZSBleGVjdXRlZAotCQl9IGNhdGNoIChJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24gZSkgewotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSByZXR1cm4gbnVsbDsKLQotCQkJLy8gdGhlIHR5cGUgaW4gdGhlIHNpdGUueG1sIGlzIG5vdCB0aGUgb25lIGV4cGVjdGVkCQotCQkJLy8gYXR0ZW1wdCB0byB1c2UgdGhpcyB0eXBlIGluc3RlYWQJCi0JCQkvL0RFQlVHOgotCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1RZUEUpIHsKLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJUaGUgU2l0ZSA6IiArIHNpdGVVUkwudG9FeHRlcm5hbEZvcm0oKSArICIgaXMgYSBkaWZmZXJlbnQgdHlwZSB0aGFuIHRoZSBndWVzc2VkIHR5cGUgYmFzZWQgb24gdGhlIHByb3RvY29sLiBuZXcgVHlwZToiICsgZS5nZXROZXdUeXBlKCkpOwkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJaWYgKGUuZ2V0TmV3VHlwZSgpID09IG51bGwpCi0JCQkJCXRocm93IGU7Ci0JCQkJc2l0ZSA9IGNyZWF0ZVNpdGUoZS5nZXROZXdUeXBlKCksIHNpdGVVUkwsIG1vbml0b3IpOwotCQkJfSBjYXRjaCAoSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIGUxKSB7Ci0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuSW50ZXJuYWxTaXRlTWFuYWdlcl9VbmFibGVUb0NyZWF0ZVNpdGVXaXRoVHlwZSwgKG5ldyBTdHJpbmdbXSB7IGUuZ2V0TmV3VHlwZSgpLCBzaXRlVVJMLnRvRXh0ZXJuYWxGb3JtKCkgfSkpLCBlMSk7IAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHNpdGU7Ci0JfQotCi0JLyoKLQkgKiBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgSVNpdGUKLQkgKiAKLQkgKiB0aGUgVVJMIGNhbiBiZSBvZiB0aGUgZm9sbG93aW5nIGZvcm0KLQkgKiAxIHByb3RvY29sOi8vLi4uLi4vCi0JICogMiBwcm90b2NvbDovLy4uLi4uCi0JICogMyBwcm90b2NvbDovLy4uLi4vc2l0ZS54bWwKLQkgKiA0IHByb3RvY29sOi8vLi4uIy4uLgotCSAqIAotCSAqIDEgSWYgdGhlIGZpbGUgb2YgdGhlIGZpbGUgb2YgdGVoIHVybCBlbmRzIHdpdGggJy8nLCBhdHRlbXB0IHRvIG9wZW4gdGhlIHN0cmVhbS4KLQkgKiBpZiBpdCBmYWlscywgYWRkIHNpdGUueG1sIGFuZCBhdHRlbXB0IHRvIG9wZW4gdGhlIHN0cmVhbQotCSAqIAotCSAqIDIgYXR0ZW1wdCB0byBvcGVuIHRoZSBzdHJlYW0KLQkgKiAJZmFpbAotCSAqIAkJYWRkICcvc2l0ZS54bWwnIGFuZCBhdHRlbXB0IHRvIG9wZW4gdGhlIHN0cmVhbQotCSAqIAlzdWNlc3MKLQkgKiAJCWF0dGVtcHQgdG8gcGFyc2UsIGlmIGl0IGZhaWxzLCBhZGQgJy9zaXRlLnhtbCcgYW5kIGF0dGVtcHQgdG8gb3BlbiB0aGUgc3RyZWFtCi0JICogCi0JICogMyBvcGVuIHRoZSBzdHJlYW0KLQkgKiAKLQkgKiA0IG9wZW4gdGhlIHN0cmVhbQkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJU2l0ZSBjcmVhdGVTaXRlKFN0cmluZyBzaXRlVHlwZSwgVVJMIHVybCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIHsKLQkJCi0JCWlmIChtb25pdG9yID09IG51bGwpIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkvL0lTaXRlIHNpdGUgPSBudWxsOwotCQlJU2l0ZUZhY3RvcnkgZmFjdG9yeSA9IFNpdGVUeXBlRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldEZhY3Rvcnkoc2l0ZVR5cGUpOwotCQlVUkwgZml4ZWRVcmw7Ci0JCQotCQkvLyBzZWUgaWYgd2UgbmVlZCB0byAoYW5kIGNhbikgZml4IHVybCBieSBhZGRpbmcgc2l0ZS54bWwgdG8gaXQKLQkJdHJ5IHsKLQkJCWlmICggKHVybC5nZXRSZWYoKSAhPSBudWxsKSB8fCAodXJsLmdldEZpbGUoKS5lbmRzV2l0aChTaXRlLlNJVEVfWE1MKSB8fCAodXJsLmdldFByb3RvY29sKCkuZXF1YWxzSWdub3JlQ2FzZSgiZmlsZSIpKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJIAlmaXhlZFVybCA9IHVybDsKLQkJCX0gZWxzZSBpZiAodXJsLmdldEZpbGUoKS5lbmRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlmaXhlZFVybCA9IG5ldyBVUkwodXJsLCBTaXRlLlNJVEVfWE1MKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZml4ZWRVcmwgPSBuZXcgVVJMKHVybC5nZXRQcm90b2NvbCgpLCB1cmwuZ2V0SG9zdCgpLCB1cmwuZ2V0UG9ydCgpLCB1cmwuZ2V0RmlsZSgpICsgIi8iICsgU2l0ZS5TSVRFX1hNTCk7CS8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkgewotCQkJZml4ZWRVcmwgPSB1cmw7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQl0cnkgeyAKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQlyZXR1cm4gY3JlYXRlU2l0ZSggZmFjdG9yeSwgZml4ZWRVcmwsIHVybCwgbW9uaXRvcik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSAKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJCQlpZiAoIWZpeGVkVXJsLmVxdWFscyh1cmwpKSB7Ci0JCQkJCS8vIHRyeSB3aXRoIG9yaWdpbmFsIHVybAotCQkJCQkgcmV0dXJuIGNyZWF0ZVNpdGUoIGZhY3RvcnksIHVybCwgdXJsLCBtb25pdG9yKTsKLQkJCQl9IGVsc2UgaWYgKHVybC5nZXRQcm90b2NvbCgpLmVxdWFsc0lnbm9yZUNhc2UoImZpbGUiKSAmJiAhIHVybC5nZXRGaWxlKCkuZW5kc1dpdGgoU2l0ZS5TSVRFX1hNTCkpeyAvLyROT04tTkxTLTEkCi0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAodXJsLmdldEZpbGUoKS5lbmRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlyZXR1cm4gY3JlYXRlU2l0ZShmYWN0b3J5LCBuZXcgVVJMKHVybCwKLQkJCQkJCQkJCVNpdGUuU0lURV9YTUwpLCB1cmwsIG1vbml0b3IpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXR1cm4gY3JlYXRlU2l0ZShmYWN0b3J5LCBuZXcgVVJMKHVybAotCQkJCQkJCQkJLmdldFByb3RvY29sKCksIHVybC5nZXRIb3N0KCksIHVybAotCQkJCQkJCQkJLmdldFBvcnQoKSwgdXJsLmdldEZpbGUoKQotCQkJCQkJCQkJKyAiLyIgKyBTaXRlLlNJVEVfWE1MKSwgdXJsLCBtb25pdG9yKTsgLy8kTk9OLU5MUy0xJAkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkgewotCQkJCQkJdGhyb3cgY2U7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBjZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuSW50ZXJuYWxTaXRlTWFuYWdlcl9VbmFibGVUb0FjY2Vzc1VSTCwgKG5ldyBTdHJpbmdbXSB7IHVybC50b0V4dGVybmFsRm9ybSgpIH0pKSwgY2UpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIElTaXRlIGNyZWF0ZVNpdGUoSVNpdGVGYWN0b3J5IGZhY3RvcnksIFVSTCB1cmwsIFVSTCBvcmlnaW5hbFVybCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIHsKLQkJCi0JCUlTaXRlIHNpdGU7Ci0JCQkKLQkJc2l0ZSA9IGNyZWF0ZVNpdGUoZmFjdG9yeSwgdXJsLCBtb25pdG9yKTsKLQkJaHR0cFNpdGVzVXBkYXRlZFVybHMucHV0KG9yaWdpbmFsVXJsLnRvRXh0ZXJuYWxGb3JtKCksIHVybCk7CQotCQkKLQkJcmV0dXJuIHNpdGU7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIElTaXRlIGNyZWF0ZVNpdGUoSVNpdGVGYWN0b3J5IGZhY3RvcnksIFVSTCB1cmwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbiB7Ci0JCWlmIChmYWN0b3J5IGluc3RhbmNlb2YgSVNpdGVGYWN0b3J5RXh0ZW5zaW9uKQotCQkJcmV0dXJuICgoSVNpdGVGYWN0b3J5RXh0ZW5zaW9uKWZhY3RvcnkpLmNyZWF0ZVNpdGUodXJsLCBtb25pdG9yKTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlU2l0ZSh1cmwpOwotCX0KLQotCS8qCi0JICogQ3JlYXRlcyBhIG5ldyBzaXRlIG9uIHRoZSBmaWxlIHN5c3RlbQotCSAqIFRoaXMgaXMgdGhlIG9ubHkgU2l0ZSB3ZSBjYW4gY3JlYXRlLgotCSAqIAotCSAqIEBwYXJhbSBzaXRlTG9jYXRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTaXRlIGNyZWF0ZVNpdGUoRmlsZSBzaXRlTG9jYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVNpdGUgc2l0ZSA9IG51bGw7Ci0JCWlmIChzaXRlTG9jYXRpb24gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlVUkwgc2l0ZVVSTCA9IHNpdGVMb2NhdGlvbi50b1VSTCgpOwotCQkJCXNpdGUgPSBnZXRTaXRlKHNpdGVVUkwsIGZhbHNlLCBudWxsKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuSW50ZXJuYWxTaXRlTWFuYWdlcl9VbmFibGVUb0NyZWF0ZVVSTCwgKG5ldyBTdHJpbmdbXSB7IHNpdGVMb2NhdGlvbi5nZXRBYnNvbHV0ZVBhdGgoKSB9KSksIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzaXRlOwotCX0KLQotCi0JLyoqCi0JICogTWV0aG9kIGRvd25sb2FkZWQuCi0JICogQHBhcmFtIGRvd25sb2FkU2l6ZSBzaXplIGRvd25sb2FkZWQgaW4gYnl0ZXMKLQkgKiBAcGFyYW0gdGltZSB0aW1lIGluIHNlY29uZHMKLQkgKiBAcGFyYW0gdXJsCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRvd25sb2FkZWQobG9uZyBkb3dubG9hZFNpemUsIGxvbmcgdGltZSwgVVJMIHVybCkgewotCQlpZiAoZG93bmxvYWRTaXplIDw9IDAgfHwgdGltZSA8IDApCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBob3N0ID0gdXJsLmdldEhvc3QoKTsKLQkJbG9uZyBzaXplQnlUaW1lID0gKHRpbWUgPT0gMCkgPyAwIDogZG93bmxvYWRTaXplIC8gdGltZTsKLQkJTG9uZyB2YWx1ZSA9IG5ldyBMb25nKHNpemVCeVRpbWUpOwotCQlpZiAoZXN0aW1hdGVzID09IG51bGwpIHsKLQkJCWVzdGltYXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0gZWxzZSB7Ci0JCQlMb25nIHByZXZpb3VzID0gKExvbmcpIGVzdGltYXRlcy5nZXQoaG9zdCk7Ci0JCQlpZiAocHJldmlvdXMgIT0gbnVsbCkgewotCQkJCXZhbHVlID0gbmV3IExvbmcoKHByZXZpb3VzLmxvbmdWYWx1ZSgpICsgc2l6ZUJ5VGltZSkgLyAyKTsKLQkJCX0KLQkJfQotCQllc3RpbWF0ZXMucHV0KGhvc3QsIHZhbHVlKTsKLQl9Ci0JLyoqCi0JICogTWV0aG9kIGdldEVzdGltYXRlZFRyYW5zZmVyUmF0ZSByYXRlIGJ5dGVzL3NlY29uZHMuCi0JICogQHBhcmFtIGhvc3QKLQkgKiBAcmV0dXJuIGxvbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGxvbmcgZ2V0RXN0aW1hdGVkVHJhbnNmZXJSYXRlKFN0cmluZyBob3N0KSB7Ci0JCWlmIChlc3RpbWF0ZXMgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlMb25nIHZhbHVlID0gKExvbmcpIGVzdGltYXRlcy5nZXQoaG9zdCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiB2YWx1ZS5sb25nVmFsdWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSmFyRGVsdGFJbnN0YWxsSGFuZGxlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9KYXJEZWx0YUluc3RhbGxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYTdlMzQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9KYXJEZWx0YUluc3RhbGxIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlQ29udGVudENvbnN1bWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklQbHVnaW5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5QbHVnaW5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlOwotCi1wdWJsaWMgY2xhc3MgSmFyRGVsdGFJbnN0YWxsSGFuZGxlciBleHRlbmRzIERlbHRhSW5zdGFsbEhhbmRsZXIgewotCi0JCi0JcHJvdGVjdGVkIHZvaWQgb3ZlcmxheVBsdWdpbigKLQkJCUlQbHVnaW5FbnRyeSBvbGRQbHVnaW4sCi0JCQlJUGx1Z2luRW50cnkgbmV3UGx1Z2luLAotCQkJSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgY29uc3VtZXIpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkKLQkJCWlmKG5ld1BsdWdpbiBpbnN0YW5jZW9mIFBsdWdpbkVudHJ5ICYmICgoUGx1Z2luRW50cnkpbmV3UGx1Z2luKS5pc1VucGFjaygpKXsKLQkJCQkvLyBwYXJ0aWFsIHBsdWctaW5zIChpbiBwYXRjaGVzKSBtdXN0IGFsd2F5cyBiZSB1bnBhY2tlZAotCQkJCXN1cGVyLm92ZXJsYXlQbHVnaW4ob2xkUGx1Z2luLCBuZXdQbHVnaW4sIGNvbnN1bWVyKTsKLQkJCX0KLQkJCQotCQkJVVJMIG9sZFVSSSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW9sZFVSSSA9IG5ldyBVUkwoY29uc3VtZXIuZ2V0RmVhdHVyZSgpLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRQYXRoKCkgKyAKLQkJCQkJCQkJCSBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyAKLQkJCQkJCQkJCSBvbGRQbHVnaW4uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQkJRmlsZSBvbGRKYXJGaWxlID0gbmV3IEZpbGUob2xkVVJJLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJSmFyRmlsZSBvbGRKYXIgPSBuZXcgSmFyRmlsZShvbGRKYXJGaWxlKTsKLQkJCQotCQkJVVJMIG5ld1VSSSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW5ld1VSSSA9IG5ldyBVUkwoY29uc3VtZXIuZ2V0RmVhdHVyZSgpLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRQYXRoKCkgKyAKLQkJCQkJCQkJIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIAotCQkJCQkJCQkgbmV3UGx1Z2luLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJCUZpbGUgbmV3SmFyRmlsZSA9IG5ldyBGaWxlKG5ld1VSSS50b0V4dGVybmFsRm9ybSgpKTsKLQkJCUphckZpbGUgbmV3SmFyID0gbmV3IEphckZpbGUobmV3SmFyRmlsZSk7Ci0KLQkJCVN0cmluZyB0ZW1wRmlsZU5hbWUgPSBvbGRVUkkgKyAiLSIgKyAobmV3IERhdGUoKSkuZ2V0VGltZSgpOyAvLyROT04tTkxTLTEkCi0JCQlGaWxlIHRlbXBGaWxlID0gbmV3IEZpbGUodGVtcEZpbGVOYW1lKTsKLQkJCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGVtcEZpbGUpOwotCQkJSmFyT3V0cHV0U3RyZWFtIGpvcyA9IG5ldyBKYXJPdXRwdXRTdHJlYW0oIGZvcyk7Ci0JCQkKLQkJCWFkZFRvSmFyKGpvcywgbmV3SmFyKTsKLQkJCWFkZFRvSmFyKGpvcywgb2xkSmFyKTsKLQkJCQotCQkJam9zLmNsb3NlRW50cnkoKTsKLQkJCWpvcy5maW5pc2goKTsKLQkJCWZvcy5jbG9zZSgpOwotCQkJbmV3SmFyLmNsb3NlKCk7Ci0JCQlvbGRKYXIuY2xvc2UoKTsKLQkJCQotCQkJbmV3SmFyRmlsZSA9IG5ldyBGaWxlKG5ld1VSSS50b0V4dGVybmFsRm9ybSgpKTsKLQkJCW5ld0phckZpbGUuZGVsZXRlKCk7Ci0JCQkKLQkJCW5ld0phckZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCi0JCQljb3B5RmlsZSh0ZW1wRmlsZSwgbmV3SmFyRmlsZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RmlsZShGaWxlIHNyYywgRmlsZSBkc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGluPW51bGw7Ci0JCU91dHB1dFN0cmVhbSBvdXQ9bnVsbDsKLQkJdHJ5IHsKLQkJCWluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShzcmMpKTsKLQkJCW91dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShkc3QpKTsJCQotCQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzQwOTZdOwotCQkJaW50IGxlbjsKLQkJCXdoaWxlICgobGVuPWluLnJlYWQoYnVmZmVyKSkgIT0gLTEpIHsKLQkJCQlvdXQud3JpdGUoYnVmZmVyLCAwLCBsZW4pOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJaWYgKG91dCAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCW91dC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkVG9KYXIoSmFyT3V0cHV0U3RyZWFtIGpvcywgSmFyRmlsZSBqZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRW51bWVyYXRpb24gZSA9IGpmLmVudHJpZXMoKTsKLQkJCi0JCXdoaWxlKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQotCQkJWmlwRW50cnkgamUgPSAoWmlwRW50cnkpZS5uZXh0RWxlbWVudCgpOwotCQkJSW5wdXRTdHJlYW0gaW8gPSBqZi5nZXRJbnB1dFN0cmVhbShqZSk7Ci0JCQkKLQkJCWJ5dGUgYltdID0gbmV3IGJ5dGVbNDA5Nl07Ci0JCQlpbnQgcmVhZCA9IDA7Ci0JCQl0cnkgewotCQkJCWpvcy5wdXROZXh0RW50cnkoamUpOwotCQkJCXdoaWxlKCAoIHJlYWQgPSBpby5yZWFkKGIsIDAsIDQwOTYpKSAhPSAtMSkgewotCQkJCQlqb3Mud3JpdGUoYiwgMCwgcmVhZCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoWmlwRXhjZXB0aW9uIHplKSB7Ci0JCQkJLy96ZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl0aHJvdyB6ZTsKLQkJCX0JCQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9MaXRlRmVhdHVyZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9MaXRlRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWFjMDlmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvTGl0ZUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkZlYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBMaXRlRmVhdHVyZSBleHRlbmRzIEZlYXR1cmUgewotCQotCXByaXZhdGUgYm9vbGVhbiBmdWxsRmVhdHVyZSA9IHRydWU7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Z1bGxGZWF0dXJlKCkgewotCQlyZXR1cm4gZnVsbEZlYXR1cmU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RnVsbEZlYXR1cmUoYm9vbGVhbiBmdWxsRmVhdHVyZSkgewotCQl0aGlzLmZ1bGxGZWF0dXJlID0gZnVsbEZlYXR1cmU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0xpdGVGZWF0dXJlRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9MaXRlRmVhdHVyZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYwYTllZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0xpdGVGZWF0dXJlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQmFzZUZlYXR1cmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkZlYXR1cmVNb2RlbDsKLQotcHVibGljIGNsYXNzIExpdGVGZWF0dXJlRmFjdG9yeSBleHRlbmRzIEJhc2VGZWF0dXJlRmFjdG9yeSB7Ci0KLQlwdWJsaWMgTGl0ZUZlYXR1cmVGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJRmVhdHVyZSBjcmVhdGVGZWF0dXJlKFVSTCB1cmwsIElTaXRlIHNpdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBGZWF0dXJlTW9kZWwgY3JlYXRlRmVhdHVyZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpdGVGZWF0dXJlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Mb2NhbFNpdGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvTG9jYWxTaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MTY5N2QuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Mb2NhbFNpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklBY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JSW5zdGFsbENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUxvY2FsU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklQcm9ibGVtSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLkNvbmZpZ3VyYXRvclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuSVBsYXRmb3JtQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLkluc3RhbGxDb25maWd1cmF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLlNpdGVMb2NhbE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC5TaXRlTG9jYWxQYXJzZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIHRoZSBjb25maWd1cmF0aW9ucy4KLSAqLwotCi1wdWJsaWMgY2xhc3MgTG9jYWxTaXRlIGV4dGVuZHMgU2l0ZUxvY2FsTW9kZWwgaW1wbGVtZW50cyBJTG9jYWxTaXRlewotCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgbGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdChMaXN0ZW5lckxpc3QuSURFTlRJVFkpOwotCXByaXZhdGUgU2l0ZVN0YXR1c0FuYWx5emVyIHNpdGVTdGF0dXNBbmFseXplcjsKLQlwcml2YXRlIGJvb2xlYW4gaXNUcmFuc2llbnQgPSBmYWxzZTsKLQotCS8qCi0JICogSGF2ZSBuZXcgZmVhdHVyZXMgYmVlbiBmb3VuZCBkdXJpbmcgcmVjb25jaWxpYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbmV3RmVhdHVyZXNGb3VuZCA9IGZhbHNlOwotCi0JLyoKLQkgKiBpbml0aWFsaXplIHRoZSBjb25maWd1cmF0aW9ucyBmcm9tIHRoZSBwZXJzaXN0ZW50IG1vZGVsLgotCSAqIFNldCB0aGUgcmVjb25jaWxpYXRpb24gYXMgbm9uIG9wdGltaXN0aWMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElMb2NhbFNpdGUgZ2V0TG9jYWxTaXRlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gaW50ZXJuYWxHZXRMb2NhbFNpdGUoKTsKLQl9Ci0KLQkvKgotCSAqSW50ZXJuYWwgY2FsbCBpcyByZWNvbmNpbGlhdGlvbiBuZWVkcyB0byBiZSBvcHRpbWlzdGljCi0JICovCi0JcHVibGljIHN0YXRpYyBJTG9jYWxTaXRlIGludGVybmFsR2V0TG9jYWxTaXRlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQotCQlMb2NhbFNpdGUgbG9jYWxTaXRlID0gbmV3IExvY2FsU2l0ZSgpOwotCQotCQkvLyBvYnRhaW4gcGxhdGZvcm0gY29uZmlndXJhdGlvbgotCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIGN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7Ci0JCWxvY2FsU2l0ZS5pc1RyYW5zaWVudChjdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uLmlzVHJhbnNpZW50KCkpOwotCQotCQl0cnkgewotCQkJVVJMIGNvbmZpZ1hNTCA9IGN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCk7Ci0JCQlsb2NhbFNpdGUuc2V0TG9jYXRpb25VUkxTdHJpbmcoY29uZmlnWE1MLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJbG9jYWxTaXRlLnJlc29sdmUoY29uZmlnWE1MLCBudWxsKTsKLQkKLQkJCS8vIEF0dGVtcHQgdG8gcmVhZCBwcmV2aW91cyBzdGF0ZQotCQkJcGFyc2VMb2NhbFNpdGVGaWxlKGN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24sIGxvY2FsU2l0ZSk7Ci0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuU2l0ZUxvY2FsX1VuYWJsZVRvQ3JlYXRlVVJMRm9yLCAobmV3IFN0cmluZ1tdIHsgbG9jYWxTaXRlLmdldExvY2F0aW9uVVJMU3RyaW5nKCkgKyAiICYgIiArIENPTkZJR19GSUxFIH0pKSwgZXhjZXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCi0JCXJldHVybiBsb2NhbFNpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBsb2NhbFNpdGUgb2JqZWN0Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBwYXJzZUxvY2FsU2l0ZUZpbGUoSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBwbGF0Zm9ybUNvbmZpZywgTG9jYWxTaXRlIGxvY2FsU2l0ZSApIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCi0JCS8vYXR0ZW1wdCB0byBwYXJzZSB0aGUgTG9jYWxTaXRlLnhtbAkKLS8vCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShjb25maWdYTUwpOwotCQl0cnkgewotLy8JCQlJbnB1dFN0cmVhbSBpbiA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0KHJlc29sdmVkVVJMKS5nZXRJbnB1dFN0cmVhbSgpOwotCQkJbmV3IFNpdGVMb2NhbFBhcnNlcihwbGF0Zm9ybUNvbmZpZywgbG9jYWxTaXRlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgTG9jYWxTaXRlKCkgewotCX0KLQotCS8qKgotCSAqIGFkZHMgYSBuZXcgY29uZmlndXJhdGlvbiB0byB0aGUgTG9jYWxTaXRlCi0JICogIHRoZSBuZXdseSBhZGRlZCBjb25maWd1cmF0aW9uIGlzIHRlaCBjdXJyZW50IG9uZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyYXRpb24oSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCWFkZENvbmZpZ3VyYXRpb25Nb2RlbCgoSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCkgY29uZmlnKTsKLQotCQkJdHJpbUhpc3RvcnlUb0NhcGFjaXR5KCk7Ci0KLQkJCS8vIHNldCBjb25maWd1cmF0aW9uIGFzIGN1cnJlbnQJCQotCQkJaWYgKGdldEN1cnJlbnRDb25maWd1cmF0aW9uTW9kZWwoKSAhPSBudWxsKQotCQkJCWdldEN1cnJlbnRDb25maWd1cmF0aW9uTW9kZWwoKS5zZXRDdXJyZW50KGZhbHNlKTsKLQkJCWlmIChjb25maWcgaW5zdGFuY2VvZiBJbnN0YWxsQ29uZmlndXJhdGlvbikKLQkJCQkgKChJbnN0YWxsQ29uZmlndXJhdGlvbikgY29uZmlnKS5zZXRDdXJyZW50KHRydWUpOwotCi0JCQlzZXRDdXJyZW50Q29uZmlndXJhdGlvbk1vZGVsKChJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKSBjb25maWcpOwotCQkJKChJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKSBjb25maWcpLm1hcmtSZWFkT25seSgpOwotCi0JCQkvLyBub3RpZnkgbGlzdGVuZXJzCi0JCQlPYmplY3RbXSBzaXRlTG9jYWxMaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVMb2NhbExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCSgoSUxvY2FsU2l0ZUNoYW5nZWRMaXN0ZW5lcikgc2l0ZUxvY2FsTGlzdGVuZXJzW2ldKS5jdXJyZW50SW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkKGNvbmZpZyk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRyaW1IaXN0b3J5VG9DYXBhY2l0eSgpIHsKLQkJLy8gY2hlY2sgaWYgd2UgaGF2ZSB0byByZW1vdmUgYSBjb25maWd1cmF0aW9uCi0JCS8vIHRoZSBmaXJzdCBhZGRlZCBpcyAjMAotCQl3aGlsZSAoZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKS5sZW5ndGggPiBnZXRNYXhpbXVtSGlzdG9yeUNvdW50KCkgJiYKLQkJCQlnZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpLmxlbmd0aCA+IDEpIHsKLQkJCS8vIGRvIG5vdCByZW1vdmUgdGhlIGZpcnN0IGVsZW1lbnQgaW4gaGlzdG9yeSwgdGhpcyBpcyB0aGUgb3JpZ2luYWwgY29uZmlnCi0JCQlJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIHJlbW92ZWRDb25maWcgPSBnZXRDb25maWd1cmF0aW9uSGlzdG9yeU1vZGVsKClbMV07Ci0JCQlpZiAocmVtb3ZlQ29uZmlndXJhdGlvbk1vZGVsKHJlbW92ZWRDb25maWcpKSB7Ci0KLQkJCQkvLyBERUJVRzoKLQkJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfQ09ORklHVVJBVElPTikgewotCQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJSZW1vdmVkIGNvbmZpZ3VyYXRpb24gOiIgKyByZW1vdmVkQ29uZmlnLmdldExhYmVsKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCi0JCQkJLy8gbm90aWZ5IGxpc3RlbmVycwotCQkJCU9iamVjdFtdIHNpdGVMb2NhbExpc3RlbmVycyA9IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVMb2NhbExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCQkoKElMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIpIHNpdGVMb2NhbExpc3RlbmVyc1tpXSkuaW5zdGFsbENvbmZpZ3VyYXRpb25SZW1vdmVkKChJSW5zdGFsbENvbmZpZ3VyYXRpb24pIHJlbW92ZWRDb25maWcpOwotCQkJCX0KLQotCQkJCS8vcmVtb3ZlIGZpbGVzCi0JCQkJVVJMIHVybCA9IHJlbW92ZWRDb25maWcuZ2V0VVJMKCk7Ci0JCQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpKTsKLQkJCX0KLQkJfQotCX0KLQkvKgotCSAqIEBzZWUgSUxvY2FsU2l0ZSNhZGRMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIoSUxvY2FsU2l0ZUNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIoSUxvY2FsU2l0ZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUxvY2FsU2l0ZSNyZW1vdmVMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIoSUxvY2FsU2l0ZUNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIoSUxvY2FsU2l0ZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgc2l0ZSBpbnRvIHRoZSBjb25maWcgZmlsZS4KLQkgKiBAcmV0dXJuIHRydWUgaWYgY2hhbmdlcyByZXN0YXJ0IGlzIG5lZWRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhdmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJLy8gU2F2ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGFzCi0JCS8vIHRoZSBvdGhlciBhcmUgYWxyZWFkeSBzYXZlZAotCQkvLyBhbmQgc2V0IHJ1bnRpbSBpbmZvIGZvciBuZXh0IHN0YXJ0dXAKLQkJcmV0dXJuICgoSW5zdGFsbENvbmZpZ3VyYXRpb24pIGdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkpLnNhdmUoKTsKLQl9Ci0JCi0vLwkvKioKLS8vCSAqIE1ldGhvZCBjcmVhdGVOZXdJbnN0YWxsQ29uZmlndXJhdGlvbi4KLS8vCSAqIEByZXR1cm4gSUluc3RhbGxDb25maWd1cmF0aW9uCi0vLwkgKi8KLS8vCXByaXZhdGUgSUluc3RhbGxDb25maWd1cmF0aW9uIGNyZWF0ZU5ld0luc3RhbGxDb25maWd1cmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotLy8JCUluc3RhbGxDb25maWd1cmF0aW9uIG5ld0luc3RhbGxDb25maWcgPSBjcmVhdGVDb25maWd1cmF0aW9uU2l0ZShudWxsKTsKLS8vCQluZXdJbnN0YWxsQ29uZmlnLnNldFRpbWVsaW5lKG5ld0luc3RhbGxDb25maWcuZ2V0Q3JlYXRpb25EYXRlKCkuZ2V0VGltZSgpKTsKLS8vCQlyZXR1cm4gbmV3SW5zdGFsbENvbmZpZzsKLS8vCX0KLQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC4gVGhlIGN1cnJlbnQgaW5zdGFsbCBjb25maWd1cmF0aW9uIGlzIHRvIGJlIHVzZWQuCi0JICovCi0JcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBjbG9uZUN1cnJlbnRDb25maWd1cmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBJbnN0YWxsQ29uZmlndXJhdGlvbihnZXRDdXJyZW50Q29uZmlndXJhdGlvbigpKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE1lc3NhZ2VzLlNpdGVMb2NhbF9jbG9uZUNvbmZpZywgZSk7IAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJldmVydFRvKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9ibGVtSGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJLy8gY3JlYXRlIHRoZSBhY3Rpdml0eSAKLQkJLy9TdGFydCBVT1cgPwotCQlDb25maWd1cmF0aW9uQWN0aXZpdHkgYWN0aXZpdHkgPSBuZXcgQ29uZmlndXJhdGlvbkFjdGl2aXR5KElBY3Rpdml0eS5BQ1RJT05fUkVWRVJUKTsKLQkJYWN0aXZpdHkuc2V0TGFiZWwoY29uZmlndXJhdGlvbi5nZXRMYWJlbCgpKTsKLQkJYWN0aXZpdHkuc2V0RGF0ZShuZXcgRGF0ZSgpKTsKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIG5ld0NvbmZpZ3VyYXRpb24gPSBudWxsOwotCi0JCXRyeSB7Ci0JCQkvLyBjcmVhdGUgYSBjb25maWd1cmF0aW9uCi0JCQluZXdDb25maWd1cmF0aW9uID0gY2xvbmVDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQkJbmV3Q29uZmlndXJhdGlvbi5zZXRMYWJlbChjb25maWd1cmF0aW9uLmdldExhYmVsKCkpOwotCi0JCQkvLyBhZGQgdG8gdGhlIHN0YWNrIHdoaWNoIHdpbGwgc2V0IHVwIGFzIGN1cnJlbnQKLQkJCWFkZENvbmZpZ3VyYXRpb24obmV3Q29uZmlndXJhdGlvbik7Ci0KLQkJCS8vIHByb2Nlc3MgZGVsdGEKLQkJCS8vIHRoZSBDb25maWd1cmVkIGZlYXR1cmVzQ29uZmlndXJlZCBhcmUgdGhlIHNhbWUgYXMgdGhlIG9sZCBjb25maWd1cmF0aW9uCi0JCQkvLyB0aGUgdW5jb25maWd1cmVkIGZlYXR1cmVzQ29uZmlndXJlZCBhcmUgdGhlIHJlc3QuLi4KLQkJCSAoKEluc3RhbGxDb25maWd1cmF0aW9uKSBuZXdDb25maWd1cmF0aW9uKS5yZXZlcnRUbyhjb25maWd1cmF0aW9uLCBtb25pdG9yLCBoYW5kbGVyKTsKLQotCQkJLy8gZXZlcnl0aGluZyBkb25lIG9rCi0JCQlhY3Rpdml0eS5zZXRTdGF0dXMoSUFjdGl2aXR5LlNUQVRVU19PSyk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gZXJyb3IKLQkJCWFjdGl2aXR5LnNldFN0YXR1cyhJQWN0aXZpdHkuU1RBVFVTX05PSyk7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL3VzZXIgZGVjaWRlZCBub3QgdG8gcmV2ZXJ0LCBkbyBub3RoaW5nCi0JCQkvLyBiZWNhdXNlIHdlIGRpZG4ndCBhZGQgdGhlIGNvbmZpZ3VyYXRpb24gdG8gdGhlIGhpc3RvcnkKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChuZXdDb25maWd1cmF0aW9uICE9IG51bGwpCi0JCQkJICgoSW5zdGFsbENvbmZpZ3VyYXRpb24pIG5ld0NvbmZpZ3VyYXRpb24pLmFkZEFjdGl2aXR5KGFjdGl2aXR5KTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBhZGRUb1ByZXNlcnZlZENvbmZpZ3VyYXRpb25zKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJTG9jYWxTaXRlI2dldFByZXNlcnZlZENvbmZpZ3VyYXRpb25Gb3IoSUluc3RhbGxDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb24gZmluZFByZXNlcnZlZENvbmZpZ3VyYXRpb25Gb3IoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQotCQkvLyBiYXNlZCBvbiB0aW1lIHN0YW1wIGZvciBub3cKLQkJSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBwcmVzZXJ2ZWRDb25maWcgPSBudWxsOwotCQlpZiAoY29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsW10gcHJlc2VydmVkQ29uZmlndXJhdGlvbnMgPSBnZXRQcmVzZXJ2ZWRDb25maWd1cmF0aW9uc01vZGVsKCk7Ci0JCQlpZiAocHJlc2VydmVkQ29uZmlndXJhdGlvbnMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGluZGV4UHJlc2VydmVkID0gMDsgaW5kZXhQcmVzZXJ2ZWQgPCBwcmVzZXJ2ZWRDb25maWd1cmF0aW9ucy5sZW5ndGg7IGluZGV4UHJlc2VydmVkKyspIHsKLQkJCQkJaWYgKGNvbmZpZ3VyYXRpb24uZ2V0Q3JlYXRpb25EYXRlKCkuZXF1YWxzKHByZXNlcnZlZENvbmZpZ3VyYXRpb25zW2luZGV4UHJlc2VydmVkXS5nZXRDcmVhdGlvbkRhdGUoKSkpIHsKLQkJCQkJCXByZXNlcnZlZENvbmZpZyA9IHByZXNlcnZlZENvbmZpZ3VyYXRpb25zW2luZGV4UHJlc2VydmVkXTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChJSW5zdGFsbENvbmZpZ3VyYXRpb24pIHByZXNlcnZlZENvbmZpZzsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUxvY2FsU2l0ZSNnZXRDdXJyZW50Q29uZmlndXJhdGlvbigpCi0JICogTG9jYWxTaXRlTW9kZWwjZ2V0Q3VycmVudENvbmZpZ3VyYXRpb25Nb2RlbCgpIG1heSByZXR1cm4gbnVsbCBpZgotCSAqIHdlIGp1c3QgcGFyc2VkIExvY2FsU2l0ZS54bWwKLQkgKi8KLQlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uIGdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkgewotCQlpZiAoZ2V0Q3VycmVudENvbmZpZ3VyYXRpb25Nb2RlbCgpID09IG51bGwpIHsKLQkJCWludCBpbmRleCA9IDA7Ci0JCQlpZiAoKGluZGV4ID0gZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnlNb2RlbCgpLmxlbmd0aCkgPT0gMCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfSBlbHNlIHsKLQkJCQlJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGNvbmZpZyA9IGdldENvbmZpZ3VyYXRpb25IaXN0b3J5TW9kZWwoKVtpbmRleCAtIDFdOwotCQkJCWNvbmZpZy5zZXRDdXJyZW50KHRydWUpOwotCQkJCXNldEN1cnJlbnRDb25maWd1cmF0aW9uTW9kZWwoY29uZmlnKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElJbnN0YWxsQ29uZmlndXJhdGlvbikgZ2V0Q3VycmVudENvbmZpZ3VyYXRpb25Nb2RlbCgpOwotCX0KLQotCS8qCi0JICogQHNlZSBJTG9jYWxTaXRlI2dldFByZXNlcnZlZENvbmZpZ3VyYXRpb25zKCkKLQkgKi8KLQlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uW10gZ2V0UHJlc2VydmVkQ29uZmlndXJhdGlvbnMoKSB7Ci0JCWlmIChnZXRQcmVzZXJ2ZWRDb25maWd1cmF0aW9uc01vZGVsKCkubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbmV3IElJbnN0YWxsQ29uZmlndXJhdGlvblswXTsKLQkJcmV0dXJuIChJSW5zdGFsbENvbmZpZ3VyYXRpb25bXSkgZ2V0UHJlc2VydmVkQ29uZmlndXJhdGlvbnNNb2RlbCgpOwotCX0KLQotCS8qCi0JICogQHNlZSBJTG9jYWxTaXRlI3JlbW92ZUZyb21QcmVzZXJ2ZWRDb25maWd1cmF0aW9ucyhJSW5zdGFsbENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRnJvbVByZXNlcnZlZENvbmZpZ3VyYXRpb25zKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCWlmIChyZW1vdmVQcmVzZXJ2ZWRDb25maWd1cmF0aW9uTW9kZWwoKEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwpIGNvbmZpZ3VyYXRpb24pKQotCQkJICgoSW5zdGFsbENvbmZpZ3VyYXRpb24pIGNvbmZpZ3VyYXRpb24pLnJlbW92ZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBJTG9jYWxTaXRlI2dldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uW10gZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKSB7Ci0JCWlmIChnZXRDb25maWd1cmF0aW9uSGlzdG9yeU1vZGVsKCkubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbmV3IElJbnN0YWxsQ29uZmlndXJhdGlvblswXTsKLQkJcmV0dXJuIChJSW5zdGFsbENvbmZpZ3VyYXRpb25bXSkgZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnlNb2RlbCgpOwotCX0KLQotCi0JLyoqCi0JICogR2V0cyB0aGUgaXNUcmFuc2llbnQuCi0JICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVHJhbnNpZW50KCkgewotCQlyZXR1cm4gaXNUcmFuc2llbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaXNUcmFuc2llbnQuCi0JICogQHBhcmFtIGlzVHJhbnNpZW50IFRoZSBpc1RyYW5zaWVudCB0byBzZXQKLQkgKi8KLQlwcml2YXRlIHZvaWQgaXNUcmFuc2llbnQoYm9vbGVhbiBpc1RyYW5zaWVudCkgewotCQl0aGlzLmlzVHJhbnNpZW50ID0gaXNUcmFuc2llbnQ7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFNpdGVTdGF0dXNBbmFseXplciBnZXRTaXRlU3RhdHVzQW5hbHl6ZXIoKSB7Ci0JCWlmIChzaXRlU3RhdHVzQW5hbHl6ZXIgPT0gbnVsbCkKLQkJCXNpdGVTdGF0dXNBbmFseXplciA9IG5ldyBTaXRlU3RhdHVzQW5hbHl6ZXIodGhpcyk7Ci0JCXJldHVybiBzaXRlU3RhdHVzQW5hbHl6ZXI7Ci0JfQotCi0JLyoKLQkgKiAgY2hlY2sgaWYgdGhlIFBsdWdpbnMgb2YgdGhlIGZlYXR1cmUgYXJlIG9uIHRoZSBwbHVnaW4gcGF0aAotCSAqICBJZiBhbGwgdGhlIHBsdWdpbnMgYXJlIG9uIHRoZSBwbHVnaW4gcGF0aCwgYW5kIHRoZSB2ZXJzaW9uIG1hdGNoIGFuZCB0aGVyZSBpcyBubyBvdGhlciB2ZXJzaW9uIC0+IEhBUFBZCi0JICogIElmIGFsbCB0aGUgcGx1Z2lucyBhcmUgb24gdGhlIHBsdWdpbiBwYXRoLCBhbmQgdGhlIHZlcnNpb24gbWF0Y2ggYW5kIHRoZXJlIGlzIG90aGVyIHZlcnNpb24gLT4gQU1CSUdVT1VTCi0JICogIElmIHNvbWUgb2YgdGhlIHBsdWdpbnMgYXJlIG9uIHRoZSBwbHVnaW4gcGF0aCwgYnV0IG5vdCBhbGwgLT4gVU5IQVBQWQotCSAqIAlDaGVjayBvbiBhbGwgQ29uZmlndXJlZFNpdGVzCi0JICovCi0JcHVibGljIElTdGF0dXMgZ2V0RmVhdHVyZVN0YXR1cyhJRmVhdHVyZSBmZWF0dXJlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRTaXRlU3RhdHVzQW5hbHl6ZXIoKS5nZXRGZWF0dXJlU3RhdHVzKGZlYXR1cmUpOwotCX0gCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWwuU2l0ZUxvY2FsTW9kZWwjc2V0TWF4aW11bUhpc3RvcnlDb3VudChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWF4aW11bUhpc3RvcnlDb3VudChpbnQgaGlzdG9yeSkgewotCQlzdXBlci5zZXRNYXhpbXVtSGlzdG9yeUNvdW50KGhpc3RvcnkpOwotCQl0cmltSGlzdG9yeVRvQ2FwYWNpdHkoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvTG9ja01hbmFnZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvTG9ja01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFhYmU1ZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0xvY2tNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi0vKioKLSAqIEBhdXRob3IgYW5pZWZlcgotICoKLSAqLwotcHVibGljIGNsYXNzIExvY2tNYW5hZ2VyIHsKLQkvLyBsb2NrCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgT2JqZWN0IGxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0KLQkvLyBoYXNodGFibGUgb2YgbG9ja3MKLQlwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgbG9ja3MgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0TG9jayhTdHJpbmcga2V5KSB7Ci0JCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJaWYgKGxvY2tzLmdldChrZXkpID09IG51bGwpCi0JCQkJbG9ja3MucHV0KGtleSwga2V5KTsKLQkJCXJldHVybiBsb2Nrcy5nZXQoa2V5KTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmV0dXJuTG9jayhTdHJpbmcga2V5KSB7Ci0JCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJbG9ja3MucmVtb3ZlKGtleSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL01lc3NhZ2VzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZTMyNWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2VTaXRlRmFjdG9yeV9DYW5ub3RSZXRyaXZlUGFyZW50RGlyZWN0b3J5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRSZWZlcmVuY2VfVW5hYmxlVG9DcmVhdGVJbnB1dFN0cmVhbTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50UmVmZXJlbmNlX1VuYWJsZVRvUmV0dXJuUmVmZXJlbmNlQXNGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRSZWZlcmVuY2VfVW5hYmxlVG9SZXR1cm5SZWZlcmVuY2VBc1VSTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50UmVmZXJlbmNlX0h0dHBOb2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudFJlZmVyZW5jZV9GaWxlRG9lc05vdEV4aXN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVfU2l0ZUFscmVhZHlTZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZV9UYXNrSW5zdGFsbEZlYXR1cmVGaWxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlX1Rhc2tJbnN0YWxsUGx1Z2luRmlsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZV9Ob0NvbnRlbnRQcm92aWRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlX05vRmVhdHVyZUNvbnRlbnRDb25zdW1lcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlX05vVVJMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVfRmVhdHVyZVZlcnNpb25Ub1N0cmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlX0luc3RhbGxhdGlvbkNhbmNlbGxlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlX1VuYWJsZVRvSW5pdGlhbGl6ZUZlYXR1cmVSZWZlcmVuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUNvbnRlbnRQcm92aWRlcl9Eb3dubG9hZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlQ29udGVudFByb3ZpZGVyX1VuYWJsZVRvUmV0cmlldmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUNvbnRlbnRQcm92aWRlcl9VbmFibGVUb0NyZWF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlQ29udGVudFByb3ZpZGVyX0V4Y2VwdGlvbkRvd25sb2FkaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxIYW5kbGVyX3VuYWJsZVRvQ3JlYXRlSGFuZGxlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsSGFuZGxlcl9ub3RGb3VuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsSGFuZGxlcl9pbnZhbGlkSGFuZGxlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsSGFuZGxlcl9jYWxsRXhjZXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxIYW5kbGVyX2Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxNb25pdG9yX0Rvd25sb2FkU2l6ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsTW9uaXRvcl9Eb3dubG9hZFNpemVMb25nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2R1Y3RQcm92aWRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJDb250ZW50UmVmZXJlbmNlX1VucGFja2luZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlX0Nhbm5vdEZpbmRDYXRlZ29yeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlX05vQ2F0ZWdvcmllczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlX05vQ29udGVudFByb3ZpZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZlcnNpb25lZElkZW50aWZpZXJfSWRPclZlcnNpb25OdWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVGaWxlX0Nhbm5vdFJlbW92ZVBsdWdpbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlRmlsZV9DYW5ub3RSZW1vdmVGZWF0dXJlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVGaWxlX1VuYWJsZVRvQ3JlYXRlVVJMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVGaWxlX1JlbW92aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVGaWxlRmFjdG9yeV9VbmFibGVUb0NyZWF0ZVVSTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlRmlsZUZhY3RvcnlfVW5hYmxlVG9BY2Nlc3NTaXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVGaWxlRmFjdG9yeV9EaXJlY3RvcnlEb2VzTm90RXhpc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEZlYXR1cmVQYXJzZXJfbG9jYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEZlYXR1cmVQYXJzZXJfTm9GZWF0dXJlVGFnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRGZWF0dXJlUGFyc2VyX1dyb25nUGFyc2luZ1N0YWNrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRGZWF0dXJlUGFyc2VyX1Vua25vd25FbGVtZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRGZWF0dXJlUGFyc2VyX1Rvb01hbnlVUkx0YWc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEZlYXR1cmVQYXJzZXJfVW5rbm93blN0YXJ0U3RhdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEZlYXR1cmVQYXJzZXJfSWRPclZlcnNpb25JbnZhbGlkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRGZWF0dXJlUGFyc2VyX01pc3NpbmdJZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RmVhdHVyZVBhcnNlcl9QYXJzaW5nU3RhY2tCYWNrVG9Jbml0aWFsU3RhdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEZlYXR1cmVQYXJzZXJfRWxlbWVudEFscmVhZHlTZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEZlYXR1cmVQYXJzZXJfU3RhdGVJbmNsdWRlV3JvbmdFbGVtZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRGZWF0dXJlUGFyc2VyX1JlcXVpcmVTdGF0ZVdpdGhvdXRJbXBvcnRFbGVtZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRGZWF0dXJlUGFyc2VyX01pc3NpbmdQYXRjaFZlcnNpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEZlYXR1cmVQYXJzZXJfd3JvbmdNYXRjaEZvclBhdGNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRGZWF0dXJlUGFyc2VyX3BhdGNoV2l0aFBsdWdpbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RmVhdHVyZVBhcnNlcl9NdWx0aXBsZVBhdGNoSW1wb3J0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RmVhdHVyZVBhcnNlcl9Vbmtub3duRW5kU3RhdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEZlYXR1cmVQYXJzZXJfRXJyb3JQYXJzaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRGZWF0dXJlUGFyc2VyX0Vycm9ybGluZUNvbHVtbk1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEZlYXR1cmVQYXJzZXJfRXJyb3JQYXJzaW5nRmVhdHVyZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RmVhdHVyZVBhcnNlcl9Vbmtub3duU3RhdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEZlYXR1cmVQYXJzZXJfTm9MaWNlbnNlVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RmVhdHVyZVBhcnNlcl9QbHVnaW5BbmRGZWF0dXJlSWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUNvbnRlbnRQcm92aWRlcl9FcnJvckNyZWF0aW5nVVJMRm9yQXJjaGl2ZUlEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRTaXRlUGFyc2VyX05vU2l0ZVRhZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0U2l0ZVBhcnNlcl9Xcm9uZ1BhcnNpbmdTdGFjazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0U2l0ZVBhcnNlcl9Vbmtub3duRWxlbWVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0U2l0ZVBhcnNlcl9Vbmtub3duU3RhcnRTdGF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0U2l0ZVBhcnNlcl9NaXNzaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRTaXRlUGFyc2VyX1BhcnNpbmdTdGFja0JhY2tUb0luaXRpYWxTdGF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0U2l0ZVBhcnNlcl9FbGVtZW50QWxyZWFkeVNldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0U2l0ZVBhcnNlcl9Vbmtub3duRW5kU3RhdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfRXJyb3JQYXJzaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRTaXRlUGFyc2VyX0Vycm9ybGluZUNvbHVtbk1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfRXJyb3JQYXJzaW5nU2l0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0U2l0ZVBhcnNlcl9Vbmtub3duU3RhdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfSW52YWxpZFhNTFN0cmVhbTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb2RlbE9iamVjdF9Nb2RlbFJlYWRPbmx5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVNb2RlbE9iamVjdF9FcnJvclBhcnNpbmdTaXRlU3RyZWFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVNb2RlbE9iamVjdF9FcnJvckFjY2Vzc2luZ1NpdGVTdHJlYW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbENvbmZpZ3VyYXRpb25fRXJyb3JEdXJpbmdGaWxlQWNjZXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxDb25maWd1cmF0aW9uUGFyc2VyX0ZlYXR1cmVSZWZlcmVuY2VOb1VSTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcl9GaWxlRG9lc05vdEV4aXN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyX0ludmFsaWREaXJlY3Rvcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXJfVW5hYmxlVG9DcmVhdGVVUkxGb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXJfVW5hYmxlVG9SZXRyaWV2ZU5vblBsdWdpbkVudHJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyX1VuYWJsZVRvUmV0cmlldmVGZWF0dXJlRW50cnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXJfVW5hYmxlVG9SZXRyaWV2ZVBsdWdpbkVudHJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyZWRTaXRlX05vbkluc3RhbGxhYmxlU2l0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmVkU2l0ZV9OdWxsRmVhdHVyZVRvSW5zdGFsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmVkU2l0ZV9Ob25Vbmluc3RhbGxhYmxlU2l0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmVkU2l0ZV9Ob1NpdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJlZFNpdGVfQ2Fubm90RmluZEZlYXR1cmVUb1VuY29uZmlndXJlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyZWRTaXRlX0Nhbm5vdEZpbmRGZWF0dXJlVG9Db25maWd1cmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJlZFNpdGVfQ2Fubm90RmluZFBsdWdpbkVudHJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyZWRTaXRlX01pc3NpbmdQbHVnaW5zQnJva2VuRmVhdHVyZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmVkU2l0ZV9VbmFibGVUb1JlbW92ZUNvbmZpZ3VyZWRGZWF0dXJlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyZWRTaXRlX1VuYWJsZVRvRmluZEZlYXR1cmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJlZFNpdGVfU2l0ZVVSTE51bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJlZFNpdGVfTm9uTG9jYWxTaXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyZWRTaXRlX05vdFNhbWVQcm9kdWN0SWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJlZFNpdGVfQ29udGFpbmVkSW5Bbm90aGVyU2l0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmVkU2l0ZV9SZWFkT25seVNpdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJlZFNpdGVfVW5hYmxlUmVzb2x2ZVVSTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmVkU2l0ZV9VbmFibGVUb0FjY2Vzc1NpdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUZhY3RvcnlfQ3JlYXRpbmdFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlTW9kZWxGYWN0b3J5X0Vycm9yQWNjZXNpbmdGZWF0dXJlU3RyZWFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVFeGVjdXRhYmxlRmFjdG9yeV9OdWxsVVJMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVFeGVjdXRhYmxlRmFjdG9yeV9DYW5ub3RDcmVhdGVVUkw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyX05vTWFuaWZlc3RGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlcl9JbnZhbGlkRGlyZWN0b3J5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlcl9FcnJvclJldHJpZXZpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZVJlZmVyZW5jZV9VbmFibGVUb1Jlc29sdmVVUkw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZVR5cGVGYWN0b3J5X1VuYWJsZVRvRmluZEZlYXR1cmVGYWN0b3J5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxDb25maWd1cmF0aW9uX1VuYWJsZVRvQ3JlYXRlVVJMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxDb25maWd1cmF0aW9uX1VuYWJsZVRvQ2FzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsQ29uZmlndXJhdGlvbl9VbmFibGVUb1NhdmVQbGF0Zm9ybUNvbmZpZ3VyYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbENvbmZpZ3VyYXRpb25fQWxyZWFkeU5hdGl2ZWx5TGlua2VkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxDb25maWd1cmF0aW9uX0FscmVhZHlQcm9kdWN0U2l0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsQ29uZmlndXJhdGlvbl91bmFibGVUb0ZpbmRTaXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludGVybmFsU2l0ZU1hbmFnZXJfVW5hYmxlVG9DcmVhdGVTaXRlV2l0aFR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW50ZXJuYWxTaXRlTWFuYWdlcl9VbmFibGVUb0FjY2Vzc1VSTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnRlcm5hbFNpdGVNYW5hZ2VyX1VuYWJsZVRvQ3JlYXRlVVJMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludGVybmFsU2l0ZU1hbmFnZXJfRmFpbGVkUmV0cnlBY2Nlc3NpbmdTaXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludGVybmFsU2l0ZU1hbmFnZXJfQ29ubmVjdGluZ1RvU2l0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHbG9iYWxDb25zdW1lcl9FcnJvckNyZWF0aW5nRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlRmlsZUNvbnRlbnRDb25zdW1lcl9VbmFibGVUb0NyZWF0ZVVSTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlRmlsZUNvbnRlbnRDb25zdW1lcl9VbmFibGVUb0NyZWF0ZVVSTEZvckZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUZpbGVDb250ZW50Q29uc3VtZXJfdW5hYmxlVG9EZWxldGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudENvbnN1bWVyX1VuYWJsZVRvUmVuYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVGaWxlRmFjdG9yeV9VbmFibGVUb09idGFpblBhcmVudERpcmVjdG9yeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlRmlsZUZhY3RvcnlfRmlsZURvZXNOb3RFeGlzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlRmlsZUZhY3RvcnlfVW5hYmxlVG9DcmVhdGVVUkxGb3JGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVGaWxlRmFjdG9yeV9FcnJvclBhcnNpbmdGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVGaWxlRmFjdG9yeV9FcnJvckFjY2Vzc2luZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlVHlwZUZhY3RvcnlfVW5hYmxlVG9GaW5kU2l0ZUZhY3Rvcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRlTWFuYWdlclV0aWxzX1VuYWJsZVRvUmVtb3ZlRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVNYW5hZ2VyVXRpbHNfRmlsZUFscmVhZHlFeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUxvY2FsX1VuYWJsZVRvQ3JlYXRlVVJMRm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVMb2NhbF9VbmFibGVUb0RldGVybWluZUZlYXR1cmVTdGF0dXNTaXRlTnVsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlTG9jYWxfVHdvVmVyc2lvblNhbWVQbHVnaW4xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVMb2NhbF9Ud29WZXJzaW9uU2FtZVBsdWdpbjI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUxvY2FsX0ZlYXR1cmVVbkhhcHB5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVMb2NhbF9GZWF0dXJlSGFwcHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUxvY2FsX0ZlYXR1cmVBbWJpZ3VvdXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUxvY2FsX05lc3RlZEZlYXR1cmVVbkhhcHB5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVMb2NhbF9OZXN0ZWRGZWF0dXJlVW5hdmFpbGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUxvY2FsX05vUGx1Z2luVmVyc2lvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlTG9jYWxfVW5hYmxlVG9EZXRlcm1pbmVGZWF0dXJlU3RhdHVzQ29uZmlndXJlZFNpdGVOdWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVMb2NhbF9GZWF0dXJlRGlzYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlTG9jYWxfRmVhdHVyZVN0YXR1c1Vua25vd247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUxvY2FsX05lc3RlZEZlYXR1cmVEaXNhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVVUkxGYWN0b3J5X1VuYWJsZVRvQ3JlYXRlVVJMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVVUkxGYWN0b3J5X1VuYWJsZVRvQWNjZXNzU2l0ZVN0cmVhbTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmllcl9WZXJpZnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpZXJfVW5hYmxlVG9GaW5kRW5jcnlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmllcl9VbmFibGVUb0xvYWRDZXJ0aWZpY2F0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmllcl9VbmFibGVUb0ZpbmRQcm92aWRlckZvcktleXN0b3JlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWVyX0tleVN0b3JlTm90TG9hZGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWVyX1VuYWJsZVRvQWNjZXNzSmFyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWVyX0ludmFsaWRGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWVyX0ludmFsaWRKYXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uUmVzdWx0X1ZhbGlkQmV0d2VlbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25SZXN1bHRfRXhwaXJlZENlcnRpZmljYXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvblJlc3VsdF9DZXJ0aWZpY2F0ZU5vdFlldFZhbGlkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvblJlc3VsdF9DZXJ0aWZpY2F0ZVZhbGlkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvblNlcnZpY2VfVW5zdWNlc3NmdWxWZXJpZmljYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uU2VydmljZV9DYW5jZWxJbnN0YWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwZGF0ZU1hbmFnZXJVdGlsc19VbmFibGVUb0xvZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25uZWN0aW9uVGhyZWFkTWFuYWdlcl90b29NYW55Q29ubmVjdGlvbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29ubmVjdGlvblRocmVhZE1hbmFnZXJfdW5yZXNwb25zaXZlVVJMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZV9mZWF0dXJlVW5pbnN0YWxsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlDb25zdHJhaW50c193YXJuaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5Q29uc3RyYWludHNfcm9vdE1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlDb25zdHJhaW50c19yb290TWVzc2FnZUluaXRpYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlDb25zdHJhaW50c19iZWZvcmVNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5Q29uc3RyYWludHNfYWZ0ZXJNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5Q29uc3RyYWludHNfcGxhdGZvcm07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlDb25zdHJhaW50c19wcmltYXJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5Q29uc3RhaW50c19wcmVyZXFfcGx1Z2luOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5Q29uc3RhaW50c19wcmVyZXFfZmVhdHVyZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eUNvbnN0cmFpbnRzX3ByZXJlcTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eUNvbnN0cmFpbnRzX3ByZXJlcVBlcmZlY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlDb25zdHJhaW50c19wcmVyZXFFcXVpdmFsZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5Q29uc3RyYWludHNfcHJlcmVxQ29tcGF0aWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eUNvbnN0cmFpbnRzX3ByZXJlcUdyZWF0ZXJPckVxdWFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5Q29uc3RyYWludHNfb3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlDb25zdHJhaW50c193czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eUNvbnN0cmFpbnRzX2FyY2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlDb25zdHJhaW50c19jeWNsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eUNvbnN0cmFpbnRzX2NoaWxkTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eUNvbnN0cmFpbnRzX29wdGlvbmFsQ2hpbGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlDb25zdHJhaW50c19leGNsdXNpdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlDb25zdHJhaW50c19ub0xpY2Vuc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlDb25zdHJhaW50c19yZWFkT25seTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eUNvbnN0cmFpbnRzX3BsYXRmb3JtTW9kaWZpZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nX2NvbmZsaWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZXJhdGlvbnNNYW5hZ2VyX2Vycm9yX29sZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVyYXRpb25zTWFuYWdlcl9pbnN0YWxsaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZXJhdGlvbnNNYW5hZ2VyX2Vycm9yX3VuaW5zdGFsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWFyY2hfbmV0d29ya1Byb2JsZW1zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxDb25maWd1cmF0aW9uX2xvY2F0aW9uX2V4aXN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsTG9nUGFyc2VyX2Vycm9yczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlTG9jYWxfY2xvbmVDb25maWc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRlTWFuYWdlclV0aWxzX2lucHV0U3RyZWFtRW5kZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRlU2VhcmNoUmVxdWVzdF9sb2FkaW5nUG9saWN5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwZGF0ZU1hbmFnZXJVdGlsc19jb3B5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwZGF0ZVBvbGljeV9wYXJzZVBvbGljeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVQb2xpY3lfcG9saWN5RXhwZWN0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRlU2VhcmNoUmVxdWVzdF9zZWFyY2hpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRlU2VhcmNoUmVxdWVzdF9jb250YWN0aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwZGF0ZVNlYXJjaFJlcXVlc3RfY2hlY2tpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRlUG9saWN5X2ludmFsaWRVUkw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRlUG9saWN5X25hbWVOb051bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRlUG9saWN5X1VwZGF0ZVBvbGljeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlRmlsZV9mZWF0dXJlTm90UmVtb3ZlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlRmlsZV9wbHVnaW5Ob3RSZW1vdmVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVycm9yUmVjb3ZlcnlMb2dfbm9GaWxldG9SZW1vdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRlc1NlYXJjaENhdGVnb3J5X2Vycm9yU2VhcmNoaW5nRm9yVXBkYXRlczsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBVbmluc3RhbGxDb21tYW5kX2ZlYXR1cmVOb3RJbnN0YWxsZWRCeVVNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YW5kYWxvbmVfc2l0ZUNvbmZpZ3VyZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhbmRhbG9uZV9ub1NpdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhbmRhbG9uZV9ub1NpdGUzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YW5kYWxvbmVfbm9Db25maWd1cmVkU2l0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFuZGFsb25lX2luc3RhbGxpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhbmRhbG9uZV9ub3RGb3VuZE9yTmV3ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhbmRhbG9uZV9kdXBsaWNhdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhbmRhbG9uZV9pbnN0YWxsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhbmRhbG9uZV9jYW5ub3RJbnN0YWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YW5kYWxvbmVfbm9GZWF0dXJlczE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhbmRhbG9uZV9ub0ZlYXR1cmVzMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFuZGFsb25lX25vRmVhdHVyZXMzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YW5kYWxvbmVfbm9GZWF0dXJlczQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhbmRhbG9uZV9ub0NvbmZpZ1NpdGVGb3JGZWF0dXJlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YW5kYWxvbmVfaW52YWxpZENtZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFuZGFsb25lX2Nvbm5lY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhbmRhbG9uZV9zZWFyY2hpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhbmRhbG9uZV9jbWRGYWlsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhbmRhbG9uZV9jbWRGYWlsZWROb0xvZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFuZGFsb25lX2NtZENvbXBsZXRlV2l0aEVycm9yczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFuZGFsb25lX2NtZE9LOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YW5kYWxvbmVfdXBkYXRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhbmRhbG9uZV9ub1VwZGF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdGFuZGFsb25lX3VwZGF0ZWQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUZpbGVQbHVnaW5Db250ZW50Q29uc3VtZXJfdW5hYmxlVG9EZWxldGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUZpbGVQYWNrZWRQbHVnaW5Db250ZW50Q29uc3VtZXJfdW5hYmxlVG9EZWxldGU7CQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEh0dHBSZXNwb25zZV9yYW5nZUV4cGVjdGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEh0dHBSZXNwb25zZV93cm9uZ1JhbmdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRTaXRlUGFyc2VyX21pcnJvcnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXJfVW5hYmxlVG9SZXRyaXZlQXJjaGl2ZUNvbnRlbnRSZWY7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyUHJvY2Vzc29yX3VucGFja05vdEZvdW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclByb2Nlc3Nvcl9ub1BhY2tVbnBhY2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyUHJvY2Vzc29yX3BhY2tOb3RGb3VuZDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlT3B0aW1pemVyX2lucHV0Tm90U3BlY2lmaWVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVPcHRpbWl6ZXJfaW5wdXRGaWxlTm90Rm91bmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUNhdGVnb3J5X290aGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVDYXRlZ29yeV9vdGhlcl9kZXNjcmlwdGlvbjsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsQ29tbWFuZF9zaXRlOwotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Ob25QbHVnaW5FbnRyeUNvbnRlbnRDb25zdW1lci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Ob25QbHVnaW5FbnRyeUNvbnRlbnRDb25zdW1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDQwMTg4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvTm9uUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi0vKioKLSAqIENvbnRlbnRDb25zdW1lciBmb3IgYSBub24gcGx1Z2luIGVudHJ5IG9mIGEgZmVhdHVyZQotICovCi0KLXB1YmxpYyBjbGFzcyBOb25QbHVnaW5FbnRyeUNvbnRlbnRDb25zdW1lciBleHRlbmRzIENvbnRlbnRDb25zdW1lciB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2xvc2VkID0gZmFsc2U7Ci0KLQlwcml2YXRlIElDb250ZW50Q29uc3VtZXIgY29udGVudENvbnN1bWVyOwotCQkKLQkvKgotCSAqIENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIE5vblBsdWdpbkVudHJ5Q29udGVudENvbnN1bWVyKElDb250ZW50Q29uc3VtZXIgY29udGVudENvbnN1bWVyKXsKLQkJdGhpcy5jb250ZW50Q29uc3VtZXIgPSBjb250ZW50Q29uc3VtZXI7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENvbnRlbnRDb25zdW1lciNzdG9yZShDb250ZW50UmVmZXJlbmNlLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3JlKENvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICghY2xvc2VkKXsKLQkJCWNvbnRlbnRDb25zdW1lci5zdG9yZSggY29udGVudFJlZmVyZW5jZSxtb25pdG9yKTsKLQkJfSBlbHNlIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiQXR0ZW1wdCB0byBzdG9yZSBpbiBhIGNsb3NlZCBOb25QbHVnaW5FbnRyeUNvbnRlbnRDb25zdW1lciIsbmV3IEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENvbnRlbnRDb25zdW1lciNjbG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAgewotCQlpZiAoIWNsb3NlZCl7Ci0JCQljbG9zZWQgPSB0cnVlOwotCQkJY29udGVudENvbnN1bWVyLmNsb3NlKCk7Ci0JCX0gZWxzZSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHQgdG8gY2xvc2UgYSBjbG9zZWQgTm9uUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIiLG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9OdWxsQ29udGVudFJlZmVyZW5jZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9OdWxsQ29udGVudFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjNmYTFkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvTnVsbENvbnRlbnRSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQ29udGVudFJlZmVyZW5jZTsKLQotLyoqCi0gKiBOdWxsQ29udGVudFJlZmVyZW5jZSBpbXBsZW1lbnRzIGEgZ2VuZXJhbCBhY2Nlc3Mgd3JhcHBlciAKLSAqIHRvIGZlYXR1cmUgYW5kIHNpdGUgY29udGVudCAtLSBidXQsIGZvciB3aGljaCwgdGhlcmUgaXMgbm8gCi0gKiBjb250ZW50IGFjdHVhbGx5IGZvdW5kLiBUaGlzIHdheSwgaXQgY2FuICJrZWVwIiB0aGUgSUQgdGhhdCB3YXMgCi0gKiByZXF1ZXN0ZWQsIGFuZCBzdGlsbCBob2xkIGEgcGxhY2UgaW4gbGlzdHMgYW5kIGFycmF5cywgd2l0aG91dCBhIAotICogY2hhbmdlIHRvIG90aGVyIHByb2dyYW0gbG9naWMuIEl0IGRvZXMsIGhvdyBldmVyIHJlcXVpcmUgdGhlIGludGVybmFsCi0gKiBhbGdvcml0aG1zIHRvIGJlIG1vcmUgY2FyZWZ1bCBhYm91dCBhc3N1bXB0aW9ucyBtYWRlIC4uLiBmb3IgZXhhbXBsZSwgCi0gKiBqdXN0IGJlY2F1c2UgYXNGaWxlIGlzIG51bGwsIGl0IGRvZXMgbm90IGZvbGxvdyB0aGF0IGFzVVJMIHdpbGwgbm90IGJlIG51bGwuIAotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4gCi0gKiA8L3A+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkNvbnRlbnRSZWZlcmVuY2UKLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSmFyQ29udGVudFJlZmVyZW5jZQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5KYXJFbnRyeUNvbnRlbnRSZWZlcmVuY2UKLSAqLwotcHVibGljIGNsYXNzIE51bGxDb250ZW50UmVmZXJlbmNlIGV4dGVuZHMgQ29udGVudFJlZmVyZW5jZSB7Ci0KLQotCS8qKgotCSAqIENvbnRydWN0b3IgZm9yIHRoZSAibWlzc2luZyBqYXIiIGNhc2UuIAotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqLwotCXB1YmxpYyBOdWxsQ29udGVudFJlZmVyZW5jZShTdHJpbmcgaWQpIHsKLQkJc3VwZXIoaWQsIChGaWxlKSBudWxsKTsKLQl9Ci0JLyoqCi0JICogQSBmYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBjb250ZW50IHJlZmVyZW5jZSBvZgotCSAqIHRoZSBzYW1lIHR5cGUuCi0JICogCi0JICogQHBhcmFtIGlkICJzeW1ib2xpYyIgcGF0aCBpZGVudGlmaWVyCi0JICovCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2UgY3JlYXRlQ29udGVudFJlZmVyZW5jZShTdHJpbmcgaWQsIEZpbGUgZmlsZSkgewotCQlyZXR1cm4gbmV3IE51bGxDb250ZW50UmVmZXJlbmNlKGlkKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZXMgc3VwZXIgY2xhc3MgaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgdGhyb3dpbmcgYSBGaWxlTm90Rm91bmQgZXhjZXB0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gbnVsbAotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBPdmVycmlkZXMgc3VwZXIgY2xhc3MgaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgdGhyb3dpbmcgYSBGaWxlTm90Rm91bmQgZXhjZXB0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gbnVsbAotCSAqLwotCXB1YmxpYyBGaWxlIGFzRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOyAKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZXMgc3VwZXIgY2xhc3MgaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgdGhyb3dpbmcgVVJMIGV4Y2VwdGlvbnMuCi0JICogCi0JICogQHJldHVybiBudWxsCi0JICovCi0JcHVibGljIFVSTCBhc1VSTCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJNaXNzaW5nIGFyY2hpdmUgZmlsZTogIiArICcoJyArIGdldElkZW50aWZpZXIoKSArICcpJzsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvUGF0Y2hlZEZlYXR1cmUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvUGF0Y2hlZEZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM5ZGFlOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1BhdGNoZWRGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci0vKioKLSAqIEZlYXR1cmUgYW5kIGNvcnJlc3BvbmRpbmcgcGF0Y2ggZmVhdHVyZXMKLSAqLwotcHVibGljIGNsYXNzIFBhdGNoZWRGZWF0dXJlIHsKLQlwcml2YXRlIElGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmU7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIHBhdGNoZXMgPSBuZXcgSGFzaFNldCgpOwotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgUGF0Y2hlZEZlYXR1cmUoSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCX0KLQlwdWJsaWMgdm9pZCBhZGRQYXRjaChJRmVhdHVyZVJlZmVyZW5jZSBwYXRjaCkgewotCQlwYXRjaGVzLmFkZChwYXRjaCk7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZmVhdHVyZS4KLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgZ2V0RmVhdHVyZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGF0Y2hlcy4KLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRQYXRjaGVzKCkgewotCQlyZXR1cm4gKElGZWF0dXJlUmVmZXJlbmNlW10pIHBhdGNoZXMudG9BcnJheShuZXcgSUZlYXR1cmVSZWZlcmVuY2VbcGF0Y2hlcy5zaXplKCldKTsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmZWF0dXJlIGFuZCB0aGUgcGF0Y2hlcy4KLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRGZWF0dXJlQW5kUGF0Y2hlcygpIHsKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcyA9IG5ldyBJRmVhdHVyZVJlZmVyZW5jZVtwYXRjaGVzLnNpemUoKSArIDFdOwotCQlmZWF0dXJlc1swXSA9IGZlYXR1cmU7Ci0JCVN5c3RlbS5hcnJheWNvcHkoZ2V0UGF0Y2hlcygpLCAwLCBmZWF0dXJlcywgMSwgcGF0Y2hlcy5zaXplKCkpOwotCQlyZXR1cm4gZmVhdHVyZXM7Ci0JfQotCS8qKgotCSAqIE9idGFpbnMgYWxsIHBsdWdpbnMgZnJvbSB0aGUgZmVhdHVyZSBhbmQgaXRzIHBhdGNoZXMuIEVhY2ggcGx1Z2luIHdpbGwKLQkgKiBoYXZlIHVuaXF1ZSBJRC4KLQkgKiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgdmVyc2lvbiBvZiBwbHVnaW4gd2l0aCBzYW1lIElEIGFtb25nIHRoZSBmZWF0dXJlCi0JICogYW5kIGl0cyBwYXRjaGVzLCBoaWdoZXN0IHZlcnNpb24gcGx1Z2lucyBhcmUgY2hvc2VuLgotCSAqIAotCSAqIEByZXR1cm4gRmVhdHVyZVBsdWdpbltdCi0JICovCi0JcHVibGljIEZlYXR1cmVQbHVnaW5bXSBnZXRQbHVnaW5zKCkgewotCQkvLyBVc2UgYSBtYXAgb2YgUGF0Y2hlZFBsdWlnbnMgYnkgcGx1Z2luIElECi0JCS8vIHRvIGNvbGxlY3Qgb25lIHZlcnNpb24gb2YgZWFjaCBwbHVnaW4KLQkJTWFwIHBsdWdpbnMgPSBuZXcgSGFzaE1hcCgpOwotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVSZWZzID0gZ2V0RmVhdHVyZUFuZFBhdGNoZXMoKTsKLQkJLy8gZm9yIGVhY2ggKGZlYXR1cmUgb3IgYW55IHBhdGNoKQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBmZWF0dXJlUmVmc1tpXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCQkJVXBkYXRlQ29yZS53YXJuKCJOdWxsIEZlYXR1cmUiLCBuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkvLyBnZXQgcGx1Z2luIGVudHJpZXMKLQkJCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gZmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCQkJZm9yIChpbnQgZW50ciA9IDA7IGVudHIgPCBlbnRyaWVzLmxlbmd0aDsgZW50cisrKSB7Ci0JCQkJCVN0cmluZyBwbHVnaW5JZCA9IGVudHJpZXNbZW50cl0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKTsKLQkJCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgcGx1Z2luVmVyc2lvbiA9IGVudHJpZXNbZW50cl0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKTsKLQkJCQkJLy8gY2hlY2sgaWYgbWFwIGNvbnRhaW5zID49IHZlcnNpb24gb2Ygc2FtZSBwbHVnaW4KLQkJCQkJRmVhdHVyZVBsdWdpbiBleGlzdGluZ1BsdWdpbiA9IChGZWF0dXJlUGx1Z2luKSBwbHVnaW5zLmdldChwbHVnaW5JZCk7Ci0JCQkJCWlmIChleGlzdGluZ1BsdWdpbiAhPSBudWxsICYmIGV4aXN0aW5nUGx1Z2luLmdldEVudHJ5KCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS5pc0dyZWF0ZXJPckVxdWFsVG8ocGx1Z2luVmVyc2lvbikpIHsKLQkJCQkJCS8vIHNhbWUgb3IgbmV3ZXIgcGx1Z2luIGFscmVhZHkgY29sbGVjdGVkCi0JCQkJCQljb250aW51ZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXBsdWdpbnMucHV0KHBsdWdpbklkLCBuZXcgRmVhdHVyZVBsdWdpbihlbnRyaWVzW2VudHJdLCBmZWF0dXJlKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlVcGRhdGVDb3JlLndhcm4obnVsbCwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChGZWF0dXJlUGx1Z2luW10pIHBsdWdpbnMudmFsdWVzKCkudG9BcnJheShuZXcgRmVhdHVyZVBsdWdpbltwbHVnaW5zLnNpemUoKV0pOwotCX0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc3RyID0gbmV3IFN0cmluZ0J1ZmZlcihmZWF0dXJlLnRvU3RyaW5nKCkpOwotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHBhdGNoZXMgPSBnZXRGZWF0dXJlQW5kUGF0Y2hlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhdGNoZXMubGVuZ3RoOyBpKyspIHsKLQkJCXN0ci5hcHBlbmQoIiArcGF0Y2g9IiArIHBhdGNoZXNbaV0udG9TdHJpbmcoKSArICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBzdHIudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1BsdWdpbkVudHJ5Q29udGVudENvbnN1bWVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1BsdWdpbkVudHJ5Q29udGVudENvbnN1bWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NDllZTUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9QbHVnaW5FbnRyeUNvbnRlbnRDb25zdW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci0KLS8qKgotICogQ29udGVudENvbnN1bWVyIGZvciBhIHBsdWdpbiBlbnRyeSBvZiBhIGZlYXR1cmUKLSAqLwotCi1wdWJsaWMgY2xhc3MgUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIgZXh0ZW5kcyBDb250ZW50Q29uc3VtZXIgewotCi0JcHJpdmF0ZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBJQ29udGVudENvbnN1bWVyIGNvbnRlbnRDb25zdW1lcjsKLQkJCi0JLyoKLQkgKiBDb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBQbHVnaW5FbnRyeUNvbnRlbnRDb25zdW1lcihJQ29udGVudENvbnN1bWVyIGNvbnRlbnRDb25zdW1lcil7Ci0JCXRoaXMuY29udGVudENvbnN1bWVyID0gY29udGVudENvbnN1bWVyOwotCX0KLQotCS8qCi0JICogQHNlZSBDb250ZW50Q29uc3VtZXIjc3RvcmUoQ29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9yZShDb250ZW50UmVmZXJlbmNlIGNvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoIWNsb3NlZCl7Ci0JCQljb250ZW50Q29uc3VtZXIuc3RvcmUoY29udGVudFJlZmVyZW5jZSxtb25pdG9yKTsKLQkJfSBlbHNlIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiQXR0ZW1wdCB0byBzdG9yZSBpbiBhIGNsb3NlZCBQbHVnaW5FbnRyeUNvbnRlbnRDb25zdW1lciIsbmV3IEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENvbnRlbnRDb25zdW1lciNjbG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICghY2xvc2VkKXsKLQkJCWNsb3NlZCA9IHRydWU7Ci0JCQljb250ZW50Q29uc3VtZXIuY2xvc2UoKTsKLQkJfSBlbHNlIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiQXR0ZW1wdCB0byBjbG9zZSBhIGNsb3NlZCBQbHVnaW5FbnRyeUNvbnRlbnRDb25zdW1lciIsbmV3IEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1Byb2R1Y3RQcm92aWRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Qcm9kdWN0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE4NGQ4MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1Byb2R1Y3RQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yLkZlYXR1cmVFbnRyeTsKLQotLyoqCi0gKiBNYXBzIHByaW1hcnkgZmVhdHVyZXMgdG8gSVByb2R1Y3QKLSAqLwotcHVibGljIGNsYXNzIFByb2R1Y3RQcm92aWRlciBpbXBsZW1lbnRzIElQcm9kdWN0UHJvdmlkZXIgewotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZHVjdFByb3ZpZGVyI2dldFByb2R1Y3RzKCkKLQkgKi8KLQlwdWJsaWMgSVByb2R1Y3RbXSBnZXRQcm9kdWN0cygpIHsKLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOwotCQlpZiAoY29uZmlndXJhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJUHJvZHVjdFswXTsKLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JRmVhdHVyZUVudHJ5W10gZmVhdHVyZXMgPSBjb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRGZWF0dXJlRW50cmllcygpOwotCQlBcnJheUxpc3QgcHJpbWFyeUZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKQotCQkJaWYgKGZlYXR1cmVzW2ldLmNhbkJlUHJpbWFyeSgpICYmIChmZWF0dXJlc1tpXSBpbnN0YW5jZW9mIEZlYXR1cmVFbnRyeSkpCi0JCQkJcHJpbWFyeUZlYXR1cmVzLmFkZChuZXcgRmVhdHVyZUVudHJ5V3JhcHBlcigoRmVhdHVyZUVudHJ5KSBmZWF0dXJlc1tpXSkpOwotCQkvLyBUT0RPIGhhbmRsZSB1bm1hbmFnZWQgcGx1Z2lucyBsYXRlcgotCQlyZXR1cm4gKElQcm9kdWN0W10pIHByaW1hcnlGZWF0dXJlcy50b0FycmF5KG5ldyBJUHJvZHVjdFtwcmltYXJ5RmVhdHVyZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9kdWN0UHJvdmlkZXIjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTWVzc2FnZXMuUHJvZHVjdFByb3ZpZGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUNvbnRlbnRDb25zdW1lci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlQ29udGVudENvbnN1bWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMTIxY2QuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlQ29udGVudENvbnN1bWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci0KLS8qKgotICogQSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBJRmVhdHVyZUNvbnRlbnRDb25zdW1lcgotICogPC9wPgotICogQHNpbmNlIDIuMAotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTaXRlQ29udGVudENvbnN1bWVyIGltcGxlbWVudHMgSVNpdGVDb250ZW50Q29uc3VtZXIgewotCQotCXByaXZhdGUgSVNpdGUgc2l0ZTsKLQkKLQkvKgotCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjc2V0U2l0ZShJU2l0ZSkKLQkgKi8KLQkvKioKLQkgKiBTZXRzIHRoZSBzaXRlLgotCSAqIEBwYXJhbSBzaXRlIFRoZSBzaXRlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpdGUoSVNpdGUgc2l0ZSkgewotCQl0aGlzLnNpdGUgPSBzaXRlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNpdGUuCi0JICogQHJldHVybiBSZXR1cm5zIGEgSVNpdGUKLQkgKi8KLQlwdWJsaWMgSVNpdGUgZ2V0U2l0ZSgpIHsKLQkJcmV0dXJuIHNpdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YzZmMzEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqICBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQ29udGVudFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZUNvbnRlbnRDb25zdW1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklOb25QbHVnaW5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGVGZWF0dXJlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklWZXJpZmljYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JVmVyaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSW5zdGFsbE1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuQ29udGVudEVudHJ5TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuRmVhdHVyZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkZlYXR1cmVSZWZlcmVuY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5JbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy5VcGRhdGVVdGlsczsKLQotCi0vKioKLSAqIFNpdGUgb24gdGhlIEZpbGUgU3lzdGVtCi0gKi8KLXB1YmxpYyBjbGFzcyBTaXRlRmlsZSBleHRlbmRzIFNpdGUgewotCi0JLyoqCi0JICogcGx1Z2luIGVudHJpZXMgCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBsdWdpbkVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIElTaXRlQ29udGVudENvbnN1bWVyIGNyZWF0ZVNpdGVDb250ZW50Q29uc3VtZXIoSUZlYXR1cmUgdGFyZ2V0RmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTaXRlRmlsZUNvbnRlbnRDb25zdW1lciBjb25zdW1lciA9IG5ldyBTaXRlRmlsZUNvbnRlbnRDb25zdW1lcih0YXJnZXRGZWF0dXJlKTsKLQkJY29uc3VtZXIuc2V0U2l0ZSh0aGlzKTsKLQkJcmV0dXJuIGNvbnN1bWVyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhY2thZ2VkRmVhdHVyZVR5cGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1RZUEU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTaXRlI2luc3RhbGwoSUZlYXR1cmUsIElWZXJpZmllciwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbChJRmVhdHVyZSBzb3VyY2VGZWF0dXJlLCBJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGluc3RhbGwoc291cmNlRmVhdHVyZSxudWxsLHZlcmlmaWNhdGlvbkxpc3RlbmVyLHByb2dyZXNzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGUjaW5zdGFsbChJRmVhdHVyZSwgSVZlcmlmaWVyLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBpbnN0YWxsKElGZWF0dXJlIHNvdXJjZUZlYXR1cmUsIElGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxmZWF0dXJlcywgSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWNhdGlvbkxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKHNvdXJjZUZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIG1ha2Ugc3VyZSB3ZSBoYXZlIGFuIEluc3RhbGxNb25pdG9yCQkKLQkJSW5zdGFsbE1vbml0b3IgbW9uaXRvcjsKLQkJaWYgKHByb2dyZXNzID09IG51bGwpCi0JCQltb25pdG9yID0gbnVsbDsKLQkJZWxzZSBpZiAocHJvZ3Jlc3MgaW5zdGFuY2VvZiBJbnN0YWxsTW9uaXRvcikKLQkJCW1vbml0b3IgPSAoSW5zdGFsbE1vbml0b3IpIHByb2dyZXNzOwotCQllbHNlCi0JCQltb25pdG9yID0gbmV3IEluc3RhbGxNb25pdG9yKHByb2dyZXNzKTsKLQotCQkvLyBjcmVhdGUgbmV3IGV4ZWN1dGFibGUgZmVhdHVyZSBhbmQgaW5zdGFsbCBzb3VyY2UgY29udGVudCBpbnRvIGl0Ci0JCUlGZWF0dXJlIGxvY2FsRmVhdHVyZSA9IGNyZWF0ZUV4ZWN1dGFibGVGZWF0dXJlKHNvdXJjZUZlYXR1cmUpOwotCi0JCUlGZWF0dXJlUmVmZXJlbmNlIGxvY2FsRmVhdHVyZVJlZmVyZW5jZSA9IG51bGw7Ci0JCWxvY2FsRmVhdHVyZVJlZmVyZW5jZSA9IHNvdXJjZUZlYXR1cmUuaW5zdGFsbChsb2NhbEZlYXR1cmUsIG9wdGlvbmFsZmVhdHVyZXMsIHZlcmlmaWNhdGlvbkxpc3RlbmVyLCBtb25pdG9yKTsKLQotCQlyZXR1cm4gbG9jYWxGZWF0dXJlUmVmZXJlbmNlOwotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZSNpbnN0YWxsKElGZWF0dXJlLElGZWF0dXJlQ29udGVudENvbnN1bWVyLCBJVmVyaWZpZXIsSVZlcmlmaWNhdGlvbkxJc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBpbnN0YWxsKElGZWF0dXJlIHNvdXJjZUZlYXR1cmUsIElGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxmZWF0dXJlcywgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgcGFyZW50Q29udGVudENvbnN1bWVyLCBJVmVyaWZpZXIgcGFyZW50VmVyaWZpZXIsIElWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykKLQkJdGhyb3dzIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlpZiAoc291cmNlRmVhdHVyZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gbWFrZSBzdXJlIHdlIGhhdmUgYW4gSW5zdGFsbE1vbml0b3IJCQotCQlJbnN0YWxsTW9uaXRvciBtb25pdG9yOwotCQlpZiAocHJvZ3Jlc3MgPT0gbnVsbCkKLQkJCW1vbml0b3IgPSBudWxsOwotCQllbHNlIGlmIChwcm9ncmVzcyBpbnN0YW5jZW9mIEluc3RhbGxNb25pdG9yKQotCQkJbW9uaXRvciA9IChJbnN0YWxsTW9uaXRvcikgcHJvZ3Jlc3M7Ci0JCWVsc2UKLQkJCW1vbml0b3IgPSBuZXcgSW5zdGFsbE1vbml0b3IocHJvZ3Jlc3MpOwotCi0JCS8vIGNyZWF0ZSBuZXcgZXhlY3V0YWJsZSBmZWF0dXJlIGFuZCBpbnN0YWxsIHNvdXJjZSBjb250ZW50IGludG8gaXQKLQkJSUZlYXR1cmUgbG9jYWxGZWF0dXJlID0gY3JlYXRlRXhlY3V0YWJsZUZlYXR1cmUoc291cmNlRmVhdHVyZSk7Ci0JCXBhcmVudENvbnRlbnRDb25zdW1lci5hZGRDaGlsZChsb2NhbEZlYXR1cmUpOwotCi0JCS8vIHNldCB0aGUgdmVyaWZpZXIKLQkJSVZlcmlmaWVyIHZyID0gc291cmNlRmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkuZ2V0VmVyaWZpZXIoKTsKLQkJaWYgKHZyICE9IG51bGwpCi0JCQl2ci5zZXRQYXJlbnQocGFyZW50VmVyaWZpZXIpOwotCi0JCUlGZWF0dXJlUmVmZXJlbmNlIGxvY2FsRmVhdHVyZVJlZmVyZW5jZSA9IG51bGw7Ci0JCWxvY2FsRmVhdHVyZVJlZmVyZW5jZSA9IHNvdXJjZUZlYXR1cmUuaW5zdGFsbChsb2NhbEZlYXR1cmUsIG9wdGlvbmFsZmVhdHVyZXMsIHZlcmlmaWNhdGlvbkxpc3RlbmVyLCBtb25pdG9yKTsKLQotCQlyZXR1cm4gbG9jYWxGZWF0dXJlUmVmZXJlbmNlOwotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZSNyZW1vdmUoSUZlYXR1cmUsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKElGZWF0dXJlIGZlYXR1cmUsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIkZlYXR1cmUgdG8gcmVtb3ZlIGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlFcnJvclJlY292ZXJ5TG9nIHJlY292ZXJ5TG9nID0gRXJyb3JSZWNvdmVyeUxvZy5nZXRMb2coKTsKLQotCQkvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhbiBJbnN0YWxsTW9uaXRvcgkJCi0JCUluc3RhbGxNb25pdG9yIG1vbml0b3I7Ci0JCWlmIChwcm9ncmVzcyA9PSBudWxsKQotCQkJbW9uaXRvciA9IG51bGw7Ci0JCWVsc2UgaWYgKHByb2dyZXNzIGluc3RhbmNlb2YgSW5zdGFsbE1vbml0b3IpCi0JCQltb25pdG9yID0gKEluc3RhbGxNb25pdG9yKSBwcm9ncmVzczsKLQkJZWxzZQotCQkJbW9uaXRvciA9IG5ldyBJbnN0YWxsTW9uaXRvcihwcm9ncmVzcyk7Ci0KLQkJLy8gU2V0dXAgb3B0aW9uYWwgaW5zdGFsbCBoYW5kbGVyCi0JCUluc3RhbGxIYW5kbGVyUHJveHkgaGFuZGxlciA9IG5ldyBJbnN0YWxsSGFuZGxlclByb3h5KElJbnN0YWxsSGFuZGxlci5IQU5ETEVSX0FDVElPTl9VTklOU1RBTEwsIGZlYXR1cmUsIGZlYXR1cmUuZ2V0SW5zdGFsbEhhbmRsZXJFbnRyeSgpLCBtb25pdG9yKTsKLQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCVRocm93YWJsZSBvcmlnaW5hbEV4Y2VwdGlvbiA9IG51bGw7Ci0KLQkJdHJ5IHsKLQotCQkJLy8gc3RhcnQgbG9nCi0JCQlyZWNvdmVyeUxvZy5vcGVuKEVycm9yUmVjb3ZlcnlMb2cuU1RBUlRfUkVNT1ZFX0xPRyk7Ci0KLQkJCS8vIGxvZyBmaWxlcyBoYXZlIGJlZW4gZG93bmxvYWRlZAotCQkJcmVjb3ZlcnlMb2cuYXBwZW5kKEVycm9yUmVjb3ZlcnlMb2cuRU5EX0FCT1VUX1JFTU9WRSk7Ci0KLQkJCWhhbmRsZXIudW5pbnN0YWxsSW5pdGlhdGVkKCk7Ci0KLQkJCS8vIHJlbW92ZSB0aGUgZmVhdHVyZSBhbmQgdGhlIHBsdWdpbnMgaWYgdGhleSBhcmUgbm90IHVzZWQgYW5kIG5vdCBhY3RpdmF0ZWQKLQkJCS8vIGdldCB0aGUgcGx1Z2lucyBmcm9tIHRoZSBmZWF0dXJlCi0JCQlJUGx1Z2luRW50cnlbXSBwbHVnaW5zVG9SZW1vdmUgPSBnZXRQbHVnaW5FbnRyaWVzT25seVJlZmVyZW5jZWRCeShmZWF0dXJlKTsKLQotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKE1lc3NhZ2VzLlNpdGVGaWxlX1JlbW92aW5nICsgZmVhdHVyZS5nZXRMYWJlbCgpLCBwbHVnaW5zVG9SZW1vdmUubGVuZ3RoICsgMSk7CQotCQkJfQotCi0JCQkvLyByZW1vdmUgZmVhdHVyZSByZWZlcmVuY2UgZnJvbSB0aGUgc2l0ZQotCQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZVJlZmVyZW5jZXMgPSBnZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJaWYgKGZlYXR1cmVSZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpbmRleFJlZiA9IDA7IGluZGV4UmVmIDwgZmVhdHVyZVJlZmVyZW5jZXMubGVuZ3RoOyBpbmRleFJlZisrKSB7Ci0JCQkJCUlGZWF0dXJlUmVmZXJlbmNlIGVsZW1lbnQgPSBmZWF0dXJlUmVmZXJlbmNlc1tpbmRleFJlZl07Ci0JCQkJCWlmIChlbGVtZW50LmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5lcXVhbHMoZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKSB7Ci0JCQkJCQlyZW1vdmVGZWF0dXJlUmVmZXJlbmNlTW9kZWwoKEZlYXR1cmVSZWZlcmVuY2VNb2RlbCkgZWxlbWVudCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKEluc3RhbGxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldCgiZmVhdHVyZV8iK2ZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlVcGRhdGVDb3JlLmxvZyhOTFMuYmluZChNZXNzYWdlcy5TaXRlRmlsZV9mZWF0dXJlTm90UmVtb3ZlZCwgKG5ldyBTdHJpbmdbXSB7IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkgfSkpLCBudWxsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gcmVtb3ZlIHRoZSBmZWF0dXJlIGNvbnRlbnQKLQkJCQlDb250ZW50UmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IGZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpLmdldEZlYXR1cmVFbnRyeUFyY2hpdmVSZWZlcmVuY2VzKG1vbml0b3IpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJCQl0cnkgewotCQkJCQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHJlZmVyZW5jZXNbaV0uYXNGaWxlKCkpOwotCQkJCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuU2l0ZUZpbGVfQ2Fubm90UmVtb3ZlRmVhdHVyZSwgKG5ldyBTdHJpbmdbXSB7IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKSwgZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSB9KSksIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCUluc3RhbGxSZWdpc3RyeS51bnJlZ2lzdGVyRmVhdHVyZShmZWF0dXJlKTsKLQkJCX0KLQotCQkJLy9maW5kcyB0aGUgY29udGVudFJlZmVyZW5jZXMgZm9yIGFuIElQbHVnaW5FbnRyeQotCQkJLy8gYW5kIHJlbW92ZSBpdAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5zVG9SZW1vdmUubGVuZ3RoOyBpKyspIHsKLQkJCQlyZW1vdmUoZmVhdHVyZSwgcGx1Z2luc1RvUmVtb3ZlW2ldLCBtb25pdG9yKTsKLQkJCX0KLQotCQkJLy8gcmVtb3ZlIGFueSBjaGlsZHJlbiBmZWF0dXJlCi0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuUmVmID0gZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuUmVmLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUZlYXR1cmUgY2hpbGRGZWF0dXJlID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQljaGlsZEZlYXR1cmUgPSBjaGlsZHJlblJlZltpXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byByZXRyaWV2ZSBmZWF0dXJlIHRvIHJlbW92ZSBmb3I6IiArIGNoaWxkcmVuUmVmW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLSAgICAgICAgICAgICAgICAvLyBkbyBub3QgcmVtb3ZlIG5lc3RlZCBmZWF0dXJlIGlmIGNvbmZpZ3VyZWQgKGkuZS4gdXNlZCBieSBhbm90aGVyIGNvbmZpZ3VyZWQgZmVhdHVyZSkKLQkJCQlpZiAoY2hpbGRGZWF0dXJlICE9IG51bGwgJiYgIWdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpLmlzQ29uZmlndXJlZChjaGlsZEZlYXR1cmUpKQotCQkJCQlyZW1vdmUoY2hpbGRyZW5SZWZbaV0uZ2V0RmVhdHVyZShudWxsKSwgbW9uaXRvcik7Ci0JCQl9Ci0KLQkJCS8vIHJlbW92ZSB0aGUgZmVhdHVyZSBmcm9tIHRoZSBzaXRlIGNhY2hlCi0JCQlyZW1vdmVGZWF0dXJlRnJvbUNhY2hlKGZlYXR1cmUuZ2V0VVJMKCkpOwotCQkJCi0JCQloYW5kbGVyLmNvbXBsZXRlVW5pbnN0YWxsKCk7Ci0KLQkJCXN1Y2Nlc3MgPSB0cnVlOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJb3JpZ2luYWxFeGNlcHRpb24gPSB0OwotCQl9IGZpbmFsbHkgewotCQkJVGhyb3dhYmxlIG5ld0V4Y2VwdGlvbiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJCS8vIGNsb3NlIHRoZSBsb2cKLQkJCQkJcmVjb3ZlcnlMb2cuY2xvc2UoRXJyb3JSZWNvdmVyeUxvZy5FTkRfUkVNT1ZFX0xPRyk7Ci0JCQkJCXJlY292ZXJ5TG9nLmRlbGV0ZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlY292ZXJ5TG9nLmNsb3NlKEVycm9yUmVjb3ZlcnlMb2cuRU5EX1JFTU9WRV9MT0cpOwotCQkJCX0KLQkJCQloYW5kbGVyLnVuaW5zdGFsbENvbXBsZXRlZChzdWNjZXNzKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJbmV3RXhjZXB0aW9uID0gdDsKLQkJCX0KLQkJCWlmIChvcmlnaW5hbEV4Y2VwdGlvbiAhPSBudWxsKSAvLyBvcmlnaW5hbCBleGNlcHRpb24gd2lucwotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkluc3RhbGxIYW5kbGVyX2Vycm9yLCAobmV3IFN0cmluZ1tdIHsgZmVhdHVyZS5nZXRMYWJlbCgpIH0pKSwgb3JpZ2luYWxFeGNlcHRpb24pOwotCQkJaWYgKG5ld0V4Y2VwdGlvbiAhPSBudWxsKQotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkluc3RhbGxIYW5kbGVyX2Vycm9yLCAobmV3IFN0cmluZ1tdIHsgZmVhdHVyZS5nZXRMYWJlbCgpIH0pKSwgbmV3RXhjZXB0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHJldHVybnMgdGhlIGRvd25sb2FkIHNpemUKLQkgKiBvZiB0aGUgZmVhdHVyZSB0byBiZSBpbnN0YWxsZWQgb24gdGhlIHNpdGUuCi0JICogSWYgdGhlIHNpdGUgaXMgPGNvZGU+bnVsbDwvY29kZT4gcmV0dXJucyB0aGUgbWF4aW11bSBzaXplCi0JICogCi0JICogSWYgb25lIHBsdWctaW4gZW50cnkgaGFzIGFuIHVua25vd24gc2l6ZS4KLQkgKiB0aGVuIHRoZSBkb3dubG9hZCBzaXplIGlzIHVua25vd24uCi0JICogCi0JICovCi0JcHVibGljIGxvbmcgZ2V0RG93bmxvYWRTaXplRm9yKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJbG9uZyByZXN1bHQgPSAwOwotCQkvL1sxMzIwMjldCi0JCS8vSVBsdWdpbkVudHJ5W10gZW50cmllc1RvSW5zdGFsbCA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQkvL0lQbHVnaW5FbnRyeVtdIHNpdGVFbnRyaWVzID0gdGhpcy5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCS8vZW50cmllc1RvSW5zdGFsbCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5kaWZmKGVudHJpZXNUb0luc3RhbGwsIHNpdGVFbnRyaWVzKTsKLQkJLy9bMTgzNTVdCi0JCS8vSU5vblBsdWdpbkVudHJ5W10gbm9uUGx1Z2luRW50cmllc1RvSW5zdGFsbCA9IGZlYXR1cmUuZ2V0Tm9uUGx1Z2luRW50cmllcygpOwotCi0JCXRyeSB7Ci0JCQkvL1sxMzIwMjldCi0JCQkvL3Jlc3VsdCA9IGZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpLmdldERvd25sb2FkU2l6ZUZvcihlbnRyaWVzVG9JbnN0YWxsLCBub25QbHVnaW5FbnRyaWVzVG9JbnN0YWxsKTsKLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW4gPSBmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCUlGZWF0dXJlIGN1cnJlbnRGZWF0dXJlID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQljdXJyZW50RmVhdHVyZSA9IFVwZGF0ZVV0aWxzLmdldEluY2x1ZGVkRmVhdHVyZShmZWF0dXJlLCBjaGlsZHJlbltpXSk7Ci0JCQkJaWYgKGN1cnJlbnRGZWF0dXJlICE9IG51bGwpIHsKLQkJCQkJcmVzdWx0ICs9IGdldERvd25sb2FkU2l6ZUZvcihjdXJyZW50RmVhdHVyZSk7Ci0JCQkJCWlmKHJlc3VsdCA9PSBDb250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkUpCi0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCX0KLQotCQkJSVBsdWdpbkVudHJ5W10gZW50cmllc1RvSW5zdGFsbCA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQkJSVBsdWdpbkVudHJ5W10gc2l0ZUVudHJpZXMgPSB0aGlzLmdldFBsdWdpbkVudHJpZXMoKTsKLQkJCWVudHJpZXNUb0luc3RhbGwgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZGlmZihlbnRyaWVzVG9JbnN0YWxsLCBzaXRlRW50cmllcyk7Ci0JCQkvL1sxODM1NV0KLQkJCSAgIElOb25QbHVnaW5FbnRyeVtdIG5vblBsdWdpbkVudHJpZXNUb0luc3RhbGwgPSBmZWF0dXJlLmdldE5vblBsdWdpbkVudHJpZXMoKTsKLQotCQkJIHJlc3VsdCArPSBmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKS5nZXREb3dubG9hZFNpemVGb3IoZW50cmllc1RvSW5zdGFsbCwgbm9uUGx1Z2luRW50cmllc1RvSW5zdGFsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS53YXJuKG51bGwsIGUpOwotCQkJcmVzdWx0ID0gQ29udGVudEVudHJ5TW9kZWwuVU5LTk9XTl9TSVpFOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyB0aGUgZG93bmxvYWQgc2l6ZQotCSAqIG9mIHRoZSBmZWF0dXJlIHRvIGJlIGluc3RhbGxlZCBvbiB0aGUgc2l0ZS4KLQkgKiBJZiB0aGUgc2l0ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiByZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUKLQkgKiAKLQkgKiBJZiBvbmUgcGx1Zy1pbiBlbnRyeSBoYXMgYW4gdW5rbm93biBzaXplLgotCSAqIHRoZW4gdGhlIGRvd25sb2FkIHNpemUgaXMgdW5rbm93bi4KLQkgKiAKLQkgKiBAc2VlIElTaXRlI2dldERvd25sb2FkU2l6ZUZvcihJRmVhdHVyZSkKLQkgKiAKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRJbnN0YWxsU2l6ZUZvcihJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWxvbmcgcmVzdWx0ID0gMDsKLQotCQl0cnkgewotCQkJTGlzdCBwbHVnaW5zVG9JbnN0YWxsID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQkvLyBnZXQgYWxsIHRoZSBwbHVnaW5zIFsxNzMwNF0KLQkJCXBsdWdpbnNUb0luc3RhbGwuYWRkQWxsKEFycmF5cy5hc0xpc3QoZmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCkpKTsKLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW4gPSBmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCUlGZWF0dXJlIGN1cnJlbnRGZWF0dXJlID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQljdXJyZW50RmVhdHVyZSA9IFVwZGF0ZVV0aWxzLmdldEluY2x1ZGVkRmVhdHVyZShmZWF0dXJlLCBjaGlsZHJlbltpXSk7Ci0JCQkJaWYgKGN1cnJlbnRGZWF0dXJlICE9IG51bGwpIHsKLQkJCQkJLy9bMTMyMDI5XQotCQkJCQkvL3BsdWdpbnNUb0luc3RhbGwuYWRkQWxsKEFycmF5cy5hc0xpc3QoY3VycmVudEZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpKSk7Ci0JCQkJCXJlc3VsdCArPSBnZXRJbnN0YWxsU2l6ZUZvcihjdXJyZW50RmVhdHVyZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gQ29udGVudEVudHJ5TW9kZWwuVU5LTk9XTl9TSVpFKQotCQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUlQbHVnaW5FbnRyeVtdIGVudHJpZXNUb0luc3RhbGwgPSBuZXcgSVBsdWdpbkVudHJ5WzBdOwotCQkJaWYgKHBsdWdpbnNUb0luc3RhbGwuc2l6ZSgpID4gMCkgewotCQkJCWVudHJpZXNUb0luc3RhbGwgPSBuZXcgSVBsdWdpbkVudHJ5W3BsdWdpbnNUb0luc3RhbGwuc2l6ZSgpXTsKLQkJCQlwbHVnaW5zVG9JbnN0YWxsLnRvQXJyYXkoZW50cmllc1RvSW5zdGFsbCk7Ci0JCQl9Ci0KLQkJCUlQbHVnaW5FbnRyeVtdIHNpdGVFbnRyaWVzID0gdGhpcy5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCQllbnRyaWVzVG9JbnN0YWxsID0gVXBkYXRlTWFuYWdlclV0aWxzLmRpZmYoZW50cmllc1RvSW5zdGFsbCwgc2l0ZUVudHJpZXMpOwotCi0JCQkvL1sxODM1NV0KLQkJCUlOb25QbHVnaW5FbnRyeVtdIG5vblBsdWdpbkVudHJpZXNUb0luc3RhbGwgPSBmZWF0dXJlLmdldE5vblBsdWdpbkVudHJpZXMoKTsKLQkJCQotCQkJLy9bMTMyMDI5XQotCQkJLy9yZXN1bHQgPSBmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKS5nZXRJbnN0YWxsU2l6ZUZvcihlbnRyaWVzVG9JbnN0YWxsLCBub25QbHVnaW5FbnRyaWVzVG9JbnN0YWxsKTsKLQkJCXJlc3VsdCArPSBmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKS5nZXRJbnN0YWxsU2l6ZUZvcihlbnRyaWVzVG9JbnN0YWxsLCBub25QbHVnaW5FbnRyaWVzVG9JbnN0YWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4obnVsbCwgZSk7Ci0JCQlyZXN1bHQgPSBDb250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkU7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBwbHVnaW4gZW50cnkgCi0JICogRWl0aGVyIGZyb20gcGFyc2luZyB0aGUgZmlsZSBzeXN0ZW0gb3IgCi0JICogaW5zdGFsbGluZyBhIGZlYXR1cmUKLQkgKiAKLQkgKiBXZSBjYW5ub3QgZmlndXJlIG91dCB0aGUgbGlzdCBvZiBwbHVnaW5zIGJ5IHJlYWRpbmcgdGhlIFNpdGUueG1sIGFzCi0JICogdGhlIGFyY2hpdmVzIHRhZyBhcmUgb3B0aW9uYWxzCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGx1Z2luRW50cnkoSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5KSB7Ci0JCXBsdWdpbkVudHJpZXMuYWRkKHBsdWdpbkVudHJ5KTsKLQl9Ci0KLQlwdWJsaWMgSVBsdWdpbkVudHJ5W10gZ2V0UGx1Z2luRW50cmllcygpIHsKLQkJSVBsdWdpbkVudHJ5W10gcmVzdWx0ID0gbmV3IElQbHVnaW5FbnRyeVswXTsKLQkJaWYgKCEocGx1Z2luRW50cmllcyA9PSBudWxsIHx8IHBsdWdpbkVudHJpZXMuaXNFbXB0eSgpKSkgewotCQkJcmVzdWx0ID0gbmV3IElQbHVnaW5FbnRyeVtwbHVnaW5FbnRyaWVzLnNpemUoKV07Ci0JCQlwbHVnaW5FbnRyaWVzLnRvQXJyYXkocmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHVibGljIGludCBnZXRQbHVnaW5FbnRyeUNvdW50KCkgewotCQlyZXR1cm4gZ2V0UGx1Z2luRW50cmllcygpLmxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIElGZWF0dXJlIGNyZWF0ZUV4ZWN1dGFibGVGZWF0dXJlKElGZWF0dXJlIHNvdXJjZUZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUZlYXR1cmUgcmVzdWx0ID0gbnVsbDsKLQkJSUZlYXR1cmVGYWN0b3J5IGZhY3RvcnkgPSBGZWF0dXJlVHlwZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRGYWN0b3J5KERFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfVFlQRSk7Ci0JCXJlc3VsdCA9IGZhY3RvcnkuY3JlYXRlRmVhdHVyZSgvKlVSTCovbnVsbCwgdGhpcywgbnVsbCk7Ci0KLQkJLy8gYXQgbGVhc3Qgc2V0IHRoZSB2ZXJzaW9uIGlkZW50aWZpZXIgdG8gYmUgdGhlIHNhbWUKLQkJICgoRmVhdHVyZU1vZGVsKSByZXN1bHQpLnNldEZlYXR1cmVJZGVudGlmaWVyKHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKSk7Ci0JCSgoRmVhdHVyZU1vZGVsKSByZXN1bHQpLnNldEZlYXR1cmVWZXJzaW9uKHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlKElGZWF0dXJlIGZlYXR1cmUsIElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWlmIChwbHVnaW5FbnRyeSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkJCi0JCWlmIChJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXQoInBsdWdpbl8iK3BsdWdpbkVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVDb3JlLmxvZyhOTFMuYmluZChNZXNzYWdlcy5TaXRlRmlsZV9wbHVnaW5Ob3RSZW1vdmVkLCAobmV3IFN0cmluZ1tdIHsgcGx1Z2luRW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkgfSkpLCBudWxsKTsKLQkJCXJldHVybjsgCi0JCX0KLQotCQlDb250ZW50UmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IGZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpLmdldFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMocGx1Z2luRW50cnksIG1vbml0b3IpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHJlZmVyZW5jZXNbaV0uYXNGaWxlKCkpOwotCQkJCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVGaWxlX0Nhbm5vdFJlbW92ZVBsdWdpbiwgKG5ldyBTdHJpbmdbXSB7IHBsdWdpbkVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpLCBnZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpIH0pKSwgZSk7Ci0JCQl9Ci0JCX0KLQkJcGx1Z2luRW50cmllcy5yZW1vdmUocGx1Z2luRW50cnkpOwotCQlJbnN0YWxsUmVnaXN0cnkudW5yZWdpc3RlclBsdWdpbihwbHVnaW5FbnRyeSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlQ29udGVudENvbnN1bWVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlQ29udGVudENvbnN1bWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZTQxMzkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZUNvbnRlbnRDb25zdW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkZlYXR1cmVDb250ZW50UHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotCi0vKioKLSAqIENvbnRlbnRDb25zdW1tZXIgZm9yIGEgU2l0ZUZpbGUKLSAqLwotcHVibGljIGNsYXNzIFNpdGVGaWxlQ29udGVudENvbnN1bWVyIGV4dGVuZHMgU2l0ZUNvbnRlbnRDb25zdW1lciB7Ci0KLQlwcml2YXRlIElGZWF0dXJlIGZlYXR1cmU7Ci0JcHJpdmF0ZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOwotCi0JLy8gcmVjb3ZlcnkKLQlwcml2YXRlIFN0cmluZyBvbGRQYXRoOwotCXByaXZhdGUgU3RyaW5nIG5ld1BhdGg7Ci0KLQkvLyAgZm9yIGFib3J0Ci0JcHJpdmF0ZSBMaXN0IC8qIG9mIFNpdGVGaWxlUGx1Z2luQ29udGVudENvbnN1bWVyICovCi0JY29udGVudENvbnN1bWVyczsKLQlwcml2YXRlIExpc3QgLypvZiBwYXRoIGFzIFN0cmluZyAqLwotCWluc3RhbGxlZEZpbGVzOwotCQotCS8vIFBFUkY6IG5ldyBpbnN0YW5jZSB2YXJpYWJsZQotCXByaXZhdGUgU2l0ZUZpbGVGYWN0b3J5IGFyY2hpdmVGYWN0b3J5ID0gbmV3IFNpdGVGaWxlRmFjdG9yeSgpOwotCi0JLyoKLQkgKiBDb25zdHJ1Y3RvciAKLQkgKi8KLQlwdWJsaWMgU2l0ZUZpbGVDb250ZW50Q29uc3VtZXIoSUZlYXR1cmUgZmVhdHVyZSkgewotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQlpbnN0YWxsZWRGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIHBhdGggaW4gd2hpY2ggdGhlIEZlYXR1cmUgd2lsbCBiZSBpbnN0YWxsZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRGZWF0dXJlUGF0aCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZlYXR1cmVQYXRoID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgZmVhdHVyZUlkZW50aWZpZXIgPSBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCVN0cmluZyBwYXRoID0gU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyBmZWF0dXJlSWRlbnRpZmllci50b1N0cmluZygpICsgRmlsZS5zZXBhcmF0b3I7Ci0JCQlVUkwgbmV3VVJMID0gbmV3IFVSTChnZXRTaXRlKCkuZ2V0VVJMKCksIHBhdGgpOwotCQkJZmVhdHVyZVBhdGggPSBuZXdVUkwuZ2V0RmlsZSgpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTWVzc2FnZXMuU2l0ZUZpbGVDb250ZW50Q29uc3VtZXJfVW5hYmxlVG9DcmVhdGVVUkwgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CQotCQl9Ci0JCXJldHVybiBmZWF0dXJlUGF0aDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjb3BlbihJTm9uUGx1Z2luRW50cnkpCi0JICovCi0JcHVibGljIElDb250ZW50Q29uc3VtZXIgb3BlbihJTm9uUGx1Z2luRW50cnkgbm9uUGx1Z2luRW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBTaXRlRmlsZU5vblBsdWdpbkNvbnRlbnRDb25zdW1lcihnZXRGZWF0dXJlUGF0aCgpKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjb3BlbihJUGx1Z2luRW50cnkpCi0JICovCi0JcHVibGljIElDb250ZW50Q29uc3VtZXIgb3BlbihJUGx1Z2luRW50cnkgcGx1Z2luRW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQ29udGVudENvbnN1bWVyIGNvbnM7Ci0JCWlmKHBsdWdpbkVudHJ5IGluc3RhbmNlb2YgUGx1Z2luRW50cnlNb2RlbCAmJiAhKChQbHVnaW5FbnRyeU1vZGVsKXBsdWdpbkVudHJ5KS5pc1VucGFjaygpKXsKLQkJCS8vIHBsdWdpbiBjYW4gcnVuIGZyb20gYSBqYXIKLQkJCSBjb25zID0gbmV3IFNpdGVGaWxlUGFja2VkUGx1Z2luQ29udGVudENvbnN1bWVyKHBsdWdpbkVudHJ5LCBnZXRTaXRlKCkpOwotCQl9IGVsc2V7Ci0JCQkvLyBwbHVnaW4gbXVzdCBiZSB1bnBhY2tlZAotCQkJY29ucyA9IG5ldyBTaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lcihwbHVnaW5FbnRyeSwgZ2V0U2l0ZSgpKTsKLQkJfQotCQlhZGRDb250ZW50Q29uc3VtZXJzKGNvbnMpOwotCQlyZXR1cm4gY29uczsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjc3RvcmUoQ29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9yZShDb250ZW50UmVmZXJlbmNlIGNvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWlmIChjbG9zZWQpIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiQXR0ZW1wdCB0byBzdG9yZSBpbiBhIGNsb3NlZCBTaXRlRmlsZUNvbnRlbnRDb25zdW1lciIsIG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKLQkJU3RyaW5nIGZlYXR1cmVQYXRoID0gZ2V0RmVhdHVyZVBhdGgoKTsKLQkJU3RyaW5nIGNvbnRlbnRLZXkgPSBjb250ZW50UmVmZXJlbmNlLmdldElkZW50aWZpZXIoKTsKLQkJZmVhdHVyZVBhdGggKz0gY29udGVudEtleTsKLQotCQkvLyBlcnJvciByZWNvdmVyeQotCQlpZiAoZmVhdHVyZVBhdGguZW5kc1dpdGgoIlxcIitGZWF0dXJlLkZFQVRVUkVfWE1MKSB8fCBmZWF0dXJlUGF0aC5lbmRzV2l0aCgiLyIrRmVhdHVyZS5GRUFUVVJFX1hNTCkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlvbGRQYXRoID0gZmVhdHVyZVBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKG9sZFBhdGgpOwotCQkJaWYgKGxvY2FsRmlsZS5leGlzdHMoKSkgewotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLlVwZGF0ZU1hbmFnZXJVdGlsc19GaWxlQWxyZWFkeUV4aXN0cywgKG5ldyBPYmplY3RbXSB7IGxvY2FsRmlsZSB9KSksIG51bGwpOwotCQkJfQotCQkJZmVhdHVyZVBhdGggPSBFcnJvclJlY292ZXJ5TG9nLmdldExvY2FsUmFuZG9tSWRlbnRpZmllcihmZWF0dXJlUGF0aCk7Ci0JCQluZXdQYXRoID0gZmVhdHVyZVBhdGg7Ci0JCQlFcnJvclJlY292ZXJ5TG9nLmdldExvZygpLmFwcGVuZFBhdGgoRXJyb3JSZWNvdmVyeUxvZy5GRUFUVVJFX0VOVFJZLCBmZWF0dXJlUGF0aCk7Ci0JCX0KLQotCQl0cnkgewotCQkJaW5TdHJlYW0gPSBjb250ZW50UmVmZXJlbmNlLmdldElucHV0U3RyZWFtKCk7Ci0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMuY29weVRvTG9jYWwoaW5TdHJlYW0sIGZlYXR1cmVQYXRoLCBudWxsKTsKLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5jaGVja1Blcm1pc3Npb25zKGNvbnRlbnRSZWZlcmVuY2UsIGZlYXR1cmVQYXRoKTsgLy8gMjAzMDUKLQkJCWluc3RhbGxlZEZpbGVzLmFkZChmZWF0dXJlUGF0aCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkdsb2JhbENvbnN1bWVyX0Vycm9yQ3JlYXRpbmdGaWxlLCAobmV3IFN0cmluZ1tdIHsgZmVhdHVyZVBhdGggfSkpLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpblN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gY2xvc2Ugc3RyZWFtCi0JCQkJCWluU3RyZWFtLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JLyoKLQkgKiBAc2VlIElTaXRlQ29udGVudENvbnN1bWVyI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgY2xvc2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKGNsb3NlZCkKLQkJCVVwZGF0ZUNvcmUud2FybigiQXR0ZW1wdCB0byBjbG9zZSBhIGNsb3NlZCBTaXRlRmlsZUNvbnRlbnRDb25zdW1lciIsIG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBjcmVhdGUgYSBuZXcgRmVhdHVyZSByZWZlcmVuY2UgdG8gYmUgYWRkZWQgdG8gdGhlIHNpdGUKLQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7Ci0JCXJlZi5zZXRTaXRlKGdldFNpdGUoKSk7Ci0JCUZpbGUgZmlsZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCWZpbGUgPSBuZXcgRmlsZShnZXRGZWF0dXJlUGF0aCgpKTsKLQkJCXJlZi5zZXRVUkwoZmlsZS50b1VSTCgpKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVGaWxlQ29udGVudENvbnN1bWVyX1VuYWJsZVRvQ3JlYXRlVVJMRm9yRmlsZSwgKG5ldyBTdHJpbmdbXSB7IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgfSkpLCBlKTsKLQkJfQotCi0JCS8vcmVuYW1lIGZpbGUgYmFjayAKLQkJaWYgKG5ld1BhdGggIT0gbnVsbCkgewotCQkJRXJyb3JSZWNvdmVyeUxvZy5nZXRMb2coKS5hcHBlbmRQYXRoKEVycm9yUmVjb3ZlcnlMb2cuUkVOQU1FX0VOVFJZLCBuZXdQYXRoKTsKLQkJCWJvb2xlYW4gc3VjZXNzID0gZmFsc2U7Ci0JCQlGaWxlIGZpbGVUb1JlbmFtZSA9IG5ldyBGaWxlKG5ld1BhdGgpOwotCQkJaWYgKGZpbGVUb1JlbmFtZS5leGlzdHMoKSkgewotCQkJCUZpbGUgcmVuYW1lZEZpbGUgPSBuZXcgRmlsZShvbGRQYXRoKTsKLQkJCQlpZiAocmVuYW1lZEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHJlbmFtZWRGaWxlKTsKLQkJCQkJVXBkYXRlQ29yZS53YXJuKCJSZW1vdmluZyBhbHJlYWR5IGV4aXN0aW5nIGZpbGU6IiArIG9sZFBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXN1Y2VzcyA9IGZpbGVUb1JlbmFtZS5yZW5hbWVUbyhyZW5hbWVkRmlsZSk7Ci0JCQl9Ci0JCQlpZiAoIXN1Y2VzcykgewotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5Db250ZW50Q29uc3VtZXJfVW5hYmxlVG9SZW5hbWUsIChuZXcgU3RyaW5nW10geyBuZXdQYXRoLCBvbGRQYXRoIH0pKTsKLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihtc2csIG5ldyBFeGNlcHRpb24obXNnKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjbG9zZSBwbHVnaW4gYW5kIG5vbiBwbHVnaW4gY29udGVudCBjb25zdW1lcgotCQlpZiAoY29udGVudENvbnN1bWVycyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdGVyID0gY29udGVudENvbnN1bWVycy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJQ29udGVudENvbnN1bWVyIGVsZW1lbnQgPSAoQ29udGVudENvbnN1bWVyKSBpdGVyLm5leHQoKTsKLQkJCQllbGVtZW50LmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJY29udGVudENvbnN1bWVycyA9IG51bGw7Ci0KLQkJaWYgKHJlZiAhPSBudWxsKSB7Ci0JCQkvLyB0aGUgZmVhdHVyZSBNVVNUIGhhdmUgcmVuYW1lZCB0aGUgcGx1Z2lucyBhdCB0aGF0IHBvaW50Ci0JCQkvLyAoYnkgY2xvc2luZyB0aGUgUGx1Z2luQ29udGVudENvbnN1bWVyKQotCQkJY29tbWl0UGx1Z2lucyhyZWYpOwotCQkJcmVmLm1hcmtSZWFkT25seSgpOwotCQl9Ci0KLQkJY2xvc2VkID0gdHJ1ZTsKLQkJcmV0dXJuIHJlZjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjYWJvcnQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFib3J0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWlmIChjbG9zZWQpIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiQXR0ZW1wdCB0byBhYm9ydCBhIGNsb3NlZCBTaXRlRmlsZUNvbnRlbnRDb25zdW1lciIsIG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vYWJvcnQgYWxsIHBsdWdpbnMgY29udGVudCBjb25zdW1lciBvcGVuZWQKLQkJaWYgKGNvbnRlbnRDb25zdW1lcnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXRlciA9IGNvbnRlbnRDb25zdW1lcnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiAgU2l0ZUZpbGVQbHVnaW5Db250ZW50Q29uc3VtZXIpIHsKLQkJCQkJKChTaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lcillbGVtZW50KS5hYm9ydCgpOwotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mICBTaXRlRmlsZVBhY2tlZFBsdWdpbkNvbnRlbnRDb25zdW1lcil7Ci0JCQkJCSgoU2l0ZUZpbGVQYWNrZWRQbHVnaW5Db250ZW50Q29uc3VtZXIpZWxlbWVudCkuYWJvcnQoKTsKLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCX0KLQkJY29udGVudENvbnN1bWVycyA9IG51bGw7Ci0JCWJvb2xlYW4gc3VjZXNzID0gdHJ1ZTsKLQotCQkvL1JlbW92ZSBmZWF0dXJlLnhtbCBmaXJzdCBpZiBpdCBleGlzdHMKLQkJaWYgKG9sZFBhdGggIT0gbnVsbCkgewotCQkJRXJyb3JSZWNvdmVyeUxvZy5nZXRMb2coKS5hcHBlbmRQYXRoKEVycm9yUmVjb3ZlcnlMb2cuREVMRVRFX0VOVFJZLCBvbGRQYXRoKTsKLQkJCUZpbGUgZmlsZVRvRGVsZXRlID0gbmV3IEZpbGUob2xkUGF0aCk7Ci0JCQlpZiAoZmlsZVRvRGVsZXRlLmV4aXN0cygpKSB7Ci0JCQkJc3VjZXNzID0gZmlsZVRvRGVsZXRlLmRlbGV0ZSgpOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFzdWNlc3MpIHsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5TaXRlRmlsZUNvbnRlbnRDb25zdW1lcl91bmFibGVUb0RlbGV0ZSwgKG5ldyBTdHJpbmdbXSB7IG9sZFBhdGggfSkpOyAKLQkJCVVwZGF0ZUNvcmUubG9nKG1zZywgbnVsbCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyByZW1vdmUgdGhlIGZlYXR1cmUgZmlsZXM7Ci0JCQlJdGVyYXRvciBpdGVyID0gaW5zdGFsbGVkRmlsZXMuaXRlcmF0b3IoKTsKLQkJCUZpbGUgZmVhdHVyZUZpbGUgPSBudWxsOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQlmZWF0dXJlRmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotCQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmZWF0dXJlRmlsZSk7Ci0JCQl9Ci0KLQkJCS8vIHJlbW92ZSB0aGUgZmVhdHVyZSBkaXJlY3RvcnkgaWYgZW1wdHkKLQkJCVN0cmluZyBmZWF0dXJlUGF0aCA9IGdldEZlYXR1cmVQYXRoKCk7Ci0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRW1wdHlEaXJlY3Rvcmllc0Zyb21GaWxlU3lzdGVtKG5ldyBGaWxlKGZlYXR1cmVQYXRoKSk7Ci0JCX0KLQkJY2xvc2VkID0gdHJ1ZTsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogY29tbWl0IHRoZSBwbHVnaW5zIGluc3RhbGxlZCBhcyBhcmNoaXZlIG9uIHRoZSBzaXRlCi0JICogKGNyZWF0ZXMgdGhlIG1hcCBiZXR3ZWVuIHRoZSBwbHVnaW4gaWQgYW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgcGx1Z2luKQotCSAqLwotCXByaXZhdGUgdm9pZCBjb21taXRQbHVnaW5zKElGZWF0dXJlUmVmZXJlbmNlIGxvY2FsRmVhdHVyZVJlZmVyZW5jZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQotCQkvLyBnZXQgdGhlIGZlYXR1cmUKLQkJICgoU2l0ZUZpbGUpIGdldFNpdGUoKSkuYWRkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKChTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKSBsb2NhbEZlYXR1cmVSZWZlcmVuY2UpOwotCQlJRmVhdHVyZSBsb2NhbEZlYXR1cmUgPSBudWxsOwotCQl0cnkgewotCQkJbG9jYWxGZWF0dXJlID0gbG9jYWxGZWF0dXJlUmVmZXJlbmNlLmdldEZlYXR1cmUobnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS53YXJuKG51bGwsIGUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCi0JCWlmIChsb2NhbEZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkKLQkJLy8gYWRkIHRoZSBpbnN0YWxsZWQgcGx1Z2lucyBkaXJlY3RvcmllcyBhcyBhcmNoaXZlcyBlbnRyeQotCQlBcmNoaXZlUmVmZXJlbmNlTW9kZWwgYXJjaGl2ZSA9IG51bGw7Ci0JCUlQbHVnaW5FbnRyeVtdIHBsdWdpbkVudHJpZXMgPSBsb2NhbEZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbkVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyB2ZXJzaW9uSWQgPSBwbHVnaW5FbnRyaWVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQkJU3RyaW5nIHBsdWdpbklEID0gU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgdmVyc2lvbklkICsgRmVhdHVyZUNvbnRlbnRQcm92aWRlci5KQVJfRVhURU5TSU9OOwotCQkJYXJjaGl2ZSA9IGFyY2hpdmVGYWN0b3J5LmNyZWF0ZUFyY2hpdmVSZWZlcmVuY2VNb2RlbCgpOwotCQkJYXJjaGl2ZS5zZXRQYXRoKHBsdWdpbklEKTsKLQkJCXRyeSB7Ci0JCQkJVVJMIHVybCA9IG51bGw7Ci0JCQkJaWYgKHBsdWdpbkVudHJpZXNbaV0gaW5zdGFuY2VvZiBQbHVnaW5FbnRyeU1vZGVsCi0JCQkJCQkmJiAhKChQbHVnaW5FbnRyeU1vZGVsKSBwbHVnaW5FbnRyaWVzW2ldKS5pc1VucGFjaygpKSB7Ci0JCQkJCXVybCA9IG5ldyBVUkwoZ2V0U2l0ZSgpLmdldFVSTCgpLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEgJKyB2ZXJzaW9uSWQgKyAiLmphciIpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIHsKLQkJCQkJdXJsID0gbmV3IFVSTChnZXRTaXRlKCkuZ2V0VVJMKCksIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSAkrIHZlcnNpb25JZCArIEZpbGUuc2VwYXJhdG9yKTsKLQkJCQl9Ci0JCQkJYXJjaGl2ZS5zZXRVUkxTdHJpbmcodXJsLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJCWFyY2hpdmUucmVzb2x2ZSh1cmwsIG51bGwpOwotCQkJCSgoU2l0ZUZpbGUpIGdldFNpdGUoKSkuYWRkQXJjaGl2ZVJlZmVyZW5jZU1vZGVsKGFyY2hpdmUpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkKLQkJCQlTdHJpbmcgdXJsU3RyaW5nID0gKGdldFNpdGUoKS5nZXRVUkwoKSAhPSBudWxsKSA/IGdldFNpdGUoKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpIDogIiI7CS8vJE5PTi1OTFMtMSQKLQkJCQl1cmxTdHJpbmcgKz0gU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luRW50cmllc1tpXS50b1N0cmluZygpOwotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVGaWxlX1VuYWJsZVRvQ3JlYXRlVVJMLCAobmV3IFN0cmluZ1tdIHsgdXJsU3RyaW5nIH0pKSwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogQWRkcyBhIFNpdGVGaWxlUGx1Z2luQ29udGVudENvbnN1bWVyIHRvIHRoZSBsaXN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZENvbnRlbnRDb25zdW1lcnMoQ29udGVudENvbnN1bWVyIGNvbnMpIHsKLQkJaWYgKGNvbnRlbnRDb25zdW1lcnMgPT0gbnVsbCkKLQkJCWNvbnRlbnRDb25zdW1lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWNvbnRlbnRDb25zdW1lcnMuYWRkKGNvbnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWNlOGMyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUZpbGVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVDb250ZW50UHJvdmlkZXI7Ci0KLS8qKgotICogU2l0ZSBvbiB0aGUgRmlsZSBTeXN0ZW0KLSAqLwotcHVibGljIGNsYXNzIFNpdGVGaWxlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgU2l0ZUNvbnRlbnRQcm92aWRlciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lURV9UWVBFID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiOwkgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEZpbGVTaXRlCi0JICovCi0JcHVibGljIFNpdGVGaWxlQ29udGVudFByb3ZpZGVyKFVSTCB1cmwpIHsKLQkJc3VwZXIodXJsKTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZUZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUZpbGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZGM1Y2EuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5GZWF0dXJlQ29udGVudFByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5CYXNlU2l0ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQ29udGVudFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkphckNvbnRlbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuUGx1Z2luRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkFyY2hpdmVSZWZlcmVuY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5JbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuU2l0ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLlNpdGVNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLkJ1bmRsZU1hbmlmZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC5EZWZhdWx0UGx1Z2luUGFyc2VyOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFNpdGVGaWxlRmFjdG9yeSBleHRlbmRzIEJhc2VTaXRlRmFjdG9yeSB7Ci0KLQkvLyBwcml2YXRlIHdoZW4gcGFyc2luZyBmaWxlIHN5c3RlbQotCXByaXZhdGUgU2l0ZUZpbGUgc2l0ZTsKLQotCS8qCi0JICogQHNlZSBJU2l0ZUZhY3RvcnkjY3JlYXRlU2l0ZShVUkwsYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgSVNpdGUgY3JlYXRlU2l0ZShVUkwgdXJsKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIHsKLQotCQlTaXRlIHNpdGUgPSBudWxsOwotCQlJbnB1dFN0cmVhbSBzaXRlU3RyZWFtID0gbnVsbDsKLQkJU2l0ZU1vZGVsRmFjdG9yeSBmYWN0b3J5ID0gdGhpczsKLQotCQl0cnkgewotCQkJLy8gaWYgdXJsIHBvaW50cyB0byBhIGRpcmVjdG9yeQotCQkJLy8gYXR0ZW1wdCB0byBwYXJzZSBzaXRlLnhtbAotCQkJU3RyaW5nIHBhdGggPSB1cmwuZ2V0RmlsZSgpOwotCQkJRmlsZSBzaXRlTG9jYXRpb24gPSBuZXcgRmlsZShwYXRoKTsKLQkJCWlmIChzaXRlTG9jYXRpb24uaXNEaXJlY3RvcnkoKSkgewotCQkJCXVybCA9IHNpdGVMb2NhdGlvbi50b1VSTCgpOwotCQkJCUZpbGUgc2l0ZVhNTEZpbGUgPSBuZXcgRmlsZShzaXRlTG9jYXRpb24sIFNpdGUuU0lURV9YTUwpOwotCQkJCWlmIChzaXRlWE1MRmlsZS5leGlzdHMoKSkgewotCQkJCQlzaXRlU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzaXRlWE1MRmlsZSk7Ci0JCQkJCXNpdGUgPSAoU2l0ZSkgZmFjdG9yeS5wYXJzZVNpdGUoc2l0ZVN0cmVhbSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gcGFyc2Ugc2l0ZUxvY2F0aW9uCi0JCQkJCXNpdGUgPSBwYXJzZVNpdGUoc2l0ZUxvY2F0aW9uKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIHdlIGFyZSBub3QgcG9pbnRpbmcgdG8gYSBkaXJlY3RvcnkKLQkJCQkvLyBhdHRlbXB0IHRvIHBhcnNlIHRoZSBmaWxlCi0JCQkJdHJ5IHsKLQkJCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUodXJsKTsKLQkJCQkJc2l0ZVN0cmVhbSA9IG9wZW5TdHJlYW0ocmVzb2x2ZWRVUkwpOwotCQkJCQlzaXRlID0gKFNpdGUpIGZhY3RvcnkucGFyc2VTaXRlKHNpdGVTdHJlYW0pOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQotCQkJCQkvLyBhdHRlbXB0IHRvIHBhcnNlIHBhcmVudCBkaXJlY3RvcnkKLQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSk7Ci0JCQkJCUZpbGUgcGFyZW50RGlyZWN0b3J5ID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0KLQkJCQkJLy8gZG8gbm90IGNyZWF0ZSBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdAlbMTgzMThdCi0JCQkJCS8vIGluc3RlYWQgaHJvdyBlcnJvcgkJCQkJCi0JCQkJCWlmIChwYXJlbnREaXJlY3RvcnkgIT0gbnVsbCAmJiAhcGFyZW50RGlyZWN0b3J5LmV4aXN0cygpKQotCQkJCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuU2l0ZUZpbGVGYWN0b3J5X0RpcmVjdG9yeURvZXNOb3RFeGlzdCwgKG5ldyBTdHJpbmdbXSB7ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKX0pKSwgbnVsbCk7Ci0KLQkJCQkJaWYgKHBhcmVudERpcmVjdG9yeSA9PSBudWxsIHx8ICFwYXJlbnREaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkKLQkJCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVGaWxlRmFjdG9yeV9VbmFibGVUb09idGFpblBhcmVudERpcmVjdG9yeSwgKG5ldyBTdHJpbmdbXSB7ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKX0pKSwgbnVsbCk7Ci0KLQkJCQkJc2l0ZSA9IHBhcnNlU2l0ZShwYXJlbnREaXJlY3RvcnkpOwotCi0JCQkJfQotCQkJfQotCi0JCQlTaXRlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBTaXRlRmlsZUNvbnRlbnRQcm92aWRlcih1cmwpOwotCQkJc2l0ZS5zZXRTaXRlQ29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCQljb250ZW50UHJvdmlkZXIuc2V0U2l0ZShzaXRlKTsKLQkJCXNpdGUucmVzb2x2ZSh1cmwsIHVybCk7Ci0KLQkJCS8vIERvIG5vdCBzZXQgcmVhZCBvbmx5IGFzIG1heSBpbnN0YWxsIGluIGl0Ci0JCQkvL3NpdGUubWFya1JlYWRPbmx5KCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5TaXRlRmlsZUZhY3RvcnlfVW5hYmxlVG9DcmVhdGVVUkwsIChuZXcgU3RyaW5nW10ge3VybCA9PSBudWxsID8gIiIgOiB1cmwudG9FeHRlcm5hbEZvcm0oKX0pKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTWVzc2FnZXMuU2l0ZUZpbGVGYWN0b3J5X1VuYWJsZVRvQWNjZXNzU2l0ZSwgSVNpdGUuU0lURV9BQ0NFU1NfRVhDRVBUSU9OLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHNpdGVTdHJlYW0gIT0gbnVsbCkKLQkJCQkJc2l0ZVN0cmVhbS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiBzaXRlOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBwYXJzZVNpdGUuCi0JICovCi0JcHJpdmF0ZSBTaXRlIHBhcnNlU2l0ZShGaWxlIGRpcmVjdG9yeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCXRoaXMuc2l0ZSA9IChTaXRlRmlsZSkgY3JlYXRlU2l0ZU1hcE1vZGVsKCk7Ci0KLQkJaWYgKCFkaXJlY3RvcnkuZXhpc3RzKCkpCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5TaXRlRmlsZUZhY3RvcnlfRmlsZURvZXNOb3RFeGlzdCwgKG5ldyBTdHJpbmdbXSB7ZGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpfSkpLCBudWxsKTsKLQotCQlGaWxlIHBsdWdpblBhdGggPSBuZXcgRmlsZShkaXJlY3RvcnksIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCk7Ci0KLQkJLy9QQUNLQUdFRAotCQl0cnkgewotCQkJcGFyc2VQYWNrYWdlZEZlYXR1cmUoZGlyZWN0b3J5KTsgLy8gaW4gY2FzZSBpdCBjb250YWlucyBKQVIgZmlsZXMKLQkJfSBjYXRjaCAoRW1wdHlEaXJlY3RvcnlFeGNlcHRpb24gZWRlKSB7Ci0JCQlVcGRhdGVDb3JlLmxvZyhlZGUuZ2V0U3RhdHVzKCkpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXBhcnNlUGFja2FnZWRQbHVnaW5zKHBsdWdpblBhdGgpOwotCQl9IGNhdGNoIChFbXB0eURpcmVjdG9yeUV4Y2VwdGlvbiBlZGUpIHsKLQkJCVVwZGF0ZUNvcmUubG9nKGVkZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLQotCQkvLyBJTlNUQUxMRUQKLQkJdHJ5IHsKLQkJCXBhcnNlSW5zdGFsbGVkRmVhdHVyZShkaXJlY3RvcnkpOwotCQl9IGNhdGNoIChFbXB0eURpcmVjdG9yeUV4Y2VwdGlvbiBlZGUpIHsKLQkJCVVwZGF0ZUNvcmUubG9nKGVkZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLQotCQl0cnkgewotCQkJcGFyc2VJbnN0YWxsZWRQbHVnaW5zKHBsdWdpblBhdGgpOwotCQl9IGNhdGNoIChFbXB0eURpcmVjdG9yeUV4Y2VwdGlvbiBlZGUpIHsKLQkJCVVwZGF0ZUNvcmUubG9nKGVkZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLQotCQlyZXR1cm4gc2l0ZTsKLQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBwYXJzZUZlYXR1cmUuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlSW5zdGFsbGVkRmVhdHVyZShGaWxlIGRpcmVjdG9yeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUZpbGUgZmVhdHVyZURpciA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgpOwotCQlpZiAoZmVhdHVyZURpci5leGlzdHMoKSkgewotCQkJU3RyaW5nW10gZGlyOwotCQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmZWF0dXJlUmVmOwotCQkJVVJMIGZlYXR1cmVVUkw7Ci0JCQlGaWxlIGN1cnJlbnRGZWF0dXJlRGlyOwotCQkJU3RyaW5nIG5ld0ZpbGVQYXRoID0gbnVsbDsKLQotCQkJdHJ5IHsKLQkJCQkvLyBoYW5kbGUgdGhlIGluc3RhbGxlZCBmZWF0dXJlc0NvbmZpZ3VyZWQgdW5kZXIgZmVhdHVyZXNDb25maWd1cmVkIHN1YmRpcmVjdG9yeQotCQkJCWRpciA9IGZlYXR1cmVEaXIubGlzdCgpOwotCQkJCWlmIChkaXIgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgRW1wdHlEaXJlY3RvcnlFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuT0ssIGRpcmVjdG9yeS5nZXROYW1lKCkgKyBGaWxlLnNlcGFyYXRvciArIGRpcmVjdG9yeS5nZXROYW1lKCkgKyAiZGlyZWN0b3J5IGlzIGVtcHR5IiwgbnVsbCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBkaXIubGVuZ3RoOyBpbmRleCsrKSB7Ci0KLQkJCQkJLy8gdGhlIFVSTCBtdXN0IGVuZHMgd2l0aCAnLycgZm9yIHRoZSBidW5kbGUgdG8gYmUgcmVzb2x2ZWQKLQkJCQkJbmV3RmlsZVBhdGggPSBkaXJbaW5kZXhdICsgKGRpcltpbmRleF0uZW5kc1dpdGgoIi8iKSA/ICIvIiA6ICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJY3VycmVudEZlYXR1cmVEaXIgPSBuZXcgRmlsZShmZWF0dXJlRGlyLCBuZXdGaWxlUGF0aCk7Ci0JCQkJCS8vIGNoZWNrIGlmIGZlYXR1cmUueG1sIGV4aXN0cwotCQkJCQlGaWxlIGZlYXR1cmVYTUxGaWxlID0gbmV3IEZpbGUoY3VycmVudEZlYXR1cmVEaXIsIEZlYXR1cmUuRkVBVFVSRV9YTUwpOwotCQkJCQlpZiAoIWZlYXR1cmVYTUxGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byBmaW5kIGZlYXR1cmUueG1sIGluIGRpcmVjdG9yeToiICsgY3VycmVudEZlYXR1cmVEaXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBQRVJGOiByZW1vdmUgY29kZQotCQkJCQkJLy9TaXRlRmlsZUZhY3RvcnkgYXJjaGl2ZUZhY3RvcnkgPSBuZXcgU2l0ZUZpbGVGYWN0b3J5KCk7Ci0JCQkJCQlmZWF0dXJlVVJMID0gY3VycmVudEZlYXR1cmVEaXIudG9VUkwoKTsKLQkJCQkJCWZlYXR1cmVSZWYgPSBjcmVhdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwoKTsKLQkJCQkJCWZlYXR1cmVSZWYuc2V0U2l0ZU1vZGVsKHNpdGUpOwotCQkJCQkJZmVhdHVyZVJlZi5zZXRVUkxTdHJpbmcoZmVhdHVyZVVSTC50b0V4dGVybmFsRm9ybSgpKTsKLQkJCQkJCWZlYXR1cmVSZWYuc2V0VHlwZShJU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1RZUEUpOwotCQkJCQkJKChTaXRlKSBzaXRlKS5hZGRGZWF0dXJlUmVmZXJlbmNlTW9kZWwoZmVhdHVyZVJlZik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVGaWxlRmFjdG9yeV9VbmFibGVUb0NyZWF0ZVVSTEZvckZpbGUsIChuZXcgU3RyaW5nW10ge25ld0ZpbGVQYXRofSkpLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSogTWV0aG9kIHBhcnNlRmVhdHVyZS4KLQkqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlUGFja2FnZWRGZWF0dXJlKEZpbGUgZGlyZWN0b3J5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJLy8gRkVBVFVSRVMKLQkJRmlsZSBmZWF0dXJlRGlyID0gbmV3IEZpbGUoZGlyZWN0b3J5LCBTaXRlLkRFRkFVTFRfRkVBVFVSRV9QQVRIKTsKLQkJaWYgKGZlYXR1cmVEaXIuZXhpc3RzKCkpIHsKLQkJCVN0cmluZ1tdIGRpcjsKLQkJCVNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZVJlZjsKLQkJCVVSTCBmZWF0dXJlVVJMOwotCQkJRmlsZSBjdXJyZW50RmVhdHVyZUZpbGU7Ci0JCQlTdHJpbmcgbmV3RmlsZVBhdGggPSBudWxsOwotCi0JCQl0cnkgewotCQkJCS8vIG9ubHkgbGlzdCBKQVIgZmlsZXMKLQkJCQlkaXIgPSBmZWF0dXJlRGlyLmxpc3QoRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyLmZpbHRlcik7Ci0JCQkJaWYgKGRpciA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBFbXB0eURpcmVjdG9yeUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5PSywgZGlyZWN0b3J5LmdldE5hbWUoKSArIEZpbGUuc2VwYXJhdG9yICsgZGlyZWN0b3J5LmdldE5hbWUoKSArICJkaXJlY3RvcnkgaXMgZW1wdHkiLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgZGlyLmxlbmd0aDsgaW5kZXgrKykgewotCi0JCQkJCS8vIGNoZWNrIGlmIHRoZSBKQVIgZmlsZSBjb250YWlucyBhIGZlYXR1cmUueG1sCi0JCQkJCWN1cnJlbnRGZWF0dXJlRmlsZSA9IG5ldyBGaWxlKGZlYXR1cmVEaXIsIGRpcltpbmRleF0pOwotCQkJCQlKYXJDb250ZW50UmVmZXJlbmNlIHJlZiA9IG5ldyBKYXJDb250ZW50UmVmZXJlbmNlKCIiLCBjdXJyZW50RmVhdHVyZUZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCUNvbnRlbnRSZWZlcmVuY2UgcmVzdWx0ID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlc3VsdCA9IHJlZi5wZWVrKEZlYXR1cmUuRkVBVFVSRV9YTUwsIG51bGwsIG51bGwpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlVcGRhdGVDb3JlLndhcm4oIkV4Y2VwdGlvbiByZXRyaWV2aW5nIGZlYXR1cmUueG1sIGluIGZpbGU6IiArIGN1cnJlbnRGZWF0dXJlRmlsZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIGZpbmQgZmVhdHVyZS54bWwgaW4gZmlsZToiICsgY3VycmVudEZlYXR1cmVGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGVsc2UgewotCQkJCQkJZmVhdHVyZVVSTCA9IGN1cnJlbnRGZWF0dXJlRmlsZS50b1VSTCgpOwotCQkJCQkJLy8gUEVSRjogcmVtb3ZlIGNvZGUKLQkJCQkJCS8vU2l0ZUZpbGVGYWN0b3J5IGFyY2hpdmVGYWN0b3J5ID0gbmV3IFNpdGVGaWxlRmFjdG9yeSgpOwotCQkJCQkJZmVhdHVyZVJlZiA9IGNyZWF0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCgpOwotCQkJCQkJZmVhdHVyZVJlZi5zZXRTaXRlTW9kZWwoc2l0ZSk7Ci0JCQkJCQlmZWF0dXJlUmVmLnNldFVSTFN0cmluZyhmZWF0dXJlVVJMLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJCQkJZmVhdHVyZVJlZi5zZXRUeXBlKElTaXRlLkRFRkFVTFRfUEFDS0FHRURfRkVBVFVSRV9UWVBFKTsKLQkJCQkJCXNpdGUuYWRkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKGZlYXR1cmVSZWYpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5TaXRlRmlsZUZhY3RvcnlfVW5hYmxlVG9DcmVhdGVVUkxGb3JGaWxlLCAobmV3IFN0cmluZ1tdIHtuZXdGaWxlUGF0aH0pKSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgcGFyc2VQbHVnaW5zLgotCSAqIAotCSAqIGxvb2sgaW50byBlYWNoIHBsdWdpbi9mcmFnbWVudCBkaXJlY3RvcnksIGNyYWNrIHRoZSBwbHVnaW4ueG1sIG9wZW4gKG9yCi0JICogZnJhZ21lbnQueG1sID8/PykgZ2V0IGlkIGFuZCB2ZXJzaW9uLCBjYWxjdWxhdGUgVVJMLi4uCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlSW5zdGFsbGVkUGx1Z2lucyhGaWxlIHBsdWdpbnNEaXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKCFwbHVnaW5zRGlyLmV4aXN0cygpIHx8ICFwbHVnaW5zRGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlGaWxlW10gZGlycyA9IHBsdWdpbnNEaXIubGlzdEZpbGVzKG5ldyBGaWxlRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZikgewotCQkJCXJldHVybiBmLmlzRGlyZWN0b3J5KCk7Ci0JCQl9Ci0JCX0pOwotCQlEZWZhdWx0UGx1Z2luUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0UGx1Z2luUGFyc2VyKCk7Ci0KLQkJaWYgKGRpcnMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEVtcHR5RGlyZWN0b3J5RXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLk9LLCBwbHVnaW5zRGlyLmdldE5hbWUoKSArIEZpbGUuc2VwYXJhdG9yICsgcGx1Z2luc0Rpci5nZXROYW1lKCkgKyAiZGlyZWN0b3J5IGlzIGVtcHR5IiwgbnVsbCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShkaXJzW2ldLCAiTUVUQS1JTkYvTUFOSUZFU1QuTUYiKTsgLy8kTk9OLU5MUy0xJAotCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlCdW5kbGVNYW5pZmVzdCBidW5kbGVNYW5pZmVzdCA9IG5ldyBCdW5kbGVNYW5pZmVzdChwbHVnaW5GaWxlKTsKLQkJCQlpZiAoYnVuZGxlTWFuaWZlc3QuZXhpc3RzKCkpIHsKLQkJCQkJUGx1Z2luRW50cnkgZW50cnkgPSBidW5kbGVNYW5pZmVzdC5nZXRQbHVnaW5FbnRyeSgpOwotCQkJCQlhZGRQYXJzZWRQbHVnaW4oZW50cnksIGRpcnNbaV0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICghKHBsdWdpbkZpbGUgPSBuZXcgRmlsZShkaXJzW2ldLCAicGx1Z2luLnhtbCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJLmV4aXN0cygpKSB7Ci0JCQkJCQlwbHVnaW5GaWxlID0gbmV3IEZpbGUoZGlyc1tpXSwgImZyYWdtZW50LnhtbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJaWYgKHBsdWdpbkZpbGUgIT0gbnVsbCAmJiBwbHVnaW5GaWxlLmV4aXN0cygpICYmICFwbHVnaW5GaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJCWluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwbHVnaW5GaWxlKTsKLQkJCQkJCVBsdWdpbkVudHJ5IGVudHJ5ID0gcGFyc2VyLnBhcnNlKGluKTsKLQkJCQkJCWFkZFBhcnNlZFBsdWdpbihlbnRyeSwgZGlyc1tpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIHBsdWdpbkZpbGVTdHJpbmcgPSAocGx1Z2luRmlsZSA9PSBudWxsKSA/IG51bGwgOiBwbHVnaW5GaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJCVVwZGF0ZUNvcmUubG9nKFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVGaWxlRmFjdG9yeV9FcnJvckFjY2Vzc2luZywgKG5ldyBTdHJpbmdbXSB7cGx1Z2luRmlsZVN0cmluZ30pKSwgZSkpOwotCQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgcGx1Z2luRmlsZVN0cmluZyA9IChwbHVnaW5GaWxlID09IG51bGwpID8gbnVsbCA6IHBsdWdpbkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJVXBkYXRlQ29yZS5sb2coVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuU2l0ZUZpbGVGYWN0b3J5X0Vycm9yUGFyc2luZ0ZpbGUsIChuZXcgU3RyaW5nW10ge3BsdWdpbkZpbGVTdHJpbmd9KSksIGUpKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGluICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWluLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHRyYW5zZm9ybSBlYWNoIFBsdWdpbiBhbmQgRnJhZ21lbnQgaW50byBhbiBBcmNoaXZlUmVmZXJlbmNlTW9kZWwKLQkgKiBhbmQgYSBQbHVnaW5FbnRyeSBmb3IgdGhlIFNpdGUJIAotCSAqLwotCS8vIFBFUkY6IHJlbW92ZWQgaW50ZXJtZWRpYXRlIFBsdWdpbiBvYmplY3QKLQlwcml2YXRlIHZvaWQgYWRkUGFyc2VkUGx1Z2luKFBsdWdpbkVudHJ5IGVudHJ5LCBGaWxlIGZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgbG9jYXRpb24gPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQotCQkJCS8vIGNyZWF0ZSB0aGUgcGx1Z2luIEVudHJ5Ci0JCQkJKChTaXRlKSBzaXRlKS5hZGRQbHVnaW5FbnRyeShlbnRyeSk7Ci0KLQkJCQkvLyBDcmVhdGUgdGhlIFNpdGUgbWFwcGluZyBBcmNoaXZlUmVmLT5QbHVnaW5FbnRyeQotCQkJCS8vIHRoZSBpZCBvZiB0aGUgYXJjaGl2ZVJlZiBpcyBwbHVnaW5zXDxwbHVnaW5pZD5fPHZlcj4uamFyIGFzIHBlciB0aGUgc3BlY3MKLQkJCQkvLyBQRVJGOiByZW1vdmUgY29kZQotCQkJCS8vU2l0ZUZpbGVGYWN0b3J5IGFyY2hpdmVGYWN0b3J5ID0gbmV3IFNpdGVGaWxlRmFjdG9yeSgpOwkJCQkKLQkJCQlBcmNoaXZlUmVmZXJlbmNlTW9kZWwgYXJjaGl2ZSA9IGNyZWF0ZUFyY2hpdmVSZWZlcmVuY2VNb2RlbCgpOwotCQkJCVN0cmluZyBpZCA9IChlbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQkJU3RyaW5nIHBsdWdpbklEID0gU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgaWQgKyBGZWF0dXJlQ29udGVudFByb3ZpZGVyLkpBUl9FWFRFTlNJT047Ci0JCQkJYXJjaGl2ZS5zZXRQYXRoKHBsdWdpbklEKTsKLQkJCQlsb2NhdGlvbiA9IGZpbGUudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpOwotCQkJCWFyY2hpdmUuc2V0VVJMU3RyaW5nKGxvY2F0aW9uKTsKLQkJCQkoKFNpdGUpIHNpdGUpLmFkZEFyY2hpdmVSZWZlcmVuY2VNb2RlbChhcmNoaXZlKTsKLQotCQkJCS8vIFRSQUNFCQkJCQotCQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19QQVJTSU5HKSB7Ci0JCQkJCVVwZGF0ZUNvcmUuZGVidWcoIkFkZGVkIGFyY2hpdmUgdG8gc2l0ZToiICsgcGx1Z2luSUQgKyAiIHBvaW50aW5nIHRvOiAiICsgbG9jYXRpb24pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5TaXRlRmlsZUZhY3RvcnlfVW5hYmxlVG9DcmVhdGVVUkxGb3JGaWxlLCAobmV3IFN0cmluZ1tdIHtsb2NhdGlvbn0pKSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlUGFja2FnZWRQbHVnaW5zKEZpbGUgcGx1Z2luRGlyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICghcGx1Z2luRGlyLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nW10gZGlyID0gcGx1Z2luRGlyLmxpc3QoRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyLmZpbHRlcik7Ci0KLQkJaWYgKGRpciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgRW1wdHlEaXJlY3RvcnlFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuT0ssIHBsdWdpbkRpci5nZXROYW1lKCkgKyBGaWxlLnNlcGFyYXRvciArIHBsdWdpbkRpci5nZXROYW1lKCkgKyAiZGlyZWN0b3J5IGlzIGVtcHR5IiwgbnVsbCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXIubGVuZ3RoOyBpKyspIHsKLQkJCUNvbnRlbnRSZWZlcmVuY2UgcmVmID0gbnVsbDsKLQkJCVN0cmluZyByZWZTdHJpbmcgPSBudWxsOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQkJSmFyQ29udGVudFJlZmVyZW5jZSBqYXJSZWZlcmVuY2UgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwbHVnaW5EaXIsIGRpcltpXSk7Ci0JCQkJamFyUmVmZXJlbmNlID0gbmV3IEphckNvbnRlbnRSZWZlcmVuY2UobnVsbCwgZmlsZSk7Ci0JCQkJcmVmID0gamFyUmVmZXJlbmNlLnBlZWsoIk1FVEEtSU5GL01BTklGRVNULk1GIiwgbnVsbCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocmVmICE9IG51bGwpIHsKLQkJCQkJaW4gPSByZWYuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCQkJQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgQnVuZGxlTWFuaWZlc3QoaW4pOwotCQkJCQlpZiAobWFuaWZlc3QuZXhpc3RzKCkpIHsKLQotCQkJCQkJYWRkUGFyc2VkUGx1Z2luKG1hbmlmZXN0LmdldFBsdWdpbkVudHJ5KCksIGZpbGUpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmVmID0gamFyUmVmZXJlbmNlLnBlZWsoInBsdWdpbi54bWwiLCBudWxsLCBudWxsKTsvLyROT04tTkxTLTEkCi0JCQkJaWYgKHJlZiA9PSBudWxsKSB7Ci0JCQkJCXJlZiA9IGphclJlZmVyZW5jZS5wZWVrKCJmcmFnbWVudC54bWwiLCBudWxsLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAocmVmICE9IG51bGwpIHsKLQkJCQkJaW4gPSByZWYuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCQkJUGx1Z2luRW50cnkgZW50cnkgPSBuZXcgRGVmYXVsdFBsdWdpblBhcnNlcigpLnBhcnNlKGluKTsKLQkJCQkJYWRkUGFyc2VkUGx1Z2luKGVudHJ5LCBmaWxlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRyeSB7Ci0JCQkJCXJlZlN0cmluZyA9IChyZWYgPT0gbnVsbCkgPyBudWxsIDogcmVmLmFzVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQl9Ci0KLQkJCQlTdHJpbmcgbWVzc2FnZTsKLQotCQkJCWlmIChlIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHsKLQkJCQkJbWVzc2FnZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVGaWxlRmFjdG9yeV9FcnJvckFjY2Vzc2luZywgKG5ldyBTdHJpbmdbXSB7cmVmU3RyaW5nfSkpOwotCQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFNBWEV4Y2VwdGlvbikgewotCQkJCQltZXNzYWdlID0gTkxTLmJpbmQoTWVzc2FnZXMuU2l0ZUZpbGVGYWN0b3J5X0Vycm9yUGFyc2luZ0ZpbGUsIChuZXcgU3RyaW5nW10ge3JlZlN0cmluZ30pKTsKLQkJCQl9IGVsc2UgewotCQkJCQltZXNzYWdlID0gTkxTLmJpbmQoTWVzc2FnZXMuU2l0ZUZpbGVGYWN0b3J5X0Vycm9yQWNjZXNzaW5nLCAobmV3IFN0cmluZ1tdIHtyZWZTdHJpbmd9KSk7Ci0JCQkJfS8vIGVuZCBpZgotCi0JCQkJLy8gTG9nIGV4Y2VwdGlvbiwgYnV0IGRvIG5vdCB0aHJvdyB0byBjYWxsZXIuCi0JCQkJLy8gQ29udGludWUgd2l0aCBwcm9jZXNzaW5nIHJlbWFpbmluZyBwbHVnLWlucwotCQkJCVVwZGF0ZUNvcmUubG9nKG1lc3NhZ2UsIGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoaW4gIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJaW4uY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gY2UpIHsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoamFyUmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWphclJlZmVyZW5jZS5jbG9zZUFyY2hpdmUoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBTaXRlTW9kZWxGYWN0b3J5I2NyZWF0ZVNpdGVNYXBNb2RlbCgpCi0JICovCi0JcHVibGljIFNpdGVNb2RlbCBjcmVhdGVTaXRlTWFwTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU2l0ZUZpbGUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgU2l0ZU1vZGVsRmFjdG9yeSNjYW5QYXJzZVNpdGVUeXBlKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5QYXJzZVNpdGVUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAoc3VwZXIuY2FuUGFyc2VTaXRlVHlwZSh0eXBlKSB8fCBTaXRlRmlsZUNvbnRlbnRQcm92aWRlci5TSVRFX1RZUEUuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlTm9uUGx1Z2luQ29udGVudENvbnN1bWVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlTm9uUGx1Z2luQ29udGVudENvbnN1bWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYmZkNTguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZU5vblBsdWdpbkNvbnRlbnRDb25zdW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLQotLyoqCi0gKiBQbHVnaW4gQ29udGVudCBDb25zdW1lciBvbiBhIFNpdGUKLSAqLwotcHVibGljIGNsYXNzIFNpdGVGaWxlTm9uUGx1Z2luQ29udGVudENvbnN1bWVyIGV4dGVuZHMgQ29udGVudENvbnN1bWVyIHsKLQotCXByaXZhdGUgU3RyaW5nIHBhdGg7Ci0JcHJpdmF0ZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOwotCi0JLyoKLQkgKiBDb25zdHJ1Y3RvciAKLQkgKi8KLQlwdWJsaWMgU2l0ZUZpbGVOb25QbHVnaW5Db250ZW50Q29uc3VtZXIoU3RyaW5nIGZlYXR1cmVQYXRoKSB7Ci0JCXRoaXMucGF0aCA9IGZlYXR1cmVQYXRoOwotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZUNvbnRlbnRDb25zdW1lciNzdG9yZShDb250ZW50UmVmZXJlbmNlLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3JlKENvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKGNsb3NlZCkgewotCQkJVXBkYXRlQ29yZS53YXJuKCJBdHRlbXB0IHRvIHN0b3JlIGluIGEgY2xvc2VkIFNpdGVGaWxlTm9uUGx1Z2luQ29udGVudENvbnN1bWVyIiwgbmV3IEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOwotCQlTdHJpbmcgZmVhdHVyZVBhdGggPSBwYXRoOwotCQlTdHJpbmcgY29udGVudEtleSA9IGNvbnRlbnRSZWZlcmVuY2UuZ2V0SWRlbnRpZmllcigpOwotCQlmZWF0dXJlUGF0aCArPSBjb250ZW50S2V5OwotCQl0cnkgewotCQkJaW5TdHJlYW0gPSBjb250ZW50UmVmZXJlbmNlLmdldElucHV0U3RyZWFtKCk7Ci0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMuY29weVRvTG9jYWwoaW5TdHJlYW0sIGZlYXR1cmVQYXRoLCBudWxsKTsKLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5jaGVja1Blcm1pc3Npb25zKGNvbnRlbnRSZWZlcmVuY2UsIGZlYXR1cmVQYXRoKTsgLy8gMjAzMDUKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuR2xvYmFsQ29uc3VtZXJfRXJyb3JDcmVhdGluZ0ZpbGUsIChuZXcgU3RyaW5nW10geyBmZWF0dXJlUGF0aCB9KSksIGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluU3RyZWFtICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQkvLyBjbG9zZSBzdHJlYW0KLQkJCQkJaW5TdHJlYW0uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjY2xvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQlpZiAoY2xvc2VkKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHQgdG8gY2xvc2UgYSBjbG9zZWQgU2l0ZUZpbGVOb25QbHVnaW5Db250ZW50Q29uc3VtZXIiLCBuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQkJY2xvc2VkID0gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUZpbGVQYWNrZWRQbHVnaW5Db250ZW50Q29uc3VtZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUZpbGVQYWNrZWRQbHVnaW5Db250ZW50Q29uc3VtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY2NTIyNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlUGFja2VkUGx1Z2luQ29udGVudENvbnN1bWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi0vKioKLSAqIFBsdWdpbiBDb250ZW50IENvbnN1bWVyIG9uIGEgU2l0ZQotICogZm9yIGEgcGx1Z2luIHRoYXQgd2lsbCBydW4gZnJvbSBhIGphcgotICovCi1wdWJsaWMgY2xhc3MgU2l0ZUZpbGVQYWNrZWRQbHVnaW5Db250ZW50Q29uc3VtZXIgZXh0ZW5kcyBDb250ZW50Q29uc3VtZXIgewotCi0JcHJpdmF0ZSBJUGx1Z2luRW50cnkgcGx1Z2luRW50cnk7Ci0JcHJpdmF0ZSBJU2l0ZSBzaXRlOwotCXByaXZhdGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBqYXJQYXRoOwotCXByaXZhdGUgU3RyaW5nIHRlbXBQYXRoOwotCi0JLyoKLQkgKiBDb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBTaXRlRmlsZVBhY2tlZFBsdWdpbkNvbnRlbnRDb25zdW1lcihJUGx1Z2luRW50cnkgcGx1Z2luRW50cnksIElTaXRlIHNpdGUpIHsKLQkJdGhpcy5wbHVnaW5FbnRyeSA9IHBsdWdpbkVudHJ5OwotCQl0aGlzLnNpdGUgPSBzaXRlOwotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZUNvbnRlbnRDb25zdW1lciNzdG9yZShDb250ZW50UmVmZXJlbmNlLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3JlKENvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKLQotCQlpZiAoY2xvc2VkKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHQgdG8gc3RvcmUgaW4gYSBjbG9zZWQgU2l0ZUZpbGVQbHVnaW5Db250ZW50Q29uc3VtZXIiLCBuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQl0cnkgewotCQkJVVJMIG5ld1VSTCA9IG5ldyBVUkwoc2l0ZS5nZXRVUkwoKSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luRW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkgKyAiLmphciIpOyAvLyROT04tTkxTLTEkCi0JCQlpblN0cmVhbSA9IGNvbnRlbnRSZWZlcmVuY2UuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCWphclBhdGggPSBuZXdVUkwuZ2V0RmlsZSgpLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotCQkJRmlsZSBqYXJGaWxlID0gbmV3IEZpbGUoamFyUGF0aCk7Ci0JCQlpZiAoamFyRmlsZS5leGlzdHMoKSkgewotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLlVwZGF0ZU1hbmFnZXJVdGlsc19GaWxlQWxyZWFkeUV4aXN0cywgKG5ldyBPYmplY3RbXSB7IGphckZpbGUgfSkpLCBudWxsKTsKLQkJCX0KLQkJCS8vIGVycm9yIHJlY292ZXJ5Ci0JCQl0ZW1wUGF0aD0gRXJyb3JSZWNvdmVyeUxvZy5nZXRMb2NhbFJhbmRvbUlkZW50aWZpZXIoamFyUGF0aCsiLnRtcCIpOyAvLyROT04tTkxTLTEkCi0JCQkJRXJyb3JSZWNvdmVyeUxvZy5nZXRMb2coKS5hcHBlbmRQYXRoKEVycm9yUmVjb3ZlcnlMb2cuQlVORExFX0pBUl9FTlRSWSwgdGVtcFBhdGgpOwotCQkJLy8KLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5jb3B5VG9Mb2NhbChpblN0cmVhbSwgdGVtcFBhdGgsIG51bGwpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5HbG9iYWxDb25zdW1lcl9FcnJvckNyZWF0aW5nRmlsZSwgKG5ldyBTdHJpbmdbXSB7IHRlbXBQYXRoIH0pKSwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW5TdHJlYW0gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCS8vIGNsb3NlIHN0cmVhbQotCQkJCQlpblN0cmVhbS5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjY2xvc2UoKSAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlpZiAoY2xvc2VkKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHQgdG8gY2xvc2UgYSBjbG9zZWQgU2l0ZUZpbGVQbHVnaW5Db250ZW50Q29uc3VtZXIiLCBuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAodGVtcFBhdGggIT0gbnVsbCkgewotCQkJLy8gcmVuYW1lIGZpbGUgCi0JCQlFcnJvclJlY292ZXJ5TG9nLmdldExvZygpLmFwcGVuZFBhdGgoRXJyb3JSZWNvdmVyeUxvZy5SRU5BTUVfRU5UUlksIHRlbXBQYXRoKTsKLQkJCUZpbGUgZmlsZVRvUmVuYW1lID0gbmV3IEZpbGUodGVtcFBhdGgpOwotCQkJYm9vbGVhbiBzdWNlc3MgPSBmYWxzZTsKLQkJCWlmIChmaWxlVG9SZW5hbWUuZXhpc3RzKCkpIHsKLQkJCQlGaWxlIHJlbmFtZWRGaWxlID0gbmV3IEZpbGUoamFyUGF0aCk7Ci0JCQkJc3VjZXNzID0gZmlsZVRvUmVuYW1lLnJlbmFtZVRvKHJlbmFtZWRGaWxlKTsKLQkJCX0KLQkJCWlmICghc3VjZXNzKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLkNvbnRlbnRDb25zdW1lcl9VbmFibGVUb1JlbmFtZSwgKG5ldyBTdHJpbmdbXSB7IHRlbXBQYXRoLCBqYXJQYXRoIH0pKTsKLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihtc2csIG5ldyBFeGNlcHRpb24obXNnKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc2l0ZSBpbnN0YW5jZW9mIFNpdGVGaWxlKQotCQkJICgoU2l0ZUZpbGUpIHNpdGUpLmFkZFBsdWdpbkVudHJ5KHBsdWdpbkVudHJ5KTsKLQkJY2xvc2VkID0gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGFib3J0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWlmIChjbG9zZWQpIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiQXR0ZW1wdCB0byBhYm9ydCBhIGNsb3NlZCBTaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lciIsIG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCWJvb2xlYW4gc3VjZXNzID0gdHJ1ZTsKLQotCQkvLyBkZWxldGUgcGx1Z2luLmphcgotCQlpZiAoamFyUGF0aCAhPSBudWxsKSB7Ci0JCQlFcnJvclJlY292ZXJ5TG9nLmdldExvZygpLmFwcGVuZFBhdGgoRXJyb3JSZWNvdmVyeUxvZy5ERUxFVEVfRU5UUlksIGphclBhdGgpOwotCQkJRmlsZSBmaWxlVG9SZW1vdmUgPSBuZXcgRmlsZShqYXJQYXRoKTsKLQotCQkJaWYgKGZpbGVUb1JlbW92ZS5leGlzdHMoKSkgewotCQkJCXN1Y2VzcyA9IGZpbGVUb1JlbW92ZS5kZWxldGUoKTsKLQkJCX0KLQkJfQotCi0JCWlmICghc3VjZXNzKSB7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMuU2l0ZUZpbGVQYWNrZWRQbHVnaW5Db250ZW50Q29uc3VtZXJfdW5hYmxlVG9EZWxldGUsIChuZXcgU3RyaW5nW10geyBqYXJQYXRoIH0pKTsgCi0JCQlVcGRhdGVDb3JlLmxvZyhtc2csIG51bGwpOwotCQl9Ci0JCWNsb3NlZCA9IHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlUGx1Z2luQ29udGVudENvbnN1bWVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlUGx1Z2luQ29udGVudENvbnN1bWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiM2QwNDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci0KLS8qKgotICogUGx1Z2luIENvbnRlbnQgQ29uc3VtZXIgb24gYSBTaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBTaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lciBleHRlbmRzIENvbnRlbnRDb25zdW1lciB7Ci0KLQlwcml2YXRlIElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeTsKLQlwcml2YXRlIElTaXRlIHNpdGU7Ci0JcHJpdmF0ZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOwotCi0JLy8gcmVjb3ZlcnkKLQkvLyB0ZW1wb3JhcnkgbmFtZSB0byBvcmlnaW5hbCBuYW1lIG1hcAotCXByaXZhdGUgTWFwIHJlbmFtZXMgPSBuZXcgSGFzaE1hcCgyKTsKLQotCS8vIGZvciBhYm9ydAotCXByaXZhdGUgTGlzdCAvKm9mIHBhdGggYXMgU3RyaW5nICovCi0JaW5zdGFsbGVkRmlsZXM7Ci0KLQkvKgotCSAqIENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFNpdGVGaWxlUGx1Z2luQ29udGVudENvbnN1bWVyKElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSwgSVNpdGUgc2l0ZSkgewotCQl0aGlzLnBsdWdpbkVudHJ5ID0gcGx1Z2luRW50cnk7Ci0JCXRoaXMuc2l0ZSA9IHNpdGU7Ci0JCWluc3RhbGxlZEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZUNvbnRlbnRDb25zdW1lciNzdG9yZShDb250ZW50UmVmZXJlbmNlLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3JlKENvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKLQkJU3RyaW5nIHBsdWdpblBhdGggPSBudWxsOwotCi0JCWlmIChjbG9zZWQpIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiQXR0ZW1wdCB0byBzdG9yZSBpbiBhIGNsb3NlZCBTaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lciIsIG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCXRyeSB7Ci0JCQlVUkwgbmV3VVJMID0gbmV3IFVSTChzaXRlLmdldFVSTCgpLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQlwbHVnaW5QYXRoID0gbmV3VVJMLmdldEZpbGUoKTsgCi0JCQlTdHJpbmcgY29udGVudEtleSA9IGNvbnRlbnRSZWZlcmVuY2UuZ2V0SWRlbnRpZmllcigpOwotCQkJaW5TdHJlYW0gPSBjb250ZW50UmVmZXJlbmNlLmdldElucHV0U3RyZWFtKCk7Ci0JCQlwbHVnaW5QYXRoICs9IHBsdWdpblBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpID8gY29udGVudEtleSA6IEZpbGUuc2VwYXJhdG9yICsgY29udGVudEtleTsKLQotCQkJLy8gZXJyb3IgcmVjb3ZlcnkKLQkJCVN0cmluZyBsb2dFbnRyeT1udWxsOwotCQkJaWYgKCJwbHVnaW4ueG1sIi5lcXVhbHMoY29udGVudEtleSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWxvZ0VudHJ5PUVycm9yUmVjb3ZlcnlMb2cuUExVR0lOX0VOVFJZOwotCQkJfSBlbHNlIGlmICgiZnJhZ21lbnQueG1sIi5lcXVhbHMoY29udGVudEtleSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWxvZ0VudHJ5PUVycm9yUmVjb3ZlcnlMb2cuRlJBR01FTlRfRU5UUlk7Ci0JCQl9IGVsc2UgaWYgKCJNRVRBLUlORi9NQU5JRkVTVC5NRiIuZXF1YWxzKGNvbnRlbnRLZXkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlsb2dFbnRyeT1FcnJvclJlY292ZXJ5TG9nLkJVTkRMRV9NQU5JRkVTVF9FTlRSWTsKLQkJCX0KLQkJCWlmIChsb2dFbnRyeSE9bnVsbCkgewotCQkJCVN0cmluZyBvcmlnaW5hbE5hbWUgPSBwbHVnaW5QYXRoLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotCQkJCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUob3JpZ2luYWxOYW1lKTsKLQkJCQlpZiAobG9jYWxGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLlVwZGF0ZU1hbmFnZXJVdGlsc19GaWxlQWxyZWFkeUV4aXN0cywgKG5ldyBPYmplY3RbXSB7IGxvY2FsRmlsZSB9KSksIG51bGwpOwotCQkJCX0KLQkJCQlwbHVnaW5QYXRoID0gRXJyb3JSZWNvdmVyeUxvZy5nZXRMb2NhbFJhbmRvbUlkZW50aWZpZXIocGx1Z2luUGF0aCk7Ci0JCQkJcmVuYW1lcy5wdXQocGx1Z2luUGF0aCwgb3JpZ2luYWxOYW1lKTsKLQkJCQlFcnJvclJlY292ZXJ5TG9nLmdldExvZygpLmFwcGVuZFBhdGgobG9nRW50cnksIHBsdWdpblBhdGgpOwotCQkJfQotCQkJLy8KLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5jb3B5VG9Mb2NhbChpblN0cmVhbSwgcGx1Z2luUGF0aCwgbnVsbCk7Ci0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMuY2hlY2tQZXJtaXNzaW9ucyhjb250ZW50UmVmZXJlbmNlLCBwbHVnaW5QYXRoKTsgLy8gMjAzMDUKLQkJCWluc3RhbGxlZEZpbGVzLmFkZChwbHVnaW5QYXRoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuR2xvYmFsQ29uc3VtZXJfRXJyb3JDcmVhdGluZ0ZpbGUsIChuZXcgU3RyaW5nW10geyBwbHVnaW5QYXRoIH0pKSwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW5TdHJlYW0gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCS8vIGNsb3NlIHN0cmVhbQotCQkJCQlpblN0cmVhbS5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjY2xvc2UoKSAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlpZiAoY2xvc2VkKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHQgdG8gY2xvc2UgYSBjbG9zZWQgU2l0ZUZpbGVQbHVnaW5Db250ZW50Q29uc3VtZXIiLCBuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IoSXRlcmF0b3IgaXQgPSByZW5hbWVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyl7Ci0JCQkvLyByZW5hbWUgZmlsZSAKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpaXQubmV4dCgpOwotCQkJU3RyaW5nIHRlbXBvcmFyeSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJU3RyaW5nIG9yaWdpbmFsID0gKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCUVycm9yUmVjb3ZlcnlMb2cuZ2V0TG9nKCkuYXBwZW5kUGF0aChFcnJvclJlY292ZXJ5TG9nLlJFTkFNRV9FTlRSWSwgdGVtcG9yYXJ5KTsKLQkJCUZpbGUgZmlsZVRvUmVuYW1lID0gbmV3IEZpbGUodGVtcG9yYXJ5KTsKLQkJCWJvb2xlYW4gc3VjZXNzID0gZmFsc2U7Ci0JCQlpZiAoZmlsZVRvUmVuYW1lLmV4aXN0cygpKSB7Ci0JCQkJRmlsZSByZW5hbWVkRmlsZSA9IG5ldyBGaWxlKG9yaWdpbmFsKTsKLQkJCQlzdWNlc3MgPSBmaWxlVG9SZW5hbWUucmVuYW1lVG8ocmVuYW1lZEZpbGUpOwotCQkJfQotCQkJaWYgKCFzdWNlc3MpIHsKLQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMuQ29udGVudENvbnN1bWVyX1VuYWJsZVRvUmVuYW1lLCAobmV3IFN0cmluZ1tdIHsgdGVtcG9yYXJ5LCBvcmlnaW5hbCB9KSk7Ci0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24obXNnLCBuZXcgRXhjZXB0aW9uKG1zZykpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHNpdGUgaW5zdGFuY2VvZiBTaXRlRmlsZSkKLQkJCSAoKFNpdGVGaWxlKSBzaXRlKS5hZGRQbHVnaW5FbnRyeShwbHVnaW5FbnRyeSk7Ci0JCWNsb3NlZCA9IHRydWU7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhYm9ydCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlpZiAoY2xvc2VkKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHQgdG8gYWJvcnQgYSBjbG9zZWQgU2l0ZUZpbGVQbHVnaW5Db250ZW50Q29uc3VtZXIiLCBuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlib29sZWFuIHN1Y2Nlc3MgPSB0cnVlOwotCQlJbnN0YWxsUmVnaXN0cnkudW5yZWdpc3RlclBsdWdpbihwbHVnaW5FbnRyeSk7Ci0KLQkJLy8gZGVsZXRlIHBsdWdpbiBtYW5pZmVzdHMgZmlyc3QKLQkJZm9yKEl0ZXJhdG9yIGl0ID0gcmVuYW1lcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KXsKLQkJCVN0cmluZyBvcmlnaW5hbE5hbWUgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0KLQkJCUVycm9yUmVjb3ZlcnlMb2cuZ2V0TG9nKCkuYXBwZW5kUGF0aChFcnJvclJlY292ZXJ5TG9nLkRFTEVURV9FTlRSWSwgb3JpZ2luYWxOYW1lKTsKLQkJCUZpbGUgZmlsZVRvUmVtb3ZlID0gbmV3IEZpbGUob3JpZ2luYWxOYW1lKTsKLQkJCWlmIChmaWxlVG9SZW1vdmUuZXhpc3RzKCkpIHsKLQkJCQlpZighZmlsZVRvUmVtb3ZlLmRlbGV0ZSgpKXsKLQkJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVGaWxlUGx1Z2luQ29udGVudENvbnN1bWVyX3VuYWJsZVRvRGVsZXRlLCAobmV3IFN0cmluZ1tdIHsgb3JpZ2luYWxOYW1lIH0pKTsgCi0JCQkJCVVwZGF0ZUNvcmUubG9nKG1zZywgbnVsbCk7CQotCQkJCQlzdWNjZXNzID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCS8vIHJlbW92ZSB0aGUgcGx1Z2luIGZpbGVzOwotCQkJSXRlcmF0b3IgaXRlciA9IGluc3RhbGxlZEZpbGVzLml0ZXJhdG9yKCk7Ci0JCQlGaWxlIGZlYXR1cmVGaWxlID0gbnVsbDsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBwYXRoID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJZmVhdHVyZUZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmVhdHVyZUZpbGUpOwotCQkJfQotCi0JCQkvLyByZW1vdmUgdGhlIHBsdWdpbiBkaXJlY3RvcnkgaWYgZW1wdHkKLQkJCXRyeSB7Ci0JCQkJVVJMIG5ld1VSTCA9IG5ldyBVUkwoc2l0ZS5nZXRVUkwoKSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luRW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQkJCVN0cmluZyBwbHVnaW5QYXRoID0gbmV3VVJMLmdldEZpbGUoKTsKLQkJCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRW1wdHlEaXJlY3Rvcmllc0Zyb21GaWxlU3lzdGVtKG5ldyBGaWxlKHBsdWdpblBhdGgpKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9Ci0JCWNsb3NlZCA9IHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVSZWNvbmNpbGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVSZWNvbmNpbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZGI3ZmYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlUmVjb25jaWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLk1vZGVsT2JqZWN0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyB0aGUgcmVjb25jaWxpYXRpb24uCi0gKi8KLQotcHVibGljIGNsYXNzIFNpdGVSZWNvbmNpbGVyIGV4dGVuZHMgTW9kZWxPYmplY3QgewotCi0JcHJpdmF0ZSBTaXRlUmVjb25jaWxlcihMb2NhbFNpdGUgc2l0ZUxvY2FsKSB7Ci0JCS8vbmV2ZXIgaW5zdGFudGlhdGVkCi0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIGxpc3Qgb2YgY29uZmlndXJlZCBmZWF0dXJlcyBlbGltaW5hdGluZyBleHRyYQotCSAqIGVudHJpZXMgKGlmIHBvc3NpYmxlKS4gTWFrZSBzdXJlIHdlIGRvIG5vdCBsZWF2ZSBjb25maWd1cmVkCi0JICogbmVzdGVkIGZlYXR1cmVzIHdpdGggImhvbGVzIiAoaWUuIHVuY29uZmlndXJlZCBjaGlsZHJlbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tDb25maWd1cmVkRmVhdHVyZXMoSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ3VyZWRTaXRlKSB7Ci0KLQkJLy8gTm90ZTogaWYgd2UgaGl0IGVycm9ycyBpbiB0aGUgdmFyaW91cyBjb21wdXRhdGlvbgotCQkvLyBtZXRob2RzIGFuZCB0aHJvdyBhIENvcmVFeGNlcHRpb24sIHdlIHdpbGwgbm90IGNhdGNoIGl0Ci0JCS8vIGluIHRoaXMgbWV0aG9kLiBDb25zZXF1ZW50bHkgd2Ugd2lsbCBub3QgYXR0ZW1wdCB0bwotCQkvLyB1bmNvbmZpZ3VyZSBhbnkgImV4dHJhIiBmZWF0dXJlcyBiZWNhdXNlIHdlIHdvdWxkIAotCQkvLyBsaWtlbHkgZ2V0IGl0IHdyb25nLiBUaGUgcGxhdGZvcm0gd2lsbCBydW4gd2l0aCBleHRyYSBmZWF0dXJlcwotCQkvLyBjb25maWd1cmVkLiBUaGUgcnVudGltZSB3aWxsIGVsaW1pbmF0ZSBleHRyYSBwbHVnaW5zIGJhc2VkCi0JCS8vIG9uIHJ1bnRpbWUgYmluZGluZyBydWxlcy4KLQotCQkvLyBkZXRlcm1pbmUgInByb3Bvc2VkIiBsaXN0IG9mIGNvbmZpZ3VyZWQgZmVhdHVyZXMKLQkJQ29uZmlndXJlZFNpdGUgY1NpdGUgPSAoQ29uZmlndXJlZFNpdGUpIGNvbmZpZ3VyZWRTaXRlOwotCQkvLyBkZWJ1ZwotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUkVDT05DSUxFUikgewotCQkJVXBkYXRlQ29yZS5kZWJ1ZygiVmFsaWRhdGUgY29uZmlndXJhdGlvbiBvZiBzaXRlICIgKyBjU2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjb25maWd1cmVkUmVmcyA9IGNTaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlBcnJheUxpc3QgYWxsUG9zc2libGVDb25maWd1cmVkRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJlZFJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGNvbmZpZ3VyZWRSZWZzW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJYWxsUG9zc2libGVDb25maWd1cmVkRmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQkJCS8vIGRlYnVnCi0JCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1JFQ09OQ0lMRVIpIHsKLQkJCQkJVXBkYXRlQ29yZS5kZWJ1ZygiICAgY29uZmlndXJlZCBmZWF0dXJlICIgKyBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCS8vIGZpbmQgdG9wIGxldmVsIGZlYXR1cmVzCi0JCUFycmF5TGlzdCB0b3BGZWF0dXJlcyA9IGNvbXB1dGVUb3BGZWF0dXJlcyhhbGxQb3NzaWJsZUNvbmZpZ3VyZWRGZWF0dXJlcyk7Ci0KLQkJLy8gZmluZCBub24gZWZpeCB0b3AgbGV2ZWwgZmVhdHVyZXMKLQkJQXJyYXlMaXN0IHRvcE5vbkVmaXhGZWF0dXJlcyA9IGdldE5vbkVmaXhGZWF0dXJlcyh0b3BGZWF0dXJlcyk7Ci0KLQkJLy8gZXhwYW5kIG5vbiBlZml4IHRvcCBsZXZlbCBmZWF0dXJlcyAoY29tcHV0ZSBmdWxsIG5lc3Rpbmcgc3RydWN0dXJlcykuCi0JCUFycmF5TGlzdCBjb25maWd1cmVkRmVhdHVyZXMgPSBleHBhbmRGZWF0dXJlcyh0b3BOb25FZml4RmVhdHVyZXMsIGNvbmZpZ3VyZWRTaXRlKTsKLQotCQkvLyByZXRyaWV2ZSBlZml4ZXMgdGhhdCBwYXRjaCBlbmFibGUgZmVhdHVyZQotCQkvLyB0aGV5IG11c3QgYmUga2VwdCBlbmFibGVkCi0JCWlmICh0b3BGZWF0dXJlcy5zaXplKCkgIT0gdG9wTm9uRWZpeEZlYXR1cmVzLnNpemUoKSkgewotCQkJTWFwIHBhdGNoZXMgPSBnZXRQYXRjaGVzQXNGZWF0dXJlKGFsbFBvc3NpYmxlQ29uZmlndXJlZEZlYXR1cmVzKTsKLQkJCWlmICghcGF0Y2hlcy5pc0VtcHR5KCkpIHsKLQkJCQkvLyBjYWxjdWxhdGUgZWZpeGVzIHRvIGVuYWJsZQotCQkJCUxpc3QgZWZpeGVzVG9FbmFibGUgPSBnZXRQYXRjaGVzVG9FbmFibGUocGF0Y2hlcywgY29uZmlndXJlZEZlYXR1cmVzKTsKLQkJCQkvLyBhZGQgZWZpZXMgdG8ga2VlcCBlbmFibGUKLQkJCQkvL2FkZCB0aGVtIHRvIHRoZSBlbmFibGUgbGlzdAotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVmaXhlc1RvRW5hYmxlLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlJRmVhdHVyZSBlbGVtZW50ID0gKElGZWF0dXJlKSBpdGVyLm5leHQoKTsKLQkJCQkJQXJyYXlMaXN0IGV4cGFuZGVkRWZpeCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZXhwYW5kRWZpeEZlYXR1cmUoZWxlbWVudCwgZXhwYW5kZWRFZml4LCBjb25maWd1cmVkU2l0ZSk7Ci0JCQkJCWNvbmZpZ3VyZWRGZWF0dXJlcy5hZGRBbGwoZXhwYW5kZWRFZml4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBjb21wdXRlIGV4dHJhIGZlYXR1cmVzCi0JCUFycmF5TGlzdCBleHRyYXMgPSBkaWZmKGFsbFBvc3NpYmxlQ29uZmlndXJlZEZlYXR1cmVzLCBjb25maWd1cmVkRmVhdHVyZXMpOwotCi0JCS8vIHVuY29uZmlndXJlIGV4dHJhIGZlYXR1cmVzCi0JCUNvbmZpZ3VyYXRpb25Qb2xpY3kgY1BvbGljeSA9IGNTaXRlLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRyYXMuc2l6ZSgpOyBpKyspIHsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoSUZlYXR1cmUpIGV4dHJhcy5nZXQoaSk7Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBjU2l0ZS5nZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZShmZWF0dXJlKTsKLQkJCXRyeSB7Ci0JCQkJY1BvbGljeS51bmNvbmZpZ3VyZShyZWYsIHRydWUsIGZhbHNlKTsKLQkJCQkvLyBkZWJ1ZwotCQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19SRUNPTkNJTEVSKSB7Ci0JCQkJCVVwZGF0ZUNvcmUuZGVidWcoIlVuY29uZmlndXJpbmcgXCJleHRyYVwiIGZlYXR1cmUgIiArIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJVXBkYXRlQ29yZS53YXJuKCIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGNvbXB1dGVUb3BGZWF0dXJlcyhBcnJheUxpc3QgZmVhdHVyZXMpIHsKLQkJLyogbWFwIG9mIEZlYXR1cmUgYnkgVmVyc2lvbmVkSWRlbnRpZmllciAqLwotCQlNYXAgdG9wRmVhdHVyZXMgPSBuZXcgSGFzaE1hcChmZWF0dXJlcy5zaXplKCkpOwotCQkvLyBzdGFydCB3aXRoIHRoZSBmZWF0dXJlcyBwYXNzZWQgaW4KLQkJZm9yIChJdGVyYXRvciBpdCA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUlGZWF0dXJlIGYgPSAoKElGZWF0dXJlKSBpdC5uZXh0KCkpOwotCQkJdG9wRmVhdHVyZXMucHV0KGYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLCBmKTsKLQkJfQotCQkvLyByZW1vdmUgYWxsIGZlYXR1cmVzIHRoYXQgbmVzdCBpbiBzb21lIG90aGVyIGZlYXR1cmUKLQkJZm9yIChJdGVyYXRvciBpdCA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCXRyeSB7Ci0JCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0gKChJRmVhdHVyZSkgaXQubmV4dCgpKS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZHJlbi5sZW5ndGg7IGorKykgewotCQkJCQl0cnkgewotCQkJCQkJdG9wRmVhdHVyZXMucmVtb3ZlKGNoaWxkcmVuW2pdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLQkJCQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19XQVJOSU5HUykKLQkJCQkJCQlVcGRhdGVDb3JlLndhcm4oIiIsIGUxKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJVXBkYXRlQ29yZS53YXJuKCIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlsaXN0LmFkZEFsbCh0b3BGZWF0dXJlcy52YWx1ZXMoKSk7Ci0JCS8vIGRlYnVnCi0JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19SRUNPTkNJTEVSKSB7Ci0JCQlVcGRhdGVDb3JlLmRlYnVnKCJDb21wdXRlZCB0b3AtbGV2ZWwgZmVhdHVyZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b3BGZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCVVwZGF0ZUNvcmUuZGVidWcoIiAgICIgKyAoKElGZWF0dXJlKSBsaXN0LmdldChpKSkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgZXhwYW5kRmVhdHVyZXMoQXJyYXlMaXN0IGZlYXR1cmVzLCBJQ29uZmlndXJlZFNpdGUgY29uZmlndXJlZFNpdGUpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBleHBhbmQgYWxsIHRvcCBsZXZlbCBmZWF0dXJlcwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQlleHBhbmRGZWF0dXJlKChJRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpLCByZXN1bHQsIGNvbmZpZ3VyZWRTaXRlKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGV4cGFuZEZlYXR1cmUoSUZlYXR1cmUgZmVhdHVyZSwgQXJyYXlMaXN0IGZlYXR1cmVzLCBJQ29uZmlndXJlZFNpdGUgY29uZmlndXJlZFNpdGUpIHsKLQotCQkvLyBhZGQgZmVhdHVyZQotCQlpZiAoIWZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpKSB7Ci0JCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JCQkvLyBkZWJ1ZwotCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1JFQ09OQ0lMRVIpIHsKLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJSZXRhaW5pbmcgY29uZmlndXJlZCBmZWF0dXJlICIgKyBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIG5lc3RlZCBjaGlsZHJlbiB0byB0aGUgbGlzdAotCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW4gPSBudWxsOwotCQl0cnkgewotCQkJY2hpbGRyZW4gPSBmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkcmVuLmxlbmd0aDsgaisrKSB7Ci0JCQlJRmVhdHVyZSBjaGlsZCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWNoaWxkID0gY2hpbGRyZW5bal0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWlmICghVXBkYXRlTWFuYWdlclV0aWxzLmlzT3B0aW9uYWwoY2hpbGRyZW5bal0pKQotCQkJCQlVcGRhdGVDb3JlLndhcm4oIiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJLy8gMjUyMDIgZG8gbm90IHJldHVybiByaWdodCBub3csIHRoZSBwZWVyIGNoaWxkcmVuIG1heSBiZSBvawotCQkJfQotCQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQkJZXhwYW5kRmVhdHVyZShjaGlsZCwgZmVhdHVyZXMsIGNvbmZpZ3VyZWRTaXRlKTsKLQkJfQotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGRpZmYoQXJyYXlMaXN0IGxlZnQsIEFycmF5TGlzdCByaWdodCkgewotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIGRldGVybWluZSBkaWZmZXJlbmNlIChsZWZ0ICJtaW51cyIgcmlnaHQpCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVmdC5zaXplKCk7IGkrKykgewotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IChJRmVhdHVyZSkgbGVmdC5nZXQoaSk7Ci0JCQlpZiAoIXJpZ2h0LmNvbnRhaW5zKGZlYXR1cmUpKQotCQkJCXJlc3VsdC5hZGQoZmVhdHVyZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIGdldCB0aGUgbGlzdCBvZiBlbmFibGVkIHBhdGNoZXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNYXAgZ2V0UGF0Y2hlc0FzRmVhdHVyZShBcnJheUxpc3QgYWxsQ29uZmlndXJlZEZlYXR1cmVzKSB7Ci0JCS8vIGdldCBhbGwgZWZpeGVzIGFuZCB0aGUgYXNzb2NpYXRlZCBwYXRjaGVkIGZlYXR1cmVzCi0JCU1hcCBwYXRjaGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJaWYgKGFsbENvbmZpZ3VyZWRGZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdGVyID0gYWxsQ29uZmlndXJlZEZlYXR1cmVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlMaXN0IHBhdGNoZWRGZWF0dXJlc0lEID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUlGZWF0dXJlIGVsZW1lbnQgPSAoSUZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJCS8vIGFkZCB0aGUgcGF0Y2hlZCBmZWF0dXJlIGlkZW50aWZpZXJzCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50LmdldEltcG9ydHMoKS5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoZWxlbWVudC5nZXRJbXBvcnRzKClbaV0uaXNQYXRjaCgpKSB7Ci0JCQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIGlkID0gZWxlbWVudC5nZXRJbXBvcnRzKClbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1JFQ09OQ0lMRVIpCi0JCQkJCQkJVXBkYXRlQ29yZS5kZWJ1ZygiRm91bmQgcGF0Y2ggIiArIGVsZW1lbnQgKyAiIGZvciBmZWF0dXJlIGlkZW50aWZpZXIgIiArIGlkKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlwYXRjaGVkRmVhdHVyZXNJRC5hZGQoaWQpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKCFwYXRjaGVkRmVhdHVyZXNJRC5pc0VtcHR5KCkpIHsKLQkJCQkJcGF0Y2hlcy5wdXQoZWxlbWVudCwgcGF0Y2hlZEZlYXR1cmVzSUQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBwYXRjaGVzOwotCX0KLQotCS8qCi0JICogcmV0cnVucyB0aGUgbGlzdCBvZiBwYXRoZXMtZmVhdHVyZSB3aG8gcGF0Y2ggZW5hYmxlZCBmZWF0dXJlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIExpc3QgZ2V0UGF0Y2hlc1RvRW5hYmxlKE1hcCBlZml4ZXMsIEFycmF5TGlzdCBjb25maWd1cmVkRmVhdHVyZXMpIHsKLQotCQlBcnJheUxpc3QgZW5hYmxlZFZlcnNpb25lZElkZW50aWZpZXIgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBjb25maWd1cmVkRmVhdHVyZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJRmVhdHVyZSBlbGVtZW50ID0gKElGZWF0dXJlKSBpdGVyLm5leHQoKTsKLQkJCWVuYWJsZWRWZXJzaW9uZWRJZGVudGlmaWVyLmFkZChlbGVtZW50LmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7Ci0JCX0KLQotCQkvLyBsb29wIHRocm91Z2ggdGhlIHBhdGNoZXMKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWl0ZXIgPSBlZml4ZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlib29sZWFuIHRvRW5hYmxlID0gZmFsc2U7Ci0JCQlJRmVhdHVyZSBlZml4RmVhdHVyZSA9IChJRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQlMaXN0IHBhdGNoZWRGZWF0dXJlcyA9IChMaXN0KSBlZml4ZXMuZ2V0KGVmaXhGZWF0dXJlKTsKLQkJCS8vIGxvb3AgdGhyb3VnaCB0aGUgJ3BhdGNoZWQgZmVhdHVyZXMgaWRlbnRpZmllcicgdGhlIGZvciB0aGlzIHBhdGNoCi0JCQkvLyBzZWUgaWYgaXQgdGhlIHBhdGNoIHBhdGNoZXMgYXQgbGVhc3Qgb25lIGVuYWJsZSBmZWF0dXJlCi0JCQlJdGVyYXRvciBwYXRjaGVkRmVhdHVyZXNJdGVyID0gcGF0Y2hlZEZlYXR1cmVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAocGF0Y2hlZEZlYXR1cmVzSXRlci5oYXNOZXh0KCkgJiYgIXRvRW5hYmxlKSB7Ci0JCQkJVmVyc2lvbmVkSWRlbnRpZmllciBwYXRjaGVkRmVhdHVyZUlEID0gKFZlcnNpb25lZElkZW50aWZpZXIpIHBhdGNoZWRGZWF0dXJlc0l0ZXIubmV4dCgpOwotCQkJCWlmIChlbmFibGVkVmVyc2lvbmVkSWRlbnRpZmllci5jb250YWlucyhwYXRjaGVkRmVhdHVyZUlEKSkgewotCQkJCQl0b0VuYWJsZSA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIXRvRW5hYmxlKSB7Ci0JCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1JFQ09OQ0lMRVIpCi0JCQkJCVVwZGF0ZUNvcmUuZGVidWcoIlRoZSBQYXRjaCAiICsgZWZpeEZlYXR1cmUgKyAiIGRvZXMgbm90IHBhdGNoIGFueSBlbmFibGVkIGZlYXR1cmVzOiBpdCB3aWxsIGJlIGRpc2FibGVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfSBlbHNlIHsKLQkJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUkVDT05DSUxFUikKLQkJCQkJVXBkYXRlQ29yZS5kZWJ1ZygiVGhlIHBhdGNoICIgKyBlZml4RmVhdHVyZSArICIgd2lsbCBiZSBlbmFibGVkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXN1bHQuYWRkKGVmaXhGZWF0dXJlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogcmV0dXJucyB0aGUgZmVhdHVyZSB0aGF0IGFyZSBub3QgcGF0Y2hlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBnZXROb25FZml4RmVhdHVyZXMoQXJyYXlMaXN0IHRvcEZlYXR1cmVzKSB7Ci0JCU1hcCBlZml4RmVhdHVyZXMgPSBnZXRQYXRjaGVzQXNGZWF0dXJlKHRvcEZlYXR1cmVzKTsKLQkJU2V0IGtleVNldCA9IGVmaXhGZWF0dXJlcy5rZXlTZXQoKTsKLQkJaWYgKGtleVNldCA9PSBudWxsIHx8IGtleVNldC5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gdG9wRmVhdHVyZXM7Ci0KLQkJSXRlcmF0b3IgaXRlciA9IHRvcEZlYXR1cmVzLml0ZXJhdG9yKCk7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSUZlYXR1cmUgZWxlbWVudCA9IChJRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoIWtleVNldC5jb250YWlucyhlbGVtZW50KSkgewotCQkJCXJlc3VsdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIG9ubHkgZW5hYmxlIG5vbi1lZml4IGNoaWxkcmVuIHJlY3Vyc2l2ZWx5Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBleHBhbmRFZml4RmVhdHVyZShJRmVhdHVyZSBmZWF0dXJlLCBBcnJheUxpc3QgZmVhdHVyZXMsIElDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSkgewotCi0JCS8vIGFkZCBmZWF0dXJlCi0JCWlmICghZmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSkpIHsKLQkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJCS8vIGRlYnVnCi0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUkVDT05DSUxFUikgewotCQkJCVVwZGF0ZUNvcmUuZGVidWcoIlJldGFpbmluZyBjb25maWd1cmVkIGZlYXR1cmUgIiArIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgbmVzdGVkIGNoaWxkcmVuIHRvIHRoZSBsaXN0Ci0JCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljaGlsZHJlbiA9IGZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoaW50IGogPSAwOyBqIDwgY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHsKLQkJCUlGZWF0dXJlIGNoaWxkID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJY2hpbGQgPSBjaGlsZHJlbltqXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKCFjaGlsZHJlbltqXS5pc09wdGlvbmFsKCkpCi0JCQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyAyNTIwMiBkbyBub3QgcmV0dXJuIHJpZ2h0IG5vdywgdGhlIHBlZXIgY2hpbGRyZW4gbWF5IGJlIG9rCi0JCQl9Ci0JCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJCWlmICghVXBkYXRlQ29yZS5pc1BhdGNoKGNoaWxkKSkKLQkJCQkJZXhwYW5kRWZpeEZlYXR1cmUoY2hpbGQsIGZlYXR1cmVzLCBjb25maWd1cmVkU2l0ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZVN0YXR1c0FuYWx5emVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVTdGF0dXNBbmFseXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2RiYjFkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZVN0YXR1c0FuYWx5emVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5Db25maWd1cmF0b3JVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVmVyc2lvbmVkSWRlbnRpZmllcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wYWNrYWdlYWRtaW4uUGFja2FnZUFkbWluOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyB0aGUgY29uZmlndXJhdGlvbnMuCi0gKi8KLQotcHVibGljIGNsYXNzIFNpdGVTdGF0dXNBbmFseXplciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX0JVTkRMRVNfUEFUSCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnNvdXJjZS9zb3VyY2UuaW5mbyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBhbGxDb25maWd1cmVkRmVhdHVyZXM7IC8qVmVyc2lvbmVkSWRlbnRpZmllciAqLwotCXByaXZhdGUgTG9jYWxTaXRlIHNpdGVMb2NhbDsKLQotCS8vIEEgbGlzdCBvZiB2ZXJzaW9uZWRJZGVudGlmaWVycyBmb3Igc291cmNlIGJ1bmRsZXM7IGluaXRpYWxpemVkIG9uIGRlbWFuZC4KLQlwcml2YXRlIExpc3Qgc291cmNlQnVuZGxlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU2l0ZVN0YXR1c0FuYWx5emVyKExvY2FsU2l0ZSBzaXRlTG9jYWwpIHsKLQkJdGhpcy5zaXRlTG9jYWwgPSBzaXRlTG9jYWw7Ci0JfQotCi0JLyoKLQkgKiAgY2hlY2sgaWYgdGhlIFBsdWdpbnMgb2YgdGhlIGZlYXR1cmUgYXJlIG9uIHRoZSBwbHVnaW4gcGF0aAotCSAqICBJZiBhbGwgdGhlIHBsdWdpbnMgYXJlIG9uIHRoZSBwbHVnaW4gcGF0aCwgYW5kIHRoZSB2ZXJzaW9uIG1hdGNoIGFuZCB0aGVyZSBpcyBubyBvdGhlciB2ZXJzaW9uIC0+IEhBUFBZCi0JICogIElmIGFsbCB0aGUgcGx1Z2lucyBhcmUgb24gdGhlIHBsdWdpbiBwYXRoLCBhbmQgdGhlIHZlcnNpb24gbWF0Y2ggYW5kIHRoZXJlIGlzIG90aGVyIHZlcnNpb24gLT4gQU1CSUdVT1VTCi0JICogIElmIHNvbWUgb2YgdGhlIHBsdWdpbnMgYXJlIG9uIHRoZSBwbHVnaW4gcGF0aCwgYnV0IG5vdCBhbGwgLT4gVU5IQVBQWQotCSAqIAlDaGVjayBvbiBhbGwgQ29uZmlndXJlZFNpdGVzCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIGdldFN0YXR1cyhJRmVhdHVyZSBmZWF0dXJlKSB7Ci0KLQkJLy8gdmFsaWRhdGUgc2l0ZQotCQlJU2l0ZSBmZWF0dXJlU2l0ZSA9IGZlYXR1cmUuZ2V0U2l0ZSgpOwotCQlpZiAoZmVhdHVyZVNpdGUgPT0gbnVsbCkgewotCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0NPTkZJR1VSQVRJT04pCi0JCQkJVXBkYXRlQ29yZS5kZWJ1ZygiQ2Fubm90IGRldGVybWluZSBzdGF0dXMgb2YgZmVhdHVyZToiICsgZmVhdHVyZS5nZXRMYWJlbCgpICsgIi4gU2l0ZSBpcyBOVUxMLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5TaXRlTG9jYWxfVW5hYmxlVG9EZXRlcm1pbmVGZWF0dXJlU3RhdHVzU2l0ZU51bGwsIChuZXcgT2JqZWN0W10ge2ZlYXR1cmUuZ2V0VVJMKCl9KSk7Ci0JCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIElGZWF0dXJlLlNUQVRVU19BTUJJR1VPVVMsIG1zZywgbnVsbCk7Ci0JCX0KLQotCQkvLyB2YWxpZGF0ZSBjb25maWd1cmVkIHNpdGUJCQotCQlDb25maWd1cmVkU2l0ZSBjU2l0ZSA9IChDb25maWd1cmVkU2l0ZSkgZmVhdHVyZVNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCk7Ci0JCWlmIChjU2l0ZSA9PSBudWxsKSB7Ci0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfQ09ORklHVVJBVElPTikKLQkJCQlVcGRhdGVDb3JlLndhcm4oIkNhbm5vdCBkZXRlcm1pbmUgc3RhdHVzIG9mIGZlYXR1cmU6ICIgKyBmZWF0dXJlLmdldExhYmVsKCkgKyAiLiBDb25maWd1cmVkIFNpdGUgaXMgTlVMTC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMuU2l0ZUxvY2FsX1VuYWJsZVRvRGV0ZXJtaW5lRmVhdHVyZVN0YXR1c0NvbmZpZ3VyZWRTaXRlTnVsbCwgKG5ldyBPYmplY3RbXSB7ZmVhdHVyZS5nZXRVUkwoKX0pKTsKLQkJCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSUZlYXR1cmUuU1RBVFVTX0FNQklHVU9VUywgbXNnLCBudWxsKTsKLQkJfQotCi0JCS8vIGNoZWNrIGlmIGRpc2FibGUsIGlmIHNvIHJldHVybgotCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBjU2l0ZS5nZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZShmZWF0dXJlKTsKLQkJaWYgKHJlZiAhPSBudWxsKSB7Ci0JCQlpZiAoIWNTaXRlLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKS5pc0NvbmZpZ3VyZWQocmVmKSkKLQkJCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuT0ssIElGZWF0dXJlLlNUQVRVU19ESVNBQkxFRCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfQ09ORklHVVJBVElPTikKLQkJCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byBmaW5kIHJlZmVyZW5jZSBmb3IgZmVhdHVyZSAiICsgZmVhdHVyZSArICIgaW4gc2l0ZSAiICsgY1NpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQkvLyBjaGVjayBpZiBicm9rZW4KLQkJSVN0YXR1cyBzdGF0dXMgPSBjU2l0ZS5nZXRCcm9rZW5TdGF0dXMoZmVhdHVyZSk7Ci0JCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLk9LKSB7Ci0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfQ09ORklHVVJBVElPTikKLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJGZWF0dXJlIGJyb2tlbjoiICsgZmVhdHVyZS5nZXRMYWJlbCgpICsgIi5TaXRlOiIgKyBjU2l0ZS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQkJLy8gY2hlY2sgYW1iaWd1b3VzIGFnYWluc3QgcmVnaXN0cnkgWzE3MDE1XQotCQlJUGx1Z2luRW50cnlbXSBmZWF0dXJlc0VudHJpZXMgPSBmZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKLQkJcmV0dXJuIHN0YXR1cyhmZWF0dXJlLCBmZWF0dXJlc0VudHJpZXMpOwotCX0KLQotCS8qCi0JICogIGNoZWNrIGlmIHRoZSBQbHVnaW5zIG9mIHRoZSBmZWF0dXJlIGFyZSBvbiB0aGUgcGx1Z2luIHBhdGgKLQkgKiAgSWYgYWxsIHRoZSBwbHVnaW5zIGFyZSBvbiB0aGUgcGx1Z2luIHBhdGgsIGFuZCB0aGUgdmVyc2lvbiBtYXRjaCBhbmQgdGhlcmUgaXMgbm8gb3RoZXIgdmVyc2lvbiAtPiBIQVBQWQotCSAqICBJZiBhbGwgdGhlIHBsdWdpbnMgYXJlIG9uIHRoZSBwbHVnaW4gcGF0aCwgYW5kIHRoZSB2ZXJzaW9uIG1hdGNoIGFuZCB0aGVyZSBpcyBvdGhlciB2ZXJzaW9uIC0+IEFNQklHVU9VUwotCSAqICBJZiBzb21lIG9mIHRoZSBwbHVnaW5zIGFyZSBvbiB0aGUgcGx1Z2luIHBhdGgsIGJ1dCBub3QgYWxsIC0+IFVOSEFQUFkKLQkgKiAJQ2hlY2sgb24gYWxsIENvbmZpZ3VyZWRTaXRlcwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGdldEZlYXR1cmVTdGF0dXMoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUlGZWF0dXJlIGNoaWxkRmVhdHVyZSA9IG51bGw7Ci0JCUlTdGF0dXMgY2hpbGRTdGF0dXM7Ci0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiA9IGZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCi0JCS8vIGNvbnNpZGVyIGRpc2FibGUKLQkJLy8gY2hlY2sgdGhlIGN1cnJlbnQgZmVhdHVyZQotCQlTdHJpbmcgbXNnID0gTWVzc2FnZXMuU2l0ZUxvY2FsX0ZlYXR1cmVEaXNhYmxlOwotCQlpbnQgY29kZSA9IElGZWF0dXJlLlNUQVRVU19ESVNBQkxFRDsKLQkJSVN0YXR1cyBmZWF0dXJlU3RhdHVzID0gZ2V0U3RhdHVzKGZlYXR1cmUpOwotCQlNdWx0aVN0YXR1cyBtdWx0aVRlbXAgPSBuZXcgTXVsdGlTdGF0dXMoZmVhdHVyZVN0YXR1cy5nZXRQbHVnaW4oKSwgY29kZSwgbXNnLCBudWxsKTsKLQkJaWYgKGZlYXR1cmVTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQlpZiAoZmVhdHVyZVN0YXR1cy5pc011bHRpU3RhdHVzKCkpIHsKLQkJCQltdWx0aVRlbXAuYWRkQWxsKGZlYXR1cmVTdGF0dXMpOwotCQkJfSBlbHNlIHsKLQkJCQltdWx0aVRlbXAuYWRkKGZlYXR1cmVTdGF0dXMpOwotCQkJfQotCQl9Ci0JCS8vIHByZXNlcnZlIHRoZSB3b3JzZSBjb2RlIHRocm91Z2ggdGhlIG1ldGhvZCAoc2VsZiBhc3Nlc21lbnQgKyBjaGlsZHJlbiBhc3Nlc3NtZW50KQotCQlpZiAoZmVhdHVyZVN0YXR1cy5nZXRDb2RlKCkgPiBjb2RlKQotCQkJY29kZSA9IGZlYXR1cmVTdGF0dXMuZ2V0Q29kZSgpOwotCi0JCS8vIGRvIG5vdCBjaGVjayBjaGlsZHJlbiBpZiBmZWF0dXJlIGlzIGRpc2FibGUKLQkJaWYgKCEoY29kZSA9PSBJRmVhdHVyZS5TVEFUVVNfRElTQUJMRUQpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCFVcGRhdGVNYW5hZ2VyVXRpbHMuaXNPcHRpb25hbChjaGlsZHJlbltpXSkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNoaWxkRmVhdHVyZSA9IGNoaWxkcmVuW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJY2hpbGRGZWF0dXJlID0gbnVsbDsKLQkJCQkJCWlmICghVXBkYXRlTWFuYWdlclV0aWxzLmlzT3B0aW9uYWwoY2hpbGRyZW5baV0pKQotCQkJCQkJCVVwZGF0ZUNvcmUud2FybigiRXJyb3IgcmV0cmlldmluZyBmZWF0dXJlOiIgKyBjaGlsZHJlbltpXSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCi0JCQkJCWlmIChjaGlsZEZlYXR1cmUgPT0gbnVsbCkgewotCQkJCQkJVXBkYXRlQ29yZS53YXJuKCJnZXRGZWF0dXJlU3RhdHVzOiBGZWF0dXJlIGlzIG51bGwgZm9yOiIgKyBjaGlsZHJlbltpXSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIFVuYWJsZSB0byBmaW5kIGNoaWxkcmVuIGZlYXR1cmUsIGJyb2tlbgotCQkJCQkJT2JqZWN0IGZlYXR1cmVBc1ByaW50YWJsZU9iamVjdCA9IGNoaWxkcmVuW2ldLmdldFVSTCgpOwotCQkJCQkJZmVhdHVyZUFzUHJpbnRhYmxlT2JqZWN0ID0gY2hpbGRyZW5baV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJCQkJU3RyaW5nIG1zZzEgPSBOTFMuYmluZChNZXNzYWdlcy5TaXRlTG9jYWxfTmVzdGVkRmVhdHVyZVVuYXZhaWxhYmxlLCAobmV3IE9iamVjdFtdIHtmZWF0dXJlQXNQcmludGFibGVPYmplY3R9KSk7Ci0JCQkJCQltdWx0aVRlbXAuYWRkKGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBJRmVhdHVyZS5TVEFUVVNfVU5IQVBQWSwgbXNnMSwgbnVsbCkpOwotCQkJCQkJaWYgKElGZWF0dXJlLlNUQVRVU19VTkhBUFBZID4gY29kZSkKLQkJCQkJCQljb2RlID0gSUZlYXR1cmUuU1RBVFVTX1VOSEFQUFk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljaGlsZFN0YXR1cyA9IGdldEZlYXR1cmVTdGF0dXMoY2hpbGRGZWF0dXJlKTsKLQkJCQkJCS8vIGRvIG5vdCBhZGQgdGhlIHN0YXR1cywgYWRkIHRoZSBjaGlsZHJlbiBzdGF0dXMgYXMgZ2V0RmVhdHVyZVN0YXR1cwotCQkJCQkJLy8gcmV0dXJucyBhIG11bHRpU3RhdHVzIAotCQkJCQkJaWYgKGNoaWxkU3RhdHVzLmdldENvZGUoKSA9PSBJRmVhdHVyZS5TVEFUVVNfRElTQUJMRUQpIHsKLQkJCQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZlcnNpb25JRCA9IGNoaWxkRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQkJCQkJU3RyaW5nIGZlYXR1cmVWZXIgPSAodmVyc2lvbklEID09IG51bGwpID8gIiIgOiB2ZXJzaW9uSUQuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgbXNnMSA9IE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVMb2NhbF9OZXN0ZWRGZWF0dXJlRGlzYWJsZSwgKG5ldyBTdHJpbmdbXSB7Y2hpbGRGZWF0dXJlLmdldExhYmVsKCksIGZlYXR1cmVWZXJ9KSk7Ci0JCQkJCQkJbXVsdGlUZW1wLmFkZChjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgY2hpbGRTdGF0dXMuZ2V0Q29kZSgpLCBtc2cxLCBudWxsKSk7Ci0JCQkJCQkJaWYgKElGZWF0dXJlLlNUQVRVU19VTkhBUFBZID4gY29kZSkKLQkJCQkJCQkJY29kZSA9IElGZWF0dXJlLlNUQVRVU19VTkhBUFBZOwotCQkJCQkJfQotCQkJCQkJaWYgKGNoaWxkU3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5PSykgewotCQkJCQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmVyc2lvbklEID0gY2hpbGRGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCQkJCQlTdHJpbmcgZmVhdHVyZVZlciA9ICh2ZXJzaW9uSUQgPT0gbnVsbCkgPyAiIiA6IHZlcnNpb25JRC5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBtc2cxID0gTkxTLmJpbmQoTWVzc2FnZXMuU2l0ZUxvY2FsX05lc3RlZEZlYXR1cmVVbkhhcHB5LCAobmV3IFN0cmluZ1tdIHtjaGlsZEZlYXR1cmUuZ2V0TGFiZWwoKSwgZmVhdHVyZVZlcn0pKTsKLQkJCQkJCQltdWx0aVRlbXAuYWRkKGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBjaGlsZFN0YXR1cy5nZXRDb2RlKCksIG1zZzEsIG51bGwpKTsKLQkJCQkJCQlpZiAoY2hpbGRTdGF0dXMuZ2V0Q29kZSgpID4gY29kZSkKLQkJCQkJCQkJY29kZSA9IGNoaWxkU3RhdHVzLmdldENvZGUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHNldCBtZXNzYWdlCi0JCXN3aXRjaCAoY29kZSkgewotCQkJY2FzZSBJRmVhdHVyZS5TVEFUVVNfSEFQUFkgOgotCQkJCW1zZyA9IE1lc3NhZ2VzLlNpdGVMb2NhbF9GZWF0dXJlSGFwcHk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElGZWF0dXJlLlNUQVRVU19VTkhBUFBZIDoKLQkJCQltc2cgPSBNZXNzYWdlcy5TaXRlTG9jYWxfRmVhdHVyZVVuSGFwcHk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElGZWF0dXJlLlNUQVRVU19BTUJJR1VPVVMgOgotCQkJCW1zZyA9IE1lc3NhZ2VzLlNpdGVMb2NhbF9GZWF0dXJlQW1iaWd1b3VzOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJRmVhdHVyZS5TVEFUVVNfRElTQUJMRUQgOgotCQkJCW1zZyA9IE1lc3NhZ2VzLlNpdGVMb2NhbF9GZWF0dXJlRGlzYWJsZTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCW1zZyA9IE1lc3NhZ2VzLlNpdGVMb2NhbF9GZWF0dXJlU3RhdHVzVW5rbm93bjsKLQkJCQlicmVhazsKLQkJfQotCQlNdWx0aVN0YXR1cyBtdWx0aSA9IG5ldyBNdWx0aVN0YXR1cyhmZWF0dXJlU3RhdHVzLmdldFBsdWdpbigpLCBjb2RlLCBtc2csIG51bGwpOwotCQltdWx0aS5hZGRBbGwobXVsdGlUZW1wKTsKLQkJcmV0dXJuIG11bHRpOwotCX0KLQotCS8qCi0JICogY29tcHV0ZSB0aGUgc3RhdHVzIGJhc2VkIG9uIGdldFN0YXR1cygpIHJ1bGVzIAotCSAqLwotCXByaXZhdGUgSVN0YXR1cyBzdGF0dXMoSUZlYXR1cmUgcGx1Z2luc09yaWdpbmF0b3JGZWF0dXJlLCBJUGx1Z2luRW50cnlbXSBmZWF0dXJlUGx1Z2lucykgewotCQlWZXJzaW9uZWRJZGVudGlmaWVyIGZlYXR1cmVQbHVnaW5JRDsKLQotCQlTdHJpbmcgaGFwcHlNU0cgPSBNZXNzYWdlcy5TaXRlTG9jYWxfRmVhdHVyZUhhcHB5OwotCQlTdHJpbmcgYW1iaWd1b3VzTVNHID0gTWVzc2FnZXMuU2l0ZUxvY2FsX0ZlYXR1cmVBbWJpZ3VvdXM7Ci0JCUlTdGF0dXMgZmVhdHVyZVN0YXR1cyA9IGNyZWF0ZVN0YXR1cyhJU3RhdHVzLk9LLCBJRmVhdHVyZS5TVEFUVVNfSEFQUFksICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlNdWx0aVN0YXR1cyBtdWx0aSA9IG5ldyBNdWx0aVN0YXR1cyhmZWF0dXJlU3RhdHVzLmdldFBsdWdpbigpLCBJRmVhdHVyZS5TVEFUVVNfQU1CSUdVT1VTLCBhbWJpZ3VvdXNNU0csIG51bGwpOwotCQlQYWNrYWdlQWRtaW4gcGtnQWRtaW4gPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFBhY2thZ2VBZG1pbigpOwotCi0JCS8vIGlzIEFtYmlnb3VzIGlmIHdlIGZpbmQgYSBwbHVnaW4gZnJvbSB0aGUgZmVhdHVyZQotCQkvLyB3aXRoIGEgZGlmZmVyZW50IHZlcnNpb24gYW5kIG5vdCB0aGUgb25lIHdlIGFyZSBsb29raW5nCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZVBsdWdpbnMubGVuZ3RoOyBpKyspIHsKLQkJCU11bHRpU3RhdHVzIHRlbXBtdWx0aSA9IG5ldyBNdWx0aVN0YXR1cyhmZWF0dXJlU3RhdHVzLmdldFBsdWdpbigpLCBJRmVhdHVyZS5TVEFUVVNfQU1CSUdVT1VTLCBhbWJpZ3VvdXNNU0csIG51bGwpOwotCQkJZmVhdHVyZVBsdWdpbklEID0gZmVhdHVyZVBsdWdpbnNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCi0JCQlTdHJpbmcgc2luZ2xlVmVyc2lvblJhbmdlID0gJ1snICsgZmVhdHVyZVBsdWdpbklELmdldFZlcnNpb24oKS50b1N0cmluZygpICsgJywnICsgZmVhdHVyZVBsdWdpbklELmdldFZlcnNpb24oKS50b1N0cmluZygpICsgJ10nOwotCQkJQnVuZGxlW10gYnVuZGxlcyA9IHBrZ0FkbWluLmdldEJ1bmRsZXMoZmVhdHVyZVBsdWdpbklELmdldElkZW50aWZpZXIoKSwgc2luZ2xlVmVyc2lvblJhbmdlKTsKLQkJCWlmIChidW5kbGVzICE9IG51bGwgJiYgYnVuZGxlcy5sZW5ndGggPT0gMSkgewotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYW5vdGhlciBmZWF0dXJlIHdpdGggdGhpcyBwbHVnaW4gKGJ1dCBkaWZmZXJlbnQgdmVyc2lvbikKLQkJCS8vIGxvZyBpdAotCQkJYnVuZGxlcyA9IHBrZ0FkbWluLmdldEJ1bmRsZXMoZmVhdHVyZVBsdWdpbklELmdldElkZW50aWZpZXIoKSwgbnVsbCk7Ci0JCQlmb3IgKGludCBqID0gMDsgYnVuZGxlcyAhPSBudWxsICYmIGogPCBidW5kbGVzLmxlbmd0aCAmJiAhZm91bmQ7IGorKykgewotCQkJCVN0cmluZyBidW5kbGVWZXJzaW9uID0gKFN0cmluZykgYnVuZGxlc1tqXS5nZXRIZWFkZXJzKCkuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTik7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmVGb3JJZChuZXcgVmVyc2lvbmVkSWRlbnRpZmllcihidW5kbGVzW2pdLmdldFN5bWJvbGljTmFtZSgpLCBidW5kbGVWZXJzaW9uKSk7Ci0JCQkJaWYgKChmZWF0dXJlICE9IG51bGwpICYmICghaXNGZWF0dXJlUGF0Y2hPZlRoaXNGZWF0dXJlKHBsdWdpbnNPcmlnaW5hdG9yRmVhdHVyZSwgZmVhdHVyZSkpKSB7Ci0JCQkJCVN0cmluZyBtc2cgPSBudWxsOwotCQkJCQlTdHJpbmcgbGFiZWwgPSBmZWF0dXJlLmdldExhYmVsKCk7Ci0JCQkJCVN0cmluZyBmZWF0dXJlVmVyc2lvbiA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpOwotCQkJCQlPYmplY3RbXSB2YWx1ZXMgPSBuZXcgT2JqZWN0W10ge2J1bmRsZXNbal0uZ2V0U3ltYm9saWNOYW1lKCksIGZlYXR1cmVQbHVnaW5JRC5nZXRWZXJzaW9uKCksIGJ1bmRsZVZlcnNpb24sIGxhYmVsLCBmZWF0dXJlVmVyc2lvbn07Ci0JCQkJCW1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVMb2NhbF9Ud29WZXJzaW9uU2FtZVBsdWdpbjIsIHZhbHVlcyk7Ci0JCQkJCVVwZGF0ZUNvcmUud2FybigiRm91bmQgYW5vdGhlciB2ZXJzaW9uIG9mIHRoZSBzYW1lIHBsdWdpbiBvbiB0aGUgcGF0aDoiICsgYnVuZGxlc1tqXS5nZXRTeW1ib2xpY05hbWUoKSArICIgIiArIGJ1bmRsZVZlcnNpb24pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJdGVtcG11bHRpLmFkZChjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSUZlYXR1cmUuU1RBVFVTX0FNQklHVU9VUywgbXNnLCBudWxsKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCX0KLQotCQkJfQotCi0JCQkvLyBjaGVjayB3aGV0aGVyIHRoZSBwbHVnaW4gaXMgYSBzb3VyY2UgYnVuZGxlCi0JCQkvLyB0aGF0IGhhcyBub3QgYmVlbiBjb25maWd1cmVkIGludG8gdGhlIHJ1bnRpbWUKLQkJCWlmICghZm91bmQpIHsKLQkJCQlsb2FkU291cmNlQnVuZGxlc0xpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2VCdW5kbGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIG5leHRJZCA9IChWZXJzaW9uZWRJZGVudGlmaWVyKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGZlYXR1cmVQbHVnaW5JRC5lcXVhbHMobmV4dElkKSkgewotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGlmIHdlIGhhdmVuJ3QgZm91bmQgdGhlIGV4YWN0IHBsdWdpbiwgYWRkIHRoZSBjaGlsZHJlbgotCQkJLy8gb2YgdGVtcE11bHRpIChpLGUgdGhlIG90aGVyIHdlIGZvdW5kKSAKLQkJCS8vIGlmIHdlIGhhdmUgbm8gY2hpbGRyZW4sIHdlIGhhdmUgYSBwcm9ibGVtIGFzIGEgcmVxdWlyZWQgcGx1Z2luIGlzIG5vdCB0aGVyZSBhdCBhbGwKLQkJCWlmICghZm91bmQpIHsKLQkJCQlpZiAodGVtcG11bHRpLmdldENoaWxkcmVuKCkubGVuZ3RoID4gMCkgewotCQkJCQltdWx0aS5hZGRBbGwodGVtcG11bHRpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAobXVsdGkuZ2V0Q29kZSgpICE9IElGZWF0dXJlLlNUQVRVU19VTkhBUFBZKSB7Ci0JCQkJCQlTdHJpbmcgdW5oYXBweU1TRyA9IE1lc3NhZ2VzLlNpdGVMb2NhbF9GZWF0dXJlVW5IYXBweTsKLQkJCQkJCU11bHRpU3RhdHVzIG5ld011bHRpID0gbmV3IE11bHRpU3RhdHVzKGZlYXR1cmVTdGF0dXMuZ2V0UGx1Z2luKCksIElGZWF0dXJlLlNUQVRVU19VTkhBUFBZLCB1bmhhcHB5TVNHLCBudWxsKTsKLQkJCQkJCW5ld011bHRpLmFkZEFsbChtdWx0aSk7Ci0JCQkJCQltdWx0aSA9IG5ld011bHRpOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5TaXRlTG9jYWxfTm9QbHVnaW5WZXJzaW9uLCAobmV3IFN0cmluZ1tdIHtmZWF0dXJlUGx1Z2luSUQuZ2V0SWRlbnRpZmllcigpfSkpOwotCQkJCQltdWx0aS5hZGQoY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIElGZWF0dXJlLlNUQVRVU19VTkhBUFBZLCBtc2csIG51bGwpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIW11bHRpLmlzT0soKSkKLQkJCXJldHVybiBtdWx0aTsKLQotCQkvLyB3ZSByZXR1cm4gaGFwcHkgYXMgd2UgY29uc2lkZXIgdGhlIGlzQnJva2VuIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBkb25lCi0JCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5PSywgSUZlYXR1cmUuU1RBVFVTX0hBUFBZLCBoYXBweU1TRywgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBGaWxlIHRvRmlsZShVUkwgdXJsKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoISJmaWxlIi5lcXVhbHNJZ25vcmVDYXNlKHVybC5nZXRQcm90b2NvbCgpKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBudWxsOwotCQkJLy9hc3N1bWUgYWxsIGlsbGVnYWwgY2hhcmFjdGVycyBoYXZlIGJlZW4gcHJvcGVybHkgZW5jb2RlZCwgc28gdXNlIFVSSSBjbGFzcyB0byB1bmVuY29kZQotCQkJcmV0dXJuIG5ldyBGaWxlKG5ldyBVUkkodXJsLnRvRXh0ZXJuYWxGb3JtKCkpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vVVJMIGNvbnRhaW5zIHVuZW5jb2RlZCBjaGFyYWN0ZXJzCi0JCQlyZXR1cm4gbmV3IEZpbGUodXJsLmdldEZpbGUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAJR2V0IHRoZSBjb250ZW50cyBvZiB0aGUgc291cmNlIGJ1bmRsZXMgdGV4dCBmaWxlLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkU291cmNlQnVuZGxlc0xpc3QoKSB7Ci0JCWlmIChzb3VyY2VCdW5kbGVzICE9IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJc291cmNlQnVuZGxlcyA9IG5ldyBBcnJheUxpc3QoMzIpOwotCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIGNvbmZpZyA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKLQkJVVJMIGNvbmZpZ0xvY2F0aW9uID0gY29uZmlnLmdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpOwotCQlpZiAoY29uZmlnTG9jYXRpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gRHJvcCBvZmYgL29yZy5lY2xpcHNlLnVwZGF0ZS9wbGF0Zm9ybS54bWwKLQkJRmlsZSBjb25maWdEaXIgPSB0b0ZpbGUoY29uZmlnTG9jYXRpb24pOwotCQljb25maWdEaXIgPSBjb25maWdEaXIuZ2V0UGFyZW50RmlsZSgpOwotCQlpZiAoY29uZmlnRGlyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbmZpZ0RpciA9IGNvbmZpZ0Rpci5nZXRQYXJlbnRGaWxlKCk7Ci0JCWlmIChjb25maWdEaXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRmlsZSBzb3VyY2VCdW5kbGVzRmlsZSA9IG5ldyBGaWxlKGNvbmZpZ0RpciwgU09VUkNFX0JVTkRMRVNfUEFUSCk7Ci0KLQkJdHJ5IHsKLQkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihzb3VyY2VCdW5kbGVzRmlsZSkpOwotCQkJU3RyaW5nIGxpbmU7Ci0JCQl0cnkgewotCQkJCXdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQkJCWlmIChsaW5lLnN0YXJ0c1dpdGgoIiMiKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlsaW5lID0gbGluZS50cmltKCk7Ly8gc3ltYm9saWNOYW1lLHZlcnNpb24sb3RoZXIgaWdub3JlZCBzdHVmZgotCQkJCQlpZiAobGluZS5sZW5ndGgoKSA9PSAwKQotCQkJCQkJY29udGludWU7Ci0KLQkJCQkJU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobGluZSwgIiwiLCB0cnVlKTsKLQkJCQkJU3RyaW5nIHN5bWJvbGljTmFtZSA9IHRvay5uZXh0VG9rZW4oKTsKLQkJCQkJaWYgKHN5bWJvbGljTmFtZS5lcXVhbHMoIiwiKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQllbHNlCi0JCQkJCQl0b2submV4dFRva2VuKCk7IC8vICwKLQotCQkJCQlTdHJpbmcgdmVyc2lvbiA9IHRvay5uZXh0VG9rZW4oKTsKLQkJCQkJaWYgKHZlcnNpb24uZXF1YWxzKCIsIikpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJZWxzZQotCQkJCQkJdG9rLm5leHRUb2tlbigpOyAvLyAsCi0KLQkJCQkJVmVyc2lvbmVkSWRlbnRpZmllciBzb3VyY2VJZCA9IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKHN5bWJvbGljTmFtZSwgdmVyc2lvbik7Ci0JCQkJCXNvdXJjZUJ1bmRsZXMuYWRkKHNvdXJjZUlkKTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCXJlYWRlci5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZUNvcmUubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSUQsICJFcnJvciBvY2N1cnJlZCB3aGlsZSByZWFkaW5nIHNvdXJjZSBidW5kbGUgbGlzdC4iLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBJRCwgIkVycm9yIG9jY3VycmVkIHdoaWxlIHJlYWRpbmcgc291cmNlIGJ1bmRsZSBsaXN0LiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRmVhdHVyZVBhdGNoT2ZUaGlzRmVhdHVyZShJRmVhdHVyZSBwbHVnaW5zT3JpZ2luYXRvckZlYXR1cmUsIElGZWF0dXJlIGZlYXR1cmUpIHsKLQotCQlpZiAoIWZlYXR1cmUuaXNQYXRjaCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUlJbXBvcnRbXSBmZWF0dXJlSW1wb3J0cyA9IGZlYXR1cmUuZ2V0SW1wb3J0cygpOwotCi0JCWlmIChmZWF0dXJlSW1wb3J0cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVJbXBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmVhdHVyZUltcG9ydHNbaV0uaXNQYXRjaCgpICYmIGZlYXR1cmVJbXBvcnRzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5lcXVhbHMocGx1Z2luc09yaWdpbmF0b3JGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBjcmVhdGVzIGEgU3RhdHVzCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc3RhdHVzU2V2ZXJpdHksIGludCBzdGF0dXNDb2RlLCBTdHJpbmcgbXNnLCBFeGNlcHRpb24gZSkgewotCQlTdHJpbmcgaWQgPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCi0JCVN0cmluZ0J1ZmZlciBjb21wbGV0ZVN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChtc2cgIT0gbnVsbCkKLQkJCWNvbXBsZXRlU3RyaW5nLmFwcGVuZChtc2cpOwotCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQljb21wbGV0ZVN0cmluZy5hcHBlbmQoIlxyXG5bIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNvbXBsZXRlU3RyaW5nLmFwcGVuZChlLnRvU3RyaW5nKCkpOwotCQkJY29tcGxldGVTdHJpbmcuYXBwZW5kKCJdXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG5ldyBTdGF0dXMoc3RhdHVzU2V2ZXJpdHksIGlkLCBzdGF0dXNDb2RlLCBjb21wbGV0ZVN0cmluZy50b1N0cmluZygpLCBlKTsKLQl9Ci0KLQkvKgotCSAqIHJldHVybnMgYWxsIHRoZSBjb25maWd1cmVkIGZldGF1cmVzCi0JICovCi0JcHJpdmF0ZSBJRmVhdHVyZVtdIGdldEFsbENvbmZpZ3VyZWRGZWF0dXJlcygpIHsKLQkJaWYgKGFsbENvbmZpZ3VyZWRGZWF0dXJlcyA9PSBudWxsKSB7Ci0KLQkJCWFsbENvbmZpZ3VyZWRGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUlDb25maWd1cmVkU2l0ZVtdIGFsbENvbmZpZ3VyZWRTaXRlcyA9IHNpdGVMb2NhbC5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbENvbmZpZ3VyZWRTaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGFsbENvbmZpZ3VyZWRTaXRlc1tpXS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gbnVsbDsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJZmVhdHVyZSA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmZWF0dXJlID0gcmVmc1tqXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQkJCQlhbGxDb25maWd1cmVkRmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSUZlYXR1cmVbXSBmZWF0dXJlcyA9IG5ldyBJRmVhdHVyZVthbGxDb25maWd1cmVkRmVhdHVyZXMuc2l6ZSgpXTsKLQkJaWYgKGFsbENvbmZpZ3VyZWRGZWF0dXJlcy5zaXplKCkgPiAwKSB7Ci0JCQlhbGxDb25maWd1cmVkRmVhdHVyZXMudG9BcnJheShmZWF0dXJlcyk7Ci0JCX0KLQkJcmV0dXJuIGZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogcmV0dXJucyB0aGUgRmVhdHVyZSB0aGF0IGRlY2xhcmVzIHRoaXMgdmVyc2lvbmVkSWRlbnRpZmllciBvciBudWxsIGlmIG5vbmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIElGZWF0dXJlIGdldEZlYXR1cmVGb3JJZChWZXJzaW9uZWRJZGVudGlmaWVyIGlkKSB7Ci0KLQkJaWYgKGlkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJRmVhdHVyZVtdIGFsbEZlYXR1cmVzID0gZ2V0QWxsQ29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCUlGZWF0dXJlIGN1cnJlbnRGZWF0dXJlID0gbnVsbDsKLQkJSVBsdWdpbkVudHJ5W10gYWxsUGx1Z2lucyA9IG51bGw7Ci0JCUlQbHVnaW5FbnRyeSBjdXJyZW50UGx1Z2luID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxGZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJY3VycmVudEZlYXR1cmUgPSBhbGxGZWF0dXJlc1tpXTsKLQkJCWFsbFBsdWdpbnMgPSBjdXJyZW50RmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGFsbFBsdWdpbnMubGVuZ3RoOyBqKyspIHsKLQkJCQljdXJyZW50UGx1Z2luID0gYWxsUGx1Z2luc1tqXTsKLQkJCQlpZiAoaWQuZXF1YWxzKGN1cnJlbnRQbHVnaW4uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSkKLQkJCQkJcmV0dXJuIGN1cnJlbnRGZWF0dXJlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZVR5cGVGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVUeXBlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTI2Zjc2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZVR5cGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2l0ZVR5cGVGYWN0b3J5IHsKLQkKLQotCS8qKgotCSAqIGV4dGVuc2lvbiBwb2ludCBJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTVBMRV9FWFRFTlNJT05fSUQgPSAic2l0ZVR5cGVzIjsJIC8vJE5PTi1OTFMtMSQKLQkKLQotCXByaXZhdGUgc3RhdGljIFNpdGVUeXBlRmFjdG9yeSBpbnN0OwotCQotCXByaXZhdGUgTWFwIGZhY3RvcmllczsKLQotCS8qKgotCSAqIGhpZGUgY3RyIAotCSAqLwotCXByaXZhdGUgU2l0ZVR5cGVGYWN0b3J5KCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU2l0ZVR5cGVGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdCA9PSBudWxsKQotCQkJaW5zdCA9IG5ldyBTaXRlVHlwZUZhY3RvcnkoKTsKLQkJcmV0dXJuIGluc3Q7Ci0JfQotCi0KLQkvKioKLQkgKiByZXR1cm4gdGhlIGZhY3RvcnkgZm9yIHRoZSB0eXBlCi0JICovCi0JcHVibGljIElTaXRlRmFjdG9yeSBnZXRGYWN0b3J5KFN0cmluZyB0eXBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkvLwotCQkJT2JqZWN0IGluc3RhbmNlID0gZ2V0RmFjdG9yaWVzKCkuZ2V0KHR5cGUpOwotCQkJaWYgKGluc3RhbmNlPT1udWxsKSB7Ci0JCQkJaW5zdGFuY2UgPSBjcmVhdGVGYWN0b3J5Rm9yKHR5cGUpOwotCQkJCWdldEZhY3RvcmllcygpLnB1dCh0eXBlLGluc3RhbmNlKTsKLQkJCX0KLQkJCXJldHVybiAoSVNpdGVGYWN0b3J5KSBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIElTaXRlRmFjdG9yeSBjcmVhdGVGYWN0b3J5Rm9yKFN0cmluZyB0eXBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTaXRlRmFjdG9yeSByZXN1bHQgPSBudWxsOwotCQkKLQkJU3RyaW5nIHBsdWdpbklEID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IocGx1Z2luSUQsU0lNUExFX0VYVEVOU0lPTl9JRCx0eXBlKTsKLQkJaWYgKGVsZW1lbnRzPT1udWxsIHx8IGVsZW1lbnRzLmxlbmd0aD09MCl7Ci0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5TaXRlVHlwZUZhY3RvcnlfVW5hYmxlVG9GaW5kU2l0ZUZhY3RvcnksIChuZXcgU3RyaW5nW10geyB0eXBlIH0pKSxudWxsKTsKLQkJfSBlbHNlIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbMF07Ci0JCQlyZXN1bHQgPSAoSVNpdGVGYWN0b3J5KWVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYWN0b3JpZXMuCi0JICogQHJldHVybiBSZXR1cm5zIGEgTWFwCi0JICovCi0JcHJpdmF0ZSBNYXAgZ2V0RmFjdG9yaWVzKCkgewotCQlpZiAoZmFjdG9yaWVzPT1udWxsKSBmYWN0b3JpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJcmV0dXJuIGZhY3RvcmllczsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlVVJMQ29udGVudFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVVUkxDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYwNzBjOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVVUkxDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVDb250ZW50UHJvdmlkZXI7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTaXRlVVJMQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgU2l0ZUNvbnRlbnRQcm92aWRlciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lURV9UWVBFID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmh0dHAiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSFRUUFNpdGUKLQkgKi8KLQlwdWJsaWMgU2l0ZVVSTENvbnRlbnRQcm92aWRlcihVUkwgdXJsKSB7Ci0JCXN1cGVyKHVybCk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZVVSTEZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZVVSTEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU0MGE4NS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVVUkxGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkJhc2VTaXRlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZUZhY3RvcnlFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5JbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuU2l0ZU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5jb25uZWN0aW9uLkNvbm5lY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLmNvbm5lY3Rpb24uSVJlc3BvbnNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC5TaXRlV2l0aFRpbWVzdGFtcDsKLQotLyoqCi0gKiBBbiB1cGRhdGUgc2l0ZSBmYWN0b3J5LgotICoKLSAqLwotcHVibGljIGNsYXNzIFNpdGVVUkxGYWN0b3J5IGV4dGVuZHMgQmFzZVNpdGVGYWN0b3J5IGltcGxlbWVudHMgSVNpdGVGYWN0b3J5RXh0ZW5zaW9uIHsKLQkKLQkvKgotCSAqIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotCSAqLwotCXB1YmxpYyBJU2l0ZSBjcmVhdGVTaXRlKFVSTCB1cmwpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlU2l0ZSh1cmwsIG51bGwpOwotCX0KLQkvKgotCSAqIEBzZWUgSVNpdGVGYWN0b3J5I2NyZWF0ZVNpdGUoVVJMLCBib29sZWFuKQotCSAqIAotCSAqIHRoZSBVUkwgY2FuIGJlIG9mIHRoZSBmb2xsb3dpbmcgZm9ybQotCSAqIDEgcHJvdG9jb2w6Ly8uLi4uLi8KLQkgKiAyIHByb3RvY29sOi8vLi4uLi4KLQkgKiAzIHByb3RvY29sOi8vLi4uLi9zaXRlLnhtbAotCSAqIAotCSAqIDEgSWYgdGhlIGZpbGUgb2YgdGhlIGZpbGUgb2YgdGVoIHVybCBlbmRzIHdpdGggJy8nLCBhdHRlbXB0IHRvIG9wZW4gdGhlIHN0cmVhbS4KLQkgKiBpZiBpdCBmYWlscywgYWRkIHNpdGUueG1sIGFuZCBhdHRlbXB0IHRvIG9wZW4gdGhlIHN0cmVhbQotCSAqIAotCSAqIDIgYXR0ZW1wdCB0byBvcGVuIHRoZSBzdHJlYW0KLQkgKiAJZmFpbAotCSAqIAkJYWRkICcvc2l0ZS54bWwnIGFuZCBhdHRlbXB0IHRvIG9wZW4gdGhlIHN0cmVhbQotCSAqIAlzdWNlc3MKLQkgKiAJCWF0dGVtcHQgdG8gcGFyc2UsIGlmIGl0IGZhaWxzLCBhZGQgJy9zaXRlLnhtbCcgYW5kIGF0dGVtcHQgdG8gb3BlbiB0ZWggc3RyZWFtCi0JICogCi0JICogMyBvcGVuIHRoZSBzdHJlYW0JIAotCSAqLwotCXB1YmxpYyBJU2l0ZSBjcmVhdGVTaXRlKFVSTCB1cmwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbiB7Ci0JCVNpdGUgc2l0ZSA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIHNpdGVTdHJlYW0gPSBudWxsOwotCQotCQl0cnkgewotCQkJU2l0ZVVSTENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgU2l0ZVVSTENvbnRlbnRQcm92aWRlcih1cmwpOwotCQotCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUodXJsKTsKLQkJCUlSZXNwb25zZSByZXNwb25zZSA9IENvbm5lY3Rpb25GYWN0b3J5LmdldChyZXNvbHZlZFVSTCk7Ci0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMuY2hlY2tDb25uZWN0aW9uUmVzdWx0KHJlc3BvbnNlLCByZXNvbHZlZFVSTCk7Ci0JCQlzaXRlU3RyZWFtID0gcmVzcG9uc2UuZ2V0SW5wdXRTdHJlYW0obW9uaXRvcik7Ci0JCQkvLyB0aGUgc3RyZWFtIGNhbiBiZSBudWxsIGlmIHRoZSB1c2VyIGNhbmNlbHMgdGhlIGNvbm5lY3Rpb24KLQkJCWlmIChzaXRlU3RyZWFtPT1udWxsKSByZXR1cm4gbnVsbDsKLQotCQkJU2l0ZU1vZGVsRmFjdG9yeSBmYWN0b3J5ID0gdGhpczsKLQkJCXNpdGUgPSAoU2l0ZSkgZmFjdG9yeS5wYXJzZVNpdGUoc2l0ZVN0cmVhbSk7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbihzaXRlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKLQkJCXNpdGUuc2V0U2l0ZUNvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQkJY29udGVudFByb3ZpZGVyLnNldFNpdGUoc2l0ZSk7Ci0JCQlzaXRlLnJlc29sdmUodXJsLCB1cmwpOwotCQkJc2l0ZS5tYXJrUmVhZE9ubHkoKTsKLQkJCS8qU2l0ZVdpdGhUaW1lc3RhbXAgc2l0ZVdpdGhUaW1lc3RhbXAgPSBuZXcgU2l0ZVdpdGhUaW1lc3RhbXAoc2l0ZSk7Ci0JCQlzaXRlV2l0aFRpbWVzdGFtcC5zZXRUaW1lc3RhbXAoIG5ldyBEYXRlKHJlc3BvbnNlLmdldExhc3RNb2RpZmllZCgpKSk7Ci0JCQlzaXRlID0gc2l0ZVdpdGhUaW1lc3RhbXA7Ki8KLQkJCSgoU2l0ZVdpdGhUaW1lc3RhbXApc2l0ZSkuc2V0VGltZXN0YW1wKCBuZXcgRGF0ZShyZXNwb25zZS5nZXRMYXN0TW9kaWZpZWQoKSkpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuU2l0ZVVSTEZhY3RvcnlfVW5hYmxlVG9DcmVhdGVVUkwsIChuZXcgU3RyaW5nW10geyB1cmwgPT0gbnVsbCA/ICIiIDogdXJsLnRvRXh0ZXJuYWxGb3JtKCkgfSkpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5TaXRlVVJMRmFjdG9yeV9VbmFibGVUb0FjY2Vzc1NpdGVTdHJlYW0sIChuZXcgU3RyaW5nW10geyB1cmwgPT0gbnVsbCA/ICIiIDogdXJsLnRvRXh0ZXJuYWxGb3JtKCkgfSkpLCBJU2l0ZS5TSVRFX0FDQ0VTU19FWENFUFRJT04sIGUpOwkvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc2l0ZVN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc2l0ZVN0cmVhbS5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNpdGU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFNpdGVNb2RlbEZhY3RvcnkjY2FuUGFyc2VTaXRlVHlwZShTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUGFyc2VTaXRlVHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHN1cGVyLmNhblBhcnNlU2l0ZVR5cGUodHlwZSkgfHwgU2l0ZVVSTENvbnRlbnRQcm92aWRlci5TSVRFX1RZUEUuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSk7Ci0JfQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkJhc2VTaXRlRmFjdG9yeSNjcmVhdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwoKQotICAgICAqLwotICAgIHB1YmxpYyBTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGNyZWF0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVTaXRlRmVhdHVyZVJlZmVyZW5jZSgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9UYXJnZXRGZWF0dXJlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1RhcmdldEZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM3ODlmMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1RhcmdldEZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZUNvbnRlbnRDb25zdW1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5VdGlsaXRpZXM7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXJnZXRGZWF0dXJlIGV4dGVuZHMgRmVhdHVyZSB7Ci0KLQotCS8qKgotCSAqIFRoZSBjb250ZW50IGNvbnN1bWVyIG9mIHRoZSBEZWZhdWx0RmVhdHVyZQotCSAqLwotCXByaXZhdGUgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgY29udGVudENvbnN1bWVyOwotCQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFRhcmdldEZlYXR1cmUuCi0JICovCi0JcHVibGljIFRhcmdldEZlYXR1cmUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29udGVudCBDb25zdW1lcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRDb25zdW1lcihJRmVhdHVyZUNvbnRlbnRDb25zdW1lciBjb250ZW50Q29uc3VtZXIpIHsKLQkJdGhpcy5jb250ZW50Q29uc3VtZXIgPSBjb250ZW50Q29uc3VtZXI7Ci0JCWNvbnRlbnRDb25zdW1lci5zZXRGZWF0dXJlKHRoaXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZSNnZXRGZWF0dXJlQ29udGVudENvbnN1bWVyKCkKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgZ2V0RmVhdHVyZUNvbnRlbnRDb25zdW1lcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuY29udGVudENvbnN1bWVyID09IG51bGwpIHsKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKCBOTFMuYmluZChNZXNzYWdlcy5GZWF0dXJlX05vRmVhdHVyZUNvbnRlbnRDb25zdW1lciwgKG5ldyBTdHJpbmdbXSB7IGdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkgfSkpLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gY29udGVudENvbnN1bWVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VUkxFbmNvZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VSTEVuY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIwMGE5Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VSTEVuY29kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmFtZXMgRCBNaWxlcyAoSUJNIENvcnAuKSAtIGJ1ZyAxOTEzNjgsIFBvbGljeSBVUkwgZG9lc24ndCBzdXBwb3J0IFVURi04IGNoYXJhY3RlcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLS8qKgotICogRW5jb2RlcyBhIDxjb2RlPlVSTDwvY29kZT4gaW50byBhbiA8Y29kZT5BU0NJSTwvY29kZT4gcmVhZGFibGUKLSAqIDxjb2RlPlVSTDwvY29kZT4gdGhhdCBpcyBzYWZlIGZvciB0cmFuc3BvcnQuIEVuY29kZWQKLSAqIDxjb2RlPlVSTDwvY29kZT5zIGNhbiBiZSBkZWNvZGVkIHVzaW5nIHRoZSA8Y29kZT5VUkxEZWNvZGVyPC9jb2RlPi4KLSAqCi0gKiBAc2VlIFVSTERlY29kZXIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFVSTEVuY29kZXIgewotCS8qKgotCSAqIFByZXZlbnRzIGluc3RhbmNlcyBmcm9tIGJlaW5nIGNyZWF0ZWQuCi0JICovCi0JcHJpdmF0ZSBVUkxFbmNvZGVyKCkgewotCX0KLQkvKioKLQkgKiBFbmNvZGVzIHRoZSBnaXZlbiBmaWxlIGFuZCByZWZlcmVuY2UgcGFydHMgb2YgYSA8Y29kZT5VUkw8L2NvZGU+IGludG8KLQkgKiBhbiA8Y29kZT5BU0NJSTwvY29kZT4gcmVhZGFibGUgPGNvZGU+U3RyaW5nPC9jb2RlPiB0aGF0IGlzIHNhZmUgZm9yCi0JICogdHJhbnNwb3J0LiBSZXR1cm5zIHRoZSByZXN1bHQuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgZW5jb2RpbmcgdGhlIGdpdmVuIGZpbGUgYW5kIHJlZmVyZW5jZSBwYXJ0cyBvZgotCSAqICAgICAgICAgYSA8Y29kZT5VUkw8L2NvZGU+IGludG8gYW4gPGNvZGU+QVNDSUk8L2NvZGU+IHJlYWRhYmxlCi0JICogICAgICAgICA8Y29kZT5TdHJpbmc8L2NvZGU+IHRoYXQgaXMgc2FmZSBmb3IgdHJhbnNwb3J0Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyBmaWxlLCBTdHJpbmcgcXVlcnksIFN0cmluZyByZWYpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZmlsZSwgIi8iLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlpZiAodG9rZW4uZXF1YWxzKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWJ1Zi5hcHBlbmQodG9rZW4pOwotCQkJfSBlbHNlIHsKLQkJCQlidWYuYXBwZW5kKGVuY29kZVNlZ21lbnQodG9rZW4pKTsKLQkJCX0KLQkJfQotCi0JCWlmIChxdWVyeSAhPSBudWxsKXsKLQkJCWJ1Zi5hcHBlbmQoJz8nKTsKLQkJCWJ1Zi5hcHBlbmQocXVlcnkpOwotCQl9Ci0KLQkJaWYgKHJlZiAhPSBudWxsKSB7Ci0JCQlidWYuYXBwZW5kKCcjJyk7Ci0JCQlidWYuYXBwZW5kKGVuY29kZVNlZ21lbnQocmVmKSk7Ci0JCX0KLQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCS8qKgotCSAqIEVuY29kZXMgdGhlIGdpdmVuIDxjb2RlPlVSTDwvY29kZT4gaW50byBhbiA8Y29kZT5BU0NJSTwvY29kZT4KLQkgKiByZWFkYWJsZSA8Y29kZT5VUkw8L2NvZGU+IHRoYXQgaXMgc2FmZSBmb3IgdHJhbnNwb3J0LiBSZXR1cm5zIHRoZQotCSAqIHJlc3VsdC4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBlbmNvZGluZyB0aGUgZ2l2ZW4gPGNvZGU+VVJMPC9jb2RlPiBpbnRvIGFuCi0JICogICAgICAgICA8Y29kZT5BU0NJSTwvY29kZT4gcmVhZGFibGUgPGNvZGU+VVJMPC9jb2RlPiB0aGF0IGlzIHNhZmUgZm9yCi0JICogICAgICAgICB0cmFuc3BvcnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTCBlbmNvZGUoVVJMIHVybCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCS8vIGVuY29kZSB0aGUgcGF0aCBub3QgdGhlIGZpbGUgYXMgdGhlIFVSTCBtYXkgY29udGFpbiBhIHF1ZXJ5Ci0JCVN0cmluZyBmaWxlID0gdXJsLmdldFBhdGgoKTsKLQkJU3RyaW5nIHF1ZXJ5ID0gdXJsLmdldFF1ZXJ5KCk7Ci0JCVN0cmluZyByZWYgPSB1cmwuZ2V0UmVmKCk7Ci0JCVN0cmluZyBhdXRoID0gdXJsLmdldEF1dGhvcml0eSgpOwotCQlTdHJpbmcgaG9zdCA9IHVybC5nZXRIb3N0KCk7Ci0JCWludCBwb3J0ID0gdXJsLmdldFBvcnQoKTsKLQkJU3RyaW5nIHVzZXJpbmZvID0gdXJsLmdldFVzZXJJbmZvKCk7Ci0KLQkJLy8gZG8gbm90IGVuY29kZSBpZiB0aGVyZSBpcyBhbiBhdXRob3JpdHksIHN1Y2ggYXMgaW4KLQkJLy8gZnRwOi8vdXNlcjpwYXNzd29yZEBob3N0OnBvcnQvcGF0aCAKLQkJLy8gYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIGRvZXMgbm90IGFsbG93IGl0Ci0JCVVSTCByZXN1bHQgPSB1cmw7Ci0JCWlmIChhdXRoID09IG51bGwgfHwgYXV0aC5lcXVhbHMoIiIpIHx8IHVzZXJpbmZvID09IG51bGwpIC8vICROT04tTkxTLTEkICROT04tTkxTLTIkICAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQgPSAgbmV3IFVSTCh1cmwuZ2V0UHJvdG9jb2woKSwgaG9zdCwgcG9ydCwgZW5jb2RlKGZpbGUsIHF1ZXJ5LCByZWYpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVuY29kZVNlZ21lbnQoU3RyaW5nIHNlZ21lbnQpIHsKLQkJCi0JCS8vIGlmIHdlIGZpbmQgYSAnJScgaW4gdGhlIHN0cmluZywgY29uc2lkZXIgdGhlIFVSTCB0byBiZSBhbHJlYWR5IGVuY29kZWQKLQkJaWYgKHNlZ21lbnQuaW5kZXhPZignJScpIT0tMSkgcmV0dXJuIHNlZ21lbnQ7Ci0JCQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzZWdtZW50Lmxlbmd0aCgpKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlZ21lbnQubGVuZ3RoKCk7ICsraSkgewotCQkJY2hhciBjID0gc2VnbWVudC5jaGFyQXQoaSk7Ci0JCQlpZiAobXVzdEVuY29kZShjKSkgewotCQkJCWJ5dGVbXSBieXRlcyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJYnl0ZXMgPSBuZXcgQ2hhcmFjdGVyKGMpLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoIlVURjgiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYnl0ZXMubGVuZ3RoOyArK2opIHsKLQkJCQkJcmVzdWx0LmFwcGVuZCgnJScpOwotCQkJCQlyZXN1bHQuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoKGJ5dGVzW2pdID4+IDQpICYgMHgwRikpOwotCQkJCQlyZXN1bHQuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoYnl0ZXNbal0gJiAweDBGKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQuYXBwZW5kKGMpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG11c3RFbmNvZGUoY2hhciBjKSB7Ci0JCWlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChjID49ICdcJycgJiYgYyA8PSAnLicpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChjID09ICchJyB8fCBjID09ICckJyB8fCBjID09ICdfJyB8fCBjID09ICdbJyB8fCBjID09ICddJykgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gbmVlZGVkIG90aGVyd2lzZSBmaWxlOi8vL2M6L2ZpbGUvIGJlY29tZXMgZmlsZTovLy9DJTNhL2ZpbGUvCi0JCWlmIChjID09JzonKXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VSTEtleS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VUkxLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVjNzZhZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VSTEtleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotIAotaW1wb3J0IGphdmEubmV0Lio7Ci0KLQotCi0vKioKLSAqIAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBVUkxLZXkgewotCi0JcHJpdmF0ZSBVUkwgdXJsOwotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBVUkxLZXkuCi0JICovCi0JcHVibGljIFVSTEtleShVUkwgdXJsKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCWlmICh0aGlzID09IG9iaikgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgVVJMS2V5KSB7Ci0JCQkJcmV0dXJuIGVxdWFscygoKFVSTEtleSkgb2JqKS5nZXRVUkwoKSk7Ci0JCQl9Ci0KLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFVSTCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCVVSTCB1cmwyID0gKFVSTClvYmo7Ci0JCQlpZiAodXJsID09IHVybDIpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJcmV0dXJuIFVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKHVybCx1cmwyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiB1cmwuaGFzaENvZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1cmwuCi0JICogQHJldHVybiBVUkwKLQkgKi8KLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlQ29yZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVDb3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MDc5NDkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVDb3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUubmV0LnByb3h5LklQcm94eVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zaWduZWRjb250ZW50LlNpZ25lZENvbnRlbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklJbnN0YWxsQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLkNvbmZpZ3VyYXRvclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuSVBsYXRmb3JtQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLmNvbm5lY3Rpb24uQ29ubmVjdGlvblRocmVhZE1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucGFja2FnZWFkbWluLlBhY2thZ2VBZG1pbjsKLWltcG9ydCBvcmcub3NnaS51dGlsLnRyYWNrZXIuU2VydmljZVRyYWNrZXI7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVDb3JlIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vIGRlYnVnIG9wdGlvbnMKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUc7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHX1NIT1dfSU5TVEFMTDsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUdfU0hPV19QQVJTSU5HOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVR19TSE9XX1dBUk5JTkdTOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVR19TSE9XX0NPTkZJR1VSQVRJT047Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHX1NIT1dfVFlQRTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUdfU0hPV19XRUI7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHX1NIT1dfSUhBTkRMRVI7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHX1NIT1dfUkVDT05DSUxFUjsKLQkJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0hJU1RPUllfU0laRSA9IFBSRUZJWCArICIuaGlzdG9yeVNpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9DSEVDS19TSUdOQVRVUkUgPSBQUkVGSVggKyAiLmNoZWNrU2lnbmF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfQVVUT01BVElDQUxMWV9DSE9PU0VfTUlSUk9SID0gIFBSRUZJWCArICIuYXV0b21hdGljYWxseUNob29zZU1pcnJvciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1VQREFURV9WRVJTSU9OUyA9IFBSRUZJWCArICIudXBkYXRlVmVyc2lvbnMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVFVSVZBTEVOVF9WQUxVRSA9ICJlcXVpdmFsZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBVElCTEVfVkFMVUUgPSAiY29tcGF0aWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGludCBERUZBVUxUX0hJU1RPUlkgPSAxMDA7Ly9JbnRlZ2VyLk1BWF9WQUxVRTsKLQkKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgVXBkYXRlQ29yZSBwbHVnaW47Ci0KLQkvL2xvZwotCXByaXZhdGUgc3RhdGljIFVwZGF0ZU1hbmFnZXJMb2dXcml0ZXIgbG9nOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfRklMRT0iaW5zdGFsbC5sb2ciOyAvLyROT04tTkxTLTEkCi0KLQkvLyBidW5kbGUgZGF0YQotCXByaXZhdGUgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCXByaXZhdGUgU2VydmljZVRyYWNrZXIgcGtnQWRtaW5UcmFja2VyOwotCXByaXZhdGUgU2VydmljZVRyYWNrZXIgdmVyaWZpZXJGYWN0b3J5VHJhY2tlcjsKLQlwcml2YXRlIFNlcnZpY2VUcmFja2VyIHByb3h5VHJhY2tlcjsKLQkKLQkvLyBTZXNzaW9uCi0JcHJpdmF0ZSBVcGRhdGVTZXNzaW9uIHVwZGF0ZVNlc3Npb24gPSBudWxsOwotCS8qKgotCSAqIEhUVFAgcmVzcG9uc2UgY29kZSBpbmRpY2F0aW5nIHN1Y2Nlc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9PSyA9IDIwMDsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFVwZGF0ZUNvcmUoKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVXBkYXRlQ29yZSBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCQotCi0JcHJpdmF0ZSBib29sZWFuIGdldEJvb2xlYW5EZWJ1Z09wdGlvbihTdHJpbmcgZmxhZywgYm9vbGVhbiBkZmx0KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihmbGFnKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmV0dXJuIGRmbHQ7Ci0JCWVsc2UKLQkJCXJldHVybiByZXN1bHQudHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGR1bXBzIGEgU3RyaW5nIGluIHRoZSB0cmFjZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWJ1ZyhTdHJpbmcgcykgewotCQlTdHJpbmdCdWZmZXIgbXNnID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQltc2cuYXBwZW5kKGdldFBsdWdpbigpLnRvU3RyaW5nKCkpOwotCQltc2cuYXBwZW5kKCJeIik7IC8vJE5PTi1OTFMtMSQKLQkJbXNnLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaGFzaENvZGUoKSkpOwotCQltc2cuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJbXNnLmFwcGVuZChzKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKG1zZy50b1N0cmluZygpKTsKLQl9Ci0JCi0JLyoqCi0JICogRHVtcHMgYSBTdHJpbmcgaW4gdGhlIGxvZyBpZiBXQVJOSU5HIGlzIHNldCB0byB0cnVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm4oU3RyaW5nIHMpIHsKLQkJaWYgKERFQlVHICYmIERFQlVHX1NIT1dfV0FSTklOR1MpIHsKLQkJCWlmIChzIT1udWxsKXsKLQkJCQlzPSJXQVJOSU5HOiAiK3M7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWxvZyhzLCBudWxsKTsgCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEdW1wcyBhbiBleGNlcHRpb24gaW4gdGhlIGxvZyBpZiBXQVJOSU5HIGlzIHNldCB0byB0cnVlCi0JICogCi0JICogQHBhcmFtIHMgbG9nIHN0cmluZwotCSAqIEBwYXJhbSBlIGV4Y2VwdGlvbiB0byBiZSBsb2dnZWQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhcm4oU3RyaW5nIHMsIFRocm93YWJsZSBlKSB7Ci0JCWlmIChERUJVRyAmJiBERUJVR19TSE9XX1dBUk5JTkdTKXsKLQkJCWlmIChzIT1udWxsKXsKLQkJCQlzPSJVUERBVEUgTUFOQUdFUiBJTkZPOiAiK3M7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWxvZyhzLGUpOwotCQl9Ci0JfQotCQkJCi0JLyoqCi0JICogTG9ncyBhIHN0YXR1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpewotCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldExvZygpLmxvZyhzdGF0dXMpOwkJCi0JfQotCQotCS8qKgotCSAqIExvZ3MgYW4gZXJyb3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBlKXsJCQotCQlsb2coIiIsZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCQotCS8qKgotCSAqIExvZ3MgYSBzdHJpbmcgYW5kIGFuICBlcnJvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZywgVGhyb3dhYmxlIGUpewotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCWlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgCi0JCQlzdGF0dXMgPSAoKENvcmVFeGNlcHRpb24pZSkuZ2V0U3RhdHVzKCk7Ci0JCWVsc2UgCi0JCQlzdGF0dXMgPSBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihtc2csZSkuZ2V0U3RhdHVzKCk7CQkKLQkJaWYgKHN0YXR1cyE9bnVsbCkKLQkJCWxvZyhzdGF0dXMpOwotCX0JCQotCS8qCi0JICogTWV0aG9kIGxvZy4KLQkgKiBAcGFyYW0gbmV3Q29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSUluc3RhbGxDb25maWd1cmF0aW9uIG5ld0NvbmZpZ3VyYXRpb24pIHsKLQkJaWYgKGxvZyE9bnVsbCkKLQkJCWxvZy5sb2cobmV3Q29uZmlndXJhdGlvbik7Ci0JfQotCi0JLyoKLQkgKiBHZXQgdXBkYXRlIGxvZyBsb2NhdGlvbiByZWxhdGl2ZSB0byBwbGF0Zm9ybSBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRJbnN0YWxsTG9nRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQotCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIGNvbmZpZyA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsJCQotCQlVUkwgY29uZmlndXJhdGlvbkxvY2F0aW9uID0gY29uZmlnLmdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpOwotCQlpZiAoY29uZmlndXJhdGlvbkxvY2F0aW9uPT1udWxsKXsKLQkJCXdhcm4oIlVuYWJsZSB0byByZXRyaWV2ZSBsb2NhdGlvbiBmb3IgdXBkYXRlIG1hbmFnZXIgbG9nIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLS8vCQlVUkwgY29uZmlnTG9jYXRpb24gPSBQbGF0Zm9ybS5yZXNvbHZlKGNvbmZpZ3VyYXRpb25Mb2NhdGlvbik7Ci0JCUZpbGUgdXBkYXRlU3RhdGVMb2NhdGlvbiA9IG51bGw7Ci0KLQkJaWYgKCJmaWxlIi5lcXVhbHNJZ25vcmVDYXNlKGNvbmZpZ3VyYXRpb25Mb2NhdGlvbi5nZXRQcm90b2NvbCgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlGaWxlIHBhdGggPSBuZXcgRmlsZShjb25maWd1cmF0aW9uTG9jYXRpb24uZ2V0RmlsZSgpKTsKLQkJCXVwZGF0ZVN0YXRlTG9jYXRpb24gPSBuZXcgRmlsZShwYXRoLmdldFBhcmVudEZpbGUoKSwgTE9HX0ZJTEUpOwotCQl9Ci0JCXJldHVybiB1cGRhdGVTdGF0ZUxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFNlbmRzIHRoZSBHRVQgcmVxdWVzdCB0byB0aGUgc2VydmVyIGFuZCByZXR1cm5zIHRoZSBzZXJ2ZXIncwotCSAqIHJlc3BvbnNlLgotCSAqCi0JICogQHBhcmFtIHVybCB0aGUgVVJMIHRvIG9wZW4gb24gdGhlIHNlcnZlcgotCSAqIEByZXR1cm4gdGhlIHNlcnZlcidzIHJlc3BvbnNlCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLiBSZWFzb25zIGluY2x1ZGU6Ci0JICogPHVsPgotCSAqIDxsaT5UaGUgY2xpZW50IGlzIGNsb3NlZC4KLQkgKiA8bGk+VGhlIGNsaWVudCBjb3VsZCBub3QgY29ubmVjdCB0byB0aGUgc2VydmVyCi0JICogPGxpPkFuIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBzZXJ2ZXIKLQkgKiA8dWw+Ci0JICovCi0KLQkKLQkvKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmVhdHVyZSBpcyBhIHBhdGNoCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGF0Y2goSUZlYXR1cmUgY2FuZGlkYXRlKSB7Ci0JCUlJbXBvcnRbXSBpbXBvcnRzID0gY2FuZGlkYXRlLmdldEltcG9ydHMoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCUlJbXBvcnQgaWltcG9ydCA9IGltcG9ydHNbaV07Ci0JCQlpZiAoaWltcG9ydC5pc1BhdGNoKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCi0gICAgICAgIERFQlVHID0gZ2V0Qm9vbGVhbkRlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1ZyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChERUJVRykgewotCQkJREVCVUdfU0hPV19XQVJOSU5HUyA9IGdldEJvb2xlYW5EZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvd2FybmluZyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJREVCVUdfU0hPV19QQVJTSU5HID0gZ2V0Qm9vbGVhbkRlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9wYXJzaW5nIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQlERUJVR19TSE9XX0lOU1RBTEwgPSBnZXRCb29sZWFuRGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL2luc3RhbGwiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJCURFQlVHX1NIT1dfQ09ORklHVVJBVElPTiA9IGdldEJvb2xlYW5EZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvY29uZmlndXJhdGlvbiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJREVCVUdfU0hPV19UWVBFID0gZ2V0Qm9vbGVhbkRlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy90eXBlIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQlERUJVR19TSE9XX1dFQiA9IGdldEJvb2xlYW5EZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvd2ViIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQlERUJVR19TSE9XX0lIQU5ETEVSID0gZ2V0Qm9vbGVhbkRlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9pbnN0YWxsaGFuZGxlciIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJREVCVUdfU0hPV19SRUNPTkNJTEVSID0gZ2V0Qm9vbGVhbkRlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9yZWNvbmNpbGVyIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCS8vCi0JCXRyeSB7Ci0JCQlGaWxlIGxvZ0ZpbGUgPSBnZXRJbnN0YWxsTG9nRmlsZSgpOwotCQkJaWYgKGxvZ0ZpbGUhPW51bGwpCi0JCQkJbG9nID0gbmV3IFVwZGF0ZU1hbmFnZXJMb2dXcml0ZXIobG9nRmlsZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpewotCQkJd2FybigiIixlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCQotCQlKYXJDb250ZW50UmVmZXJlbmNlLnNodXRkb3duKCk7IC8vIG1ha2Ugc3VyZSB3ZSBhcmUgbm90IGxlYXZpbmcgamFycyBvcGVuCi0JCVV0aWxpdGllcy5zaHV0ZG93bigpOyAvLyBjbGVhbnVwIHRlbXAgYXJlYQotCQlpZiAobG9nIT1udWxsKQotCQkJbG9nLnNodXRkb3duKCk7Ci0JCQotCQlDb25uZWN0aW9uVGhyZWFkTWFuYWdlckZhY3RvcnkuZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKS5zaHV0ZG93bigpOwotCi0JCQotCQl0aGlzLmNvbnRleHQgPSBudWxsOwotCQlpZiAocGtnQWRtaW5UcmFja2VyICE9IG51bGwpIHsKLQkJCXBrZ0FkbWluVHJhY2tlci5jbG9zZSgpOwotCQkJcGtnQWRtaW5UcmFja2VyID0gbnVsbDsKLQkJfQotCQlpZiAodmVyaWZpZXJGYWN0b3J5VHJhY2tlciAhPSBudWxsKSB7Ci0JCQl2ZXJpZmllckZhY3RvcnlUcmFja2VyLmNsb3NlKCk7Ci0JCQl2ZXJpZmllckZhY3RvcnlUcmFja2VyID0gbnVsbDsKLQkJfQotCQlpZiAocHJveHlUcmFja2VyICE9IG51bGwpIHsKLQkJCXByb3h5VHJhY2tlci5jbG9zZSgpOwotCQkJcHJveHlUcmFja2VyID0gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgQnVuZGxlQ29udGV4dCBnZXRCdW5kbGVDb250ZXh0KCkgewotCQlyZXR1cm4gY29udGV4dDsKLQl9Ci0JCi0JUGFja2FnZUFkbWluIGdldFBhY2thZ2VBZG1pbigpIHsKLQkJaWYgKHBrZ0FkbWluVHJhY2tlciA9PSBudWxsKSB7Ci0JCQlwa2dBZG1pblRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoY29udGV4dCwgUGFja2FnZUFkbWluLmNsYXNzLmdldE5hbWUoKSwgbnVsbCk7Ci0JCQlwa2dBZG1pblRyYWNrZXIub3BlbigpOwotCQl9Ci0JCXJldHVybiAoUGFja2FnZUFkbWluKXBrZ0FkbWluVHJhY2tlci5nZXRTZXJ2aWNlKCk7Ci0JfQotCQotCXB1YmxpYyBJUHJveHlTZXJ2aWNlIGdldFByb3h5U2VydmljZSgpIHsKLQkJaWYgKHByb3h5VHJhY2tlciA9PSBudWxsKSB7Ci0JCSAgICBwcm94eVRyYWNrZXI9bmV3IFNlcnZpY2VUcmFja2VyKGdldEJ1bmRsZSgpLmdldEJ1bmRsZUNvbnRleHQoKSwKLQkJICAgICAgICAgICAgSVByb3h5U2VydmljZS5jbGFzcy5nZXROYW1lKCksIG51bGwpOwotCQkgICAgcHJveHlUcmFja2VyLm9wZW4oKTsKLQkJfQotCQlyZXR1cm4gKElQcm94eVNlcnZpY2UpcHJveHlUcmFja2VyLmdldFNlcnZpY2UoKTsKLQl9Ci0KLQotCXB1YmxpYyBTaWduZWRDb250ZW50RmFjdG9yeSBnZXRTaWduZWRDb250ZW50RmFjdG9yeSgpIHsKLQkJaWYgKHZlcmlmaWVyRmFjdG9yeVRyYWNrZXIgPT0gbnVsbCkgewotCQkJdmVyaWZpZXJGYWN0b3J5VHJhY2tlciA9IG5ldyBTZXJ2aWNlVHJhY2tlcihjb250ZXh0LCBTaWduZWRDb250ZW50RmFjdG9yeS5jbGFzcy5nZXROYW1lKCksIG51bGwpOwotCQkJdmVyaWZpZXJGYWN0b3J5VHJhY2tlci5vcGVuKCk7Ci0JCX0KLQkJcmV0dXJuIChTaWduZWRDb250ZW50RmFjdG9yeSl2ZXJpZmllckZhY3RvcnlUcmFja2VyLmdldFNlcnZpY2UoKTsKLQl9Ci0JCi0JcHVibGljIFVwZGF0ZVNlc3Npb24gZ2V0VXBkYXRlU2Vzc2lvbigpIHsKLQkJc3luY2hyb25pemVkKFVwZGF0ZVNlc3Npb24uY2xhc3MpIHsKLQkJCWlmICh1cGRhdGVTZXNzaW9uID09IG51bGwpIHsKLQkJCQl1cGRhdGVTZXNzaW9uID0gbmV3IFVwZGF0ZVNlc3Npb24oKTsKLQkJCX0KLQkJfQkJCi0JCXJldHVybiB1cGRhdGVTZXNzaW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlckxvZ1dyaXRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVNYW5hZ2VyTG9nV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYWYwY2EuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVNYW5hZ2VyTG9nV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklBY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JSW5zdGFsbENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5Db25maWd1cmF0b3JVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb247Ci0KLQotLyoqCi0gKiBBIGxvZyB3cml0ZXIgdGhhdCB3cml0ZXMgdXBkYXRlIG1hbmFnZXIgbG9nIGVudHJpZXMuICAKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZU1hbmFnZXJMb2dXcml0ZXIgewotCXByaXZhdGUgRmlsZSBsb2dGaWxlID0gbnVsbDsKLQlwcml2YXRlIFdyaXRlciBsb2cgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT04gPSAiIUNPTkZJR1VSQVRJT04iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZID0gIiFBQ1RJVklUWSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUNDRVNTID0gInN1Y2Nlc3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkUgPSAiZmFpbHVyZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0lOU1RBTEwgPSAiZmVhdHVyZS1pbnN0YWxsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX1JFTU9WRSA9ICJmZWF0dXJlLXJlbW92ZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lURV9JTlNUQUxMID0gInNpdGUtaW5zdGFsbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lURV9SRU1PVkUgPSAic2l0ZS1yZW1vdmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVOQ09ORklHVVJFID0gImZlYXR1cmUtZGlzYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJFID0gImZlYXR1cmUtZW5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVZFUlQgPSAicmV2ZXJ0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUNPTkNJTElBVElPTiA9ICJyZWNvbmNpbGlhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFU0VSVkVEID0gInByZXNlcnZlLWNvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOID0gInVua25vd24iOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfU0VQQVJBVE9SOwotCi0Jc3RhdGljIHsKLQkJU3RyaW5nIHMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJTElORV9TRVBBUkFUT1IgPSBzID09IG51bGwgPyAiXG4iIDogczsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIFVwZGF0ZU1hbmFnZXJMb2dXcml0ZXIoRmlsZSBmaWxlKSB7Ci0JCXRoaXMubG9nRmlsZSA9IGZpbGU7Ci0JCVVwZGF0ZUNvcmUud2FybigiVVBEQVRFIE1BTkFHRVIgTE9HIExvY2F0aW9uOiAiK2ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHByaW1lIGl0IHdpdGggdGhlIHNpdGVzIGluIHRoZSBleGlzaXRpbmcgY29uZmlnCi0JCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCWluaXRMb2coKTsKLQl9Ci0JCi0JLyoKLQkgKiBJbml0aWFsaXplcyB0aGUgbG9nIHdpdGggdGhlIG9yaWdpbmFsIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdExvZygpIHsKLQkJdHJ5IHsKLQkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcnVudGltZUNvbmZpZyA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKLQkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVFbnRyeVtdIHNpdGVzID0gcnVudGltZUNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJCUNvbmZpZ3VyYXRpb25BY3Rpdml0eVtdIGFjdGl2aXRpZXMgPSBuZXcgQ29uZmlndXJhdGlvbkFjdGl2aXR5W3NpdGVzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpPTA7IGk8c2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlhY3Rpdml0aWVzW2ldID0gbmV3IENvbmZpZ3VyYXRpb25BY3Rpdml0eShJQWN0aXZpdHkuQUNUSU9OX1NJVEVfSU5TVEFMTCk7Ci0JCQkJYWN0aXZpdGllc1tpXS5zZXRMYWJlbChGaWxlTG9jYXRvci50b0ZpbGVVUkwoc2l0ZXNbaV0uZ2V0VVJMKCkpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJCWFjdGl2aXRpZXNbaV0uc2V0RGF0ZShuZXcgRGF0ZSgpKTsKLQkJCQlhY3Rpdml0aWVzW2ldLnNldFN0YXR1cyhJQWN0aXZpdHkuU1RBVFVTX09LKTsKLQkJCX0KLQkJCURhdGUgZGF0ZSA9IG5ldyBEYXRlKHJ1bnRpbWVDb25maWcuZ2V0Q2hhbmdlU3RhbXAoKSk7Ci0JCQlzYWZlV3JpdGVDb25maWd1cmF0aW9uKGRhdGUsIGFjdGl2aXRpZXMpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gc2lsZW50bHkgaWdub3JlIGVycm9ycwotCQl9Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xvc2VMb2dGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWlmIChsb2cgIT0gbnVsbCkgewotCQkJCWxvZy5mbHVzaCgpOwotCQkJCWxvZy5jbG9zZSgpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJbG9nID0gbnVsbDsKLQkJfQotCX0KLQkKLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhJSW5zdGFsbENvbmZpZ3VyYXRpb24gaW5zdGFsbENvbmZpZykgewotCQlzYWZlV3JpdGVDb25maWd1cmF0aW9uKGluc3RhbGxDb25maWcuZ2V0Q3JlYXRpb25EYXRlKCksIGluc3RhbGxDb25maWcuZ2V0QWN0aXZpdGllcygpKTsKLQl9Ci0JCi0JCi0JLyoKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgb3BlbkxvZ0ZpbGUoKSB7Ci0JCXRyeSB7Ci0JCQlsb2cgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShsb2dGaWxlLmdldEFic29sdXRlUGF0aCgpLCB0cnVlKSwgIlVURi04IikpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHRoZXJlIHdhcyBhIHByb2JsZW0gb3BlbmluZyB0aGUgbG9nIGZpbGUgc28gbG9nIHRvIHRoZSBjb25zb2xlCi0JCQlsb2cgPSBsb2dGb3JTdHJlYW0oU3lzdGVtLmVycik7Ci0JCX0KLQl9Ci0JCi0gICAgLyoKLSAgICAgKiAKLSAgICAgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRGb3JtYXR0ZWREYXRlKERhdGUgZGF0ZSkgewotCQl0cnkgewotCQkJRGF0ZUZvcm1hdCBmb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiTU1NIGRkLCB5eXl5IGtrOm1tOnNzLlNTIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KGRhdGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gSWYgdGhlcmUgd2VyZSBwcm9ibGVtcyB3cml0aW5nIG91dCB0aGUgZGF0ZSwgaWdub3JlIGFuZAotCQkJLy8gY29udGludWUgc2luY2UgdGhhdCBzaG91bGRuJ3Qgc3RvcCB1cyBmcm9tIGxvc2luZyB0aGUgcmVzdAotCQkJLy8gb2YgdGhlIGluZm9ybWF0aW9uCi0JCX0KLQkJcmV0dXJuIExvbmcudG9TdHJpbmcoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCX0KLQkKLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgV3JpdGVyIGxvZ0ZvclN0cmVhbShPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0LCAiVVRGLTgiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0KSk7Ci0JCX0KLQl9Ci0JCi0JCi0JLyoKLQkgKiBTaHV0cyBkb3duIHRoZSB1cGRhdGUgbWFuYWdlciBsb2cuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNodXRkb3duKCkgewotCQl0cnkgewotCQkJaWYgKGxvZ0ZpbGUgIT0gbnVsbCkgewotCQkJCWNsb3NlTG9nRmlsZSgpOwotCQkJCWxvZ0ZpbGUgPSBudWxsOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAobG9nICE9IG51bGwpIHsKLQkJCQkJV3JpdGVyIG9sZCA9IGxvZzsKLQkJCQkJbG9nID0gbnVsbDsKLQkJCQkJb2xkLmZsdXNoKCk7Ci0JCQkJCW9sZC5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy93ZSd2ZSBzaHV0ZG93biB0aGUgbG9nLCBzbyBub3QgbXVjaCBlbHNlIHdlIGNhbiBkbyEKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2FmZVdyaXRlQ29uZmlndXJhdGlvbihEYXRlIGRhdGUsIElBY3Rpdml0eVtdIGFjdGl2aXRpZXMpIHsKLQkJLy8gdGhyZWFkIHNhZmV0eTogKENvbmN1cnJlbmN5MDAzKQotCQlpZiAobG9nRmlsZSAhPSBudWxsKQotCQkJb3BlbkxvZ0ZpbGUoKTsKLQkJaWYgKGxvZyA9PSBudWxsKQotCQkJbG9nID0gbG9nRm9yU3RyZWFtKFN5c3RlbS5lcnIpOwotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQl3cml0ZShkYXRlLCBhY3Rpdml0aWVzKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGxvZ0ZpbGUgIT0gbnVsbCkKLQkJCQkJY2xvc2VMb2dGaWxlKCk7Ci0JCQkJZWxzZQotCQkJCQlsb2cuZmx1c2goKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHdyaXRpbmcgdG8gdGhlIHVwZGF0ZSBtYW5hZ2VyIGxvZzoiKTsgLy8kTk9OLU5MUy0xJAotCQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIkxvZ2dpbmcgdG8gdGhlIGNvbnNvbGUgaW5zdGVhZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJLy93ZSBmYWlsZWQgdG8gd3JpdGUsIHNvIGR1bXAgbG9nIGVudHJ5IHRvIGNvbnNvbGUgaW5zdGVhZAotCQkJdHJ5IHsKLQkJCQlsb2cgPSBsb2dGb3JTdHJlYW0oU3lzdGVtLmVycik7Ci0JCQkJd3JpdGUoZGF0ZSwgYWN0aXZpdGllcyk7Ci0JCQkJbG9nLmZsdXNoKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBsb2dnaW5nIHRvIHRoZSBjb25zb2xlOiIpOyAvLyROT04tTkxTLTEkCi0JCQkJZTIucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJbG9nID0gbnVsbDsKLQkJfQotCX0KLQkKLQotCS8qCi0JICogIUNPTkZJR1VSQVRJT04gPGxhYmVsPgotCSAqLwotCXByaXZhdGUgdm9pZCB3cml0ZShEYXRlIGRhdGUsIElBY3Rpdml0eVtdIGFjdGl2aXRpZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXdyaXRlbG4oKTsKLQkJd3JpdGUoQ09ORklHVVJBVElPTik7Ci0JCXdyaXRlU3BhY2UoKTsJCi0JCXdyaXRlKFN0cmluZy52YWx1ZU9mKGRhdGUuZ2V0VGltZSgpKSk7Ci0JCXdyaXRlU3BhY2UoKTsKLQkJd3JpdGUoZGF0ZS50b1N0cmluZygpKTsKLQkJd3JpdGVsbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFjdGl2aXRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCXdyaXRlKGFjdGl2aXRpZXNbaV0pOwotCQl9CQkJCQotCX0KLQotCS8qCi0JICogIUFDVElWSVRZIDxkYXRlPiA8dGFyZ2V0PiA8YWN0aW9uPiA8c3RhdHVzPgotCSAqLwotCXByaXZhdGUgdm9pZCB3cml0ZShJQWN0aXZpdHkgYWN0aXZpdHkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXdyaXRlKEFDVElWSVRZKTsKLQkJd3JpdGVTcGFjZSgpOwkKLQkJd3JpdGUoU3RyaW5nLnZhbHVlT2YoYWN0aXZpdHkuZ2V0RGF0ZSgpLmdldFRpbWUoKSkpOwotCQl3cml0ZVNwYWNlKCk7Ci0JCXdyaXRlKGdldEZvcm1hdHRlZERhdGUoYWN0aXZpdHkuZ2V0RGF0ZSgpKSk7Ci0JCXdyaXRlU3BhY2UoKTsKLQkJd3JpdGUoYWN0aXZpdHkuZ2V0TGFiZWwoKSk7Ci0JCXdyaXRlU3BhY2UoKTsKLQkJd3JpdGUoZ2V0QWN0aW9uKGFjdGl2aXR5LmdldEFjdGlvbigpKSk7Ci0JCXdyaXRlU3BhY2UoKTsKLQkJd3JpdGUoKGFjdGl2aXR5LmdldFN0YXR1cygpPT1JQWN0aXZpdHkuU1RBVFVTX09LKT9TVUNDRVNTOkZBSUxVUkUpOwotCQl3cml0ZWxuKCk7CQkKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEFjdGlvbihpbnQgaSkgewotCQlzd2l0Y2ggKGkpIHsKLQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9GRUFUVVJFX0lOU1RBTEwgOgotCQkJCXJldHVybiBGRUFUVVJFX0lOU1RBTEw7Ci0JCQljYXNlIElBY3Rpdml0eS5BQ1RJT05fRkVBVFVSRV9SRU1PVkUgOgotCQkJCXJldHVybiBGRUFUVVJFX1JFTU9WRTsKLQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9TSVRFX0lOU1RBTEwgOgotCQkJCXJldHVybiBTSVRFX0lOU1RBTEw7Ci0JCQljYXNlIElBY3Rpdml0eS5BQ1RJT05fU0lURV9SRU1PVkUgOgotCQkJCXJldHVybiBTSVRFX1JFTU9WRTsKLQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9VTkNPTkZJR1VSRSA6Ci0JCQkJcmV0dXJuIFVOQ09ORklHVVJFOwotCQkJY2FzZSBJQWN0aXZpdHkuQUNUSU9OX0NPTkZJR1VSRSA6Ci0JCQkJcmV0dXJuIENPTkZJR1VSRTsKLQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9SRVZFUlQgOgotCQkJCXJldHVybiBSRVZFUlQ7Ci0JCQljYXNlIElBY3Rpdml0eS5BQ1RJT05fUkVDT05DSUxJQVRJT04gOgotCQkJCXJldHVybiBSRUNPTkNJTElBVElPTjsKLQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9BRERfUFJFU0VSVkVEIDoKLQkJCQlyZXR1cm4gUFJFU0VSVkVEOwotCQkJCQkJCQotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIFVOS05PV04rIiBbIitpKyJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdyaXRlbG4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl3cml0ZShMSU5FX1NFUEFSQVRPUik7Ci0JfQotCQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdyaXRlKFN0cmluZyBtZXNzYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAobWVzc2FnZSAhPSBudWxsKQotCQkJbG9nLndyaXRlKG1lc3NhZ2UpOwotCX0KLQkKLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCB3cml0ZVNwYWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJd3JpdGUoIiAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlclV0aWxzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZU1hbmFnZXJVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWU3MTNhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlclV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIENocmlzIEFuaXN6Y3p5ayAoSUJNIENvcnAuKSAtIEZpeGVkIE5QRQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVVwZGF0ZUNvbnN0YW50czsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuSW5zdGFsbEFib3J0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuY29ubmVjdGlvbi5Db25uZWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5jb25uZWN0aW9uLklSZXNwb25zZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wYWNrYWdlYWRtaW4uUGFja2FnZUFkbWluOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlTWFuYWdlclV0aWxzIHsKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gT1NfVU5JWCA9IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5lbnZpcm9ubWVudC5Db25zdGFudHMuT1NfSFBVWAotCQkJLmVxdWFscyhQbGF0Zm9ybS5nZXRPUygpKQotCQkJfHwgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkNvbnN0YW50cy5PU19BSVgKLQkJCQkJLmVxdWFscyhQbGF0Zm9ybS5nZXRPUygpKQotCQkJfHwgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkNvbnN0YW50cy5PU19MSU5VWAotCQkJCQkuZXF1YWxzKFBsYXRmb3JtLmdldE9TKCkpCi0JCQl8fCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQuQ29uc3RhbnRzLk9TX1NPTEFSSVMKLQkJCQkJLmVxdWFscyhQbGF0Zm9ybS5nZXRPUygpKQotCQkJfHwgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkNvbnN0YW50cy5PU19NQUNPU1gKLQkJCQkJLmVxdWFscyhQbGF0Zm9ybS5nZXRPUygpKTsKLQlwcml2YXRlIHN0YXRpYyBGcmFnbWVudEVudHJ5W10gbm9GcmFnbWVudHMgPSBuZXcgRnJhZ21lbnRFbnRyeVswXTsKLQlwcml2YXRlIHN0YXRpYyBNYXAgdGFibGU7Ci0KLQlzdGF0aWMgewotCQl0YWJsZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCXRhYmxlLnB1dCgiY29tcGF0aWJsZSIsIG5ldyBJbnRlZ2VyKElVcGRhdGVDb25zdGFudHMuUlVMRV9DT01QQVRJQkxFKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGFibGUucHV0KCJwZXJmZWN0IiwgbmV3IEludGVnZXIoSVVwZGF0ZUNvbnN0YW50cy5SVUxFX1BFUkZFQ1QpKTsgLy8kTk9OLU5MUy0xJAotCQl0YWJsZS5wdXQoImVxdWl2YWxlbnQiLCBuZXcgSW50ZWdlcihJVXBkYXRlQ29uc3RhbnRzLlJVTEVfRVFVSVZBTEVOVCkpOyAvLyROT04tTkxTLTEkCi0JCXRhYmxlLnB1dCgiZ3JlYXRlck9yRXF1YWwiLCBuZXcgSW50ZWdlcihJVXBkYXRlQ29uc3RhbnRzLlJVTEVfR1JFQVRFUl9PUl9FUVVBTCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gbWFuYWdlIFVSTCB0byBGaWxlCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIHVybEZpbGVNYXA7Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXAgbG9jYWxGaWxlRnJhZ21lbnRNYXA7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RhY2sgYnVmZmVyUG9vbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSA0MDk2OyAvLyA0a2J5dGVzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOQ1JFTUVOVF9TSVpFID0gMTAyNDA7IC8vIDEwa2J5dGVzCi0JLyoqCi0JICogcmV0dXJuIHRoZSB1cmxTdHJpbmcgaWYgaXQgaXMgYSBhYnNvbHV0ZSBVUkwKLQkgKiBvdGhlcndpc2UsIHJldHVybiB0aGUgZGVmYXVsdCBVUkwgaWYgdGhlIHVybFN0cmluZyBpcyBudWxsCi0JICogVGhlIGRlZmF1bHRVUkwgbWF5IHBvaW50IG90IGEgZmlsZSwgY3JlYXRlIGEgZmlsZSBVUkwgdGhlbgotCSAqIGlmIHRoZSB1cmxTdHJpbmcgb3IgdGhlIGRlZmF1bHQgVVJMIGFyZSByZWxhdGl2ZXMsIHByZXBlbmQgdGhlIHJvb3RVUkwgdG8gaXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRVUkwoVVJMIHJvb3RVUkwsIFN0cmluZyB1cmxTdHJpbmcsIFN0cmluZyBkZWZhdWx0VVJMKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJVVJMIHVybCA9IG51bGw7Ci0KLQkJLy8gaWYgbm8gVVJMICwgcHJvdmlkZSBEZWZhdWx0Ci0JCWlmICh1cmxTdHJpbmcgPT0gbnVsbCB8fCB1cmxTdHJpbmcudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBubyBVUkwsIG5vIGRlZmF1bHQsIHJldHVybiByaWdodCBub3cuLi4KLQkJCWlmIChkZWZhdWx0VVJMID09IG51bGwgfHwgZGVmYXVsdFVSTC50cmltKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBudWxsOwotCQkJZWxzZQotCQkJCXVybFN0cmluZyA9IGRlZmF1bHRVUkw7Ci0JCX0KLQotCQkvLyBVUkwgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlCQotCQlpZiAodXJsU3RyaW5nLnN0YXJ0c1dpdGgoIi8iKSAmJiB1cmxTdHJpbmcubGVuZ3RoKCkgPiAxKSAvLyROT04tTkxTLTEkCi0JCQl1cmxTdHJpbmcgPSB1cmxTdHJpbmcuc3Vic3RyaW5nKDEpOwotCQl0cnkgewotCQkJdXJsID0gbmV3IFVSTCh1cmxTdHJpbmcpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy8gdGhlIHVybCBpcyBub3QgYW4gYWJzb2x1dGUgVVJMCi0JCQkvLyB0cnkgcmVsYXRpdmUKLQkJCXVybCA9IG5ldyBVUkwocm9vdFVSTCwgdXJsU3RyaW5nKTsKLQkJfQotCi0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIGEgcmVsYXRpdmUgU3RyaW5nIHRvIHJvb3RVUkwgCi0JICogaWYgdXJsIGNvbnRhaW5zIHJvb3RVUkwgc28KLQkgKiBuZXcgVVJMKHJvb3RVUkwsIHJlc3VsdFN0cmluZykgPT0gdXJsCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VVJMQXNTdHJpbmcoVVJMIHJvb3RVUkwsIFVSTCB1cmwpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0KLQkJaWYgKHJvb3RVUkwgPT0gbnVsbCkgewotCQkJcmV0dXJuICh1cmwgPT0gbnVsbCkgPyBudWxsIDogdXJsLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQkvLyBpZiBubyBVUkwgLCByZXR1cm4gbnVsbAotCQlpZiAodXJsICE9IG51bGwpIHsKLQotCQkJcmVzdWx0ID0gdXJsLnRvRXh0ZXJuYWxGb3JtKCk7Ci0KLQkJCWlmIChyb290VVJMLmdldEhvc3QoKSAhPSBudWxsICYmICFyb290VVJMLmdldEhvc3QoKS5lcXVhbHModXJsLmdldEhvc3QoKSkpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQotCQkJaWYgKHJvb3RVUkwuZ2V0UHJvdG9jb2woKSAhPSBudWxsICYmICFyb290VVJMLmdldFByb3RvY29sKCkuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKSkKLQkJCQlyZXR1cm4gcmVzdWx0OwotCi0JCQlpZiAocm9vdFVSTC5nZXRQb3J0KCkgIT0gdXJsLmdldFBvcnQoKSkKLQkJCQlyZXR1cm4gcmVzdWx0OwotCi0JCQlTdHJpbmcgcm9vdFVSTEZpbGVTdHJpbmcgPSByb290VVJMLmdldEZpbGUoKTsKLQkJCXJvb3RVUkxGaWxlU3RyaW5nID0gcm9vdFVSTEZpbGVTdHJpbmcucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCQlpZiAoIXJvb3RVUkxGaWxlU3RyaW5nLmVuZHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWludCBpbmRleCA9IHJvb3RVUkxGaWxlU3RyaW5nLmxhc3RJbmRleE9mKCcvJyk7Ci0JCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJCXJvb3RVUkxGaWxlU3RyaW5nID0gcm9vdFVSTEZpbGVTdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCQlTdHJpbmcgdXJsRmlsZVN0cmluZyA9IHVybC5nZXRGaWxlKCk7Ci0KLQkJCWlmICh1cmxGaWxlU3RyaW5nLnN0YXJ0c1dpdGgocm9vdFVSTEZpbGVTdHJpbmcpKSB7Ci0JCQkJcmVzdWx0ID0gdXJsRmlsZVN0cmluZy5zdWJzdHJpbmcocm9vdFVSTEZpbGVTdHJpbmcubGVuZ3RoKCkpOwotCQkJCXJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gd2UgbmVlZCB0byBjaGVjayB0aGUgZm9sbG93aW5nCi0JCQkJLy8gZmlsZTovQzovIGFuZCBmaWxlOkM6LwotCQkJCWlmICgiZmlsZSIuZXF1YWxzSWdub3JlQ2FzZSh1cmwuZ2V0UHJvdG9jb2woKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlGaWxlIHJvb3RGaWxlID0gbmV3IEZpbGUocm9vdFVSTEZpbGVTdHJpbmcpOwotCQkJCQlGaWxlIHVybEZpbGUgPSBuZXcgRmlsZSh1cmxGaWxlU3RyaW5nKTsKLQotCQkJCQlGaWxlIHJlbGF0aXZlUGF0aCA9IHVybEZpbGU7Ci0JCQkJCXdoaWxlIChyZWxhdGl2ZVBhdGggIT0gbnVsbCAmJiAhcm9vdEZpbGUuZXF1YWxzKHJlbGF0aXZlUGF0aC5nZXRQYXJlbnRGaWxlKCkpKSB7Ci0JCQkJCQlyZWxhdGl2ZVBhdGggPSByZWxhdGl2ZVBhdGguZ2V0UGFyZW50RmlsZSgpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKHJlbGF0aXZlUGF0aCA9PSBudWxsKSB7Ci0JCQkJCQlVcGRhdGVDb3JlLndhcm4oIkNhbm5vdCBjYWxjdWxhdGUgcmVsYXRpdmUgcGF0aCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZXR1cm4gdXJsLnRvU3RyaW5nKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmcgcmVsYXRpdmVSb290U3RyaW5nID0gcmVsYXRpdmVQYXRoLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQkJCVN0cmluZyBmdWxsU3RyaW5nID0gdXJsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQkJCWlmICghZnVsbFN0cmluZy5zdGFydHNXaXRoKHJlbGF0aXZlUm9vdFN0cmluZykpIHsKLQkJCQkJCQlVcGRhdGVDb3JlLndhcm4oIkZ1bGwgcGF0aDoiICsgZnVsbFN0cmluZyArICIgZG9lcyBub3Qgc3RhcnQgd2l0aCAiICsgcmVsYXRpdmVSb290U3RyaW5nKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJcmV0dXJuIHVybC50b1N0cmluZygpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlTdHJpbmcgcmV0dXJuU3RyaW5nID0gZnVsbFN0cmluZy5zdWJzdHJpbmcocmVsYXRpdmVSb290U3RyaW5nLmxlbmd0aCgpICsgMSk7Ci0JCQkJCQkJaWYgKHVybEZpbGUuaXNEaXJlY3RvcnkoKSkKLQkJCQkJCQkJcmV0dXJuU3RyaW5nICs9IEZpbGUuc2VwYXJhdG9yOwotCQkJCQkJCS8vIHdlIGxvc3QgdGhlIGxhc3Qgc2xhc2ggd2hlbiB0cmFuZm9ybWluZyBpbiBGaWxlCi0JCQkJCQkJcmV0dXJuU3RyaW5nID0gcmV0dXJuU3RyaW5nLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotCQkJCQkJCXJldHVybiByZXR1cm5TdHJpbmc7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCi0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzdWx0ID0gdXJsLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm5zIGEgdHJhbnNsYXRlZCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcgaW5mb1VSTCwgUmVzb3VyY2VCdW5kbGUgYnVuZGxlKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAoaW5mb1VSTCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBQbGF0Zm9ybS5nZXRSZXNvdXJjZVN0cmluZyhVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLCBpbmZvVVJMLCBidW5kbGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkwgY29weVRvTG9jYWwoSW5wdXRTdHJlYW0gc291cmNlQ29udGVudFJlZmVyZW5jZVN0cmVhbSwgU3RyaW5nIGxvY2FsTmFtZSwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uIHsKLQkJVVJMIHJlc3VsdCA9IG51bGw7Ci0JCS8vIGNyZWF0ZSB0aGUgRGlyIGlmIHRoZXkgZG8gbm90IGV4aXN0Ci0JCS8vIGdldCB0aGUgcGF0aCBmcm9tIHRoZSBGaWxlIHRvIHJlc29sdmUgRmlsZS5zZXBhcmF0b3IuLgotCQkvLyBkbyBub3QgdXNlIHRoZSBTdHJpbmcgYXMgaXQgbWF5IGNvbnRhaW4gVVJMIGxpa2Ugc2VwYXJhdG9yCi0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUobG9jYWxOYW1lKTsKLQkJaW50IGluZGV4ID0gbG9jYWxGaWxlLmdldFBhdGgoKS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcik7Ci0JCWlmIChpbmRleCAhPSAtMSkgewotCQkJRmlsZSBkaXIgPSBuZXcgRmlsZShsb2NhbEZpbGUuZ2V0UGF0aCgpLnN1YnN0cmluZygwLCBpbmRleCkpOwotCQkJaWYgKCFkaXIuZXhpc3RzKCkpCi0JCQkJZGlyLm1rZGlycygpOwotCQl9Ci0KLQkJLy8gdHJhbnNmZXIgdGhlIGNvbnRlbnQgb2YgdGhlIEZpbGUKLQkJaWYgKCFsb2NhbEZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJT3V0cHV0U3RyZWFtIGxvY2FsQ29udGVudFJlZmVyZW5jZVN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGxvY2FsRmlsZSk7Ci0JCQl0cnkgewotCQkJCVV0aWxpdGllcy5jb3B5KHNvdXJjZUNvbnRlbnRSZWZlcmVuY2VTdHJlYW0sIGxvY2FsQ29udGVudFJlZmVyZW5jZVN0cmVhbSwgbW9uaXRvcik7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCWxvY2FsQ29udGVudFJlZmVyZW5jZVN0cmVhbS5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpe30KLQkJCX0KLQkJfQotCQlyZXN1bHQgPSBsb2NhbEZpbGUudG9VUkwoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIFsyMDMwNV0gbmVlZCB0byBzbGFtIHBlcm1pc3Npb25zIGZvciBleGVjdXRhYmxlIGxpYnMgb24gc29tZQotCSAqIHBsYXRmb3Jtcy4gVGhpcyBpcyBhIHRlbXBvcmFyeSBmaXgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tQZXJtaXNzaW9ucyhDb250ZW50UmVmZXJlbmNlIHJlZiwgU3RyaW5nIGZpbGVQYXRoKSB7Ci0KLQkJaWYgKHJlZi5nZXRQZXJtaXNzaW9uKCkgIT0gMCkgewotCQkJVXBkYXRlQ29yZS53YXJuKCJDaGFuZ2UgcGVybWlzc2lvbiBmb3IgIiArIGZpbGVQYXRoICsgIiB0byAiICsgcmVmLmdldFBlcm1pc3Npb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJLy8gRklYTUU6IGNoYW5nZSB0aGUgY29kZSB0byB1c2UgSk5JCi0JCX0KLQotCQlpZiAoZmlsZVBhdGggIT0gbnVsbCAmJiBPU19VTklYICYmIHJlZi5nZXRQZXJtaXNzaW9uKCkgIT0gMCkgewotCQkJLy8gYWRkIGV4ZWN1dGUgcGVybWlzc2lvbiBvbiBzaGFyZWQgbGlicmFyaWVzIDIwMzA1Ci0JCQkvLyBkbyBub3QgcmVtb3ZlIHdyaXRlIHBlcm1pc3Npb24gMjA4OTYKLQkJCS8vIGNobW9kIGEreCAqLnNsCi0JCQl0cnkgewotCQkJCVByb2Nlc3MgcHIgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKG5ldyBTdHJpbmdbXSB7ICJjaG1vZCIsICJhK3giLCBmaWxlUGF0aCB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJVGhyZWFkIGNobW9kT3V0cHV0ID0gbmV3IFN0cmVhbUNvbnN1bWVyKHByLmdldElucHV0U3RyZWFtKCkpOwotCQkJCWNobW9kT3V0cHV0LnNldE5hbWUoImNobW9kIG91dHB1dCByZWFkZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNobW9kT3V0cHV0LnN0YXJ0KCk7Ci0JCQkJVGhyZWFkIGNobW9kRXJyb3IgPSBuZXcgU3RyZWFtQ29uc3VtZXIocHIuZ2V0RXJyb3JTdHJlYW0oKSk7Ci0JCQkJY2htb2RFcnJvci5zZXROYW1lKCJjaG1vZCBlcnJvciByZWFkZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNobW9kRXJyb3Iuc3RhcnQoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJfQotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgcmFuZG9tIGZpbGUgbmFtZSBmb3IgdGhlIGxvY2FsIHN5c3RlbQotCSAqIGF0dGVtcHQgdG8gY29uc2VydmUgdGhlIGV4dGVuc2lvbiBpZiB0aGVyZSBpcyBhICcuJyBpbiB0aGUgcGF0aAotCSAqIGFuZCBubyBGaWxlLlNlcGVyYXRvciBhZnRlciB0aGUgJy4nCi0JICogCi0JICogXGFcYlxjLnR4dCAtPiBjOTg3NjU5Mzg1LnR4dAotCSAqIGMudHh0IC0+IGMzODU0NzYzLnR4dAotCSAqIGMJLT4gYzk1Mzg2NzU0OQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2FsUmFuZG9tSWRlbnRpZmllcihTdHJpbmcgcmVtb3RlUGF0aCwgRGF0ZSBkYXRlKSB7Ci0JCWludCBkb3RJbmRleCA9IHJlbW90ZVBhdGgubGFzdEluZGV4T2YoIi4iKTsJLy8kTk9OLU5MUy0xJAotCQlpbnQgZmlsZUluZGV4ID0gcmVtb3RlUGF0aC5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcik7Ci0JCS8vIGlmIHRoZXJlIGlzIGEgc2VwYXJhdG9yIGFmdGVyIHRoZSBkb3QKLQkJLy8gZG8gbm90IGNvbnNpZGVyIGl0IGFzIGFuIGV4dGVuc2lvbgotCQlTdHJpbmcgZXh0ID0gKGRvdEluZGV4ICE9IC0xICYmIGZpbGVJbmRleCA8IGRvdEluZGV4KSA/IHJlbW90ZVBhdGguc3Vic3RyaW5nKGRvdEluZGV4KSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vIHRoZSBuYW1lIGlzIHRoZSBzdHJpbmcgYmV0d2VlbiB0aGUgc2VwYXJhdG9yIGFuZCB0aGUgZG90Ci0JCS8vIGlmIHRoZXJlIGlzIG5vIHNlcGFyYXRvciwgaXQgaXMgdGhlIHN0cmluZyB1cCB0byB0aGUgZG90CQkKLQkJLy8gaWYgdGhlcmUgaXMgbm8gZG90LCBnbyB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgCi0JCWlmIChmaWxlSW5kZXggPT0gLTEpCi0JCQlmaWxlSW5kZXggPSAwOwotCQlpZiAoZG90SW5kZXggPT0gLTEpCi0JCQlkb3RJbmRleCA9IHJlbW90ZVBhdGgubGVuZ3RoKCk7Ci0JCS8vIGlmIEkgaGF2ZSBhIHNlcGFyYXRvciBhbmQgbm8gZG90OiAvYS9iL2MgLT4gYwotCQkvLyBpZiBteSBzZXBhcmF0b3IgaXMgdGhlIGxhc3QgL2EvYi9jLywgZmlsZUluZGV4IGFuZCBkb3RJbmRleCBhcmUgdGhlIHNhbWUsIHNvIGl0IHdpbGwgcmV0dXJuIHRoZSBkZWZhdWx0IHRlbXAgbmFtZQotCQlTdHJpbmcgbmFtZSA9IChmaWxlSW5kZXggPCBkb3RJbmRleCkgPyByZW1vdGVQYXRoLnN1YnN0cmluZyhmaWxlSW5kZXgsIGRvdEluZGV4KSA6ICJFY2xpcHNlX1VwZGF0ZV9UTVBfIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcmVzdWx0ID0gbmFtZSArIGRhdGUuZ2V0VGltZSgpICsgZXh0OwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIHJlbW92ZSBhIGZpbGUgb3IgZGlyZWN0b3J5IGZyb20gdGhlIGZpbGUgc3lzdGVtLgotCSAqIHVzZWQgdG8gY2xlYW4gdXAgaW5zdGFsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVGcm9tRmlsZVN5c3RlbShGaWxlIGZpbGUpIHsKLQkJaWYgKCFmaWxlLmV4aXN0cygpIHx8ICFmaWxlLmNhbldyaXRlKCkpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJU3RyaW5nW10gZmlsZXMgPSBmaWxlLmxpc3QoKTsKLQkJCWlmIChmaWxlcyAhPSBudWxsKSAvLyBiZSBjYXJlZnVsIHNpbmNlIGZpbGUubGlzdCgpIGNhbiByZXR1cm4gbnVsbAotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyArK2kpCi0JCQkJCXJlbW92ZUZyb21GaWxlU3lzdGVtKG5ldyBGaWxlKGZpbGUsIGZpbGVzW2ldKSk7Ci0JCX0KLQotCQlpZiAoIWZpbGUuZGVsZXRlKCkpIHsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5VcGRhdGVNYW5hZ2VyVXRpbHNfVW5hYmxlVG9SZW1vdmVGaWxlLCAobmV3IFN0cmluZ1tdIHsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSB9KSk7Ci0JCQlVcGRhdGVDb3JlLmxvZyhtc2csIG5ldyBFeGNlcHRpb24oKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZW1vdmUgYWxsIHRoZSBlbXB0eSBkaXJlY3RvcmllcyByZWN1cnNpdmVseQotCSAqIHVzZWQgdG8gY2xlYW4gdXAgaW5zdGFsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVFbXB0eURpcmVjdG9yaWVzRnJvbUZpbGVTeXN0ZW0oRmlsZSBmaWxlKSB7Ci0JCWlmICghZmlsZS5pc0RpcmVjdG9yeSgpKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZ1tdIGZpbGVzID0gZmlsZS5saXN0KCk7Ci0JCWlmIChmaWxlcyAhPSBudWxsKSB7IC8vIGJlIGNhcmVmdWwgc2luY2UgZmlsZS5saXN0KCkgY2FuIHJldHVybiBudWxsCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgKytpKSB7Ci0JCQkJcmVtb3ZlRW1wdHlEaXJlY3Rvcmllc0Zyb21GaWxlU3lzdGVtKG5ldyBGaWxlKGZpbGUsIGZpbGVzW2ldKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFmaWxlLmRlbGV0ZSgpKSB7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMuVXBkYXRlTWFuYWdlclV0aWxzX1VuYWJsZVRvUmVtb3ZlRmlsZSwgKG5ldyBTdHJpbmdbXSB7IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgfSkpOwotCQkJVXBkYXRlQ29yZS5sb2cobXNnLCBuZXcgRXhjZXB0aW9uKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luIGVudHJpZXMgdGhhdCBhcmUgaW4gc291cmNlIGFycmF5IGFuZAotCSAqIG5vdCBpbiB0YXJnZXQgYXJyYXkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQbHVnaW5FbnRyeVtdIGRpZmYoSVBsdWdpbkVudHJ5W10gc291cmNlQXJyYXksIElQbHVnaW5FbnRyeVtdIHRhcmdldEFycmF5KSB7IC8vIE5vIHBsdWdpbkVudHJ5IHRvIEluc3RhbGwsIHJldHVybiBOb3RoaW5nIHRvIGluc3RhbAotCQlpZiAoc291cmNlQXJyYXkgPT0gbnVsbCB8fCBzb3VyY2VBcnJheS5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIG5ldyBJUGx1Z2luRW50cnlbMF07Ci0JCX0gLy8gTm8gcGx1Z2luRW50cnkgaW5zdGFsbGVkLCBJbnN0YWxsIHRoZW0gYWxsCi0JCWlmICh0YXJnZXRBcnJheSA9PSBudWxsIHx8IHRhcmdldEFycmF5Lmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gc291cmNlQXJyYXk7Ci0JCX0gLy8gaWYgYSBJUGx1Z2luRW50cnkgZnJvbSBzb3VyY2VBcnJheSBpcyBOT1QgaW4KLQkJLy8gdGFyZ2V0QXJyYXksIGFkZCBpdCB0byB0aGUgbGlzdAotCQlMaXN0IGxpc3QxID0gQXJyYXlzLmFzTGlzdCh0YXJnZXRBcnJheSk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VBcnJheS5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFsaXN0MS5jb250YWlucyhzb3VyY2VBcnJheVtpXSkpCi0JCQkJcmVzdWx0LmFkZChzb3VyY2VBcnJheVtpXSk7Ci0JCX0KLQotCQlJUGx1Z2luRW50cnlbXSByZXN1bHRFbnRyeSA9IG5ldyBJUGx1Z2luRW50cnlbcmVzdWx0LnNpemUoKV07Ci0JCWlmIChyZXN1bHQuc2l6ZSgpID4gMCkKLQkJCXJlc3VsdC50b0FycmF5KHJlc3VsdEVudHJ5KTsKLQkJcmV0dXJuIHJlc3VsdEVudHJ5OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJMIGFzRGlyZWN0b3J5VVJMKFVSTCB1cmwpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQkvL3VybCA9IFVSTEVuY29kZXIuZW5jb2RlKHVybCk7Ci0JCVN0cmluZyBwYXRoID0gdXJsLmdldEZpbGUoKTsKLQkJaWYgKCFwYXRoLmVuZHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaW50IGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZignLycpOwotCQkJaWYgKGluZGV4ICE9IC0xKQotCQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBpbmRleCArIDEpOwotCQkJLy8gaWdub3JlIGFueSByZWYgaW4gb3JpZ2luYWwgVVJMCi0JCQl1cmwgPSBuZXcgVVJMKHVybC5nZXRQcm90b2NvbCgpLCB1cmwuZ2V0SG9zdCgpLCB1cmwuZ2V0UG9ydCgpLCBwYXRoKTsKLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQotCS8qCi0JICogQ29tcGFyZXMgdHdvIFVSTCBmb3IgZXF1YWxpdHkKLQkgKiBSZXR1cm4gZmFsc2UgaWYgb25lIG9mIHRoZW0gaXMgbnVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzYW1lVVJMKFVSTCB1cmwxLCBVUkwgdXJsMikgewotCi0JCWlmICh1cmwxID09IG51bGwgfHwgdXJsMiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodXJsMSA9PSB1cmwyKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmICh1cmwxLmVxdWFscyh1cmwyKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCS8vIGNoZWNrIGlmIFVSTCBhcmUgZmlsZTogVVJMIGFzIHdlIG1heQotCQkvLyBoYXZlIDIgVVJMIHBvaW50aW5nIHRvIHRoZSBzYW1lIGZlYXR1cmVSZWZlcmVuY2UKLQkJLy8gYnV0IHdpdGggZGlmZmVyZW50IHJlcHJlc2VudGF0aW9uCi0JCS8vIChpLmUuIGZpbGU6L0M7LyBhbmQgZmlsZTpDOi8pCi0JCWlmICghImZpbGUiLmVxdWFsc0lnbm9yZUNhc2UodXJsMS5nZXRQcm90b2NvbCgpKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoISJmaWxlIi5lcXVhbHNJZ25vcmVDYXNlKHVybDIuZ2V0UHJvdG9jb2woKSkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQotCQlGaWxlIGZpbGUxID0gZ2V0RmlsZUZvcih1cmwxKTsvL25ldyBGaWxlKHVybDEuZ2V0RmlsZSgpKTsKLQkJRmlsZSBmaWxlMiA9IGdldEZpbGVGb3IodXJsMik7Ci0KLQkJaWYgKGZpbGUxID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIChmaWxlMS5lcXVhbHMoZmlsZTIpKTsKLQl9Ci0JCi0JLyoKLQkgKiBNZXRob2QgZ2V0RmlsZUZvci4KLQkgKiBAcGFyYW0gdXJsMQotCSAqIEByZXR1cm4gRmlsZQotCSAqLwotCXByaXZhdGUgc3RhdGljIEZpbGUgZ2V0RmlsZUZvcihVUkwgdXJsMSkgewotCQlpZiAodXJsRmlsZU1hcCA9PSBudWxsKSB1cmxGaWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJaWYgKHVybEZpbGVNYXAuZ2V0KHVybDEpIT1udWxsKSByZXR1cm4gKEZpbGUpdXJsRmlsZU1hcC5nZXQodXJsMSk7Ci0JCUZpbGUgbmV3RmlsZSA9IG5ldyBGaWxlKHVybDEuZ2V0RmlsZSgpKTsKLQkJdXJsRmlsZU1hcC5wdXQodXJsMSxuZXdGaWxlKTsKLQkJcmV0dXJuIG5ld0ZpbGU7IAotCX0KLQotCS8qCi0JICogcmV0dXJucyB0aGUgbGlzdCBvZiBGZWF0dXJlUmVmZXJlbmNlIHRoYXQgYXJlIHBhcmVudCBvZiAKLQkgKiB0aGUgRmVhdHVyZSBvciBhbiBlbXB0eSBhcnJheSBpZiBubyBwYXJlbnQgZm91bmQuCi0JICogQHBhcmFtIG9ubHlPcHRpb25hbCBpZiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gb25seSByZXR1cm4gcGFyZW50cyB0aGF0IGNvbnNpZGVyIHRoZSBmZWF0dXJlIG9wdGlvbmFsCi0JICogQHBhcmFtIGNoaWxkCi0JICogQHBhcmFtIHBvc3NpYmxlc1BhcmVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRQYXJlbnRGZWF0dXJlcyhJRmVhdHVyZSBjaGlsZEZlYXR1cmUsIElGZWF0dXJlUmVmZXJlbmNlW10gcG9zc2libGVzUGFyZW50LCBib29sZWFuIG9ubHlPcHRpb25hbCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWlmIChjaGlsZEZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSUZlYXR1cmVSZWZlcmVuY2VbMF07Ci0KLQkJTGlzdCBwYXJlbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW4gPSBudWxsOwotCQlJRmVhdHVyZSBjb21wYXJlRmVhdHVyZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcG9zc2libGVzUGFyZW50Lmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCUlGZWF0dXJlIHBvc3NpYmxlUGFyZW50RmVhdHVyZSA9IHBvc3NpYmxlc1BhcmVudFtpXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCWlmIChwb3NzaWJsZVBhcmVudEZlYXR1cmUgIT0gbnVsbCkgewotCQkJCQljaGlsZHJlbiA9IHBvc3NpYmxlUGFyZW50RmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJY29tcGFyZUZlYXR1cmUgPSBjaGlsZHJlbltqXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJVXBkYXRlQ29yZS53YXJuKCIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJaWYgKGNoaWxkRmVhdHVyZS5lcXVhbHMoY29tcGFyZUZlYXR1cmUpKSB7Ci0JCQkJCQkJaWYgKG9ubHlPcHRpb25hbCkgewotCQkJCQkJCQlpZiAoVXBkYXRlTWFuYWdlclV0aWxzLmlzT3B0aW9uYWwoY2hpbGRyZW5bal0pKSB7Ci0JCQkJCQkJCQlwYXJlbnRMaXN0LmFkZChwb3NzaWJsZXNQYXJlbnRbaV0pOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJVXBkYXRlQ29yZS53YXJuKCJGZWF0dXJlIDoiICsgY2hpbGRyZW5bal0gKyAiIG5vdCBvcHRpb25hbC4gTm90IGluY2x1ZGVkIGluIHBhcmVudHMgbGlzdC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlwYXJlbnRMaXN0LmFkZChwb3NzaWJsZXNQYXJlbnRbaV0pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcGFyZW50cyA9IG5ldyBJRmVhdHVyZVJlZmVyZW5jZVswXTsKLQkJaWYgKHBhcmVudExpc3Quc2l6ZSgpID4gMCkgewotCQkJcGFyZW50cyA9IG5ldyBJRmVhdHVyZVJlZmVyZW5jZVtwYXJlbnRMaXN0LnNpemUoKV07Ci0JCQlwYXJlbnRMaXN0LnRvQXJyYXkocGFyZW50cyk7Ci0JCX0KLQkJcmV0dXJuIHBhcmVudHM7Ci0JfQotCi0JLyoKLQkgKiBJZiB0aGUgcmV0dXJuIGNvZGUgb2YgdGhlIEhUVFAgY29ubmVjdGlvbiBpcyBub3QgMjAwIChPSykKLQkgKiB0aG93IGFuIElPIGV4Y2VwdGlvbgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0Nvbm5lY3Rpb25SZXN1bHQoSVJlc3BvbnNlIHJlc3BvbnNlLFVSTCB1cmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGRpZCB0aGUgc2VydmVyIHJldHVybiBhbiBlcnJvciBjb2RlID8KLQkJaW50IHJlc3VsdCA9IHJlc3BvbnNlLmdldFN0YXR1c0NvZGUoKTsKLQotCQlpZiAocmVzdWx0ICE9IFVwZGF0ZUNvcmUuSFRUUF9PSykgeyAKLQkJCVN0cmluZyBzZXJ2ZXJNc2cgPSByZXNwb25zZS5nZXRTdGF0dXNNZXNzYWdlKCk7Ci0JCQlyZXNwb25zZS5jbG9zZSgpOwotCQkJdGhyb3cgbmV3IEZhdGFsSU9FeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuQ29udGVudFJlZmVyZW5jZV9IdHRwTm9rLCAobmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIocmVzdWx0KSwgc2VydmVyTXNnLCB1cmwgfSkpKTsJCQkJCQkKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyZWFtQ29uc3VtZXIgZXh0ZW5kcyBUaHJlYWQgewotCQlJbnB1dFN0cmVhbSBpczsKLQkJYnl0ZVtdIGJ1ZjsKLQkJcHVibGljIFN0cmVhbUNvbnN1bWVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zZXREYWVtb24odHJ1ZSk7Ci0JCQl0aGlzLmlzID0gaW5wdXRTdHJlYW07Ci0JCQlidWYgPSBuZXcgYnl0ZVs1MTJdOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJaW50IG4gPSAwOwotCQkJCXdoaWxlIChuID49IDApCi0JCQkJCW4gPSBpcy5yZWFkKGJ1Zik7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgb3B0aW9uYWwgY2hpbGRyZW4gdG8gaW5zdGFsbAotCSAqIFRoZSBvcHRpb25hbCBmZWF0dXJlcyB0byBpbnN0YWxsIG1heSBub3QgYWxsIGJlIGRpcmVjdCBjaGlsZHJlbiAKLQkgKiBvZiB0aGUgZmVhdHVyZS4KLQkgKiBBbHNvIGluY2x1ZGUgbm9uLW9wdGlvbmFsIGZlYXR1cmVzCi0JICogCi0JICogQHBhcmFtIGNoaWxkcmVuIGFsbCB0aGUgbmVzdGVkIGZlYXR1cmVzCi0JICogQHBhcmFtIG9wdGlvbmFsZmVhdHVyZXMgb3B0aW9uYWwgZmVhdHVyZXMgdG8gaW5zdGFsbAotCSAqIEByZXR1cm4gSUZlYXR1cmVSZWZlcmVuY2VbXQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbENoaWxkcmVuVG9JbnN0YWxsKElGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW4sIElGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxmZWF0dXJlcykgewotCi0JCUxpc3Qgb3B0aW9uYWxDaGlsZHJlblRvSW5zdGFsbCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJSUZlYXR1cmVSZWZlcmVuY2Ugb3B0aW9uYWxGZWF0dXJlID0gY2hpbGRyZW5baV07Ci0JCQlpZiAoIVVwZGF0ZU1hbmFnZXJVdGlscy5pc09wdGlvbmFsKG9wdGlvbmFsRmVhdHVyZSkpIHsKLQkJCQlvcHRpb25hbENoaWxkcmVuVG9JbnN0YWxsLmFkZChvcHRpb25hbEZlYXR1cmUpOwotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG9wdGlvbmFsZmVhdHVyZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKG9wdGlvbmFsRmVhdHVyZS5lcXVhbHMob3B0aW9uYWxmZWF0dXJlc1tqXSkpIHsKLQkJCQkJCW9wdGlvbmFsQ2hpbGRyZW5Ub0luc3RhbGwuYWRkKG9wdGlvbmFsRmVhdHVyZSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVzdWx0ID0gbmV3IElGZWF0dXJlUmVmZXJlbmNlW29wdGlvbmFsQ2hpbGRyZW5Ub0luc3RhbGwuc2l6ZSgpXTsKLQkJaWYgKG9wdGlvbmFsQ2hpbGRyZW5Ub0luc3RhbGwuc2l6ZSgpID4gMCkgewotCQkJb3B0aW9uYWxDaGlsZHJlblRvSW5zdGFsbC50b0FycmF5KHJlc3VsdCk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIHJldHVybnMgdGhlIG1hcHBpbmcgb2YgbWF0Y2hpbmcgcnVsZXMKLQkgKiB0aGUgZGVmYXVsdCByZXR1cm5zIHBlcmZlY3QKLQkgKiAKLQkgKiBAc2luY2UgMi4wLjIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRNYXRjaGluZ1J1bGUoU3RyaW5nIHJ1bGUpIHsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBJVXBkYXRlQ29uc3RhbnRzLlJVTEVfQ09NUEFUSUJMRTsKLQkJZmluYWwgSW50ZWdlciBpbnRlZ2VyID0gKEludGVnZXIpIHRhYmxlLmdldChydWxlKTsKLQkJaWYgKGludGVnZXIgPT0gbnVsbCkKLQkJCXJldHVybiBJVXBkYXRlQ29uc3RhbnRzLlJVTEVfUEVSRkVDVDsKLQkJaW50IHJ1bGVJbnQgPSBpbnRlZ2VyLmludFZhbHVlKCk7Ci0JCWlmIChydWxlSW50ID09IElVcGRhdGVDb25zdGFudHMuUlVMRV9OT05FKQotCQkJcmV0dXJuIElVcGRhdGVDb25zdGFudHMuUlVMRV9QRVJGRUNUOwotCQlyZXR1cm4gcnVsZUludDsKLQl9Ci0JCi0JLyoqCi0JICogcmV0dXJucyB0aGUgbWFwcGluZyBvZiBtYXRjaGluZyBpZCBydWxlcwotCSAqIHRoZSBkZWZhdWx0IHJldHVybnMgcGVyZmVjdAotCSAqIAotCSAqIEBzaW5jZSAyLjAuMgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldE1hdGNoaW5nSWRSdWxlKFN0cmluZyBydWxlKSB7Ci0JCQotCQlpZiAocnVsZSA9PSBudWxsKQotCQkJcmV0dXJuIElVcGRhdGVDb25zdGFudHMuUlVMRV9DT01QQVRJQkxFOwotCQlpZiAocnVsZSE9bnVsbCAmJiBydWxlLmVxdWFsc0lnbm9yZUNhc2UoInByZWZpeCIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gSVVwZGF0ZUNvbnN0YW50cy5SVUxFX1BSRUZJWDsKLQkJcmV0dXJuIElVcGRhdGVDb25zdGFudHMuUlVMRV9QRVJGRUNUOwotCX0KLQkKLQkvKioKLQkgKiBNZXRob2QgaXNPcHRpb25hbC4KLQkgKiBAcGFyYW0gZmVhdHVyZVJlZmVyZW5jZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc09wdGlvbmFsKElGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWZlcmVuY2UpIHsKLQkJaWYgKGZlYXR1cmVSZWZlcmVuY2U9PW51bGwpIHJldHVybiBmYWxzZTsKLQkJaWYgKGZlYXR1cmVSZWZlcmVuY2UgaW5zdGFuY2VvZiBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKXsKLQkJCXJldHVybiAoKElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UpZmVhdHVyZVJlZmVyZW5jZSkuaXNPcHRpb25hbCgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEVudmlyb25tZW50KElQbGF0Zm9ybUVudmlyb25tZW50IGNhbmRpZGF0ZSkgewotCQlpZiAoY2FuZGlkYXRlPT1udWxsKSByZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBvcyA9IGNhbmRpZGF0ZS5nZXRPUygpOwotCQlTdHJpbmcgd3MgPSBjYW5kaWRhdGUuZ2V0V1MoKTsKLQkJU3RyaW5nIGFyY2ggPSBjYW5kaWRhdGUuZ2V0T1NBcmNoKCk7Ci0JCVN0cmluZyBubCA9IGNhbmRpZGF0ZS5nZXROTCgpOwotCQlpZiAob3MhPW51bGwgJiYgIWlzTWF0Y2hpbmcob3MsIFNpdGVNYW5hZ2VyLmdldE9TKCkpKSByZXR1cm4gZmFsc2U7Ci0JCWlmICh3cyE9bnVsbCAmJiAhaXNNYXRjaGluZyh3cywgU2l0ZU1hbmFnZXIuZ2V0V1MoKSkpIHJldHVybiBmYWxzZTsKLQkJaWYgKGFyY2ghPW51bGwgJiYgIWlzTWF0Y2hpbmcoYXJjaCwgU2l0ZU1hbmFnZXIuZ2V0T1NBcmNoKCkpKSByZXR1cm4gZmFsc2U7Ci0JCWlmIChubCE9bnVsbCAmJiAhaXNNYXRjaGluZ0xvY2FsZShubCwgU2l0ZU1hbmFnZXIuZ2V0TkwoKSkpIHJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogT3JpZ2luYWwgY29kZSAtIGNvbW1lbnRlZCBvdXQgdG8gcHJvdmlkZSBhIHJlcGxhY2VtZW50IGFzIHBlciBidWcgOTgzODcKLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTWF0Y2hpbmcoU3RyaW5nIGNhbmRpZGF0ZVZhbHVlcywgU3RyaW5nIHNpdGVWYWx1ZXMpIHsKLQkJaWYgKHNpdGVWYWx1ZXM9PW51bGwpIHJldHVybiBmYWxzZTsKLQkJaWYgKCIqIi5lcXVhbHMoY2FuZGlkYXRlVmFsdWVzKSkgcmV0dXJuIHRydWU7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCIiLmVxdWFscyhjYW5kaWRhdGVWYWx1ZXMpKSByZXR1cm4gdHJ1ZTsgLy8kTk9OLU5MUy0xJAotCQlzaXRlVmFsdWVzID0gc2l0ZVZhbHVlcy50b1VwcGVyQ2FzZSgpOwkJCi0JCVN0cmluZ1Rva2VuaXplciBzdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihjYW5kaWRhdGVWYWx1ZXMsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHN0b2suaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSBzdG9rLm5leHRUb2tlbigpLnRvVXBwZXJDYXNlKCk7Ci0JCQlpZiAoc2l0ZVZhbHVlcy5pbmRleE9mKHRva2VuKSE9LTEpIHJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JKi8KLQkKLQkvKgotCSAqIEZpeGVkIGJ1ZyA5ODM4NwotCSAqLwotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNNYXRjaGluZyhTdHJpbmcgY2FuZGlkYXRlVmFsdWVzLCBTdHJpbmcgc2l0ZVZhbHVlcykgewotCQlpZiAoc2l0ZVZhbHVlcz09bnVsbCkgcmV0dXJuIGZhbHNlOwotCQlpZiAoIioiLmVxdWFscyhjYW5kaWRhdGVWYWx1ZXMpKSByZXR1cm4gdHJ1ZTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIiIuZXF1YWxzKGNhbmRpZGF0ZVZhbHVlcykpIHJldHVybiB0cnVlOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1Rva2VuaXplciBzaXRlVG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihzaXRlVmFsdWVzLCAiLCIpOyAgLy8kTk9OLU5MUy0xJAotCQkvLyROT04tTkxTLTEkCQotCQl3aGlsZShzaXRlVG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotCQkgICAgU3RyaW5nVG9rZW5pemVyIGNhbmRpZGF0ZVRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FuZGlkYXRlVmFsdWVzLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgc2l0ZVZhbHVlID0gc2l0ZVRva2Vucy5uZXh0VG9rZW4oKTsKLQkJCXdoaWxlIChjYW5kaWRhdGVUb2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJaWYgKHNpdGVWYWx1ZS5lcXVhbHNJZ25vcmVDYXNlCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FuZGlkYXRlVG9rZW5zLm5leHRUb2tlbigpKSkgcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCQotCS8qKgotCSAqIAotCSAqLwkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTWF0Y2hpbmdMb2NhbGUoU3RyaW5nIGNhbmRpZGF0ZVZhbHVlcywgU3RyaW5nIGxvY2FsZSkgewotCQlpZiAobG9jYWxlPT1udWxsKSByZXR1cm4gZmFsc2U7Ci0JCWlmICgiKiIuZXF1YWxzKGNhbmRpZGF0ZVZhbHVlcykpIHJldHVybiB0cnVlOyAvLyROT04tTkxTLTEkCi0JCWlmICgiIi5lcXVhbHMoY2FuZGlkYXRlVmFsdWVzKSkgcmV0dXJuIHRydWU7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWxvY2FsZSA9IGxvY2FsZS50b1VwcGVyQ2FzZSgpOwotCQljYW5kaWRhdGVWYWx1ZXMgPSBjYW5kaWRhdGVWYWx1ZXMudG9VcHBlckNhc2UoKTsJCi0JCVN0cmluZ1Rva2VuaXplciBzdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihjYW5kaWRhdGVWYWx1ZXMsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHN0b2suaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgY2FuZGlkYXRlID0gc3Rvay5uZXh0VG9rZW4oKTsKLQkJCWlmIChsb2NhbGUuaW5kZXhPZihjYW5kaWRhdGUpID09IDApCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAoY2FuZGlkYXRlLmluZGV4T2YobG9jYWxlKSA9PSAwKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkKLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kRXNjYXBlZENoYXIoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgY2hhciBjKSB7Ci0JCVN0cmluZyByZXBsYWNlbWVudCA9IGdldFJlcGxhY2VtZW50KGMpOwotCQlpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgnJicpOwotCQkJYnVmZmVyLmFwcGVuZChyZXBsYWNlbWVudCk7Ci0JCQlidWZmZXIuYXBwZW5kKCc7Jyk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKGMgPj0gJyAnICYmIGMgPD0gMHg3RSkgfHwgYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJyB8fCBjID09ICdcdCcpIHsKLQkJCQlidWZmZXIuYXBwZW5kKGMpOwotCQkJfSBlbHNlIHsKLQkJCQlidWZmZXIuYXBwZW5kKCImIyIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmZmVyLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGMpKTsKLQkJCQlidWZmZXIuYXBwZW5kKCc7Jyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbFNhZmUoU3RyaW5nIHMpIHsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIocy5sZW5ndGgoKSArIDEwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyArK2kpCi0JCQlhcHBlbmRFc2NhcGVkQ2hhcihyZXN1bHQsIHMuY2hhckF0KGkpKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRSZXBsYWNlbWVudChjaGFyIGMpIHsKLQkJLy8gRW5jb2RlIHNwZWNpYWwgWE1MIGNoYXJhY3RlcnMgaW50byB0aGUgZXF1aXZhbGVudCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KLQkJLy8gVGhlc2UgZml2ZSBhcmUgZGVmaW5lZCBieSBkZWZhdWx0IGZvciBhbGwgWE1MIGRvY3VtZW50cy4KLQkJc3dpdGNoIChjKSB7Ci0JCQljYXNlICc8JyA6Ci0JCQkJcmV0dXJuICJsdCI7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgJz4nIDoKLQkJCQlyZXR1cm4gImd0IjsgLy8kTk9OLU5MUy0xJAotCQkJY2FzZSAnIicgOgotCQkJCXJldHVybiAicXVvdCI7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgJ1wnJyA6Ci0JCQkJcmV0dXJuICJhcG9zIjsgLy8kTk9OLU5MUy0xJAotCQkJY2FzZSAnJicgOgotCQkJCXJldHVybiAiYW1wIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTYW1lVGltZXN0YW1wKFVSTCB1cmwsIGxvbmcgdGltZXN0YW1wKSB7CQotCQl0cnkgewotCQkJaWYgKFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0VXBkYXRlU2Vzc2lvbigpLmlzVmlzaXRlZCh1cmwpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZSh1cmwpOwotCQkJSVJlc3BvbnNlIHJlc3BvbnNlID0gQ29ubmVjdGlvbkZhY3RvcnkuZ2V0KHJlc29sdmVkVVJMKTsKLQkJCWxvbmcgcmVtb3RlTGFzdE1vZGlmaWVkID0gcmVzcG9uc2UuZ2V0TGFzdE1vZGlmaWVkKCk7Ci0JCQkvLyAyIHNlY29uZHMgdG9sZXJhbmNlLCBhcyBzb21lIE9TJ3MgbWF5IHJvdW5kIHVwIHRoZSB0aW1lIHN0YW1wCi0JCQkvLyB0byB0aGUgY2xvc2VzdCBzZWNvbmQuIEZvciBzYWZldHksIHdlIG1ha2UgaXQgMiBzZWNvbmRzLgotCQkJcmV0dXJuIE1hdGguYWJzKHJlbW90ZUxhc3RNb2RpZmllZCAtIHRpbWVzdGFtcCkvMTAwMCA8PSAyOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JLyoqCi0JICogVGhlIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgbG9va3VwIGtleS4KLQkgKiBAcGFyYW0ga2V5IG9wdGlvbmFsIGxvb2t1cCBrZXksIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSB0ZW1wIHRoZSBsb2NhbCB3b3JraW5nIGZpbGUKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIG1hcExvY2FsRmlsZUZyYWdtZW50KFN0cmluZyBrZXksIEZpbGVGcmFnbWVudCB0ZW1wKSB7Ci0JCS8vIGNyZWF0ZSBmaWxlIGFzc29jaWF0aW9uIAotCQlpZiAoa2V5ICE9IG51bGwpIHsKLQkJCWlmIChsb2NhbEZpbGVGcmFnbWVudE1hcCA9PSBudWxsKQotCQkJCWxvY2FsRmlsZUZyYWdtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWxvY2FsRmlsZUZyYWdtZW50TWFwLnB1dChrZXksIHRlbXApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgbG9va3VwIGtleS4KLQkgKiBAcGFyYW0ga2V5IG9wdGlvbmFsIGxvb2t1cCBrZXksIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgdW5NYXBMb2NhbEZpbGVGcmFnbWVudChTdHJpbmcga2V5KSB7Ci0JCS8vIHJlbW92ZSBmaWxlIGFzc29jaWF0aW9uIAotCQlpZiAoa2V5ICE9IG51bGwgJiYgbG9jYWxGaWxlRnJhZ21lbnRNYXAgIT1udWxsKSB7Ci0JCQlsb2NhbEZpbGVGcmFnbWVudE1hcC5yZW1vdmUoa2V5KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgcHJldmlvdXNseSBjYWNoZWQgbG9jYWwgZmlsZSAoaW4gdGVtcG9yYXJ5IGFyZWEpIG1hdGNoaW5nIHRoZQotCSAqIHNwZWNpZmllZCBrZXkuIAotCSAqIAotCSAqIEBwYXJhbSBrZXkgbG9va3VwIGtleQotCSAqIEByZXR1cm4gY2FjaGVkIGZpbGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEZpbGVGcmFnbWVudCBsb29rdXBMb2NhbEZpbGVGcmFnbWVudChTdHJpbmcga2V5KSB7Ci0JCWlmIChsb2NhbEZpbGVGcmFnbWVudE1hcCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRmlsZUZyYWdtZW50KSBsb2NhbEZpbGVGcmFnbWVudE1hcC5nZXQoa2V5KTsKLQl9Ci0JCi0JLyoqCi0JICogQ29waWVzIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0gdG8gdGhlIG91dHB1dCBzdHJlYW0uIE5laXRoZXIgc3RyZWFtCi0JICogaXMgY2xvc2VkIGFzIHBhcnQgb2YgdGhpcyBvcGVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGlzIGlucHV0IHN0cmVhbQotCSAqIEBwYXJhbSBvcyBvdXRwdXQgc3RyZWFtCi0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvcgotICAgICAqIEBwYXJhbSBleHBlY3RlZExlbmd0aCAtIGlmID4gMCwgdGhlIG51bWJlciBvZiBieXRlcyBmcm9tIElucHV0U3RyZWFtIHdpbGwgYmUgdmVyaWZpZWQKLQkgKiBAQHJldHVybiB0aGUgb2Zmc2V0IGluIHRoZSBpbnB1dCBzdHJlYW0gd2hlcmUgY29weWluZyBzdG9wcGVkLiBSZXR1cm5zIC0xIGlmIGVuZCBvZiBpbnB1dCBzdHJlYW0gaXMgcmVhY2hlZC4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBsb25nIGNvcHkoSW5wdXRTdHJlYW0gaXMsIE91dHB1dFN0cmVhbSBvcywgSW5zdGFsbE1vbml0b3IgbW9uaXRvciwgbG9uZyBleHBlY3RlZExlbmd0aCkgewotCQlieXRlW10gYnVmID0gZ2V0QnVmZmVyKCk7Ci0JCWxvbmcgb2Zmc2V0PTA7Ci0JCXRyeSB7Ci0JCQlpbnQgbGVuID0gaXMucmVhZChidWYpOwotCQkJaW50IG5leHRJbmNyZW1lbnQgPSAwOwotCQkJd2hpbGUgKGxlbiAhPSAtMSkgewotCQkJCW9zLndyaXRlKGJ1ZiwgMCwgbGVuKTsKLQkJCQkJb2Zmc2V0ICs9IGxlbjsKLQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJCW5leHRJbmNyZW1lbnQgKz0gbGVuOwotCQkJCQkvLyB1cGRhdGUgbW9uaXRvciBwZXJpb2RpY2FsbHkKLQkJCQkJaWYgKG5leHRJbmNyZW1lbnQgPj0gSU5DUkVNRU5UX1NJWkUpeyAJCi0JCQkJCQltb25pdG9yLmluY3JlbWVudENvdW50KG5leHRJbmNyZW1lbnQpOwotCQkJCQkJbmV4dEluY3JlbWVudCA9IDA7Ci0JCQkJCX0KLQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCQlyZXR1cm4gb2Zmc2V0OwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChleHBlY3RlZExlbmd0aCA+IDAgJiYgb2Zmc2V0ID09IGV4cGVjdGVkTGVuZ3RoKSB7Ci0JCQkJCS8vIGV2ZXJ5dGhpbmcgcmVhZCBkbyBub3QgcmV0dXJuIG9mZnNldCwgb3RoZXJ3aXNlIHRyeWluZwotCQkJCQkvLyB0byByZWFkIGFnYWluIGZyb20gdGhpcyBvZmZzZXQgd2lsbCByZXN1bHQgaW4gSFRUUCA0MTYKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCQotCQkJCWxlbiA9IGlzLnJlYWQoYnVmKTsKLQkJCX0KLQkJCWlmIChuZXh0SW5jcmVtZW50ID4gMCAmJiBtb25pdG9yICE9IG51bGwpCi0JCQkJbW9uaXRvci5pbmNyZW1lbnRDb3VudChuZXh0SW5jcmVtZW50KTsKLQkJCWlmKGV4cGVjdGVkTGVuZ3RoPjAgJiYgb2Zmc2V0IT1leHBlY3RlZExlbmd0aCkKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuVXBkYXRlTWFuYWdlclV0aWxzX2lucHV0U3RyZWFtRW5kZWQsIChuZXcgU3RyaW5nW10geyBTdHJpbmcudmFsdWVPZihvZmZzZXQpLCBTdHJpbmcudmFsdWVPZihleHBlY3RlZExlbmd0aCkgfSkpKTsKLQkJCXJldHVybiAtMTsKLQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKXsKLQkJCS8vIExvZyB0aGUgYWN0dWFsIGVycm9yLCBhcyB0aGlzIGlzIG5vIGxvbmdlcgotCQkJLy8gcGFzc2VkIHVwIHRoZSBjYWxsaW5nIHN0YWNrCi0JCQlVcGRhdGVDb3JlLmxvZyhNZXNzYWdlcy5VcGRhdGVNYW5hZ2VyVXRpbHNfY29weSArIG9mZnNldCwgZSk7IAotCQkJcmV0dXJuIG9mZnNldDsKLQkJfSBmaW5hbGx5IHsKLQkJCWZyZWVCdWZmZXIoYnVmKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBieXRlW10gZ2V0QnVmZmVyKCkgewotCQlpZiAoYnVmZmVyUG9vbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiAoYnl0ZVtdKSBidWZmZXJQb29sLnBvcCgpOwotCQl9IGNhdGNoIChFbXB0eVN0YWNrRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBuZXcgYnl0ZVtCVUZGRVJfU0laRV07Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBmcmVlQnVmZmVyKGJ5dGVbXSBidWYpIHsKLQkJaWYgKGJ1ZmZlclBvb2wgPT0gbnVsbCkKLQkJCWJ1ZmZlclBvb2wgPSBuZXcgU3RhY2soKTsKLQkJYnVmZmVyUG9vbC5wdXNoKGJ1Zik7Ci0JfQotCQotCQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGZyYWdtZW50cy4gWmVybyBsZW5ndGggaWYgbm8gZnJhZ21lbnRzLgotCSAqIEBwYXJhbSBidW5kbGUgdGhlIGJ1bmRsZSB0byBnZXQgZnJhZ21lbnRzIGZvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRnJhZ21lbnRFbnRyeVtdIGdldEZyYWdtZW50cyhCdW5kbGUgYnVuZGxlKSB7Ci0JCVBhY2thZ2VBZG1pbiBwa2dBZG1pbiA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGFja2FnZUFkbWluKCk7Ci0JCUJ1bmRsZVtdIGZyYWdtZW50QnVuZGxlcyA9IHBrZ0FkbWluLmdldEZyYWdtZW50cyhidW5kbGUpOwotCQlpZiAoZnJhZ21lbnRCdW5kbGVzID09IG51bGwpIAotCQkJcmV0dXJuIG5vRnJhZ21lbnRzOwotCQkKLQkJRnJhZ21lbnRFbnRyeVtdIGZyYWdtZW50cyA9IG5ldyBGcmFnbWVudEVudHJ5W2ZyYWdtZW50QnVuZGxlcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZyYWdtZW50cy5sZW5ndGg7IGkrKykgewotCQkJZnJhZ21lbnRzW2ldID0gbmV3IEZyYWdtZW50RW50cnkoKFN0cmluZykgZnJhZ21lbnRCdW5kbGVzW2ldCi0JCQkJCS5nZXRIZWFkZXJzKCkuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSwKLQkJCQkJKFN0cmluZykgZnJhZ21lbnRCdW5kbGVzW2ldLmdldEhlYWRlcnMoKS5nZXQoCi0JCQkJCQkJQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgUGxhdGZvcm0KLQkJCQkJCQkuZ2V0UmVzb3VyY2VTdHJpbmcoZnJhZ21lbnRCdW5kbGVzW2ldLAotCQkJCQkJCQkJKFN0cmluZykgZnJhZ21lbnRCdW5kbGVzW2ldLmdldEhlYWRlcnMoKQotCQkJCQkJCQkJCQkuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTikpLAotCQkJCQlmcmFnbWVudEJ1bmRsZXNbaV0uZ2V0TG9jYXRpb24oKSk7Ci0JCX0KLQkJcmV0dXJuIGZyYWdtZW50czsJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdyaXRhYmxlWE1MU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZih2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgYyA9IHZhbHVlLmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoYykgewotCQkJCWNhc2UgJyYnIDoKLQkJCQkJYnVmLmFwcGVuZCgiJmFtcDsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICc8JyA6Ci0JCQkJCWJ1Zi5hcHBlbmQoIiZsdDsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICc+JyA6Ci0JCQkJCWJ1Zi5hcHBlbmQoIiZndDsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcJycgOgotCQkJCQlidWYuYXBwZW5kKCImYXBvczsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcIicgOgotCQkJCQlidWYuYXBwZW5kKCImcXVvdDsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIDB4MDAgOgotCQkJCQlidWYuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7CQkJCQkJCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJ1Zi5hcHBlbmQoYyk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXRlRmVhdHVyZVtdIGdldExpZ2h0RmVhdHVyZXMoRXh0ZW5kZWRTaXRlIHNpdGUpIHsKLQkJCi0JCVVSTCBmdWxsRGlnZXN0VVJMOwotCQl0cnkgewotCQkJZnVsbERpZ2VzdFVSTCA9IGdldEZ1bGxEaWdlc3RVUkwoIHNpdGUsIExvY2FsZS5nZXREZWZhdWx0KCkuZ2V0Q291bnRyeSgpLCBMb2NhbGUuZ2V0RGVmYXVsdCgpLmdldExhbmd1YWdlKCkpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS5sb2coIkNvdWxkIG5vdCBhY2Nlc3MgZGlnZXN0IG9uIHRoZSBzaXRlOiAiICsgZS5nZXRNZXNzYWdlKCksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJRGlnZXN0IGRpZ2VzdCA9IG5ldyBEaWdlc3QoIGZ1bGxEaWdlc3RVUkwpOwotCQl0cnkgewotCQkJTGl0ZUZlYXR1cmVbXSBmZWF0dXJlcyA9ICAoTGl0ZUZlYXR1cmVbXSlkaWdlc3QucGFyc2VEaWdlc3QoKTsKLQkJCWZvcihpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJCWZlYXR1cmVzW2ldLnNldFNpdGUoc2l0ZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmVhdHVyZXM7Ci0JCX0gY2F0Y2goRXhjZXB0aW9uIGUpeyAKLQkJCVVwZGF0ZUNvcmUubG9nKCJEaWdlc3QgY291bGQgbm90IGJlIHBhcnNlZDoiICsgZS5nZXRNZXNzYWdlKCksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBVUkwgZ2V0RnVsbERpZ2VzdFVSTChFeHRlbmRlZFNpdGUgc2l0ZSwgU3RyaW5nIGNvdW50cnksIFN0cmluZyBsYW5ndWFnZSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCQotCQlTdHJpbmcgZGlnZXN0VVJMID0gKHNpdGUuZ2V0RGlnZXN0VVJMKCkuZW5kc1dpdGgoIi8iKT8gc2l0ZS5nZXREaWdlc3RVUkwoKTogc2l0ZS5nZXREaWdlc3RVUkwoKSArICIvIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCi0JCWlmIChkaWdlc3RVUkwuaW5kZXhPZigiOi8vIikgPT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHNpdGVVUkwgPSBzaXRlLmdldExvY2F0aW9uVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCWlmIChzaXRlVVJMLmVuZHNXaXRoKFNpdGUuU0lURV9YTUwpKSB7Ci0JCQkJc2l0ZVVSTCA9IHNpdGVVUkwuc3Vic3RyaW5nKDAsIHNpdGVVUkwubGVuZ3RoKCkgLSBTaXRlLlNJVEVfWE1MLmxlbmd0aCgpKTsKLQkJCX0gCi0JCQlpZiAoZGlnZXN0VVJMLmVxdWFscygiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlkaWdlc3RVUkwgPSBzaXRlVVJMOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZGlnZXN0VVJMLnN0YXJ0c1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWRpZ2VzdFVSTCA9IGRpZ2VzdFVSTC5zdWJzdHJpbmcoMSwgZGlnZXN0VVJMLmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQkJZGlnZXN0VVJMID0gc2l0ZVVSTCArIGRpZ2VzdFVSTDsKLQkJCX0KLQkJfQotCQkKLQkJZGlnZXN0VVJMICs9ICJkaWdlc3QiOyAgLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYgKCBpc0xvY2FsU3VwcG9ydGVkKHNpdGUsIGNvdW50cnksIGxhbmd1YWdlKSkgewotCQkJcmV0dXJuIG5ldyBVUkwoZGlnZXN0VVJMICsgIl8iICsgbGFuZ3VhZ2UgKyAiXyIgKyBjb3VudHJ5ICsgIi56aXAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQlpZiAoIGlzTGFuZ2F1Z2VTdXBwb3J0ZWQoc2l0ZSwgbGFuZ3VhZ2UpKSB7Ci0JCQlyZXR1cm4gbmV3IFVSTChkaWdlc3RVUkwgKyAiXyIgKyBsYW5ndWFnZSArICIuemlwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBuZXcgVVJMKGRpZ2VzdFVSTCArICIuemlwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTGFuZ2F1Z2VTdXBwb3J0ZWQoRXh0ZW5kZWRTaXRlIHNpdGUsIFN0cmluZyBsYW5ndWFnZSkgewotCQlTdHJpbmdbXSBhdmFpbGFibGVMYW5ndWFnZXMgPSAgc2l0ZS5nZXRBdmFpbGFibGVMb2NhbHMoKTsKLQkJaWYgKChhdmFpbGFibGVMYW5ndWFnZXMgPT0gbnVsbCkgfHwgKGF2YWlsYWJsZUxhbmd1YWdlcy5sZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IoaW50IGkgPSAwOyBpIDwgYXZhaWxhYmxlTGFuZ3VhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYXZhaWxhYmxlTGFuZ3VhZ2VzW2ldLmVxdWFscyhsYW5ndWFnZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xvY2FsU3VwcG9ydGVkKEV4dGVuZGVkU2l0ZSBzaXRlLCBTdHJpbmcgY291bnRyeSwgU3RyaW5nIGxhbmd1YWdlKSB7Ci0JCVN0cmluZyBsb2NhbGVDb2RlID0gbGFuZ3VhZ2UgKyAiXyIgKyBjb3VudHJ5OyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1tdIGF2YWlsYWJsZUxvY2FscyA9ICBzaXRlLmdldEF2YWlsYWJsZUxvY2FscygpOwotCQlpZiAoKGF2YWlsYWJsZUxvY2FscyA9PSBudWxsKSB8fCAoYXZhaWxhYmxlTG9jYWxzLmxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBhdmFpbGFibGVMb2NhbHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChhdmFpbGFibGVMb2NhbHNbaV0uZXF1YWxzKGxvY2FsZUNvZGUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlUHJlZmVyZW5jZXNJbml0aWFsaXplci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVQcmVmZXJlbmNlc0luaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNWE1ZGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVQcmVmZXJlbmNlc0luaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLQotLyoqCi0gKiBDbGFzcyB0byBpbml0aWFsaXplIHRoZSBwcmVmZXJlbmNlcyBmb3IgdGhlIFVwZGF0ZSBjb3JlIHBsdWdpbi4KLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZVByZWZlcmVuY2VzSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFVwZGF0ZVByZWZlcmVuY2VzSW5pdGlhbGl6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZXMgc2V0dGluZ3MgZm9yIHRoaXMgcGx1Zy1pbi4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgc29tZXRpbWUgYWZ0ZXIgdGhlIHByZWZlcmVuY2Ugc3RvcmUgZm9yIHRoaXMKLQkgKiBwbHVnLWluIGlzIGNyZWF0ZWQuIERlZmF1bHQgdmFsdWVzIGFyZSBuZXZlciBzdG9yZWQgaW4gcHJlZmVyZW5jZQotCSAqIHN0b3JlczsgdGhleSBtdXN0IGJlIGZpbGxlZCBpbiBlYWNoIHRpbWUuIFRoaXMgbWV0aG9kIHByb3ZpZGVzIHRoZQotCSAqIG9wcG9ydHVuaXR5IHRvIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgdmFsdWVzLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuIEEgc3ViY2xhc3MgdGhhdCBuZWVkcwotCSAqIHRvIHNldCBkZWZhdWx0IHZhbHVlcyBmb3IgaXRzIHByZWZlcmVuY2VzIG11c3QgcmVpbXBsZW1lbnQgdGhpcyBtZXRob2QuCi0JICogRGVmYXVsdCB2YWx1ZXMgc2V0IGF0IGEgbGF0ZXIgcG9pbnQgd2lsbCBvdmVycmlkZSBhbnkgZGVmYXVsdCBvdmVycmlkZQotCSAqIHNldHRpbmdzIHN1cHBsaWVkIGZyb20gb3V0c2lkZSB0aGUgcGx1Zy1pbiAocHJvZHVjdCBjb25maWd1cmF0aW9uIG9yCi0JICogcGxhdGZvcm0gc3RhcnQgdXApLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlQbHVnaW4gcGx1Z2luID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKTsKLQkJcGx1Z2luLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChVcGRhdGVDb3JlLlBfQ0hFQ0tfU0lHTkFUVVJFLCB0cnVlKTsKLQkJcGx1Z2luLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChVcGRhdGVDb3JlLlBfQVVUT01BVElDQUxMWV9DSE9PU0VfTUlSUk9SLCBmYWxzZSk7Ci0JCXBsdWdpbi5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldERlZmF1bHQoVXBkYXRlQ29yZS5QX0hJU1RPUllfU0laRSwgVXBkYXRlQ29yZS5ERUZBVUxUX0hJU1RPUlkpOwotCQlwbHVnaW4uZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KFVwZGF0ZUNvcmUuUF9VUERBVEVfVkVSU0lPTlMsIFVwZGF0ZUNvcmUuRVFVSVZBTEVOVF9WQUxVRSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVTZXNzaW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZVNlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIyY2I2NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZVNlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmFtZXMgRCBNaWxlcyAoSUJNIENvcnAuKSAtIGJ1ZyAxOTE3ODMsIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIEZlYXR1cmVEb3dubG9hZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIFVwZGF0ZVNlc3Npb24gewotCQotCXByaXZhdGUgYm9vbGVhbiBlbmFibGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBTZXQgdmlzaXRlZFVSTHMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRTZXQobmV3IEhhc2hTZXQoKSk7Ci0JCi0JVXBkYXRlU2Vzc2lvbigpIHsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNWaXNpdGVkKFVSTCB1cmwpIHsKLQkJaWYgKCFlbmFibGVkKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdmlzaXRlZFVSTHMuY29udGFpbnModXJsLnRvRXh0ZXJuYWxGb3JtKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1hcmtWaXNpdGVkKFVSTCB1cmwpIHsKLQkJaWYgKCFlbmFibGVkKQotCQkJcmV0dXJuIDsKLQkJdmlzaXRlZFVSTHMuYWRkKHVybC50b0V4dGVybmFsRm9ybSgpKTsKLQl9Ci0JCi0JLyoKLQkgKiBTZXNzaW9uIHdpbGwgbm90IHN0YXJ0IGNhY2hpbmcgVVJMcyBwcmlvciB0byBjYWxsaW5nIHRoaXMKLQkgKiBtZXRob2QuIElmIHlvdSB3YW50IHRvIHVzZSB1cGRhdGUgc2Vzc2lvbiBmYWNpbGl0eSBtYWtlIHN1cmUKLQkgKiB5b3UgY2FsbCB0aGlzIG1ldGhvZCBmaXJzdAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQl0aGlzLmVuYWJsZWQgPSB0cnVlOwotCQl2aXNpdGVkVVJMcy5jbGVhcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVTaXRlRmVhdHVyZVJlZmVyZW5jZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVTaXRlRmVhdHVyZVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTkwNmE1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlU2l0ZUZlYXR1cmVSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi0vKioKLSAqIEZlYXR1cmUgcmVmZXJlbmNlIG9uIGFuIHVwZGF0ZSBzaXRlLgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlU2l0ZUZlYXR1cmVSZWZlcmVuY2UgZXh0ZW5kcyBTaXRlRmVhdHVyZVJlZmVyZW5jZSB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgb3M7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgd3M7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYXJjaDsKLSAgICBwcml2YXRlIFN0cmluZyBwYXRjaDsgIAotCi0gICAgLyoqCi0gICAgICogR2V0IG9wdGlvbmFsIG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gc3RyaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRPUygpIHsKLSAgICAgICAgcmV0dXJuIG9zOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0IG9wdGlvbmFsIHdpbmRvd2luZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSB3aW5kb3dpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gc3RyaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRXUygpIHsKLSAgICAgICAgcmV0dXJuIHdzOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0IG9wdGlvbmFsIHN5c3RlbSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBzeXN0ZW0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gc3RyaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRPU0FyY2goKSB7Ci0gICAgICAgIHJldHVybiBhcmNoOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogR2V0IG9wdGlvbmFsIGxvY2FsZSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGxvY2FsZSBzcGVjaWZpY2F0aW9uIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TkwoKSB7Ci0gICAgICAgIHJldHVybiBubDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24uCi0gICAgICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvcyBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPUyhTdHJpbmcgb3MpIHsKLSAgICAgICAgYXNzZXJ0SXNXcml0ZWFibGUoKTsKLSAgICAgICAgdGhpcy5vcyA9IG9zOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgd2luZG93aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uLgotICAgICAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd3Mgd2luZG93aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QKLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0V1MoU3RyaW5nIHdzKSB7Ci0gICAgICAgIGFzc2VydElzV3JpdGVhYmxlKCk7Ci0gICAgICAgIHRoaXMud3MgPSB3czsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGxvY2FsZSBzcGVjaWZpY2F0aW9uLgotICAgICAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmwgbG9jYWxlIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXROTChTdHJpbmcgbmwpIHsKLSAgICAgICAgYXNzZXJ0SXNXcml0ZWFibGUoKTsKLSAgICAgICAgdGhpcy5ubCA9IG5sOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc3lzdGVtIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uLgotICAgICAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXJjaCBzeXN0ZW0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBcmNoKFN0cmluZyBhcmNoKSB7Ci0gICAgICAgIGFzc2VydElzV3JpdGVhYmxlKCk7Ci0gICAgICAgIHRoaXMuYXJjaCA9IGFyY2g7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGF0Y2ggbW9kZS4KLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXRjaCgpIHsKLSAgICAgICAgcmV0dXJuIHBhdGNoOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcGF0Y2ggbW9kZS4KLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGF0Y2goU3RyaW5nIHBhdGNoKSB7Ci0gICAgICAgIHRoaXMucGF0Y2ggPSBwYXRjaDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlU2l0ZUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVTaXRlSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MmQ3NGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVTaXRlSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLQotLyoqCi0gKiBGZWF0dXJlIHJlZmVyZW5jZSBvbiBhbiB1cGRhdGUgc2l0ZS4KLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZVNpdGVJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgZXh0ZW5kcyBJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2V7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgb3M7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgd3M7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYXJjaDsKLSAgICBwcml2YXRlIFN0cmluZyBwYXRjaDsKLSAKLSBwdWJsaWMgVXBkYXRlU2l0ZUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSgpIHsKLSAgc3VwZXIoKTsKLSB9Ci0KLSAgICBwdWJsaWMgVXBkYXRlU2l0ZUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZShJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlIGluY2x1ZGUpIHsKLSAgc3VwZXIoaW5jbHVkZSk7Ci0gfQotCi0KLSAvKioKLSAgICAgKiBHZXQgb3B0aW9uYWwgb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9TKCkgewotICAgICAgICByZXR1cm4gb3M7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgb3B0aW9uYWwgd2luZG93aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHdpbmRvd2luZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdTKCkgewotICAgICAgICByZXR1cm4gd3M7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgb3B0aW9uYWwgc3lzdGVtIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHN5c3RlbSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9TQXJjaCgpIHsKLSAgICAgICAgcmV0dXJuIGFyY2g7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgb3B0aW9uYWwgbG9jYWxlIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgbG9jYWxlIHNwZWNpZmljYXRpb24gc3RyaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiBAc2luY2UgMy4xCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROTCgpIHsKLSAgICAgICAgcmV0dXJuIG5sOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbi4KLSAgICAgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotICAgICAqCi0gICAgICogQHBhcmFtIG9zIG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0Ci0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE9TKFN0cmluZyBvcykgewotICAgICAgICBhc3NlcnRJc1dyaXRlYWJsZSgpOwotICAgICAgICB0aGlzLm9zID0gb3M7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB3aW5kb3dpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24uCi0gICAgICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB3cyB3aW5kb3dpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdAotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXUyhTdHJpbmcgd3MpIHsKLSAgICAgICAgYXNzZXJ0SXNXcml0ZWFibGUoKTsKLSAgICAgICAgdGhpcy53cyA9IHdzOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbG9jYWxlIHNwZWNpZmljYXRpb24uCi0gICAgICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBubCBsb2NhbGUgc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0Ci0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE5MKFN0cmluZyBubCkgewotICAgICAgICBhc3NlcnRJc1dyaXRlYWJsZSgpOwotICAgICAgICB0aGlzLm5sID0gbmw7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBzeXN0ZW0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uCi0gICAgICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmNoIHN5c3RlbSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0Ci0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFyY2goU3RyaW5nIGFyY2gpIHsKLSAgICAgICAgYXNzZXJ0SXNXcml0ZWFibGUoKTsKLSAgICAgICAgdGhpcy5hcmNoID0gYXJjaDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwYXRjaCBtb2RlLgotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGNoKCkgewotICAgICAgICByZXR1cm4gcGF0Y2g7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwYXRjaCBtb2RlLgotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXRjaChTdHJpbmcgcGF0Y2gpIHsKLSAgICAgICAgdGhpcy5wYXRjaCA9IHBhdGNoOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Wb2x1bWUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVm9sdW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZDY2ZGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Wb2x1bWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklWb2x1bWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuTW9kZWxPYmplY3Q7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBhIElWb2x1bWUKLSAqLwotcHVibGljIGNsYXNzIFZvbHVtZSBleHRlbmRzIE1vZGVsT2JqZWN0IGltcGxlbWVudHMgSVZvbHVtZSB7Ci0KLQlwcml2YXRlIGxvbmcgc2l6ZTsKLQlwcml2YXRlIGludCB0eXBlOwotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCXByaXZhdGUgRmlsZSByb290OwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFZvbHVtZS4KLQkgKi8KLQlwdWJsaWMgVm9sdW1lKEZpbGUgcm9vdCxTdHJpbmcgbGFiZWwsaW50IHR5cGUsbG9uZyBzaXplKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucm9vdCA9IHJvb3Q7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJdGhpcy5zaXplID0gc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElWb2x1bWUjZ2V0RnJlZVNwYWNlKCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRGcmVlU3BhY2UoKSB7Ci0JCXJldHVybiBzaXplOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVZvbHVtZSNnZXRMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVZvbHVtZSNnZXRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVZvbHVtZSNnZXRGaWxlKCkKLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gcm9vdDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYXJnMCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvY29ubmVjdGlvbi9BYnN0cmFjdFJlc3BvbnNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL2Nvbm5lY3Rpb24vQWJzdHJhY3RSZXNwb25zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODJiYjMyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvY29ubmVjdGlvbi9BYnN0cmFjdFJlc3BvbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZUNvcmU7Ci0KLS8qKgotICogQGF1dGhvciBidHJpcGtvdgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVzcG9uc2UgaW1wbGVtZW50cyBJUmVzcG9uc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQT0xMSU5HX0lOVEVSVkFMID0gMjAwOwotCXByb3RlY3RlZCBVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gb3BlblN0cmVhbVdpdGhDYW5jZWwoVVJMQ29ubmVjdGlvbiB1cmxDb25uZWN0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgVG9vTWFueU9wZW5Db25uZWN0aW9uc0V4Y2VwdGlvbiB7Ci0JCi0JCUNvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyLlN0cmVhbVJ1bm5hYmxlIHJ1bm5hYmxlID0KLQkJCW5ldyBDb25uZWN0aW9uVGhyZWFkTWFuYWdlci5TdHJlYW1SdW5uYWJsZSh1cmxDb25uZWN0aW9uKTsKLQkJVGhyZWFkIHQgPSBDb25uZWN0aW9uVGhyZWFkTWFuYWdlckZhY3RvcnkuZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKS5nZXRDb25uZWN0aW9uVGhyZWFkKAotCQkJCXJ1bm5hYmxlKTsKLQkJdC5zdGFydCgpOwotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmb3IgKDs7KSB7Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCXJ1bm5hYmxlLmRpc2Nvbm5lY3QoKTsKLQkgICAgICAgICAgICAgICAgY29ubmVjdGlvbiA9IG51bGw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAocnVubmFibGUuZ2V0SW5wdXRTdHJlYW0oKSAhPSBudWxsIHx8ICF0LmlzQWxpdmUoKSkgewotCQkJCQlpcyA9IHJ1bm5hYmxlLmdldElucHV0U3RyZWFtKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAocnVubmFibGUuZ2V0SU9FeGNlcHRpb24oKSAhPSBudWxsKSAKLQkJCQkJdGhyb3cgcnVubmFibGUuZ2V0SU9FeGNlcHRpb24oKTsKLQkJCQlpZiAocnVubmFibGUuZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgCi0JCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJCQkJCQkJCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAKLQkJCQkJCQkJCQkJCQkJCUlTdGF0dXMuT0ssCi0JCQkJCQkJCQkJCQkJCQlydW5uYWJsZS5nZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCksIAotCQkJCQkJCQkJCQkJCQkJcnVubmFibGUuZ2V0RXhjZXB0aW9uKCkpKTsKLQkJCQl0LmpvaW4oUE9MTElOR19JTlRFUlZBTCk7Ci0JCQkJfQotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIGlzOwotCX0KLQotCQotCQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9jb25uZWN0aW9uL0Nvbm5lY3Rpb25GYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMyZTNlMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotcHVibGljIGNsYXNzIENvbm5lY3Rpb25GYWN0b3J5IHsKLQotCQotCXB1YmxpYyBzdGF0aWMgSVJlc3BvbnNlIGdldChVUkwgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvL1JlcXVlc3QgcmVxdWVzdCA9IG51bGw7Ci0JCUlSZXNwb25zZSByZXNwb25zZSA9IG51bGw7Ci0JCQotCQlpZiAoImZpbGUiLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVzcG9uc2UgPSBuZXcgRmlsZVJlc3BvbnNlKHVybCk7Ci0JCX0gZWxzZSBpZiAodXJsICE9IG51bGwgJiYgdXJsLmdldFByb3RvY29sKCkuc3RhcnRzV2l0aCgiaHR0cCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3BvbnNlID0gbmV3IEh0dHBSZXNwb25zZSh1cmwpOwotCQl9IGVsc2UgewotCQkJcmVzcG9uc2UgPSBuZXcgT3RoZXJSZXNwb25zZSh1cmwpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3BvbnNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvY29ubmVjdGlvbi9Db25uZWN0aW9uVGhyZWFkTWFuYWdlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9jb25uZWN0aW9uL0Nvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NDdjYWMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9jb25uZWN0aW9uL0Nvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLmNvbm5lY3Rpb247Ci0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVDb3JlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyB0aHJlYWRzIHRoYXQgYXJlIGRpc3BhdGNoZWQgdG8gCi0gKiBvYnRhaW5lZCBhIHZhbGlkIGlucHV0IHN0cmVhbSBmcm9tIGFuIEhUVFAgY29ubmVjdGlvbi4KLSAqIFNpbmNlIG9idGFpbmluZyBhbiBpbnB1dCBzdHJlYW0gaXMgYW4gSS9PIG9wZXJhdGlvbgotICogdGhhdCBtYXkgYmxvY2sgZm9yIGEgbG9uZyB0aW1lLCBpdCBpcyBwZXJmb3JtZWQKLSAqIG9uIGEgc2VwYXJhdGUgdGhyZWFkIHRvIGtlZXAgdGhlIFVJIHJlc3BvbnNpdmUuCi0gKiA8cD4KLSAqIEluIGNhc2UgdGhhdCBhIGNvbm5lY3Rpb24gYmxvY2tzIGFuZCBkb2VzIG5vdAotICogdGVybWluYXRlIHdpdGggYW4gSU9FeGNlcHRpb24gYWZ0ZXIgYSB0aW1lb3V0LCAKLSAqIGFjdGl2ZSB0aHJlYWRzIG1heSBhY2N1bXVsYXRlLiBUaGUgbWFuYWdlciB3aWxsCi0gKiByZWZ1c2UgdG8gY3JlYXRlIG1vcmUgdGhhbiBNQVhfQ09VTlQgdGhyZWFkcyBhbmQKLSAqIGluc3RlYWQgd2lsbCB0aHJvdyBhIENvcmVFeGNlcHRpb24gd2l0aCBhIGNoaWxkCi0gKiBzdGF0dXMgb2JqZWN0IGZvciBlYWNoIGNvbm5lY3Rpb24gdGhhdCBpcyBzdGlsbCBwZW5kaW5nLgotICogPHA+Ci0gKiBJZiB0aGUgY29ubmVjdGlvbiBpcyByZXNwb25zaXZlIGJ1dCBzbG93LCB0aGUgdXNlcgotICogbWF5IGNhbmNlbCBpdC4gSW4gdGhhdCBjYXNlLCB0aGUgbWFuYWdlciB3aWxsCi0gKiBjbG9zZSB0aGUgc3RyZWFtIHRvIGF2b2lkIHJlc291cmNlIGxlYWsuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0aW9uVGhyZWFkTWFuYWdlciB7Ci0JCi0JLy8gc2V0IGNvbm5lY3Rpb24gdGltZW91dCB0byAxIG1pbnV0ZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUX1RJTUVPVVQgPSAiNjAwMDAiOyAvLyROT04tTkxTLTEkCi0JLy8gc2V0IHJlYWQgdGltZW91dCB0byAxIG1pbnV0ZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX1RJTUVPVVQgPSAiNjAwMDAiOyAvLyROT04tTkxTLTEkCi0JLy8gbWF4IG51bWJlciBvZiBhY3RpdmUgdGhyZWFkcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQ09VTlQgPSA5OwotCXByaXZhdGUgTGlzdCB0aHJlYWRzID0gbmV3IEFycmF5TGlzdChNQVhfQ09VTlQpOwotCQotCQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTdHJlYW1SdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJCi0JCXByaXZhdGUgVVJMQ29ubmVjdGlvbiB1cmxDb25uZWN0aW9uOwotCQlwcml2YXRlIElPRXhjZXB0aW9uIGlvRXhjZXB0aW9uOwotCQlwcml2YXRlIEV4Y2VwdGlvbiBleGNlcHRpb247Ci0JCXByaXZhdGUgSW5wdXRTdHJlYW0gaXM7Ci0JCXByaXZhdGUgYm9vbGVhbiBkaXNjb25uZWN0ZWQ7Ci0KLQkJcHVibGljIFN0cmVhbVJ1bm5hYmxlKFVSTENvbm5lY3Rpb24gdXJsQ29ubmVjdGlvbikgewotCQkJdGhpcy51cmxDb25uZWN0aW9uID0gdXJsQ29ubmVjdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKLQkJCXJldHVybiBpczsKLQkJfQotCi0JCXB1YmxpYyBVUkwgZ2V0VVJMKCkgewotCQkJcmV0dXJuIHVybENvbm5lY3Rpb24uZ2V0VVJMKCk7Ci0JCX0KLQotCQlwdWJsaWMgSU9FeGNlcHRpb24gZ2V0SU9FeGNlcHRpb24oKSB7Ci0JCQlyZXR1cm4gaW9FeGNlcHRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBFeGNlcHRpb24gZ2V0RXhjZXB0aW9uKCkgewotCQkJcmV0dXJuIGV4Y2VwdGlvbjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB7Ci0JCQlpZiAodXJsQ29ubmVjdGlvbiBpbnN0YW5jZW9mIEh0dHBVUkxDb25uZWN0aW9uKQotCQkJCSgoSHR0cFVSTENvbm5lY3Rpb24pdXJsQ29ubmVjdGlvbikuZGlzY29ubmVjdCgpOwotCQkJZGlzY29ubmVjdGVkID0gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJaXMgPSB1cmxDb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7Ci0JCQkJaWYgKGRpc2Nvbm5lY3RlZCkgewotCQkJCQkvLyBUaGUgY29ubmVjdGlvbiB3YXMgc2xvdywgYnV0IHJldHVybmVkCi0JCQkJCS8vIGEgdmFsaWQgaW5wdXQgc3RyZWFtLiBIb3dldmVyLAotCQkJCQkvLyB0aGUgdXNlciBjYW5jZWxlZCB0aGUgY29ubmVjdGlvbgotCQkJCQkvLyBzbyB3ZSBtdXN0IGNsb3NlIHRvIGF2b2lkIAotCQkJCQkvLyByZXNvdXJjZSBsZWFrLgotCQkJCQlpZiAoaXMgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpcy5jbG9zZSgpOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkvLyBhdCB0aGlzIHBvaW50LCB3ZSBkb24ndCBjYXJlCi0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCWlzID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlpb0V4Y2VwdGlvbiA9IGU7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCQl9IGZpbmFsbHkgewotCQkJCS8vdGhyZWFkcy4KLQkJCX0KLQkJfQotCX0KLQotCQotCWNsYXNzIENvbm5lY3Rpb25UaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotCQkKLQkJcHJpdmF0ZSBTdHJlYW1SdW5uYWJsZSBydW5uYWJsZTsKLQkJCi0JCXB1YmxpYyBDb25uZWN0aW9uVGhyZWFkKFN0cmVhbVJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCQlzdXBlcihydW5uYWJsZSwgInVwZGF0ZS1jb25uZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMucnVubmFibGUgPSBydW5uYWJsZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJlYW1SdW5uYWJsZSBnZXRSdW5uYWJsZSgpIHsKLQkJCXJldHVybiBydW5uYWJsZTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uVGhyZWFkTWFuYWdlcigpIHsKLQkJLy8gSW4gY2FzZSB3ZSBhcmUgcnVubmluZyBTdW4ncyBjb2RlLgotCQlzZXRJZk5vdERlZmF1bHRQcm9wZXJ0eSgic3VuLm5ldC5jbGllbnQuZGVmYXVsdENvbm5lY3RUaW1lb3V0IiwgQ09OTkVDVF9USU1FT1VUKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJZk5vdERlZmF1bHRQcm9wZXJ0eSgic3VuLm5ldC5jbGllbnQuZGVmYXVsdFJlYWRUaW1lb3V0IiwgUkVBRF9USU1FT1VUKTsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldElmTm90RGVmYXVsdFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoa2V5KTsKLQkJaWYgKG9sZFZhbHVlPT1udWxsIHx8IG9sZFZhbHVlLmVxdWFscygiLTEiKSkgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBUaHJlYWQgZ2V0Q29ubmVjdGlvblRocmVhZChTdHJlYW1SdW5uYWJsZSBydW5uYWJsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJdmFsaWRhdGVFeGlzdGluZ1RocmVhZHMoKTsKLQkKLQkJLy9pZiAodGhyZWFkcyA9PSBudWxsKQotCQkvLwl0aHJlYWRzID0gbmV3IFZlY3RvcigpOwotCQlUaHJlYWQgdCA9IG5ldyBUaHJlYWQocnVubmFibGUpOwotCQl0LnNldERhZW1vbih0cnVlKTsKLQkJdGhyZWFkcy5hZGQodCk7Ci0JCXJldHVybiB0OwotCX0KLQotCS8qCi0JICogUmVtb3ZlcyB0aHJlYWRzIHRoYXQgYXJlIG5vdCBhbGl2ZSBhbnkgbW9yZSBmcm9tIHRoZSAKLQkgKiBsaXN0IGFuZCBlbnN1cmVzIHRoYXQgdGhlcmUgYXJlIGF0IG1vc3QgTUFYX0NPVU5UIHRocmVhZHMKLQkgKiBzdGlsbCB3b3JraW5nLgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUV4aXN0aW5nVGhyZWFkcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCWlmICgodGhyZWFkcyA9PSBudWxsKSB8fCAodGhyZWFkcy5zaXplKCkgPT0gMCkpCi0JCQlyZXR1cm47Ci0JCQotCQlpbnQgYWxpdmVDb3VudCA9IHB1cmdlVGVybWluYXRlZFRocmVhZHMoKTsKLQotCQlpZiAoYWxpdmVDb3VudCA+IE1BWF9DT1VOVCkgewotCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJU3RyaW5nIHBsdWdpbklkID0KLQkJCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQ29ubmVjdGlvblRocmVhZCB0ID0gKENvbm5lY3Rpb25UaHJlYWQpIHRocmVhZHMuZ2V0KGkpOwotCQkJCVN0cmluZyB1cmwgPSB0LmdldFJ1bm5hYmxlKCkuZ2V0VVJMKCkudG9TdHJpbmcoKTsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9Ci0JCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJcGx1Z2luSWQsCi0JCQkJCQlJU3RhdHVzLk9LLAotCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuQ29ubmVjdGlvblRocmVhZE1hbmFnZXJfdW5yZXNwb25zaXZlVVJMLCAobmV3IFN0cmluZ1tdIHsgdXJsIH0pKSwKLQkJCQkJCW51bGwpOwotCQkJCWNoaWxkcmVuLmFkZChzdGF0dXMpOwotCQkJfQotCQkJTXVsdGlTdGF0dXMgcGFyZW50U3RhdHVzID0KLQkJCQluZXcgTXVsdGlTdGF0dXMoCi0JCQkJCXBsdWdpbklkLAotCQkJCQlJU3RhdHVzLk9LLAotCQkJCQkoSVN0YXR1c1tdKSBjaGlsZHJlbi50b0FycmF5KG5ldyBJU3RhdHVzW2NoaWxkcmVuLnNpemUoKV0pLAotCQkJCQlNZXNzYWdlcy5Db25uZWN0aW9uVGhyZWFkTWFuYWdlcl90b29NYW55Q29ubmVjdGlvbnMsIAotCQkJCQludWxsKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHBhcmVudFN0YXR1cyk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBSZW1vdmVzIHRlcm1pbmF0ZWQgdGhyZWFkcyBmcm9tIHRoZSBsaXN0IGFuZCByZXR1cm5zCi0JICogdGhlIG51bWJlciBvZiB0aG9zZSBzdGlsbCBhY3RpdmUuCi0JICovCi0JCi0JcHJpdmF0ZSBpbnQgcHVyZ2VUZXJtaW5hdGVkVGhyZWFkcygpIHsKLQkJCi0JCWlmICh0aHJlYWRzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQkKLQkJaW50IGFsaXZlQ291bnQgPSAwOwotCi0JCU9iamVjdFtdIGFycmF5ID0gdGhyZWFkcy50b0FycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCVRocmVhZCB0ID0gKFRocmVhZCkgYXJyYXlbaV07Ci0JCQlpZiAoIXQuaXNBbGl2ZSgpKQotCQkJCXRocmVhZHMucmVtb3ZlKHQpOwotCQkJZWxzZQotCQkJCWFsaXZlQ291bnQrKzsKLQkJfQotCQlyZXR1cm4gYWxpdmVDb3VudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKLQkJLy8gV2UgbWlnaHQgd2FudCB0byBraWxsIHRoZSBhY3RpdmUgdGhyZWFkcyBidXQKLQkJLy8gdGhpcyBpcyBub3QgcmVhbGx5IG5lY2Vzc2FyeSBzaW5jZSB0aGV5IGFyZSBhbGwKLQkJLy8gZGFlbW9ucyBhbmQgd2lsbCBub3QgcHJldmVudCBKVk0gdG8gdGVybWluYXRlLgotCQl0aHJlYWRzLmNsZWFyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9jb25uZWN0aW9uL0Nvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9jb25uZWN0aW9uL0Nvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjU3ZWFkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvY29ubmVjdGlvbi9Db25uZWN0aW9uVGhyZWFkTWFuYWdlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLmNvbm5lY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0aW9uVGhyZWFkTWFuYWdlckZhY3RvcnkgewotCi0JCi0JLy9Db25uZWN0aW9uIG1hbmFnZXIKLQlwcml2YXRlIHN0YXRpYyBDb25uZWN0aW9uVGhyZWFkTWFuYWdlciBjb25uZWN0aW9uTWFuYWdlcjsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtYW5hZ2VyIHRoYXQgbWFuYWdlcyBVUkwgY29ubmVjdGlvbiB0aHJlYWRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29ubmVjdGlvblRocmVhZE1hbmFnZXIgZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKSB7Ci0JCQotCQlpZiAoY29ubmVjdGlvbk1hbmFnZXIgPT0gbnVsbCkKLQkJCWNvbm5lY3Rpb25NYW5hZ2VyID0gbmV3IENvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyKCk7Ci0JCXJldHVybiBjb25uZWN0aW9uTWFuYWdlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL2Nvbm5lY3Rpb24vRmlsZVJlc3BvbnNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL2Nvbm5lY3Rpb24vRmlsZVJlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYWNkODYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9jb25uZWN0aW9uL0ZpbGVSZXNwb25zZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLmNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlQ29yZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLXB1YmxpYyBjbGFzcyBGaWxlUmVzcG9uc2UgaW1wbGVtZW50cyBJUmVzcG9uc2UgewotCi0JcHJvdGVjdGVkIFVSTCB1cmw7Ci0JcHJvdGVjdGVkIGxvbmcgbGFzdE1vZGlmaWVkOwotCi0JcHJvdGVjdGVkIEZpbGVSZXNwb25zZShVUkwgdXJsKSB7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB1cmwub3BlblN0cmVhbSgpOwotCX0KLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRJbnB1dFN0cmVhbSgpOwotCX0KLQotCXB1YmxpYyBsb25nIGdldENvbnRlbnRMZW5ndGgoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhdHVzQ29kZSgpIHsKLQkJcmV0dXJuIFVwZGF0ZUNvcmUuSFRUUF9PSzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gY2xvc2UKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXR1c01lc3NhZ2UoKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZCgpIHsKLQkJaWYgKGxhc3RNb2RpZmllZCA9PSAwKSB7Ci0JCQlGaWxlIGYgPSBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKTsKLQkJCWlmIChmLmlzRGlyZWN0b3J5KCkpCi0JCQkJZiA9IG5ldyBGaWxlKGYsICJzaXRlLnhtbCIpOyAvLyROT04tTkxTLTEkCi0JCQlsYXN0TW9kaWZpZWQgPSBmLmxhc3RNb2RpZmllZCgpOwotCQl9Ci0JCXJldHVybiBsYXN0TW9kaWZpZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9jb25uZWN0aW9uL0h0dHBSZXNwb25zZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9jb25uZWN0aW9uL0h0dHBSZXNwb25zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2NmYTNhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvY29ubmVjdGlvbi9IdHRwUmVzcG9uc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuY29ubmVjdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlQ29yZTsKLQotcHVibGljIGNsYXNzIEh0dHBSZXNwb25zZSBleHRlbmRzIEFic3RyYWN0UmVzcG9uc2UgewotCS8qKgotCSAqIE1vbml0b3JlZCBJbnB1dFN0cmVhbS4gIFVwb24gSU9FeGNlcHRpb24sIGRpc2NhcmRzCi0JICogY29ubmVjdGlvbiBzbyBpdCBpcyBub3QgcmV1c2VkLgotCSAqCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBNb25pdG9yaW5nSW5wdXRTdHJlYW0gZXh0ZW5kcyBGaWx0ZXJJbnB1dFN0cmVhbSB7Ci0JCXByaXZhdGUgVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uOwotCi0JCXB1YmxpYyBNb25pdG9yaW5nSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotCQkJc3VwZXIoaW4pOwotCQkJdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGluIT1udWxsP3N1cGVyLmF2YWlsYWJsZSgpOjA7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQljb25uZWN0aW9uID0gbnVsbDsKLQkJCQl0aHJvdyBpb2U7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl0cnkgewotCQkJCWlmIChpbiE9bnVsbCkKLQkJCQkJc3VwZXIuY2xvc2UoKTsKLQkJCQlpZiAoY29ubmVjdGlvbiBpbnN0YW5jZW9mIEh0dHBVUkxDb25uZWN0aW9uKSB7Ci0JCQkJCSgoSHR0cFVSTENvbm5lY3Rpb24pY29ubmVjdGlvbikuZGlzY29ubmVjdCgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCWNvbm5lY3Rpb24gPSBudWxsOwotCQkJCXRocm93IGlvZTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBpbiE9bnVsbD9zdXBlci5yZWFkKCk6LTE7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQljb25uZWN0aW9uID0gbnVsbDsKLQkJCQl0aHJvdyBpb2U7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJdHJ5IHsKLQkJCQlpZiAoaW4hPW51bGwpCi0JCQkJCXN1cGVyLnJlc2V0KCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQljb25uZWN0aW9uID0gbnVsbDsKLQkJCQl0aHJvdyBpb2U7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBpbiE9bnVsbD9zdXBlci5yZWFkKGIpOi0xOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJY29ubmVjdGlvbiA9IG51bGw7Ci0JCQkJdGhyb3cgaW9lOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gaW4hPW51bGw/c3VwZXIucmVhZChiLCBvZmYsIGxlbik6LTE7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQljb25uZWN0aW9uID0gbnVsbDsKLQkJCQl0aHJvdyBpb2U7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGluIT1udWxsP3N1cGVyLnNraXAobik6MDsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCWNvbm5lY3Rpb24gPSBudWxsOwotCQkJCXRocm93IGlvZTsKLQkJCX0KLQkJfQotCi0JfQotCQotCXByb3RlY3RlZCBVUkwgdXJsOwotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBpbjsKLQlwcm90ZWN0ZWQgbG9uZyBsYXN0TW9kaWZpZWQ7Ci0JcHJvdGVjdGVkIGxvbmcgb2Zmc2V0OwotCi0JcHJvdGVjdGVkIEh0dHBSZXNwb25zZShVUkwgdXJsKSB7Ci0JCQotICAgICAgICB0aGlzLnVybCA9IHVybDsKLQl9Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaW4gPT0gbnVsbCAmJiB1cmwgIT0gbnVsbCkgewotCQkJaWYgKGNvbm5lY3Rpb24gPT0gbnVsbCB8fCBvZmZzZXQgPiAwKQotCQkJCWNvbm5lY3Rpb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJCWlmIChvZmZzZXQgPiAwKQotCQkJCWNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJSYW5nZSIsICJieXRlcz0iICsgb2Zmc2V0ICsgIi0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCXRyeSB7Ci0JCQkJaW4gPSBuZXcgTW9uaXRvcmluZ0lucHV0U3RyZWFtKGNvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKSwgY29ubmVjdGlvbik7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQljb25uZWN0aW9uID0gbnVsbDsKLQkJCQl0aHJvdyBpb2U7Ci0JCQl9Ci0JCQljaGVja09mZnNldCgpOwotCQl9Ci0JCXJldHVybiBpbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAgIGlmKCBudWxsICE9IGluICkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLSAgICAgICAgICAgICAgICBpbiA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbm5lY3Rpb24hPW51bGwpIHsKLSAgICAgICAgCSgoSHR0cFVSTENvbm5lY3Rpb24pY29ubmVjdGlvbikuZGlzY29ubmVjdCgpOwotICAgICAgICAJY29ubmVjdGlvbiA9IG51bGw7Ci0gICAgICAgIH0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJUmVzcG9uc2UjZ2V0SW5wdXRTdHJlYW0oSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIFRvb01hbnlPcGVuQ29ubmVjdGlvbnNFeGNlcHRpb24gewotCQlpZiAoaW4gPT0gbnVsbCAmJiB1cmwgIT0gbnVsbCkgewotCQkJaWYgKGNvbm5lY3Rpb24gPT0gbnVsbCB8fCBvZmZzZXQgPiAwKQotCQkJCWNvbm5lY3Rpb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJCWlmIChvZmZzZXQgPiAwKQotCQkJCWNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJSYW5nZSIsICJieXRlcz0iICsgb2Zmc2V0ICsgIi0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXRoaXMuaW4gPSBuZXcgTW9uaXRvcmluZ0lucHV0U3RyZWFtKG9wZW5TdHJlYW1XaXRoQ2FuY2VsKAotCQkJCQkJCWNvbm5lY3Rpb24sIG1vbml0b3IpLCBjb25uZWN0aW9uKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQkJY29ubmVjdGlvbiA9IG51bGw7Ci0JCQkJCXRocm93IGlvZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXRyeSB7Ci0JCQkJCXRoaXMuaW4gPSBuZXcgTW9uaXRvcmluZ0lucHV0U3RyZWFtKGNvbm5lY3Rpb24KLQkJCQkJCQkuZ2V0SW5wdXRTdHJlYW0oKSwgY29ubmVjdGlvbik7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJCWNvbm5lY3Rpb24gPSBudWxsOwotCQkJCQl0aHJvdyBpb2U7Ci0JCQkJfQotCQkJfQotCQkJLy8gdGhpcyBjYW4gYWxzbyBiZSBydW4gaW5zaWRlIGEgbW9uaXRvcmluZyB0aHJlYWQsIGJ1dCBpdCBpcyBzYWZlCi0JCQkvLyB0bwotCQkJLy8ganVzdCBjYWxsIGl0IG5vdywgaWYgdGhlIGlucHV0IHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIG9idGFpbmVkCi0JCQljaGVja09mZnNldCgpOwotCQkJaWYgKGNvbm5lY3Rpb24gIT0gbnVsbCkgewotCQkJCXRoaXMubGFzdE1vZGlmaWVkID0gY29ubmVjdGlvbi5nZXRMYXN0TW9kaWZpZWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW47Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0Q29udGVudExlbmd0aCgpIHsKLQkJaWYgKGNvbm5lY3Rpb24gIT0gbnVsbCkKLQkJCXJldHVybiBjb25uZWN0aW9uLmdldENvbnRlbnRMZW5ndGgoKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGF0dXNDb2RlKCkgewotCQlpZiAoY29ubmVjdGlvbiA9PSBudWxsKQotCQkJdHJ5IHsKLQkJCQljb25uZWN0aW9uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCWlmIChjb25uZWN0aW9uICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuICgoSHR0cFVSTENvbm5lY3Rpb24pIGNvbm5lY3Rpb24pLmdldFJlc3BvbnNlQ29kZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gVXBkYXRlQ29yZS5IVFRQX09LOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzTWVzc2FnZSgpIHsKLQkJaWYgKGNvbm5lY3Rpb24gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKChIdHRwVVJMQ29ubmVjdGlvbikgY29ubmVjdGlvbikuZ2V0UmVzcG9uc2VNZXNzYWdlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJVXBkYXRlQ29yZS53YXJuKCIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZCgpIHsKLQkJaWYgKGxhc3RNb2RpZmllZCA9PSAwKSB7Ci0JCQlpZiAoY29ubmVjdGlvbiA9PSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCWNvbm5lY3Rpb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJaWYgKGNvbm5lY3Rpb24gIT0gbnVsbCkKLQkJCQlsYXN0TW9kaWZpZWQgPSBjb25uZWN0aW9uLmdldExhc3RNb2RpZmllZCgpOwotCQl9Ci0JCXJldHVybiBsYXN0TW9kaWZpZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2Zmc2V0KGxvbmcgb2Zmc2V0KSB7Ci0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQlwcml2YXRlIHZvaWQgY2hlY2tPZmZzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAob2Zmc2V0ID09IDApCi0JCQlyZXR1cm47Ci0JCVN0cmluZyByYW5nZSA9IGNvbm5lY3Rpb24uZ2V0SGVhZGVyRmllbGQoIkNvbnRlbnQtUmFuZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiQ29udGVudC1SYW5nZT0iICsgcmFuZ2UpOwotCQlpZiAocmFuZ2UgPT0gbnVsbCkgewotCQkJLy9TeXN0ZW0uZXJyLnByaW50bG4oIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHJhbmdlcyIpOwotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLkh0dHBSZXNwb25zZV9yYW5nZUV4cGVjdGVkKTsgCi0JCX0gZWxzZSBpZiAoIXJhbmdlLnN0YXJ0c1dpdGgoImJ5dGVzICIgKyBvZmZzZXQgKyAiLSIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJLy9TeXN0ZW0uZXJyLnByaW50bG4oIlNlcnZlciByZXR1cm5lZCB3cm9uZyByYW5nZSIpOwotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLkh0dHBSZXNwb25zZV93cm9uZ1JhbmdlKTsgCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL2Nvbm5lY3Rpb24vSVJlc3BvbnNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL2Nvbm5lY3Rpb24vSVJlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzN2I4MTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9jb25uZWN0aW9uL0lSZXNwb25zZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotcHVibGljIGludGVyZmFjZSBJUmVzcG9uc2UgewotCi0JLyoqCi0JICogTWV0aG9kIGdldElucHV0U3RyZWFtLgotCSAqIAotCSAqIEByZXR1cm4gSW5wdXRTdHJlYW0KLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBBIHNwZWNpYWwgdmVyc2lvbiBvZiAnZ2V0SW5wdXRTdHJlYW0nIHRoYXQgY2FuIGJlIGNhbmNlbGVkLgotCSAqIEEgbW9uaXRvciB0aHJlYWQgY2hlY2tzIHRoZSBzdGF0ZSBvZiB0aGUgbW9uaXRvcgotCSAqIGFuZCBkaXNjb25uZWN0cyB0aGUgY29ubmVjdGlvbiBpZiAnaXNDYW5jZWxlZCgpJyBpcyBkZXRlY3RlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgdGhlIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAcmV0dXJuIElucHV0U3RyZWFtIGFuIG9wZW5lZCBzdHJlYW0gb3IgbnVsbCBpZiBmYWlsZWQuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZXJlIGFyZSBwcm9ibGVtcwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIG5vIG1vcmUgY29ubmVjdGlvbiB0aHJlYWRzIGFyZSBhdmFpbGFibGUKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIFRvb01hbnlPcGVuQ29ubmVjdGlvbnNFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0Q29udGVudExlbmd0aC4KLQkgKiAKLQkgKiBAcmV0dXJuIGxvbmcKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRDb250ZW50TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0U3RhdHVzQ29kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhdHVzQ29kZSgpOwotCi0JLyoqCi0JICogTWV0aG9kIGdldFN0YXR1c01lc3NhZ2UuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXR1c01lc3NhZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRpbWVzdGFtcCBvZiBsYXN0IG1vZGlmaWNhdGlvbiB0byB0aGUgcmVzb3VyY2UKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCk7Ci0JCi0JLyoqCi0JICogQ2xvc2UgdGhlIGNvbm5lY3Rpb24gaWYgb3Blbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9jb25uZWN0aW9uL090aGVyUmVzcG9uc2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvY29ubmVjdGlvbi9PdGhlclJlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOWQ4MmUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9jb25uZWN0aW9uL090aGVyUmVzcG9uc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlQ29yZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotcHVibGljIGNsYXNzIE90aGVyUmVzcG9uc2UgZXh0ZW5kcyBBYnN0cmFjdFJlc3BvbnNlIHsKLQotCXByb3RlY3RlZCBVUkwgdXJsOwotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBpbjsKLQlwcm90ZWN0ZWQgbG9uZyBsYXN0TW9kaWZpZWQ7Ci0KLQlwcm90ZWN0ZWQgT3RoZXJSZXNwb25zZShVUkwgdXJsKSB7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpbiA9PSBudWxsICYmIHVybCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY29ubmVjdGlvbiA9PSBudWxsKQotICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJCWluID0gY29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpOwotCQkJdGhpcy5sYXN0TW9kaWZpZWQgPSBjb25uZWN0aW9uLmdldExhc3RNb2RpZmllZCgpOwotCQl9Ci0JCXJldHVybiBpbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAgIGlmKCBudWxsICE9IGluICkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLSAgICAgICAgICAgICAgICBpbiA9IG51bGw7Ci0gICAgICAgIH0KLQl9CQotCQotCS8qKgotCSAqIEBzZWUgSVJlc3BvbnNlI2dldElucHV0U3RyZWFtKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGluID09IG51bGwgJiYgdXJsICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjb25uZWN0aW9uID09IG51bGwpCi0gICAgICAgICAgICAgICAgY29ubmVjdGlvbiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotCi0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJdGhpcy5pbiA9Ci0JCQkJCW9wZW5TdHJlYW1XaXRoQ2FuY2VsKGNvbm5lY3Rpb24sIG1vbml0b3IpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmluID0gY29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpOwotCQkJfQotCQkJaWYgKGluICE9IG51bGwpIHsKLQkJCQl0aGlzLmxhc3RNb2RpZmllZCA9IGNvbm5lY3Rpb24uZ2V0TGFzdE1vZGlmaWVkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluOwotCX0KLQotCXB1YmxpYyBsb25nIGdldENvbnRlbnRMZW5ndGgoKSB7Ci0JCWlmIChjb25uZWN0aW9uICE9IG51bGwpCi0JCQlyZXR1cm4gY29ubmVjdGlvbi5nZXRDb250ZW50TGVuZ3RoKCk7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhdHVzQ29kZSgpIHsKLQkJcmV0dXJuIFVwZGF0ZUNvcmUuSFRUUF9PSzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXR1c01lc3NhZ2UoKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZCgpIHsKLQkJaWYgKGxhc3RNb2RpZmllZCA9PSAwICYmIGNvbm5lY3Rpb24gIT0gbnVsbCkgewotCQkJbGFzdE1vZGlmaWVkID0gY29ubmVjdGlvbi5nZXRMYXN0TW9kaWZpZWQoKTsKLQkJfQotCQlyZXR1cm4gbGFzdE1vZGlmaWVkOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9jb25uZWN0aW9uL1Rvb01hbnlPcGVuQ29ubmVjdGlvbnNFeGNlcHRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvY29ubmVjdGlvbi9Ub29NYW55T3BlbkNvbm5lY3Rpb25zRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4Zjg0NmUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9jb25uZWN0aW9uL1Rvb01hbnlPcGVuQ29ubmVjdGlvbnNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotCi1wdWJsaWMgY2xhc3MgVG9vTWFueU9wZW5Db25uZWN0aW9uc0V4Y2VwdGlvbiBleHRlbmRzIENvcmVFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCi0JcHVibGljIFRvb01hbnlPcGVuQ29ubmVjdGlvbnNFeGNlcHRpb24oSVN0YXR1cyBzdGF0dXMpIHsKLQkJc3VwZXIoc3RhdHVzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MDIwY2IuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgSW5zdGFsbCBVcGRhdGUgQ29yZSBQcm9wZXJ0aWVzIEZpbGUKLSMKLQotUHJvZHVjdFByb3ZpZGVyPVVwZGF0ZSBNYW5hZ2VyCi1CYXNlU2l0ZUZhY3RvcnlfQ2Fubm90UmV0cml2ZVBhcmVudERpcmVjdG9yeT1VbmFibGUgdG8gcmV0cmlldmUgcGFyZW50IGRpcmVjdG9yeSBmb3IgVVJMIFwiezB9XCIuCi1Db250ZW50UmVmZXJlbmNlX1VuYWJsZVRvQ3JlYXRlSW5wdXRTdHJlYW09IFVuYWJsZSB0byBjcmVhdGUgYW4gaW5wdXQgc3RyZWFtIGZvciB0aGUgcmVmZXJlbmNlIFwiezB9XCIuCi1Db250ZW50UmVmZXJlbmNlX1VuYWJsZVRvUmV0dXJuUmVmZXJlbmNlQXNGaWxlPSBVbmFibGUgdG8gcmV0dXJuIHJlZmVyZW5jZSBcInswfVwiIGFzIEZpbGUuCi1Db250ZW50UmVmZXJlbmNlX1VuYWJsZVRvUmV0dXJuUmVmZXJlbmNlQXNVUkw9IFVuYWJsZSB0byByZXR1cm4gcmVmZXJlbmNlIFwiezB9XCIgYXMgVVJMLgotQ29udGVudFJlZmVyZW5jZV9IdHRwTm9rPSBTZXJ2ZXIgcmV0dXJuZWQgSFRUUCByZXNwb25zZSBjb2RlOiBcInswfSB7MX1cIiBmb3IgVVJMOiB7Mn0uCi1Db250ZW50UmVmZXJlbmNlX0ZpbGVEb2VzTm90RXhpc3Q9VGhlIGZpbGUgXCJ7MH1cIiBkb2VzIG5vdCBleGlzdCBvbiB0aGUgZmlsZSBzeXN0ZW0uCi1GZWF0dXJlX1NpdGVBbHJlYWR5U2V0PSBJbnRlcm5hbCBFcnJvcjogU2l0ZSBhbHJlYWR5IHNldCBmb3IgdGhlIGZlYXR1cmUgXCJ7MH1cIi4KLUZlYXR1cmVfVGFza0luc3RhbGxGZWF0dXJlRmlsZXM9IEluc3RhbGxpbmcgZmVhdHVyZSBmaWxlczoKLUZlYXR1cmVfVGFza0luc3RhbGxQbHVnaW5GaWxlcz0gSW5zdGFsbGluZyBwbHVnLWluIFwiezB9XCIgZmlsZXM6Ci1GZWF0dXJlX05vQ29udGVudFByb3ZpZGVyPSBJbnRlcm5hbCBFcnJvci4gVGhlIGZlYXR1cmUgXCJ7MH1cIiBkb2VzIG5vdCBoYXZlIGEgY29udGVudCBwcm92aWRlci4KLUZlYXR1cmVfTm9GZWF0dXJlQ29udGVudENvbnN1bWVyPSBJbnRlcm5hbCBFcnJvci4gVGhlIEZlYXR1cmUgXCJ7MH1cIiBkb2VzIG5vdCBoYXZlIGEgY29udGVudCBjb25zdW1lci4KLUZlYXR1cmVfTm9VUkw9IFVua25vd24gVVJMLgotRmVhdHVyZV9GZWF0dXJlVmVyc2lvblRvU3RyaW5nPSBGZWF0dXJlOiBcInswfVwiIFZlcnNpb246IFwiezF9XCIuCi1GZWF0dXJlX0luc3RhbGxhdGlvbkNhbmNlbGxlZD0gSW5zdGFsbGF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZCBieSB0aGUgVXNlci4KLUZlYXR1cmVfVW5hYmxlVG9Jbml0aWFsaXplRmVhdHVyZVJlZmVyZW5jZT0gVW5hYmxlIHRvIGluaXRpYWxpemUgZmVhdHVyZSByZWZlcmVuY2UgZm9yIHZlcnNpb25lZCBpZGVudGlmaWVyIFwiezB9XCIuCi1GZWF0dXJlQ29udGVudFByb3ZpZGVyX0Rvd25sb2FkaW5nPSBEb3dubG9hZGluZzoKLUZlYXR1cmVDb250ZW50UHJvdmlkZXJfVW5hYmxlVG9SZXRyaWV2ZT0gVW5hYmxlIHRvIHJldHJpZXZlIHJlbW90ZSByZWZlcmVuY2UgXCJ7MH1cIi4KLUZlYXR1cmVDb250ZW50UHJvdmlkZXJfVW5hYmxlVG9DcmVhdGU9IFVuYWJsZSB0byBjcmVhdGUgbG9jYWwgZmlsZSBcInswfVwiLgotRmVhdHVyZUNvbnRlbnRQcm92aWRlcl9FeGNlcHRpb25Eb3dubG9hZGluZyA9IEFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBkb3dubG9hZGluZyBmZWF0dXJlIGZyb20gXCJ7MH1cIi4KLUluc3RhbGxIYW5kbGVyX3VuYWJsZVRvQ3JlYXRlSGFuZGxlciA9IFVuYWJsZSB0byBjcmVhdGUgY3VzdG9tIGluc3RhbGwgaGFuZGxlciBmb3IgZmVhdHVyZSBcInswfVwiLgotSW5zdGFsbEhhbmRsZXJfbm90Rm91bmQgPSBDdXN0b20gaW5zdGFsbCBoYW5kbGVyIHJlcXVpcmVkIGJ5IGZlYXR1cmUgXCJ7MH1cIiB3YXMgbm90IGZvdW5kLgotSW5zdGFsbEhhbmRsZXJfaW52YWxpZEhhbmRsZXIgPSBGZWF0dXJlIFwiezB9XCIgY29udGFpbnMgaW52YWxpZCBjdXN0b20gaW5zdGFsbCBoYW5kbGVyLgotSW5zdGFsbEhhbmRsZXJfY2FsbEV4Y2VwdGlvbiA9IEVycm9yIHJlcG9ydGVkIGJ5IGN1c3RvbSBpbnN0YWxsIGhhbmRsZXIgZm9yIGZlYXR1cmUgXCJ7MH1cIi4KLUluc3RhbGxIYW5kbGVyX2Vycm9yID0gVW5hYmxlIHRvIGNvbXBsZXRlIGFjdGlvbiBmb3IgZmVhdHVyZSBcInswfVwiIGR1ZSB0byBlcnJvcnMuCi1JbnN0YWxsQ29tbWFuZF9zaXRlPXNpdGUgezB9Ci1JbnN0YWxsTW9uaXRvcl9Eb3dubG9hZFNpemUgPSAoezB9SyBieXRlcykKLUluc3RhbGxNb25pdG9yX0Rvd25sb2FkU2l6ZUxvbmcgPSAoezB9SyBvZiB7MX1LIGJ5dGVzKQotSmFyQ29udGVudFJlZmVyZW5jZV9VbnBhY2tpbmc9IFVucGFja2luZzoKLVNpdGVfQ2Fubm90RmluZENhdGVnb3J5PSBVbmFibGUgdG8gZmluZCBjYXRlZ29yeTogXCJ7MH1cIiBpbiBTaXRlOiBcInsxfVwiLgotU2l0ZV9Ob0NhdGVnb3JpZXM9IFRoZSBTaXRlIGRvZXMgbm90IGNvbnRhaW4gYW55IGNhdGVnb3JpZXMuCi1TaXRlX05vQ29udGVudFByb3ZpZGVyPSBJbnRlcm5hbCBFcnJvci4gQ29udGVudCBQcm92aWRlciBub3Qgc2V0IGZvciBTaXRlOiBcInswfVwiLgotVmVyc2lvbmVkSWRlbnRpZmllcl9JZE9yVmVyc2lvbk51bGw9IEludGVybmFsIEVycm9yLiBVbmFibGUgdG8gY3JlYXRlIGFuIElkZW50aWZpZXIuIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvciB0aGUgdmVyc2lvbiBpcyBudWxsIG9yIGVtcHR5OiB1bmlxdWUgaWRlbnRpZmllcj1cInswfVwiIHZlcnNpb249XCJ7MX1cIi4KLVNpdGVGaWxlX0Nhbm5vdFJlbW92ZVBsdWdpbj0gVW5hYmxlIHRvIHJlbW92ZSBwbHVnLWluOiBcInswfVwiIGZyb20gU2l0ZTogXCJ7MX1cIi4KLVNpdGVGaWxlX0Nhbm5vdFJlbW92ZUZlYXR1cmU9IFVuYWJsZSB0byByZW1vdmUgZmVhdHVyZTogXCJ7MH1cIiBmcm9tIFNpdGU6IFwiezF9XCIuCi1TaXRlRmlsZV9VbmFibGVUb0NyZWF0ZVVSTD0gVW5hYmxlIHRvIGNyZWF0ZSBVUkwgZm9yIGxvY2F0aW9uIFwiezB9XCIuCi1TaXRlRmlsZV9SZW1vdmluZz0gUmVtb3Zpbmc6Ci1TaXRlRmlsZUZhY3RvcnlfVW5hYmxlVG9DcmVhdGVVUkw9IEludGVybmFsIEVycm9yLiBVbmFibGUgdG8gY3JlYXRlIFVSTCBmcm9tIFwiezB9XCIuCi1TaXRlRmlsZUZhY3RvcnlfVW5hYmxlVG9BY2Nlc3NTaXRlPSBVbmFibGUgdG8gYWNjZXNzIHNpdGUKLVNpdGVGaWxlRmFjdG9yeV9EaXJlY3RvcnlEb2VzTm90RXhpc3Q9VGhlIGRpcmVjdG9yeSBcInswfVwiIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBmaWxlIHN5c3RlbS4KLURlZmF1bHRGZWF0dXJlUGFyc2VyX2xvY2F0aW9uPSBGZWF0dXJlIGxvY2F0aW9uOiB7MH0KLURlZmF1bHRGZWF0dXJlUGFyc2VyX05vRmVhdHVyZVRhZz0gRXJyb3IgcGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gVW5hYmxlIHRvIGZpbmQgcm9vdCBlbGVtZW50IFwiZmVhdHVyZVwiIGluIHRoZSBzdHJlYW0uCi1EZWZhdWx0RmVhdHVyZVBhcnNlcl9Xcm9uZ1BhcnNpbmdTdGFjaz0gSW50ZXJuYWwgRXJyb3IgcGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gVW5leHBlY3RlZCBQYXJzaW5nIFN0YWNrOiBcInswfVwiCi1EZWZhdWx0RmVhdHVyZVBhcnNlcl9Vbmtub3duRWxlbWVudD0gRXJyb3IgcGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gVW5rbm93biBlbGVtZW50IFwiezB9XCIgaW4gcGFyc2luZyBzdGF0ZSBcInsxfVwiLiBDaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIFhNTCBmaWxlLgotRGVmYXVsdEZlYXR1cmVQYXJzZXJfVG9vTWFueVVSTHRhZz0gRXJyb3IgcGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gVGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBcIlVSTFwiIGVsZW1lbnQgaW4gdGhlIFhNTCBzdHJlYW0uIFRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZS4KLURlZmF1bHRGZWF0dXJlUGFyc2VyX1Vua25vd25TdGFydFN0YXRlPSBJbnRlcm5hbCBFcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBVbmtub3duIHN0YXJ0IHN0YXRlIFwiezB9XCIuCi1EZWZhdWx0RmVhdHVyZVBhcnNlcl9JZE9yVmVyc2lvbkludmFsaWQ9IEVycm9yIHBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvciB0aGUgdmVyc2lvbiBpcyBudWxsIG9yIGVtcHR5IGZvciB0aGUgU3RhdGU6IFwiezJ9XCI6IHVuaXF1ZSBpZGVudGlmaWVyPVwiezB9XCIgdmVyc2lvbj1cInsxfVwiLgotRGVmYXVsdEZlYXR1cmVQYXJzZXJfTWlzc2luZ0lkPSBFcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBUaGUgXCJpZFwiIHRhZyBvZiB0aGUgZWxlbWVudCBcInswfVwiIGlzIG51bGwgb3IgZW1wdHkuIFZhbHVlIGlzIHJlcXVpcmVkLgotRGVmYXVsdEZlYXR1cmVQYXJzZXJfUGFyc2luZ1N0YWNrQmFja1RvSW5pdGlhbFN0YXRlPSBJbnRlcm5hbCBFcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBQYXJzaW5nIHN0YWNrIGJhY2sgdG8gSW5pdGlhbCBTdGF0ZS4KLURlZmF1bHRGZWF0dXJlUGFyc2VyX0VsZW1lbnRBbHJlYWR5U2V0PSBFcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBFbGVtZW50OiBcInswfVwiIGFscmVhZHkgc2V0IGZvciB0aGUgZmVhdHVyZS4KLURlZmF1bHRGZWF0dXJlUGFyc2VyX1N0YXRlSW5jbHVkZVdyb25nRWxlbWVudD0gRXJyb3IgcGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gU3RhdGU6IFwiezB9XCIgc2hvdWxkIG5vdCBpbmNsdWRlIEVsZW1lbnQgXCJ7MX1cIi4KLURlZmF1bHRGZWF0dXJlUGFyc2VyX1JlcXVpcmVTdGF0ZVdpdGhvdXRJbXBvcnRFbGVtZW50PUVycm9yIHBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIFN0YXRlOiBcInJlcXVpcmVcIiBtdXN0IGluY2x1ZGUgYXQgbGVhc3QgYW4gXCJpbXBvcnRcIiBlbGVtZW50LgotRGVmYXVsdEZlYXR1cmVQYXJzZXJfTWlzc2luZ1BhdGNoVmVyc2lvbj1FcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBBdHRyaWJ1dGUgInZlcnNpb24iIG9mIHRoZSBlbGVtZW50ICJpbXBvcnQiIG11c3QgYmUgc2V0IHdoZW4gInBhdGNoIiBpcyBzZXQgdG8gInRydWUiLgotRGVmYXVsdEZlYXR1cmVQYXJzZXJfd3JvbmdNYXRjaEZvclBhdGNoPUVycm9yIHBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIFdoZW4gYXR0cmlidXRlICJwYXRjaCIgb2YgdGhlIGVsZW1lbnQgImltcG9ydCIgaXMgc2V0IHRvICJ0cnVlIiwgdGhlIG9ubHkgdmFsaWQgdmFsdWUgZm9yIHRoZSAibWF0Y2giIGF0dHJpYnV0ZSBpcyAicGVyZmVjdCIuCi1EZWZhdWx0RmVhdHVyZVBhcnNlcl9wYXRjaFdpdGhQbHVnaW49RXJyb3IgcGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gQXR0cmlidXRlICJwYXRjaCIgY2FuIG9ubHkgYmUgdXNlZCBmb3IgZmVhdHVyZXMuCi1EZWZhdWx0RmVhdHVyZVBhcnNlcl9NdWx0aXBsZVBhdGNoSW1wb3J0cz1FcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBTdGF0ZTogInJlcXVpcmUiIG11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSAiaW1wb3J0IiBlbGVtZW50IHdpdGggdGhlIGF0dHJpYnV0ZSAicGF0Y2giIHNldCB0byAidHJ1ZSIuCi1EZWZhdWx0RmVhdHVyZVBhcnNlcl9Vbmtub3duRW5kU3RhdGU9IEludGVybmFsIEVycm9yIHBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIFVua25vd24gZW5kIHN0YXRlIFwiezB9XCIuCi1EZWZhdWx0RmVhdHVyZVBhcnNlcl9FcnJvclBhcnNpbmc9IEVycm9yIFBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIEVycm9yOiBcInswfVwiCi1EZWZhdWx0RmVhdHVyZVBhcnNlcl9FcnJvcmxpbmVDb2x1bW5NZXNzYWdlPSBFcnJvciBQYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBFbGVtZW50IFwiezB9XCIgbGluZTogXCJ7MX1cIiBjb2x1bW46XCJ7Mn1cIi4gRXJyb3I6IFwiezN9XCIuCi1EZWZhdWx0RmVhdHVyZVBhcnNlcl9FcnJvclBhcnNpbmdGZWF0dXJlPSBFcnJvciBQYXJzaW5nIGZlYXR1cmUgc3RyZWFtLgotRGVmYXVsdEZlYXR1cmVQYXJzZXJfVW5rbm93blN0YXRlPSBVbmtub3duIFN0YXRlIFwiezB9XCIuCi1EZWZhdWx0RmVhdHVyZVBhcnNlcl9Ob0xpY2Vuc2VUZXh0PSBFcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBTdGF0ZTogXCJsaWNlbnNlXCIgbXVzdCBpbmNsdWRlIHNvbWUgdGV4dC4KLURlZmF1bHRGZWF0dXJlUGFyc2VyX1BsdWdpbkFuZEZlYXR1cmVJZD1PbmUgSW1wb3J0IHN0YXRlbWVudCBpcyBpbmNvcnJlY3Q6IEJvdGggZmVhdHVyZSBhbmQgcGx1Zy1pbiBJRCBhcmUgZWl0aGVyIG51bGwgb3Igc3BlY2lmaWVkLgotU2l0ZUNvbnRlbnRQcm92aWRlcl9FcnJvckNyZWF0aW5nVVJMRm9yQXJjaGl2ZUlEPSBJbnRlcm5hbCBFcnJvci4gVW5hYmxlIHRvIGNyZWF0ZSBVUkwgZm9yIEFyY2hpdmUgSWRlbnRpZmllciBcInswfVwiIG9uIFNpdGUgXCJ7MX1cIi4KLURlZmF1bHRTaXRlUGFyc2VyX05vU2l0ZVRhZz0gRXJyb3IgcGFyc2luZyBzaXRlIHN0cmVhbS4gVW5hYmxlIHRvIGZpbmQgcm9vdCBlbGVtZW50IFwic2l0ZVwiIGluIHRoZSBzdHJlYW0uCi1EZWZhdWx0U2l0ZVBhcnNlcl9Xcm9uZ1BhcnNpbmdTdGFjaz0gSW50ZXJuYWwgRXJyb3IgcGFyc2luZyBzaXRlIHN0cmVhbS4gVW5leHBlY3RlZCBQYXJzaW5nIFN0YWNrOiBcInswfVwiCi1EZWZhdWx0U2l0ZVBhcnNlcl9Vbmtub3duRWxlbWVudD0gRXJyb3IgcGFyc2luZyBzaXRlIHN0cmVhbS4gVW5rbm93biBlbGVtZW50IFwiezB9XCIgaW4gcGFyc2luZyBzdGF0ZSBcInsxfVwiLiBDaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIFhNTCBmaWxlLgotRGVmYXVsdFNpdGVQYXJzZXJfVW5rbm93blN0YXJ0U3RhdGU9IEludGVybmFsIEVycm9yIHBhcnNpbmcgc2l0ZSBzdHJlYW0uIFVua25vd24gc3RhcnQgc3RhdGUgXCJ7MH1cIi4KLURlZmF1bHRTaXRlUGFyc2VyX01pc3Npbmc9IEVycm9yIHBhcnNpbmcgc2l0ZSBzdHJlYW0uIFRoZSBcInswfVwiIHRhZyBvZiB0aGUgZWxlbWVudCBcInsxfVwiIGlzIG51bGwgb3IgZW1wdHkuIFZhbHVlIGlzIHJlcXVpcmVkLgotRGVmYXVsdFNpdGVQYXJzZXJfUGFyc2luZ1N0YWNrQmFja1RvSW5pdGlhbFN0YXRlPSBJbnRlcm5hbCBFcnJvciBwYXJzaW5nIHNpdGUgc3RyZWFtLiBQYXJzaW5nIHN0YWNrIGJhY2sgdG8gSW5pdGlhbCBTdGF0ZS4KLURlZmF1bHRTaXRlUGFyc2VyX0VsZW1lbnRBbHJlYWR5U2V0PSBFcnJvciBwYXJzaW5nIHNpdGUgc3RyZWFtLiBFbGVtZW50OiBcInswfVwiIGFscmVhZHkgc2V0IGZvciB0aGUgU2l0ZS4KLURlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25FbmRTdGF0ZT0gSW50ZXJuYWwgRXJyb3IgcGFyc2luZyBzaXRlIHN0cmVhbS4gVW5rbm93biBlbmQgc3RhdGUgXCJ7MH1cIi4KLURlZmF1bHRTaXRlUGFyc2VyX0Vycm9yUGFyc2luZz0gRXJyb3IgUGFyc2luZyBzaXRlIHN0cmVhbS4gRXJyb3I6IFwiezB9XCIKLURlZmF1bHRTaXRlUGFyc2VyX0Vycm9ybGluZUNvbHVtbk1lc3NhZ2U9IEVycm9yIFBhcnNpbmcgc2l0ZSBzdHJlYW0uIEVsZW1lbnQgXCJ7MH1cIiBsaW5lOiBcInsxfVwiIGNvbHVtbjpcInsyfVwiLiBFcnJvcjogXCJ7M31cIi4KLURlZmF1bHRTaXRlUGFyc2VyX0Vycm9yUGFyc2luZ1NpdGU9IEVycm9yIFBhcnNpbmcgc2l0ZSBzdHJlYW0uCi1EZWZhdWx0U2l0ZVBhcnNlcl9Vbmtub3duU3RhdGU9IFVua25vd24gU3RhdGUgXCJ7MH1cIi4KLURlZmF1bHRTaXRlUGFyc2VyX0ludmFsaWRYTUxTdHJlYW09IFRoZSBYTUwgc3RyZWFtIGlzIG5vdCBhIHZhbGlkIGRlZmF1bHQgXCJzaXRlLnhtbFwiIGZpbGUuIFRoZSByb290IHRhZyBpcyBub3Qgc2l0ZS4KLU1vZGVsT2JqZWN0X01vZGVsUmVhZE9ubHk9IEludGVybmFsIEVycm9yLiBUaGUgTW9kZWwgT2JqZWN0IGlzIHJlYWQtb25seS4KLVNpdGVNb2RlbE9iamVjdF9FcnJvclBhcnNpbmdTaXRlU3RyZWFtPSBFcnJvciBwYXJzaW5nIHNpdGUgc3RyZWFtLgotU2l0ZU1vZGVsT2JqZWN0X0Vycm9yQWNjZXNzaW5nU2l0ZVN0cmVhbT0gRXJyb3IgYWNjZXNzaW5nIHNpdGUgc3RyZWFtLgotSW5zdGFsbENvbmZpZ3VyYXRpb25fRXJyb3JEdXJpbmdGaWxlQWNjZXNzPSBFcnJvciBhY2Nlc3NpbmcgZmlsZTogXCJ7MH1cIi4KLUluc3RhbGxDb25maWd1cmF0aW9uUGFyc2VyX0ZlYXR1cmVSZWZlcmVuY2VOb1VSTD0gRXJyb3IgUGFyc2luZyBTdHJlYW0uIEEgZmVhdHVyZSByZWZlcmVuY2UgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgVVJMIHRhZy4gVmFsdWUgaXMgcmVxdWlyZWQuCi1GZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcl9GaWxlRG9lc05vdEV4aXN0PSBUaGUgZmlsZSBcInswfVwiIGRvZXMgbm90IGV4aXN0LgotRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXJfSW52YWxpZERpcmVjdG9yeT0gVGhlIHBhdGggXCJ7MH1cIiBpcyBub3QgYSB2YWxpZCBkaXJlY3RvcnkuCi1GZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcl9VbmFibGVUb0NyZWF0ZVVSTEZvcj1VbmFibGUgdG8gY3JlYXRlIGEgVVJMIGZvciBcInswfVwiLgotRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXJfVW5hYmxlVG9SZXRyaWV2ZU5vblBsdWdpbkVudHJ5PUVycm9yIHJldHJpZXZpbmcgdGhlIG5vbi1wbHVnLWluIGVudHJ5OiBcInswfVwiLgotRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXJfVW5hYmxlVG9SZXRyaWV2ZUZlYXR1cmVFbnRyeT1FcnJvciByZXRyaWV2aW5nIGZlYXR1cmUgZW50cnkgY29udGVudCByZWZlcmVuY2U6IFwiezB9XCIuCi1GZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcl9VbmFibGVUb1JldHJpZXZlUGx1Z2luRW50cnkgPUVycm9yIHJldHJpZXZpbmcgdGhlIHBsdWctaW4gZW50cnk6IFwiezB9XCIuCi1Db25maWd1cmVkU2l0ZV9Ob25JbnN0YWxsYWJsZVNpdGU9IFlvdSBjYW5ub3QgaW5zdGFsbCBpbiB0aGUgc2l0ZSBcInswfVwiLiBJdCBpcyBjb25zaWRlcmVkIG5vbiB1cGRhdGVhYmxlLgotQ29uZmlndXJlZFNpdGVfTnVsbEZlYXR1cmVUb0luc3RhbGw9IEludGVybmFsIEVycm9yLiBUaGUgZmVhdHVyZSB0byBiZSBpbnN0YWxsZWQgaXMgbnVsbC4KLUNvbmZpZ3VyZWRTaXRlX05vblVuaW5zdGFsbGFibGVTaXRlPSBZb3UgY2Fubm90IHVuaW5zdGFsbCBmcm9tIHRoZSBzaXRlIFwiezB9XCIuIEl0IGlzIGNvbnNpZGVyZWQgbm9uIHVwZGF0ZWFibGUuCi1Db25maWd1cmVkU2l0ZV9Ob1NpdGU9IE5vIFNpdGUKLUNvbmZpZ3VyZWRTaXRlX0Nhbm5vdEZpbmRGZWF0dXJlVG9VbmNvbmZpZ3VyZT0gSW50ZXJuYWwgRXJyb3IuIFVuYWJsZSB0byBkaXNhYmxlIGZlYXR1cmUgXCJ7MH1cIiBvbiBzaXRlIFwiezF9XCIuIENhbm5vdCBmaW5kIGZlYXR1cmUuCi1Db25maWd1cmVkU2l0ZV9DYW5ub3RGaW5kRmVhdHVyZVRvQ29uZmlndXJlPSBJbnRlcm5hbCBFcnJvci4gVW5hYmxlIHRvIGVuYWJsZSBmZWF0dXJlIFwiezB9XCIuIENhbm5vdCBmaW5kIGZlYXR1cmUuCi1Db25maWd1cmVkU2l0ZV9DYW5ub3RGaW5kUGx1Z2luRW50cnk9IFVuYWJsZSB0byByZXRyaWV2ZSBQbHVnLWluIEVudHJ5IFwiezB9XCIgb24gc2l0ZSBcInsxfVwiLiBDYW5ub3QgZmluZCBwbHVnLWluIGVudHJ5LiBEbyB5b3Ugd2FudCB0byBDb250aW51ZSA/Ci1Db25maWd1cmVkU2l0ZV9NaXNzaW5nUGx1Z2luc0Jyb2tlbkZlYXR1cmU9IFBsdWctaW4gXCJ7MH1cIiB2ZXJzaW9uIFwiezF9XCIgcmVmZXJlbmNlZCBieSB0aGlzIGZlYXR1cmUgaXMgbWlzc2luZy4KLUNvbmZpZ3VyZWRTaXRlX1VuYWJsZVRvUmVtb3ZlQ29uZmlndXJlZEZlYXR1cmU9IFVuYWJsZSB0byByZW1vdmUgYSBlbmFibGVkIGZlYXR1cmU6IFwiezB9XCIgWW91IG11c3QgZGlzYWJsZSB0aGUgZmVhdHVyZSBmaXJzdC4KLUNvbmZpZ3VyZWRTaXRlX1VuYWJsZVRvRmluZEZlYXR1cmU9IFVuYWJsZSB0byBGaW5kIHRoZSBmZWF0dXJlIFwiezB9XCIgb24gdGhpcyBzaXRlLgotQ29uZmlndXJlZFNpdGVfU2l0ZVVSTE51bGw9VGhlIFNpdGUgVVJMIGlzIG51bGwuCi1Db25maWd1cmVkU2l0ZV9Ob25Mb2NhbFNpdGU9VGhlIFNpdGUgaXMgbm90IG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4gQ2Fubm90IHZhbGlkYXRlLgotQ29uZmlndXJlZFNpdGVfTm90U2FtZVByb2R1Y3RJZD1UaGUgc2l0ZSBjYW5ub3QgYmUgbW9kaWZpZWQgYnkgdGhpcyBwcm9kdWN0LiBJdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBwcm9kdWN0OiBcInswfVwiLgotQ29uZmlndXJlZFNpdGVfQ29udGFpbmVkSW5Bbm90aGVyU2l0ZT1UaGlzIHNpdGUgaXMgY29udGFpbmVkIGluIGFub3RoZXIgc2l0ZTogXCJ7MH1cIi4KLUNvbmZpZ3VyZWRTaXRlX1JlYWRPbmx5U2l0ZT1UaGUgc2l0ZSBpcyBtYXJrZWQgYXMgcmVhZCBvbmx5LgotQ29uZmlndXJlZFNpdGVfVW5hYmxlUmVzb2x2ZVVSTD0gSW50ZXJuYWwgRXJyb3IuIFVuYWJsZSB0byByZXNvbHZlIFVSTCBcInswfVwiLgotQ29uZmlndXJlZFNpdGVfVW5hYmxlVG9BY2Nlc3NTaXRlPSBJbnRlcm5hbCBFcnJvci4gVW5hYmxlIHRvIGFjY2VzcyBwbGF0Zm9ybSBzaXRlIFwiezB9XCIuCi1GZWF0dXJlRmFjdG9yeV9DcmVhdGluZ0Vycm9yPSBFcnJvciBjcmVhdGluZyBmZWF0dXJlIFwiezB9XCIuCi1GZWF0dXJlTW9kZWxGYWN0b3J5X0Vycm9yQWNjZXNpbmdGZWF0dXJlU3RyZWFtPSBFcnJvciBhY2Nlc3NpbmcgZmVhdHVyZSBzdHJlYW0uCi1GZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnlfTnVsbFVSTD0gRXJyb3IgY3JlYXRpbmcgZmVhdHVyZS4gVGhlIFVSTCB1c2VkIHRvIGNyZWF0ZSB0aGUgZmVhdHVyZSBpcyBudWxsLgotRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5X0Nhbm5vdENyZWF0ZVVSTD0gRXJyb3IgY3JlYXRpbmcgZmVhdHVyZS4gVW5hYmxlIHRvIGNyZWF0ZSBVUkwgZm9yIFwiezB9XCIuCi1GZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXJfTm9NYW5pZmVzdEZpbGU9IFVuYWJsZSB0byByZXRyaWV2ZSBcInswfVwiIGluIGZlYXR1cmUgbG9jYXRlZCBhdCBcInsxfVwiLgotRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyX0ludmFsaWREaXJlY3Rvcnk9IFRoZSBkaXJlY3RvcnkgXCJ7MH1cIiBpcyBub3QgYSB2YWxpZCBkaXJlY3RvcnkuCi1GZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXJfRXJyb3JSZXRyaWV2aW5nPSBFcnJvciByZXRyaWV2aW5nIFwiezB9XCIuCi1GZWF0dXJlUmVmZXJlbmNlX1VuYWJsZVRvUmVzb2x2ZVVSTD0gSW50ZXJuYWwgRXJyb3I6IFVuYWJsZSB0byByZXNvbHZlIG1vZGVsIHVzaW5nIFVSTDogXCJ7MH1cIi4KLUZlYXR1cmVUeXBlRmFjdG9yeV9VbmFibGVUb0ZpbmRGZWF0dXJlRmFjdG9yeT0gVW5hYmxlIHRvIGZpbmQgYSBmZWF0dXJlIGZhY3RvcnkgZm9yIHRoZSBleHRlbnNpb24gaWQgXCJ7MH1cIi4KLUluc3RhbGxDb25maWd1cmF0aW9uX1VuYWJsZVRvQ3JlYXRlVVJMPSBVbmFibGUgdG8gY3JlYXRlIFVSTCBmcm9tIFwiezB9XCIuCi1JbnN0YWxsQ29uZmlndXJhdGlvbl9VbmFibGVUb0Nhc3Q9IEludGVybmFsIEVycm9yLiBUaGUgQ29uZmlndXJhdGlvbiBTaXRlIG9iamVjdCBpcyBub3QgYSBzdWJjbGFzcyBvZiBDb25maWd1cmVkU2l0ZU1vZGVsCi1JbnN0YWxsQ29uZmlndXJhdGlvbl9VbmFibGVUb1NhdmVQbGF0Zm9ybUNvbmZpZ3VyYXRpb249VW5hYmxlIHRvIHNhdmUgcGxhdGZvcm0gY29uZmlndXJhdGlvbiBpbiBcInswfVwiLgotSW5zdGFsbENvbmZpZ3VyYXRpb25fQWxyZWFkeU5hdGl2ZWx5TGlua2VkPVRoZSBzaXRlIGlzIGFscmVhZHkgbGlua2VkLgotSW5zdGFsbENvbmZpZ3VyYXRpb25fQWxyZWFkeVByb2R1Y3RTaXRlPVRoZSBsb2NhdGlvbiBpcyBhbHJlYWR5IGEgcHJvZHVjdCBzaXRlLgotSW5zdGFsbENvbmZpZ3VyYXRpb25fdW5hYmxlVG9GaW5kU2l0ZT1VbmFibGUgdG8gZmluZCBzaXRlIHswfSBpbiBwbGF0Zm9ybSBjb25maWd1cmF0aW9uIHsxfS4KLUludGVybmFsU2l0ZU1hbmFnZXJfVW5hYmxlVG9DcmVhdGVTaXRlV2l0aFR5cGU9IEV4dGVuc2lvbiBFcnJvci4gVGhlIFNpdGUgRmFjdG9yeSBvZiB0eXBlIFwiezB9XCIgY2Fubm90IGFjY2VzcyB0aGUgU2l0ZSBcInsxfVwiLgotSW50ZXJuYWxTaXRlTWFuYWdlcl9VbmFibGVUb0FjY2Vzc1VSTD0gVW5hYmxlIHRvIGFjY2VzcyBcInswfVwiLgotSW50ZXJuYWxTaXRlTWFuYWdlcl9VbmFibGVUb0NyZWF0ZVVSTD0gVW5hYmxlIHRvIGNyZWF0ZSBVUkwgZnJvbSBcInswfVwiLgotSW50ZXJuYWxTaXRlTWFuYWdlcl9GYWlsZWRSZXRyeUFjY2Vzc2luZ1NpdGU9IEZhaWxlZCByZXRyeSBhY2Nlc3Npbmcgc2l0ZSB1c2luZyBkZWZhdWx0IGluc3RhbGxlZCBmb3JtYXQgaW5zdGVhZCBvZiBkZWZhdWx0IHBhY2thZ2VkIGZvcm1hdC4KLUludGVybmFsU2l0ZU1hbmFnZXJfQ29ubmVjdGluZ1RvU2l0ZSA9IENvbm5lY3RpbmcgVG8gU2l0ZS4uLgotR2xvYmFsQ29uc3VtZXJfRXJyb3JDcmVhdGluZ0ZpbGU9IFVuYWJsZSB0byBjcmVhdGUgZmlsZSBcInswfVwiLgotU2l0ZUZpbGVDb250ZW50Q29uc3VtZXJfVW5hYmxlVG9DcmVhdGVVUkw9IFVuYWJsZSB0byBjcmVhdGUgVVJMIGZyb20gXCJ7MH1cIi4KLVNpdGVGaWxlQ29udGVudENvbnN1bWVyX1VuYWJsZVRvQ3JlYXRlVVJMRm9yRmlsZT0gVW5hYmxlIHRvIGNyZWF0ZSBVUkwgZm9yIHRoZSBmaWxlIFwiezB9XCIuCi1TaXRlRmlsZUNvbnRlbnRDb25zdW1lcl91bmFibGVUb0RlbGV0ZT1VbmFibGUgdG8gZGVsZXRlIHswfQotQ29udGVudENvbnN1bWVyX1VuYWJsZVRvUmVuYW1lID0gSW50ZXJuYWwgRXJyb3IuIFVuYWJsZSB0byByZW5hbWUgXCJ7MH1cIiB0byBcInsxfVwiLgotU2l0ZUZpbGVGYWN0b3J5X1VuYWJsZVRvT2J0YWluUGFyZW50RGlyZWN0b3J5PSBVbmFibGUgb2J0YWluIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGZyb20gdGhlIGZpbGUgXCJ7MH1cIi4KLVNpdGVGaWxlRmFjdG9yeV9GaWxlRG9lc05vdEV4aXN0PSBVbmFibGUgdG8gYWNjZXNzIHNpdGUgXCJ7MH1cIi4gVGhlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4KLVNpdGVGaWxlRmFjdG9yeV9VbmFibGVUb0NyZWF0ZVVSTEZvckZpbGU9IFVuYWJsZSB0byBjcmVhdGUgVVJMIGZyb20gXCJ7MH1cIi4KLVNpdGVGaWxlRmFjdG9yeV9FcnJvclBhcnNpbmdGaWxlPSBVbmFibGUgdG8gcGFyc2UgZmlsZSBcInswfVwiLgotU2l0ZUZpbGVGYWN0b3J5X0Vycm9yQWNjZXNzaW5nPSBVbmFibGUgdG8gYWNjZXNzIGZpbGUgXCJ7MH1cIi4KLVNpdGVUeXBlRmFjdG9yeV9VbmFibGVUb0ZpbmRTaXRlRmFjdG9yeT0gVW5hYmxlIHRvIGZpbmQgYSBzaXRlIGZhY3RvcnkgZm9yIHRoZSBleHRlbnNpb24gaWQgXCJ7MH1cIi4KLVVwZGF0ZU1hbmFnZXJVdGlsc19VbmFibGVUb1JlbW92ZUZpbGU9IFVuYWJsZSB0byByZW1vdmUgXCJ7MH1cIiBmcm9tIHRoZSBmaWxlIHN5c3RlbS4KLVVwZGF0ZU1hbmFnZXJVdGlsc19GaWxlQWxyZWFkeUV4aXN0cz0gVW5hYmxlIHRvIGNyZWF0ZSBcInswfVwiIG9uIHRoZSBmaWxlIHN5c3RlbS4gRmlsZSBhbHJlYWR5IGV4aXN0cy4KLVNpdGVMb2NhbF9VbmFibGVUb0NyZWF0ZVVSTEZvcj0gVW5hYmxlIHRvIGNyZWF0ZSBVUkwgZnJvbSBcInswfVwiLgotU2l0ZUxvY2FsX1VuYWJsZVRvRGV0ZXJtaW5lRmVhdHVyZVN0YXR1c1NpdGVOdWxsPVVuYWJsZSB0byBkZXRlcm1pbmUgc3RhdHVzIG9mIGZlYXR1cmVcInswfVwiIFRoZSBzaXRlIGlzIE5VTEwuCi1TaXRlTG9jYWxfVHdvVmVyc2lvblNhbWVQbHVnaW4xPVBsdWctaW46IFwiezB9XCIgdmVyc2lvbjogXCJ7MX1cIiByZWZlcmVuY2VkIGJ5IHRoaXMgZmVhdHVyZSBpcyBub3QgaW5jbHVkZWQgYXQgcnVudGltZS4gUnVudGltZSBpbmNsdWRlcyBwbHVnLWluIHZlcnNpb24gXCJ7Mn1cIi4KLVNpdGVMb2NhbF9Ud29WZXJzaW9uU2FtZVBsdWdpbjI9UGx1Zy1pbjogXCJ7MH1cIiB2ZXJzaW9uOiBcInsxfVwiIHJlZmVyZW5jZWQgYnkgdGhpcyBmZWF0dXJlIGlzIG5vdCBpbmNsdWRlZCBhdCBydW50aW1lLiBSdW50aW1lIGluY2x1ZGVzIHBsdWctaW4gdmVyc2lvbiBcInsyfVwiIHN1cHBsaWVkIGJ5IGZlYXR1cmUgXCJ7M31cIiB2ZXJzaW9uIFwiezR9XCIuCi1TaXRlTG9jYWxfRmVhdHVyZVVuSGFwcHk9VGhlIGZlYXR1cmUgaXMgbm90IGNvbmZpZ3VyZWQgcHJvcGVybHkuCi1TaXRlTG9jYWxfRmVhdHVyZUhhcHB5PVRoZSBmZWF0dXJlIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHkuCi1TaXRlTG9jYWxfRmVhdHVyZUFtYmlndW91cz1UaGUgZmVhdHVyZSBtYXkgbm90IGJlIGNvbmZpZ3VyZWQgcHJvcGVybHkuCi1TaXRlTG9jYWxfTmVzdGVkRmVhdHVyZVVuSGFwcHk9SW5jbHVkZWQgZmVhdHVyZSBcInswfVwiIHZlcnNpb24gXCJ7MX1cIiBjb250YWlucyBwcm9ibGVtcy4KLVNpdGVMb2NhbF9OZXN0ZWRGZWF0dXJlVW5hdmFpbGFibGU9SW5jbHVkZWQgZmVhdHVyZSBcInswfVwiIGlzIG1pc3NpbmcuCi1TaXRlTG9jYWxfTm9QbHVnaW5WZXJzaW9uPU5vIHBsdWctaW46IFwiezB9XCIgaW5jbHVkZWQgYXQgcnVudGltZS4KLVNpdGVMb2NhbF9VbmFibGVUb0RldGVybWluZUZlYXR1cmVTdGF0dXNDb25maWd1cmVkU2l0ZU51bGw9VW5hYmxlIHRvIGRldGVybWluZSBzdGF0dXMgb2YgZmVhdHVyZVwiezB9XCIgVGhlIENvbmZpZ3VyZWQgU2l0ZSBpcyBOVUxMLgotU2l0ZUxvY2FsX0ZlYXR1cmVEaXNhYmxlPVRoZSBmZWF0dXJlIGlzIGRpc2FibGVkLgotU2l0ZUxvY2FsX0ZlYXR1cmVTdGF0dXNVbmtub3duPVVua25vd24gc3RhdGUuCi1TaXRlTG9jYWxfTmVzdGVkRmVhdHVyZURpc2FibGU9SW5jbHVkZWQgZmVhdHVyZSBcInswfVwiIHZlcnNpb24gXCJ7MX1cIiBpcyBkaXNhYmxlZC4KLVNpdGVVUkxGYWN0b3J5X1VuYWJsZVRvQ3JlYXRlVVJMPSBJbnRlcm5hbCBFcnJvci4gVW5hYmxlIHRvIGNyZWF0ZSBhIFVSTCBmcm9tIFwiezB9XCIuCi1TaXRlVVJMRmFjdG9yeV9VbmFibGVUb0FjY2Vzc1NpdGVTdHJlYW09IFVuYWJsZSB0byBhY2Nlc3Mgc2l0ZTogXCJ7MH1cIgotSmFyVmVyaWZpZXJfVmVyaWZ5PSBWZXJpZnlpbmc6IFwiezB9XCIKLUphclZlcmlmaWVyX1VuYWJsZVRvRmluZEVuY3J5cHRpb249IFVuYWJsZSB0byBmaW5kIGFsZ29yaXRobSB0byB2ZXJpZnkgaW50ZWdyaXR5IG9mIEtleVN0b3JlIFwiezB9XCIuCi1KYXJWZXJpZmllcl9VbmFibGVUb0xvYWRDZXJ0aWZpY2F0ZT0gVW5hYmxlIHRvIGxvYWQgb25lIG9yIG11bHRpcGxlcyBjZXJ0aWZpY2F0ZXMgaW4gdGhlIEtleVN0b3JlIFwiezB9XCIuCi1KYXJWZXJpZmllcl9VbmFibGVUb0ZpbmRQcm92aWRlckZvcktleXN0b3JlPSBVbmFibGUgdG8gZmluZCBwcm92aWRlciBmb3IgdGhlIEtleVN0b3JlIHR5cGUgXCJ7MH1cIi4KLUphclZlcmlmaWVyX0tleVN0b3JlTm90TG9hZGVkPSBJbnRlcm5hbCBFcnJvci4gS2V5U3RvcmUgbm90IEluaXRpYWxpemVkL0xvYWRlZC4KLUphclZlcmlmaWVyX1VuYWJsZVRvQWNjZXNzSmFyPSBVbmFibGUgdG8gYWNjZXNzIEpBUiBmaWxlIFwiezB9XCIuCi1KYXJWZXJpZmllcl9JbnZhbGlkRmlsZT0gVGhlIEZpbGUgXCJ7MH1cIiBpcyBub3QgYSB2YWxpZCBKQVIgZmlsZS4gSXQgZG9lcyBub3QgY29udGFpbiBhIE1hbmlmZXN0LgotSmFyVmVyaWZpZXJfSW52YWxpZEphcj0gVGhlIEZpbGUgXCJ7MH1cIiBpcyBub3QgYSB2YWxpZCBKQVIgZmlsZS4KLUphclZlcmlmaWNhdGlvblJlc3VsdF9WYWxpZEJldHdlZW49IFZhbGlkIGJldHdlZW4gXCJ7MH1cIiBhbmQgXCJ7MX1cIi4KLUphclZlcmlmaWNhdGlvblJlc3VsdF9FeHBpcmVkQ2VydGlmaWNhdGU9ICogRVhQSVJFRCBDRVJUSUZJQ0FURSAqCi1KYXJWZXJpZmljYXRpb25SZXN1bHRfQ2VydGlmaWNhdGVOb3RZZXRWYWxpZD0gKiBDRVJUSUZJQ0FURSBOT1QgWUVUIFZBTElEICoKLUphclZlcmlmaWNhdGlvblJlc3VsdF9DZXJ0aWZpY2F0ZVZhbGlkPSBWYWxpZCBjZXJ0aWZpY2F0ZS4KLUphclZlcmlmaWNhdGlvblNlcnZpY2VfVW5zdWNlc3NmdWxWZXJpZmljYXRpb249VmVyaWZpY2F0aW9uIG9mIGZlYXR1cmUgdW5zdWNjZXNzZnVsLiBJbnN0YWxsYXRpb24gY2FuY2VsbGVkLgotSmFyVmVyaWZpY2F0aW9uU2VydmljZV9DYW5jZWxJbnN0YWxsPUluc3RhbGxhdGlvbiBjYW5jZWxsZWQuCi1VcGRhdGVNYW5hZ2VyVXRpbHNfVW5hYmxlVG9Mb2c9VW5hYmxlIHRvIGFjY2VzcyBlcnJvciByZWNvdmVyeSBsb2cgZmlsZTogXCJ7MH1cIi4KLUNvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyX3Rvb01hbnlDb25uZWN0aW9ucyA9IFRoZXJlIGFyZSB0b28gbWFueSBuZXR3b3JrIGNvbm5lY3Rpb25zIHN0aWxsIGFjdGl2ZS4gXAotSWYgeW91IGFyZSBleHBlcmllbmNpbmcgbmV0d29yayBwcm9ibGVtcywgdHJ5IGFnYWluIGxhdGVyLiBJZiB0aGUgZXJyb3IgcGVyc2lzdHMsIHJlc3RhcnQgdGhlIFwKLWFwcGxpY2F0aW9uLgotQ29ubmVjdGlvblRocmVhZE1hbmFnZXJfdW5yZXNwb25zaXZlVVJMID0gU3RpbGwgd2FpdGluZyBmb3IgcmVzcG9uc2U6IHswfQotSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlX2ZlYXR1cmVVbmluc3RhbGxlZD0gRmVhdHVyZSB7MH0gaXMgdW5pbnN0YWxsZWQuCi0KLSMgUHJvcGVydGllcyBtb3ZlZCBtb3N0bHkgZnJvbSB0aGUgdWkgcGx1Z2luCi0KLUFjdGl2aXR5Q29uc3RyYWludHNfd2FybmluZz1UaGUgY3VycmVudCBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGVycm9ycyBhbmQgdGhpcyBvcGVyYXRpb24gY2FuIGhhdmUgdW5wcmVkaWN0YWJsZSByZXN1bHRzLgotQWN0aXZpdHlDb25zdHJhaW50c19yb290TWVzc2FnZSA9IFJlcXVlc3RlZCBvcGVyYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZCBiZWNhdXNlIGl0IHdvdWxkIGludmFsaWRhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4gU2VlIGRldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1BY3Rpdml0eUNvbnN0cmFpbnRzX3Jvb3RNZXNzYWdlSW5pdGlhbCA9IEN1cnJlbnQgY29uZmlndXJhdGlvbiBjb250YWlucyBlcnJvcnMgdGhhdCBhcmUgbm90IGNvcnJlY3RlZCBieSB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbiBhbmQgbW9yZSBlcnJvcnMgd291bGQgYmUgaW50cm9kdWNlZC4gU2VlIGRldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1BY3Rpdml0eUNvbnN0cmFpbnRzX2JlZm9yZU1lc3NhZ2UgPSAtLS0tLSBDdXJyZW50IGNvbmZpZ3VyYXRpb24gcHJvYmxlbXMgLS0tLS0KLUFjdGl2aXR5Q29uc3RyYWludHNfYWZ0ZXJNZXNzYWdlID0gLS0tLS0gQ29uZmlndXJhdGlvbiBwcm9ibGVtcyBhZnRlciB0aGUgb3BlcmF0aW9uIC0tLS0tCi1BY3Rpdml0eUNvbnN0cmFpbnRzX3BsYXRmb3JtID0gUmVzdWx0aW5nIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgY29udGFpbiB0aGUgcGxhdGZvcm0uCi1BY3Rpdml0eUNvbnN0cmFpbnRzX3ByaW1hcnkgPSBSZXN1bHRpbmcgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBjb250YWluIHRoZSBwcmltYXJ5IGZlYXR1cmUuCi1BY3Rpdml0eUNvbnN0YWludHNfcHJlcmVxX3BsdWdpbiA9IHBsdWctaW4KLUFjdGl2aXR5Q29uc3RhaW50c19wcmVyZXFfZmVhdHVyZSA9IGZlYXR1cmUKLUFjdGl2aXR5Q29uc3RyYWludHNfcHJlcmVxID0gcmVxdWlyZXMgezB9ICJ7MX0iLgotQWN0aXZpdHlDb25zdHJhaW50c19wcmVyZXFQZXJmZWN0ID0gcmVxdWlyZXMgezB9ICJ7MX0gKHsyfSkiLgotQWN0aXZpdHlDb25zdHJhaW50c19wcmVyZXFFcXVpdmFsZW50ID0gcmVxdWlyZXMgezB9ICJ7MX0gKHsyfSkiLCBvciBlcXVpdmFsZW50LgotQWN0aXZpdHlDb25zdHJhaW50c19wcmVyZXFDb21wYXRpYmxlID0gcmVxdWlyZXMgezB9ICJ7MX0gKHsyfSkiLCBvciBjb21wYXRpYmxlLgotQWN0aXZpdHlDb25zdHJhaW50c19wcmVyZXFHcmVhdGVyT3JFcXVhbCA9IHJlcXVpcmVzIHswfSAiezF9ICh7Mn0pIiwgb3IgbGF0ZXIgdmVyc2lvbi4KLUFjdGl2aXR5Q29uc3RyYWludHNfb3MgPSBvcGVyYXRpbmcgc3lzdGVtIGRvZXMgbm90IG1hdGNoIGN1cnJlbnQgZW52aXJvbm1lbnQuCi1BY3Rpdml0eUNvbnN0cmFpbnRzX3dzID0gd2luZG93aW5nIHN5c3RlbSBkb2VzIG5vdCBtYXRjaCBjdXJyZW50IGVudmlyb25tZW50LgotQWN0aXZpdHlDb25zdHJhaW50c19hcmNoID0gcGxhdGZvcm0gYXJjaGl0ZWN0dXJlIGRvZXMgbm90IG1hdGNoIGN1cnJlbnQgZW52aXJvbm1lbnQuCi1BY3Rpdml0eUNvbnN0cmFpbnRzX2N5Y2xlID0gZGVmaW5pdGlvbiBjb250YWlucyBhIG5lc3RlZCBmZWF0dXJlcyBjeWNsZTogezB9X3sxfXByZXJlcQotQWN0aXZpdHlDb25zdHJhaW50c19jaGlsZE1lc3NhZ2UgPSB7MH0gKHsxfSkgezJ9Ci1BY3Rpdml0eUNvbnN0cmFpbnRzX29wdGlvbmFsQ2hpbGQgPSBGZWF0dXJlIGluY2x1ZGVkIGluIGFub3RoZXIgZmVhdHVyZSBjYW5ub3QgYmUgZW5hYmxlZCBpZiB0aGUgcGFyZW50IGlzIGRpc2FibGVkLiBFbmFibGUgdGhlIHBhcmVudCBmaXJzdC4KLUFjdGl2aXR5Q29uc3RyYWludHNfZXhjbHVzaXZlID0gbXVzdCBiZSBwcm9jZXNzZWQgc2VwYXJhdGVseSBmcm9tIG90aGVyIGZlYXR1cmVzLgotQWN0aXZpdHlDb25zdHJhaW50c19ub0xpY2Vuc2UgPSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgbGljZW5zZSBhZ3JlZW1lbnQuCi1BY3Rpdml0eUNvbnN0cmFpbnRzX3JlYWRPbmx5ID0gVGhlIHNpdGUgaXMgbm90IHVwZGF0ZWFibGU6IHswfS4KLUFjdGl2aXR5Q29uc3RyYWludHNfcGxhdGZvcm1Nb2RpZmllZCA9IFBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gbW9kaWZpZWQgb3V0c2lkZSB0aGlzIHByb2dyYW0uIEEgcmVzdGFydCBpcyByZWNvbW1lbmRlZC4KLUR1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZ19jb25mbGljdCA9IFZlcnNpb24gezB9IGluIHsxfQotT3BlcmF0aW9uc01hbmFnZXJfZXJyb3Jfb2xkPSB7MH06IEVycm9yIHdoaWxlIHVwZGF0aW5nIHRoZSBvbGQgZmVhdHVyZSB2ZXJzaW9uCi1PcGVyYXRpb25zTWFuYWdlcl9pbnN0YWxsaW5nPUluaXRpYWxpemluZy4uLgotT3BlcmF0aW9uc01hbmFnZXJfZXJyb3JfdW5pbnN0YWxsPSB7MH0gOiBFcnJvciB3aGlsZSB1bmluc3RhbGxpbmcgZmVhdHVyZQotU2VhcmNoX25ldHdvcmtQcm9ibGVtcz1OZXR3b3JrIGNvbm5lY3Rpb24gcHJvYmxlbXMgZW5jb3VudGVyZWQgZHVyaW5nIHNlYXJjaC4KLUluc3RhbGxDb25maWd1cmF0aW9uX2xvY2F0aW9uX2V4aXN0cyA9IFNpdGUgYWxyZWFkeSBleGlzdHMuCi1JbnN0YWxsTG9nUGFyc2VyX2Vycm9ycyA9IEVycm9ycyBnZW5lcmF0ZWQgd2hpbGUgcGFyc2luZyBpbnN0YWxsYXRpb24gaGlzdG9yeSBmaWxlLgotU2l0ZUxvY2FsX2Nsb25lQ29uZmlnPUVycm9yIGNsb25uaW5nIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLQotVW5pbnN0YWxsQ29tbWFuZF9mZWF0dXJlTm90SW5zdGFsbGVkQnlVTT1GZWF0dXJlIG5vdCBpbnN0YWxsZWQgYnkgVXBkYXRlIE1hbmFnZXI6IHswfQotCi1VcGRhdGVNYW5hZ2VyVXRpbHNfaW5wdXRTdHJlYW1FbmRlZD1JbnB1dFN0cmVhbSBlbmRlZCBhZnRlciB7MH0gYnl0ZXMgKGV4cGVjdGVkIHsxfSApCi1VcGRhdGVTZWFyY2hSZXF1ZXN0X2xvYWRpbmdQb2xpY3k9TG9hZGluZyB1cGRhdGUgcG9saWN5IC4uLgotVXBkYXRlTWFuYWdlclV0aWxzX2NvcHk9VXBkYXRlTWFuYWdlclV0aWxzIGNvcHkoKSBhdCBvZmZzZXQ6Ci1VcGRhdGVQb2xpY3lfcGFyc2VQb2xpY3k9RXJyb3JzIHdoaWxlIHBhcnNpbmcgdXBkYXRlIHBvbGljeQotVXBkYXRlUG9saWN5X3BvbGljeUV4cGVjdGVkPScgaXMgZXhwZWN0ZWQuCi1VcGRhdGVTZWFyY2hSZXF1ZXN0X3NlYXJjaGluZz1TZWFyY2hpbmcuLi4KLVVwZGF0ZVNlYXJjaFJlcXVlc3RfY29udGFjdGluZz1Db250YWN0aW5nIHswfSAuLi4KLVVwZGF0ZVNlYXJjaFJlcXVlc3RfY2hlY2tpbmc9Q2hlY2tpbmcgezB9IC4uLgotVXBkYXRlUG9saWN5X2ludmFsaWRVUkw9aW52YWxpZCBVUkwgLQotVXBkYXRlUG9saWN5X25hbWVOb051bGw9IGNhbm5vdCBiZSBudWxsLgotVXBkYXRlUG9saWN5X1VwZGF0ZVBvbGljeT1VcGRhdGUgUG9saWN5OgotU2l0ZUZpbGVfZmVhdHVyZU5vdFJlbW92ZWQ9RmVhdHVyZSB7MH0gd2FzIG5vdCByZW1vdmVkCi1TaXRlRmlsZV9wbHVnaW5Ob3RSZW1vdmVkPVBsdWdpbiB7MH0gd2FzIG5vdCByZW1vdmVkCi1FcnJvclJlY292ZXJ5TG9nX25vRmlsZXRvUmVtb3ZlPVVuYWJsZSB0byBmaW5kIGZpbGUgdG8gcmVtb3ZlOgotVXBkYXRlc1NlYXJjaENhdGVnb3J5X2Vycm9yU2VhcmNoaW5nRm9yVXBkYXRlcz1FcnJvciB3aGlsZSBpbml0aWFsaXppbmcgdGhlIHNlYXJjaCBmb3IgbmV3IHVwZGF0ZXMKLVN0YW5kYWxvbmVfc2l0ZUNvbmZpZ3VyZWQ9U2l0ZSBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQ6Ci1TdGFuZGFsb25lX25vU2l0ZT1DYW5ub3QgZmluZCBzaXRlOgotU3RhbmRhbG9uZV9ub1NpdGUzPU5vIHNpdGUgc3BlY2lmaWVkCi1TdGFuZGFsb25lX25vQ29uZmlndXJlZFNpdGU9Q2Fubm90IGZpbmQgY29uZmlndXJlZCBzaXRlOgotU3RhbmRhbG9uZV9pbnN0YWxsaW5nPUluc3RhbGxpbmcgZmVhdHVyZQotU3RhbmRhbG9uZV9ub3RGb3VuZE9yTmV3ZXI9RmVhdHVyZSB7MH0gY2Fubm90IGJlIGZvdW5kIG9uIHsxfSBcbm9yIGEgbmV3ZXIgdmVyc2lvbiBpcyBhbHJlYWR5IGluc3RhbGxlZC4KLVN0YW5kYWxvbmVfZHVwbGljYXRlPUR1cGxpY2F0ZSBjb25mbGljdHMKLVN0YW5kYWxvbmVfaW5zdGFsbGVkPSBGZWF0dXJlIHswfSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gaW5zdGFsbGVkCi1TdGFuZGFsb25lX2Nhbm5vdEluc3RhbGw9Q2Fubm90IGluc3RhbGwgZmVhdHVyZQotU3RhbmRhbG9uZV9ub0ZlYXR1cmVzMT1UaGVyZSBhcmUgbm8gdW5jb25maWd1cmVkIGZlYXR1cmVzIHdpdGggaWQgezB9Ci1TdGFuZGFsb25lX25vRmVhdHVyZXMyPUNhbm5vdCBmaW5kIHVuY29uZmlndXJlZCBmZWF0dXJlICB7MH0gd2l0aCB2ZXJzaW9uIHsxfQotU3RhbmRhbG9uZV9ub0ZlYXR1cmVzMz1UaGVyZSBhcmUgbm8gY29uZmlndXJlZCBmZWF0dXJlcyB3aXRoIGlkIHswfQotU3RhbmRhbG9uZV9ub0ZlYXR1cmVzND1DYW5ub3QgZmluZCBjb25maWd1cmVkIGZlYXR1cmUgIHswfSB3aXRoIHZlcnNpb24gezF9Ci1TdGFuZGFsb25lX25vQ29uZmlnU2l0ZUZvckZlYXR1cmU9VGhlcmUgYXJlIG5vIGNvbmZpZ3VyZWQgc2l0ZXMgZm9yIGZlYXR1cmUgezB9Ci1TdGFuZGFsb25lX2ludmFsaWRDbWQ9SW52YWxpZCBjb21tYW5kOgotU3RhbmRhbG9uZV9jb25uZWN0aW9uID0gQ29ubmVjdGlvbiBlcnJvcgotU3RhbmRhbG9uZV9zZWFyY2hpbmcgPSBTZWFyY2hpbmcgb246Ci1TdGFuZGFsb25lX2NtZEZhaWxlZCA9IENvbW1hbmQgZmFpbGVkLiBQbGVhc2UgY2hlY2sgbG9nIGZpbGUgezB9IGZvciBkZXRhaWxzLgotU3RhbmRhbG9uZV9jbWRGYWlsZWROb0xvZyA9IENvbW1hbmQgZmFpbGVkLgotU3RhbmRhbG9uZV9jbWRDb21wbGV0ZVdpdGhFcnJvcnMgPSBDb21tYW5kIGNvbXBsZXRlZCB3aXRoIGVycm9ycy4gUGxlYXNlIGNoZWNrIGxvZyBmaWxlIHswfSBmb3IgZGV0YWlscy4KLVN0YW5kYWxvbmVfY21kT0sgPSBDb21tYW5kIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCi1TdGFuZGFsb25lX3VwZGF0aW5nID0gQmVnaW4gdXBkYXRpbmcKLVN0YW5kYWxvbmVfbm9VcGRhdGUgPSBGZWF0dXJlIHswfSBjYW5ub3QgYmUgdXBkYXRlZC4KLVN0YW5kYWxvbmVfdXBkYXRlZD0gRmVhdHVyZSB7MH0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIHVwZGF0ZWQuCi1TaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lcl91bmFibGVUb0RlbGV0ZT1VbmFibGUgdG8gZGVsZXRlIHswfQotU2l0ZUZpbGVQYWNrZWRQbHVnaW5Db250ZW50Q29uc3VtZXJfdW5hYmxlVG9EZWxldGU9VW5hYmxlIHRvIGRlbGV0ZSB7MH0KLQotSmFyUHJvY2Vzc29yX3VucGFja05vdEZvdW5kID0gVGhlIHVucGFjazIwMCBjb21tYW5kIGNhbm5vdCBiZSBmb3VuZC4KLUphclByb2Nlc3Nvcl9ub1BhY2tVbnBhY2sgPSBQYWNrLCByZXBhY2sgb3Igc2lnbiBjYW5ub3QgYmUgc3BlY2lmaWVkIHdpdGggdW5wYWNrLgotSmFyUHJvY2Vzc29yX3BhY2tOb3RGb3VuZCA9IFRoZSBwYWNrMjAwIGNvbW1hbmQgY2Fubm90IGJlIGZvdW5kLgotU2l0ZU9wdGltaXplcl9pbnB1dE5vdFNwZWNpZmllZCA9IE5vIGlucHV0IGZpbGUgd2FzIHNwZWNpZmllZDsKLVNpdGVPcHRpbWl6ZXJfaW5wdXRGaWxlTm90Rm91bmQgPSBUaGUgaW5wdXQgZmlsZSBcInswfVwiIHdhcyBub3QgZm91bmQuCi0KLUh0dHBSZXNwb25zZV9yYW5nZUV4cGVjdGVkID0gU2VydmVyIGRvZXMgbm90IHN1cHBvcnQgcmFuZ2VzLgotSHR0cFJlc3BvbnNlX3dyb25nUmFuZ2UgPSBTZXJ2ZXIgcmV0dXJuZWQgd3JvbmcgcmFuZ2UuCi1EZWZhdWx0U2l0ZVBhcnNlcl9taXJyb3JzID0gRXJyb3IgcHJvY2Vzc2luZyB1cGRhdGUgc2l0ZSBtaXJyb3IuCi1GZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcl9VbmFibGVUb1JldHJpdmVBcmNoaXZlQ29udGVudFJlZiA9IFVuYWJsZSB0byByZXRyaWV2ZSBhcmNoaXZlIGNvbnRlbnQgcmVmZXJlbmNlCi1TaXRlQ2F0ZWdvcnlfb3RoZXJfbGFiZWwgPSBPdGhlcgotU2l0ZUNhdGVnb3J5X290aGVyX2Rlc2NyaXB0aW9uID0gRmVhdHVyZXMgZm91bmQgdW5kZXIgdGhpcyBjYXRlZ29yeSBhcmUgZWl0aGVyIG5vdCBjYXRlZ29yaXplZCBvciB0aGVpciBjYXRlZ29yaWVzIGNvdWxkIG5vdCBiZSBmb3VuZCBvbiBzZXJ2ZXIuCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9taXJyb3IvTWlycm9yQ29tbWFuZC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbWlycm9yL01pcnJvckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIwMzljNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9taXJyb3IvTWlycm9yQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubWlycm9yOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW5WZXJzaW9uSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZUZlYXR1cmVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSmFyQ29udGVudFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlRmVhdHVyZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5WZXJzaW9uZWRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zdGFuZGFsb25lLlNjcmlwdGVkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc3RhbmRhbG9uZS5TdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb247Ci0KLS8qKgotICogTWlycm9ycyBhIHJlbW90ZSBzaXRlIGxvY2FsbHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBNaXJyb3JDb21tYW5kIGV4dGVuZHMgU2NyaXB0ZWRDb21tYW5kIHsKLQotCXByaXZhdGUgU3RyaW5nIGZlYXR1cmVJZDsKLQlwcml2YXRlIFN0cmluZyBmZWF0dXJlVmVyc2lvbjsKLQlwcml2YXRlIFN0cmluZyBmcm9tU2l0ZVVybDsKLQlwcml2YXRlIFN0cmluZyB0b1NpdGVEaXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbWlycm9yVVJMOwotCXByaXZhdGUgYm9vbGVhbiBpZ25vcmVOb25QcmVzZW50UGx1Z2lucyA9IGZhbHNlOwotCXByaXZhdGUgTWlycm9yU2l0ZSBtaXJyb3JTaXRlOwotCi0JcHVibGljIE1pcnJvckNvbW1hbmQoCi0JCVN0cmluZyBmZWF0dXJlSWQsCi0JCVN0cmluZyBmZWF0dXJlVmVyc2lvbiwKLQkJU3RyaW5nIGZyb21TaXRlVXJsLAotCQlTdHJpbmcgdG9TaXRlRGlyLAotCQlTdHJpbmcgbWlycm9yVXJsLCAKLQkJU3RyaW5nIGlnbm9yZU5vblByZXNlbnRQbHVnaW5zKSB7Ci0JCXRoaXMuZmVhdHVyZUlkID0gZmVhdHVyZUlkOwotCQl0aGlzLmZlYXR1cmVWZXJzaW9uID0gZmVhdHVyZVZlcnNpb247Ci0JCXRoaXMuZnJvbVNpdGVVcmwgPSBmcm9tU2l0ZVVybDsKLQkJdGhpcy50b1NpdGVEaXIgPSB0b1NpdGVEaXI7Ci0JCXRoaXMubWlycm9yVVJMID0gbWlycm9yVXJsOwotCQl0aGlzLmlnbm9yZU5vblByZXNlbnRQbHVnaW5zID0gKGlnbm9yZU5vblByZXNlbnRQbHVnaW5zICE9IG51bGwpICYmIChpZ25vcmVOb25QcmVzZW50UGx1Z2lucy5lcXVhbHMoInRydWUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiB0cnVlIGlmIHN1Y2Nlc3MKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmICghdmFsaWRhdGVQYXJhbWV0ZXJzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlpZiAoZ2V0TWlycm9yU2l0ZSgpID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlVUkwgcmVtb3RlU2l0ZVVybCA9IG5ldyBVUkwoZnJvbVNpdGVVcmwpOwotCQkJSVNpdGUgcmVtb3RlU2l0ZSA9Ci0JCQkJU2l0ZU1hbmFnZXIuZ2V0U2l0ZShyZW1vdGVTaXRlVXJsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWZlcmVuY2VzVG9NaXJyb3JbXSA9Ci0JCQkJZmluZEZlYXR1cmVzVG9NaXJyb3IocmVtb3RlU2l0ZSk7Ci0JCQlpZiAoZmVhdHVyZVJlZmVyZW5jZXNUb01pcnJvci5sZW5ndGggPT0gMCkgewotCQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCQlVcGRhdGVDb3JlLmxvZygKLQkJCQkJVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJCQkiTm8gbWF0Y2hpbmcgZmVhdHVyZXMgZm91bmQgb24gIiArIHJlbW90ZVNpdGVVcmwgKyAiLiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJbnVsbCkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJbWlycm9yU2l0ZS5taXJyb3JBbmRFeHBvc2UoCi0JCQkJcmVtb3RlU2l0ZSwKLQkJCQlmZWF0dXJlUmVmZXJlbmNlc1RvTWlycm9yLAotCQkJCW51bGwsCi0JCQkJbWlycm9yVVJMKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOwotCQkJVXBkYXRlQ29yZS5sb2coZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCVVwZGF0ZUNvcmUubG9nKGNlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBmaW5hbGx5IHsKLQkJCUphckNvbnRlbnRSZWZlcmVuY2Uuc2h1dGRvd24oKTsKLQkJfQotCX0KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVQYXJhbWV0ZXJzKCkgewotCQlpZiAoZnJvbVNpdGVVcmwgPT0gbnVsbCB8fCBmcm9tU2l0ZVVybC5sZW5ndGgoKSA8PSAwKSB7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQlVcGRhdGVDb3JlLmxvZygKLQkJCQlVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigiZnJvbSBwYXJhbWV0ZXIgaXMgbWlzc2luZy4iLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQl0cnkgewotCQkJbmV3IFVSTChmcm9tU2l0ZVVybCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpIHsKLQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCVVwZGF0ZUNvcmUubG9nKAotCQkJCVV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKCJmcm9tIG11c3QgYmUgYSB2YWxpZCBVUkwiLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAodG9TaXRlRGlyID09IG51bGwgfHwgdG9TaXRlRGlyLmxlbmd0aCgpIDw9IDApIHsKLQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCVVwZGF0ZUNvcmUubG9nKAotCQkJCVV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKCJ0byBwYXJhbWV0ZXIgaXMgbWlzc2luZy4iLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHJpdmF0ZSBNaXJyb3JTaXRlIGdldE1pcnJvclNpdGUoKQotCQl0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gQ3JlYXRlIG1pcnJvciBzaXRlCi0JCWlmIChtaXJyb3JTaXRlID09IG51bGwpIHsKLQkJCWlmICh0b1NpdGVEaXIgIT0gbnVsbCkgewotCQkJCU1pcnJvclNpdGVGYWN0b3J5IGZhY3RvcnkgPSBuZXcgTWlycm9yU2l0ZUZhY3RvcnkoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50KCJBbmFseXppbmcgZmVhdHVyZXMgYWxyZWFkeSBtaXJyb3JlZCAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRyeSB7Ci0JCQkJCW1pcnJvclNpdGUgPQotCQkJCQkJKE1pcnJvclNpdGUpIGZhY3RvcnkuY3JlYXRlU2l0ZShuZXcgRmlsZSh0b1NpdGVEaXIpKTsKLQkJCQkJbWlycm9yU2l0ZS5zZXRJZ25vcmVOb25QcmVzZW50UGx1Z2lucyhpZ25vcmVOb25QcmVzZW50UGx1Z2lucyk7Ci0JCQkJfSBjYXRjaCAoSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIGlzdGUpIHsKLQkJCQl9Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIERvbmUuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChtaXJyb3JTaXRlID09IG51bGwpIHsKLQkJCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQkJVXBkYXRlQ29yZS5sb2coCi0JCQkJCVV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJCQkJIk1pcnJvciBzaXRlIGF0ICIgKyB0b1NpdGVEaXIgKyAiIGNhbm5vdCBiZSBhY2Nlc3NlZC4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCW51bGwpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWlycm9yU2l0ZTsKLQotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHN1YnNldCBvZiBmZWF0dXJlIHJlZmVyZW5jZXMgb24gcmVtb3RlIHNpdGUKLQkgKiBhcyBzcGVjaWZpZWQgYnkgb3B0aW9uYWwgZmVhdHVyZUlkIGFuZCBmZWF0dXJlVmVyc2lvbgotCSAqIHBhcmFtZXRlcnMKLQkgKiBAcGFyYW0gcmVtb3RlU2l0ZQotCSAqIEByZXR1cm4gSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIElTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGZpbmRGZWF0dXJlc1RvTWlycm9yKElTaXRlIHJlbW90ZVNpdGUpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlbW90ZVNpdGVGZWF0dXJlUmVmZXJlbmNlc1tdID0KLQkJCXJlbW90ZVNpdGUuZ2V0UmF3RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBleGlzdGluZ0ZlYXR1cmVNb2RlbHNbXSA9Ci0JCQltaXJyb3JTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKTsKLQkJQ29sbGVjdGlvbiBmZWF0dXJlUmVmZXJlbmNlc1RvTWlycm9yID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIGZlYXR1cmVWZXJzaW9uSWRlbnRpZmllciA9IG51bGw7Ci0KLQkJaWYgKGZlYXR1cmVJZCA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQkJIlBhcmFtZXRlciBmZWF0dXJlIG5vdCBzcGVjaWZpZWQuICBBbGwgZmVhdHVyZXMgb24gdGhlIHJlbW90ZSBzaXRlIHdpbGwgYmUgbWlycm9yZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZmVhdHVyZVZlcnNpb24gPT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJCSJQYXJhbWV0ZXIgdmVyc2lvbiBub3Qgc3BlY2lmaWVkLiAgQWxsIHZlcnNpb25zIG9mIGZlYXR1cmVzIG9uIHRoZSByZW1vdGUgc2l0ZSB3aWxsIGJlIG1pcnJvcmVkLiIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlmZWF0dXJlVmVyc2lvbklkZW50aWZpZXIgPQotCQkJCW5ldyBQbHVnaW5WZXJzaW9uSWRlbnRpZmllcihmZWF0dXJlVmVyc2lvbik7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZW1vdGVTaXRlRmVhdHVyZVJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgcmVtb3RlRmVhdHVyZVZlcnNpb25lZElkZW50aWZpZXIgPQotCQkJCXJlbW90ZVNpdGVGZWF0dXJlUmVmZXJlbmNlc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0KLQkJCWlmIChmZWF0dXJlSWQgIT0gbnVsbAotCQkJCSYmICFmZWF0dXJlSWQuZXF1YWxzKAotCQkJCQlyZW1vdGVGZWF0dXJlVmVyc2lvbmVkSWRlbnRpZmllci5nZXRJZGVudGlmaWVyKCkpKSB7Ci0JCQkJLy8gaWQgZG9lcyBub3QgbWF0Y2gKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChmZWF0dXJlVmVyc2lvbklkZW50aWZpZXIgIT0gbnVsbAotCQkJCSYmICFmZWF0dXJlVmVyc2lvbklkZW50aWZpZXIuaXNQZXJmZWN0KAotCQkJCQlyZW1vdGVGZWF0dXJlVmVyc2lvbmVkSWRlbnRpZmllci5nZXRWZXJzaW9uKCkpKSB7Ci0JCQkJLy8gdmVyc2lvbiBkb2VzIG5vdCBtYXRjaAotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlmb3IgKGludCBlID0gMDsgZSA8IGV4aXN0aW5nRmVhdHVyZU1vZGVscy5sZW5ndGg7IGUrKykgewotCQkJCWlmIChleGlzdGluZ0ZlYXR1cmVNb2RlbHNbZV0KLQkJCQkJLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCQkuZXF1YWxzKHJlbW90ZUZlYXR1cmVWZXJzaW9uZWRJZGVudGlmaWVyKSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQkJCQkiRmVhdHVyZSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIHJlbW90ZUZlYXR1cmVWZXJzaW9uZWRJZGVudGlmaWVyCi0JCQkJCQkJKyAiIGFscmVhZHkgbWlycm9yZWQgYW5kIGV4cG9zZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8gZmVhdHVyZSBhbHJlYWR5IG1pcnJvcmVkIGFuZCBleHBvc2VkIGluIHNpdGUueG1sCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gQ2hlY2sgZmVhdHVyZSB0eXBlCi0JCQlTdHJpbmcgdHlwZSA9Ci0JCQkJKChTaXRlRmVhdHVyZVJlZmVyZW5jZSkgcmVtb3RlU2l0ZUZlYXR1cmVSZWZlcmVuY2VzW2ldKQotCQkJCQkuZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgIT0gbnVsbAotCQkJCSYmICFJU2l0ZS5ERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRS5lcXVhbHModHlwZSkpIHsKLQkJCQkvLyB1bnN1cHBvcnRlZAotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJCQkiRmVhdHVyZSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgcmVtb3RlRmVhdHVyZVZlcnNpb25lZElkZW50aWZpZXIKLQkJCQkJCSsgIiBpcyBvZiB0eXBlICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJKyB0eXBlCi0JCQkJCQkrICIuICBPbmx5IGZlYXR1cmVzIG9mIHR5cGUgIiAvLyROT04tTkxTLTEkCi0JCQkJCQkrIElTaXRlLkRFRkFVTFRfUEFDS0FHRURfRkVBVFVSRV9UWVBFCi0JCQkJCQkrICIgYXJlIHN1cHBvcnRlZC4iLCAvLyROT04tTkxTLTEkCi0JCQkJCW51bGwpOwotCQkJfQotCi0JCQlmZWF0dXJlUmVmZXJlbmNlc1RvTWlycm9yLmFkZChyZW1vdGVTaXRlRmVhdHVyZVJlZmVyZW5jZXNbaV0pOwotCQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJCSJGZWF0dXJlICIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIHJlbW90ZVNpdGVGZWF0dXJlUmVmZXJlbmNlc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkJKyAiIHdpbGwgYmUgbWlycm9yZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gKElTaXRlRmVhdHVyZVJlZmVyZW5jZVtdKSBmZWF0dXJlUmVmZXJlbmNlc1RvTWlycm9yLnRvQXJyYXkoCi0JCQluZXcgSVNpdGVGZWF0dXJlUmVmZXJlbmNlW2ZlYXR1cmVSZWZlcmVuY2VzVG9NaXJyb3Iuc2l6ZSgpXSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9taXJyb3IvTWlycm9yU2l0ZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbWlycm9yL01pcnJvclNpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M0MGZlMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9taXJyb3IvTWlycm9yU2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubWlycm9yOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkNvbnRlbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklOb25QbHVnaW5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGVGZWF0dXJlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklVUkxFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JVmVyaWZpY2F0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5WZXJzaW9uZWRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkNhdGVnb3J5TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuU2l0ZU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5VUkxFbnRyeU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkNvcmVFeGNlcHRpb25XaXRoUm9vdENhdXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkZhdGFsSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLklTaXRlQ29udGVudENvbnN1bWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zdGFuZGFsb25lLlN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbjsKLQotLyoqCi0gKiBMb2NhbCBtaXJyb3Igc2l0ZS4gIFJlYWQvV3JpdGUKLSAqLwotcHVibGljIGNsYXNzIE1pcnJvclNpdGUgZXh0ZW5kcyBTaXRlIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5ERU5UID0gIiAgICI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFNpdGVNb2RlbEZhY3RvcnkgZmFjdG9yeTsKLQkvKioKLQkgKiBwbHVnaW4gZW50cmllcyAKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gZG93bmxvYWRlZFBsdWdpbkVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGRvd25sb2FkZWRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgYm9vbGVhbiBpZ25vcmVOb25QcmVzZW50UGx1Z2luczsKLQlwdWJsaWMgTWlycm9yU2l0ZShTaXRlTW9kZWxGYWN0b3J5IGZhY3RvcnkpIHsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBNaXJyb3JzIHRoZSBzcGVjaWZpZWQgZmVhdHVyZXMgYW5kIGxpc3RlZCBvcHRpb25hbCBmZWF0dXJlcyBvbiB0aGlzIHNpdGUuCi0JICogQHNlZSBJU2l0ZSNpbnN0YWxsKElGZWF0dXJlLCBJVmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IpCi0JICogQHBhcmFtIG1pcnJvclNpdGVVcmwgZXh0ZXJuYWwgVVJMIG9mIHRoZSBtaXJyb3Igc2l0ZSBvciBudWxsOwotCSAqIGlmIHBhcmFtZXRlciBpcyBwcm92aWRlZCBwb2xpY3kgZnJhZ21lbnQgd2lsbCBiZSBnZW5lcmF0ZWQKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBtaXJyb3JBbmRFeHBvc2UoCi0JCUlTaXRlIHJlbW90ZVNpdGUsCi0JCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIHNvdXJjZUZlYXR1cmVSZWZzLAotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsZmVhdHVyZXMsCi0JCVN0cmluZyBtaXJyb3JTaXRlVXJsKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJbWlycm9yQW5kRXhwb3NlRmVhdHVyZXMoCi0JCQlyZW1vdGVTaXRlLAotCQkJc291cmNlRmVhdHVyZVJlZnMsCi0JCQlvcHRpb25hbGZlYXR1cmVzKTsKLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQkiSW5zdGFsbGluZyBmZWF0dXJlcyBmaW5pc2hlZC4gVXBkYXRpbmcgY2F0ZWdvcmllcyAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl1cGRhdGVDYXRlZ29yaWVzKHJlbW90ZVNpdGUpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQkiVXBkYXRpbmcgY2F0ZWdvcmllcyBmaW5pc2hlZC4gVXBkYXRpbmcgc2l0ZSBkZXNjcmlwdGlvbiAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl1cGRhdGVEZXNjcmlwdGlvbihyZW1vdGVTaXRlKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJIlVwZGF0aW5nIHNpdGUgZGVzY3JpcHRpb24gZmluaXNoZWQuIFNhdmluZyBzaXRlLnhtbCAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQlzYXZlKCk7Ci0JCWlmIChtaXJyb3JTaXRlVXJsICE9IG51bGwpIHsKLQkJCWdlbmVyYXRlVXBkYXRlUG9saWN5KG1pcnJvclNpdGVVcmwpOwotCQl9Ci0JfQotCXByaXZhdGUgdm9pZCBtaXJyb3JBbmRFeHBvc2VGZWF0dXJlcygKLQkJSVNpdGUgcmVtb3RlU2l0ZSwKLQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gc291cmNlRmVhdHVyZVJlZnMsCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxmZWF0dXJlcykKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCS8vIEZlYXR1cmVzIHRoYXQgZmFpbGVkIHdpbGwgYmUgcmV0cmllZCBvbmNlIGFnYWluCi0JCUNvbGxlY3Rpb24gZmFpbGVkRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlRmVhdHVyZVJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJSUZlYXR1cmUgc291cmNlRmVhdHVyZSA9Ci0JCQkJCXNvdXJjZUZlYXR1cmVSZWZzW2ldLmdldEZlYXR1cmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmZWF0dXJlUmVmID0KLQkJCQkJbWlycm9yRmVhdHVyZSgKLQkJCQkJCXJlbW90ZVNpdGUsCi0JCQkJCQlzb3VyY2VGZWF0dXJlLAotCQkJCQkJb3B0aW9uYWxmZWF0dXJlcywKLQkJCQkJCTEpOwotCQkJCS8vIFNldCBjYXRlZ29yaWVzIG9mIHRoZSBuZXcgZmVhdHVyZQotCQkJCUlDYXRlZ29yeSByZW1vdGVDYXRlZ29yaWVzW10gPQotCQkJCQlzb3VyY2VGZWF0dXJlUmVmc1tpXS5nZXRDYXRlZ29yaWVzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZW1vdGVDYXRlZ29yaWVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWZlYXR1cmVSZWYuYWRkQ2F0ZWdvcnlOYW1lKHJlbW90ZUNhdGVnb3JpZXNbal0uZ2V0TmFtZSgpKTsKLQkJCQl9Ci0KLQkJCQlhZGRGZWF0dXJlUmVmZXJlbmNlTW9kZWwocmVtb3RlU2l0ZSwgZmVhdHVyZVJlZik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJZmFpbGVkRmVhdHVyZXMuYWRkKHNvdXJjZUZlYXR1cmVSZWZzW2ldKTsKLQkJCX0KLQkJfQotCi0JCS8vIGRvIHdlIG5lZWQgdG8gcmV0cnk/Ci0JCWlmIChmYWlsZWRGZWF0dXJlcy5zaXplKCkgPiAwKSB7Ci0JCQlzb3VyY2VGZWF0dXJlUmVmcyA9Ci0JCQkJKElTaXRlRmVhdHVyZVJlZmVyZW5jZVtdKSBmYWlsZWRGZWF0dXJlcy50b0FycmF5KAotCQkJCQluZXcgSVNpdGVGZWF0dXJlUmVmZXJlbmNlW2ZhaWxlZEZlYXR1cmVzLnNpemUoKV0pOwotCQl9IGVsc2UgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VGZWF0dXJlUmVmcy5sZW5ndGg7IGkrKykgewotCQkJSUZlYXR1cmUgc291cmNlRmVhdHVyZSA9Ci0JCQkJc291cmNlRmVhdHVyZVJlZnNbaV0uZ2V0RmVhdHVyZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCVNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZVJlZiA9Ci0JCQkJbWlycm9yRmVhdHVyZShyZW1vdGVTaXRlLCBzb3VyY2VGZWF0dXJlLCBvcHRpb25hbGZlYXR1cmVzLCAxKTsKLQkJCS8vIFNldCBjYXRlZ29yaWVzIG9mIHRoZSBuZXcgZmVhdHVyZQotCQkJSUNhdGVnb3J5IHJlbW90ZUNhdGVnb3JpZXNbXSA9IHNvdXJjZUZlYXR1cmVSZWZzW2ldLmdldENhdGVnb3JpZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVtb3RlQ2F0ZWdvcmllcy5sZW5ndGg7IGorKykgewotCQkJCWZlYXR1cmVSZWYuYWRkQ2F0ZWdvcnlOYW1lKHJlbW90ZUNhdGVnb3JpZXNbal0uZ2V0TmFtZSgpKTsKLQkJCX0KLQotCQkJYWRkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKHJlbW90ZVNpdGUsIGZlYXR1cmVSZWYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zdGFsbCB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgYW5kIGxpc3RlZCBvcHRpb25hbCBmZWF0dXJlcyBvbiB0aGlzIHNpdGUuCi0JICogQHNlZSBJU2l0ZSNpbnN0YWxsKElGZWF0dXJlLCBJVmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IpCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIG1pcnJvckZlYXR1cmUoCi0JCUlTaXRlIHJlbW90ZVNpdGUsCi0JCUlGZWF0dXJlIHNvdXJjZUZlYXR1cmUsCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxmZWF0dXJlcywKLQkJaW50IGluZGVudCkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgdGFiID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykKLQkJCXRhYiArPSAiICI7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJdGFiCi0JCQkJKyAiTWlycm9yaW5nIGZlYXR1cmUgIiAvLyROT04tTkxTLTEkCi0JCQkJKyBzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCSsgIiAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGV4aXN0aW5nRmVhdHVyZXNbXSA9Ci0JCQlnZXREb3dubG9hZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOwotCQlmb3IgKGludCBlID0gMDsgZSA8IGV4aXN0aW5nRmVhdHVyZXMubGVuZ3RoOyBlKyspIHsKLQkJCWlmIChleGlzdGluZ0ZlYXR1cmVzW2VdCi0JCQkJLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCS5lcXVhbHMoc291cmNlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJCQl0YWIKLQkJCQkJCSsgIkZlYXR1cmUgIiAvLyROT04tTkxTLTEkCi0JCQkJCQkrIHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJCQkrICIgYWxyZWFkeSBleGlzdHMuICBTa2lwcGluZyBkb3dubG9hZGluZy4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBleGlzdGluZ0ZlYXR1cmVzW2VdOwotCQkJfQotCQl9Ci0KLQkJZmluYWwgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPQotCQkJc291cmNlRmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCk7Ci0JCQotCQkvLyBUT0RPOiBwYXNzaW5nIGNvbW1hbmQgb3B0aW9ucyBjb3VsZCBiZSBtYWRlIG1vcmUgZ2VuZXJhbCBpbiBmdXR1cmUsIHNvIHRoaXMgCi0JCS8vIGNhc3QgaXMgbm90IG5lZWRlZC4gCi0JCWlmIChwcm92aWRlciBpbnN0YW5jZW9mIEZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlcikgewotCQkJKChGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIpIHByb3ZpZGVyKS5zZXRDb250aW51ZU9uRXJyb3IoaWdub3JlTm9uUHJlc2VudFBsdWdpbnMpOwotCQl9Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQl0YWIKLQkJCQkrICJHZXR0aW5nIHBsdWdpbiBlbnRyaWVzIGZvciAiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJKyAiIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIElQbHVnaW5FbnRyeVtdIHNvdXJjZUZlYXR1cmVQbHVnaW5FbnRyaWVzID0KLQkJCXNvdXJjZUZlYXR1cmUuZ2V0UmF3UGx1Z2luRW50cmllcygpOwotCi0JCS8vIGRldGVybWluZSBsaXN0IG9mIHBsdWdpbnMgdG8gaW5zdGFsbAotCQkvLyBmaW5kIHRoZSBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0aGUgcGx1Z2luIGVudHJpZXMgYWxyZWFkeSBjb250YWluZWQKLQkJLy8gb24gdGhlIHRhcmdldCBzaXRlLCBhbmQgcGx1Z2luIGVudHJpZXMgcGFja2FnZWQgaW4gc291cmNlIGZlYXR1cmUKLQotCQlJUGx1Z2luRW50cnlbXSBwbHVnaW5zVG9JbnN0YWxsID0KLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5kaWZmKAotCQkJCXNvdXJjZUZlYXR1cmVQbHVnaW5FbnRyaWVzLAotCQkJCWdldERvd25sb2FkZWRQbHVnaW5FbnRyaWVzKCkpOwotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCXRhYgotCQkJCSsgIkdldHRpbmcgbm9uIHBsdWdpbiBlbnRyaWVzIGZvciAiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJKyAiIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIElOb25QbHVnaW5FbnRyeVtdIG5vblBsdWdpbnNUb0luc3RhbGwgPQotCQkJc291cmNlRmVhdHVyZS5nZXRSYXdOb25QbHVnaW5FbnRyaWVzKCk7Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJdGFiCi0JCQkJKyAiR2V0dGluZyBpbmNsdWRlZCBmZWF0dXJlcyBmb3IgIiAvLyROT04tTkxTLTEkCi0JCQkJKyBzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCSsgIiAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0KLQkJCXNvdXJjZUZlYXR1cmUuZ2V0UmF3SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlpZiAob3B0aW9uYWxmZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9Ci0JCQkJVXBkYXRlTWFuYWdlclV0aWxzLm9wdGlvbmFsQ2hpbGRyZW5Ub0luc3RhbGwoCi0JCQkJCWNoaWxkcmVuLAotCQkJCQlvcHRpb25hbGZlYXR1cmVzKTsKLQkJfQotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCXRhYgotCQkJCSsgIkRvd25sb2FkaW5nIGZlYXR1cmUgYXJjaGl2ZXMgZm9yICIgLy8kTk9OLU5MUy0xJAotCQkJCSsgc291cmNlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkrICIgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gZG93bmxvYWQgZmVhdHVyZSBhcmNoaXZlcwotCQlwcm92aWRlci5nZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhudWxsKTsKLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQl0YWIKLQkJCQkrICJEb3dubG9hZGluZyBwbHVnLWluIGFyY2hpdmVzIGZvciAiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJKyAiIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCS8vIGRvd25sb2FkIHBsdWdpbiBhcmNoaXZlcwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbnNUb0luc3RhbGwubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJcHJvdmlkZXIuZ2V0UGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhwbHVnaW5zVG9JbnN0YWxsW2ldLCBudWxsKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlpZiAoIGlnbm9yZU5vblByZXNlbnRQbHVnaW5zICYmIAotCQkJCQkJKGNlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbldpdGhSb290Q2F1c2UpICYmCi0JCQkJCQkoKChDb3JlRXhjZXB0aW9uV2l0aFJvb3RDYXVzZSljZSkuZ2V0Um9vdEV4Y2VwdGlvbigpICE9IG51bGwpICYmIAotCQkJCQkJKCgoQ29yZUV4Y2VwdGlvbldpdGhSb290Q2F1c2UpY2UpLmdldFJvb3RFeGNlcHRpb24oKSBpbnN0YW5jZW9mIEZhdGFsSU9FeGNlcHRpb24pICkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBtaXJyb3IgcGx1Zy1pbiAiICsgcGx1Z2luc1RvSW5zdGFsbFtpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSArICIuIEl0IGRvZXMgbm90IGV4aXN0IG9uIHRoZSBnaXZlbiBzaXRlIik7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IGNlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCXRhYgotCQkJCSsgIkRvd25sb2FkaW5nIG5vbiBwbHVnLWluIGFyY2hpdmVzIGZvciAiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJKyAiIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCS8vIGRvd25sb2FkIG5vbi1wbHVnaW4gYXJjaGl2ZXMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub25QbHVnaW5zVG9JbnN0YWxsLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm92aWRlci5nZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKAotCQkJCW5vblBsdWdpbnNUb0luc3RhbGxbaV0sCi0JCQkJbnVsbCk7Ci0JCX0KLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQl0YWIKLQkJCQkrICJJbnN0YWxsaW5nIGNoaWxkIGZlYXR1cmVzIGZvciAiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJKyAiIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCS8vIGluc3RhbGwgY2hpbGQgZmVhdHVyZXMgZmlyc3QKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJSUZlYXR1cmUgY2hpbGRGZWF0dXJlID0gY2hpbGRyZW5baV0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCW1pcnJvckZlYXR1cmUoCi0JCQkJcmVtb3RlU2l0ZSwKLQkJCQljaGlsZEZlYXR1cmUsCi0JCQkJb3B0aW9uYWxmZWF0dXJlcywKLQkJCQlpbmRlbnQgKyAxKTsKLQkJfQotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCXRhYgotCQkJCSsgIlN0b3JpbmcgcGx1Zy1pbiBhcmNoaXZlcyBmb3IgIiAvLyROT04tTkxTLTEkCi0JCQkJKyBzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCSsgIiAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBzdG9yZSBwbHVnaW5zJyBhcmNoaXZlcwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbnNUb0luc3RhbGwubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJQ29udGVudFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBwcm92aWRlci5nZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKCBwbHVnaW5zVG9JbnN0YWxsW2ldLCBudWxsKTsKLQkJCQlzdG9yZVBsdWdpbkFyY2hpdmUocmVmZXJlbmNlc1swXSk7Ci0JCQkJYWRkRG93bmxvYWRlZFBsdWdpbkVudHJ5KHBsdWdpbnNUb0luc3RhbGxbaV0pOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCWlmICggaWdub3JlTm9uUHJlc2VudFBsdWdpbnMgJiYgCi0JCQkJCQkoY2UgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uV2l0aFJvb3RDYXVzZSkgJiYKLQkJCQkJCSgoKENvcmVFeGNlcHRpb25XaXRoUm9vdENhdXNlKWNlKS5nZXRSb290RXhjZXB0aW9uKCkgIT0gbnVsbCkgJiYgCi0JCQkJCQkoKChDb3JlRXhjZXB0aW9uV2l0aFJvb3RDYXVzZSljZSkuZ2V0Um9vdEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgRmF0YWxJT0V4Y2VwdGlvbikgKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IHdyaXRlIHBsdWctaW4gIiArIHBsdWdpbnNUb0luc3RhbGxbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkgKyAiLiBJdCBkb2VzIG5vdCBleGlzdCBvbiB0aGUgZ2l2ZW4gc2l0ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9IGVsc2UgewotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiaWdub3JlTm9uUHJlc2VudFBsdWdpbnM6IitpZ25vcmVOb25QcmVzZW50UGx1Z2lucyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdGhyb3cgY2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJdGFiCi0JCQkJKyAiU3RvcmluZyBub24gcGx1Zy1pbiBhcmNoaXZlcyBmb3IgIiAvLyROT04tTkxTLTEkCi0JCQkJKyBzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCSsgIiAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBzdG9yZSBub24gcGx1Z2lucycgYXJjaGl2ZXMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub25QbHVnaW5zVG9JbnN0YWxsLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb250ZW50UmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9Ci0JCQkJcHJvdmlkZXIuZ2V0Tm9uUGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcygKLQkJCQkJbm9uUGx1Z2luc1RvSW5zdGFsbFtpXSwKLQkJCQkJbnVsbCk7Ci0JCQlmb3IgKGludCByID0gMDsgciA8IHJlZmVyZW5jZXMubGVuZ3RoOyByKyspIHsKLQkJCQlzdG9yZU5vblBsdWdpbkFyY2hpdmUoCi0JCQkJCXNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLAotCQkJCQlyZWZlcmVuY2VzW3JdKTsKLQkJCX0KLQkJfQotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCXRhYgotCQkJCSsgIlN0b3JpbmcgZmVhdHVyZSBhcmNoaXZlcyBmb3IgIiAvLyROT04tTkxTLTEkCi0JCQkJKyBzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCSsgIiAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBzdG9yZSBmZWF0dXJlIGFyY2hpdmUKLQkJQ29udGVudFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPQotCQkJcHJvdmlkZXIuZ2V0RmVhdHVyZUVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMobnVsbCk7Ci0JCXN0b3JlRmVhdHVyZUFyY2hpdmUocmVmZXJlbmNlc1swXSk7Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJdGFiCi0JCQkJKyAiQWRkaW5nIGZlYXR1cmUgIiAvLyROT04tTkxTLTEkCi0JCQkJKyBzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCSsgIiB0byBtb2RlbCAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGFkZCBmZWF0dXJlIG1vZGVsIHRvIHNpdGUgbW9kZWwKLQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmZWF0dXJlUmVmID0KLQkJCWZhY3RvcnkuY3JlYXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKCk7Ci0JCWZlYXR1cmVSZWYuc2V0U2l0ZU1vZGVsKHRoaXMpOwotCQkvL2ZlYXR1cmVSZWYuc2V0VVJMU3RyaW5nKGZlYXR1cmVVUkwudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCWZlYXR1cmVSZWYuc2V0VHlwZShJU2l0ZS5ERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRSk7Ci0JCWZlYXR1cmVSZWYuc2V0RmVhdHVyZUlkZW50aWZpZXIoCi0JCQlzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkpOwotCQlmZWF0dXJlUmVmLnNldEZlYXR1cmVWZXJzaW9uKAotCQkJc291cmNlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkpOwotCQlhZGREb3dubG9hZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKGZlYXR1cmVSZWYpOwotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCXRhYgotCQkJCSsgIk1pcnJvcmluZyBmZWF0dXJlICIgLy8kTk9OLU5MUy0xJAotCQkJCSsgc291cmNlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkrICIgZmluaXNoZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGZlYXR1cmVSZWY7Ci0KLQl9Ci0JLyoqCi0JICogQWRkcyBhIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsIHRvIHRoaXMgc2l0ZSwKLQkgKiBhbmQgZXhwb3NlcyBpbiBzaXRlLnhtbCBpZiByZW1vdGUgc2l0ZSBleHBvc2VzIGdpdmVuIGZlYXR1cmUuCi0JICovCi0JcHVibGljIHZvaWQgYWRkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKAotCQlJU2l0ZSByZW1vdGVTaXRlLAotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmVSZWZlcmVuY2UpIHsKLQkJLy8gY2hlY2sgaWYgcmVtb3RlIHNpdGUgZXhwb3NlcyB0aGlzIGZlYXR1cmUKLQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlbW90ZUZlYXR1cmVzW10gPQotCQkJcmVtb3RlU2l0ZS5nZXRSYXdGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlbW90ZUZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVtb3RlRmVhdHVyZVJlZiA9IHJlbW90ZUZlYXR1cmVzW2ldOwotCQkJdHJ5IHsKLQkJCQlpZiAocmVtb3RlRmVhdHVyZVJlZgotCQkJCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJCS5lcXVhbHMoZmVhdHVyZVJlZmVyZW5jZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKSB7Ci0JCQkJCWFkZEZlYXR1cmVSZWZlcmVuY2VNb2RlbChmZWF0dXJlUmVmZXJlbmNlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOwotCQkJCVVwZGF0ZUNvcmUubG9nKGNlKTsKLQkJCX0KLQkJfQotCQlzYXZlKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCSJGZWF0dXJlICIgLy8kTk9OLU5MUy0xJAotCQkJCSsgZmVhdHVyZVJlZmVyZW5jZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkrICIgYWRkZWQgdG8gc2l0ZS54bWwuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyoqCi0JICogQWRkcyBmZWF0dXJlIG1vZGVsIHRvIHNpdGUgbW9kZWwsIHJlbW92aW5nIG9sZCBmZWF0dXJlCi0JICovCi0JcHVibGljIHZvaWQgYWRkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZVJlZmVyZW5jZSkgewotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gZXhpc3RpbmdNb2RlbHMgPQotCQkJZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGV4aXN0aW5nTW9kZWxzLmxlbmd0aDsgaisrKSB7Ci0JCQlpZiAoZXhpc3RpbmdNb2RlbHNbal0KLQkJCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJLmVxdWFscyhmZWF0dXJlUmVmZXJlbmNlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpIHsKLQkJCQlzdXBlci5yZW1vdmVGZWF0dXJlUmVmZXJlbmNlTW9kZWwoZXhpc3RpbmdNb2RlbHNbal0pOwotCQkJfQotCQl9Ci0JCXN1cGVyLmFkZEZlYXR1cmVSZWZlcmVuY2VNb2RlbChmZWF0dXJlUmVmZXJlbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElTaXRlQ29udGVudENvbnN1bWVyI3N0b3JlKENvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlRmVhdHVyZUFyY2hpdmUoQ29udGVudFJlZmVyZW5jZSBjb250ZW50UmVmZXJlbmNlKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKLQkJU3RyaW5nIGZlYXR1cmVQYXRoID0gbnVsbDsKLQotCQl0cnkgewotCQkJVVJMIG5ld1VSTCA9Ci0JCQkJbmV3IFVSTCgKLQkJCQkJdGhpcy5nZXRVUkwoKSwKLQkJCQkJU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgKLQkJCQkJCSsgY29udGVudFJlZmVyZW5jZS5nZXRJZGVudGlmaWVyKCkKLQkJCQkJCSsgIi5qYXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJZmVhdHVyZVBhdGggPSBuZXdVUkwuZ2V0RmlsZSgpOwotCQkJaW5TdHJlYW0gPSBjb250ZW50UmVmZXJlbmNlLmdldElucHV0U3RyZWFtKCk7Ci0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMuY29weVRvTG9jYWwoaW5TdHJlYW0sIGZlYXR1cmVQYXRoLCBudWxsKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJIkVycm9yIG9jY3VycmVkIHdoaWxlIGNyZWF0aW5nICIrIGZlYXR1cmVQYXRoKyIgZmlsZS4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQllKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpblN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW5TdHJlYW0uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0JLyoqCi0JKiBAc2VlIElTaXRlQ29udGVudENvbnN1bWVyI3N0b3JlKENvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IpCi0JKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVQbHVnaW5BcmNoaXZlKENvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZmVyZW5jZSkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKLQkJU3RyaW5nIHBsdWdpblBhdGggPSBudWxsOwotCQl0cnkgewotCQkJVVJMIG5ld1VSTCA9IG5ldyBVUkwoZ2V0VVJMKCksIGNvbnRlbnRSZWZlcmVuY2UuZ2V0SWRlbnRpZmllcigpKTsKLQkJCXBsdWdpblBhdGggPSBuZXdVUkwuZ2V0RmlsZSgpOwotCQkJaW5TdHJlYW0gPSBjb250ZW50UmVmZXJlbmNlLmdldElucHV0U3RyZWFtKCk7Ci0JCQkvLyBhZGRlZCBudWxsIGNoZWNrIGhlcmUsICBzaW5jZSBjb250ZW50UmVmZXJlbmNlIGNhbiwgaW4gdGhlb3J5LCByZXR1cm4gbnVsbCBmb3IgaW5wdXQgc3RyZWFtLiAKLQkJCWlmIChpblN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJVXBkYXRlTWFuYWdlclV0aWxzLmNvcHlUb0xvY2FsKGluU3RyZWFtLCBwbHVnaW5QYXRoLCBudWxsKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkiRXJyb3Igb2NjdXJyZWQgd2hpbGUgY3JlYXRpbmcgIisgcGx1Z2luUGF0aCsiIGZpbGUuIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW5TdHJlYW0gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWluU3RyZWFtLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9yZU5vblBsdWdpbkFyY2hpdmUoCi0JCVZlcnNpb25lZElkZW50aWZpZXIgZmVhdHVyZVZlcnNpb25lZElkZW50aWZpZXIsCi0JCUNvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZmVyZW5jZSkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKLQkJRmlsZSBub25QbHVnaW5BcmNoaXZlUGF0aCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlVUkwgbmV3RGlyVVJMID0KLQkJCQluZXcgVVJMKAotCQkJCQlnZXRVUkwoKSwKLQkJCQkJU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgKLQkJCQkJCSsgIi8iIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgZmVhdHVyZVZlcnNpb25lZElkZW50aWZpZXIpOwotCQkJRmlsZSBkaXIgPSBuZXcgRmlsZShuZXdEaXJVUkwuZ2V0RmlsZSgpKTsKLQkJCWRpci5ta2RpcnMoKTsKLQkJCWluU3RyZWFtID0gY29udGVudFJlZmVyZW5jZS5nZXRJbnB1dFN0cmVhbSgpOwotCQkJbm9uUGx1Z2luQXJjaGl2ZVBhdGggPQotCQkJCW5ldyBGaWxlKGRpciwgY29udGVudFJlZmVyZW5jZS5nZXRJZGVudGlmaWVyKCkpOwotCQkJVXBkYXRlTWFuYWdlclV0aWxzLmNvcHlUb0xvY2FsKAotCQkJCWluU3RyZWFtLAotCQkJCW5vblBsdWdpbkFyY2hpdmVQYXRoLmdldEFic29sdXRlUGF0aCgpLAotCQkJCW51bGwpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCSJFcnJvciBvY2N1cnJlZCB3aGlsZSBjcmVhdGluZyAiKyBub25QbHVnaW5BcmNoaXZlUGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSsiIGZpbGUuIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQksZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW5TdHJlYW0gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWluU3RyZWFtLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlKCkgewotCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlVUkwgc2l0ZVVSTCA9IG5ldyBVUkwodGhpcy5nZXRVUkwoKSwgInNpdGUueG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5ldyBGaWxlKHNpdGVVUkwuZ2V0RmlsZSgpKSk7Ci0JCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0V3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihmb3MsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQlQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIob3V0V3JpdGVyKTsKLQkJCXNhdmUod3JpdGVyKTsKLQkJCXdyaXRlci5mbHVzaCgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCVVwZGF0ZUNvcmUubG9nKAotCQkJCVV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJCQkiU2l0ZSBYTUwgY291bGQgbm90IGJlIHNhdmVkLiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJaW9lKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZm9zICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlmb3MuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UyKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXByaXZhdGUgdm9pZCBzYXZlKFByaW50V3JpdGVyIHdyaXRlcikgewotCQl3cml0ZXIucHJpbnRsbigiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJLy93cml0ZXIucHJpbnRsbigiPCFET0NUWVBFIHNpdGUgU1lTVEVNIFwiZHRkL3NpdGUuZHRkXCI+Iik7Ci0JCXdyaXRlU2l0ZSgiIiwgd3JpdGVyKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZVNpdGUoU3RyaW5nIGluZGVudCwgUHJpbnRXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlci5wcmludChpbmRlbnQgKyAiPHNpdGUiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgaW5kZW50MiA9IGluZGVudCArIElOREVOVDsKLQkJLy8gZGVmYXVsdCB0eXBlCi0JCS8vd3JpdGVJZkRlZmluZWQoaW5kZW50YSwgd3JpdGVyLCAidHlwZSIsIGdldFR5cGUoKSk7Ci0JCS8vIHN0b3JlZCByZWxhdGl2ZSB0byBzaXRlLnhtbAotCQkvL3dyaXRlSWZEZWZpbmVkKGluZGVudGEsIHdyaXRlciwgInVybCIsIGdldFVSTCgpKTsKLQkJd3JpdGVyLnByaW50bG4oIj4iKTsgLy8kTk9OLU5MUy0xJAotCQlVUkxFbnRyeU1vZGVsIGRlc2NyaXB0aW9uID0gZ2V0RGVzY3JpcHRpb25Nb2RlbCgpOwotCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJd3JpdGVyLnByaW50bG4oKTsKLQkJCXdyaXRlRGVzY3JpcHRpb24oaW5kZW50Miwgd3JpdGVyLCBkZXNjcmlwdGlvbik7Ci0JCQl3cml0ZXIucHJpbnRsbigpOwotCQl9Ci0JCXdyaXRlRmVhdHVyZXMoaW5kZW50Miwgd3JpdGVyKTsKLQkJd3JpdGVDYXRlZ29yaWVzKGluZGVudDIsIHdyaXRlcik7Ci0JCXdyaXRlci5wcmludGxuKGluZGVudCArICI8L3NpdGU+Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHJpdmF0ZSB2b2lkIHdyaXRlRmVhdHVyZXMoU3RyaW5nIGluZGVudCwgUHJpbnRXcml0ZXIgd3JpdGVyKSB7Ci0JCVNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBmZWF0dXJlUmVmZXJlbmNlTW9kZWxzID0KLQkJCWdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlUmVmZXJlbmNlTW9kZWxzLmxlbmd0aDsgaSsrKSB7Ci0JCQl3cml0ZXIucHJpbnQoaW5kZW50KTsKLQkJCXdyaXRlci5wcmludCgiPGZlYXR1cmUiKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLnByaW50KAotCQkJCSIgdXJsPVwiZmVhdHVyZXMvIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgZmVhdHVyZVJlZmVyZW5jZU1vZGVsc1tpXS5nZXRGZWF0dXJlSWRlbnRpZmllcigpCi0JCQkJCSsgIl8iIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBmZWF0dXJlUmVmZXJlbmNlTW9kZWxzW2ldLmdldEZlYXR1cmVWZXJzaW9uKCkKLQkJCQkJKyAiLmphclwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci5wcmludCgKLQkJCQkiIGlkPVwiIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgZmVhdHVyZVJlZmVyZW5jZU1vZGVsc1tpXS5nZXRGZWF0dXJlSWRlbnRpZmllcigpCi0JCQkJCSsgIlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci5wcmludCgKLQkJCQkiIHZlcnNpb249XCIiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBmZWF0dXJlUmVmZXJlbmNlTW9kZWxzW2ldLmdldEZlYXR1cmVWZXJzaW9uKCkKLQkJCQkJKyAiXCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLnByaW50bG4oIj4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlTdHJpbmdbXSBjYXRlZ29yeU5hbWVzID0KLQkJCQlmZWF0dXJlUmVmZXJlbmNlTW9kZWxzW2ldLmdldENhdGVnb3J5TmFtZXMoKTsKLQkJCWZvciAoaW50IGNuID0gMDsgY24gPCBjYXRlZ29yeU5hbWVzLmxlbmd0aDsgY24rKykgewotCQkJCXdyaXRlci5wcmludChpbmRlbnQgKyBJTkRFTlQpOwotCQkJCXdyaXRlci5wcmludGxuKAotCQkJCQkiPGNhdGVnb3J5IG5hbWU9XCIiICsgY2F0ZWdvcnlOYW1lc1tjbl0gKyAiXCIgLz4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCX0KLQotCQkJd3JpdGVyLnByaW50KGluZGVudCk7Ci0JCQl3cml0ZXIucHJpbnRsbigiPC9mZWF0dXJlPiIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIucHJpbnRsbigpOwotCQl9Ci0JfQotCXByaXZhdGUgdm9pZCB3cml0ZUNhdGVnb3JpZXMoU3RyaW5nIGluZGVudCwgUHJpbnRXcml0ZXIgd3JpdGVyKSB7Ci0JCUNhdGVnb3J5TW9kZWxbXSBjYXRlZ29yeU1vZGVscyA9IGdldENhdGVnb3J5TW9kZWxzKCk7Ci0JCWlmIChjYXRlZ29yeU1vZGVscy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2F0ZWdvcnlNb2RlbHMubGVuZ3RoOyBpKyspIHsKLQkJCXdyaXRlci5wcmludChpbmRlbnQpOwotCQkJd3JpdGVyLnByaW50KCI8Y2F0ZWdvcnktZGVmIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci5wcmludCgKLQkJCQkiIG5hbWU9XCIiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBjYXRlZ29yeU1vZGVsc1tpXS5nZXROYW1lKCkKLQkJCQkJKyAiXCIgbGFiZWw9XCIiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBjYXRlZ29yeU1vZGVsc1tpXS5nZXRMYWJlbCgpCi0JCQkJCSsgIlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci5wcmludGxuKCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChjYXRlZ29yeU1vZGVsc1tpXS5nZXREZXNjcmlwdGlvbk1vZGVsKCkgIT0gbnVsbCkgewotCQkJCXdyaXRlRGVzY3JpcHRpb24oCi0JCQkJCQlpbmRlbnQgKyBJTkRFTlQsCi0JCQkJCQl3cml0ZXIsCi0JCQkJCQljYXRlZ29yeU1vZGVsc1tpXS5nZXREZXNjcmlwdGlvbk1vZGVsKCkpOwotCQkJfQotCQkJd3JpdGVyLnByaW50KGluZGVudCk7Ci0JCQl3cml0ZXIucHJpbnRsbigiPC9jYXRlZ29yeS1kZWY+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci5wcmludGxuKCk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIHdyaXRlRGVzY3JpcHRpb24oCi0JCVN0cmluZyBpbmRlbnQsCi0JCVByaW50V3JpdGVyIHdyaXRlciwKLQkJVVJMRW50cnlNb2RlbCB1cmxFbnRyeU1vZGVsKSB7Ci0JCVN0cmluZyB1cmwgPSB1cmxFbnRyeU1vZGVsLmdldFVSTFN0cmluZygpOwotCQlTdHJpbmcgdGV4dCA9IHVybEVudHJ5TW9kZWwuZ2V0QW5ub3RhdGlvbk5vbkxvY2FsaXplZCgpOwotCQl3cml0ZXIucHJpbnQoaW5kZW50KTsKLQkJd3JpdGVyLnByaW50KCI8ZGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodXJsICE9IG51bGwpCi0JCQl3cml0ZXIucHJpbnQoIiB1cmw9XCIiICsgdXJsICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPD0gMCkgewotCQkJd3JpdGVyLnByaW50bG4oIiAvPiIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQl3cml0ZXIucHJpbnRsbigiPiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLnByaW50bG4oCi0JCQkJCWluZGVudCArIElOREVOVCArIFVwZGF0ZU1hbmFnZXJVdGlscy54bWxTYWZlKHRleHQpKTsKLQkJCX0KLQkJCXdyaXRlci5wcmludGxuKGluZGVudCArICI8L2Rlc2NyaXB0aW9uPiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JLyoqCi0JICogQWRkcyBhIHBsdWdpbiBlbnRyeSAKLQkgKiBFaXRoZXIgZnJvbSBwYXJzaW5nIHRoZSBmaWxlIHN5c3RlbSBvciAKLQkgKiBpbnN0YWxsaW5nIGEgZmVhdHVyZQotCSAqIAotCSAqIFdlIGNhbm5vdCBmaWd1cmUgb3V0IHRoZSBsaXN0IG9mIHBsdWdpbnMgYnkgcmVhZGluZyB0aGUgU2l0ZS54bWwgYXMKLQkgKiB0aGUgYXJjaGl2ZXMgdGFnIGFyZSBvcHRpb25hbHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREb3dubG9hZGVkUGx1Z2luRW50cnkoSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5KSB7Ci0JCWRvd25sb2FkZWRQbHVnaW5FbnRyaWVzLmFkZChwbHVnaW5FbnRyeSk7Ci0JfQotCi0JcHJpdmF0ZSBJUGx1Z2luRW50cnlbXSBnZXREb3dubG9hZGVkUGx1Z2luRW50cmllcygpIHsKLQkJcmV0dXJuIChJUGx1Z2luRW50cnlbXSkgZG93bmxvYWRlZFBsdWdpbkVudHJpZXMudG9BcnJheSgKLQkJCW5ldyBJUGx1Z2luRW50cnlbZG93bmxvYWRlZFBsdWdpbkVudHJpZXMuc2l6ZSgpXSk7Ci0JfQotCS8qKgotCSAqIEFkZHMgYSBwbHVnaW4gZW50cnkgCi0JICogRWl0aGVyIGZyb20gcGFyc2luZyB0aGUgZmlsZSBzeXN0ZW0gb3IgCi0JICogaW5zdGFsbGluZyBhIGZlYXR1cmUKLQkgKiAKLQkgKiBXZSBjYW5ub3QgZmlndXJlIG91dCB0aGUgbGlzdCBvZiBwbHVnaW5zIGJ5IHJlYWRpbmcgdGhlIFNpdGUueG1sIGFzCi0JICogdGhlIGFyY2hpdmVzIHRhZyBhcmUgb3B0aW9uYWxzCi0JICovCi0JcHVibGljIHZvaWQgYWRkRG93bmxvYWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbChTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmVNb2RlbCkgewotCQlkb3dubG9hZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVscy5hZGQoZmVhdHVyZU1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBnZXREb3dubG9hZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVscygpIHsKLQkJcmV0dXJuICgKLQkJCVNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSkgZG93bmxvYWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMKLQkJCQkudG9BcnJheSgKLQkJCW5ldyBTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsW2Rvd25sb2FkZWRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzCi0JCQkJLnNpemUoKV0pOwotCX0KLQkvKioKLQkgKiBDaGVja3MgaWYgbWlycm9yIHNpdGUgY29udGFpbnMgYSBmZWF0dXJlIHdpdGggZ2l2ZW4gSUQgYW5kIHZlcnNpb24KLQkgKiBAcGFyYW0gZmVhdHVyZVJlZk1vZGVsCi0JICogQHJldHVybiB0cnVlIGlmIHN1Y2ggZmVhdHVyZSBleGlzdHMKLQkgKi8KLQkvKnByaXZhdGUgYm9vbGVhbiBjb250YWlucyhTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmVSZWZNb2RlbCkgewotCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZnNbXSA9IGdldFJhd0ZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZVJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGZlYXR1cmVSZWZzW2ldCi0JCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkJLmVxdWFscyhmZWF0dXJlUmVmTW9kZWwuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJY2UucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0qLwotCi0JLyoqCi0JICogVXBkYXRlcyBkZXNjcmlwdGlvbiBvZiB0aGlzIHNpdGUKLQkgKiBmcm9tIGRlc2NyaXB0aW9uIG9mIHRoZSByZW1vdGUgc2l0ZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlRGVzY3JpcHRpb24oSVNpdGUgcmVtb3RlU2l0ZSkgewotCQlJVVJMRW50cnkgdXJsRW50cnkgPSByZW1vdGVTaXRlLmdldERlc2NyaXB0aW9uKCk7Ci0JCWlmICh1cmxFbnRyeSAhPSBudWxsKSB7Ci0JCQlVUkxFbnRyeU1vZGVsIG5ld1VybEVudHJ5TW9kZWwgPSBuZXcgVVJMRW50cnlNb2RlbCgpOwotCQkJVVJMIHVybCA9IHVybEVudHJ5LmdldFVSTCgpOwotCQkJbmV3VXJsRW50cnlNb2RlbC5zZXRBbm5vdGF0aW9uKHVybEVudHJ5LmdldEFubm90YXRpb24oKSk7Ci0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM2MjQ5Ci0JCQkvLyBVUkwgaXMgbm90IHJlcXVpcmVkLCBzbyBtaWdodCBiZSBudWxsCi0JCQkvLyBUaGUgbnVsbCBjYXNlIGlzIChhbHJlYWR5KSBoYW5kbGVkIGNvcnJlY3RseSBpbgotCQkJLy8gd3JpdGVEZXNjcmlwdGlvbgotCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJbmV3VXJsRW50cnlNb2RlbC5zZXRVUkxTdHJpbmcodXJsLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJfQotCQkJdGhpcy5zZXREZXNjcmlwdGlvbk1vZGVsKG5ld1VybEVudHJ5TW9kZWwpOwotCQl9Ci0JfQotCS8qKgotCSAqIFVwZGF0ZXMgYWxsIGNhdGVnb3JpZXMgdXNlZCBieSBmZWF0dXJlcyBvbiB0aGlzIHNpdGUKLQkgKiBmcm9tIGNhdGVnb3JpZXMgZGVmaW5lZCBvbiByZW1vdGUgc2l0ZS4KLQkgKiBDYXRlZ29yaWVzIG5vdCBkZWZpbmVkIG9uIHJlbW90ZSBzaXRlIGFyZSB1bmNoYW5nZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNhdGVnb3JpZXMoSVNpdGUgcmVtb3RlU2l0ZSkgewotCQkvLyBjb2xsZWN0IG5hbWUgb2YgY2F0ZWdvcmllcyB1c2VkIG9uIHRoaXMgc2l0ZQotCQlTZXQgdXNlZENhdGVnb3J5TmFtZXMgPSBuZXcgSGFzaFNldCgpOwotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmVSZWZNb2RlbHNbXSA9Ci0JCQlnZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCk7Ci0JCWZvciAoaW50IGYgPSAwOyBmIDwgZmVhdHVyZVJlZk1vZGVscy5sZW5ndGg7IGYrKykgewotCQkJU3RyaW5nW10gZmVhdHVyZUNhdGVnb3J5TmFtZXMgPQotCQkJCWZlYXR1cmVSZWZNb2RlbHNbZl0uZ2V0Q2F0ZWdvcnlOYW1lcygpOwotCi0JCQlmb3IgKGludCBjID0gMDsgYyA8IGZlYXR1cmVDYXRlZ29yeU5hbWVzLmxlbmd0aDsgYysrKSB7Ci0JCQkJdXNlZENhdGVnb3J5TmFtZXMuYWRkKGZlYXR1cmVDYXRlZ29yeU5hbWVzW2NdKTsKLQkJCX0KLQkJfQotCi0JCUNvbGxlY3Rpb24gbmV3Q2F0ZWdvcnlNb2RlbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB1c2VkQ2F0ZWdvcnlOYW1lcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCUlDYXRlZ29yeSByZW1vdGVDYXRlZ29yeSA9IHJlbW90ZVNpdGUuZ2V0Q2F0ZWdvcnkobmFtZSk7Ci0JCQlpZiAocmVtb3RlQ2F0ZWdvcnkgPT0gbnVsbCkgewotCQkJCS8vIHJlbW90ZSBzaXRlIGRvZXMgbm90IGRlZmluZSB0aGlzIGNhdGVnb3J5Ci0JCQkJQ2F0ZWdvcnlNb2RlbCBvbGRDYXRlZ29yeSA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJb2xkQ2F0ZWdvcnkgPSAoQ2F0ZWdvcnlNb2RlbCkgZ2V0Q2F0ZWdvcnkobmFtZSk7Ci0JCQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7Ci0JCQkJCS8vIGNhbm5vdCByZXByb2R1Y2UgbnBlIGFueW1vcmUKLQkJCQl9Ci0JCQkJaWYgKG9sZENhdGVnb3J5ICE9IG51bGwpIHsKLQkJCQkJbmV3Q2F0ZWdvcnlNb2RlbHMuYWRkKG9sZENhdGVnb3J5KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCW5ld0NhdGVnb3J5TW9kZWxzLmFkZChyZW1vdGVDYXRlZ29yeSk7Ci0JCQl9Ci0KLQkJfQotCQlzZXRDYXRlZ29yeU1vZGVscygKLQkJCShDYXRlZ29yeU1vZGVsW10pIG5ld0NhdGVnb3J5TW9kZWxzLnRvQXJyYXkoCi0JCQkJbmV3IENhdGVnb3J5TW9kZWxbbmV3Q2F0ZWdvcnlNb2RlbHMuc2l6ZSgpXSkpOwotCi0JfQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZVVwZGF0ZVBvbGljeShTdHJpbmcgdXJsKSB7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVVSTCBzaXRlVVJMID0gbmV3IFVSTCh0aGlzLmdldFVSTCgpLCAicG9saWN5LnhtbCIpOyAvLyROT04tTkxTLTEkCi0JCQlmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShzaXRlVVJMLmdldEZpbGUoKSkpOwotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dFdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZm9zLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG91dFdyaXRlcik7Ci0KLQkJCXdyaXRlci5wcmludGxuKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLnByaW50bG4oIjx1cGRhdGUtcG9saWN5PiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCXdyaXRlci5wcmludGxuKAotCQkJCSI8IS0tIFlvdSBjYW4gcGFzdGUgdGhlIGZvbGxvd2luZyBmcmFnbWVudCwgY29udGFpbmluZyB1cmwtbWFwIGVsZW1lbnRzLCBpbnRvIGFub3RoZXIgcG9saWN5IGZpbGUuIC0tPiIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZVVybE1hcHMod3JpdGVyLCB1cmwpOwotCQkJd3JpdGVyLnByaW50bG4oIjwhLS0gRW5kIG9mIGZyYWdtZW50IHdpdGggdXJsLW1hcCBlbGVtZW50cy4gLS0+Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkJd3JpdGVyLnByaW50bG4oIjwvdXBkYXRlLXBvbGljeT4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQl3cml0ZXIuZmx1c2goKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQlVcGRhdGVDb3JlLmxvZygKLQkJCQlVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQkJInBvbGljeS54bWwgY291bGQgbm90IGJlIHNhdmVkIiwgLy8kTk9OLU5MUy0xJAotCQkJCQlpb2UpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChmb3MgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvcy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZTIpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIHdyaXRlVXJsTWFwcyhQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZyB1cmwpIHsKLQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGZlYXR1cmVSZWZlcmVuY2VNb2RlbHMgPQotCQkJZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVSZWZlcmVuY2VNb2RlbHMubGVuZ3RoOyBpKyspIHsKLQkJCXdyaXRlci5wcmludCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLnByaW50KCI8dXJsLW1hcCIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIucHJpbnQoCi0JCQkJIiBwYXR0ZXJuPVwiIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgZmVhdHVyZVJlZmVyZW5jZU1vZGVsc1tpXS5nZXRGZWF0dXJlSWRlbnRpZmllcigpCi0JCQkJCSsgIlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci5wcmludCgiIHVybD1cIiIgKyB1cmwgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl3cml0ZXIucHJpbnRsbigiIC8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldElnbm9yZU5vblByZXNlbnRQbHVnaW5zKGJvb2xlYW4gaWdub3JlTm9uUHJlc2VudFBsdWdpbnMpIHsKLQkJdGhpcy5pZ25vcmVOb25QcmVzZW50UGx1Z2lucyA9IGlnbm9yZU5vblByZXNlbnRQbHVnaW5zOwotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9taXJyb3IvTWlycm9yU2l0ZUZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21pcnJvci9NaXJyb3JTaXRlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODJhYjY4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21pcnJvci9NaXJyb3JTaXRlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubWlycm9yOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmUuKjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotCi1wdWJsaWMgY2xhc3MgTWlycm9yU2l0ZUZhY3RvcnkgZXh0ZW5kcyBCYXNlU2l0ZUZhY3RvcnkgewotCS8qCi0JICogQHNlZSBTaXRlTW9kZWxGYWN0b3J5I2NyZWF0ZVNpdGVNYXBNb2RlbCgpCi0JICovCi0JcHVibGljIFNpdGVNb2RlbCBjcmVhdGVTaXRlTWFwTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTWlycm9yU2l0ZSh0aGlzKTsKLQl9Ci0JLyoKLQkgKiBAc2VlIElTaXRlRmFjdG9yeSNjcmVhdGVTaXRlKFVSTCkKLQkgKi8KLQlwdWJsaWMgSVNpdGUgY3JlYXRlU2l0ZShVUkwgdXJsKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVNpdGUobmV3IEZpbGUodXJsLmdldEZpbGUoKSkpOwotCX0KLQkvKgotCSAqIEBzZWUgSVNpdGVGYWN0b3J5I2NyZWF0ZVNpdGUoVVJMKQotCSAqLwotCXB1YmxpYyBJU2l0ZSBjcmVhdGVTaXRlKEZpbGUgc2l0ZUxvY2F0aW9uKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIHsKLQotCQlJbnB1dFN0cmVhbSBzaXRlU3RyZWFtID0gbnVsbDsKLQotCQlpZiAoIXNpdGVMb2NhdGlvbi5leGlzdHMoKSkgewotCQkJaWYgKCFzaXRlTG9jYXRpb24ubWtkaXJzKCkpIHsKLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQkJIkRpcmVjdG9yeSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgc2l0ZUxvY2F0aW9uLmdldEFic29sdXRlUGF0aCgpCi0JCQkJCQkrICIgY291bGQgbm90IGJlIGNyZWF0ZWQuIiwgLy8kTk9OLU5MUy0xJAotCQkJCQludWxsKTsKLQkJCX0KLQkJfQotCQlpZiAoIXNpdGVMb2NhdGlvbi5pc0RpcmVjdG9yeSgpIHx8ICFzaXRlTG9jYXRpb24uY2FuV3JpdGUoKSkKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJCXNpdGVMb2NhdGlvbi5nZXRBYnNvbHV0ZVBhdGgoKQotCQkJCQkrICIgaXMgbm90IGEgZGlyZWN0b3J5IG9yIGlzIG5vdCB3cml0dGFibGUuIiwgLy8kTk9OLU5MUy0xJAotCQkJCW51bGwpOwotCi0JCU1pcnJvclNpdGUgc2l0ZSA9IG51bGw7Ci0JCS8vIHBhcnNlIHB1YmxpYyBmZWF0dXJlcwotCQlpZiAobmV3IEZpbGUoc2l0ZUxvY2F0aW9uLCBTaXRlLlNJVEVfWE1MKS5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlzaXRlU3RyZWFtID0KLQkJCQkJbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShzaXRlTG9jYXRpb24sIFNpdGUuU0lURV9YTUwpKTsKLQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7Ci0JCQl9Ci0JCQlzaXRlID0gKE1pcnJvclNpdGUpIHBhcnNlU2l0ZShzaXRlU3RyZWFtKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKHNpdGVTdHJlYW0gIT0gbnVsbCkKLQkJCQkJc2l0ZVN0cmVhbS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCWlmIChzaXRlID09IG51bGwpIHsKLQkJCXNpdGUgPSAoTWlycm9yU2l0ZSkgY3JlYXRlU2l0ZU1hcE1vZGVsKCk7Ci0JCX0KLQkJLy8gcGFyc2UgZG93bmxvYWRlZCBwbHVnaW5zIGFuZCBmcmFnbWVudHMKLQkJcGFyc2VEb3dubG9hZGVkUGx1Z2luc0FuZEZyYWdtZW50cygKLQkJCXNpdGUsCi0JCQluZXcgRmlsZShzaXRlTG9jYXRpb24sIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCkpOwotCQkvLyBwYXJzZSBkb3dubG9hZGVkIGZlYXR1cmVzCi0JCXBhcnNlRG93bmxvYWRlZEZlYXR1cmVzKAotCQkJc2l0ZSwKLQkJCW5ldyBGaWxlKHNpdGVMb2NhdGlvbiwgU2l0ZS5ERUZBVUxUX0ZFQVRVUkVfUEFUSCkpOwotCi0JCVVSTCB1cmw7Ci0JCXRyeSB7Ci0JCQl1cmwgPSBzaXRlTG9jYXRpb24udG9VUkwoKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJIkEgVVJMIGZvciBzaXRlICIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIHNpdGVMb2NhdGlvbi5nZXRBYnNvbHV0ZVBhdGgoKQotCQkJCQkrICIgY291bGQgbm90IGJlIGNyZWF0ZWQuIiwgLy8kTk9OLU5MUy0xJAotCQkJCW11ZSk7Ci0JCX0KLQkJU2l0ZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBudWxsOwotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgU2l0ZUZpbGVDb250ZW50UHJvdmlkZXIodXJsKTsKLQotCQlzaXRlLnNldFNpdGVDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJY29udGVudFByb3ZpZGVyLnNldFNpdGUoc2l0ZSk7Ci0JCXRyeSB7Ci0JCQlzaXRlLnJlc29sdmUodXJsLCB1cmwpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKSB7Ci0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQkiVW5hYmxlIHRvIHJlc29sdmUgVVJMICIgLy8kTk9OLU5MUy0xJAotCQkJCQkrICh1cmwgPT0gbnVsbCA/ICIiIDogdXJsLnRvRXh0ZXJuYWxGb3JtKCkpLCAvLyROT04tTkxTLTEkCi0JCQkJbXVlKTsKLQkJfQotCQlyZXR1cm4gc2l0ZTsKLQl9Ci0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBwYXJzZURvd25sb2FkZWRQbHVnaW5zQW5kRnJhZ21lbnRzKE1pcnJvclNpdGUgc2l0ZSwKLQkJCUZpbGUgcGx1Z2luRGlyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICghcGx1Z2luRGlyLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nW10gZGlyID0gcGx1Z2luRGlyLmxpc3QoRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyLmZpbHRlcik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGlyLmxlbmd0aDsgaSsrKSB7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBsdWdpbkRpciwgZGlyW2ldKTsKLQkJCQlKYXJDb250ZW50UmVmZXJlbmNlIGphclJlZmVyZW5jZSA9IG5ldyBKYXJDb250ZW50UmVmZXJlbmNlKAotCQkJCQkJbnVsbCwgZmlsZSk7Ci0JCQkJQ29udGVudFJlZmVyZW5jZSByZWYgPSBqYXJSZWZlcmVuY2UucGVlaygiTUVUQS1JTkYvTUFOSUZFU1QuTUYiLCBudWxsLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChyZWYgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJaW4gPSByZWYuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gaW4gY2FzZSBvZiBhbiBpbnZhbGlkIHNpZ25hdHVyZSBpbiBqYXIsIHdlIHdpbGwgY2F0Y2ggCi0JCQkJCQkvLyBhbmQgcmUtdGhyb3cgYSBsaXR0bGUgbW9yZSBzcGVjaWZpYyBtZXNzYWdlLiBPdGhlcndpc2UsIGl0J3MgCi0JCQkJCQkvLyBpbXBvc3NpYmxlIHRvIHRlbGwgd2hpY2ggamFyIGhhZCB0aGUgcHJvYmxlbS4gCi0JCQkJCQlTdHJpbmcgZmlsZW5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLQkJCQkJCUNvcmVFeGNlcHRpb24gdXBkYXRlRXhjZXB0aW9uID0gVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oZmlsZW5hbWUsZSk7Ci0JCQkJCQl0aHJvdyB1cGRhdGVFeGNlcHRpb247Ci0JCQkJCX0KLQkJCQkJQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgQnVuZGxlTWFuaWZlc3QoaW4pOwotCQkJCQlpZiAobWFuaWZlc3QuZXhpc3RzKCkpIHsKLQkJCQkJCXNpdGUKLQkJCQkJCQkJLmFkZERvd25sb2FkZWRQbHVnaW5FbnRyeShtYW5pZmVzdAotCQkJCQkJCQkJCS5nZXRQbHVnaW5FbnRyeSgpKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJlZiA9IGphclJlZmVyZW5jZS5wZWVrKCJwbHVnaW4ueG1sIiwgbnVsbCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocmVmID09IG51bGwpIHsKLQkJCQkJcmVmID0gamFyUmVmZXJlbmNlLnBlZWsoImZyYWdtZW50LnhtbCIsIG51bGwsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWlmIChyZWYgIT0gbnVsbCkgewotCQkJCQlpbiA9IHJlZi5nZXRJbnB1dFN0cmVhbSgpOwotCQkJCQlQbHVnaW5FbnRyeSBlbnRyeSA9IG5ldyBEZWZhdWx0UGx1Z2luUGFyc2VyKCkucGFyc2UoaW4pOwotCQkJCQlzaXRlLmFkZERvd25sb2FkZWRQbHVnaW5FbnRyeShlbnRyeSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCQlVcGRhdGVDb3JlLmxvZyhlKTsKLQkJCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOwotCQkJCVVwZGF0ZUNvcmUubG9nKGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZihpbiAhPW51bGwpewotCQkJCQl0cnl7Ci0JCQkJCQlpbi5jbG9zZSgpOwotCQkJCQl9Y2F0Y2goSU9FeGNlcHRpb24gY2UpewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCS8qKgotCSogTWV0aG9kIHBhcnNlRmVhdHVyZS4KLQkqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlRG93bmxvYWRlZEZlYXR1cmVzKE1pcnJvclNpdGUgc2l0ZSwgRmlsZSBmZWF0dXJlRGlyKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmZWF0dXJlRGlyLmV4aXN0cygpKSB7Ci0JCQlTdHJpbmdbXSBkaXI7Ci0JCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmVSZWY7Ci0JCQlVUkwgZmVhdHVyZVVSTDsKLQkJCUZpbGUgY3VycmVudEZlYXR1cmVGaWxlOwotCQkJU3RyaW5nIG5ld0ZpbGVQYXRoID0gbnVsbDsKLQotCQkJdHJ5IHsKLQkJCQkvLyBvbmx5IGxpc3QgSkFSIGZpbGVzCi0JCQkJZGlyID0gZmVhdHVyZURpci5saXN0KEZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5maWx0ZXIpOwotCQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBkaXIubGVuZ3RoOyBpbmRleCsrKSB7Ci0KLQkJCQkJLy8gY2hlY2sgaWYgdGhlIEpBUiBmaWxlIGNvbnRhaW5zIGEgZmVhdHVyZS54bWwKLQkJCQkJY3VycmVudEZlYXR1cmVGaWxlID0gbmV3IEZpbGUoZmVhdHVyZURpciwgZGlyW2luZGV4XSk7Ci0JCQkJCUphckNvbnRlbnRSZWZlcmVuY2UgcmVmID0KLQkJCQkJCW5ldyBKYXJDb250ZW50UmVmZXJlbmNlKCIiLCBjdXJyZW50RmVhdHVyZUZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCUNvbnRlbnRSZWZlcmVuY2UgcmVzdWx0ID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlc3VsdCA9IHJlZi5wZWVrKEZlYXR1cmUuRkVBVFVSRV9YTUwsIG51bGwsIG51bGwpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlVcGRhdGVDb3JlLndhcm4oCi0JCQkJCQkJIkV4Y2VwdGlvbiByZXRyaWV2aW5nIGZlYXR1cmUueG1sIGluIGZpbGU6IiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgY3VycmVudEZlYXR1cmVGaWxlLAotCQkJCQkJCWUpOwotCQkJCQl9Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQkJVXBkYXRlQ29yZS53YXJuKAotCQkJCQkJCSJVbmFibGUgdG8gZmluZCBmZWF0dXJlLnhtbCBpbiBmaWxlOiIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkrIGN1cnJlbnRGZWF0dXJlRmlsZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlmZWF0dXJlVVJMID0gY3VycmVudEZlYXR1cmVGaWxlLnRvVVJMKCk7Ci0JCQkJCQlmZWF0dXJlUmVmID0gY3JlYXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKCk7Ci0JCQkJCQlmZWF0dXJlUmVmLnNldFNpdGVNb2RlbChzaXRlKTsKLQkJCQkJCWZlYXR1cmVSZWYuc2V0VVJMU3RyaW5nKGZlYXR1cmVVUkwudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCQkJCQlmZWF0dXJlUmVmLnNldFR5cGUoSVNpdGUuREVGQVVMVF9QQUNLQUdFRF9GRUFUVVJFX1RZUEUpOwotCQkJCQkJZmVhdHVyZVJlZi5zZXRGZWF0dXJlSWRlbnRpZmllcigKLQkJCQkJCQlmZWF0dXJlUmVmCi0JCQkJCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkJCQkJLmdldElkZW50aWZpZXIoKSk7Ci0JCQkJCQlmZWF0dXJlUmVmLnNldEZlYXR1cmVWZXJzaW9uKAotCQkJCQkJCWZlYXR1cmVSZWYKLQkJCQkJCQkJLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCQkJCQkuZ2V0VmVyc2lvbigpCi0JCQkJCQkJCS50b1N0cmluZygpKTsKLQkJCQkJCXNpdGUuYWRkRG93bmxvYWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbChmZWF0dXJlUmVmKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJCSJVbmFibGUgdG8gY3JlYXRlIFVSTCBmb3IgZmlsZSAiICsgbmV3RmlsZVBhdGggKyAiLiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQllKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvQnVuZGxlTWFuaWZlc3QuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0J1bmRsZU1hbmlmZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYmVlZWUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvQnVuZGxlTWFuaWZlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotLyoqCi0gKiBQYXJzZXMgTUFOSUZFU1QuTUYKLSAqLwotcHVibGljIGNsYXNzIEJ1bmRsZU1hbmlmZXN0IHsKLQlwcml2YXRlIFBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5OwotCXByaXZhdGUgSU9FeGNlcHRpb24gZXhjZXB0aW9uOwotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBsb2NhbCBmaWxlCi0JICovCi1wdWJsaWMgQnVuZGxlTWFuaWZlc3QoRmlsZSBtYW5pZmVzdCkgewotCQlzdXBlcigpOwotCQlpZiAobWFuaWZlc3QuZXhpc3RzKCkgJiYgIW1hbmlmZXN0LmlzRGlyZWN0b3J5KCkpIHsKLQkJCUZpbGVJbnB1dFN0cmVhbSBmb3MgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlmb3MgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG1hbmlmZXN0KTsKLQkJCQlwYXJzZShmb3MpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChmb3MgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJZm9zLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgbG9jYWwgZmlsZQotCSAqLwotCXB1YmxpYyBCdW5kbGVNYW5pZmVzdChJbnB1dFN0cmVhbSBpbnB1dCkgewotCQlzdXBlcigpOwotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJcGFyc2UoaW5wdXQpOwotCQl9Ci0JfQotCS8qKgotCSAqIFBhcnNlcyBtYW5pZmVzdCwgY3JlYXRlcyBQbHVnaW5FbnRyeSBpZiBtYW5pZmVzdCBpcyB2YWxpZCwgc3RvcmVzCi0JICogZXhjZXB0aW9uIGlmIGFueSBvY2N1cnMKLQkgKiAKLQkgKiBAcGFyYW0gaW4KLQkgKiAgICAgICAgICAgIElucHV0U3RyZWFtCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGluKSB7Ci0JCXRyeSB7Ci0JCQlNYW5pZmVzdCBtID0gbmV3IE1hbmlmZXN0KGluKTsKLQkJCUF0dHJpYnV0ZXMgYSA9IG0uZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKLQkJCS8vIHBsdWdpbiBpZAotCQkJU3RyaW5nIHN5bWJvbGljTmFtZSA9IGEuZ2V0VmFsdWUoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpOwotCQkJaWYgKHN5bWJvbGljTmFtZSA9PSBudWxsKSB7Ci0JCQkJLy8gSW4gRWNsaXBzZSBtYW5pZmVzdCBtdXN0IGhhdmUgQnVuZGxlLVN5bWJvbGljTmFtZSBhdHRyaWJ1dGUKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgaWQ7Ci0JCQl0cnkgewotCQkJCU1hbmlmZXN0RWxlbWVudFtdIGVsZW1lbnRzID0gTWFuaWZlc3RFbGVtZW50LnBhcnNlSGVhZGVyKAotCQkJCQkJQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsIHN5bWJvbGljTmFtZSk7Ci0JCQkJaWQgPSBlbGVtZW50c1swXS5nZXRWYWx1ZSgpOwotCQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGJlKSB7Ci0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGJlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCQkvLyBwbHVnaW4gdmVyc2lvbgotCQkJU3RyaW5nIHZlcnNpb24gPSBhLmdldFZhbHVlKENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTik7Ci0JCQlpZiAodmVyc2lvbiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIGhvc3RQbHVnaW4gPSBhLmdldFZhbHVlKENvbnN0YW50cy5GUkFHTUVOVF9IT1NUKTsKLQkJCXBsdWdpbkVudHJ5ID0gbmV3IFBsdWdpbkVudHJ5KCk7Ci0JCQlwbHVnaW5FbnRyeS5zZXRWZXJzaW9uZWRJZGVudGlmaWVyKG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKGlkLAotCQkJCQl2ZXJzaW9uKSk7Ci0JCQlwbHVnaW5FbnRyeS5pc0ZyYWdtZW50KGhvc3RQbHVnaW4gIT0gbnVsbAotCQkJCQkmJiBob3N0UGx1Z2luLmxlbmd0aCgpID4gMCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJZXhjZXB0aW9uID0gaW9lOwotCQl9Ci0JfQotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJcmV0dXJuIGV4Y2VwdGlvbiAhPSBudWxsIHx8IHBsdWdpbkVudHJ5ICE9IG51bGw7Ci0JfQotCS8qKgotCSAqIE9idGFpbnMgUGx1Z2luRW50cnkgZnJvbSBhIG1hbmlmZXN0LgotCSAqIAotCSAqIEByZXR1cm4gUGx1Z2luRW50cnkgb3IgbnVsbCBpZiB2YWxpZCBtYW5pZmVzdCBkb2VzIG5vdCBleGlzdAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBleGNlcHRpb24gZHVyaW5nIHBhcnNpbmcKLQkgKi8KLQlwdWJsaWMgUGx1Z2luRW50cnkgZ2V0UGx1Z2luRW50cnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZXhjZXB0aW9uICE9IG51bGwpIHsKLQkJCXRocm93IGV4Y2VwdGlvbjsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwbHVnaW5FbnRyeTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0NvbmZpZ3VyYXRpb25BY3Rpdml0eU1vZGVsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9Db25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWYxYjYzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0NvbmZpZ3VyYXRpb25BY3Rpdml0eU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbDsKLSAKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci0KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbCBleHRlbmRzIE1vZGVsT2JqZWN0ewotCQotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCXByaXZhdGUgaW50IGFjdGlvbjsKLQlwcml2YXRlIERhdGUgZGF0ZTsKLQlwcml2YXRlIGludCBzdGF0dXM7Ci0JcHJpdmF0ZSBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGluc3RhbGxDb25maWd1cmF0aW9uOwotCQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENvbmZpZ3VyYXRpb25BY3Rpdml0eU1vZGVsLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIGludCBnZXRBY3Rpb24oKSB7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBEYXRlIGdldERhdGUoKSB7Ci0JCXJldHVybiBkYXRlOwotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXR1cygpIHsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkYXRlLgotCSAqIEBwYXJhbSBkYXRlIFRoZSBkYXRlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGUoRGF0ZSBkYXRlKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCXRoaXMuZGF0ZSA9IGRhdGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdHVzLgotCSAqIEBwYXJhbSBzdGF0dXMgVGhlIHN0YXR1cyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGF0dXMoaW50IHN0YXR1cykgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxhYmVsLgotCSAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhY3Rpb24uCi0JICogQHBhcmFtIGFjdGlvbiBUaGUgYWN0aW9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGlvbihpbnQgYWN0aW9uKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCXRoaXMuYWN0aW9uID0gYWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGluc3RhbGxDb25maWd1cmF0aW9uLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwKLQkgKi8KLQlwdWJsaWMgSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBnZXRJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKCkgewotCQlyZXR1cm4gaW5zdGFsbENvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5zdGFsbENvbmZpZ3VyYXRpb24uCi0JICogQHBhcmFtIGluc3RhbGxDb25maWd1cmF0aW9uIFRoZSBpbnN0YWxsQ29uZmlndXJhdGlvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgaW5zdGFsbENvbmZpZ3VyYXRpb24pIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsJCQotCQl0aGlzLmluc3RhbGxDb25maWd1cmF0aW9uID0gaW5zdGFsbENvbmZpZ3VyYXRpb247Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0NvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvQ29uZmlndXJhdGlvblBvbGljeU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZTUxMTYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvQ29uZmlndXJhdGlvblBvbGljeU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCBleHRlbmRzIE1vZGVsT2JqZWN0IHsKLQotCQotCQotCi0JcHJpdmF0ZSBpbnQgcG9saWN5OwotCXByaXZhdGUgTWFwIC8qIG9mIEZlYXR1cmVSZWZlcmVuY2VNb2RlbCAqL2NvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlczsKLQlwcml2YXRlIE1hcCAvKiBvZiBGZWF0dXJlUmVmZXJlbmNlTW9kZWwgKi91bmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlczsKLQkKLQkvLyBzaW5jZSAyLjAuMgotCXByaXZhdGUgQ29uZmlndXJlZFNpdGVNb2RlbCBjb25maWd1cmVkU2l0ZU1vZGVsOwotCQotCS8vIHNpbmNlIDIuMQotCXByaXZhdGUgYm9vbGVhbiBlbmFibGU7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ29uZmlndXJhdGlvblBvbGljeU1vZGVsLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uUG9saWN5TW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWVuYWJsZSA9IHRydWU7Ci0JCWNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0vLwkJdW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMgPSBuZXcgSGFzaE1hcCgpOwkJCi0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UG9saWN5KCkgewotCQlyZXR1cm4gcG9saWN5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHBvbGljeS4KLQkgKiBAcGFyYW0gcG9saWN5IFRoZSBwb2xpY3kgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UG9saWN5KGludCBwb2xpY3kpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJdGhpcy5wb2xpY3kgPSBwb2xpY3k7Ci0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBnZXRDb25maWd1cmVkRmVhdHVyZXNNb2RlbCgpIHsKLQkJaWYgKGNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcz09bnVsbCB8fCBjb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG5ldyBGZWF0dXJlUmVmZXJlbmNlTW9kZWxbMF07Ci0JCXJldHVybiAoRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10pIGNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcy5rZXlTZXQoKS50b0FycmF5KGFycmF5VHlwZUZvcihjb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMua2V5U2V0KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIEZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGdldFVuY29uZmlndXJlZEZlYXR1cmVzTW9kZWwoKSB7Ci0JCS8vIG9idGFpbiB1bmNvbmZpZ3VyZWQgZmVhdHVyZXMgYnkgY29tcGFyaW5nIGNvbmZpZ3VyZWQgb25lcyB3aXRoIHRob3NlIGluc3RhbGxlZAotCQlpZiAodW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMgPT0gbnVsbAotCQkJCSYmIGNvbmZpZ3VyZWRTaXRlTW9kZWwgIT0gbnVsbAotCQkJCSYmIGNvbmZpZ3VyZWRTaXRlTW9kZWwuZ2V0U2l0ZU1vZGVsKCkgIT0gbnVsbCkgewotCQkJSVNpdGUgc2l0ZSA9IChJU2l0ZSkgY29uZmlndXJlZFNpdGVNb2RlbC5nZXRTaXRlTW9kZWwoKTsKLQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIHNpdGVGZWF0dXJlcyA9IHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCWlmIChzaXRlRmVhdHVyZXMubGVuZ3RoID4gZ2V0Q29uZmlndXJlZEZlYXR1cmVzTW9kZWwoKS5sZW5ndGgpIHsKLQkJCQlmb3IgKGludCBpPTA7IGk8c2l0ZUZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICghKHNpdGVGZWF0dXJlc1tpXSBpbnN0YW5jZW9mIFNpdGVGZWF0dXJlUmVmZXJlbmNlKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCXdoaWxlKCFmb3VuZCAmJiBpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmID0gKEZlYXR1cmVSZWZlcmVuY2VNb2RlbClpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAoVXBkYXRlTWFuYWdlclV0aWxzLnNhbWVVUkwoZi5nZXRVUkwoKSwgc2l0ZUZlYXR1cmVzW2ldLmdldFVSTCgpKSkKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJaWYgKCFmb3VuZCkKLQkJCQkJCWFkZFVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2UoKFNpdGVGZWF0dXJlUmVmZXJlbmNlKXNpdGVGZWF0dXJlc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh1bmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyA9PSBudWxsCi0JCQkJfHwgdW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG5ldyBGZWF0dXJlUmVmZXJlbmNlTW9kZWxbMF07Ci0JCXJldHVybiAoRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10pIHVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzLmtleVNldCgpCi0JCQkJLnRvQXJyYXkoYXJyYXlUeXBlRm9yKHVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzLmtleVNldCgpKSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29uZmlndXJlZFNpdGVNb2RlbC4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBDb25maWd1cmVkU2l0ZU1vZGVsCi0JICogQHNpbmNlIDIuMC4yCi0JICovCi0JcHVibGljIENvbmZpZ3VyZWRTaXRlTW9kZWwgZ2V0Q29uZmlndXJlZFNpdGVNb2RlbCgpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyZWRTaXRlTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29uZmlndXJlZFNpdGVNb2RlbC4KLQkgKiBAcGFyYW0gY29uZmlndXJlZFNpdGVNb2RlbCBUaGUgY29uZmlndXJlZFNpdGVNb2RlbCB0byBzZXQKLQkgKiBAc2luY2UgMi4wLjIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25maWd1cmVkU2l0ZU1vZGVsKENvbmZpZ3VyZWRTaXRlTW9kZWwgY29uZmlndXJlZFNpdGVNb2RlbCkgewotCQl0aGlzLmNvbmZpZ3VyZWRTaXRlTW9kZWwgPSBjb25maWd1cmVkU2l0ZU1vZGVsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiByZW1vdmUoRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmUsIE1hcCBsaXN0KSB7Ci0JCVVSTCBmZWF0dXJlVVJMID0gZmVhdHVyZS5nZXRVUkwoKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlJdGVyYXRvciBpdGVyID0gbGlzdC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkgJiYgIWZvdW5kKSB7Ci0JCQlGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZWxlbWVudCA9IChGZWF0dXJlUmVmZXJlbmNlTW9kZWwpIGl0ZXIubmV4dCgpOwotCQkJaWYgKFVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKGVsZW1lbnQuZ2V0VVJMKCksZmVhdHVyZVVSTCkpIHsKLQkJCQlsaXN0LnJlbW92ZShlbGVtZW50KTsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZvdW5kOwotCX0KLQotCS8qKgotCSAqIHJldHVybnMgYW4gYXJyYXkgb2Ygc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gcGx1Z2lucyBmaWxlCi0JICovCi0JLypwYWNrYWdlKi8KLQotCQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGQoRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmUsIE1hcCBsaXN0KSB7Ci0JCVVSTCBmZWF0dXJlVVJMID0gZmVhdHVyZS5nZXRVUkwoKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlJdGVyYXRvciBpdGVyID0gbGlzdC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkgJiYgIWZvdW5kKSB7Ci0JCQlGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZWxlbWVudCA9IChGZWF0dXJlUmVmZXJlbmNlTW9kZWwpIGl0ZXIubmV4dCgpOwotCQkJaWYgKFVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKGVsZW1lbnQuZ2V0VVJMKCksZmVhdHVyZVVSTCkpIHsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWZvdW5kKSB7Ci0JCQlsaXN0LnB1dChmZWF0dXJlLG51bGwpOwotCQl9IGVsc2UgewotCQkJVXBkYXRlQ29yZS53YXJuKCJGZWF0dXJlIFJlZmVyZW5jZSA6IitmZWF0dXJlKyIgYWxyZWFkeSBwYXJ0IG9mIHRoZSBsaXN0LiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIGFkZHMgYSBmZWF0dXJlIGluIHRoZSBjb25maWd1cmVkUmVmZXJlbmNlIGxpc3QKLQkgKiBhbHNvIHVzZWQgYnkgdGhlIHBhcnNlciB0byBhdm9pZCBjcmVhdGluZyBhbm90aGVyIGFjdGl2aXR5Ci0JICovCi0JcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2UoRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmUpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJCi0JCWlmIChjb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMgPT0gbnVsbCkKLQkJCXRoaXMuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzID0gbmV3IEhhc2hNYXAoKTsKLQkJaWYgKCFjb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMuY29udGFpbnNLZXkoZmVhdHVyZSkpewotCQkJLy9ERUJVRzoKLQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19DT05GSUdVUkFUSU9OKXsKLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJDb25maWd1cmluZyAiK2ZlYXR1cmUuZ2V0VVJMU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0aGlzLmFkZChmZWF0dXJlLCBjb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMpOwotCQl9CQotCi0JCS8vIHdoZW4gdXNlciBjb25maWd1cmUgYSBmZWF0dXJlLAotCQkvLyB3ZSBoYXZlIHRvIHJlbW92ZSBpdCBmcm9tIHVuY29uZmlndXJlZCBmZWF0dXJlIGlmIGl0IGV4aXN0cwotCQkvLyBiZWNhdXNlIHRoZSB1c2VyIGRvZXNuJ3Qga25vdy4uLgotCQlpZiAodW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBzdWNjZXNzID0gcmVtb3ZlKGZlYXR1cmUsIHVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzKTsKLQkJCWlmICghc3VjY2VzcykKLQkJCQlVcGRhdGVDb3JlLndhcm4oIkZlYXR1cmUgbm90IHBhcnQgb2YgVW5jb25maWd1cmVkIGxpc3Q6ICIrZmVhdHVyZS5nZXRVUkxTdHJpbmcoKSk7CQkJIC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JfQotCi0JLyoqCi0JICogYWRkcyBhIGZlYXR1cmUgaW4gdGhlIGxpc3QKLQkgKiBhbHNvIHVzZWQgYnkgdGhlIHBhcnNlciB0byBhdm9pZCBjcmVhdGluZyBhbm90aGVyIGFjdGl2aXR5Ci0JICovCi0JcHVibGljIHZvaWQgYWRkVW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZShGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZSkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQlpZiAodW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMgPT0gbnVsbCkKLQkJCXRoaXMudW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlpZiAoIXVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzLmNvbnRhaW5zS2V5KGZlYXR1cmUpKXsKLQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19DT05GSUdVUkFUSU9OKXsKLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJVbmNvbmZpZ3VyaW5nICIrZmVhdHVyZS5nZXRVUkxTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXRoaXMuYWRkKGZlYXR1cmUsIHVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzKTsKLQkJfQkKLQotCQkvLyBhbiB1bmNvbmZpZ3VyZWQgZmVhdHVyZSBpcyBhbHdheXMgZnJvbSBhIGNvbmZpZ3VyZWQgb25lIG5vID8KLQkJLy8gdW5sZXNzIGl0IHdhcyBwYXJzZWQgcmlnaHQgPwotCQlpZiAoY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IHJlbW92ZShmZWF0dXJlLCBjb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMpOwotCQkJaWYgKCFzdWNjZXNzKQotCQkJCVVwZGF0ZUNvcmUud2FybigiRmVhdHVyZSBub3QgcGFydCBvZiBDb25maWd1cmVkIGxpc3Q6ICIrZmVhdHVyZS5nZXRVUkxTdHJpbmcoKSk7CQkJCSAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVzIGEgZmVhdHVyZSBmcm9tIGFueSBsaXN0Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRmVhdHVyZVJlZmVyZW5jZShGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZSkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQlpZiAodW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMhPW51bGwpewotCQkJYm9vbGVhbiBzdWNjZXNzID0gcmVtb3ZlKGZlYXR1cmUsIHVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzKTsKLQkJCWlmICghc3VjY2VzcykKLQkJCQlVcGRhdGVDb3JlLndhcm4oZmVhdHVyZS5nZXRVUkxTdHJpbmcoKSsiIG5vdCBwYXJ0IG9mIHVuY29uZmlndXJlZCBsaXN0LiIpOwkJCQkJCQkgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKGNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSByZW1vdmUoZmVhdHVyZSwgY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzKTsKLQkJCWlmICghc3VjY2VzcykKLQkJCQlVcGRhdGVDb3JlLndhcm4oZmVhdHVyZS5nZXRVUkxTdHJpbmcoKSsiIG5vdCBwYXJ0IG9mIGNvbmZpZ3VyZWQgbGlzdC4iKTsJCQkJCQkJIC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB1bmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcy4KLQkgKiBAcGFyYW0gZmVhdHVyZVJlZmVyZW5jZXMgVGhlIHVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzIHRvIHNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzKElGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZVJlZmVyZW5jZXMpIHsKLQkJdW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQl1bmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcy5wdXQoZmVhdHVyZVJlZmVyZW5jZXNbaV0sbnVsbCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcy4KLQkgKiBAcGFyYW0gZmVhdHVyZVJlZmVyZW5jZXMgVGhlIGNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyB0byBzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMoSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlUmVmZXJlbmNlcykgewotCQljb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMucHV0KGZlYXR1cmVSZWZlcmVuY2VzW2ldLG51bGwpOwotCQl9CQkKLQkKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiBlbmFibGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIHZhbHVlKSB7Ci0JCWVuYWJsZSA9IHZhbHVlOwotCX0KLQotCi0JCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9Db25maWd1cmVkU2l0ZU1vZGVsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9Db25maWd1cmVkU2l0ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NWIyYzQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvQ29uZmlndXJlZFNpdGVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJlZFNpdGVNb2RlbCBleHRlbmRzIE1vZGVsT2JqZWN0IHsKLQlwcml2YXRlIFN0cmluZ1tdIHByZXZpb3VzUGx1Z2luUGF0aDsKLQotCXByaXZhdGUgU2l0ZU1vZGVsIHNpdGU7Ci0JcHJpdmF0ZSBTdHJpbmcgcGxhdGZvcm1VUkxTdHJpbmc7Ci0JcHJpdmF0ZSBDb25maWd1cmF0aW9uUG9saWN5TW9kZWwgcG9saWN5OwotCXByaXZhdGUgSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBpbnN0YWxsQ29uZmlndXJhdGlvbjsKLQlwcml2YXRlIGJvb2xlYW4gaW5zdGFsbGFibGUgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIENvbmZpZ3VyZWRTaXRlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyB0aGUgc2l0ZQotCSAqIEByZXR1cm4gVGhlIElTaXRlIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU2l0ZU1vZGVsIGdldFNpdGVNb2RlbCgpIHsKLQkJcmV0dXJuIHNpdGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2l0ZS4KLQkgKiBAcGFyYW0gc2l0ZSBUaGUgc2l0ZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaXRlTW9kZWwoU2l0ZU1vZGVsIHNpdGUpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJdGhpcy5zaXRlID0gc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm5zIHRoZSBwb2xpY3kKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblBvbGljeU1vZGVsIGdldENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCgpIHsKLQkJcmV0dXJuIHBvbGljeTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvblBvbGljeU1vZGVsKENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCBwb2xpY3kpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJdGhpcy5wb2xpY3kgPSBwb2xpY3k7Ci0JCXBvbGljeS5zZXRDb25maWd1cmVkU2l0ZU1vZGVsKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzaW5jZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXBkYXRhYmxlKCkgewotCQlyZXR1cm4gaW5zdGFsbGFibGU7Ci0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVwZGF0YWJsZShib29sZWFuIGluc3RhbGxhYmxlKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCXRoaXMuaW5zdGFsbGFibGUgPSBpbnN0YWxsYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbnN0YWxsQ29uZmlndXJhdGlvbi4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsCi0JICovCi0JcHVibGljIEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCgpIHsKLQkJcmV0dXJuIGluc3RhbGxDb25maWd1cmF0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGluc3RhbGxDb25maWd1cmF0aW9uLgotCSAqIEBwYXJhbSBpbnN0YWxsQ29uZmlndXJhdGlvbiBUaGUgaW5zdGFsbENvbmZpZ3VyYXRpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbChJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGluc3RhbGxDb25maWd1cmF0aW9uKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCXRoaXMuaW5zdGFsbENvbmZpZ3VyYXRpb24gPSBpbnN0YWxsQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwbGF0Zm9ybVVSTFN0cmluZy4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsYXRmb3JtVVJMU3RyaW5nKCkgewotCQlyZXR1cm4gcGxhdGZvcm1VUkxTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcGxhdGZvcm1VUkxTdHJpbmcuCi0JICogQHBhcmFtIHBsYXRmb3JtVVJMU3RyaW5nIFRoZSBwbGF0Zm9ybVVSTFN0cmluZyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQbGF0Zm9ybVVSTFN0cmluZyhTdHJpbmcgcGxhdGZvcm1VUkxTdHJpbmcpIHsKLQkJdGhpcy5wbGF0Zm9ybVVSTFN0cmluZyA9IHBsYXRmb3JtVVJMU3RyaW5nOwotCX0KLQotCQotCQkvKioKLQkgKiBHZXRzIHRoZSBwcmV2aW91c1BsdWdpblBhdGguIFRoZSBsaXN0IG9mIHBsdWdpbnMgdGhlIHBsYXRmb3JtIGhhZC4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmdbXQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRQcmV2aW91c1BsdWdpblBhdGgoKSB7Ci0JCWlmIChwcmV2aW91c1BsdWdpblBhdGggPT0gbnVsbCkKLQkJCXByZXZpb3VzUGx1Z2luUGF0aCA9IG5ldyBTdHJpbmdbMF07Ci0JCXJldHVybiBwcmV2aW91c1BsdWdpblBhdGg7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHJldmlvdXNQbHVnaW5QYXRoLgotCSAqIEBwYXJhbSBwcmV2aW91c1BsdWdpblBhdGggVGhlIHByZXZpb3VzUGx1Z2luUGF0aCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmV2aW91c1BsdWdpblBhdGgoU3RyaW5nW10gcHJldmlvdXNQbHVnaW5QYXRoKSB7Ci0JCXRoaXMucHJldmlvdXNQbHVnaW5QYXRoID0gbmV3IFN0cmluZ1twcmV2aW91c1BsdWdpblBhdGgubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShwcmV2aW91c1BsdWdpblBhdGgsIDAsIHRoaXMucHJldmlvdXNQbHVnaW5QYXRoLCAwLCBwcmV2aW91c1BsdWdpblBhdGgubGVuZ3RoKTsKLQl9Ci0KLQkvKgotCSAqIGNyZWF0ZXMgYSBTdGF0dXMKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHN0YXR1c1R5cGUsIFN0cmluZyBtc2csIEV4Y2VwdGlvbiBlKXsKLQkJaWYgKHN0YXR1c1R5cGUhPUlTdGF0dXMuT0spIHN0YXR1c1R5cGUgPSBJU3RhdHVzLkVSUk9SOwotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKHN0YXR1c1R5cGUsSVN0YXR1cy5PSywgbXNnLnRvU3RyaW5nKCksIGUpOwotCX0KLQotCS8qCi0JICogY3JlYXRlcyBhIFN0YXR1cwotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc3RhdHVzU2V2ZXJpdHksIGludCBzdGF0dXNDb2RlLCBTdHJpbmcgbXNnLCBFeGNlcHRpb24gZSl7Ci0JCVN0cmluZyBpZCA9CVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JCi0JCVN0cmluZ0J1ZmZlciBjb21wbGV0ZVN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChtc2chPW51bGwpCi0JCQljb21wbGV0ZVN0cmluZy5hcHBlbmQobXNnKTsKLQkJaWYgKGUhPW51bGwpewotCQkJY29tcGxldGVTdHJpbmcuYXBwZW5kKCJcclxuWyIpOyAvLyROT04tTkxTLTEkCi0JCQljb21wbGV0ZVN0cmluZy5hcHBlbmQoZS50b1N0cmluZygpKTsKLQkJCWNvbXBsZXRlU3RyaW5nLmFwcGVuZCgiXVxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBuZXcgU3RhdHVzKHN0YXR1c1NldmVyaXR5LCBpZCwgc3RhdHVzQ29kZSwgY29tcGxldGVTdHJpbmcudG9TdHJpbmcoKSwgZSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlI2lzRW5hYmxlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZXR1cm4gZ2V0Q29uZmlndXJhdGlvblBvbGljeU1vZGVsKCkuaXNFbmFibGVkKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGUjc2V0RW5hYmxlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiB2YWx1ZSkgewotCQlnZXRDb25maWd1cmF0aW9uUG9saWN5TW9kZWwoKS5zZXRFbmFibGVkKHZhbHVlKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9EZWZhdWx0UGx1Z2luUGFyc2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9EZWZhdWx0UGx1Z2luUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MDYxMzAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvRGVmYXVsdFBsdWdpblBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWw7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy4qOwotCi0vKioKLSAqIFBhcnNlIGRlZmF1bHQgZmVhdHVyZS54bWwKLSAqLwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFBsdWdpblBhcnNlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTQVhQYXJzZXJGYWN0b3J5IHBhcnNlckZhY3RvcnkgPQotCQlTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JcHJpdmF0ZSBTQVhQYXJzZXIgcGFyc2VyOwotCXByaXZhdGUgU3RyaW5nIGlkID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyB2ZXJzaW9uID0gbnVsbDsKLQlwcml2YXRlIFBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTiA9ICJwbHVnaW4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQUdNRU5UID0gImZyYWdtZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBjbGFzcyBQYXJzZUNvbXBsZXRlRXhjZXB0aW9uIGV4dGVuZHMgU0FYRXhjZXB0aW9uIHsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgICAgICBwdWJsaWMgUGFyc2VDb21wbGV0ZUV4Y2VwdGlvbihTdHJpbmcgYXJnMCkgewotCQkJc3VwZXIoYXJnMCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVmYXVsdEZlYXR1cmVQYXJzZXIKLQkgKi8KLQlwdWJsaWMgRGVmYXVsdFBsdWdpblBhcnNlcigpIHsKLQkJc3VwZXIoKTsKLQkJdHJ5IHsKLQkJCXBhcnNlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0JCQl0aGlzLnBhcnNlciA9IHBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS5sb2coZSk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVDb3JlLmxvZyhlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFBsdWdpbkVudHJ5IHBhcnNlKElucHV0U3RyZWFtIGluKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlwbHVnaW5FbnRyeSA9IG5ldyBQbHVnaW5FbnRyeSgpOwotCQkJcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbiksIHRoaXMpOwotCQl9IGNhdGNoIChQYXJzZUNvbXBsZXRlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkLCB3ZSBzdG9wcGVkIHRoZSBwYXJzaW5nIHdoZW4gd2UgaGF2ZSB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZAotCQkJLy8vIG5vIG5lZWQgdG8gcHVyc3VlIHRoZSBwYXJzaW5nCi0JCX0KLQotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCWlkID0gIl9ub19pZF8iOyAvLyROT04tTkxTLTEkCi0JCXBsdWdpbkVudHJ5LnNldFZlcnNpb25lZElkZW50aWZpZXIobmV3IFZlcnNpb25lZElkZW50aWZpZXIoaWQsIHZlcnNpb24pKTsKLQkJcmV0dXJuIHBsdWdpbkVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjc3RhcnRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIEF0dHJpYnV0ZXMpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgdGFnID0gbG9jYWxOYW1lLnRyaW0oKTsKLQotCQlpZiAodGFnLmVxdWFsc0lnbm9yZUNhc2UoUExVR0lOKSkgewotCQkJcGx1Z2luRW50cnkuaXNGcmFnbWVudChmYWxzZSk7CQkJCi0JCQlwcm9jZXNzUGx1Z2luKGF0dHJpYnV0ZXMpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHRhZy5lcXVhbHNJZ25vcmVDYXNlKEZSQUdNRU5UKSkgewotCQkJcGx1Z2luRW50cnkuaXNGcmFnbWVudCh0cnVlKTsJCQkKLQkJCXByb2Nlc3NQbHVnaW4oYXR0cmlidXRlcyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKiogCi0JICogcHJvY2VzcyBwbHVnaW4gZW50cnkgaW5mbwotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzUGx1Z2luKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFBhcnNlQ29tcGxldGVFeGNlcHRpb24gewotCQlpZCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJdmVyc2lvbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl0aHJvdyBuZXcgUGFyc2VDb21wbGV0ZUV4Y2VwdGlvbigiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9JVGltZXN0YW1wLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9JVGltZXN0YW1wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NjI4N2IuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvSVRpbWVzdGFtcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVRpbWVzdGFtcCB7Ci0KLQlwdWJsaWMgRGF0ZSBnZXRUaW1lc3RhbXAoKTsKLQkKLQlwdWJsaWMgdm9pZCBzZXRUaW1lc3RhbXAoIERhdGUgdGltZXN0YW1wKTsKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0luc3RhbGxDb25maWd1cmF0aW9uTW9kZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0luc3RhbGxDb25maWd1cmF0aW9uTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdkMTAxMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9JbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLQotLyoqCi0gKiBBbiBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGlzIAotICogCi0gKi8KLQotcHVibGljIGNsYXNzIEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgZXh0ZW5kcyBNb2RlbE9iamVjdCB7Ci0KLQkvLyBwZXJmb3JtYW5jZQotCXByaXZhdGUgVVJMIGJ1bmRsZVVSTDsKLQlwcml2YXRlIFVSTCBiYXNlOwotCXByaXZhdGUgYm9vbGVhbiByZXNvbHZlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3VycmVudCA9IGZhbHNlOwotCXByaXZhdGUgVVJMIGxvY2F0aW9uVVJMOwotCXByaXZhdGUgU3RyaW5nIGxvY2F0aW9uVVJMU3RyaW5nOwotCXByb3RlY3RlZCBEYXRlIGRhdGU7Ci0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0JcHJpdmF0ZSBMaXN0IC8qIG9mIENvbmZpZ3VyZXRpb25BY3Rpdml0eU1vZGVsICovIGFjdGl2aXRpZXM7Ci0JcHJpdmF0ZSBMaXN0IC8qIG9mIGNvbmZpZ3VyYXRpb25TaXRlTW9kZWwgKi8gY29uZmlndXJhdGlvblNpdGVzOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBsaWdodGx5SW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIGRlZmF1bHQgY29uc3RydWN0b3IuIENyZWF0ZQotCSAqLwotCXB1YmxpYyBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKCkgewotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJlZFNpdGVNb2RlbFtdIGdldENvbmZpZ3VyYXRpb25TaXRlc01vZGVsKCkgewotCQlpZiAoIWluaXRpYWxpemVkKSAKLQkJCWluaXRpYWxpemUoKTsKLQkJaWYgKGNvbmZpZ3VyYXRpb25TaXRlcyA9PSBudWxsIHx8IGNvbmZpZ3VyYXRpb25TaXRlcy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBuZXcgQ29uZmlndXJlZFNpdGVNb2RlbFswXTsKLQkKLQkJcmV0dXJuIChDb25maWd1cmVkU2l0ZU1vZGVsW10pIGNvbmZpZ3VyYXRpb25TaXRlcy50b0FycmF5KGFycmF5VHlwZUZvcihjb25maWd1cmF0aW9uU2l0ZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBjb25maWd1cmF0aW9uIHRvIHRoZSBsaXN0Ci0JICogaXMgY2FsbGVkIHdoZW4gYWRkaW5nIGEgU2l0ZSBvciBwYXJzaW5nIHRoZSBYTUwgZmlsZQotCSAqIGluIHRoaXMgY2FzZSB3ZSBkbyBub3Qgd2FudCB0byBjcmVhdGUgYSBuZXcgYWN0aXZpdHksIHNvIHdlIGRvIG5vdCB3YW50IHQgY2FsbAotCSAqIGFkZENvbmZpZ3VyYXRpb25TaXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb25maWd1cmF0aW9uU2l0ZU1vZGVsKENvbmZpZ3VyZWRTaXRlTW9kZWwgc2l0ZSkgewotCQlpZiAoY29uZmlndXJhdGlvblNpdGVzID09IG51bGwpIHsKLQkJCWNvbmZpZ3VyYXRpb25TaXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlpZiAoIWNvbmZpZ3VyYXRpb25TaXRlcy5jb250YWlucyhzaXRlKSkgewotCQkJY29uZmlndXJhdGlvblNpdGVzLmFkZChzaXRlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb25TaXRlTW9kZWwoQ29uZmlndXJlZFNpdGVNb2RlbFtdIHNpdGVzKSB7Ci0JCWNvbmZpZ3VyYXRpb25TaXRlcyA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWFkZENvbmZpZ3VyYXRpb25TaXRlTW9kZWwoc2l0ZXNbaV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUNvbmZpZ3VyYXRpb25TaXRlTW9kZWwoQ29uZmlndXJlZFNpdGVNb2RlbCBzaXRlKSB7Ci0JCWlmICghaW5pdGlhbGl6ZWQpIGluaXRpYWxpemUoKTsKLQotCQlpZiAoY29uZmlndXJhdGlvblNpdGVzICE9IG51bGwpIHsKLQkJCXJldHVybiBjb25maWd1cmF0aW9uU2l0ZXMucmVtb3ZlKHNpdGUpOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0N1cnJlbnQoKSB7Ci0JCWlmICghbGlnaHRseUluaXRpYWxpemVkICYmICFpbml0aWFsaXplZCApIAotCQkJZG9MaWdodEluaXRpYWxpemF0aW9uKCk7Ci0JCQotCQlyZXR1cm4gaXNDdXJyZW50OwotCX0KLQotCS8qKgotCSAqICBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudChib29sZWFuIGlzQ3VycmVudCkgewotCQkvLyBkbyBub3QgY2hlY2sgaWYgd3JpdGFibGUgYXMgd2UgbWF5Ci0JCS8vIHNldCBhbiBpbnN0YWxsIGNvbmZpZyBhcyBOb3QgY3VycmVudAotCQl0aGlzLmlzQ3VycmVudCA9IGlzQ3VycmVudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25BY3Rpdml0eU1vZGVsW10gZ2V0QWN0aXZpdHlNb2RlbCgpIHsKLQkJaWYgKGFjdGl2aXRpZXMgPT0gbnVsbCAmJiAhaW5pdGlhbGl6ZWQpIAotCQkJaW5pdGlhbGl6ZSgpOwotCQlpZiAoYWN0aXZpdGllcyA9PSBudWxsIHx8IGFjdGl2aXRpZXMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbmV3IENvbmZpZ3VyYXRpb25BY3Rpdml0eU1vZGVsWzBdOwotCQlyZXR1cm4gKENvbmZpZ3VyYXRpb25BY3Rpdml0eU1vZGVsW10pIGFjdGl2aXRpZXMudG9BcnJheShhcnJheVR5cGVGb3IoYWN0aXZpdGllcykpOwotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBY3Rpdml0eU1vZGVsKENvbmZpZ3VyYXRpb25BY3Rpdml0eU1vZGVsIGFjdGl2aXR5KSB7Ci0JCWlmIChhY3Rpdml0aWVzID09IG51bGwpCi0JCQlhY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoIWFjdGl2aXRpZXMuY29udGFpbnMoYWN0aXZpdHkpKSB7Ci0JCQlhY3Rpdml0aWVzLmFkZChhY3Rpdml0eSk7Ci0JCQlhY3Rpdml0eS5zZXRJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKHRoaXMpOwotCQl9Ci0JfQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBEYXRlIGdldENyZWF0aW9uRGF0ZSgpIHsKLS8vCQlpZiAoIWluaXRpYWxpemVkKSBpbml0aWFsaXplKCk7Ci0JCWlmIChkYXRlID09IG51bGwpCi0JCQlkb0xpZ2h0SW5pdGlhbGl6YXRpb24oKTsKLQkJcmV0dXJuIGRhdGU7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIGRhdGUuCi0JICogQHBhcmFtIGRhdGUgVGhlIGRhdGUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRpb25EYXRlKERhdGUgZGF0ZSkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQl0aGlzLmRhdGUgPSBkYXRlOwotCX0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFVSTCBnZXRVUkwoKSB7Ci0JCS8vaWYgKCFpbml0aWFsaXplZCkgaW5pdGlhbGl6ZSgpOwotCQkvL25vIG5lZWQgdG8gaW5pdGlhbGl6ZSwgYWx3YXlzIHNldAotCQlkZWxheWVkUmVzb2x2ZSgpOwotCQlyZXR1cm4gbG9jYXRpb25VUkw7Ci0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0vLwkJaWYgKCFpbml0aWFsaXplZCkgaW5pdGlhbGl6ZSgpOwotCQlpZiAobGFiZWwgPT0gbnVsbCkKLQkJCWRvTGlnaHRJbml0aWFsaXphdGlvbigpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMC4yCi0JICovCi0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0TGFiZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYWJlbC4KLQkgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbG9jYXRpb25VUkxTdHJpbmcuCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvblVSTFN0cmluZygpIHsKLQkJaWYgKCFpbml0aWFsaXplZCkgZGVsYXllZFJlc29sdmUoKTsKLQkJcmV0dXJuIGxvY2F0aW9uVVJMU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxvY2F0aW9uVVJMU3RyaW5nLgotCSAqIEBwYXJhbSBsb2NhdGlvblVSTFN0cmluZyBUaGUgbG9jYXRpb25VUkxTdHJpbmcgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb25VUkxTdHJpbmcoU3RyaW5nIGxvY2F0aW9uVVJMU3RyaW5nKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCXRoaXMubG9jYXRpb25VUkxTdHJpbmcgPSBsb2NhdGlvblVSTFN0cmluZzsKLQkJdGhpcy5sb2NhdGlvblVSTCA9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZGVsT2JqZWN0I3Jlc29sdmUoVVJMLCBSZXNvdXJjZUJ1bmRsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvbHZlKFVSTCBiYXNlLCBVUkwgYnVuZGxlVVJMKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQotCQl0aGlzLmJhc2UgPSBiYXNlOwotCQl0aGlzLmJ1bmRsZVVSTCA9IGJ1bmRsZVVSTDsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRpbWVsaW5lLgotCSAqIEByZXR1cm4gbG9uZwotCSAqLwotCXB1YmxpYyBsb25nIGdldFRpbWVsaW5lKCkgewotCQlyZXR1cm4gMDsKLS8vCQlpZiAoIWluaXRpYWxpemVkKSBpbml0aWFsaXplKCk7Ci0vLwkJcmV0dXJuIHRpbWVsaW5lOwotCX0KLQotCi0JLyoKLQkgKiBpbml0aWFsaXplIHRoZSBjb25maWd1cmF0aW9ucyBmcm9tIHRoZSBwZXJzaXN0ZW50IG1vZGVsLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQkKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBwbGF0Zm9ybUNvbmZpZyA9IGdldFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOwotCQkJCQotCQkJCW5ldyBJbnN0YWxsQ29uZmlndXJhdGlvblBhcnNlcihwbGF0Zm9ybUNvbmZpZywgdGhpcywgZmFsc2UpOwotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCVVwZGF0ZUNvcmUud2Fybihsb2NhdGlvblVSTFN0cmluZyArICIgZG9lcyBub3QgZXhpc3QsIFRoZSBsb2NhbCBzaXRlIGlzIG5vdCBpbiBzeW5jaCB3aXRoIHRoZSBmaWxlIHN5c3RlbSBhbmQgaXMgcG9pbnRpbmcgdG8gYSBmaWxlIHRoYXQgZG9lc24ndCBleGlzdC4iLCBleGNlcHRpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuSW5zdGFsbENvbmZpZ3VyYXRpb25fRXJyb3JEdXJpbmdGaWxlQWNjZXNzLCAobmV3IFN0cmluZ1tdIHsgbG9jYXRpb25VUkxTdHJpbmcgfSkpLCBleGNlcHRpb24pOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuSW5zdGFsbENvbmZpZ3VyYXRpb25fRXJyb3JEdXJpbmdGaWxlQWNjZXNzLCAobmV3IFN0cmluZ1tdIHsgbG9jYXRpb25VUkxTdHJpbmcgfSkpLCBleGNlcHRpb24pOwotCQkJfQotCQkJCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS53YXJuKCJFcnJvciBwcm9jZXNzaW5nIGNvbmZpZ3VyYXRpb24gaGlzdG9yeToiICsgbG9jYXRpb25VUkwudG9FeHRlcm5hbEZvcm0oKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCWluaXRpYWxpemVkID0gdHJ1ZTsKLQkJfQotCQkKLQkJLy9maW5pc2ggcmVzb2x2ZQotCQkvLyBQRVJGOgotCQl0cnkgewotCQkJLy8gZGVsZWdhdGUKLQkJCXJlc29sdmVMaXN0UmVmZXJlbmNlKGdldEFjdGl2aXR5TW9kZWwoKSwgYmFzZSwgYnVuZGxlVVJMKTsKLQkJCXJlc29sdmVMaXN0UmVmZXJlbmNlKGdldENvbmZpZ3VyYXRpb25TaXRlc01vZGVsKCksIGJhc2UsIGJ1bmRsZVVSTCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXt9CQkKLQl9Ci0KLQlwcml2YXRlIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gZ2V0UGxhdGZvcm1Db25maWd1cmF0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBwbGF0Zm9ybUNvbmZpZzsKLQkJaWYgKFVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKGdldFVSTCgpLCBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCkpKQotCQkJcGxhdGZvcm1Db25maWcgPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7Ci0JCWVsc2UgCi0JCQlwbGF0Zm9ybUNvbmZpZyA9IENvbmZpZ3VyYXRvclV0aWxzLmdldFBsYXRmb3JtQ29uZmlndXJhdGlvbihnZXRVUkwoKSk7Ci0JCXJldHVybiBwbGF0Zm9ybUNvbmZpZzsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRvTGlnaHRJbml0aWFsaXphdGlvbigpIHsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBwbGF0Zm9ybUNvbmZpZyA9IGdldFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOwotCQkJCi0JCQkJbmV3IEluc3RhbGxDb25maWd1cmF0aW9uUGFyc2VyKHBsYXRmb3JtQ29uZmlnLCB0aGlzLCB0cnVlKTsKLQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQlVcGRhdGVDb3JlLndhcm4obG9jYXRpb25VUkxTdHJpbmcgKyAiIGRvZXMgbm90IGV4aXN0LCBUaGUgbG9jYWwgc2l0ZSBpcyBub3QgaW4gc3luY2ggd2l0aCB0aGUgZmlsZSBzeXN0ZW0gYW5kIGlzIHBvaW50aW5nIHRvIGEgZmlsZSB0aGF0IGRvZXNuJ3QgZXhpc3QuIiwgZXhjZXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkluc3RhbGxDb25maWd1cmF0aW9uX0Vycm9yRHVyaW5nRmlsZUFjY2VzcywgKG5ldyBTdHJpbmdbXSB7IGxvY2F0aW9uVVJMU3RyaW5nIH0pKSwgZXhjZXB0aW9uKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkluc3RhbGxDb25maWd1cmF0aW9uX0Vycm9yRHVyaW5nRmlsZUFjY2VzcywgKG5ldyBTdHJpbmdbXSB7IGxvY2F0aW9uVVJMU3RyaW5nIH0pKSwgZXhjZXB0aW9uKTsKLQkJCX0gCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS53YXJuKCJFcnJvciBwcm9jZXNzaW5nIGNvbmZpZ3VyYXRpb24gaGlzdG9yeToiICsgbG9jYXRpb25VUkwudG9FeHRlcm5hbEZvcm0oKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCWxpZ2h0bHlJbml0aWFsaXplZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBkZWxheWVkUmVzb2x2ZSgpIHsKLQotCQkvLyBQRVJGOiBkZWxheSByZXNvbHV0aW9uCi0JCWlmIChyZXNvbHZlZCkKLQkJCXJldHVybjsKLQotCQlyZXNvbHZlZCA9IHRydWU7Ci0JCS8vIHJlc29sdmUgbG9jYWwgZWxlbWVudHMKLQkJdHJ5IHsKLQkJCS8vbG9jYXRpb25VUkwgPSByZXNvbHZlVVJMKGJhc2UsIGJ1bmRsZVVSTCwgbG9jYXRpb25VUkxTdHJpbmcpOwkJCi0JCQlsb2NhdGlvblVSTCA9IG5ldyBVUkwobG9jYXRpb25VUkxTdHJpbmcpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7Ci0JCQlGaWxlIGYgPSBuZXcgRmlsZShsb2NhdGlvblVSTFN0cmluZyk7Ci0JCQl0cnkgewotCQkJCWlmIChmLmV4aXN0cygpKQotCQkJCQlsb2NhdGlvblVSTCA9IGYudG9VUkwoKTsKLQkJCQllbHNlCi0JCQkJCWxvY2F0aW9uVVJMID0gYmFzZTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMSkgewotCQkJCWxvY2F0aW9uVVJMID0gYmFzZTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZXNldEFjdGl2aXRpZXMoKSB7Ci0JCWFjdGl2aXRpZXMgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0luc3RhbGxDb25maWd1cmF0aW9uUGFyc2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9JbnN0YWxsQ29uZmlndXJhdGlvblBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzY3YmIwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0luc3RhbGxDb25maWd1cmF0aW9uUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbDsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZUZlYXR1cmVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuU2l0ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuRmVhdHVyZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuUGxhdGZvcm1Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuU2l0ZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkJhc2VTaXRlTG9jYWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOwotCi0KLS8qKgotICogcGFyc2UgdGhlIGRlZmF1bHQgc2l0ZS54bWwKLSAqLwotCi1wdWJsaWMgY2xhc3MgSW5zdGFsbENvbmZpZ3VyYXRpb25QYXJzZXIgewotCXByaXZhdGUgUGxhdGZvcm1Db25maWd1cmF0aW9uIHBsYXRmb3JtQ29uZmlnOwotCXByaXZhdGUgVVJMIHNpdGVVUkw7Ci0JcHJpdmF0ZSBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGNvbmZpZzsKLQlwcml2YXRlIENvbmZpZ3VyZWRTaXRlTW9kZWwgY29uZmlnU2l0ZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBEZWZhdWx0U2l0ZVBhcnNlcgotCSAqLwotCXB1YmxpYyBJbnN0YWxsQ29uZmlndXJhdGlvblBhcnNlcigKLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBwbGF0Zm9ybUNvbmZpZywKLQkJSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBjb25maWcsIGJvb2xlYW4gbGlnaHQpCi0JCXRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJQXNzZXJ0LmlzVHJ1ZShwbGF0Zm9ybUNvbmZpZyBpbnN0YW5jZW9mIFBsYXRmb3JtQ29uZmlndXJhdGlvbik7Ci0JCXRoaXMucGxhdGZvcm1Db25maWcgPSAoUGxhdGZvcm1Db25maWd1cmF0aW9uKXBsYXRmb3JtQ29uZmlnOwotCQkKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0KLQkJLy8gREVCVUc6CQkKLQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1BBUlNJTkcpIHsKLQkJCVVwZGF0ZUNvcmUuZGVidWcoIlN0YXJ0IHBhcnNpbmcgQ29uZmlndXJhdGlvbjoiICsgKGNvbmZpZykuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJaWYgKGxpZ2h0KSB7Ci0JCQlwcm9jZXNzQ29uZmlndXJhdGlvbkxpZ2h0KHRoaXMucGxhdGZvcm1Db25maWcpOwotCQl9IGVsc2UgewotCQkJcHJvY2Vzc0NvbmZpZyh0aGlzLnBsYXRmb3JtQ29uZmlnKTsKLQkJfQotCX0KLQkKLQkKLQotCi0KLQkvKiogCi0JICogcHJvY2VzcyB0aGUgU2l0ZSBpbmZvCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NTaXRlKFNpdGVFbnRyeSBzaXRlRW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJLy9zaXRlIHVybAotCQlzaXRlVVJMID0gc2l0ZUVudHJ5LmdldFVSTCgpOwotCQl0cnkgewotCQkJc2l0ZVVSTCA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTChzaXRlVVJMKTsKLQkJCS8vIFRPRE8gd29ya2Fyb3VuZCBidWcgaW4gcGxhdGZvcm0gdXJsIHJlc29sdXRpb24KLQkJCWlmIChzaXRlVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlzaXRlVVJMID0gbmV3IEZpbGUoc2l0ZVVSTC5nZXRGaWxlKCkpLnRvVVJMKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGtlZXAgb3JpZ2luYWwgdXJsCi0JCX0KLQotCQkvLyBwb2xpY3kKLQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoc2l0ZVVSTCxudWxsKTsKLQotCQkvLyBjb25maWd1cmF0aW9uIHNpdGUKLQkJQmFzZVNpdGVMb2NhbEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBCYXNlU2l0ZUxvY2FsRmFjdG9yeSgpOwotCQljb25maWdTaXRlID0gZmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uU2l0ZU1vZGVsKChTaXRlTW9kZWwpIHNpdGUsIHNpdGVFbnRyeS5nZXRTaXRlUG9saWN5KCkuZ2V0VHlwZSgpKTsKLQotCQkvL3BsYXRmb3JtIHVybAotCQljb25maWdTaXRlLnNldFBsYXRmb3JtVVJMU3RyaW5nKHNpdGVFbnRyeS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJCi0JCS8vIGNvbmZpZ3VyZWQKLQkJY29uZmlnU2l0ZS5zZXRFbmFibGVkKHNpdGVFbnRyeS5pc0VuYWJsZWQoKSk7Ci0KLQkJLy8gY2hlY2sgaWYgdGhlIHNpdGUgZXhpc3RzIGFuZCBpcyB1cGRhdGFibGUKLQkgCWNvbmZpZ1NpdGUuc2V0VXBkYXRhYmxlKHNpdGVFbnRyeS5pc1VwZGF0ZWFibGUoKSk7Ci0JIAkKLQkJLy8gYWRkIHRvIGluc3RhbGwgY29uZmlndXJhdGlvbgotCSAJY29uZmlnLmFkZENvbmZpZ3VyYXRpb25TaXRlTW9kZWwoY29uZmlnU2l0ZSk7Ci0JIAljb25maWdTaXRlLnNldEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwoY29uZmlnKTsKLQkJCi0JCUZlYXR1cmVFbnRyeVtdIGZlYXR1cmVzID0gc2l0ZUVudHJ5LmdldEZlYXR1cmVFbnRyaWVzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxmZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJcHJvY2Vzc0ZlYXR1cmUoZmVhdHVyZXNbaV0pOwotCQl9Ci0JfQotCi0JLyoqIAotCSAqIHByb2Nlc3MgdGhlIERlZmF1bHRGZWF0dXJlIGluZm8KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0ZlYXR1cmUoRmVhdHVyZUVudHJ5IGZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJLy8gdXJsCi0JCVN0cmluZyBwYXRoID0gZmVhdHVyZS5nZXRVUkwoKTsgCi0JCVVSTCB1cmwgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGVVUkwsIHBhdGgsIG51bGwpOwotCi0JCWlmICh1cmwgIT0gbnVsbCkgewotCQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7Ci0JCQlyZWYuc2V0U2l0ZSgoSVNpdGUpIGNvbmZpZ1NpdGUuZ2V0U2l0ZU1vZGVsKCkpOwotCQkJcmVmLnNldFVSTCh1cmwpOwotCQkJKGNvbmZpZ1NpdGUuZ2V0Q29uZmlndXJhdGlvblBvbGljeU1vZGVsKCkpLmFkZENvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlKHJlZik7Ci0KLQkJCS8vdXBkYXRlVVJMCi0vL1RPRE8gZG8gd2UgbmVlZCB0aGUgdXBkYXRlIHVybCBhbmQgdG8gcmVzb2x2ZSBpdD8KLS8vCQkJU3RyaW5nIHVwZGF0ZVVSTFN0cmluZyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVwZGF0ZVVSTCIpOyAvLyROT04tTkxTLTEkCi0vLwkJCVVSTEVudHJ5IGVudHJ5ID0gbmV3IFVSTEVudHJ5KCk7Ci0vLwkJCWVudHJ5LnNldFVSTFN0cmluZyh1cGRhdGVVUkxTdHJpbmcpOwotLy8JCQllbnRyeS5yZXNvbHZlKHNpdGVVUkwsbnVsbCk7Ci0KLQkJCS8vIERFQlVHOgkJCi0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUEFSU0lORykgewotCQkJCVVwZGF0ZUNvcmUuZGVidWcoIkVuZCBQcm9jZXNzaW5nIERlZmF1bHRGZWF0dXJlIFRhZzogdXJsOiIgKyB1cmwudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQl9IGVsc2UgewotCQkJVXBkYXRlQ29yZS5sb2coIE1lc3NhZ2VzLkluc3RhbGxDb25maWd1cmF0aW9uUGFyc2VyX0ZlYXR1cmVSZWZlcmVuY2VOb1VSTCwgbmV3IEV4Y2VwdGlvbigpKTsgCi0JCX0KLQotCX0KLQotCS8qKiAKLQkgKiBwcm9jZXNzIHRoZSBBY3Rpdml0eSBpbmZvCi0JICovCi0vLwlwcml2YXRlIHZvaWQgcHJvY2Vzc0FjdGl2aXR5KEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotLy8KLS8vCQkvLyBhY3Rpb24KLS8vCQlTdHJpbmcgYWN0aW9uU3RyaW5nID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiYWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLS8vCQlpbnQgYWN0aW9uID0gSW50ZWdlci5wYXJzZUludChhY3Rpb25TdHJpbmcpOwotLy8KLS8vCQkvLyBjcmVhdGUKLS8vCQlDb25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbCBhY3Rpdml0eSA9Ci0vLwkJCW5ldyBCYXNlU2l0ZUxvY2FsRmFjdG9yeSgpLmNyZWF0ZUNvbmZpZ3VyYXRpb25BY3Rpdml0eU1vZGVsKCk7Ci0vLwkJYWN0aXZpdHkuc2V0QWN0aW9uKGFjdGlvbik7Ci0vLwotLy8JCS8vIGxhYmVsCi0vLwkJU3RyaW5nIGxhYmVsID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibGFiZWwiKTsgLy8kTk9OLU5MUy0xJAotLy8JCWlmIChsYWJlbCAhPSBudWxsKQotLy8JCQlhY3Rpdml0eS5zZXRMYWJlbChsYWJlbCk7Ci0vLwotLy8JCS8vIGRhdGUKLS8vCQlTdHJpbmcgZGF0ZVN0cmluZyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImRhdGUiKTsgLy8kTk9OLU5MUy0xJAotLy8JCURhdGUgZGF0ZSA9IG5ldyBEYXRlKExvbmcucGFyc2VMb25nKGRhdGVTdHJpbmcpKTsKLS8vCQlhY3Rpdml0eS5zZXREYXRlKGRhdGUpOwotLy8KLS8vCQkvLyBzdGF0dXMKLS8vCQlTdHJpbmcgc3RhdHVzU3RyaW5nID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgic3RhdHVzIik7IC8vJE5PTi1OTFMtMSQKLS8vCQlpbnQgc3RhdHVzID0gSW50ZWdlci5wYXJzZUludChzdGF0dXNTdHJpbmcpOwotLy8JCWFjdGl2aXR5LnNldFN0YXR1cyhzdGF0dXMpOwotLy8KLS8vCQljb25maWcuYWRkQWN0aXZpdHlNb2RlbChhY3Rpdml0eSk7Ci0vLwotLy8JCS8vIERFQlVHOgkJCi0vLwkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1BBUlNJTkcpIHsKLS8vCQkJVXBkYXRlQ29yZS5kZWJ1ZygiRW5kIFByb2Nlc3NpbmcgQWN0aXZpdHk6IGFjdGlvbjoiICsgYWN0aW9uU3RyaW5nICsgIiBsYWJlbDogIiArIGxhYmVsICsgIiBkYXRlOiIgKyBkYXRlU3RyaW5nICsgIiBzdGF0dXMiICsgc3RhdHVzU3RyaW5nKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotLy8JCX0KLS8vCi0vLwl9Ci0KLQkvKiogCi0JICogcHJvY2VzcyB0aGUgQ29uZmlnIGluZm8KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0NvbmZpZyhQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcGxhdGZvcm1Db25maWcpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJLy8gZGF0ZQotCQlwcm9jZXNzQ29uZmlndXJhdGlvbkxpZ2h0KHBsYXRmb3JtQ29uZmlnKTsKLQkJCi0JCS8vdGltZWxpbmUKLS8vCQlTdHJpbmcgdGltZWxpbmVTdHJpbmcgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ0aW1lbGluZSIpOyAvLyROT04tTkxTLTEkCi0vLwkJbG9uZyB0aW1lbGluZSA9IGNvbmZpZy5nZXRDcmVhdGlvbkRhdGUoKS5nZXRUaW1lKCk7Ci0vLwkJaWYgKHRpbWVsaW5lU3RyaW5nIT1udWxsKSB7Ci0vLwkJCXRpbWVsaW5lID0gTG9uZy5wYXJzZUxvbmcodGltZWxpbmVTdHJpbmcpOwotLy8JCX0KLS8vCQljb25maWcuc2V0VGltZWxpbmUodGltZWxpbmUpOwotCi0JCVNpdGVFbnRyeVtdIHNpdGVzID0gcGxhdGZvcm1Db25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmdldFNpdGVzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxzaXRlcy5sZW5ndGg7IGkrKykKLQkJCXByb2Nlc3NTaXRlKHNpdGVzW2ldKTsKLQotCX0KLQotCi0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0NvbmZpZ3VyYXRpb25MaWdodChQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcGxhdGZvcm1Db25maWcpIHsKLQkJRGF0ZSBkYXRlID0gbmV3IERhdGUocGxhdGZvcm1Db25maWcuZ2V0Q2hhbmdlU3RhbXAoKSk7Ci0JCWNvbmZpZy5zZXRDcmVhdGlvbkRhdGUoZGF0ZSk7Ci0JCWNvbmZpZy5zZXRMYWJlbChkYXRlLnRvU3RyaW5nKCkpOwotCQkKLQkJY29uZmlnLnNldEN1cnJlbnQoIGRhdGUuZXF1YWxzKG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuUGxhdGZvcm1Db25maWd1cmF0aW9uLmdldEN1cnJlbnQoKS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0RGF0ZSgpKSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvU2l0ZUxvY2FsTW9kZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL1NpdGVMb2NhbE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5OWQ0NzEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvU2l0ZUxvY2FsTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5Nb2RlbE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5CYXNlU2l0ZUxvY2FsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZU1hbmFnZXJVdGlsczsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIG1hbmFnZXMgdGhlIGNvbmZpZ3VyYXRpb25zLgotICovCi0KLXB1YmxpYyBjbGFzcyBTaXRlTG9jYWxNb2RlbCBleHRlbmRzIE1vZGVsT2JqZWN0IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfRklMRSA9ICJwbGF0Zm9ybS54bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBsb25nIHN0YW1wOwotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCXByaXZhdGUgVVJMIGxvY2F0aW9uOwotCXByaXZhdGUgU3RyaW5nIGxvY2F0aW9uVVJMU3RyaW5nOwotCXByaXZhdGUgaW50IGhpc3RvcnkgPSBVcGRhdGVDb3JlLkRFRkFVTFRfSElTVE9SWTsKLQlwcml2YXRlIExpc3QgLyogb2YgSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCAqL2NvbmZpZ3VyYXRpb25zOwotCXByaXZhdGUgTGlzdCAvKiBvZiBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsICovcHJlc2VydmVkQ29uZmlndXJhdGlvbnM7Ci0JcHJpdmF0ZSBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGN1cnJlbnRDb25maWd1cmF0aW9uOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIExvY2FsU2l0ZQotCSAqLwotCXB1YmxpYyBTaXRlTG9jYWxNb2RlbCgpewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBnZXRDdXJyZW50Q29uZmlndXJhdGlvbk1vZGVsKCkgewotCQlyZXR1cm4gY3VycmVudENvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsW10gZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnlNb2RlbCgpIHsKLQkJaWYgKGNvbmZpZ3VyYXRpb25zPT1udWxsKQotCQkJLy8gaW5pdGlhbGl6ZSBoaXN0b3J5Ci0JCQlwcm9jZXNzSGlzdG9yeSgpOwotCQkKLQkJaWYgKGNvbmZpZ3VyYXRpb25zID09IG51bGwgfHwgY29uZmlndXJhdGlvbnMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbmV3IEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWxbMF07Ci0JCWVsc2UKLQkJCXJldHVybiAoSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbFtdKWNvbmZpZ3VyYXRpb25zLnRvQXJyYXkoYXJyYXlUeXBlRm9yKGNvbmZpZ3VyYXRpb25zKSk7Ci0JfQotCi0JLyoqCi0JICogYWRkcyBhIG5ldyBjb25maWd1cmF0aW9uIHRvIHRoZSBMb2NhbFNpdGUKLQkgKiAgdGhlIG5ld2x5IGFkZGVkIGNvbmZpZ3VyYXRpb24gaXMgdGVoIGN1cnJlbnQgb25lCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29uZmlndXJhdGlvbk1vZGVsKEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgY29uZmlnKSB7Ci0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJaWYgKGNvbmZpZ3VyYXRpb25zID09IG51bGwpCi0JCQkJY29uZmlndXJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAoIWNvbmZpZ3VyYXRpb25zLmNvbnRhaW5zKGNvbmZpZykpCi0JCQkJY29uZmlndXJhdGlvbnMuYWRkKGNvbmZpZyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBhZGRzIGEgbmV3IGNvbmZpZ3VyYXRpb24gdG8gdGhlIExvY2FsU2l0ZQotCSAqICB0aGUgbmV3bHkgYWRkZWQgY29uZmlndXJhdGlvbiBpcyB0ZWggY3VycmVudCBvbmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVDb25maWd1cmF0aW9uTW9kZWwoSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBjb25maWcpIHsKLQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29uZmlndXJhdGlvbnMucmVtb3ZlKGNvbmZpZyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBHZXRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgbG9jYWwgc2l0ZS4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBVUkwKLQkgKi8KLQlwdWJsaWMgVVJMIGdldExvY2F0aW9uVVJMKCkgewotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbG9jYXRpb25VUkxTdHJpbmcuCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvblVSTFN0cmluZygpIHsKLQkJcmV0dXJuIGxvY2F0aW9uVVJMU3RyaW5nOwotCX0KLQotCi0JLyoqCi0JICogU2V0cyB0aGUgbG9jYXRpb25VUkxTdHJpbmcuCi0JICogQHBhcmFtIGxvY2F0aW9uVVJMU3RyaW5nIFRoZSBsb2NhdGlvblVSTFN0cmluZyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvblVSTFN0cmluZyhTdHJpbmcgbG9jYXRpb25VUkxTdHJpbmcpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJdGhpcy5sb2NhdGlvblVSTFN0cmluZyA9IGxvY2F0aW9uVVJMU3RyaW5nOwotCQl0aGlzLmxvY2F0aW9uPW51bGw7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxhYmVsLgotCSAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIGludCBnZXRNYXhpbXVtSGlzdG9yeUNvdW50KCkgewotCQlyZXR1cm4gaGlzdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWF4aW11bUhpc3RvcnlDb3VudChpbnQgaGlzdG9yeSkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQl0aGlzLmhpc3RvcnkgPSBoaXN0b3J5OwotCX0KLQotCQotCS8qKgotCSAqIEFkZHMgYSBwcmVzZXJ2ZWQgY29uZmlndXJhdGlvbiBpbnRvIHRlaCBjb2xsZWN0aW9uCi0JICogZG8gbm90IHNhdmUgdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJlc2VydmVkSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbChJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGNvbmZpZ3VyYXRpb24pIHsKLQkJaWYgKHByZXNlcnZlZENvbmZpZ3VyYXRpb25zID09IG51bGwpCi0JCQlwcmVzZXJ2ZWRDb25maWd1cmF0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwcmVzZXJ2ZWRDb25maWd1cmF0aW9ucy5hZGQoY29uZmlndXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZVByZXNlcnZlZENvbmZpZ3VyYXRpb25Nb2RlbChJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGNvbmZpZ3VyYXRpb24pIHsKLQkJaWYgKHByZXNlcnZlZENvbmZpZ3VyYXRpb25zICE9IG51bGwpIHsKLQkJCXJldHVybiBwcmVzZXJ2ZWRDb25maWd1cmF0aW9ucy5yZW1vdmUoY29uZmlndXJhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbFtdIGdldFByZXNlcnZlZENvbmZpZ3VyYXRpb25zTW9kZWwoKSB7Ci0JCWlmIChwcmVzZXJ2ZWRDb25maWd1cmF0aW9ucz09bnVsbCB8fCBwcmVzZXJ2ZWRDb25maWd1cmF0aW9ucy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbmV3IEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWxbMF07Ci0JCXJldHVybiAoSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbFtdKXByZXNlcnZlZENvbmZpZ3VyYXRpb25zLnRvQXJyYXkoYXJyYXlUeXBlRm9yKHByZXNlcnZlZENvbmZpZ3VyYXRpb25zKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50Q29uZmlndXJhdGlvbi4KLQkgKiBAcGFyYW0gY3VycmVudENvbmZpZ3VyYXRpb24gVGhlIGN1cnJlbnRDb25maWd1cmF0aW9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRDb25maWd1cmF0aW9uTW9kZWwoSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBjdXJyZW50Q29uZmlndXJhdGlvbikgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQl0aGlzLmN1cnJlbnRDb25maWd1cmF0aW9uID0gY3VycmVudENvbmZpZ3VyYXRpb247Ci0JCQotCQkvLzIuMC4yIHNldCB0aGUgY29uZmlndXJlZFNpdGUgb2Ygc2l0ZXMKLQkJQ29uZmlndXJlZFNpdGVNb2RlbFtdIGNvbmZTaXRlcyA9IGN1cnJlbnRDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyYXRpb25TaXRlc01vZGVsKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZlNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb25mU2l0ZXNbaV0uZ2V0U2l0ZU1vZGVsKCkuc2V0Q29uZmlndXJlZFNpdGVNb2RlbChjb25mU2l0ZXNbaV0pOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZGVsT2JqZWN0I3Jlc29sdmUoVVJMKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc29sdmUoVVJMIGJhc2UsVVJMIGJ1bmRsZVVSTCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCS8vIGxvY2FsCi0JCWxvY2F0aW9uID0gcmVzb2x2ZVVSTChiYXNlLGJ1bmRsZVVSTCxnZXRMb2NhdGlvblVSTFN0cmluZygpKTsKLQkJCi0JCS8vIGRlbGVnYXRlCi0JCXJlc29sdmVMaXN0UmVmZXJlbmNlKGdldENvbmZpZ3VyYXRpb25IaXN0b3J5TW9kZWwoKSxiYXNlLGJ1bmRsZVVSTCk7Ci0JCXJlc29sdmVMaXN0UmVmZXJlbmNlKGdldFByZXNlcnZlZENvbmZpZ3VyYXRpb25zTW9kZWwoKSxiYXNlLGJ1bmRsZVVSTCk7Ci0JCXJlc29sdmVSZWZlcmVuY2UoZ2V0Q3VycmVudENvbmZpZ3VyYXRpb25Nb2RlbCgpLGJhc2UsYnVuZGxlVVJMKTsKLQl9Ci0JCi0KLQkvKioKLQkgKiBHZXRzIHRoZSBzdGFtcC4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBsb25nCi0JICovCi0JcHVibGljIGxvbmcgZ2V0U3RhbXAoKSB7Ci0JCXJldHVybiBzdGFtcDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGFtcC4KLQkgKiBAcGFyYW0gc3RhbXAgVGhlIHN0YW1wIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YW1wKGxvbmcgc3RhbXApIHsKLQkJdGhpcy5zdGFtcCA9IHN0YW1wOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuTW9kZWxPYmplY3QjZ2V0UHJvcGVydHlOYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKLQkJcmV0dXJuICJwbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIHJlYWRzIHRoZSBjb25maWd1cmF0aW9uL2hpc3RvcnkgZGlyZWN0b3J5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NIaXN0b3J5KCkgewotCQl0cnkgewotCQkJVVJMIGhpc3RvcnlVUkwgPSBuZXcgVVJMKGdldExvY2F0aW9uVVJMKCksICJoaXN0b3J5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWhpc3RvcnlVUkwgPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwoaGlzdG9yeVVSTCk7Ci0JCQlGaWxlIGhpc3RvcnlEaXIgPSBuZXcgRmlsZShoaXN0b3J5VVJMLmdldEZpbGUoKSk7Ci0JCQlpZiAoaGlzdG9yeURpci5leGlzdHMoKSkgewotCQkJCUZpbGVbXSBiYWNrZWRDb25maWdzID0gaGlzdG9yeURpci5saXN0RmlsZXMoKTsKLQkJCQlCYXNlU2l0ZUxvY2FsRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEJhc2VTaXRlTG9jYWxGYWN0b3J5KCk7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPGJhY2tlZENvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBiYWNrZWRDb25maWdzW2ldLmdldE5hbWUoKTsKLQkJCQkJaWYgKG5hbWUuZW5kc1dpdGgoIi54bWwiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCktNCk7Ci0JCQkJCWVsc2UgCi0JCQkJCQljb250aW51ZTsKLQkJCQkJRGF0ZSBkYXRlID0gbmV3IERhdGUoTG9uZy5wYXJzZUxvbmcobmFtZSkpOwotCQkJCQlJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGNvbmZpZyA9IGZhY3RvcnkuY3JlYXRlSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCgpOwotCQkJCQljb25maWcuc2V0TG9jYXRpb25VUkxTdHJpbmcoYmFja2VkQ29uZmlnc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKS5yZXBsYWNlKCdcXCcsICcvJykpOwotCQkJCQljb25maWcuc2V0TGFiZWwoZGF0ZS50b1N0cmluZygpKTsKLQkJCQkJY29uZmlnLnNldENyZWF0aW9uRGF0ZShkYXRlKTsKLQkJCQkJY29uZmlnLnJlc29sdmUoYmFja2VkQ29uZmlnc1tpXS50b1VSTCgpLCBnZXRSZXNvdXJjZUJ1bmRsZVVSTCgpKTsKLQkKLQkJCQkJLy8gYWRkIHRoZSBjb25maWcKLQkJCQkJYWRkQ29uZmlndXJhdGlvbk1vZGVsKGNvbmZpZyk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS53YXJuKCJFcnJvciBwcm9jZXNzaW5nIGhpc3Rvcnk6ICIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhpcyBzaXRlbG9jYWwKLQkgKi8KLQlVUkwgZ2V0UmVzb3VyY2VCdW5kbGVVUkwoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVVSTCB1cmwgPSBudWxsOwotCQl0cnkgewotCQkJdXJsID0gVXBkYXRlTWFuYWdlclV0aWxzLmFzRGlyZWN0b3J5VVJMKGdldExvY2F0aW9uVVJMKCkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS53YXJuKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpICsgIjoiICsgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOyAKLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvU2l0ZUxvY2FsUGFyc2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9TaXRlTG9jYWxQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI3MjY2My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9TaXRlTG9jYWxQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklMb2NhbFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5JUGxhdGZvcm1Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuUGxhdGZvcm1Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkJhc2VTaXRlTG9jYWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkluc3RhbGxDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkxvY2FsU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZU1hbmFnZXJVdGlsczsKLQotLyoqCi0gKiBwYXJzZSB0aGUgZGVmYXVsdCBzaXRlLnhtbAotICovCi0KLXB1YmxpYyBjbGFzcyBTaXRlTG9jYWxQYXJzZXIgewotCi0JcHJpdmF0ZSBQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcGxhdGZvcm1Db25maWc7Ci0JcHJpdmF0ZSBTaXRlTG9jYWxNb2RlbCBzaXRlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJRyA9ICJjb25maWciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBidW5kbGU7Ci0JcHJpdmF0ZSBCYXNlU2l0ZUxvY2FsRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEJhc2VTaXRlTG9jYWxGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhpcyBzaXRlbG9jYWwKLQkgKi8KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBudWxsOwotCQlVUkwgdXJsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXVybCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5hc0RpcmVjdG9yeVVSTChzaXRlLmdldExvY2F0aW9uVVJMKCkpOwotCQkJQ2xhc3NMb2FkZXIgbCA9IG5ldyBVUkxDbGFzc0xvYWRlcihuZXcgVVJMW10geyB1cmwgfSwgbnVsbCk7Ci0JCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoInBsYXRmb3JtIiwgTG9jYWxlLmdldERlZmF1bHQoKSwgbCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZUNvcmUud2FybihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSArICI6IiArIHVybC50b0V4dGVybmFsRm9ybSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS53YXJuKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsgCi0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVmYXVsdFNpdGVQYXJzZXIKLQkgKi8KLQlwdWJsaWMgU2l0ZUxvY2FsUGFyc2VyKElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcGxhdGZvcm1Db25maWcsIElMb2NhbFNpdGUgc2l0ZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzVHJ1ZShwbGF0Zm9ybUNvbmZpZyBpbnN0YW5jZW9mIFBsYXRmb3JtQ29uZmlndXJhdGlvbik7Ci0JCXRoaXMucGxhdGZvcm1Db25maWcgPSAoUGxhdGZvcm1Db25maWd1cmF0aW9uKXBsYXRmb3JtQ29uZmlnOwotCQkKLQkJQXNzZXJ0LmlzVHJ1ZShzaXRlIGluc3RhbmNlb2YgU2l0ZUxvY2FsTW9kZWwpOwotCQl0aGlzLnNpdGUgPSAoU2l0ZUxvY2FsTW9kZWwpIHNpdGU7Ci0KLQkJLy8gREVCVUc6CQkKLQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1BBUlNJTkcpIHsKLQkJCVVwZGF0ZUNvcmUuZGVidWcoIlN0YXJ0IHBhcnNpbmcgbG9jYWxzaXRlOiIgKyAoKFNpdGVMb2NhbE1vZGVsKSBzaXRlKS5nZXRMb2NhdGlvblVSTFN0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlidW5kbGUgPSBnZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQkKLQkJcHJvY2Vzc0NvbmZpZygpOwotCQkvL3Byb2Nlc3NIaXN0b3J5KCk7Ci0JfQotCi0JCi0vLwkvKiogCi0vLwkgKiBwcm9jZXNzIHRoZSBTaXRlIGluZm8KLS8vCSAqLwotLy8JcHJpdmF0ZSB2b2lkIHByb2Nlc3NTaXRlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0vLwkJLy8KLS8vCQlTdHJpbmcgaW5mbyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImxhYmVsIik7IC8vJE5PTi1OTFMtMSQKLS8vCQlpbmZvID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFJlc291cmNlU3RyaW5nKGluZm8sIGJ1bmRsZSk7Ci0vLwkJc2l0ZS5zZXRMYWJlbChpbmZvKTsKLS8vCQotLy8JCS8vIGhpc3RvcnkKLS8vCQlTdHJpbmcgaGlzdG9yeVN0cmluZyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImhpc3RvcnkiKTsgLy8kTk9OLU5MUy0xJAotLy8JCWludCBoaXN0b3J5OwotLy8JCWlmIChoaXN0b3J5U3RyaW5nID09IG51bGwgfHwgaGlzdG9yeVN0cmluZy5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLS8vCQkJaGlzdG9yeSA9IFNpdGVMb2NhbE1vZGVsLkRFRkFVTFRfSElTVE9SWTsKLS8vCQl9IGVsc2UgewotLy8JCQloaXN0b3J5ID0gSW50ZWdlci5wYXJzZUludChoaXN0b3J5U3RyaW5nKTsKLS8vCQl9Ci0vLwkJc2l0ZS5zZXRNYXhpbXVtSGlzdG9yeUNvdW50KGhpc3RvcnkpOwotLy8JCi0vLwkJLy9zdGFtcAotLy8JCVN0cmluZyBzdGFtcFN0cmluZyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInN0YW1wIik7IC8vJE5PTi1OTFMtMSQKLS8vCQlsb25nIHN0YW1wID0gTG9uZy5wYXJzZUxvbmcoc3RhbXBTdHJpbmcpOwotLy8JCXNpdGUuc2V0U3RhbXAoc3RhbXApOwotLy8JCi0vLwkJLy8gREVCVUc6CQkKLS8vCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUEFSU0lORykgewotLy8JCQlVcGRhdGVDb3JlLmRlYnVnKCJFbmQgcHJvY2VzcyBTaXRlIGxhYmVsOiIgKyBpbmZvKTsgLy8kTk9OLU5MUy0xJAotLy8JCX0KLS8vCQotLy8JfQotCi0JLyoqIAotCSAqIHByb2Nlc3MgdGhlIENvbmZpZyBpbmZvCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb25maWcoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgbGFiZWwgPSBwbGF0Zm9ybUNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0RGF0ZSgpLnRvU3RyaW5nKCk7Ci0JCWxhYmVsID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFJlc291cmNlU3RyaW5nKGxhYmVsLCBidW5kbGUpOwotCQlzaXRlLnNldExhYmVsKGxhYmVsKTsKLQotCQlVUkwgdXJsID0gc2l0ZS5nZXRMb2NhdGlvblVSTCgpOwotCQlJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGNvbmZpZyA9IGZhY3RvcnkuY3JlYXRlSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCgpOwotCQljb25maWcuc2V0TG9jYXRpb25VUkxTdHJpbmcodXJsLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQljb25maWcuc2V0TGFiZWwobGFiZWwpOwotCQljb25maWcucmVzb2x2ZSh1cmwsIHNpdGUuZ2V0UmVzb3VyY2VCdW5kbGVVUkwoKSk7Ci0KLQkJLy8gYWRkIHRoZSBjb25maWcKLQkJKChMb2NhbFNpdGUpc2l0ZSkuYWRkQ29uZmlndXJhdGlvbigoSW5zdGFsbENvbmZpZ3VyYXRpb24pY29uZmlnKTsKLQotCQkvLyBERUJVRzoJCQotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUEFSU0lORykgewotCQkJVXBkYXRlQ29yZS5kZWJ1ZygiRW5kIFByb2Nlc3NpbmcgQ29uZmlnIFRhZzogdXJsOiIgKyB1cmwudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL1NpdGVXaXRoVGltZXN0YW1wLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9TaXRlV2l0aFRpbWVzdGFtcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzRkMzIzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL1NpdGVXaXRoVGltZXN0YW1wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlOwotCi0vKioKLSAqIFRoaXMgaXMgYSB3cmFwcGVyIGNsYXNzIGZvciBTaXRlIGNsYXNzIHRoYXQgYWRkcyB0aW1lc3RhbXAKLSAqIAotICoKLSAqLwotcHVibGljIGNsYXNzIFNpdGVXaXRoVGltZXN0YW1wIGV4dGVuZHMgU2l0ZSBpbXBsZW1lbnRzIElUaW1lc3RhbXAgewotCi0JcHJpdmF0ZSBEYXRlIHRpbWVzdGFtcDsKLQkKLQkvKnByaXZhdGUgU2l0ZSBzaXRlOwotCQotCXB1YmxpYyBTaXRlV2l0aFRpbWVzdGFtcCggU2l0ZSBzaXRlKSB7Ci0JCXRoaXMuc2l0ZSA9IHNpdGU7Ci0JfSovCi0JCi0JcHVibGljIERhdGUgZ2V0VGltZXN0YW1wKCkgewotCQlyZXR1cm4gdGltZXN0YW1wOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChEYXRlIHRpbWVzdGFtcCkgewotCQl0aGlzLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKLQkJCi0JfQotLyoKLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gc2l0ZS5pc1JlYWRPbmx5KCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsJCQotCQlyZXR1cm4gc2l0ZS5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBsdWdpbkVudHJ5KElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSkgewkJCi0JCXNpdGUuYWRkUGx1Z2luRW50cnkocGx1Z2luRW50cnkpOwotCX0KLQotCXB1YmxpYyBJRmVhdHVyZSBjcmVhdGVGZWF0dXJlKFN0cmluZyB0eXBlLCBVUkwgdXJsKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CQotCQlyZXR1cm4gc2l0ZS5jcmVhdGVGZWF0dXJlKHR5cGUsIHVybCk7Ci0JfQotCi0JcHVibGljIElGZWF0dXJlIGNyZWF0ZUZlYXR1cmUoU3RyaW5nIHR5cGUsIFVSTCB1cmwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewkJCi0JCXJldHVybiBzaXRlLmNyZWF0ZUZlYXR1cmUodHlwZSwgdXJsLCBtb25pdG9yKTsKLQl9Ci0KLQlwdWJsaWMgSUFyY2hpdmVSZWZlcmVuY2VbXSBnZXRBcmNoaXZlcygpIHsJCQotCQlyZXR1cm4gc2l0ZS5nZXRBcmNoaXZlcygpOwotCX0KLQotCXB1YmxpYyBJQ2F0ZWdvcnlbXSBnZXRDYXRlZ29yaWVzKCkgewkJCi0JCXJldHVybiBzaXRlLmdldENhdGVnb3JpZXMoKTsKLQl9Ci0KLQlwdWJsaWMgSUNhdGVnb3J5IGdldENhdGVnb3J5KFN0cmluZyBrZXkpIHsJCQotCQlyZXR1cm4gc2l0ZS5nZXRDYXRlZ29yeShrZXkpOwotCX0KLQotCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCkgewkKLQkJcmV0dXJuIHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UGFja2FnZWRGZWF0dXJlVHlwZSgpIHsJCi0JCXJldHVybiBzaXRlLmdldERlZmF1bHRQYWNrYWdlZEZlYXR1cmVUeXBlKCk7Ci0JfQotCi0JcHVibGljIElVUkxFbnRyeSBnZXREZXNjcmlwdGlvbigpIHsJCi0JCXJldHVybiBzaXRlLmdldERlc2NyaXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0RG93bmxvYWRTaXplRm9yKElGZWF0dXJlIGZlYXR1cmUpIHsJCi0JCXJldHVybiBzaXRlLmdldERvd25sb2FkU2l6ZUZvcihmZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgSVNpdGVGZWF0dXJlUmVmZXJlbmNlIGdldEZlYXR1cmVSZWZlcmVuY2UoSUZlYXR1cmUgZmVhdHVyZSkgewkKLQkJcmV0dXJuIHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZShmZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKSB7CQotCQlyZXR1cm4gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyBsb25nIGdldEluc3RhbGxTaXplRm9yKElGZWF0dXJlIGZlYXR1cmUpIHsJCi0JCXJldHVybiBzaXRlLmdldEluc3RhbGxTaXplRm9yKGZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBJVVJMRW50cnlbXSBnZXRNaXJyb3JTaXRlRW50cmllcygpIHsJCi0JCXJldHVybiBzaXRlLmdldE1pcnJvclNpdGVFbnRyaWVzKCk7Ci0JfQotCi0JcHVibGljIElQbHVnaW5FbnRyeVtdIGdldFBsdWdpbkVudHJpZXMoKSB7CQotCQlyZXR1cm4gc2l0ZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JfQotCi0JcHVibGljIElQbHVnaW5FbnRyeVtdIGdldFBsdWdpbkVudHJpZXNPbmx5UmVmZXJlbmNlZEJ5KElGZWF0dXJlIGZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsJCi0JCXJldHVybiBzaXRlLmdldFBsdWdpbkVudHJpZXNPbmx5UmVmZXJlbmNlZEJ5KGZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UGx1Z2luRW50cnlDb3VudCgpIHsJCQotCQlyZXR1cm4gc2l0ZS5nZXRQbHVnaW5FbnRyeUNvdW50KCk7Ci0JfQotCi0JcHVibGljIElTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGdldFJhd0ZlYXR1cmVSZWZlcmVuY2VzKCkgewkKLQkJcmV0dXJuIHNpdGUuZ2V0UmF3RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwdWJsaWMgSVNpdGVDb250ZW50UHJvdmlkZXIgZ2V0U2l0ZUNvbnRlbnRQcm92aWRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsJCi0JCXJldHVybiBzaXRlLmdldFNpdGVDb250ZW50UHJvdmlkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsJCi0JCXJldHVybiBzaXRlLmdldFVSTCgpOwotCX0KLQotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBpbnN0YWxsKElGZWF0dXJlIHNvdXJjZUZlYXR1cmUsIElGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxGZWF0dXJlcywgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgcGFyZW50Q29udGVudENvbnN1bWVyLCBJVmVyaWZpZXIgcGFyZW50VmVyaWZpZXIsIElWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewkKLQkJcmV0dXJuIHNpdGUuaW5zdGFsbChzb3VyY2VGZWF0dXJlLCBvcHRpb25hbEZlYXR1cmVzLCBwYXJlbnRDb250ZW50Q29uc3VtZXIsCi0JCQkJcGFyZW50VmVyaWZpZXIsIHZlcmlmaWNhdGlvbkxpc3RlbmVyLCBwcm9ncmVzcyk7Ci0JfQotCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGwoSUZlYXR1cmUgc291cmNlRmVhdHVyZSwgSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbEZlYXR1cmVzLCBJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHRocm93cyBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CQkKLQkJcmV0dXJuIHNpdGUuaW5zdGFsbChzb3VyY2VGZWF0dXJlLCBvcHRpb25hbEZlYXR1cmVzLCB2ZXJpZmljYXRpb25MaXN0ZW5lciwKLQkJCQlwcm9ncmVzcyk7Ci0JfQotCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGwoSUZlYXR1cmUgc291cmNlRmVhdHVyZSwgSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWNhdGlvbkxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB0aHJvd3MgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewkJCi0JCXJldHVybiBzaXRlLmluc3RhbGwoc291cmNlRmVhdHVyZSwgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIHByb2dyZXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoSUZlYXR1cmUgZmVhdHVyZSwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewkJCi0JCXNpdGUucmVtb3ZlKGZlYXR1cmUsIHByb2dyZXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaXRlQ29udGVudFByb3ZpZGVyKElTaXRlQ29udGVudFByb3ZpZGVyIHNpdGVDb250ZW50UHJvdmlkZXIpIHsJCQotCQlzaXRlLnNldFNpdGVDb250ZW50UHJvdmlkZXIoc2l0ZUNvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQXJjaGl2ZVJlZmVyZW5jZU1vZGVsKEFyY2hpdmVSZWZlcmVuY2VNb2RlbCBhcmNoaXZlUmVmZXJlbmNlKSB7CQkKLQkJc2l0ZS5hZGRBcmNoaXZlUmVmZXJlbmNlTW9kZWwoYXJjaGl2ZVJlZmVyZW5jZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ2F0ZWdvcnlNb2RlbChDYXRlZ29yeU1vZGVsIGNhdGVnb3J5KSB7CQkKLQkJc2l0ZS5hZGRDYXRlZ29yeU1vZGVsKGNhdGVnb3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRGZWF0dXJlUmVmZXJlbmNlTW9kZWwoU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmZWF0dXJlUmVmZXJlbmNlKSB7CQkKLQkJc2l0ZS5hZGRGZWF0dXJlUmVmZXJlbmNlTW9kZWwoZmVhdHVyZVJlZmVyZW5jZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTWlycm9yTW9kZWwoVVJMRW50cnlNb2RlbCBtaXJyb3IpIHsJCQotCQlzaXRlLmFkZE1pcnJvck1vZGVsKG1pcnJvcik7Ci0JfQotCi0JcHVibGljIEFyY2hpdmVSZWZlcmVuY2VNb2RlbFtdIGdldEFyY2hpdmVSZWZlcmVuY2VNb2RlbHMoKSB7CQkKLQkJcmV0dXJuIHNpdGUuZ2V0QXJjaGl2ZVJlZmVyZW5jZU1vZGVscygpOwotCX0KLQotCXB1YmxpYyBDYXRlZ29yeU1vZGVsW10gZ2V0Q2F0ZWdvcnlNb2RlbHMoKSB7CQotCQlyZXR1cm4gc2l0ZS5nZXRDYXRlZ29yeU1vZGVscygpOwotCX0KLQotCXB1YmxpYyBDb25maWd1cmVkU2l0ZU1vZGVsIGdldENvbmZpZ3VyZWRTaXRlTW9kZWwoKSB7CQotCQlyZXR1cm4gc2l0ZS5nZXRDb25maWd1cmVkU2l0ZU1vZGVsKCk7Ci0JfQotCi0JcHVibGljIFVSTEVudHJ5TW9kZWwgZ2V0RGVzY3JpcHRpb25Nb2RlbCgpIHsJCi0JCXJldHVybiBzaXRlLmdldERlc2NyaXB0aW9uTW9kZWwoKTsKLQl9Ci0KLQlwdWJsaWMgU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKSB7CQkKLQkJcmV0dXJuIHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOwotCX0KLQotCXB1YmxpYyBVUkwgZ2V0TG9jYXRpb25VUkwoKSB7CQkKLQkJcmV0dXJuIHNpdGUuZ2V0TG9jYXRpb25VUkwoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uVVJMU3RyaW5nKCkgewkJCi0JCXJldHVybiBzaXRlLmdldExvY2F0aW9uVVJMU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFVSTEVudHJ5TW9kZWxbXSBnZXRNaXJyb3JTaXRlRW50cnlNb2RlbHMoKSB7CQotCQlyZXR1cm4gc2l0ZS5nZXRNaXJyb3JTaXRlRW50cnlNb2RlbHMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7CQotCQlyZXR1cm4gc2l0ZS5nZXRUeXBlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbWFya1JlYWRPbmx5KCkgewkKLQkJc2l0ZS5tYXJrUmVhZE9ubHkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBcmNoaXZlUmVmZXJlbmNlTW9kZWwoQXJjaGl2ZVJlZmVyZW5jZU1vZGVsIGFyY2hpdmVSZWZlcmVuY2UpIHsJCi0JCXNpdGUucmVtb3ZlQXJjaGl2ZVJlZmVyZW5jZU1vZGVsKGFyY2hpdmVSZWZlcmVuY2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNhdGVnb3J5TW9kZWwoQ2F0ZWdvcnlNb2RlbCBjYXRlZ29yeSkgewkKLQkJc2l0ZS5yZW1vdmVDYXRlZ29yeU1vZGVsKGNhdGVnb3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVGZWF0dXJlUmVmZXJlbmNlTW9kZWwoRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmVSZWZlcmVuY2UpIHsJCi0JCXNpdGUucmVtb3ZlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKGZlYXR1cmVSZWZlcmVuY2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU1pcnJvcihVUkxFbnRyeU1vZGVsIG1pcnJvcikgewkJCi0JCXNpdGUucmVtb3ZlTWlycm9yKG1pcnJvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzb2x2ZShVUkwgYmFzZSwgVVJMIGJ1bmRsZVVSTCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CQkKLQkJc2l0ZS5yZXNvbHZlKGJhc2UsIGJ1bmRsZVVSTCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXJjaGl2ZVJlZmVyZW5jZU1vZGVscyhBcmNoaXZlUmVmZXJlbmNlTW9kZWxbXSBhcmNoaXZlUmVmZXJlbmNlcykgewkJCi0JCXNpdGUuc2V0QXJjaGl2ZVJlZmVyZW5jZU1vZGVscyhhcmNoaXZlUmVmZXJlbmNlcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2F0ZWdvcnlNb2RlbHMoQ2F0ZWdvcnlNb2RlbFtdIGNhdGVnb3JpZXMpIHsJCQotCQlzaXRlLnNldENhdGVnb3J5TW9kZWxzKGNhdGVnb3JpZXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbmZpZ3VyZWRTaXRlTW9kZWwoQ29uZmlndXJlZFNpdGVNb2RlbCBjb25maWd1cmVkU2l0ZU1vZGVsKSB7CQkKLQkJc2l0ZS5zZXRDb25maWd1cmVkU2l0ZU1vZGVsKGNvbmZpZ3VyZWRTaXRlTW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uTW9kZWwoVVJMRW50cnlNb2RlbCBkZXNjcmlwdGlvbikgewkJCi0JCXNpdGUuc2V0RGVzY3JpcHRpb25Nb2RlbChkZXNjcmlwdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscyhGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBmZWF0dXJlUmVmZXJlbmNlcykgewkJCi0JCXNpdGUuc2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscyhmZWF0dXJlUmVmZXJlbmNlcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb25VUkxTdHJpbmcoU3RyaW5nIGxvY2F0aW9uVVJMU3RyaW5nKSB7CQkKLQkJc2l0ZS5zZXRMb2NhdGlvblVSTFN0cmluZyhsb2NhdGlvblVSTFN0cmluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWlycm9yU2l0ZUVudHJ5TW9kZWxzKFVSTEVudHJ5TW9kZWxbXSBtaXJyb3JzKSB7CQkKLQkJc2l0ZS5zZXRNaXJyb3JTaXRlRW50cnlNb2RlbHMobWlycm9ycyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWlycm9yc1VSTFN0cmluZyhTdHJpbmcgbWlycm9yc1VSTCkgewkJCi0JCXNpdGUuc2V0TWlycm9yc1VSTFN0cmluZyhtaXJyb3JzVVJMKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7CQkKLQkJc2l0ZS5zZXRUeXBlKHR5cGUpOwotCX0KLSovCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0JhdGNoRmVhdHVyZU9wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9CYXRjaEZlYXR1cmVPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y4NDM2Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0JhdGNoRmVhdHVyZU9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklPcGVyYXRpb25MaXN0ZW5lcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhdGNoRmVhdHVyZU9wZXJhdGlvbiBleHRlbmRzIE9wZXJhdGlvbiBpbXBsZW1lbnRzIElCYXRjaEZlYXR1cmVPcGVyYXRpb24gewotCi0JcHJpdmF0ZSBJRmVhdHVyZVtdIGZlYXR1cmVzOwotCXByaXZhdGUgSUNvbmZpZ3VyZWRTaXRlW10gdGFyZ2V0U2l0ZXM7Ci0JCi0JCi0JcHVibGljIEJhdGNoRmVhdHVyZU9wZXJhdGlvbihJQ29uZmlndXJlZFNpdGVbXSB0YXJnZXRTaXRlcywgSUZlYXR1cmVbXSBmZWF0dXJlcykgewotCQlzdXBlcigpOwotCQl0aGlzLmZlYXR1cmVzID0gZmVhdHVyZXM7Ci0JCXRoaXMudGFyZ2V0U2l0ZXMgPSB0YXJnZXRTaXRlczsKLQl9Ci0JCi0JcHVibGljIElGZWF0dXJlW10gZ2V0RmVhdHVyZXMoKSB7Ci0JCXJldHVybiBmZWF0dXJlczsKLQl9Ci0KLQlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlW10gZ2V0VGFyZ2V0U2l0ZXMoKSB7Ci0JCXJldHVybiB0YXJnZXRTaXRlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRTaXRlcyhJQ29uZmlndXJlZFNpdGVbXSB0YXJnZXRTaXRlcykgewotCQl0aGlzLnRhcmdldFNpdGVzID0gdGFyZ2V0U2l0ZXM7Ci0JCQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcG0sIElPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCi0JCWlmIChnZXRGZWF0dXJlcygpID09IG51bGwgfHwgZ2V0RmVhdHVyZXMoKS5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSU9wZXJhdGlvbltdIG9wZXJhdGlvbnMgPSBuZXcgSU9wZXJhdGlvbltnZXRGZWF0dXJlcygpLmxlbmd0aF07Ci0JCQotCQlmb3IgKCBpbnQgaSA9IDA7IGkgPCBnZXRGZWF0dXJlcygpLmxlbmd0aDsgaSArKykgeyAKLQkJCW9wZXJhdGlvbnNbaV0gPSBjcmVhdGVPcGVyYXRpb24oZ2V0VGFyZ2V0U2l0ZXMoKVtpXSwgZ2V0RmVhdHVyZXMoKVtpXSk7Ci0JCX0KLQkJCi0JCWJvb2xlYW4gcmVzdGFydE5lZWRlZCA9IGZhbHNlOwotCi0JCWZvciAoIGludCBpID0gMDsgaSA8IG9wZXJhdGlvbnMubGVuZ3RoOyBpICsrKSB7IAotCQkJdHJ5IHsKLQkJCQlib29sZWFuIHN0YXR1cyA9IG9wZXJhdGlvbnNbaV0uZXhlY3V0ZShwbSwgbGlzdGVuZXIpOwotCQkJCWlmIChzdGF0dXMpCi0JCQkJCXJlc3RhcnROZWVkZWQgPSB0cnVlOyAKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQkKLQotCQlyZXR1cm4gcmVzdGFydE5lZWRlZDsKLQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJT3BlcmF0aW9uIGNyZWF0ZU9wZXJhdGlvbihJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwgSUZlYXR1cmUgZmVhdHVyZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvQmF0Y2hJbnN0YWxsT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0JhdGNoSW5zdGFsbE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTI0ZDJkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvQmF0Y2hJbnN0YWxsT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLXB1YmxpYyBjbGFzcyBCYXRjaEluc3RhbGxPcGVyYXRpb24KLQlleHRlbmRzIE9wZXJhdGlvbgotCWltcGxlbWVudHMgSUJhdGNoT3BlcmF0aW9uIHsKLQkJCi0JcHJvdGVjdGVkIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIG9wZXJhdGlvbnM7Ci0KLQlwdWJsaWMgQmF0Y2hJbnN0YWxsT3BlcmF0aW9uKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIG9wZXJhdGlvbnMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vcGVyYXRpb25zID0gb3BlcmF0aW9uczsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JTXVsdGlPcGVyYXRpb24jZ2V0T3BlcmF0aW9ucygpCi0JICovCi0JcHVibGljIElGZWF0dXJlT3BlcmF0aW9uW10gZ2V0T3BlcmF0aW9ucygpIHsKLQkJcmV0dXJuIG9wZXJhdGlvbnM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbiNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJaW50IGluc3RhbGxDb3VudCA9IDA7Ci0KLQkJaWYgKG9wZXJhdGlvbnMgPT0gbnVsbCB8fCBvcGVyYXRpb25zLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkKLQkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBlbmRpbmdDaGFuZ2VzKG9wZXJhdGlvbnMpOwotCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmdldENvZGUoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQl9Ci0JCQotLy8JCS8vIENoZWNrIGZvciBkdXBsaWNhdGlvbiBjb25mbGljdHMKLS8vCQlBcnJheUxpc3QgY29uZmxpY3RzID0KLS8vCQkJRHVwbGljYXRlQ29uZmxpY3RzVmFsaWRhdG9yLmNvbXB1dGVEdXBsaWNhdGVDb25mbGljdHMoCi0vLwkJCQlvcGVyYXRpb25zLAotLy8JCQkJY29uZmlnKTsKLS8vCQlpZiAoY29uZmxpY3RzICE9IG51bGwpIHsKLS8vCQkJYm9vbGVhbiBjb250aW51ZVByb2Nlc3NpbmcgPSBmYWxzZTsKLS8vCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0vLwkJCQljb250aW51ZVByb2Nlc3NpbmcgPSBsaXN0ZW5lci5iZWZvcmVFeGVjdXRlKHRoaXMsIGNvbmZsaWN0cyk7Ci0vLwkJCWlmICghY29udGludWVQcm9jZXNzaW5nKQotLy8JCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLQkJCi0JCU9wZXJhdGlvbnNNYW5hZ2VyLnNldEluUHJvZ3Jlc3ModHJ1ZSk7Ci0JCWlmIChtb25pdG9yID09IG51bGwpIAotCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQkKLQkJdHJ5IHsJCQkKLQkJCWlmIChsaXN0ZW5lciAhPSBudWxsKQotCQkJCWxpc3RlbmVyLmJlZm9yZUV4ZWN1dGUodGhpcywgbnVsbCk7Ci0JCQkKLQkJCW1vbml0b3IuYmVnaW5UYXNrKAotCQkJCU1lc3NhZ2VzLk9wZXJhdGlvbnNNYW5hZ2VyX2luc3RhbGxpbmcsCi0JCQkJb3BlcmF0aW9ucy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcGVyYXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3ViUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPQotCQkJCQluZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKAotCQkJCQkJbW9uaXRvciwKLQkJCQkJCTEsCi0JCQkJCQlTdWJQcm9ncmVzc01vbml0b3IuUFJFUEVORF9NQUlOX0xBQkVMX1RPX1NVQlRBU0spOwotCi0JCQkJb3BlcmF0aW9uc1tpXS5leGVjdXRlKHN1Yk1vbml0b3IsIGxpc3RlbmVyKTsKLQkJCQlPcGVyYXRpb25zTWFuYWdlci5hZGRQZW5kaW5nT3BlcmF0aW9uKG9wZXJhdGlvbnNbaV0pOwotCi0JCQkJb3BlcmF0aW9uc1tpXS5tYXJrUHJvY2Vzc2VkKCk7Ci0JCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQkJCWxpc3RlbmVyLmFmdGVyRXhlY3V0ZShvcGVyYXRpb25zW2ldLCBudWxsKTsKLQotCQkJCS8vbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJaW5zdGFsbENvdW50Kys7Ci0JCQl9Ci0JCQlyZXR1cm4gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuc2F2ZSgpOwotICAgICAgICB9IGNhdGNoIChJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBzYXZlcyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICBpZiAoaW5zdGFsbENvdW50ID4gMCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLnNhdmUoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIFVwZGF0ZVV0aWxzLmxvZ0V4Y2VwdGlvbihjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gc2F2ZXMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbgotICAgICAgICAgICAgaWYgKGluc3RhbGxDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5zYXZlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgICAgICBVcGRhdGVVdGlscy5sb2dFeGNlcHRpb24oY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotCQkJT3BlcmF0aW9uc01hbmFnZXIuc2V0SW5Qcm9ncmVzcyhmYWxzZSk7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvQ29uZmlnT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0NvbmZpZ09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmIxOGMwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvQ29uZmlnT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotLyoqCi0gKiBDb25maWd1cmUgYSBmZWF0dXJlLgotICogQ29uZmlnT3BlcmF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdPcGVyYXRpb24KLWV4dGVuZHMgRmVhdHVyZU9wZXJhdGlvbgotaW1wbGVtZW50cyBJQ29uZmlnRmVhdHVyZU9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgQ29uZmlnT3BlcmF0aW9uKAotCQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUsCi0JCQlJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXN1cGVyKHNpdGUsIGZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwbSwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQotCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlJU3RhdHVzIHN0YXR1cyA9Ci0JCQlPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBlbmRpbmdDb25maWcoZmVhdHVyZSk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0Q29kZSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXRhcmdldFNpdGUuY29uZmlndXJlKGZlYXR1cmUpOwotCQkJLy9lbnN1cmVVbmlxdWUoKTsKLQotCQkJLy8gUmVzdGFydCBub3QgbmVlZGVkCi0JCQlib29sZWFuIHJlc3RhcnROZWVkZWQgPSBmYWxzZTsKLQotCQkJLy8gQ2hlY2sgaWYgdGhpcyBvcGVyYXRpb24gaXMgY2FuY2VsbGluZyBvbmUgdGhhdCdzIGFscmVhZHkgcGVuZGluZwotCQkJSU9wZXJhdGlvbiBwZW5kaW5nT3BlcmF0aW9uID0KLQkJCQlPcGVyYXRpb25zTWFuYWdlci5maW5kUGVuZGluZ09wZXJhdGlvbihmZWF0dXJlKTsKLQotCQkJaWYgKHBlbmRpbmdPcGVyYXRpb24gaW5zdGFuY2VvZiBJVW5jb25maWdGZWF0dXJlT3BlcmF0aW9uKSB7Ci0JCQkJLy8gbm8gbmVlZCB0byBkbyBlaXRoZXIgcGVuZGluZyBjaGFuZ2UKLQkJCQlPcGVyYXRpb25zTWFuYWdlci5yZW1vdmVQZW5kaW5nT3BlcmF0aW9uKHBlbmRpbmdPcGVyYXRpb24pOwotCQkJfSBlbHNlIHsKLQkJCQlPcGVyYXRpb25zTWFuYWdlci5hZGRQZW5kaW5nT3BlcmF0aW9uKHRoaXMpOwotCQkJfQotCi0JCQltYXJrUHJvY2Vzc2VkKCk7Ci0JCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLQkJCQlsaXN0ZW5lci5hZnRlckV4ZWN1dGUodGhpcywgbnVsbCk7Ci0KLQkJCXJlc3RhcnROZWVkZWQgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5zYXZlKCkgJiYgcmVzdGFydE5lZWRlZDsKLQotCQkJLy8gbm90aWZ5IHRoZSBtb2RlbAotCQkJT3BlcmF0aW9uc01hbmFnZXIuZmlyZU9iamVjdENoYW5nZWQoZmVhdHVyZSwgbnVsbCk7Ci0KLQkJCXJldHVybiByZXN0YXJ0TmVlZGVkOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXVuZG8oKTsKLQkJCVVwZGF0ZVV0aWxzLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0YXJnZXRTaXRlLnVuY29uZmlndXJlKGZlYXR1cmUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvQ29uZmlndXJlRmVhdHVyZXNPcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvQ29uZmlndXJlRmVhdHVyZXNPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI0Nzk3My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0NvbmZpZ3VyZUZlYXR1cmVzT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5PcGVyYXRpb25zTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIENvbmZpZ3VyZUZlYXR1cmVzT3BlcmF0aW9uIGV4dGVuZHMgQmF0Y2hGZWF0dXJlT3BlcmF0aW9uIGltcGxlbWVudHMKLQkJSUNvbmZpZ3VyZUZlYXR1cmVzT3BlcmF0aW9uIHsKLQotCXB1YmxpYyBDb25maWd1cmVGZWF0dXJlc09wZXJhdGlvbihJQ29uZmlndXJlZFNpdGVbXSB0YXJnZXRTaXRlcywKLQkJCUlGZWF0dXJlW10gZmVhdHVyZXMpIHsKLQkJc3VwZXIodGFyZ2V0U2l0ZXMsIGZlYXR1cmVzKTsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgSU9wZXJhdGlvbiBjcmVhdGVPcGVyYXRpb24oSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUsIElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcmV0dXJuIE9wZXJhdGlvbnNNYW5hZ2VyLmdldE9wZXJhdGlvbkZhY3RvcnkoKS5jcmVhdGVDb25maWdPcGVyYXRpb24odGFyZ2V0U2l0ZSwgZmVhdHVyZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0R1cGxpY2F0ZUNvbmZsaWN0c1ZhbGlkYXRvci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9EdXBsaWNhdGVDb25mbGljdHNWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRhNDk1ZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0R1cGxpY2F0ZUNvbmZsaWN0c1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JSW5zdGFsbENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5WZXJzaW9uZWRJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRHVwbGljYXRlQ29uZmxpY3RzVmFsaWRhdG9yICB7Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIElkRW50cnkgewotCQlJQ29uZmlndXJlZFNpdGUgY3NpdGU7Ci0JCUlGZWF0dXJlIGZlYXR1cmU7Ci0KLQkJcHVibGljIElkRW50cnkoSUZlYXR1cmUgZmVhdHVyZSwgSUNvbmZpZ3VyZWRTaXRlIGNzaXRlKSB7Ci0JCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQkJdGhpcy5jc2l0ZSA9IGNzaXRlOwotCQkJaWYgKGNzaXRlID09IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNzaXRlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzSW5zdGFsbENhbmRpZGF0ZSgpIHsKLQkJCXJldHVybiBjc2l0ZSAhPSBudWxsOwotCQl9Ci0JCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQkJcmV0dXJuIGZlYXR1cmU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7Ci0JCQlyZXR1cm4gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpOwotCQl9Ci0JCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgZ2V0Q29uZmlndXJlZFNpdGUoKSB7Ci0JCQlpZiAoY3NpdGUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gY3NpdGU7Ci0JCQlyZXR1cm4gZmVhdHVyZS5nZXRTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gc2FtZUxldmVsKElkRW50cnkgZW50cnkpIHsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQlWZXJzaW9uZWRJZGVudGlmaWVyIGV2aWQgPQotCQkJCWVudHJ5LmdldEZlYXR1cmUoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQlyZXR1cm4gdmlkLmVxdWFscyhldmlkKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUgPSBnZXRDb25maWd1cmVkU2l0ZSgpOwotCQkJU3RyaW5nIHZlcnNpb24gPQotCQkJCWZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpOwotCQkJU3RyaW5nIGxvY2F0aW9uID0gY29uZmlnU2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOwotCQkJcmV0dXJuIE5MUy5iaW5kKE1lc3NhZ2VzLkR1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZ19jb25mbGljdCwgKG5ldyBTdHJpbmdbXSB7IHZlcnNpb24sIGxvY2F0aW9uIH0pKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgQXJyYXlMaXN0IGNvbXB1dGVEdXBsaWNhdGVDb25mbGljdHMoCi0JCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IsCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCUlDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlLAotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMpIHsKLQkJSGFzaHRhYmxlIGZlYXR1cmVUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQkJdHJ5IHsKLQkJCWNvbXB1dGVQcmVzZW50U3RhdGUoZmVhdHVyZVRhYmxlLCBjb25maWcpOwotCQkJY29tcHV0ZU5ld0ZlYXR1cmUoCi0JCQkJam9iLmdldEZlYXR1cmUoKSwKLQkJCQl0YXJnZXRTaXRlLAotCQkJCWZlYXR1cmVUYWJsZSwKLQkJCQlvcHRpb25hbEZlYXR1cmVzKTsKLQkJCXJldHVybiBjb21wdXRlQ29uZmxpY3RzKGZlYXR1cmVUYWJsZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFycmF5TGlzdCBjb21wdXRlRHVwbGljYXRlQ29uZmxpY3RzKAotCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBqb2JzLAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUhhc2h0YWJsZSBmZWF0dXJlVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWNvbXB1dGVQcmVzZW50U3RhdGUoZmVhdHVyZVRhYmxlLCBjb25maWcpOwotCQljb21wdXRlTmV3RmVhdHVyZXMoam9icywgZmVhdHVyZVRhYmxlKTsKLQkJcmV0dXJuIGNvbXB1dGVDb25mbGljdHMoZmVhdHVyZVRhYmxlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgY29tcHV0ZUNvbmZsaWN0cyhIYXNodGFibGUgZmVhdHVyZVRhYmxlKSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBudWxsOwotCQlmb3IgKEVudW1lcmF0aW9uIGl0ZXJhdG9yID0gZmVhdHVyZVRhYmxlLmVsZW1lbnRzKCk7Ci0JCQlpdGVyYXRvci5oYXNNb3JlRWxlbWVudHMoKTsKLQkJCSkgewotCQkJQXJyYXlMaXN0IGNhbmRpZGF0ZSA9IChBcnJheUxpc3QpIGl0ZXJhdG9yLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAoY2FuZGlkYXRlLnNpemUoKSA9PSAxKQotCQkJCWNvbnRpbnVlOwotCQkJQXJyYXlMaXN0IGNvbmZsaWN0ID0gY2hlY2tGb3JDb25mbGljdChjYW5kaWRhdGUpOwotCQkJaWYgKGNvbmZsaWN0ICE9IG51bGwpIHsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlyZXN1bHQuYWRkKGNvbmZsaWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBjaGVja0ZvckNvbmZsaWN0KEFycmF5TGlzdCBjYW5kaWRhdGUpIHsKLQkJSWRFbnRyeSBmaXJzdEVudHJ5ID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYW5kaWRhdGUuc2l6ZSgpOyBpKyspIHsKLQkJCUlkRW50cnkgZW50cnkgPSAoSWRFbnRyeSkgY2FuZGlkYXRlLmdldChpKTsKLQkJCWlmIChmaXJzdEVudHJ5ID09IG51bGwpCi0JCQkJZmlyc3RFbnRyeSA9IGVudHJ5OwotCQkJZWxzZSBpZiAoIWVudHJ5LnNhbWVMZXZlbChmaXJzdEVudHJ5KSkKLQkJCQlyZXR1cm4gY2FuZGlkYXRlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29tcHV0ZVByZXNlbnRTdGF0ZSgKLQkJSGFzaHRhYmxlIHRhYmxlLAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUlDb25maWd1cmVkU2l0ZVtdIGNzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IGNzaXRlc1tpXTsKLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGNzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJYWRkRW50cnkocmVmc1tqXS5nZXRGZWF0dXJlKG51bGwpLCBjc2l0ZSwgdGFibGUpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBkb24ndCBsZXQgb25lIGJhZCBmZWF0dXJlIHN0b3AgdGhlIGxvb3AKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbXB1dGVOZXdGZWF0dXJlcygKLQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gam9icywKLQkJSGFzaHRhYmxlIGZlYXR1cmVUYWJsZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYnMubGVuZ3RoOyBpKyspIHsKLQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IgPSBqb2JzW2ldOwotCQkJSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUgPSBqb2IuZ2V0VGFyZ2V0U2l0ZSgpOwotCQkJSUZlYXR1cmUgbmV3RmVhdHVyZSA9IGpvYi5nZXRGZWF0dXJlKCk7Ci0JCQl0cnkgewotCQkJCWNvbXB1dGVOZXdGZWF0dXJlKG5ld0ZlYXR1cmUsIHRhcmdldFNpdGUsIGZlYXR1cmVUYWJsZSwgbnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29tcHV0ZU5ld0ZlYXR1cmUoCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSwKLQkJSGFzaHRhYmxlIHRhYmxlLAotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJYWRkRW50cnkoZmVhdHVyZSwgY3NpdGUsIHRhYmxlKTsKLQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGlyZWZzID0KLQkJCWZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGlyZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlIGlyZWYgPSBpcmVmc1tpXTsKLQkJCWJvb2xlYW4gYWRkID0gdHJ1ZTsKLQotCQkJaWYgKGlyZWYuaXNPcHRpb25hbCgpICYmIG9wdGlvbmFsRmVhdHVyZXMgIT0gbnVsbCkgewotCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG9wdGlvbmFsRmVhdHVyZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUZlYXR1cmVSZWZlcmVuY2UgY2hlY2tlZCA9IG9wdGlvbmFsRmVhdHVyZXNbal07Ci0JCQkJCWlmIChjaGVja2VkLmVxdWFscyhpcmVmKSkgewotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYWRkID0gZm91bmQ7Ci0JCQl9Ci0JCQlpZiAoYWRkKQotCQkJCWNvbXB1dGVOZXdGZWF0dXJlKAotCQkJCQlpcmVmLmdldEZlYXR1cmUobnVsbCksCi0JCQkJCWNzaXRlLAotCQkJCQl0YWJsZSwKLQkJCQkJb3B0aW9uYWxGZWF0dXJlcyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEVudHJ5KAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUsCi0JCUhhc2h0YWJsZSBmZWF0dXJlVGFibGUpIHsKLQkJU3RyaW5nIGlkID0gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpOwotCQlBcnJheUxpc3QgZW50cmllcyA9IChBcnJheUxpc3QpIGZlYXR1cmVUYWJsZS5nZXQoaWQpOwotCQlpZiAoZW50cmllcyA9PSBudWxsKSB7Ci0JCQllbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZmVhdHVyZVRhYmxlLnB1dChpZCwgZW50cmllcyk7Ci0JCX0KLQkJSWRFbnRyeSBlbnRyeSA9IG5ldyBJZEVudHJ5KGZlYXR1cmUsIGNzaXRlKTsKLQkJYm9vbGVhbiByZXBsYWNlZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUlkRW50cnkgZXhpc3RpbmdFbnRyeSA9IChJZEVudHJ5KSBlbnRyaWVzLmdldChpKTsKLQkJCUlDb25maWd1cmVkU2l0ZSBleGlzdGluZ1NpdGUgPSBleGlzdGluZ0VudHJ5LmdldENvbmZpZ3VyZWRTaXRlKCk7Ci0JCQlpZiAoZXhpc3RpbmdTaXRlLmVxdWFscyhlbnRyeS5nZXRDb25maWd1cmVkU2l0ZSgpKSkgewotCQkJCS8vIHNhbWUgc2l0ZSAtIHJlcGxhY2UgaXQgaWYgbm90IG5ldwotCQkJCWlmIChlbnRyeS5pc0luc3RhbGxDYW5kaWRhdGUoKSkgewotCQkJCQllbnRyaWVzLnNldChpLCBlbnRyeSk7Ci0JCQkJCWVudHJpZXMucmVtb3ZlKGV4aXN0aW5nRW50cnkpOwotCQkJCX0KLQkJCQlyZXBsYWNlZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFyZXBsYWNlZCkKLQkJCWVudHJpZXMuYWRkKGVudHJ5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0ZlYXR1cmVIaWVyYXJjaHlFbGVtZW50LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0ZlYXR1cmVIaWVyYXJjaHlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNzFkMzkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9GZWF0dXJlSGllcmFyY2h5RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjb25zdHJ1Y3QgYSBqb2ludCBmZWF0dXJlIGhpZWFyY2h5LgotICogT2xkIGZlYXR1cmUgcmVmZXJlbmNlIHJlcHJlc2VudHMgZmVhdHVyZSB0aGF0IGlzCi0gKiBmb3VuZCBvbiBpbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiBOZXcgZmVhdHVyZQotICogcmVmZXJlbmNlIGlzIGZvdW5kIGluIHRoZSBmZWF0dXJlIHRoYXQgaXMgYW4gaW5zdGFsbC91cGRhdGUKLSAqIGNhbmRpZGF0ZS4gVGhlIGVsZW1lbnQgaXMgdXNlZCB0byBqb2luIG5vZGVzIG9mIHRoZQotICogaGllYXJjaHkgZm9ybWVkIGJ5IGluY2x1ZGluZyBmZWF0dXJlcyBzbyB0aGF0Ci0gKiBlYWNoIG5vZGUgaW4gdGhlIGhpZWFyY2h5IGNvbnRhaW5zIHJlZmVyZW5jZXMgdG8gdGhlCi0gKiBvbGQgYW5kIHRoZSBuZXcgZmVhdHVyZS4gT2xkIGFuZCBuZXcgZmVhdHVyZXMgaGF2ZQotICogdGhlIHNhbWUgSURzIGJ1dCBkaWZmZXJlbnQgdmVyc2lvbnMsIGV4Y2VwdCBpbiAKLSAqIHRoZSBjYXNlIG9mIG9wdGlvbmFsIGZlYXR1cmVzLCB3aGVyZSB0aGUgdHJlZSBtYXkKLSAqIGJlIGNvbnN0cnVjdGVkIHRvIGJyaW5nIGluIGFuIG9wdGlvbmFsIGZlYXR1cmUKLSAqIHRoYXQgd2FzIG5vdCBpbnN0YWxsZWQgaW5pdGlhbGx5LiBJbiB0aGF0IGNhc2UsCi0gKiBzb21lIG5vZGVzIG1heSBoYXZlIG9sZCBhbiBuZXcgcmVmZXJlbmNlcyB3aXRoIHRoZQotICogc2FtZSBJRCBhbmQgdmVyc2lvbi4gCi0gKiA8cD4KLSAqIE9sZCBmZWF0dXJlIHJlZmVyZW5jZSBtYXkgYmUgbnVsbC4gVGhhdCBtZWFucwotICogdGhhdCB0aGUgb2xkZXIgZmVhdHVyZSB3aXRoIHRoZSBzYW1lIElEIGJ1dCBsb3dlcgotICogdmVyc2lvbiB3YXMgbm90IGZvdW5kIGluIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlSGllcmFyY2h5RWxlbWVudCB7Ci0KLQlwcml2YXRlIE9iamVjdCByb290OwotCXByaXZhdGUgQXJyYXlMaXN0IGNoaWxkcmVuOwotCXByaXZhdGUgSUZlYXR1cmVSZWZlcmVuY2Ugb2xkRmVhdHVyZVJlZjsKLQlwcml2YXRlIElGZWF0dXJlUmVmZXJlbmNlIG5ld0ZlYXR1cmVSZWY7Ci0JcHJpdmF0ZSBib29sZWFuIGNoZWNrZWQ7Ci0JcHJpdmF0ZSBib29sZWFuIG9wdGlvbmFsQ2hpbGRyZW47Ci0JcHJpdmF0ZSBib29sZWFuIG5hdGl2ZVVwZ3JhZGUgPSBmYWxzZTsKLQotCXB1YmxpYyBGZWF0dXJlSGllcmFyY2h5RWxlbWVudCgKLQkJSUZlYXR1cmVSZWZlcmVuY2Ugb2xkUmVmLAotCQlJRmVhdHVyZVJlZmVyZW5jZSBuZXdSZWYpIHsKLQkJb2xkRmVhdHVyZVJlZiA9IG9sZFJlZjsKLQkJbmV3RmVhdHVyZVJlZiA9IG5ld1JlZjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSb290KE9iamVjdCByb290KSB7Ci0JCXRoaXMucm9vdCA9IHJvb3Q7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRSb290KCkgewotCQlyZXR1cm4gcm9vdDsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiB0cnVlIGlmIGVsZW1lbnQgY2FuIGJlIGNoZWNrZWQsIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQkvLyBjYW5ub3QgdW5jaGVjayBub24tb3B0aW9uYWwgZmVhdHVyZXMKLQkJaWYgKGlzT3B0aW9uYWwoKSA9PSBmYWxzZSkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gY2Fubm90IHVuY2hlY2sgb3B0aW9uYWwgZmVhdHVyZSB0aGF0Ci0JCS8vIGhhcyBhbHJlYWR5IGJlZW4gaW5zdGFsbGVkCi0JCWlmIChvbGRGZWF0dXJlUmVmICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEEgaGlyZWFyY2h5IG5vZGUgcmVwcmVzZW50cyBhICdmYWxzZSB1cGRhdGUnIGlmCi0JICogYm90aCBvbGQgYW5kIG5ldyByZWZlcmVuY2VzIGV4aXN0IGFuZCBib3RoCi0JICogcG9pbnQgdG8gdGhlIGZlYXR1cmUgd2l0aCB0aGUgc2FtZSBJRCBhbmQgdmVyc2lvbi4KLQkgKiBUaGVzZSBub2RlcyB3aWxsIG5vdCBhbnkgYnl0ZXMgdG8gYmUgZG93bmxvYWRlZCAtIAotCSAqIHRoZXkgc2ltcGx5IGV4aXN0IHRvIGFsbG93IHRoZSBoaXJhcmNoeSB0bwotCSAqIHJlYWNoIHRoZSBvcHRpb25hbCBjaGlsZHJlbiB0aGF0IGFyZSBtaXNzaW5nCi0JICogYW5kIHdpbGwgYmUgaW5zdGFsbGVkLgotCSAqLwotCi0JcHVibGljIGJvb2xlYW4gaXNGYWxzZVVwZGF0ZSgpIHsKLQkJaWYgKG9sZEZlYXR1cmVSZWYgIT0gbnVsbCAmJiBuZXdGZWF0dXJlUmVmICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIG9sZEZlYXR1cmVSZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscygKLQkJCQkJbmV3RmVhdHVyZVJlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgZmVhdHVyZSBpcyBpbmNsdWRlZCBhcyBvcHRpb25hbC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgewotCQlyZXR1cm4gbmV3RmVhdHVyZVJlZiBpbnN0YW5jZW9mIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UKLQkJCSYmICgoSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSkgbmV3RmVhdHVyZVJlZikuaXNPcHRpb25hbCgpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBvcHRpb25hbCBmZWF0dXJlIGlzIHNlbGVjdGVkCi0JICogZm9yIGluc3RhbGxhdGlvbi4gTm9uLW9wdGlvbmFsIGZlYXR1cmVzIG9yIG5vbi1lZGl0YWJsZQotCSAqIGZlYXR1cmVzIGFyZSBhbHdheXMgY2hlY2tlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoKSB7Ci0JCXJldHVybiBjaGVja2VkOwotCX0KLQotCXZvaWQgc2V0TmF0aXZlVXBncmFkZShib29sZWFuIG5hdGl2ZVVwZ3JhZGUpIHsKLQkJdGhpcy5uYXRpdmVVcGdyYWRlID0gbmF0aXZlVXBncmFkZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBvcHRpb25hbCBmZWF0dXJlIHNob3VsZAotCSAqIGJlIGVuYWJsZWQgd2hlbiBpbnN0YWxsZWQuIEJ5IGRlZmF1bHQsIGFsbAotCSAqIGZlYXR1cmVzIGluIHRoZSBoaWVhcmNoeSBzaG91bGQgYmUgZW5hYmxlZC4KLQkgKiBUaGUgZXhjZXB0aW9uIGlzIGZvciBvcHRpb25hbCBmZWF0dXJlcyB0aGF0Ci0JICogYXJlIHVwZGF0ZWQgdG8gYSBuZXcgdmVyc2lvbiBpbiBjYXNlIHdoZXJlCi0JICogdGhlIG9sZGVyIHZlcnNpb24gb2YgdGhlIG9wdGlvbmFsIGZlYXR1cmUKLQkgKiBpcyBkaXNhYmxlZCBpbiB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi4gCi0JICogSW4gdGhpcyBjYXNlLCB0aGUgZmVhdHVyZSBpcwotCSAqIHVwZGF0ZWQgYW5kIGRpc2FibGVkIGluIG9yZGVyIHRvIG1haW50YWluCi0JICogaXRzIHN0YXRlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmIChuYXRpdmVVcGdyYWRlKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChpc09wdGlvbmFsKCkgJiYgb2xkRmVhdHVyZVJlZiAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUlGZWF0dXJlIG9sZEZlYXR1cmUgPSBvbGRGZWF0dXJlUmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0KLQkJCQkJVXBkYXRlVXRpbHMuZ2V0Q29uZmlnU2l0ZShvbGRGZWF0dXJlLCBjb25maWcpOwotCQkJCXJldHVybiBjc2l0ZS5pc0NvbmZpZ3VyZWQob2xkRmVhdHVyZSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsKLQkJdHJ5IHsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBuZXdGZWF0dXJlUmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQlyZXR1cm4gZmVhdHVyZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlbGVjdHMgYW4gZWRpdGFibGUgZmVhdHVyZSBmb3IgaW5zdGFsbGF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoZWNrZWQoYm9vbGVhbiBjaGVja2VkKSB7Ci0JCXRoaXMuY2hlY2tlZCA9IGNoZWNrZWQ7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgbGFiZWwgZm9yIFVJIHByZXNlbnRhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQl0cnkgewotCQkJcmV0dXJuIGdldEZlYXR1cmVMYWJlbChuZXdGZWF0dXJlUmVmKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAobmV3RmVhdHVyZVJlZiBpbnN0YW5jZW9mIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UpIHsKLQkJCQlTdHJpbmcgaW5hbWUgPQotCQkJCQkoKElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UpIG5ld0ZlYXR1cmVSZWYpLmdldE5hbWUoKTsKLQkJCQlpZiAoaW5hbWUgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGluYW1lOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9Ci0JCQkJCW5ld0ZlYXR1cmVSZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJCXJldHVybiB2aWQudG9TdHJpbmcoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTIpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQ29tcHV0ZXMgbGFiZWwgZnJvbSB0aGUgZmVhdHVyZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRGZWF0dXJlTGFiZWwoSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRmVhdHVyZSBmZWF0dXJlID0gZmVhdHVyZVJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQlyZXR1cm4gZmVhdHVyZS5nZXRMYWJlbCgpCi0JCQkrICIgIiAvLyROT04tTkxTLTEkCi0JCQkrIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpOwotCX0KLQkvKioKLQkgKiBDb21wdXRlcyBjaGlsZHJlbiBieSBsaW5raW5nIG1hdGNoaW5nIGZlYXR1cmVzIGZyb20gdGhlCi0JICogb2xkIGZlYXR1cmUncyBhbmQgbmV3IGZlYXR1cmUncyBoaWVyYXJjaHkuCi0JICovCi0JcHVibGljIEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50W10gZ2V0Q2hpbGRyZW4oCi0JCWJvb2xlYW4gdXBkYXRlLAotCQlib29sZWFuIHBhdGNoLAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWNvbXB1dGVDaGlsZHJlbih1cGRhdGUsIHBhdGNoLCBjb25maWcpOwotCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudFtdIGFycmF5ID0KLQkJCW5ldyBGZWF0dXJlSGllcmFyY2h5RWxlbWVudFtjaGlsZHJlbi5zaXplKCldOwotCQljaGlsZHJlbi50b0FycmF5KGFycmF5KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCXB1YmxpYyBGZWF0dXJlSGllcmFyY2h5RWxlbWVudFtdIGdldENoaWxkcmVuKCkgewotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnRbXSBhcnJheSA9Ci0JCQkJbmV3IEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50W2NoaWxkcmVuLnNpemUoKV07Ci0JCQljaGlsZHJlbi50b0FycmF5KGFycmF5KTsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCi0JCXJldHVybiBuZXcgRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnRbMF07Ci0JfQotCS8qKgotCSAqIENvbXB1dGVzIGNoaWxkcmVuIG9mIHRoaXMgbm9kZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wdXRlQ2hpbGRyZW4oCi0JCWJvb2xlYW4gdXBkYXRlLAotCQlib29sZWFuIHBhdGNoLAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXRyeSB7Ci0JCQkJSUZlYXR1cmUgb2xkRmVhdHVyZSA9IG51bGw7Ci0JCQkJSUZlYXR1cmUgbmV3RmVhdHVyZSA9IG51bGw7Ci0JCQkJbmV3RmVhdHVyZSA9IG5ld0ZlYXR1cmVSZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQlpZiAob2xkRmVhdHVyZVJlZiAhPSBudWxsKQotCQkJCQlvbGRGZWF0dXJlID0gb2xkRmVhdHVyZVJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCW9wdGlvbmFsQ2hpbGRyZW4gPQotCQkJCQljb21wdXRlRWxlbWVudHMoCi0JCQkJCQlvbGRGZWF0dXJlLAotCQkJCQkJbmV3RmVhdHVyZSwKLQkJCQkJCXVwZGF0ZSwKLQkJCQkJCXBhdGNoLAotCQkJCQkJY29uZmlnLAotCQkJCQkJY2hpbGRyZW4pOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQgZWxlbWVudCA9Ci0JCQkJCQkoRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQpIGNoaWxkcmVuLmdldChpKTsKLQkJCQkJZWxlbWVudC5zZXRSb290KGdldFJvb3QoKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3B0aW9uYWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG9wdGlvbmFsQ2hpbGRyZW47Ci0JfQotCS8qKgotCSAqIEFkZHMgY2hlY2tlZCBvcHRpb25hbCBmZWF0dXJlcyB0byB0aGUgcHJvdmlkZWQgc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoZWNrZWRPcHRpb25hbEZlYXR1cmVzKAotCQlib29sZWFuIHVwZGF0ZSwKLQkJYm9vbGVhbiBwYXRjaCwKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJU2V0IHNldCkgewotCQlpZiAoaXNPcHRpb25hbCgpICYmIGlzQ2hlY2tlZCgpKSB7Ci0JCQkvLyBEbyBub3QgYWRkIGNoZWNrZWQgb3B0aW9uYWwgZmVhdHVyZXMKLQkJCS8vIGlmIHRoaXMgaXMgYW4gdXBkYXRlIGNhc2UgYnV0Ci0JCQkvLyB0aGUgbm9kZSBpcyBub3QgYSAndHJ1ZScgdXBkYXRlCi0JCQkvLyAob2xkIGFuZCBuZXcgZmVhdHVyZSBhcmUgdGhlIGVxdWFsKQotCQkJaWYgKCF1cGRhdGUgfHwgIWlzRmFsc2VVcGRhdGUoKSkKLQkJCQlzZXQuYWRkKG5ld0ZlYXR1cmVSZWYpOwotCQl9Ci0JCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50W10gZWxlbWVudHMgPSBnZXRDaGlsZHJlbih1cGRhdGUsIHBhdGNoLCBjb25maWcpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQllbGVtZW50c1tpXS5hZGRDaGVja2VkT3B0aW9uYWxGZWF0dXJlcyh1cGRhdGUsIHBhdGNoLCBjb25maWcsIHNldCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlcyBmaXJzdC1sZXZlbCBjaGlsZHJlbiBvZiB0aGUgbGlua2VkIGhpZXJhcmNoeQotCSAqIGZvciB0aGUgcHJvdmlkZWQgb2xkIGFuZCBuZXcgZmVhdHVyZXMgKHNhbWUgSUQsIGRpZmZlcmVudCB2ZXJzaW9uCi0JICogd2hlcmUgbmV3IHZlcnNpb24gaXMgZ3JlYXRlciBvciBlcXVhbCB0aGUgb2xkIHZlcnNpb24pLgotCSAqIE9sZCBmZWF0dXJlIG1heSBiZSBudWxsLiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcHV0ZUVsZW1lbnRzKAotCQlJRmVhdHVyZSBvbGRGZWF0dXJlLAotCQlJRmVhdHVyZSBuZXdGZWF0dXJlLAotCQlib29sZWFuIHVwZGF0ZSwKLQkJYm9vbGVhbiBwYXRjaCwKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJQXJyYXlMaXN0IGxpc3QpIHsKLQkJT2JqZWN0W10gb2xkQ2hpbGRyZW4gPSBudWxsOwotCQlPYmplY3RbXSBuZXdDaGlsZHJlbiA9IGdldEluY2x1ZGVkRmVhdHVyZXMobmV3RmVhdHVyZSk7Ci0JCWJvb2xlYW4gb3B0aW9uYWxDaGlsZHJlbiA9IGZhbHNlOwotCi0JCXRyeSB7Ci0JCQlpZiAob2xkRmVhdHVyZSAhPSBudWxsKSB7Ci0JCQkJb2xkQ2hpbGRyZW4gPSBnZXRJbmNsdWRlZEZlYXR1cmVzKG9sZEZlYXR1cmUpOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCUlGZWF0dXJlUmVmZXJlbmNlIG9sZFJlZiA9IG51bGw7Ci0JCQkJSUZlYXR1cmVSZWZlcmVuY2UgbmV3UmVmID0gKElGZWF0dXJlUmVmZXJlbmNlKSBuZXdDaGlsZHJlbltpXTsKLQkJCQlpZiAob2xkQ2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgbmV3SWQgPQotCQkJCQkJbmV3UmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCk7Ci0KLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvbGRDaGlsZHJlbi5sZW5ndGg7IGorKykgewotCQkJCQkJSUZlYXR1cmVSZWZlcmVuY2UgY3JlZiA9Ci0JCQkJCQkJKElGZWF0dXJlUmVmZXJlbmNlKSBvbGRDaGlsZHJlbltqXTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaWYgKGNyZWYKLQkJCQkJCQkJLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCQkJCQkuZ2V0SWRlbnRpZmllcigpCi0JCQkJCQkJCS5lcXVhbHMobmV3SWQpKSB7Ci0JCQkJCQkJCW9sZFJlZiA9IGNyZWY7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAocGF0Y2gpIHsKLQkJCQkJLy8gMzA4NDkgLSBmaW5kIHRoZSBvbGQgcmVmZXJlbmNlIGluIHRoZQotCQkJCQkvLyBjb25maWd1cmF0aW9uLgotCQkJCQlpZiAoIVVwZGF0ZVV0aWxzLmlzUGF0Y2gobmV3RmVhdHVyZSkpIHsKLQkJCQkJCW9sZFJlZiA9IGZpbmRQYXRjaGVkUmVmZXJlbmNlKG5ld1JlZiwgY29uZmlnKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyB0ZXN0IGlmIHRoZSBvbGQgb3B0aW9uYWwgZmVhdHVyZSBleGlzdHMKLQkJCQlpZiAob2xkUmVmICE9IG51bGwKLQkJCQkJJiYgKChvbGRSZWYgaW5zdGFuY2VvZiBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlCi0JCQkJCQkmJiAoKElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UpIG9sZFJlZikuaXNPcHRpb25hbCgpKQotCQkJCQkJfHwgcGF0Y2gpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJRmVhdHVyZSBmID0gb2xkUmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJCQlpZiAoZiA9PSBudWxsKQotCQkJCQkJCW9sZFJlZiA9IG51bGw7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gbWlzc2luZwotCQkJCQkJb2xkUmVmID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudCBlbGVtZW50ID0KLQkJCQkJbmV3IEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50KG9sZFJlZiwgbmV3UmVmKTsKLQkJCQkvLyBJZiB0aGlzIGlzIGFuIHVwZGF0ZSAob2xkIGZlYXR1cmUgZXhpc3RzKSwgCi0JCQkJLy8gb25seSBjaGVjayB0aGUgbmV3IG9wdGlvbmFsIGZlYXR1cmUgaWYgdGhlIG9sZCBleGlzdHMuCi0JCQkJLy8gT3RoZXJ3aXNlLCBhbHdheXMgY2hlY2suCi0JCQkJaWYgKGVsZW1lbnQuaXNPcHRpb25hbCgpICYmICh1cGRhdGUgfHwgcGF0Y2gpKSB7Ci0JCQkJCWVsZW1lbnQuc2V0Q2hlY2tlZChvbGRSZWYgIT0gbnVsbCk7Ci0JCQkJCWlmIChvbGRSZWYgPT0gbnVsbCkgewotCQkJCQkJLy8gRG9lcyBub3QgaGF2ZSBhbiBvbGQgcmVmZXJlbmNlLAotCQkJCQkJLy8gYnV0IGl0IG1heSBjb250YWluIGFuIG9sZGVyCi0JCQkJCQkvLyBmZWF0dXJlIHRoYXQgbWF5IHN0aWxsIHF1YWxpZnkKLQkJCQkJCS8vIGZvciB1cGRhdGUuIEZvciBleGFtcGxlLAotCQkJCQkJLy8gYW4gb2xkZXIgdmVyc2lvbiBtYXkgaGF2ZSBiZWVuCi0JCQkJCQkvLyBpbnN0YWxsZWQgbmF0aXZlbHkgZnJvbSB0aGUgQ0QtUk9NLgotCQkJCQkJaWYgKGhhc09sZGVyVmVyc2lvbihuZXdSZWYpKSB7Ci0JCQkJCQkJZWxlbWVudC5zZXROYXRpdmVVcGdyYWRlKHRydWUpOwotCQkJCQkJCWVsZW1lbnQuc2V0Q2hlY2tlZCh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZQotCQkJCQllbGVtZW50LnNldENoZWNrZWQodHJ1ZSk7Ci0JCQkJbGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJZWxlbWVudC5jb21wdXRlQ2hpbGRyZW4odXBkYXRlLCBwYXRjaCwgY29uZmlnKTsKLQkJCQlpZiAoZWxlbWVudC5pc09wdGlvbmFsKCkgfHwgZWxlbWVudC5oYXNPcHRpb25hbENoaWxkcmVuKCkpCi0JCQkJCW9wdGlvbmFsQ2hpbGRyZW4gPSB0cnVlOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gb3B0aW9uYWxDaGlsZHJlbjsKLQl9Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc09sZGVyVmVyc2lvbihJRmVhdHVyZVJlZmVyZW5jZSBuZXdSZWYpIHsKLQkJdHJ5IHsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gbmV3UmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIHZlcnNpb24gPSB2aWQuZ2V0VmVyc2lvbigpOwotCQkJU3RyaW5nIG1vZGUgPSBnZXRVcGRhdGVWZXJzaW9uc01vZGUoKTsKLQotCQkJSUZlYXR1cmVbXSBhbGxJbnN0YWxsZWQgPQotCQkJCVVwZGF0ZVV0aWxzLmdldEluc3RhbGxlZEZlYXR1cmVzKHZpZCwgZmFsc2UpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxJbnN0YWxsZWQubGVuZ3RoOyBpKyspIHsKLQkJCQlJRmVhdHVyZSBjYW5kaWRhdGUgPSBhbGxJbnN0YWxsZWRbaV07Ci0JCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgY3ZlcnNpb24gPQotCQkJCQljYW5kaWRhdGUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKTsKLQkJCQkvLyBWZXJpZnkgdGhhdCB0aGUgZGlmZmVyZW5jZSBxdWFsaWZpZXMgYXMKLQkJCQkvLyBhbiB1cGRhdGUuCi0JCQkJaWYgKG1vZGUuZXF1YWxzKFVwZGF0ZUNvcmUuRVFVSVZBTEVOVF9WQUxVRSkpIHsKLQkJCQkJaWYgKHZlcnNpb24uaXNFcXVpdmFsZW50VG8oY3ZlcnNpb24pKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIGlmIChtb2RlLmVxdWFscyhVcGRhdGVDb3JlLkNPTVBBVElCTEVfVkFMVUUpKSB7Ci0JCQkJCWlmICh2ZXJzaW9uLmlzQ29tcGF0aWJsZVdpdGgoY3ZlcnNpb24pKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSUZlYXR1cmVSZWZlcmVuY2UgZmluZFBhdGNoZWRSZWZlcmVuY2UoCi0JCUlGZWF0dXJlUmVmZXJlbmNlIG5ld1JlZiwKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9IG5ld1JlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCUlDb25maWd1cmVkU2l0ZVtdIGNzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IGNzaXRlc1tpXTsKLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGNzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gcmVmc1tqXTsKLQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHJlZlZpZCA9IHJlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQkJaWYgKHZpZC5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKHJlZlZpZC5nZXRJZGVudGlmaWVyKCkpKQotCQkJCQlyZXR1cm4gcmVmOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgaW5jbHVkZWQgZmVhdHVyZSByZWZlcmVuY2VzIGZvciB0aGUgZ2l2ZW4gcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gZ2V0SW5jbHVkZWRGZWF0dXJlcyhJRmVhdHVyZVJlZmVyZW5jZSByZWYpIHsKLQkJdHJ5IHsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCXJldHVybiBnZXRJbmNsdWRlZEZlYXR1cmVzKGZlYXR1cmUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGluY2x1ZGVkIGZlYXR1cmUgcmVmZXJlbmNlcyBmb3IgdGhlIGdpdmVuIGZlYXR1cmUuCi0JICovCi0KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGdldEluY2x1ZGVkRmVhdHVyZXMoSUZlYXR1cmUgZmVhdHVyZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VXBkYXRlVmVyc2lvbnNNb2RlKCkgewotCQlQcmVmZXJlbmNlcyBzdG9yZSA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHN0b3JlLmdldFN0cmluZyhVcGRhdGVDb3JlLlBfVVBEQVRFX1ZFUlNJT05TKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0ZlYXR1cmVPcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvRmVhdHVyZU9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDdmOTg4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvRmVhdHVyZU9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZlYXR1cmVPcGVyYXRpb24gZXh0ZW5kcyBPcGVyYXRpb24gaW1wbGVtZW50cyBJRmVhdHVyZU9wZXJhdGlvbiB7Ci0JCi0JcHJvdGVjdGVkIElGZWF0dXJlIGZlYXR1cmU7Ci0JcHJvdGVjdGVkIElGZWF0dXJlIG9sZEZlYXR1cmU7Ci0JcHJvdGVjdGVkIElDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlOwotCi0vLwlwcml2YXRlIGJvb2xlYW4gb3B0aW9uYWxEZWx0YTsKLQkKLQkKLQlwdWJsaWMgRmVhdHVyZU9wZXJhdGlvbihJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwgSUZlYXR1cmUgZmVhdHVyZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLnRhcmdldFNpdGUgPSB0YXJnZXRTaXRlOwotCX0KLQotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0JCi0JcHVibGljIElGZWF0dXJlIGdldE9sZEZlYXR1cmUoKSB7Ci0JCXJldHVybiBvbGRGZWF0dXJlOwotCX0KLQkKLS8vCXB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWxEZWx0YSgpIHsKLS8vCQlyZXR1cm4gb3B0aW9uYWxEZWx0YTsKLS8vCX0KLQkKLQlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlIGdldFRhcmdldFNpdGUoKSB7Ci0JCXJldHVybiB0YXJnZXRTaXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhcmdldFNpdGUoSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUpIHsKLQkJdGhpcy50YXJnZXRTaXRlID0gdGFyZ2V0U2l0ZTsKLQl9Ci0JCi0KLQlzdGF0aWMgYm9vbGVhbiB1bmNvbmZpZ3VyZShJRmVhdHVyZSBmZWF0dXJlLCBJQ29uZmlndXJlZFNpdGUgc2l0ZSkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJaWYgKHNpdGUgPT0gbnVsbCkKLQkJCXNpdGUgPSBVcGRhdGVVdGlscy5nZXRDb25maWdTaXRlKGZlYXR1cmUsIGNvbmZpZyk7Ci0JCQotCQlpZiAoc2l0ZSAhPSBudWxsKSB7Ci0JCQlQYXRjaENsZWFuZXIgY2xlYW5lciA9IG5ldyBQYXRjaENsZWFuZXIoc2l0ZSwgZmVhdHVyZSk7Ci0JCQlib29sZWFuIHJlc3VsdCA9IHNpdGUudW5jb25maWd1cmUoZmVhdHVyZSk7Ci0JCQljbGVhbmVyLmRpc3Bvc2UoKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoSUZlYXR1cmUgZmVhdHVyZSkgewotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9GZWF0dXJlU3RhdHVzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0ZlYXR1cmVTdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgyZWQ1My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0ZlYXR1cmVTdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci0KLQotLyoqCi0gKiBUaGUgZmVhdHVyZSBzdGF0dXMgcHJvdmlkZSBpbmZvIGFib3V0IHRoZSBicm9rZW4gZmVhdHVyZXMgYW5kIHdoYXQgaXMKLSAqIHdyb25nLgotICovCi1wdWJsaWMgY2xhc3MgRmVhdHVyZVN0YXR1cyBleHRlbmRzIFN0YXR1cyB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09ERV9PVEhFUiA9IElTdGF0dXMuT0s7Ly8wCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09ERV9QUkVSRVFfRkVBVFVSRSA9IDE7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09ERV9QUkVSRVFfUExVR0lOID0gMjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDT0RFX0VYQ0xVU0lWRSA9IDQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09ERV9DWUNMRSA9IDg7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09ERV9PUFRJT05BTF9DSElMRCA9IDE2OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPREVfRU5WSVJPTk1FTlQgPSAzMjsKLQlJRmVhdHVyZSBmZWF0dXJlOwotCi0JcHVibGljIEZlYXR1cmVTdGF0dXMoSUZlYXR1cmUgZmVhdHVyZSwgaW50IHNldmVyaXR5LCBTdHJpbmcgcGx1Z2luSWQsIGludCBjb2RlLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlzdXBlcihzZXZlcml0eSwgcGx1Z2luSWQsIGNvZGUsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgRmVhdHVyZVN0YXR1cykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUZlYXR1cmVTdGF0dXMgZnMgPSAoRmVhdHVyZVN0YXR1cykgb2JqOwotCQkvLyBvbmx5IGNoZWNrIGZvciBmZWF0dXJlLCByZWdhcmRsZXNzIG9mIHN0YXR1cyB0eXBlCi0JCWlmIChmcy5nZXRGZWF0dXJlKCkgPT0gZmVhdHVyZSkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChmcy5nZXRGZWF0dXJlKCkgPT0gbnVsbCAmJiBmZWF0dXJlID09IG51bGwpCi0JCQlyZXR1cm4gZnMuZ2V0TWVzc2FnZSgpLmVxdWFscyhnZXRNZXNzYWdlKCkpOwotCQllbHNlIGlmIChmcy5nZXRGZWF0dXJlKCkgPT0gbnVsbCAmJiBmZWF0dXJlICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UgaWYgKGZzLmdldEZlYXR1cmUoKSAhPSBudWxsICYmIGZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZWxzZSBpZiAoZnMuZ2V0RmVhdHVyZSgpLmVxdWFscyhmZWF0dXJlKSkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0lCYXRjaEZlYXR1cmVPcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvSUJhdGNoRmVhdHVyZU9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWQ3YWRhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvSUJhdGNoRmVhdHVyZU9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklPcGVyYXRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUJhdGNoRmVhdHVyZU9wZXJhdGlvbiBleHRlbmRzIElPcGVyYXRpb24gewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmVhdHVyZXMgdG8gb3BlcmF0ZSBvbi4KLQkgKiBAcmV0dXJuIHRoZSBmZWF0dXJlcyB0byBvcGVyYXRlIG9uLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJRmVhdHVyZVtdIGdldEZlYXR1cmVzKCk7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgc2l0ZSBpbiB3aGljaCB0aGUgb3BlcmF0aW9uIGlzIGFwcGxpZWQuCi0JICogQHJldHVybiB0aGUgc2l0ZSB0aGF0IG93bnMgb3Igd2lsbCBvd24gdGhlIGZlYXR1cmUuCi0JICovCi0JcHVibGljIGFic3RyYWN0IElDb25maWd1cmVkU2l0ZVtdIGdldFRhcmdldFNpdGVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaXRlIGluIHdoaWNoIHRoZSBmZWF0dXJlIGlzIGJlaW5nIG9wZXJhdGVkIG9uLgotCSAqIEBwYXJhbSB0YXJnZXRTaXRlIHRoZSBzaXRlIGluIHdoaWNoIHRoZSBmZWF0cmUgaXMgYmVpbmcgb3BlcmF0ZWQgb24uCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0VGFyZ2V0U2l0ZXMoSUNvbmZpZ3VyZWRTaXRlW10gdGFyZ2V0U2l0ZSk7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0lDb25maWd1cmVGZWF0dXJlc09wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9JQ29uZmlndXJlRmVhdHVyZXNPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFjMzUzNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0lDb25maWd1cmVGZWF0dXJlc09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1wdWJsaWMgaW50ZXJmYWNlIElDb25maWd1cmVGZWF0dXJlc09wZXJhdGlvbiBleHRlbmRzIElCYXRjaEZlYXR1cmVPcGVyYXRpb24gewotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0lVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVPcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvSVVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZU9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTUwMDZkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvSVVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZU9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSUZlYXR1cmVPcGVyYXRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBleHRlbmRzCi0JCUlGZWF0dXJlT3BlcmF0aW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9JVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9JVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTkyMTZmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvSVVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotcHVibGljIGludGVyZmFjZSBJVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbiBleHRlbmRzCi0JCUlCYXRjaEZlYXR1cmVPcGVyYXRpb24gewotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0lVbmNvbmZpZ3VyZUZlYXR1cmVzT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0lVbmNvbmZpZ3VyZUZlYXR1cmVzT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZjVkNWQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9JVW5jb25maWd1cmVGZWF0dXJlc09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVVuY29uZmlndXJlRmVhdHVyZXNPcGVyYXRpb24gZXh0ZW5kcyBJQmF0Y2hGZWF0dXJlT3BlcmF0aW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9JVW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvSVVuaW5zdGFsbEZlYXR1cmVzT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZTYxMTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9JVW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotcHVibGljIGludGVyZmFjZSBJVW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24gZXh0ZW5kcyBJQmF0Y2hGZWF0dXJlT3BlcmF0aW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9JbnN0YWxsT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0luc3RhbGxPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MmE3MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0luc3RhbGxPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLS8qKgotICogQ29uZmlndXJlIGEgZmVhdHVyZS4KLSAqIENvbmZpZ09wZXJhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgSW5zdGFsbE9wZXJhdGlvbgotCWV4dGVuZHMgRmVhdHVyZU9wZXJhdGlvbgotCWltcGxlbWVudHMgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIHsKLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFyZykgewotCQlpZiAoYXJnID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKCEoYXJnIGluc3RhbmNlb2YgSW5zdGFsbE9wZXJhdGlvbikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJSW5zdGFsbE9wZXJhdGlvbiBpbyA9IChJbnN0YWxsT3BlcmF0aW9uKWFyZzsKLQkJCi0JCXJldHVybiBpby5nZXRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyh0aGlzLmdldEZlYXR1cmUoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIHN1cGVyLmdldEZlYXR1cmUoKS5oYXNoQ29kZSgpOwotCX0KLQotCXByaXZhdGUgSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbEZlYXR1cmVzOwotCXByaXZhdGUgSUZlYXR1cmVbXSB1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzOwotCXByaXZhdGUgSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWVyOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gc2l0ZQotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIG9wdGlvbmFsRmVhdHVyZXMgb3B0aW9uYWwgZmVhdHVyZXMgdG8gaW5zdGFsbC4gSWYgbnVsbCwgdGhlIG9wZXJhdGlvbiB3aWxsIGluc3RhbGwgdGhlbSBhbGwgKGlmIGFueSkKLQkgKiBAcGFyYW0gdW5jb25maWd1cmVkT3B0aW9uYWxFbGVtZW50cyBvcHRpb25hbCBmZWF0dXJlcyB1bmNvbmZpZ3VyZWQgYmVmb3JlIHRoZSBvcGVyYXRpb24uIFRoZXkgc2hvdWxkIHJlbWFpbiB1bmNvbmZpZ3VyZWQgYWZ0ZXIgdGhlIGluc3RhbGwuCi0JICogQHBhcmFtIHZlcmlmaWVyCi0JICovCi0JcHVibGljIEluc3RhbGxPcGVyYXRpb24oCi0JCUlDb25maWd1cmVkU2l0ZSBzaXRlLAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMsCi0JCUlGZWF0dXJlW10gdW5jb25maWd1cmVkT3B0aW9uYWxFbGVtZW50cywKLQkJSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWVyKSB7Ci0JCXN1cGVyKHNpdGUsIGZlYXR1cmUpOwotCQlJRmVhdHVyZVtdIGluc3RhbGxlZCA9IFVwZGF0ZVV0aWxzLmdldEluc3RhbGxlZEZlYXR1cmVzKGZlYXR1cmUpOwotCQlpZiAoaW5zdGFsbGVkLmxlbmd0aCA+IDApCi0JCQl0aGlzLm9sZEZlYXR1cmUgPSBpbnN0YWxsZWRbMF07Ci0JCXRoaXMudW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcyA9IHVuY29uZmlndXJlZE9wdGlvbmFsRWxlbWVudHM7Ci0JCXRoaXMub3B0aW9uYWxGZWF0dXJlcyA9IG9wdGlvbmFsRmVhdHVyZXM7Ci0JCXRoaXMudmVyaWZpZXIgPSB2ZXJpZmllcjsKLQl9Ci0KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRPcHRpb25hbEZlYXR1cmVzKCkgewotCQlyZXR1cm4gb3B0aW9uYWxGZWF0dXJlczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcG0sIElPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWJvb2xlYW4gcmVpbnN0YWxsID0gZmFsc2U7Ci0JCWlmIChvbGRGZWF0dXJlICE9IG51bGwKLQkJCSYmIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscygKLQkJCQlvbGRGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpCi0JCQlyZWluc3RhbGwgPSB0cnVlOwotCi0JCXNldE9wdGlvbmFsRmVhdHVyZXMoKTsKLQotCQlpZiAob3B0aW9uYWxGZWF0dXJlcyA9PSBudWxsKQotCQkJdGFyZ2V0U2l0ZS5pbnN0YWxsKGZlYXR1cmUsIHZlcmlmaWVyLCBwbSk7Ci0JCWVsc2UKLQkJCXRhcmdldFNpdGUuaW5zdGFsbChmZWF0dXJlLCBvcHRpb25hbEZlYXR1cmVzLCB2ZXJpZmllciwgcG0pOwotCi0JCWlmICghcmVpbnN0YWxsKSB7Ci0KLQkJCWlmIChvbGRGZWF0dXJlICE9IG51bGwpIHsgLy8mJiBpc09wdGlvbmFsRGVsdGEoKSkgewotCQkJCXByZXNlcnZlT3B0aW9uYWxTdGF0ZSgpOwotCi0JCQkJYm9vbGVhbiBvbGRTdWNjZXNzID0gdW5jb25maWd1cmUob2xkRmVhdHVyZSwgbnVsbCk7IC8vIHBpY2sgYW55IHNpdGUgY29udGFpbmluZyBvbGQgZmVhdHVyZQotCQkJCWlmICghb2xkU3VjY2VzcykgewotCQkJCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJaWYgKCFVcGRhdGVVdGlscy5pc05lc3RlZENoaWxkKGNvbmZpZywgb2xkRmVhdHVyZSkpIHsKLQkJCQkJCS8vICJlYXQiIHRoZSBlcnJvciBpZiBuZXN0ZWQgY2hpbGQKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0KLQkJCQkJCQlOTFMuYmluZChNZXNzYWdlcy5PcGVyYXRpb25zTWFuYWdlcl9lcnJvcl9vbGQsIChuZXcgU3RyaW5nW10geyBvbGRGZWF0dXJlLmdldExhYmVsKCkgfSkpOwotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPQotCQkJCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJCVVwZGF0ZVV0aWxzLmdldFBsdWdpbklkKCksCi0JCQkJCQkJCUlTdGF0dXMuT0ssCi0JCQkJCQkJCW1lc3NhZ2UsCi0JCQkJCQkJCW51bGwpOwotCQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotLy8JCQlpZiAob2xkRmVhdHVyZSA9PSBudWxsKSB7Ci0vLwkJCQllbnN1cmVVbmlxdWUoKTsKLS8vCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmVzZXJ2ZU9wdGlvbmFsU3RhdGUoKSB7Ci0JCWlmICh1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCS8vIEdldCB0aGUgZmVhdHVyZSB0aGF0IG1hdGNoZXMgdGhlIG9yaWdpbmFsIHVuY29uZmlndXJlZCBvbmVzLgotCQkJCUlGZWF0dXJlIGxvY2FsRmVhdHVyZSA9Ci0JCQkJCVVwZGF0ZVV0aWxzLmdldExvY2FsRmVhdHVyZSgKLQkJCQkJCXRhcmdldFNpdGUsCi0JCQkJCQl1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzW2ldKTsKLQkJCQlpZiAobG9jYWxGZWF0dXJlICE9IG51bGwpCi0JCQkJCXRhcmdldFNpdGUudW5jb25maWd1cmUobG9jYWxGZWF0dXJlKTsKLQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSWdub3JlIHRoaXMgLSB3ZSB3aWxsIGxlYXZlIHdpdGggaXQKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0T3B0aW9uYWxGZWF0dXJlcygpIHsKLQkJdHJ5IHsKLQkJCS8vIEVuc3VyZSBvcHRpb25hbCBmZWF0dXJlcyBhcmUgY29ycmVjdGx5IHNldAotCQkJaWYgKG9wdGlvbmFsRmVhdHVyZXMgPT0gbnVsbCAmJiBVcGRhdGVVdGlscy5oYXNPcHRpb25hbEZlYXR1cmVzKGZlYXR1cmUpICkgewotCQkJCUpvYlJvb3Qgam9iUm9vdCA9IG5ldyBKb2JSb290KHRoaXMpOwotCQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQkJCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlib29sZWFuIHVwZGF0ZSA9IG9sZEZlYXR1cmUgIT0gbnVsbDsKLQkJCQlib29sZWFuIHBhdGNoID0gVXBkYXRlVXRpbHMuaXNQYXRjaChmZWF0dXJlKTsKLQkJCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudFtdIGVsZW1lbnRzID0gam9iUm9vdC5nZXRFbGVtZW50cygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZWxlbWVudHNbaV0uYWRkQ2hlY2tlZE9wdGlvbmFsRmVhdHVyZXModXBkYXRlLCBwYXRjaCwgY29uZmlnLCBzZXQpOwotCQkJCX0KLQkJCQlvcHRpb25hbEZlYXR1cmVzID0gbmV3IElGZWF0dXJlUmVmZXJlbmNlW3NldC5zaXplKCldOwotCQkJCXNldC50b0FycmF5KG9wdGlvbmFsRmVhdHVyZXMpOwotCQkJCXVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMgPSBqb2JSb290LmdldFVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMoY29uZmlnLCB0YXJnZXRTaXRlKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVVdGlscy5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0pvYlJvb3QuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvSm9iUm9vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzRhNTM1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvSm9iUm9vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotcHVibGljIGNsYXNzIEpvYlJvb3QgewotCXByaXZhdGUgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYjsKLQlwcml2YXRlIEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50W10gZWxlbWVudHM7Ci0KLQlwdWJsaWMgSm9iUm9vdChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iKSB7Ci0JCXRoaXMuam9iID0gam9iOwotCX0KLQotCXB1YmxpYyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gZ2V0Sm9iKCkgewotCQlyZXR1cm4gam9iOwotCX0KLQotCXB1YmxpYyBGZWF0dXJlSGllcmFyY2h5RWxlbWVudFtdIGdldEVsZW1lbnRzKCkgewotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkKLQkJCWNvbXB1dGVFbGVtZW50cygpOwotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB1bmNvbmZpZ3VyZWQgZmVhdHVyZXMgYmVmb3JlIGFuIGluc3RhbGwuCi0JICogQWZ0ZXIgaW5zdGFsbGluZyB0aGUgZmVhdHVyZXMsIHRoZSBjYWxsZXIgbXVzdCBnZXQgdGhlIGxvY2FsIGZlYXR1cmVzIHRoYXQgbWF0Y2gKLQkgKiB0aGVzZSB1bmNvbmZpZ3VyZWQgZmVhdHVyZXMgYW5kIHVuY29uZmlndXJlIHRoZW0uCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB0YXJnZXRTaXRlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJRmVhdHVyZVtdIGdldFVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMoCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCUlDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlKSB7Ci0KLQkJQXJyYXlMaXN0IHVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldFVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXModW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcywgY29uZmlnLCB0YXJnZXRTaXRlLCBnZXRFbGVtZW50cygpLCBVcGRhdGVVdGlscy5pc1BhdGNoKGpvYi5nZXRGZWF0dXJlKCkpKTsKLQkJSUZlYXR1cmVbXSB1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzQXJyYXkgPQotCQkJbmV3IElGZWF0dXJlW3VuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMuc2l6ZSgpXTsKLQkJdW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcy50b0FycmF5KHVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXNBcnJheSk7Ci0JCXJldHVybiB1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzQXJyYXk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldFVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMoCi0JCUFycmF5TGlzdCB1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzLAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQlJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwKLQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnRbXSBvcHRpb25hbEVsZW1lbnRzLAotCQlib29sZWFuIGlzUGF0Y2gpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcHRpb25hbEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudFtdIGNoaWxkcmVuID0KLQkJCQlvcHRpb25hbEVsZW1lbnRzW2ldLmdldENoaWxkcmVuKHRydWUsIGlzUGF0Y2gsIGNvbmZpZyk7Ci0JCQlnZXRVbmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzKAotCQkJCXVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMsCi0JCQkJY29uZmlnLAotCQkJCXRhcmdldFNpdGUsCi0JCQkJY2hpbGRyZW4sCi0JCQkJaXNQYXRjaCk7Ci0JCQlpZiAoIW9wdGlvbmFsRWxlbWVudHNbaV0uaXNFbmFibGVkKGNvbmZpZykpIHsKLQkJCQl1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzLmFkZChvcHRpb25hbEVsZW1lbnRzW2ldLmdldEZlYXR1cmUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcHV0ZUVsZW1lbnRzKCkgewotCQl0cnkgewotCQkJSUZlYXR1cmUgb2xkRmVhdHVyZSA9IGpvYi5nZXRPbGRGZWF0dXJlKCk7Ci0JCQlJRmVhdHVyZSBuZXdGZWF0dXJlID0gam9iLmdldEZlYXR1cmUoKTsKLQkJCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJYm9vbGVhbiBwYXRjaCA9IFVwZGF0ZVV0aWxzLmlzUGF0Y2gobmV3RmVhdHVyZSk7Ci0JCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudC5jb21wdXRlRWxlbWVudHMoCi0JCQkJb2xkRmVhdHVyZSwKLQkJCQluZXdGZWF0dXJlLAotCQkJCW9sZEZlYXR1cmUgIT0gbnVsbCwKLQkJCQlwYXRjaCwKLQkJCQlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLAotCQkJCWxpc3QpOwotCQkJZWxlbWVudHMgPSBuZXcgRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnRbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KGVsZW1lbnRzKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQllbGVtZW50c1tpXS5zZXRSb290KHRoaXMpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVV0aWxzLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjUwYmIyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBPcGVyYXRpb24gaW1wbGVtZW50cyBJT3BlcmF0aW9uIHsKLQkKLQlwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc2VkOwotCQotCQotCXB1YmxpYyBPcGVyYXRpb24oKSB7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUHJvY2Vzc2VkKCkgewotCQlyZXR1cm4gcHJvY2Vzc2VkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtYXJrUHJvY2Vzc2VkKCkgewotCQlwcm9jZXNzZWQgPSB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9PcGVyYXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNmYzNzYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9PcGVyYXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLXB1YmxpYyBjbGFzcyBPcGVyYXRpb25GYWN0b3J5IGltcGxlbWVudHMgSU9wZXJhdGlvbkZhY3RvcnkgewotCi0JcHVibGljIE9wZXJhdGlvbkZhY3RvcnkoKSB7Ci0JfQotCi0JcHVibGljIElDb25maWdGZWF0dXJlT3BlcmF0aW9uIGNyZWF0ZUNvbmZpZ09wZXJhdGlvbigKLQkJSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUsCi0JCUlGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBDb25maWdPcGVyYXRpb24odGFyZ2V0U2l0ZSwgZmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIElCYXRjaE9wZXJhdGlvbiBjcmVhdGVCYXRjaEluc3RhbGxPcGVyYXRpb24oSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gb3BlcmF0aW9ucykgewotCQlyZXR1cm4gbmV3IEJhdGNoSW5zdGFsbE9wZXJhdGlvbihvcGVyYXRpb25zKTsKLQl9Ci0KLQlwdWJsaWMgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGNyZWF0ZUluc3RhbGxPcGVyYXRpb24oCi0JCUlDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlLAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMsCi0JCUlGZWF0dXJlW10gdW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcywKLQkJSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWVyKSB7Ci0JCXJldHVybiBuZXcgSW5zdGFsbE9wZXJhdGlvbigKLQkJCXRhcmdldFNpdGUsCi0JCQlmZWF0dXJlLAotCQkJb3B0aW9uYWxGZWF0dXJlcywKLQkJCXVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMsCi0JCQl2ZXJpZmllcik7Ci0JfQotCi0JcHVibGljIElVbmNvbmZpZ0ZlYXR1cmVPcGVyYXRpb24gY3JlYXRlVW5jb25maWdPcGVyYXRpb24oCi0JCUlDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlLAotCQlJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgVW5jb25maWdPcGVyYXRpb24odGFyZ2V0U2l0ZSwgZmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIElDb25maWdGZWF0dXJlT3BlcmF0aW9uIGNyZWF0ZVJlcGxhY2VGZWF0dXJlVmVyc2lvbk9wZXJhdGlvbigKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJSUZlYXR1cmUgYW5vdGhlckZlYXR1cmUpIHsKLQkKLQkJcmV0dXJuIG5ldyBSZXBsYWNlRmVhdHVyZVZlcnNpb25PcGVyYXRpb24oZmVhdHVyZSwgYW5vdGhlckZlYXR1cmUpOwkJCi0JfQotCQkKLQlwdWJsaWMgSVVuaW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gY3JlYXRlVW5pbnN0YWxsT3BlcmF0aW9uKAotCQlJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwKLQkJSUZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFVuaW5zdGFsbE9wZXJhdGlvbih0YXJnZXRTaXRlLCBmZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgSVJldmVydENvbmZpZ3VyYXRpb25PcGVyYXRpb24gY3JlYXRlUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbigKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJSVByb2JsZW1IYW5kbGVyIHByb2JsZW1IYW5kbGVyKSB7Ci0JCXJldHVybiBuZXcgUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbigKLQkJCWNvbmZpZywKLQkJCXByb2JsZW1IYW5kbGVyKTsKLQl9Ci0KLQlwdWJsaWMgSVRvZ2dsZVNpdGVPcGVyYXRpb24gY3JlYXRlVG9nZ2xlU2l0ZU9wZXJhdGlvbigKLQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUpIHsKLQkJcmV0dXJuIG5ldyBUb2dnbGVTaXRlT3BlcmF0aW9uKHNpdGUpOwotCX0KLQkKLQlwdWJsaWMgSVVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBjcmVhdGVVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVPcGVyYXRpb24oCi0JCQlJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwKLQkJCUlGZWF0dXJlIGZlYXR1cmUpIHsKLQkJCXJldHVybiBuZXcgVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKHRhcmdldFNpdGUsIGZlYXR1cmUpOwotCX0KLQkKLQlwdWJsaWMgSVVuY29uZmlndXJlRmVhdHVyZXNPcGVyYXRpb24gY3JlYXRlVW5jb25maWd1cmVGZWF0dXJlc09wZXJhdGlvbiAoCi0JCQlJQ29uZmlndXJlZFNpdGVbXSB0YXJnZXRTaXRlcywKLQkJCUlGZWF0dXJlW10gZmVhdHVyZXMpIHsKLQkJCXJldHVybiBuZXcgVW5jb25maWd1cmVGZWF0dXJlc09wZXJhdGlvbih0YXJnZXRTaXRlcywgZmVhdHVyZXMpOwotCQl9Ci0KLQlwdWJsaWMgSUNvbmZpZ3VyZUZlYXR1cmVzT3BlcmF0aW9uIGNyZWF0ZUNvbmZpZ3VyZUZlYXR1cmVzT3BlcmF0aW9uKAotCQkJSUNvbmZpZ3VyZWRTaXRlW10gdGFyZ2V0U2l0ZXMsCi0JCQlJRmVhdHVyZVtdIGZlYXR1cmVzKSB7Ci0JCQotCQkJcmV0dXJuIG5ldyBDb25maWd1cmVGZWF0dXJlc09wZXJhdGlvbih0YXJnZXRTaXRlcywgZmVhdHVyZXMpOwkJCi0JfQotCQkJCi0JcHVibGljIElVbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbiBjcmVhdGVVbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbigKLQkJCUlDb25maWd1cmVkU2l0ZVtdIHRhcmdldFNpdGVzLAotCQkJSUZlYXR1cmVbXSBmZWF0dXJlcykgewotCQkJcmV0dXJuIG5ldyBVbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbih0YXJnZXRTaXRlcywgZmVhdHVyZXMpOwotCX0KLQkKLQlwdWJsaWMgSVVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24gY3JlYXRlVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbigKLQkJCUlDb25maWd1cmVkU2l0ZVtdIHRhcmdldFNpdGVzLAotCQkJSUZlYXR1cmVbXSBmZWF0dXJlcykgewotCQkJcmV0dXJuIG5ldyBVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVzT3BlcmF0aW9uKHRhcmdldFNpdGVzLCBmZWF0dXJlcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9PcGVyYXRpb25WYWxpZGF0b3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYWYyNWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9PcGVyYXRpb25WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi0vL2ltcG9ydCBqYXZhLmlvLio7Ci0vL2ltcG9ydCBqYXZhLm5ldC4qOwotLy9pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JVXBkYXRlQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlBsYXRmb3JtQWRtaW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5Db25maWd1cmF0b3JVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yLlBsYXRmb3JtQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JT3BlcmF0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi0vKioKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIE9wZXJhdGlvblZhbGlkYXRvciBpbXBsZW1lbnRzIElPcGVyYXRpb25WYWxpZGF0b3IgewotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgcGxhdGZvcm0gY29uZmlndXJhdGlvbiBoYXMgYmVlbiBtb2RpZmllZCBvdXRzaWRlIHRoaXMgcHJvZ3JhbS4KLQkgKiBAcmV0dXJuIHRoZSBlcnJvciBzdGF0dXMsIG9yIG51bGwgaWYgbm8gZXJyb3JzCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVQbGF0Zm9ybUNvbmZpZ1ZhbGlkKCkgewotCQlBcnJheUxpc3Qgc3RhdHVzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJY2hlY2tQbGF0Zm9ybVdhc01vZGlmaWVkKHN0YXR1cyk7Ci0JCQotCQkvLyByZXBvcnQgc3RhdHVzCi0JCWlmIChzdGF0dXMuc2l6ZSgpID4gMCkKLQkJCXJldHVybiBjcmVhdGVNdWx0aVN0YXR1cyhNZXNzYWdlcy5BY3Rpdml0eUNvbnN0cmFpbnRzX3Jvb3RNZXNzYWdlLCBzdGF0dXMsIElTdGF0dXMuRVJST1IpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBDYWxsZWQgYnkgVUkgYmVmb3JlIHBlcmZvcm1pbmcgb3BlcmF0aW9uLiBSZXR1cm5zIG51bGwgaWYgbm8gZXJyb3JzLCBhCi0JICogc3RhdHVzIHdpdGggSVN0YXR1cy5XQVJOSU5HIGNvZGUgd2hlbiB0aGUgaW5pdGlhbCBjb25maWd1cmF0aW9uIGlzCi0JICogYnJva2VuLCBvciBhIHN0YXR1cyB3aXRoIElTdGF0dXMuRVJST1Igd2hlbiB0aGVyZSB0aGUgb3BlcmF0aW9uCi0JICogaW50cm9kdWNlcyBuZXcgZXJyb3JzCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVQZW5kaW5nSW5zdGFsbCgKLQkJSUZlYXR1cmUgb2xkRmVhdHVyZSwKLQkJSUZlYXR1cmUgbmV3RmVhdHVyZSkgewotCQkvLyBjaGVjayBpbml0aWFsIHN0YXRlCi0JCUFycmF5TGlzdCBiZWZvcmVTdGF0dXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXZhbGlkYXRlSW5pdGlhbFN0YXRlKGJlZm9yZVN0YXR1cyk7Ci0KLQkJLy8gY2hlY2sgcHJvcG9zZWQgY2hhbmdlCi0JCUFycmF5TGlzdCBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWNoZWNrUGxhdGZvcm1XYXNNb2RpZmllZChzdGF0dXMpOwotCQl2YWxpZGF0ZUluc3RhbGwob2xkRmVhdHVyZSwgbmV3RmVhdHVyZSwgc3RhdHVzKTsKLQotCQkvLyByZXBvcnQgc3RhdHVzCi0JCXJldHVybiBjcmVhdGVDb21iaW5lZFJlcG9ydFN0YXR1cyhiZWZvcmVTdGF0dXMsIHN0YXR1cyk7Ci0JfQotCi0JLyoKLQkgKiBDYWxsZWQgYnkgVUkgYmVmb3JlIHBlcmZvcm1pbmcgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVQZW5kaW5nVW5jb25maWcoSUZlYXR1cmUgZmVhdHVyZSkgewotCQkvLyBjaGVjayBpbml0aWFsIHN0YXRlCi0JCUFycmF5TGlzdCBiZWZvcmVTdGF0dXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXZhbGlkYXRlSW5pdGlhbFN0YXRlKGJlZm9yZVN0YXR1cyk7Ci0KLQkJLy8gY2hlY2sgcHJvcG9zZWQgY2hhbmdlCi0JCUFycmF5TGlzdCBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWNoZWNrUGxhdGZvcm1XYXNNb2RpZmllZChzdGF0dXMpOwotCQl2YWxpZGF0ZVVuY29uZmlndXJlKGZlYXR1cmUsIHN0YXR1cyk7Ci0KLQkJLy8gcmVwb3J0IHN0YXR1cwotCQlyZXR1cm4gY3JlYXRlQ29tYmluZWRSZXBvcnRTdGF0dXMoYmVmb3JlU3RhdHVzLCBzdGF0dXMpOwotCX0KLQotCS8qCi0JICogQ2FsbGVkIGJ5IFVJIGJlZm9yZSBwZXJmb3JtaW5nIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlUGVuZGluZ0NvbmZpZyhJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCS8vIGNoZWNrIGluaXRpYWwgc3RhdGUKLQkJQXJyYXlMaXN0IGJlZm9yZVN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdmFsaWRhdGVJbml0aWFsU3RhdGUoYmVmb3JlU3RhdHVzKTsKLQotCQkvLyBjaGVjayBwcm9wb3NlZCBjaGFuZ2UKLQkJQXJyYXlMaXN0IHN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJY2hlY2tQbGF0Zm9ybVdhc01vZGlmaWVkKHN0YXR1cyk7Ci0JCXZhbGlkYXRlQ29uZmlndXJlKGZlYXR1cmUsIHN0YXR1cyk7Ci0KLQkJLy8gcmVwb3J0IHN0YXR1cwotCQlyZXR1cm4gY3JlYXRlQ29tYmluZWRSZXBvcnRTdGF0dXMoYmVmb3JlU3RhdHVzLCBzdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBiZWZvcmUgcGVyZm9ybWluZyBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVQZW5kaW5nUmVwbGFjZVZlcnNpb24oCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUlGZWF0dXJlIGFub3RoZXJGZWF0dXJlKSB7Ci0JCS8vIGNoZWNrIGluaXRpYWwgc3RhdGUKLQkJQXJyYXlMaXN0IGJlZm9yZVN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdmFsaWRhdGVJbml0aWFsU3RhdGUoYmVmb3JlU3RhdHVzKTsKLQotCQkvLyBjaGVjayBwcm9wb3NlZCBjaGFuZ2UKLQkJQXJyYXlMaXN0IHN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJY2hlY2tQbGF0Zm9ybVdhc01vZGlmaWVkKHN0YXR1cyk7Ci0JCXZhbGlkYXRlUmVwbGFjZVZlcnNpb24oZmVhdHVyZSwgYW5vdGhlckZlYXR1cmUsIHN0YXR1cyk7Ci0KLQkJLy8gcmVwb3J0IHN0YXR1cwotCQlyZXR1cm4gY3JlYXRlQ29tYmluZWRSZXBvcnRTdGF0dXMoYmVmb3JlU3RhdHVzLCBzdGF0dXMpOwotCX0KLQotCi0JLyoKLQkgKiBDYWxsZWQgYnkgdGhlIFVJIGJlZm9yZSBkb2luZyBhIHJldmVydC8gcmVzdG9yZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVBlbmRpbmdSZXZlcnQoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkvLyBjaGVjayBpbml0aWFsIHN0YXRlCi0JCUFycmF5TGlzdCBiZWZvcmVTdGF0dXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXZhbGlkYXRlSW5pdGlhbFN0YXRlKGJlZm9yZVN0YXR1cyk7Ci0KLQkJLy8gY2hlY2sgcHJvcG9zZWQgY2hhbmdlCi0JCUFycmF5TGlzdCBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWNoZWNrUGxhdGZvcm1XYXNNb2RpZmllZChzdGF0dXMpOwotCQl2YWxpZGF0ZVJldmVydChjb25maWcsIHN0YXR1cyk7Ci0KLQkJLy8gcmVwb3J0IHN0YXR1cwotCQlyZXR1cm4gY3JlYXRlQ29tYmluZWRSZXBvcnRTdGF0dXMoYmVmb3JlU3RhdHVzLCBzdGF0dXMpOwotCX0KLQotCS8qCi0JICogQ2FsbGVkIGJ5IHRoZSBVSSBiZWZvcmUgZG9pbmcgYSBiYXRjaGVkIHByb2Nlc3Npbmcgb2Ygc2V2ZXJhbCBwZW5kaW5nCi0JICogY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVBlbmRpbmdDaGFuZ2VzKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnMpIHsKLQkJLy8gY2hlY2sgaW5pdGlhbCBzdGF0ZQotCQlBcnJheUxpc3QgYmVmb3JlU3RhdHVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl2YWxpZGF0ZUluaXRpYWxTdGF0ZShiZWZvcmVTdGF0dXMpOwotCQljaGVja1BsYXRmb3JtV2FzTW9kaWZpZWQoYmVmb3JlU3RhdHVzKTsKLQotCQkvLyBjaGVjayBwcm9wb3NlZCBjaGFuZ2UKLQkJQXJyYXlMaXN0IHN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdmFsaWRhdGVQZW5kaW5nQ2hhbmdlcyhqb2JzLCBzdGF0dXMsIGJlZm9yZVN0YXR1cyk7Ci0KLQkJLy8gcmVwb3J0IHN0YXR1cwotCQlyZXR1cm4gY3JlYXRlQ29tYmluZWRSZXBvcnRTdGF0dXMoYmVmb3JlU3RhdHVzLCBzdGF0dXMpOwotCX0KLQkKLQkvKgotCSAqIENhbGxlZCBieSB0aGUgVUkgYmVmb3JlIGRvaW5nIGEgYmF0Y2hlZCBwcm9jZXNzaW5nIG9mIHNldmVyYWwgcGVuZGluZwotCSAqIGNoYW5nZXMuCi0JICovCi0JcHVibGljIFJlcXVpcmVkRmVhdHVyZXNSZXN1bHQgZ2V0UmVxdWlyZWRGZWF0dXJlcyhJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBqb2JzKSB7Ci0JCQotCQlSZXF1aXJlZEZlYXR1cmVzUmVzdWx0IHJlcXVpcmVkRmVhdHVyZXNSZXN1bHQgPSBuZXcgUmVxdWlyZWRGZWF0dXJlc1Jlc3VsdCgpOwotCQkvLyBjaGVjayBpbml0aWFsIHN0YXRlCi0JCUFycmF5TGlzdCBiZWZvcmVTdGF0dXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXZhbGlkYXRlSW5pdGlhbFN0YXRlKGJlZm9yZVN0YXR1cyk7Ci0JCWNoZWNrUGxhdGZvcm1XYXNNb2RpZmllZChiZWZvcmVTdGF0dXMpOwotCi0JCS8vIGNoZWNrIHByb3Bvc2VkIGNoYW5nZQotCQlBcnJheUxpc3Qgc3RhdHVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlTZXQgcmVxdWlyZWRGZWF0dXJlcyA9IHZhbGlkYXRlUGVuZGluZ0NoYW5nZXMoam9icywgc3RhdHVzLCBiZWZvcmVTdGF0dXMpOwotCi0JCS8vIHJlcG9ydCBzdGF0dXMKLQkJLy9yZXR1cm4gY3JlYXRlQ29tYmluZWRSZXBvcnRTdGF0dXMoYmVmb3JlU3RhdHVzLCBzdGF0dXMpOwotCQlyZXF1aXJlZEZlYXR1cmVzUmVzdWx0LnNldFJlcXVpcmVkRmVhdHVyZXMocmVxdWlyZWRGZWF0dXJlcyk7Ci0JCXJlcXVpcmVkRmVhdHVyZXNSZXN1bHQuc2V0U3RhdHVzKGNyZWF0ZUNvbWJpbmVkUmVwb3J0U3RhdHVzKGJlZm9yZVN0YXR1cywgc3RhdHVzKSk7Ci0JCXJldHVybiByZXF1aXJlZEZlYXR1cmVzUmVzdWx0OwotCX0KLQotCS8qCi0JICogQ2hlY2sgdGhlIGN1cnJlbnQgc3RhdGUuCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVDdXJyZW50U3RhdGUoKSB7Ci0JCS8vIGNoZWNrIHRoZSBzdGF0ZQotCQlBcnJheUxpc3Qgc3RhdHVzID0gbmV3IEFycmF5TGlzdCgpOwotCQljaGVja1BsYXRmb3JtV2FzTW9kaWZpZWQoc3RhdHVzKTsKLQkJdmFsaWRhdGVJbml0aWFsU3RhdGUoc3RhdHVzKTsKLQotCQkvLyByZXBvcnQgc3RhdHVzCi0JCWlmIChzdGF0dXMuc2l6ZSgpID4gMCkKLQkJCXJldHVybiBjcmVhdGVNdWx0aVN0YXR1cyhNZXNzYWdlcy5BY3Rpdml0eUNvbnN0cmFpbnRzX3Jvb3RNZXNzYWdlLCBzdGF0dXMsIElTdGF0dXMuRVJST1IpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgbm90IGJyb2tlbiBldmVuIGJlZm9yZSB3ZSBzdGFydAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVJbml0aWFsU3RhdGUoQXJyYXlMaXN0IHN0YXR1cykgewotCQl0cnkgewotCQkJQXJyYXlMaXN0IGZlYXR1cmVzID0gY29tcHV0ZUZlYXR1cmVzKCk7Ci0JCQkvLyB1bmNvbW1lbnQgdGhpcyB3aGVuIHBhdGNoIHJlbGVhc2VkIGluIGJvb3QKLQkJCS8vY2hlY2tDb25maWd1cmF0aW9uTG9jayhzdGF0dXMpOwotCQkJY2hlY2tDb25zdHJhaW50cyhmZWF0dXJlcywgc3RhdHVzKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMuYWRkKGUuZ2V0U3RhdHVzKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBoYW5kbGUgdW5jb25maWd1cmUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlVW5jb25maWd1cmUoCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUFycmF5TGlzdCBzdGF0dXMpIHsKLQkJdHJ5IHsKLQkJCWNoZWNrU2l0ZVJlYWRPbmx5KGZlYXR1cmUsc3RhdHVzKTsKLQkJCUFycmF5TGlzdCBmZWF0dXJlcyA9IGNvbXB1dGVGZWF0dXJlcygpOwotCQkJZmVhdHVyZXMgPSBjb21wdXRlRmVhdHVyZXNBZnRlck9wZXJhdGlvbihmZWF0dXJlcywgbnVsbCwgZmVhdHVyZSk7Ci0JCQljaGVja0NvbnN0cmFpbnRzKGZlYXR1cmVzLCBzdGF0dXMpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cy5hZGQoZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLQl9Ci0KLQotCS8qCi0JICogaGFuZGxlIGNvbmZpZ3VyZQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVDb25maWd1cmUoSUZlYXR1cmUgZmVhdHVyZSwgQXJyYXlMaXN0IHN0YXR1cykgewotCQl0cnkgewotCQkJY2hlY2tTaXRlUmVhZE9ubHkoZmVhdHVyZSxzdGF0dXMpOwotCQkJQXJyYXlMaXN0IGZlYXR1cmVzID0gY29tcHV0ZUZlYXR1cmVzKCk7Ci0JCQljaGVja09wdGlvbmFsQ2hpbGRDb25maWd1cmluZyhmZWF0dXJlLCBzdGF0dXMpOwotCQkJY2hlY2tGb3JDeWNsZXMoZmVhdHVyZSwgbnVsbCwgZmVhdHVyZXMpOwotCQkJZmVhdHVyZXMgPSBjb21wdXRlRmVhdHVyZXNBZnRlck9wZXJhdGlvbihmZWF0dXJlcywgZmVhdHVyZSwgbnVsbCk7Ci0JCQljaGVja0NvbnN0cmFpbnRzKGZlYXR1cmVzLCBzdGF0dXMpOwotCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzLmFkZChlLmdldFN0YXR1cygpKTsKLQkJfQotCX0KLQotCS8qCi0JICogaGFuZGxlIHJlcGxhY2UgdmVyc2lvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVSZXBsYWNlVmVyc2lvbigKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJSUZlYXR1cmUgYW5vdGhlckZlYXR1cmUsCi0JCUFycmF5TGlzdCBzdGF0dXMpIHsKLQkJdHJ5IHsKLQkJCWNoZWNrU2l0ZVJlYWRPbmx5KGZlYXR1cmUsc3RhdHVzKTsKLQkJCUFycmF5TGlzdCBmZWF0dXJlcyA9IGNvbXB1dGVGZWF0dXJlcygpOwotCQkJY2hlY2tGb3JDeWNsZXMoZmVhdHVyZSwgbnVsbCwgZmVhdHVyZXMpOwotCQkJZmVhdHVyZXMgPQotCQkJCWNvbXB1dGVGZWF0dXJlc0FmdGVyT3BlcmF0aW9uKAotCQkJCQlmZWF0dXJlcywKLQkJCQkJYW5vdGhlckZlYXR1cmUsCi0JCQkJCWZlYXR1cmUpOwotCQkJY2hlY2tDb25zdHJhaW50cyhmZWF0dXJlcywgc3RhdHVzKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMuYWRkKGUuZ2V0U3RhdHVzKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBoYW5kbGUgaW5zdGFsbCBhbmQgdXBkYXRlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZUluc3RhbGwoCi0JCUlGZWF0dXJlIG9sZEZlYXR1cmUsCi0JCUlGZWF0dXJlIG5ld0ZlYXR1cmUsCi0JCUFycmF5TGlzdCBzdGF0dXMpIHsKLQkJdHJ5IHsKLQkJCWNoZWNrU2l0ZVJlYWRPbmx5KG9sZEZlYXR1cmUsc3RhdHVzKTsKLQkJCUFycmF5TGlzdCBmZWF0dXJlcyA9IGNvbXB1dGVGZWF0dXJlcygpOwotCQkJY2hlY2tGb3JDeWNsZXMobmV3RmVhdHVyZSwgbnVsbCwgZmVhdHVyZXMpOwotCQkJZmVhdHVyZXMgPQotCQkJCWNvbXB1dGVGZWF0dXJlc0FmdGVyT3BlcmF0aW9uKGZlYXR1cmVzLCBuZXdGZWF0dXJlLCBvbGRGZWF0dXJlKTsKLQkJCWNoZWNrQ29uc3RyYWludHMoZmVhdHVyZXMsIHN0YXR1cyk7Ci0JCQljaGVja0xpY2Vuc2UobmV3RmVhdHVyZSwgc3RhdHVzKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMuYWRkKGUuZ2V0U3RhdHVzKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBoYW5kbGUgcmV2ZXJ0IGFuZCByZXN0b3JlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZVJldmVydCgKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJQXJyYXlMaXN0IHN0YXR1cykgewotCQl0cnkgewotLy8JCQkvLyBjaGVjayB0aGUgdGltZWxpbmUgYW5kIGRvbid0IGJvdGhlcgotLy8JCQkvLyB0byBjaGVjayBhbnl0aGluZyBlbHNlIGlmIG5lZ2F0aXZlCi0vLwkJCWlmICghY2hlY2tUaW1lbGluZShjb25maWcsIHN0YXR1cykpCi0vLwkJCQlyZXR1cm47Ci0JCQlBcnJheUxpc3QgZmVhdHVyZXMgPSBjb21wdXRlRmVhdHVyZXNBZnRlclJldmVydChjb25maWcpOwotCQkJY2hlY2tDb25zdHJhaW50cyhmZWF0dXJlcywgc3RhdHVzKTsKLQkJCWNoZWNrUmV2ZXJ0Q29uc3RyYWludHMoZmVhdHVyZXMsIHN0YXR1cyk7Ci0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMuYWRkKGUuZ2V0U3RhdHVzKCkpOwotCQl9Ci0JfQotCi0KLQkvKgotCSAqIEhhbmRsZSBvbmUtY2xpY2sgY2hhbmdlcyBhcyBhIGJhdGNoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU2V0IHZhbGlkYXRlUGVuZGluZ0NoYW5nZXMoCi0JCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnMsCi0JCUFycmF5TGlzdCBzdGF0dXMsCi0JCUFycmF5TGlzdCBiZWZvcmVTdGF0dXMpIHsKLQkJdHJ5IHsKLQkJCUFycmF5TGlzdCBmZWF0dXJlcyA9IGNvbXB1dGVGZWF0dXJlcygpOwotCQkJQXJyYXlMaXN0IHNhdmVkRmVhdHVyZXMgPSBmZWF0dXJlczsKLQkJCWludCBuZXhjbHVzaXZlcyA9IDA7Ci0KLQkJCS8vIHBhc3MgMTogc2VlIGlmIHdlIGNhbiBwcm9jZXNzIHRoZSBlbnRpcmUgImJhdGNoIgotCQkJQXJyYXlMaXN0IHRtcFN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgam9icy5sZW5ndGg7IGkrKykgewotCQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IgPSBqb2JzW2ldOwotCi0JCQkJSUZlYXR1cmUgbmV3RmVhdHVyZSA9IGpvYi5nZXRGZWF0dXJlKCk7Ci0JCQkJSUZlYXR1cmUgb2xkRmVhdHVyZSA9IGpvYi5nZXRPbGRGZWF0dXJlKCk7Ci0JCQkJY2hlY2tMaWNlbnNlKG5ld0ZlYXR1cmUsIHN0YXR1cyk7Ci0JCQkJaWYgKGpvYnMubGVuZ3RoID4gMSAmJiBuZXdGZWF0dXJlLmlzRXhjbHVzaXZlKCkpIHsKLQkJCQkJbmV4Y2x1c2l2ZXMrKzsKLQkJCQkJc3RhdHVzLmFkZCgKLQkJCQkJCWNyZWF0ZVN0YXR1cygKLQkJCQkJCQluZXdGZWF0dXJlLAotCQkJCQkJCUZlYXR1cmVTdGF0dXMuQ09ERV9FWENMVVNJVkUsCi0JCQkJCQkJTWVzc2FnZXMuQWN0aXZpdHlDb25zdHJhaW50c19leGNsdXNpdmUpKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWNoZWNrRm9yQ3ljbGVzKG5ld0ZlYXR1cmUsIG51bGwsIGZlYXR1cmVzKTsKLQkJCQlmZWF0dXJlcyA9Ci0JCQkJCWNvbXB1dGVGZWF0dXJlc0FmdGVyT3BlcmF0aW9uKAotCQkJCQkJZmVhdHVyZXMsCi0JCQkJCQluZXdGZWF0dXJlLAotCQkJCQkJb2xkRmVhdHVyZSk7Ci0JCQl9Ci0JCQlpZiAobmV4Y2x1c2l2ZXMgPiAwKQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JCQljaGVja0NvbnN0cmFpbnRzKGZlYXR1cmVzLCB0bXBTdGF0dXMpOwotCQkJaWYgKHRtcFN0YXR1cy5zaXplKCkgPT0gMCkgLy8gdGhlIHdob2xlICJiYXRjaCIgaXMgT0sKLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCi0JCQkvLyBwYXNzIDI6IHdlIGhhdmUgY29uZmxpY3RzCi0JCQlmZWF0dXJlcyA9IHNhdmVkRmVhdHVyZXM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iID0gam9ic1tpXTsKLQkJCQlJRmVhdHVyZSBuZXdGZWF0dXJlID0gam9iLmdldEZlYXR1cmUoKTsKLQkJCQlJRmVhdHVyZSBvbGRGZWF0dXJlID0gam9iLmdldE9sZEZlYXR1cmUoKTsKLQotCQkJCWZlYXR1cmVzID0KLQkJCQkJY29tcHV0ZUZlYXR1cmVzQWZ0ZXJPcGVyYXRpb24oCi0JCQkJCQlmZWF0dXJlcywKLQkJCQkJCW5ld0ZlYXR1cmUsCi0JCQkJCQlvbGRGZWF0dXJlKTsKLQotCQkJCVNldCByZXN1bHQgPSBjaGVja0NvbnN0cmFpbnRzKGZlYXR1cmVzLCBzdGF0dXMpOwotCQkJCWlmIChzdGF0dXMuc2l6ZSgpID4gMAotCQkJCQkmJiAhaXNCZXR0ZXJTdGF0dXMoYmVmb3JlU3RhdHVzLCBzdGF0dXMpKSB7Ci0vLyBidWcgNzU2MTMKLS8vCQkJCQlJU3RhdHVzIGNvbmZsaWN0ID0KLS8vCQkJCQkJY3JlYXRlU3RhdHVzKAotLy8JCQkJCQkJbmV3RmVhdHVyZSwKLS8vCQkJCQkJCUZlYXR1cmVTdGF0dXMuQ09ERV9PVEhFUiwKLS8vCQkJCQkJCVBvbGljeS5iaW5kKEtFWV9DT05GTElDVCkpOwotLy8JCQkJCXN0YXR1cy5hZGQoMCwgY29uZmxpY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMuYWRkKGUuZ2V0U3RhdHVzKCkpOwotCQl9Ci0JCQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrUGxhdGZvcm1XYXNNb2RpZmllZChBcnJheUxpc3Qgc3RhdHVzKSB7Ci0JCXRyeSB7Ci0JCQkvLyBjaGVja3MgaWYgdGhlIHBsYXRmb3JtIGhhcyBiZWVuIG1vZGlmaWVkIG91dHNpZGUgdGhpcyBlY2xpcHNlIGluc3RhbmNlCi0JCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIHBsYXRmb3JtQ29uZmlnID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOwotCQkJCi0JCQlsb25nIGN1cnJlbnRUaW1lU3RhbXAgPSBwbGF0Zm9ybUNvbmZpZy5nZXRDaGFuZ2VTdGFtcCgpOwotCQkJLy8gZ2V0IHRoZSBsYXN0IG1vZGlmaWVkIHZhbHVlIGZvciB0aGlzIGNvbmZpZywgZnJvbSB0aGlzIHByb2Nlc3MgcG9pbnQgb2YgdmlldwotCQkJaWYgKHBsYXRmb3JtQ29uZmlnIGluc3RhbmNlb2YgUGxhdGZvcm1Db25maWd1cmF0aW9uKSAKLQkJCQljdXJyZW50VGltZVN0YW1wID0gKChQbGF0Zm9ybUNvbmZpZ3VyYXRpb24pcGxhdGZvcm1Db25maWcpLmdldENvbmZpZ3VyYXRpb24oKS5sYXN0TW9kaWZpZWQoKTsKLQkJCQkKLQkJCS8vIGdldCB0aGUgcmVhbCBsYXN0IG1vZGlmaWVkIHZhbHVlCi0JCQlVUkwgcGxhdGZvcm1YTUwgPSBwbGF0Zm9ybUNvbmZpZy5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKTsKLQkJCWxvbmcgYWN0dWFsVGltZVN0YW1wID0gY3VycmVudFRpbWVTdGFtcDsKLQkJCWlmICgiZmlsZSIuZXF1YWxzKHBsYXRmb3JtWE1MLmdldFByb3RvY29sKCkpKSAvLyROT04tTkxTLTEkCi0JCQkJYWN0dWFsVGltZVN0YW1wID0gbmV3IEZpbGUocGxhdGZvcm1YTUwuZ2V0RmlsZSgpKS5sYXN0TW9kaWZpZWQoKTsKLQkJCWVsc2UgewotCQkJCVVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IHBsYXRmb3JtWE1MLm9wZW5Db25uZWN0aW9uKCk7Ci0JCQkJYWN0dWFsVGltZVN0YW1wID0gY29ubmVjdGlvbi5nZXRMYXN0TW9kaWZpZWQoKTsKLQkJCX0KLQkJCWlmIChjdXJyZW50VGltZVN0YW1wICE9IGFjdHVhbFRpbWVTdGFtcCkKLQkJCQlzdGF0dXMuYWRkKGNyZWF0ZVN0YXR1cygKLQkJCQkJCQkJbnVsbCwKLQkJCQkJCQkJRmVhdHVyZVN0YXR1cy5DT0RFX09USEVSLAotCQkJCQkJCQlNZXNzYWdlcy5BY3Rpdml0eUNvbnN0cmFpbnRzX3BsYXRmb3JtTW9kaWZpZWQpKTsgCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tTaXRlUmVhZE9ubHkoSUZlYXR1cmUgZmVhdHVyZSwgQXJyYXlMaXN0IHN0YXR1cykgewotCQlpZihmZWF0dXJlID09IG51bGwpewotCQkJcmV0dXJuOwotCQl9Ci0JCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IGZlYXR1cmUuZ2V0U2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpOwotCQlpZiAoY3NpdGUgIT0gbnVsbCAmJiAhY3NpdGUuaXNVcGRhdGFibGUoKSkKLQkJCXN0YXR1cy5hZGQoY3JlYXRlU3RhdHVzKGZlYXR1cmUsIEZlYXR1cmVTdGF0dXMuQ09ERV9PVEhFUiwKLQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuQWN0aXZpdHlDb25zdHJhaW50c19yZWFkT25seSwgKG5ldyBTdHJpbmdbXSB7IGNzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpIH0pKSkpOwotCX0KLQotCS8qCi0JICogQ29tcHV0ZSBhIGxpc3Qgb2YgY29uZmlndXJlZCBmZWF0dXJlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBjb21wdXRlRmVhdHVyZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjb21wdXRlRmVhdHVyZXModHJ1ZSk7Ci0JfQotCS8qCi0JICogQ29tcHV0ZSBhIGxpc3Qgb2YgY29uZmlndXJlZCBmZWF0dXJlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBjb21wdXRlRmVhdHVyZXMoYm9vbGVhbiBjb25maWd1cmVkT25seSkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlBcnJheUxpc3QgZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJSUNvbmZpZ3VyZWRTaXRlW10gY3NpdGVzID0gY29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3NpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBjc2l0ZXNbaV07Ci0KLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gY3JlZnM7Ci0KLQkJCWlmIChjb25maWd1cmVkT25seSkKLQkJCQljcmVmcyA9IGNzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQkJZWxzZQotCQkJCWNyZWZzID0gY3NpdGUuZ2V0U2l0ZSgpLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNyZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJSUZlYXR1cmVSZWZlcmVuY2UgY3JlZiA9IGNyZWZzW2pdOwotCQkJCUlGZWF0dXJlIGNmZWF0dXJlID0gY3JlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCWZlYXR1cmVzLmFkZChjZmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiBDb21wdXRlIHRoZSBuZXN0ZWQgZmVhdHVyZSBzdWJ0cmVlIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgYmFzZQotCSAqIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFycmF5TGlzdCBjb21wdXRlRmVhdHVyZVN1YnRyZWUoCi0JCQlJRmVhdHVyZSB0b3AsCi0JCQlJRmVhdHVyZSBmZWF0dXJlLAotCQkJQXJyYXlMaXN0IGZlYXR1cmVzLAotCQkJYm9vbGVhbiB0b2xlcmF0ZU1pc3NpbmdDaGlsZHJlbiwKLQkJCUFycmF5TGlzdCBjb25maWd1cmVkRmVhdHVyZXMsCi0JCQlBcnJheUxpc3QgdmlzaXRlZEZlYXR1cmVzKQotCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkvLyBjaGVjayBhcmd1bWVudHMKLQkJaWYgKHRvcCA9PSBudWxsKQotCQkJcmV0dXJuIGZlYXR1cmVzOwotCQlpZiAoZmVhdHVyZSA9PSBudWxsKQotCQkJZmVhdHVyZSA9IHRvcDsKLQkJaWYgKGZlYXR1cmVzID09IG51bGwpCi0JCQlmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHZpc2l0ZWRGZWF0dXJlcyA9PSBudWxsKQotCQkJdmlzaXRlZEZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIGNoZWNrIGZvciA8aW5jbHVkZXM+IGN5Y2xlCi0JCWlmICh2aXNpdGVkRmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSkpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0KLQkJCWNyZWF0ZVN0YXR1cyh0b3AsIEZlYXR1cmVTdGF0dXMuQ09ERV9DWUNMRSwgTWVzc2FnZXMuQWN0aXZpdHlDb25zdHJhaW50c19jeWNsZSk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQl9IGVsc2UgewotCQkJLy8ga2VlcCB0cmFjayBvZiB2aXNpdGVkIGZlYXR1cmVzIHNvIHdlIGNhbiBkZXRlY3QgY3ljbGVzCi0JCQl2aXNpdGVkRmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQl9Ci0KLQkJLy8gcmV0dXJuIHNwZWNpZmllZCBiYXNlIGZlYXR1cmUgYW5kIGFsbCBpdHMgY2hpbGRyZW4KLQkJaWYgKCFmZWF0dXJlcy5jb250YWlucyhmZWF0dXJlKSkKLQkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0KLQkJZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJSUZlYXR1cmUgY2hpbGQgPSBVcGRhdGVVdGlscy5nZXRJbmNsdWRlZEZlYXR1cmUoZmVhdHVyZSwgY2hpbGRyZW5baV0pOwotCQkJCWZlYXR1cmVzID0KLQkJCQljb21wdXRlRmVhdHVyZVN1YnRyZWUoCi0JCQkJCQl0b3AsCi0JCQkJCQljaGlsZCwKLQkJCQkJCWZlYXR1cmVzLAotCQkJCQkJdG9sZXJhdGVNaXNzaW5nQ2hpbGRyZW4sCi0JCQkJCQludWxsLAotCQkJCQkJdmlzaXRlZEZlYXR1cmVzKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWlmICghY2hpbGRyZW5baV0uaXNPcHRpb25hbCgpICYmICF0b2xlcmF0ZU1pc3NpbmdDaGlsZHJlbikKLQkJCQkJdGhyb3cgZTsKLQkJCX0KLQkJfQotCQkvLyBubyBjeWNsZXMgZm9yIHRoaXMgZmVhdHVyZSBkdXJpbmcgREZTCi0JCXZpc2l0ZWRGZWF0dXJlcy5yZW1vdmUoZmVhdHVyZSk7Ci0JCXJldHVybiBmZWF0dXJlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrTGljZW5zZShJRmVhdHVyZSBmZWF0dXJlLCBBcnJheUxpc3Qgc3RhdHVzKSB7Ci0JCUlVUkxFbnRyeSBsaWNlbnNlRW50cnkgPSBmZWF0dXJlLmdldExpY2Vuc2UoKTsKLQkJaWYgKGxpY2Vuc2VFbnRyeSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbGljZW5zZSA9IGxpY2Vuc2VFbnRyeS5nZXRBbm5vdGF0aW9uKCk7Ci0JCQlpZiAobGljZW5zZSAhPSBudWxsICYmIGxpY2Vuc2UudHJpbSgpLmxlbmd0aCgpID4gMCkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3RhdHVzLmFkZCgKLQkJCWNyZWF0ZVN0YXR1cyhmZWF0dXJlLCBGZWF0dXJlU3RhdHVzLkNPREVfT1RIRVIsIE1lc3NhZ2VzLkFjdGl2aXR5Q29uc3RyYWludHNfbm9MaWNlbnNlKSk7Ci0JfQotCi0JLyoKLQkgKiBDb21wdXRlIGEgbGlzdCBvZiBmZWF0dXJlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhZnRlciB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGNvbXB1dGVGZWF0dXJlc0FmdGVyT3BlcmF0aW9uKAotCQlBcnJheUxpc3QgZmVhdHVyZXMsCi0JCUlGZWF0dXJlIGFkZCwKLQkJSUZlYXR1cmUgcmVtb3ZlKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJQXJyYXlMaXN0IGFkZFRyZWUgPSBjb21wdXRlRmVhdHVyZVN1YnRyZWUoYWRkLCBudWxsLCBudWxsLCBmYWxzZSwKLQkJLyogZG8gbm90IHRvbGVyYXRlIG1pc3NpbmcgY2hpbGRyZW4gKi8KLQkJZmVhdHVyZXMsIG51bGwpOwotCQlBcnJheUxpc3QgcmVtb3ZlVHJlZSA9Ci0JCQljb21wdXRlRmVhdHVyZVN1YnRyZWUoCi0JCQkJcmVtb3ZlLAotCQkJCW51bGwsCi0JCQkJbnVsbCwKLQkJCQl0cnVlIC8qIHRvbGVyYXRlIG1pc3NpbmcgY2hpbGRyZW4gKi8sCi0JCQkJbnVsbCwKLQkJCQludWxsCi0JCSk7Ci0JCWlmIChyZW1vdmUgIT0gbnVsbCkgewotCQkJLy8gUGF0Y2hlcyB0byBmZWF0dXJlcyBhcmUgcmVtb3ZlZCB0b2dldGhlciB3aXRoCi0JCQkvLyB0aG9zZSBmZWF0dXJlcy4gSW5jbHVkZSB0aGVtIGluIHRoZSBsaXN0LgotCQkJY29udHJpYnV0ZVBhdGNoZXNGb3IocmVtb3ZlVHJlZSwgZmVhdHVyZXMsIHJlbW92ZVRyZWUpOwotCQl9Ci0KLQkJaWYgKHJlbW92ZSAhPSBudWxsKQotCQkJZmVhdHVyZXMucmVtb3ZlQWxsKHJlbW92ZVRyZWUpOwotCi0JCWlmIChhZGQgIT0gbnVsbCkKLQkJCWZlYXR1cmVzLmFkZEFsbChhZGRUcmVlKTsKLQotCQlyZXR1cm4gZmVhdHVyZXM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb250cmlidXRlUGF0Y2hlc0ZvcigKLQkJQXJyYXlMaXN0IHJlbW92ZVRyZWUsCi0JCUFycmF5TGlzdCBmZWF0dXJlcywKLQkJQXJyYXlMaXN0IHJlc3VsdCkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVtb3ZlVHJlZS5zaXplKCk7IGkrKykgewotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IChJRmVhdHVyZSkgcmVtb3ZlVHJlZS5nZXQoaSk7Ci0JCQljb250cmlidXRlUGF0Y2hlc0ZvcihmZWF0dXJlLCBmZWF0dXJlcywgcmVzdWx0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udHJpYnV0ZVBhdGNoZXNGb3IoCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUFycmF5TGlzdCBmZWF0dXJlcywKLQkJQXJyYXlMaXN0IHJlc3VsdCkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQlJRmVhdHVyZSBjYW5kaWRhdGUgPSAoSUZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCWlmIChVcGRhdGVVdGlscy5pc1BhdGNoKGZlYXR1cmUsIGNhbmRpZGF0ZSkpIHsKLQkJCQlBcnJheUxpc3QgcmVtb3ZlVHJlZSA9Ci0JCQkJCWNvbXB1dGVGZWF0dXJlU3VidHJlZShjYW5kaWRhdGUsIG51bGwsIG51bGwsIHRydWUsbnVsbCxudWxsKTsKLQkJCQlyZXN1bHQuYWRkQWxsKHJlbW92ZVRyZWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBDb21wdXRlIGEgbGlzdCBvZiBmZWF0dXJlcyB0aGF0IHdpbGwgYmUgY29uZmlndXJlZCBhZnRlciBwZXJmb3JtaW5nIHRoZQotCSAqIHJldmVydAotCSAqLwotCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBjb21wdXRlRmVhdHVyZXNBZnRlclJldmVydChJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlDb25maWd1cmVkU2l0ZVtdIGNzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IGNzaXRlc1tpXTsKLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXMgPSBjc2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZmVhdHVyZXMubGVuZ3RoOyBqKyspIHsKLQkJCQlsaXN0LmFkZChmZWF0dXJlc1tqXS5nZXRGZWF0dXJlKG51bGwpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQotCi0JLyoKLQkgKiBDb21wdXRlIGEgbGlzdCBvZiBwbHVnaW4gZW50cmllcyBmb3IgdGhlIHNwZWNpZmllZCBmZWF0dXJlcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgY29tcHV0ZVBsdWdpbnNGb3JGZWF0dXJlcyhBcnJheUxpc3QgZmVhdHVyZXMpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZlYXR1cmVzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgpOwotCi0JCUhhc2hNYXAgcGx1Z2lucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoSUZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSBmZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZW50cmllcy5sZW5ndGg7IGorKykgewotCQkJCUlQbHVnaW5FbnRyeSBlbnRyeSA9IGVudHJpZXNbal07Ci0JCQkJcGx1Z2lucy5wdXQoZW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLCBlbnRyeSk7Ci0JCQl9Ci0JCX0KLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdWx0LmFkZEFsbChwbHVnaW5zLnZhbHVlcygpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8qKgotCSAqIENoZWNrIGZvciBmZWF0dXJlIGN5Y2xlczoKLQkgKiAtIHZpc2l0IGZlYXR1cmUKLQkgKiAtIGlmIGZlYXR1cmUgaXMgaW4gdGhlIGN5Y2xlIGNhbmRpZGF0ZXMgbGlzdCwgdGhlbiBjeWNsZSBmb3VuZCwgZWxzZSBhZGQgaXQgdG8gY2FuZGlkYXRlcyBsaXN0Ci0JICogLSBERlMgY2hpbGRyZW4gCi0JICogLSB3aGVuIHJldHVybiBmcm9tIERGUyByZW1vdmUgdGhlIGZlYXR1cmUgZnJvbSB0aGUgY2FuZGlkYXRlcyBsaXN0Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0ZvckN5Y2xlcygKLQkJCUlGZWF0dXJlIGZlYXR1cmUsCi0JCQlBcnJheUxpc3QgY2FuZGlkYXRlcywKLQkJCUFycmF5TGlzdCBjb25maWd1cmVkRmVhdHVyZXMpCi0JdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCS8vIGNoZWNrIGFyZ3VtZW50cwotCQlpZiAoZmVhdHVyZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoY29uZmlndXJlZEZlYXR1cmVzID09IG51bGwpCi0JCQljb25maWd1cmVkRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChjYW5kaWRhdGVzID09IG51bGwpCi0JCQljYW5kaWRhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJLy8gY2hlY2sgZm9yIDxpbmNsdWRlcz4gY3ljbGUKLQkJaWYgKGNhbmRpZGF0ZXMuY29udGFpbnMoZmVhdHVyZSkpIHsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5BY3Rpdml0eUNvbnN0cmFpbnRzX2N5Y2xlLCAobmV3IFN0cmluZ1tdIHtmZWF0dXJlLmdldExhYmVsKCksIAotICAgICAgICAgICAgZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKX0pKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gY3JlYXRlU3RhdHVzKGZlYXR1cmUsIEZlYXR1cmVTdGF0dXMuQ09ERV9DWUNMRSwgbXNnKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCX0KLQotCQkvLyBwb3RlbnRpYWwgY2FuZGlkYXRlCi0JCWNhbmRpZGF0ZXMuYWRkKGZlYXR1cmUpOwotCQkKLQkJLy8gcmVjdXJzaXZlbHksIGNoZWNrIGN5Y2xlcyB3aXRoIGNoaWxkcmVuCi0JCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiA9Ci0JCWZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCUlGZWF0dXJlIGNoaWxkID0gVXBkYXRlVXRpbHMuZ2V0SW5jbHVkZWRGZWF0dXJlKGZlYXR1cmUsIGNoaWxkcmVuW2ldKTsKLQkJCQljaGVja0ZvckN5Y2xlcyhjaGlsZCwgY2FuZGlkYXRlcywgY29uZmlndXJlZEZlYXR1cmVzKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWlmICghY2hpbGRyZW5baV0uaXNPcHRpb25hbCgpKQotCQkJCQl0aHJvdyBlOwotCQkJfQotCQl9Ci0JCS8vIG5vIGxvbmdlciBhIGNhbmRpZGF0ZSwgYmVjYXVzZSBubyBjeWNsZXMgd2l0aCBjaGlsZHJlbgotCQljYW5kaWRhdGVzLnJlbW92ZShmZWF0dXJlKTsKLQl9Ci0JCi0JLyoKLQkgKiB2YWxpZGF0ZSBjb25zdHJhaW50cwotCSAqLwotCXByaXZhdGUgc3RhdGljIFNldCAgY2hlY2tDb25zdHJhaW50cyhBcnJheUxpc3QgZmVhdHVyZXMsIEFycmF5TGlzdCBzdGF0dXMpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZlYXR1cmVzID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCi0JCUFycmF5TGlzdCBwbHVnaW5zID0gY29tcHV0ZVBsdWdpbnNGb3JGZWF0dXJlcyhmZWF0dXJlcyk7Ci0KLQkJY2hlY2tFbnZpcm9ubWVudChmZWF0dXJlcywgc3RhdHVzKTsKLQkJY2hlY2tQbGF0Zm9ybUZlYXR1cmUoZmVhdHVyZXMsIHBsdWdpbnMsIHN0YXR1cyk7Ci0JCWNoZWNrUHJpbWFyeUZlYXR1cmUoZmVhdHVyZXMsIHBsdWdpbnMsIHN0YXR1cyk7Ci0JCXJldHVybiBjaGVja1ByZXJlcXMoZmVhdHVyZXMsIHBsdWdpbnMsIHN0YXR1cyk7Ci0JfQotCi0JLyoKLQkgKiBWZXJpZnkgYWxsIGZlYXR1cmVzIGFyZSBlaXRoZXIgcG9ydGFibGUsIG9yIG1hdGNoIHRoZSBjdXJyZW50Ci0JICogZW52aXJvbm1lbnQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrRW52aXJvbm1lbnQoCi0JCUFycmF5TGlzdCBmZWF0dXJlcywKLQkJQXJyYXlMaXN0IHN0YXR1cykgewotCi0JCVN0cmluZyBvcyA9IFBsYXRmb3JtLmdldE9TKCk7Ci0JCVN0cmluZyB3cyA9IFBsYXRmb3JtLmdldFdTKCk7Ci0JCVN0cmluZyBhcmNoID0gUGxhdGZvcm0uZ2V0T1NBcmNoKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IChJRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJQXJyYXlMaXN0IGZvcyA9IGNyZWF0ZUxpc3QoZmVhdHVyZS5nZXRPUygpKTsKLQkJCUFycmF5TGlzdCBmd3MgPSBjcmVhdGVMaXN0KGZlYXR1cmUuZ2V0V1MoKSk7Ci0JCQlBcnJheUxpc3QgZmFyY2ggPSBjcmVhdGVMaXN0KGZlYXR1cmUuZ2V0T1NBcmNoKCkpOwotCi0JCQlpZiAoZm9zLnNpemUoKSA+IDApIHsKLQkJCQlpZiAoIWZvcy5jb250YWlucyhvcykpIHsKLQkJCQkJSVN0YXR1cyBzID0KLQkJCQkJCWNyZWF0ZVN0YXR1cyhmZWF0dXJlLCBGZWF0dXJlU3RhdHVzLkNPREVfRU5WSVJPTk1FTlQsIE1lc3NhZ2VzLkFjdGl2aXR5Q29uc3RyYWludHNfb3MpOwotCQkJCQlpZiAoIXN0YXR1cy5jb250YWlucyhzKSkKLQkJCQkJCXN0YXR1cy5hZGQocyk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGZ3cy5zaXplKCkgPiAwKSB7Ci0JCQkJaWYgKCFmd3MuY29udGFpbnMod3MpKSB7Ci0JCQkJCUlTdGF0dXMgcyA9Ci0JCQkJCQljcmVhdGVTdGF0dXMoZmVhdHVyZSwgRmVhdHVyZVN0YXR1cy5DT0RFX0VOVklST05NRU5ULCBNZXNzYWdlcy5BY3Rpdml0eUNvbnN0cmFpbnRzX3dzKTsKLQkJCQkJaWYgKCFzdGF0dXMuY29udGFpbnMocykpCi0JCQkJCQlzdGF0dXMuYWRkKHMpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChmYXJjaC5zaXplKCkgPiAwKSB7Ci0JCQkJaWYgKCFmYXJjaC5jb250YWlucyhhcmNoKSkgewotCQkJCQlJU3RhdHVzIHMgPQotCQkJCQkJY3JlYXRlU3RhdHVzKGZlYXR1cmUsIEZlYXR1cmVTdGF0dXMuQ09ERV9FTlZJUk9OTUVOVCwgTWVzc2FnZXMuQWN0aXZpdHlDb25zdHJhaW50c19hcmNoKTsKLQkJCQkJaWYgKCFzdGF0dXMuY29udGFpbnMocykpCi0JCQkJCQlzdGF0dXMuYWRkKHMpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFZlcmlmeSB3ZSBlbmQgdXAgd2l0aCBhIHZlcnNpb24gb2YgcGxhdGZvcm0gY29uZmlndXJlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tQbGF0Zm9ybUZlYXR1cmUoCi0JCUFycmF5TGlzdCBmZWF0dXJlcywKLQkJQXJyYXlMaXN0IHBsdWdpbnMsCi0JCUFycmF5TGlzdCBzdGF0dXMpIHsKLQotCQkvLyBmaW5kIHRoZSBwbHVnaW4gdGhhdCBkZWZpbmVzIHRoZSBwcm9kdWN0Ci0JCUlQcm9kdWN0IHByb2R1Y3QgPSBQbGF0Zm9ybS5nZXRQcm9kdWN0KCk7Ci0JCWlmIChwcm9kdWN0ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIG5vcm1hbGx5IHRoaXMgc2hvdWxkbid0IGhhcHBlbgotCQlCdW5kbGUgcHJpbWFyeUJ1bmRsZSA9IHByb2R1Y3QuZ2V0RGVmaW5pbmdCdW5kbGUoKTsKLQkJLy8gY2hlY2sgaWYgdGhhdCBwbHVnaW4gaXMgYW1vbmcgdGhlIHJlc3VsdGluZyBwbHVnaW5zCi0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBwbHVnaW5zLnNpemUoKTsgaisrKSB7Ci0JCQlJUGx1Z2luRW50cnkgcGx1Z2luID0gKElQbHVnaW5FbnRyeSkgcGx1Z2lucy5nZXQoaik7Ci0JCQlpZiAocHJpbWFyeUJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKS5lcXVhbHMocGx1Z2luLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkpKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoIWZvdW5kKSB7Ci0JCQlJU3RhdHVzIHMgPQotCQkJCWNyZWF0ZVN0YXR1cyhudWxsLCBGZWF0dXJlU3RhdHVzLkNPREVfT1RIRVIsIE1lc3NhZ2VzLkFjdGl2aXR5Q29uc3RyYWludHNfcGxhdGZvcm0pOwotCQkJaWYgKCFzdGF0dXMuY29udGFpbnMocykpCi0JCQkJc3RhdHVzLmFkZChzKTsKLQkJfQotCX0KLQotCS8qCi0JICogVmVyaWZ5IHdlIGVuZCB1cCB3aXRoIGEgdmVyc2lvbiBvZiBwcmltYXJ5IGZlYXR1cmUgY29uZmlndXJlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tQcmltYXJ5RmVhdHVyZSgKLQkJQXJyYXlMaXN0IGZlYXR1cmVzLAotCQlBcnJheUxpc3QgcGx1Z2lucywKLQkJQXJyYXlMaXN0IHN0YXR1cykgewotCi0JCVN0cmluZyBmZWF0dXJlSWQgPQotCQkJQ29uZmlndXJhdG9yVXRpbHMKLQkJCQkuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpCi0JCQkJLmdldFByaW1hcnlGZWF0dXJlSWRlbnRpZmllcigpOwotCQkKLQkJaWYgKGZlYXR1cmVJZCAhPSBudWxsKSB7Ci0JCQkvLyBwcmltYXJ5IGZlYXR1cmUgaXMgZGVmaW5lZAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoSUZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCQlpZiAoZmVhdHVyZUlkCi0JCQkJCS5lcXVhbHMoZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpKSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQotCQkJSVN0YXR1cyBzID0gY3JlYXRlU3RhdHVzKG51bGwsIEZlYXR1cmVTdGF0dXMuQ09ERV9PVEhFUiwgTWVzc2FnZXMuQWN0aXZpdHlDb25zdHJhaW50c19wcmltYXJ5KTsKLQkJCWlmICghc3RhdHVzLmNvbnRhaW5zKHMpKQotCQkJCXN0YXR1cy5hZGQocyk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBjaGVjayBpZiB0aGUgcHJvZHVjdCBzdGlsbCBlbmRzIHVwIGNvbnRyaWJ1dGVkCi0JCQkvLyBmaW5kIHRoZSBwbHVnaW4gdGhhdCBkZWZpbmVzIHRoZSBwcm9kdWN0Ci0JCQlJUHJvZHVjdCBwcm9kdWN0ID0gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpOwotCQkJaWYgKHByb2R1Y3QgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIG5vcm1hbGx5IHRoaXMgc2hvdWxkbid0IGhhcHBlbgotCQkJQnVuZGxlIHByaW1hcnlCdW5kbGUgPSBwcm9kdWN0LmdldERlZmluaW5nQnVuZGxlKCk7Ci0JCQkvLyBjaGVjayBpZiB0aGF0IHBsdWdpbiBpcyBhbW9uZyB0aGUgcmVzdWx0aW5nIHBsdWdpbnMKLQotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwbHVnaW5zLnNpemUoKTsgaisrKSB7Ci0JCQkJSVBsdWdpbkVudHJ5IHBsdWdpbiA9IChJUGx1Z2luRW50cnkpIHBsdWdpbnMuZ2V0KGopOwotCQkJCWlmIChwcmltYXJ5QnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLmVxdWFscyhwbHVnaW4uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKSkpIHsKLQkJCQkJcmV0dXJuOyAvLyBwcm9kdWN0IGZvdW5kCi0JCQkJfQotCQkJfQotCQkJSVN0YXR1cyBzID0KLQkJCQljcmVhdGVTdGF0dXMobnVsbCwgRmVhdHVyZVN0YXR1cy5DT0RFX09USEVSLCBNZXNzYWdlcy5BY3Rpdml0eUNvbnN0cmFpbnRzX3ByaW1hcnkpOwotCQkJaWYgKCFzdGF0dXMuY29udGFpbnMocykpCi0JCQkJc3RhdHVzLmFkZChzKTsKLQkJfQotCX0KLQotCS8qCi0JICogVmVyaWZ5IHdlIGRvIG5vdCBicmVhayBwcmVyZXFzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU2V0IGNoZWNrUHJlcmVxcygKLQkJQXJyYXlMaXN0IGZlYXR1cmVzLAotCQlBcnJheUxpc3QgcGx1Z2lucywKLQkJQXJyYXlMaXN0IHN0YXR1cykgewotCQkKLQkJSGFzaFNldCByZXN1bHQgPSBuZXcgSGFzaFNldCgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoSUZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCUlJbXBvcnRbXSBpbXBvcnRzID0gZmVhdHVyZS5nZXRJbXBvcnRzKCk7Ci0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgaW1wb3J0cy5sZW5ndGg7IGorKykgewotCQkJCUlJbXBvcnQgaWltcG9ydCA9IGltcG9ydHNbal07Ci0JCQkJLy8gZm9yIGVhY2ggaW1wb3J0IGRldGVybWluZSBwbHVnaW4gb3IgZmVhdHVyZSwgdmVyc2lvbiwgbWF0Y2gKLQkJCQkvLyB3ZSBuZWVkCi0JCQkJVmVyc2lvbmVkSWRlbnRpZmllciBpaWQgPSBpaW1wb3J0LmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCQlTdHJpbmcgaWQgPSBpaWQuZ2V0SWRlbnRpZmllcigpOwotCQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIHZlcnNpb24gPSBpaWQuZ2V0VmVyc2lvbigpOwotCQkJCWJvb2xlYW4gZmVhdHVyZVByZXJlcSA9Ci0JCQkJCWlpbXBvcnQuZ2V0S2luZCgpID09IElJbXBvcnQuS0lORF9GRUFUVVJFOwotCQkJCWJvb2xlYW4gaWdub3JlVmVyc2lvbiA9Ci0JCQkJCXZlcnNpb24uZ2V0TWFqb3JDb21wb25lbnQoKSA9PSAwCi0JCQkJCQkmJiB2ZXJzaW9uLmdldE1pbm9yQ29tcG9uZW50KCkgPT0gMAotCQkJCQkJJiYgdmVyc2lvbi5nZXRTZXJ2aWNlQ29tcG9uZW50KCkgPT0gMDsKLQkJCQlpbnQgcnVsZSA9IGlpbXBvcnQuZ2V0UnVsZSgpOwotCQkJCWlmIChydWxlID09IElVcGRhdGVDb25zdGFudHMuUlVMRV9OT05FKQotCQkJCQlydWxlID0gSVVwZGF0ZUNvbnN0YW50cy5SVUxFX0NPTVBBVElCTEU7Ci0KLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0KLQkJCQlBcnJheUxpc3QgY2FuZGlkYXRlczsKLQotCQkJCWlmIChmZWF0dXJlUHJlcmVxKQotCQkJCQljYW5kaWRhdGVzID0gZmVhdHVyZXM7Ci0JCQkJZWxzZQotCQkJCQljYW5kaWRhdGVzID0gcGx1Z2luczsKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IGNhbmRpZGF0ZXMuc2l6ZSgpOyBrKyspIHsKLQkJCQkJVmVyc2lvbmVkSWRlbnRpZmllciBjaWQ7Ci0JCQkJCWlmIChmZWF0dXJlUHJlcmVxKSB7Ci0JCQkJCQkvLyB0aGUgY2FuZGlkYXRlIGlzIGEgZmVhdHVyZQotCQkJCQkJSUZlYXR1cmUgY2FuZGlkYXRlID0gKElGZWF0dXJlKSBjYW5kaWRhdGVzLmdldChrKTsKLQkJCQkJCS8vIHNraXAgc2VsZgotCQkJCQkJaWYgKGZlYXR1cmUuZXF1YWxzKGNhbmRpZGF0ZSkpCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQljaWQgPSBjYW5kaWRhdGUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gdGhlIGNhbmRpZGF0ZSBpcyBhIHBsdWctaW4KLQkJCQkJCUlQbHVnaW5FbnRyeSBwbHVnaW4gPSAoSVBsdWdpbkVudHJ5KSBjYW5kaWRhdGVzLmdldChrKTsKLQkJCQkJCWNpZCA9IHBsdWdpbi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQkJCX0KLQkJCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgY3ZlcnNpb24gPSBjaWQuZ2V0VmVyc2lvbigpOwotCQkJCQlpZiAoaWQuZXF1YWxzKGNpZC5nZXRJZGVudGlmaWVyKCkpKSB7Ci0JCQkJCQkvLyBoYXZlIGEgY2FuZGlkYXRlCi0JCQkJCQlpZiAoaWdub3JlVmVyc2lvbikKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQllbHNlIGlmICgKLQkJCQkJCQlydWxlID09IElVcGRhdGVDb25zdGFudHMuUlVMRV9QRVJGRUNUCi0JCQkJCQkJCSYmIGN2ZXJzaW9uLmlzUGVyZmVjdCh2ZXJzaW9uKSkKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQllbHNlIGlmICgKLQkJCQkJCQlydWxlID09IElVcGRhdGVDb25zdGFudHMuUlVMRV9FUVVJVkFMRU5UCi0JCQkJCQkJCSYmIGN2ZXJzaW9uLmlzRXF1aXZhbGVudFRvKHZlcnNpb24pKQotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCWVsc2UgaWYgKAotCQkJCQkJCXJ1bGUgPT0gSVVwZGF0ZUNvbnN0YW50cy5SVUxFX0NPTVBBVElCTEUKLQkJCQkJCQkJJiYgY3ZlcnNpb24uaXNDb21wYXRpYmxlV2l0aCh2ZXJzaW9uKSkKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQllbHNlIGlmICgKLQkJCQkJCQlydWxlID09IElVcGRhdGVDb25zdGFudHMuUlVMRV9HUkVBVEVSX09SX0VRVUFMCi0JCQkJCQkJCSYmIGN2ZXJzaW9uLmlzR3JlYXRlck9yRXF1YWxUbyh2ZXJzaW9uKSkKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJaWYgKGZvdW5kKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCQotCQkJCS8vIHBlcmhhcHMgdGhlIGJ1bmRsZSB0aGF0IHdlIGFyZSBsb29raW5nIGZvciB3YXMgaW5zdGFsbGVkCi0JCQkJLy8gYnV0IGlzbid0IGEgcGFydCBvZiBhIGZlYXR1cmUKLQkJCQlpZiAoIWZvdW5kICYmICFmZWF0dXJlUHJlcmVxKQotCQkJCQlmb3VuZCA9IGlzSW5zdGFsbGVkKGlpZCwgcnVsZSwgaWdub3JlVmVyc2lvbik7Ci0KLQkJCQlpZiAoIWZvdW5kKSB7Ci0JCQkJCS8vIHJlcG9ydCBzdGF0dXMKLQkJCQkJU3RyaW5nIHRhcmdldCA9Ci0JCQkJCQlmZWF0dXJlUHJlcmVxCi0JCQkJCQkJPyBNZXNzYWdlcy5BY3Rpdml0eUNvbnN0YWludHNfcHJlcmVxX2ZlYXR1cmUKLQkJCQkJCQk6IE1lc3NhZ2VzLkFjdGl2aXR5Q29uc3RhaW50c19wcmVyZXFfcGx1Z2luOwotCQkJCQlpbnQgZXJyb3JDb2RlID0gZmVhdHVyZVByZXJlcQotCQkJCQkJCT8gRmVhdHVyZVN0YXR1cy5DT0RFX1BSRVJFUV9GRUFUVVJFCi0JCQkJCQkJOiBGZWF0dXJlU3RhdHVzLkNPREVfUFJFUkVRX1BMVUdJTjsKLQkJCQkJU3RyaW5nIG1zZyA9Ci0JCQkJCQlOTFMuYmluZChNZXNzYWdlcy5BY3Rpdml0eUNvbnN0cmFpbnRzX3ByZXJlcSwgKG5ldyBTdHJpbmdbXSB7IHRhcmdldCwgaWQgfSkpOwotCi0JCQkJCWlmICghaWdub3JlVmVyc2lvbikgewotCQkJCQkJaWYgKHJ1bGUgPT0gSVVwZGF0ZUNvbnN0YW50cy5SVUxFX1BFUkZFQ1QpCi0JCQkJCQkJbXNnID0KLQkJCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuQWN0aXZpdHlDb25zdHJhaW50c19wcmVyZXFQZXJmZWN0LCAobmV3IFN0cmluZ1tdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbi50b1N0cmluZygpfSkpOwotCQkJCQkJZWxzZSBpZiAocnVsZSA9PSBJVXBkYXRlQ29uc3RhbnRzLlJVTEVfRVFVSVZBTEVOVCkKLQkJCQkJCQltc2cgPQotCQkJCQkJCQlOTFMuYmluZChNZXNzYWdlcy5BY3Rpdml0eUNvbnN0cmFpbnRzX3ByZXJlcUVxdWl2YWxlbnQsIChuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLnRvU3RyaW5nKCl9KSk7Ci0JCQkJCQllbHNlIGlmIChydWxlID09IElVcGRhdGVDb25zdGFudHMuUlVMRV9DT01QQVRJQkxFKQotCQkJCQkJCW1zZyA9Ci0JCQkJCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLkFjdGl2aXR5Q29uc3RyYWludHNfcHJlcmVxQ29tcGF0aWJsZSwgKG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24udG9TdHJpbmcoKX0pKTsKLQkJCQkJCWVsc2UgaWYgKHJ1bGUgPT0gSVVwZGF0ZUNvbnN0YW50cy5SVUxFX0dSRUFURVJfT1JfRVFVQUwpCi0JCQkJCQkJbXNnID0KLQkJCQkJCQkJTkxTLmJpbmQoTWVzc2FnZXMuQWN0aXZpdHlDb25zdHJhaW50c19wcmVyZXFHcmVhdGVyT3JFcXVhbCwgKG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24udG9TdHJpbmcoKX0pKTsKLQkJCQkJfQotCQkJCQlJU3RhdHVzIHMgPSBjcmVhdGVTdGF0dXMoZmVhdHVyZSwgZXJyb3JDb2RlLCBtc2cpOwotCQkJCQlyZXN1bHQuYWRkKG5ldyBJbnRlcm5hbEltcG9ydChpaW1wb3J0KSk7Ci0JCQkJCWlmICghc3RhdHVzLmNvbnRhaW5zKHMpKQotCQkJCQkJc3RhdHVzLmFkZChzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBidW5kbGUgd2l0aCB0aGUgZ2l2ZW4gaWQgYW5kIHZlcnNpb24KLQkgKiBpcyBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5zdGFsbGVkKFZlcnNpb25lZElkZW50aWZpZXIgdmlkLCBpbnQgcnVsZSwgYm9vbGVhbiBpZ25vcmVWZXJzaW9uKSB7Ci0JCUJ1bmRsZUNvbnRleHQgY29udGV4dCA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlQ29udGV4dCgpOwotCQlpZiAoY29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShQbGF0Zm9ybUFkbWluLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChyZWZlcmVuY2UgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJUGxhdGZvcm1BZG1pbiBhZG1pbiA9IChQbGF0Zm9ybUFkbWluKSBjb250ZXh0LmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJdHJ5IHsKLQkJCVN0YXRlIHN0YXRlID0gYWRtaW4uZ2V0U3RhdGUoZmFsc2UpOwotCQkJU3RyaW5nIGlkID0gdmlkLmdldElkZW50aWZpZXIoKTsKLQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIHZlcnNpb24gPSB2aWQuZ2V0VmVyc2lvbigpOwotCQkJQnVuZGxlRGVzY3JpcHRpb25bXSBidW5kbGVzID0gc3RhdGUuZ2V0QnVuZGxlcyhpZCk7Ci0JCQlpZiAoYnVuZGxlcyA9PSBudWxsIHx8IGJ1bmRsZXMubGVuZ3RoID09IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZm9yIChpbnQgaT0wOyBpPGJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBidW5kbGVzW2ldOwotCQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIGN2ZXJzaW9uID0gbmV3IFBsdWdpblZlcnNpb25JZGVudGlmaWVyKGJ1bmRsZS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSk7Ci0JCQkJLy8gaGF2ZSBhIGNhbmRpZGF0ZQotCQkJCWlmIChpZ25vcmVWZXJzaW9uKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlpZiAocnVsZSA9PSBJVXBkYXRlQ29uc3RhbnRzLlJVTEVfUEVSRkVDVCAmJiBjdmVyc2lvbi5pc1BlcmZlY3QodmVyc2lvbikpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UgaWYgKHJ1bGUgPT0gSVVwZGF0ZUNvbnN0YW50cy5SVUxFX0VRVUlWQUxFTlQgJiYgY3ZlcnNpb24uaXNFcXVpdmFsZW50VG8odmVyc2lvbikpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UgaWYgKHJ1bGUgPT0gSVVwZGF0ZUNvbnN0YW50cy5SVUxFX0NPTVBBVElCTEUgJiYgY3ZlcnNpb24uaXNDb21wYXRpYmxlV2l0aCh2ZXJzaW9uKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJZWxzZSBpZiAocnVsZSA9PSBJVXBkYXRlQ29uc3RhbnRzLlJVTEVfR1JFQVRFUl9PUl9FUVVBTCAmJiBjdmVyc2lvbi5pc0dyZWF0ZXJPckVxdWFsVG8odmVyc2lvbikpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGZpbmFsbHkgewotCQkJY29udGV4dC51bmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJfQotCX0KLQotCS8qCi0JICogVmVyaWZ5IHdlIGVuZCB1cCB3aXRoIHZhbGlkIG5lc3RlZCBmZWF0dXJlcyBhZnRlciByZXZlcnQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrUmV2ZXJ0Q29uc3RyYWludHMoCi0JCUFycmF5TGlzdCBmZWF0dXJlcywKLQkJQXJyYXlMaXN0IHN0YXR1cykgewotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoSUZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCXRyeSB7Ci0JCQkJY29tcHV0ZUZlYXR1cmVTdWJ0cmVlKAotCQkJCQlmZWF0dXJlLAotCQkJCQludWxsLAotCQkJCQludWxsLAotCQkJCQlmYWxzZSAvKiBkbyBub3QgdG9sZXJhdGUgbWlzc2luZyBjaGlsZHJlbiAqLywKLQkJCQkJbnVsbCwKLQkJCQkJbnVsbAotCQkJCSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlzdGF0dXMuYWRkKGUuZ2V0U3RhdHVzKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBWZXJpZnkgdGhhdCBhIHBhcmVudCBvZiBhbiBvcHRpb25hbCBjaGlsZCBpcyBjb25maWd1cmVkIGJlZm9yZSB3ZSBhbGxvdwotCSAqIHRoZSBjaGlsZCB0byBiZSBjb25maWd1cmVkIGFzIHdlbGwKLQkgKi8KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tPcHRpb25hbENoaWxkQ29uZmlndXJpbmcoCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUFycmF5TGlzdCBzdGF0dXMpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyA9IGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQlJQ29uZmlndXJlZFNpdGVbXSBjc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0KLQkJYm9vbGVhbiBpbmNsdWRlZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gY3NpdGVzW2ldOwotCQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gY3JlZnMgPQotCQkJCWNzaXRlLmdldFNpdGUoKS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjcmVmcy5sZW5ndGg7IGorKykgewotCQkJCUlGZWF0dXJlUmVmZXJlbmNlIGNyZWYgPSBjcmVmc1tqXTsKLQkJCQlJRmVhdHVyZSBjZmVhdHVyZSA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJY2ZlYXR1cmUgPSBjcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vRklYTUU6IGNhbm5vdCBhc2sgJ2lzT3B0aW9uYWwnIGhlcmUKLQkJCQkJLy8gSWdub3JlIG1pc3Npbmcgb3B0aW9uYWwgZmVhdHVyZS4KLQkJCQkJLyoKLQkJCQkJICogaWYgKGNyZWYuaXNPcHRpb25hbCgpKSBjb250aW51ZTsKLQkJCQkJICovCi0JCQkJCXRocm93IGU7Ci0JCQkJfQotCQkJCWlmIChpc1BhcmVudChjZmVhdHVyZSwgZmVhdHVyZSwgdHJ1ZSkpIHsKLQkJCQkJLy8gSW5jbHVkZWQgaW4gYXQgbGVhc3Qgb25lIGZlYXR1cmUgYXMgb3B0aW9uYWwKLQkJCQkJaW5jbHVkZWQgPSB0cnVlOwotCQkJCQlpZiAoY3NpdGUuaXNDb25maWd1cmVkKGNmZWF0dXJlKSkgewotCQkJCQkJLy8gQXQgbGVhc3Qgb25lIGZlYXR1cmUgcGFyZW50Ci0JCQkJCQkvLyBpcyBlbmFibGVkIC0gaXQgaXMgT0sgdG8KLQkJCQkJCS8vIGNvbmZpZ3VyZSBvcHRpb25hbCBjaGlsZC4KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoaW5jbHVkZWQpIHsKLQkJCS8vIGZlYXR1cmUgaXMgaW5jbHVkZWQgYXMgb3B0aW9uYWwgYnV0Ci0JCQkvLyBubyBwYXJlbnQgaXMgY3VycmVudGx5IGNvbmZpZ3VyZWQuCi0JCQlTdHJpbmcgbXNnID0gTWVzc2FnZXMuQWN0aXZpdHlDb25zdHJhaW50c19vcHRpb25hbENoaWxkOwotCQkJc3RhdHVzLmFkZChjcmVhdGVTdGF0dXMoZmVhdHVyZSwgRmVhdHVyZVN0YXR1cy5DT0RFX09QVElPTkFMX0NISUxELCBtc2cpKTsKLQkJfSBlbHNlIHsKLQkJCS8vZmVhdHVyZSBpcyByb290IC0gY2FuIGJlIGNvbmZpZ3VyZWQKLQkJfQotCX0KLS8vCi0vLwkvKioKLS8vCSAqIENoZWNrcyBpZiB0aGUgY29uZmlndXJhdGlvbiBpcyBsb2NrZWQgYnkgb3RoZXIgaW5zdGFuY2VzCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSBzdGF0dXMKLS8vCSAqLwotLy8JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0NvbmZpZ3VyYXRpb25Mb2NrKEFycmF5TGlzdCBzdGF0dXMpIHsKLS8vCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIGNvbmZpZyA9Ci0vLwkJCUJvb3RMb2FkZXIuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOwotLy8JCVVSTCBjb25maWdVUkwgPSBjb25maWcuZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCk7Ci0vLwkJaWYgKCEiZmlsZSIuZXF1YWxzKGNvbmZpZ1VSTC5nZXRQcm90b2NvbCgpKSkgewotLy8JCQlzdGF0dXMuYWRkKAotLy8JCQkJY3JlYXRlU3RhdHVzKAotLy8JCQkJCW51bGwsCi0vLwkJCQkJIkNvbmZpZ3VyYXRpb24gbG9jYXRpb24gaXMgbm90IHdyaXRhYmxlOiIgKyBjb25maWdVUkwpKTsKLS8vCQkJcmV0dXJuOwotLy8JCX0KLS8vCQlTdHJpbmcgbG9jYXRpb25TdHJpbmcgPSBjb25maWdVUkwuZ2V0RmlsZSgpOwotLy8JCUZpbGUgY29uZmlnRGlyID0gbmV3IEZpbGUobG9jYXRpb25TdHJpbmcpOwotLy8JCWlmICghY29uZmlnRGlyLmlzRGlyZWN0b3J5KCkpCi0vLwkJCWNvbmZpZ0RpciA9IGNvbmZpZ0Rpci5nZXRQYXJlbnRGaWxlKCk7Ci0vLwkJaWYgKCFjb25maWdEaXIuZXhpc3RzKCkpIHsKLS8vCQkJc3RhdHVzLmFkZCgKLS8vCQkJCWNyZWF0ZVN0YXR1cyhudWxsLCAiQ29uZmlndXJhdGlvbiBsb2NhdGlvbiBkb2VzIG5vdCBleGlzdCIpKTsKLS8vCQkJcmV0dXJuOwotLy8JCX0KLS8vCQlGaWxlIGxvY2tzRGlyID0gbmV3IEZpbGUoY29uZmlnRGlyLCAibG9ja3MiKTsKLS8vCQkvLyBjaGVjayBhbGwgdGhlIHBvc3NpYmxlIGxvY2sgZmlsZXMKLS8vCQlGaWxlW10gbG9ja0ZpbGVzID0gbG9ja3NEaXIubGlzdEZpbGVzKCk7Ci0vLwkJRmlsZSBjb25maWdMb2NrID0gQm9vdExvYWRlci5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCkuZ2V0TG9ja0ZpbGUoKTsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2tGaWxlcy5sZW5ndGg7IGkrKykgewotLy8JCQlpZiAobG9ja0ZpbGVzW2ldLmVxdWFscyhjb25maWdMb2NrKSkKLS8vCQkJCWNvbnRpbnVlOwotLy8JCQl0cnkgewotLy8JCQkJUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShsb2NrRmlsZXNbaV0sICJydyIpOwotLy8JCQkJRmlsZUNoYW5uZWwgY2hhbm5lbCA9IHJhZi5nZXRDaGFubmVsKCk7Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oY2hhbm5lbC5pc09wZW4oKSk7Ci0vLwkJCQlGaWxlTG9jayBsb2NrID0gY2hhbm5lbC50cnlMb2NrKCk7Ci0vLwkJCQlpZiAobG9jayA9PSBudWxsKXsKLS8vCQkJCQkvLyB0aGVyZSBpcyBhbm90aGVyIGVjbGlwc2UgaW5zdGFuY2UgcnVubmluZwotLy8JCQkJCXJhZi5jbG9zZSgpOwotLy8JCQkJCXN0YXR1cy5hZGQoCi0vLwkJCQkJCWNyZWF0ZVN0YXR1cygKLS8vCQkJCQkJCW51bGwsCi0vLwkJCQkJCQkiQW5vdGhlciBpbnN0YW5jZSBpcyBydW5uaW5nLCBwbGVhc2UgY2xvc2UgaXQgYmVmb3JlIHBlcmZvcm1pbmcgYW55IGNvbmZpZ3VyYXRpb24gb3BlcmF0aW9ucyIpKTsKLS8vCQkJCQlyZXR1cm47Ci0vLwkJCQl9Ci0vLwotLy8JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8JCQkJc3RhdHVzLmFkZChjcmVhdGVTdGF0dXMobnVsbCwgIkZhaWxlZCB0byBjcmVhdGUgbG9jazoiK2xvY2tGaWxlc1tpXSkpOwotLy8JCQkJcmV0dXJuOwotLy8JCQl9IAotLy8JCX0KLS8vCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNQYXJlbnQoCi0JCUlGZWF0dXJlIGNhbmRpZGF0ZSwKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJYm9vbGVhbiBvcHRpb25hbE9ubHkpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPQotCQkJY2FuZGlkYXRlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlIGNoaWxkID0gcmVmc1tpXTsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgZnZpZCA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJVmVyc2lvbmVkSWRlbnRpZmllciBjdmlkID0gY2hpbGQuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCi0JCQlpZiAoZnZpZC5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKGN2aWQuZ2V0SWRlbnRpZmllcigpKSA9PSBmYWxzZSkKLQkJCQljb250aW51ZTsKLQkJCS8vIHNhbWUgSUQKLQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIGZ2ZXJzaW9uID0gZnZpZC5nZXRWZXJzaW9uKCk7Ci0JCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciBjdmVyc2lvbiA9IGN2aWQuZ2V0VmVyc2lvbigpOwotCi0JCQlpZiAoZnZlcnNpb24uZXF1YWxzKGN2ZXJzaW9uKSkgewotCQkJCS8vIGluY2x1ZGVkIGFuZCBtYXRjaGVkOyByZXR1cm4gdHJ1ZSBpZiBvcHRpb25hbGl0eSBpcyBub3QKLQkJCQkvLyBpbXBvcnRhbnQgb3IgaXQgaXMgYW5kIHRoZSBpbmNsdXNpb24gaXMgb3B0aW9uYWwKLQkJCQlyZXR1cm4gb3B0aW9uYWxPbmx5ID09IGZhbHNlIHx8IGNoaWxkLmlzT3B0aW9uYWwoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0vLwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrVGltZWxpbmUoCi0vLwkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywKLS8vCQlBcnJheUxpc3Qgc3RhdHVzKSB7Ci0vLwkJdHJ5IHsKLS8vCQkJSUxvY2FsU2l0ZSBsc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotLy8JCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY2NvbmZpZyA9IGxzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0vLwkJCWlmIChjY29uZmlnLmdldFRpbWVsaW5lKCkgIT0gY29uZmlnLmdldFRpbWVsaW5lKCkpIHsKLS8vCQkJCS8vIE5vdCB0aGUgc2FtZSB0aW1lbGluZSAtIGNhbm5vdCByZXZlcnQKLS8vCQkJCVN0cmluZyBtc2cgPQotLy8JCQkJCVVwZGF0ZVV0aWxzLmdldEZvcm1hdHRlZE1lc3NhZ2UoCi0vLwkJCQkJCUtFWV9XUk9OR19USU1FTElORSwKLS8vCQkJCQkJY29uZmlnLmdldExhYmVsKCkpOwotLy8JCQkJc3RhdHVzLmFkZChjcmVhdGVTdGF0dXMobnVsbCwgRmVhdHVyZVN0YXR1cy5DT0RFX09USEVSLCBtc2cpKTsKLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfQotLy8JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotLy8JCQlzdGF0dXMuYWRkKGUuZ2V0U3RhdHVzKCkpOwotLy8JCX0KLS8vCQlyZXR1cm4gdHJ1ZTsKLS8vCX0KLQotCXByaXZhdGUgc3RhdGljIElTdGF0dXMgY3JlYXRlTXVsdGlTdGF0dXMoCi0JCVN0cmluZyBtZXNzYWdlLAotCQlBcnJheUxpc3QgY2hpbGRyZW4sCi0JCWludCBjb2RlKSB7Ci0JCUlTdGF0dXNbXSBjYXJyYXkgPQotCQkJKElTdGF0dXNbXSkgY2hpbGRyZW4udG9BcnJheShuZXcgSVN0YXR1c1tjaGlsZHJlbi5zaXplKCldKTsKLQkJcmV0dXJuIG5ldyBNdWx0aVN0YXR1cygKLQkJCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQljb2RlLAotCQkJY2FycmF5LAotCQkJbWVzc2FnZSwKLQkJCW51bGwpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKElGZWF0dXJlIGZlYXR1cmUsIGludCBlcnJvckNvZGUsIFN0cmluZyBtZXNzYWdlKSB7Ci0KLQkJU3RyaW5nIGZ1bGxNZXNzYWdlOwotCQlpZiAoZmVhdHVyZSA9PSBudWxsKQotCQkJZnVsbE1lc3NhZ2UgPSBtZXNzYWdlOwotCQllbHNlIHsKLQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIHZlcnNpb24gPQotCQkJCWZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKTsKLQkJCWZ1bGxNZXNzYWdlID0KLQkJCQlOTFMuYmluZChNZXNzYWdlcy5BY3Rpdml0eUNvbnN0cmFpbnRzX2NoaWxkTWVzc2FnZSwgKG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgZmVhdHVyZS5nZXRMYWJlbCgpLAotICAgICAgICAgICAgICAgIHZlcnNpb24udG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBtZXNzYWdlIH0pKTsKLQkJfQotCi0JCXJldHVybiBuZXcgRmVhdHVyZVN0YXR1cygKLQkJCWZlYXR1cmUsCi0JCQlJU3RhdHVzLkVSUk9SLAotCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCWVycm9yQ29kZSwKLQkJCWZ1bGxNZXNzYWdlLAotCQkJbnVsbCk7Ci0JfQotCi0JLy8JcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBjcmVhdGVSZXBvcnRTdGF0dXMoQXJyYXlMaXN0IGJlZm9yZVN0YXR1cywKLQkvLyBBcnJheUxpc3Qgc3RhdHVzKSB7Ci0JLy8JCS8vIHJlcG9ydCBzdGF0dXMKLQkvLwkJaWYgKHN0YXR1cy5zaXplKCkgPiAwKSB7Ci0JLy8JCQlpZiAoYmVmb3JlU3RhdHVzLnNpemUoKSA+IDApCi0JLy8JCQkJcmV0dXJuIGNyZWF0ZU11bHRpU3RhdHVzKEtFWV9ST09UX01FU1NBR0VfSU5JVCwKLQkvLyBiZWZvcmVTdGF0dXMsSVN0YXR1cy5FUlJPUik7Ci0JLy8JCQllbHNlCi0JLy8JCQkJcmV0dXJuIGNyZWF0ZU11bHRpU3RhdHVzKEtFWV9ST09UX01FU1NBR0UsIHN0YXR1cyxJU3RhdHVzLkVSUk9SKTsKLQkvLwkJfQotCS8vCQlyZXR1cm4gbnVsbDsKLQkvLwl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZUNvbWJpbmVkUmVwb3J0U3RhdHVzKAotCQlBcnJheUxpc3QgYmVmb3JlU3RhdHVzLAotCQlBcnJheUxpc3Qgc3RhdHVzKSB7Ci0JCWlmIChiZWZvcmVTdGF0dXMuc2l6ZSgpID09IDApIHsgLy8gZ29vZCBpbml0aWFsIGNvbmZpZwotCQkJaWYgKHN0YXR1cy5zaXplKCkgPT0gMCkgewotCQkJCXJldHVybiBudWxsOyAvLyBhbGwgZmluZQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gY3JlYXRlTXVsdGlTdGF0dXMoTWVzc2FnZXMuQWN0aXZpdHlDb25zdHJhaW50c19yb290TWVzc2FnZSwKLQkJCQkJc3RhdHVzLAotCQkJCQlJU3RhdHVzLkVSUk9SKTsKLQkJCQkvLyBlcnJvciBhZnRlciBvcGVyYXRpb24KLQkJCX0KLQkJfSBlbHNlIHsgLy8gYmVmb3JlU3RhdHVzLnNpemUoKSA+IDAgOiBpbml0aWFsIGNvbmZpZyBlcnJvcnMKLQkJCWlmIChzdGF0dXMuc2l6ZSgpID09IDApIHsKLQkJCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3JzIHdpbGwgYmUgZml4ZWQKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGlzQmV0dGVyU3RhdHVzKGJlZm9yZVN0YXR1cywgc3RhdHVzKSkgewotCQkJCQlyZXR1cm4gY3JlYXRlTXVsdGlTdGF0dXMoCi0JCQkJCQlNZXNzYWdlcy5BY3Rpdml0eUNvbnN0cmFpbnRzX3dhcm5pbmcsCi0JCQkJCQliZWZvcmVTdGF0dXMsCi0JCQkJCQlJU3RhdHVzLldBUk5JTkcpOwotCQkJCQkvLyBlcnJvcnMgbWF5IGJlIGZpeGVkCi0JCQkJfSBlbHNlIHsKLQkJCQkJQXJyYXlMaXN0IGNvbWJpbmVkID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQljb21iaW5lZC5hZGQoCi0JCQkJCQljcmVhdGVNdWx0aVN0YXR1cygKLQkJCQkJCQlNZXNzYWdlcy5BY3Rpdml0eUNvbnN0cmFpbnRzX2JlZm9yZU1lc3NhZ2UsCi0JCQkJCQkJYmVmb3JlU3RhdHVzLAotCQkJCQkJCUlTdGF0dXMuRVJST1IpKTsKLQkJCQkJY29tYmluZWQuYWRkKAotCQkJCQkJY3JlYXRlTXVsdGlTdGF0dXMoCi0JCQkJCQkJTWVzc2FnZXMuQWN0aXZpdHlDb25zdHJhaW50c19hZnRlck1lc3NhZ2UsCi0JCQkJCQkJc3RhdHVzLAotCQkJCQkJCUlTdGF0dXMuRVJST1IpKTsKLQkJCQkJcmV0dXJuIGNyZWF0ZU11bHRpU3RhdHVzKAotCQkJCQkJTWVzc2FnZXMuQWN0aXZpdHlDb25zdHJhaW50c19yb290TWVzc2FnZUluaXRpYWwsCi0JCQkJCQljb21iaW5lZCwKLQkJCQkJCUlTdGF0dXMuRVJST1IpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBjcmVhdGVMaXN0KFN0cmluZyBjb21tYVNlcGFyYXRlZExpc3QpIHsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChjb21tYVNlcGFyYXRlZExpc3QgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHQgPQotCQkJCW5ldyBTdHJpbmdUb2tlbml6ZXIoY29tbWFTZXBhcmF0ZWRMaXN0LnRyaW0oKSwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHQuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIHRva2VuID0gdC5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKCF0b2tlbi5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQkJCWxpc3QuYWRkKHRva2VuKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgc3RhdHVzIGlzIGEgc3Vic2V0IG9mIGJlZm9yZVN0YXR1cwotCSAqIAotCSAqIEBwYXJhbSBiZWZvcmVTdGF0dXMKLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNCZXR0ZXJTdGF0dXMoCi0JCUFycmF5TGlzdCBiZWZvcmVTdGF0dXMsCi0JCUFycmF5TGlzdCBzdGF0dXMpIHsKLQkJLy8gaWYgbm8gc3RhdHVzIGF0IGFsbCwgdGhlbiBpdCdzIGEgc3Vic2V0Ci0JCWlmIChzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJLy8gdGhlcmUgaXMgc29tZSBzdGF0dXMsIHNvIGlmIHRoZXJlIGlzIG5vIGluaXRpYWwgc3RhdHVzLCB0aGVuIGl0J3MKLQkJLy8gbm90IGEgc3Vic2V0Ci0JCWlmIChiZWZvcmVTdGF0dXMgPT0gbnVsbCB8fCBiZWZvcmVTdGF0dXMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIHF1aWNrIGNoZWNrCi0JCWlmIChiZWZvcmVTdGF0dXMuc2l6ZSgpIDwgc3RhdHVzLnNpemUoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyBjaGVjayBpZiBhbGwgdGhlIHN0YXR1cyBlbGVtZW50cyBhcHBlYXIgaW4gdGhlIG9yaWdpbmFsIHN0YXR1cwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXR1cy5zaXplKCk7IGkrKykgewotCQkJSVN0YXR1cyBzID0gKElTdGF0dXMpIHN0YXR1cy5nZXQoaSk7Ci0JCQkvLyBpZiB0aGlzIGlzIG5vdCBhIGZlYXR1cmUgc3RhdHVzLCBzb21ldGhpbmcgaXMgd3JvbmcsIHNvIHJldHVybgotCQkJLy8gZmFsc2UKLQkJCWlmICghKHMgaW5zdGFuY2VvZiBGZWF0dXJlU3RhdHVzKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlGZWF0dXJlU3RhdHVzIGZzID0gKEZlYXR1cmVTdGF0dXMpIHM7Ci0JCQkvLyBjaGVjayBhZ2FpbnN0IGFsbCBzdGF0dXMgZWxlbWVudHMKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGogPSAwOyAhZm91bmQgJiYgaiA8IGJlZm9yZVN0YXR1cy5zaXplKCk7IGorKykgewotCQkJCWlmIChmcy5lcXVhbHMoYmVmb3JlU3RhdHVzLmdldChqKSkpCi0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCX0KLQkJCWlmICghZm91bmQpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgY2xhc3MgUmVxdWlyZWRGZWF0dXJlc1Jlc3VsdCB7Ci0JCQotCQlwcml2YXRlIElTdGF0dXMgc3RhdHVzOwotCQlwcml2YXRlIFNldCByZXF1aXJlZEZlYXR1cmVzOwotCQkKLQkJcHVibGljIFNldCBnZXRSZXF1aXJlZEZlYXR1cmVzKCkgewotCQkJcmV0dXJuIHJlcXVpcmVkRmVhdHVyZXM7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0UmVxdWlyZWRGZWF0dXJlcyhTZXQgcmVxdWlyZWRGZWF0dXJlcykgewotCQkJdGhpcy5yZXF1aXJlZEZlYXR1cmVzID0gcmVxdWlyZWRGZWF0dXJlczsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRSZXF1aXJlZEZlYXR1cmVzKFNldCByZXF1aXJlZEZlYXR1cmVzKSB7Ci0JCQlpZiAocmVxdWlyZWRGZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQkJcmVxdWlyZWRGZWF0dXJlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQl9Ci0JCQl0aGlzLnJlcXVpcmVkRmVhdHVyZXMuYWRkQWxsKHJlcXVpcmVkRmVhdHVyZXMpOwotCQl9Ci0JCXB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0U3RhdHVzKElTdGF0dXMgc3RhdHVzKSB7Ci0JCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKLQkJfQotCQkKLQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW50ZXJuYWxJbXBvcnQgewotCQkKLQkJcHJpdmF0ZSBJSW1wb3J0IGlpbXBvcnQ7Ci0KLQkJcHVibGljIEludGVybmFsSW1wb3J0KElJbXBvcnQgaWltcG9ydCkgewotCQkJdGhpcy5paW1wb3J0ID0gaWltcG9ydDsKLQkJfQotCQkKLQkJcHVibGljIElJbXBvcnQgZ2V0SW1wb3J0KCkgewotCQkJcmV0dXJuIGlpbXBvcnQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRJbXBvcnQoSUltcG9ydCBpaW1wb3J0KSB7Ci0JCQl0aGlzLmlpbXBvcnQgPSBpaW1wb3J0OwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotCi0JCQlpZiAoICggb2JqZWN0ID09IG51bGwpIHx8ICEob2JqZWN0IGluc3RhbmNlb2YgSW50ZXJuYWxJbXBvcnQpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQkJaWYgKCBvYmplY3QgPT0gdGhpcykKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQotCQkJcmV0dXJuIGlpbXBvcnQuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyggKChJbnRlcm5hbEltcG9ydClvYmplY3QpLmdldEltcG9ydCgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkgJiYgKGdldEltcG9ydCgpLmdldFJ1bGUoKSA9PSAoKEludGVybmFsSW1wb3J0KW9iamVjdCkuZ2V0SW1wb3J0KCkuZ2V0UnVsZSgpKTsKLQotCQl9Ci0KLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCXJldHVybiBpaW1wb3J0LmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5oYXNoQ29kZSgpICogaWltcG9ydC5nZXRSdWxlKCk7Ci0JCX0KLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1BhdGNoQ2xlYW5lci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9QYXRjaENsZWFuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmNDE5Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1BhdGNoQ2xlYW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi0vKioKLSAqIFRoaXMgdXRpbGl0eSBjbGFzcyBhdHRhY2hlcyBhcyBhIGxpc3RlbmVkIHRvIHRoZSBwcm92aWRlZAotICogY29uZmlndXJlZCBzaXRlLCBhbmQgZm9yIGV2ZXJ5IHVuY29uZmlndXJlZCBmZWF0dXJlIAotICogaXQgdGVzdHMgaWYgaXQgaXMgYSBwYXRjaCBhbmQgY2xlYW5zIHVwIGl0cyBiYWNrdXAgY29uZmlndXJhdGlvbi4KLSAqLwotCi1wdWJsaWMgY2xhc3MgUGF0Y2hDbGVhbmVyIHsKLQlwcml2YXRlIElDb25maWd1cmVkU2l0ZSBjc2l0ZTsKLQlwcml2YXRlIFNpdGVMaXN0ZW5lciBsaXN0ZW5lcjsKLQljbGFzcyBTaXRlTGlzdGVuZXIgaW1wbGVtZW50cyBJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBmZWF0dXJlSW5zdGFsbGVkKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBmZWF0dXJlUmVtb3ZlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCQljbGVhblNhdmVkQ29uZmlncyhmZWF0dXJlKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBmZWF0dXJlQ29uZmlndXJlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZmVhdHVyZVVuY29uZmlndXJlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCQljbGVhblNhdmVkQ29uZmlncyhmZWF0dXJlKTsKLQkJfQotCX0KLQlwdWJsaWMgUGF0Y2hDbGVhbmVyKElDb25maWd1cmVkU2l0ZSBjc2l0ZSwgSUZlYXR1cmUgcm9vdCkgewotCQl0aGlzLmNzaXRlID0gY3NpdGU7Ci0JCWxpc3RlbmVyID0gbmV3IFNpdGVMaXN0ZW5lcigpOwotCQljc2l0ZS5hZGRDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJY3NpdGUucmVtb3ZlQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQlwcml2YXRlIHZvaWQgY2xlYW5TYXZlZENvbmZpZ3MoSUZlYXR1cmUgZmVhdHVyZSkgewotCQlpZiAoZmVhdHVyZS5pc1BhdGNoKCkpIHsKLQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBiYWNrdXBDb25maWcgPSBVcGRhdGVVdGlscy5nZXRCYWNrdXBDb25maWd1cmF0aW9uRm9yKGZlYXR1cmUpOwotCQkJaWYgKGJhY2t1cENvbmZpZyE9bnVsbCkgewotCQkJCS8vIGNsZWFuIGl0Ci0JCQkJcmVtb3ZlKGJhY2t1cENvbmZpZyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIHJlbW92ZShJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRyeSB7Ci0JCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQkJbG9jYWxTaXRlLnJlbW92ZUZyb21QcmVzZXJ2ZWRDb25maWd1cmF0aW9ucyhjb25maWcpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvUmVwbGFjZUZlYXR1cmVWZXJzaW9uT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1JlcGxhY2VGZWF0dXJlVmVyc2lvbk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDU4NThiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvUmVwbGFjZUZlYXR1cmVWZXJzaW9uT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi0vKioKLSAqIFN3YXBzIGEgZmVhdHVyZS4KLSAqIFJlcGxhY2VGZWF0dXJlVmVyc2lvbk9wZXJhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgUmVwbGFjZUZlYXR1cmVWZXJzaW9uT3BlcmF0aW9uCi0JZXh0ZW5kcyBGZWF0dXJlT3BlcmF0aW9uCi0JaW1wbGVtZW50cyBJQ29uZmlnRmVhdHVyZU9wZXJhdGlvbiB7Ci0KLQlwcml2YXRlIElGZWF0dXJlIGFub3RoZXJGZWF0dXJlOwotCQotCXB1YmxpYyBSZXBsYWNlRmVhdHVyZVZlcnNpb25PcGVyYXRpb24oCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUlGZWF0dXJlIGFub3RoZXJGZWF0dXJlKSB7Ci0JCXN1cGVyKGZlYXR1cmUuZ2V0U2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpLCBmZWF0dXJlKTsKLQkJdGhpcy5hbm90aGVyRmVhdHVyZSA9IGFub3RoZXJGZWF0dXJlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwbSwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPQotCQkJT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQZW5kaW5nUmVwbGFjZVZlcnNpb24oZmVhdHVyZSwgYW5vdGhlckZlYXR1cmUpOwotCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCX0KLQotCQkvLyB1bmNvbmZpZ3VyZSBjdXJyZW50IGZlYXR1cmUgZmlyc3QsIHRoZW4gY29uZmlndXJlIHRoZSBvdGhlciBvbmUKLQkJCi0JCVBhdGNoQ2xlYW5lciBjbGVhbmVyID0gbmV3IFBhdGNoQ2xlYW5lcih0YXJnZXRTaXRlLCBmZWF0dXJlKTsKLQkJdGFyZ2V0U2l0ZS51bmNvbmZpZ3VyZShmZWF0dXJlKTsKLQkJY2xlYW5lci5kaXNwb3NlKCk7Ci0JCQotCQl0YXJnZXRTaXRlLmNvbmZpZ3VyZShhbm90aGVyRmVhdHVyZSk7Ci0vLwkJZW5zdXJlVW5pcXVlKCk7Ci0KLQkJdHJ5IHsKLQkJCS8vIFJlc3RhcnQgbm90IG5lZWRlZAotCQkJYm9vbGVhbiByZXN0YXJ0TmVlZGVkID0gZmFsc2U7Ci0KLQkJCS8vIENoZWNrIGlmIHRoaXMgb3BlcmF0aW9uIGlzIGNhbmNlbGxpbmcgb25lIHRoYXQncyBhbHJlYWR5IHBlbmRpbmcKLQkJCUlPcGVyYXRpb24gcGVuZGluZ09wZXJhdGlvbiA9Ci0JCQkJT3BlcmF0aW9uc01hbmFnZXIuZmluZFBlbmRpbmdPcGVyYXRpb24oZmVhdHVyZSk7Ci0KLQkJCWlmIChwZW5kaW5nT3BlcmF0aW9uIGluc3RhbmNlb2YgSUNvbmZpZ0ZlYXR1cmVPcGVyYXRpb24pIHsKLQkJCQkvLyBubyBuZWVkIHRvIGRvIGVpdGhlciBwZW5kaW5nIGNoYW5nZQotCQkJCU9wZXJhdGlvbnNNYW5hZ2VyLnJlbW92ZVBlbmRpbmdPcGVyYXRpb24ocGVuZGluZ09wZXJhdGlvbik7Ci0JCQl9IGVsc2UgewotCQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmFkZFBlbmRpbmdPcGVyYXRpb24odGhpcyk7Ci0JCQkJcmVzdGFydE5lZWRlZCA9IHRydWU7Ci0JCQl9Ci0JCQkKLQkJCXBlbmRpbmdPcGVyYXRpb24gPQotCQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmZpbmRQZW5kaW5nT3BlcmF0aW9uKGFub3RoZXJGZWF0dXJlKTsKLQkJCQkKLQkJCWlmIChwZW5kaW5nT3BlcmF0aW9uIGluc3RhbmNlb2YgSVVuY29uZmlnRmVhdHVyZU9wZXJhdGlvbikgewotCQkJCS8vIG5vIG5lZWQgdG8gZG8gZWl0aGVyIHBlbmRpbmcgY2hhbmdlCi0JCQkJT3BlcmF0aW9uc01hbmFnZXIucmVtb3ZlUGVuZGluZ09wZXJhdGlvbihwZW5kaW5nT3BlcmF0aW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJT3BlcmF0aW9uc01hbmFnZXIuYWRkUGVuZGluZ09wZXJhdGlvbih0aGlzKTsKLQkJCQlyZXN0YXJ0TmVlZGVkID0gdHJ1ZTsKLQkJCX0KLQkJCQotCQkJbWFya1Byb2Nlc3NlZCgpOwotCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQkJbGlzdGVuZXIuYWZ0ZXJFeGVjdXRlKHRoaXMsIG51bGwpOwotCi0JCQlyZXN0YXJ0TmVlZGVkID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuc2F2ZSgpICYmIHJlc3RhcnROZWVkZWQ7Ci0KLQkJCS8vIG5vdGlmeSB0aGUgbW9kZWwKLQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmZpcmVPYmplY3RDaGFuZ2VkKGZlYXR1cmUsIG51bGwpOwotCi0JCQlyZXR1cm4gcmVzdGFydE5lZWRlZDsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl1bmRvKCk7Ci0JCQlVcGRhdGVVdGlscy5sb2dFeGNlcHRpb24oZSk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGFyZ2V0U2l0ZS51bmNvbmZpZ3VyZShhbm90aGVyRmVhdHVyZSk7Ci0JCXRhcmdldFNpdGUuY29uZmlndXJlKGZlYXR1cmUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9SZXZlcnRDb25maWd1cmF0aW9uT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZTk3MDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9SZXZlcnRDb25maWd1cmF0aW9uT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLXB1YmxpYyBjbGFzcyBSZXZlcnRDb25maWd1cmF0aW9uT3BlcmF0aW9uIGV4dGVuZHMgT3BlcmF0aW9uIGltcGxlbWVudHMgSVJldmVydENvbmZpZ3VyYXRpb25PcGVyYXRpb24gewotCi0JcHJpdmF0ZSBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnOwotCXByaXZhdGUgSVByb2JsZW1IYW5kbGVyIHByb2JsZW1IYW5kbGVyOwotCi0JcHVibGljIFJldmVydENvbmZpZ3VyYXRpb25PcGVyYXRpb24oCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCUlQcm9ibGVtSGFuZGxlciBwcm9ibGVtSGFuZGxlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJdGhpcy5wcm9ibGVtSGFuZGxlciA9IHByb2JsZW1IYW5kbGVyOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklPcGVyYXRpb24jZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCUlTdGF0dXMgc3RhdHVzID0KLQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGVuZGluZ1JldmVydChjb25maWcpOwotCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmdldENvZGUoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCQlsb2NhbFNpdGUucmV2ZXJ0VG8oY29uZmlnLCBtb25pdG9yLCBwcm9ibGVtSGFuZGxlcik7Ci0JCQlsb2NhbFNpdGUuc2F2ZSgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVXRpbHMubG9nRXhjZXB0aW9uKGUpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVG9nZ2xlU2l0ZU9wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Ub2dnbGVTaXRlT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZmNkMjEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Ub2dnbGVTaXRlT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotcHVibGljIGNsYXNzIFRvZ2dsZVNpdGVPcGVyYXRpb24KLQlleHRlbmRzIE9wZXJhdGlvbgotCWltcGxlbWVudHMgSVRvZ2dsZVNpdGVPcGVyYXRpb24gewotCi0JcHJpdmF0ZSBJQ29uZmlndXJlZFNpdGUgc2l0ZTsKLQotCXB1YmxpYyBUb2dnbGVTaXRlT3BlcmF0aW9uKElDb25maWd1cmVkU2l0ZSBzaXRlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc2l0ZSA9IHNpdGU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbiNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoCi0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChzaXRlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWJvb2xlYW4gb2xkVmFsdWUgPSBzaXRlLmlzRW5hYmxlZCgpOwotCQlzaXRlLnNldEVuYWJsZWQoIW9sZFZhbHVlKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZUN1cnJlbnRTdGF0ZSgpOwotCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLQkJCS8vIHJldmVydAotCQkJc2l0ZS5zZXRFbmFibGVkKG9sZFZhbHVlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCWJvb2xlYW4gcmVzdGFydE5lZWRlZCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLnNhdmUoKTsKLQkJCQlPcGVyYXRpb25zTWFuYWdlci5maXJlT2JqZWN0Q2hhbmdlZChzaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gcmVzdGFydE5lZWRlZDsgLy8gd2lsbCByZXN0YXJ0IG9ubHkgaWYgY2hhbmdlcyBjb3VsZCBub3QgYmUgYXBwbGllZCB0byBjdXJyZW50IGNvbmZpZwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9yZXZlcnQKLQkJCQlzaXRlLnNldEVuYWJsZWQob2xkVmFsdWUpOwotCQkJCVVwZGF0ZVV0aWxzLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl0aHJvdyBlOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9VbmNvbmZpZ09wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9VbmNvbmZpZ09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGM4ODA4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVW5jb25maWdPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi0vKioKLSAqIFVuY29uZmlndXJlIGEgZmVhdHVyZS4KLSAqIFVuY29uZmlnT3BlcmF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmNvbmZpZ09wZXJhdGlvbgotCWV4dGVuZHMgRmVhdHVyZU9wZXJhdGlvbgotCWltcGxlbWVudHMgSVVuY29uZmlnRmVhdHVyZU9wZXJhdGlvbiB7Ci0KLQlwdWJsaWMgVW5jb25maWdPcGVyYXRpb24oCi0JCUlDb25maWd1cmVkU2l0ZSBzaXRlLAotCQlJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXN1cGVyKHNpdGUsIGZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwbSwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPQotCQkJT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQZW5kaW5nVW5jb25maWcoZmVhdHVyZSk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0Q29kZSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCX0KLQotCQlQYXRjaENsZWFuZXIgY2xlYW5lciA9IG5ldyBQYXRjaENsZWFuZXIodGFyZ2V0U2l0ZSwgZmVhdHVyZSk7Ci0JCXRhcmdldFNpdGUudW5jb25maWd1cmUoZmVhdHVyZSk7Ci0JCWNsZWFuZXIuZGlzcG9zZSgpOwotCi0JCXRyeSB7Ci0JCQkvLyBSZXN0YXJ0IG5vdCBuZWVkZWQKLQkJCWJvb2xlYW4gcmVzdGFydE5lZWRlZCA9IGZhbHNlOwotCi0JCQkvLyBDaGVjayBpZiB0aGlzIG9wZXJhdGlvbiBpcyBjYW5jZWxsaW5nIG9uZSB0aGF0J3MgYWxyZWFkeSBwZW5kaW5nCi0JCQlJT3BlcmF0aW9uIHBlbmRpbmdPcGVyYXRpb24gPQotCQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmZpbmRQZW5kaW5nT3BlcmF0aW9uKGZlYXR1cmUpOwotCi0JCQlpZiAocGVuZGluZ09wZXJhdGlvbiBpbnN0YW5jZW9mIElDb25maWdGZWF0dXJlT3BlcmF0aW9uKSB7Ci0JCQkJLy8gbm8gbmVlZCB0byBkbyBlaXRoZXIgcGVuZGluZyBjaGFuZ2UKLQkJCQlPcGVyYXRpb25zTWFuYWdlci5yZW1vdmVQZW5kaW5nT3BlcmF0aW9uKHBlbmRpbmdPcGVyYXRpb24pOwotCQkJfSBlbHNlIHsKLQkJCQlPcGVyYXRpb25zTWFuYWdlci5hZGRQZW5kaW5nT3BlcmF0aW9uKHRoaXMpOwotCQkJCXJlc3RhcnROZWVkZWQgPSB0cnVlOwotCQkJfQotCi0JCQltYXJrUHJvY2Vzc2VkKCk7Ci0JCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLQkJCQlsaXN0ZW5lci5hZnRlckV4ZWN1dGUodGhpcywgbnVsbCk7Ci0KLQkJCXJlc3RhcnROZWVkZWQgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5zYXZlKCkgJiYgcmVzdGFydE5lZWRlZDsKLQotCQkJLy8gbm90aWZ5IHRoZSBtb2RlbAotCQkJT3BlcmF0aW9uc01hbmFnZXIuZmlyZU9iamVjdENoYW5nZWQoZmVhdHVyZSwgbnVsbCk7Ci0KLQkJCXJldHVybiByZXN0YXJ0TmVlZGVkOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXVuZG8oKTsKLQkJCVVwZGF0ZVV0aWxzLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0YXJnZXRTaXRlLmNvbmZpZ3VyZShmZWF0dXJlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1VuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZU9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDIyYzYwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5Db25maWd1cmF0b3JVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JT3BlcmF0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSVVuY29uZmlnRmVhdHVyZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5PcGVyYXRpb25zTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIFVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBleHRlbmRzIEZlYXR1cmVPcGVyYXRpb24KLQkJaW1wbGVtZW50cyBJVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIHsKLQotCXB1YmxpYyBVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVPcGVyYXRpb24oSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUsIElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJc3VwZXIodGFyZ2V0U2l0ZSwgZmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHBtLCBJT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQotCQlJVW5jb25maWdGZWF0dXJlT3BlcmF0aW9uIHVuY29uZmlnT3BlcmF0aW9uID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpLmNyZWF0ZVVuY29uZmlnT3BlcmF0aW9uKHRhcmdldFNpdGUsIGZlYXR1cmUpOwotCi0JCS8qYm9vbGVhbiBpc1Jlc3RhcnROZWVkZWQgPSAqL3VuY29uZmlnT3BlcmF0aW9uLmV4ZWN1dGUocG0sIGxpc3RlbmVyKTsKLQkJCi0KLQkJVVJMIHBsYXRmb3JtWE1MID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpOwotCQkKLQkJRmlsZSBmID0gbmV3IEZpbGUocGxhdGZvcm1YTUwuZ2V0RmlsZSgpKTsKLQotCQlmID0gbmV3IEZpbGUoZi5nZXRQYXJlbnRGaWxlKCksICJ0b0JlVW5pbnN0YWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJaWYgKCFmLmV4aXN0cygpKSB7Ci0JCQkJZi5jcmVhdGVOZXdGaWxlKCk7Ci0JCQl9Ci0JCQlGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmKTsKLQkJCVByb3BlcnRpZXMgdG9CZVVuaW5zdGFsbGVkID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCXRvQmVVbmluc3RhbGxlZC5sb2FkKGZpcyk7Ci0JCQl0b0JlVW5pbnN0YWxsZWQucHV0KG5ldyBJbnRlZ2VyKHRvQmVVbmluc3RhbGxlZC5zaXplKCkrMSkudG9TdHJpbmcoKSwgdGFyZ2V0U2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkgKyAiOyIgKyBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJZmlzLmNsb3NlKCk7Ci0JCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpOwotCQkJdG9CZVVuaW5zdGFsbGVkLnN0b3JlKGZvcywgInRvIGJlIHVuaW5zdGFsbGVkIG9uIHN0YXJ0LXVwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvcy5jbG9zZSgpOwotCQkJCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCi0JCX0KLQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1VuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTYxMDhmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuT3BlcmF0aW9uc01hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVzT3BlcmF0aW9uIGV4dGVuZHMKLQkJQmF0Y2hGZWF0dXJlT3BlcmF0aW9uIGltcGxlbWVudHMKLQkJSVVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24gewotCi0JcHVibGljIFVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24oSUNvbmZpZ3VyZWRTaXRlW10gdGFyZ2V0U2l0ZXMsCi0JCQlJRmVhdHVyZVtdIGZlYXR1cmVzKSB7Ci0JCXN1cGVyKHRhcmdldFNpdGVzLCBmZWF0dXJlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIElPcGVyYXRpb24gY3JlYXRlT3BlcmF0aW9uKElDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlLCBJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiAoKE9wZXJhdGlvbkZhY3RvcnkpT3BlcmF0aW9uc01hbmFnZXIuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpKS5jcmVhdGVVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVPcGVyYXRpb24odGFyZ2V0U2l0ZSwgZmVhdHVyZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9VbmNvbmZpZ3VyZUZlYXR1cmVzT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1VuY29uZmlndXJlRmVhdHVyZXNPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg0YzhiOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1VuY29uZmlndXJlRmVhdHVyZXNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLk9wZXJhdGlvbnNNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgVW5jb25maWd1cmVGZWF0dXJlc09wZXJhdGlvbiAKLQlleHRlbmRzIEJhdGNoRmVhdHVyZU9wZXJhdGlvbiBpbXBsZW1lbnRzIElVbmNvbmZpZ3VyZUZlYXR1cmVzT3BlcmF0aW9uIHsKLQotCXB1YmxpYyBVbmNvbmZpZ3VyZUZlYXR1cmVzT3BlcmF0aW9uKElDb25maWd1cmVkU2l0ZVtdIHRhcmdldFNpdGVzLCBJRmVhdHVyZVtdIGZlYXR1cmVzKSB7Ci0JCXN1cGVyKHRhcmdldFNpdGVzLCBmZWF0dXJlcyk7Ci0JfQotCQotCXByb3RlY3RlZCBJT3BlcmF0aW9uIGNyZWF0ZU9wZXJhdGlvbihJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwgSUZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gT3BlcmF0aW9uc01hbmFnZXIuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpLmNyZWF0ZVVuY29uZmlnT3BlcmF0aW9uKHRhcmdldFNpdGUsIGZlYXR1cmUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Vbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Vbmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjg3OWRlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLk9wZXJhdGlvbnNNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgVW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24gZXh0ZW5kcyBCYXRjaEZlYXR1cmVPcGVyYXRpb24gaW1wbGVtZW50cwotCQlJVW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24gewotCi0JcHVibGljIFVuaW5zdGFsbEZlYXR1cmVzT3BlcmF0aW9uKElDb25maWd1cmVkU2l0ZVtdIHRhcmdldFNpdGVzLCBJRmVhdHVyZVtdIGZlYXR1cmVzKSB7Ci0JCXN1cGVyKHRhcmdldFNpdGVzLCBmZWF0dXJlcyk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgSU9wZXJhdGlvbiBjcmVhdGVPcGVyYXRpb24oSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUsIElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcmV0dXJuIE9wZXJhdGlvbnNNYW5hZ2VyLmdldE9wZXJhdGlvbkZhY3RvcnkoKS5jcmVhdGVVbmluc3RhbGxPcGVyYXRpb24odGFyZ2V0U2l0ZSwgZmVhdHVyZSk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVW5pbnN0YWxsT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1VuaW5zdGFsbE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzZiN2E0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVW5pbnN0YWxsT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi0vKioKLSAqIENvbmZpZ3VyZSBhIGZlYXR1cmUuCi0gKiBDb25maWdPcGVyYXRpb24KLSAqLwotcHVibGljIGNsYXNzIFVuaW5zdGFsbE9wZXJhdGlvbiBleHRlbmRzIEZlYXR1cmVPcGVyYXRpb24gaW1wbGVtZW50cyBJVW5pbnN0YWxsRmVhdHVyZU9wZXJhdGlvbnsKLQotCXB1YmxpYyBVbmluc3RhbGxPcGVyYXRpb24oSUNvbmZpZ3VyZWRTaXRlIHNpdGUsIElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJc3VwZXIoc2l0ZSwgZmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0U2l0ZShJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSkgewotCQl0aGlzLnRhcmdldFNpdGUgPSB0YXJnZXRTaXRlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwbSwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlpZiAodGFyZ2V0U2l0ZSA9PSBudWxsKQotCQkJdGFyZ2V0U2l0ZSA9IFVwZGF0ZVV0aWxzLmdldENvbmZpZ1NpdGUoZmVhdHVyZSwgU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSk7Ci0KLQkJLy8gUmVzdGFydCBub3QgbmVlZGVkCi0JCWJvb2xlYW4gcmVzdGFydE5lZWRlZCA9IGZhbHNlOwotCi0JCWlmICh0YXJnZXRTaXRlICE9IG51bGwpIHsKLQkJCS8vIGlmIG5lZWRlZCwgdW5jb25maWd1cmUgdGhlIGZlYXR1cmUgZmlyc3QKLQkJCWlmICh0YXJnZXRTaXRlLmlzQ29uZmlndXJlZChmZWF0dXJlKSkgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQZW5kaW5nVW5jb25maWcoZmVhdHVyZSk7Ci0JCQkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRDb2RlKCkgPT0gSVN0YXR1cy5FUlJPUikKLQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJCQlpZiAodW5jb25maWd1cmUoZmVhdHVyZSwgdGFyZ2V0U2l0ZSkpCi0JCQkJCXJlc3RhcnROZWVkZWQgPSB0cnVlOwotCQkJCWVsc2UKLQkJCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuT3BlcmF0aW9uc01hbmFnZXJfZXJyb3JfdW5pbnN0YWxsLCAobmV3IFN0cmluZ1tdIHsgZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSB9KSksIG51bGwpOwotCQkJfQotCQkJdGFyZ2V0U2l0ZS5yZW1vdmUoZmVhdHVyZSwgcG0pOwotCQl9IGVsc2UgewotCQkJLy8gd2Ugc2hvdWxkIGRvIHNvbWV0aGluZyBoZXJlCi0JCQlTdHJpbmcgbWVzc2FnZSA9Ci0JCQkJTkxTLmJpbmQoTWVzc2FnZXMuT3BlcmF0aW9uc01hbmFnZXJfZXJyb3JfdW5pbnN0YWxsLCAobmV3IFN0cmluZ1tdIHsgZmVhdHVyZS5nZXRMYWJlbCgpIH0pKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0KLQkJCQluZXcgU3RhdHVzKAotCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQlVcGRhdGVVdGlscy5nZXRQbHVnaW5JZCgpLAotCQkJCQlJU3RhdHVzLk9LLAotCQkJCQltZXNzYWdlLAotCQkJCQludWxsKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCX0KLQotCQltYXJrUHJvY2Vzc2VkKCk7Ci0JCWlmIChsaXN0ZW5lciAhPSBudWxsKQotCQkJbGlzdGVuZXIuYWZ0ZXJFeGVjdXRlKHRoaXMsIG51bGwpOwotCi0JCXJlc3RhcnROZWVkZWQgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5zYXZlKCkgJiYgcmVzdGFydE5lZWRlZDsKLQotCQkvLyBub3RpZnkgdGhlIG1vZGVsCi0JCU9wZXJhdGlvbnNNYW5hZ2VyLmZpcmVPYmplY3RDaGFuZ2VkKGZlYXR1cmUsIFVOSU5TVEFMTCk7Ci0JCQotCQlyZXR1cm4gcmVzdGFydE5lZWRlZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVXBkYXRlVXRpbHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVXBkYXRlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkxNGEwYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1VwZGF0ZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEphbWVzIEQgTWlsZXMgKElCTSBDb3JwLikgLSBidWcgMTkxMzY4LCBQb2xpY3kgVVJMIGRvZXNuJ3Qgc3VwcG9ydCBVVEYtOCBjaGFyYWN0ZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VUkxFbmNvZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWFyY2guKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guKjsKLQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3IgcGVyZm9ybWluZyB1cGRhdGUgcmVsYXRlZCB0YXNrcywgcXVlcmllcywgZXRjLgotICogQWxsIHRoZSBtZXRob2RzIGFyZSBzdGF0aWMgYW5kIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGEgc2luZ2xldG9uLgotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlVXRpbHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfVVBEQVRFX1BPTElDWV9VUkwgPSAidXBkYXRlUG9saWN5VVJMIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvcgotCSAqLwotCXByaXZhdGUgVXBkYXRlVXRpbHMoKSB7Ci0JfQotCQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0JCXJldHVybiBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZSkgewotCQkKLQkJaWYgKGUgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0JCQllID0gKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBlKS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJfQotCi0JCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJaWYgKGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQlzdGF0dXMgPSAoKENvcmVFeGNlcHRpb24pIGUpLmdldFN0YXR1cygpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBlLmdldE1lc3NhZ2UoKTsKLQkJCWlmIChtZXNzYWdlID09IG51bGwpCi0JCQkJbWVzc2FnZSA9IGUudG9TdHJpbmcoKTsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgZ2V0UGx1Z2luSWQoKSwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZSk7Ci0JCX0KLQkJbG9nKHN0YXR1cyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5JTkZPKSB7Ci0JCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQl9IAotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUZlYXR1cmVbXSBzZWFyY2hTaXRlKFN0cmluZyBmZWF0dXJlSWQsIElDb25maWd1cmVkU2l0ZSBzaXRlLCBib29sZWFuIG9ubHlDb25maWd1cmVkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IG51bGw7Ci0KLQkJaWYgKG9ubHlDb25maWd1cmVkKQotCQkJcmVmZXJlbmNlcyA9IHNpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCWVsc2UKLQkJCXJlZmVyZW5jZXMgPSBzaXRlLmdldFNpdGUoKS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlWZWN0b3IgcmVzdWx0ID0gbmV3IFZlY3RvcigpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZmVyZW5jZXNbaV0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCVN0cmluZyBpZCA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKTsKLQkJCWlmIChmZWF0dXJlSWQuZXF1YWxzKGlkKSkgewotCQkJCXJlc3VsdC5hZGQoZmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJRmVhdHVyZVtdKSByZXN1bHQudG9BcnJheShuZXcgSUZlYXR1cmVbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUZlYXR1cmVbXSBnZXRJbnN0YWxsZWRGZWF0dXJlcyhJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiBnZXRJbnN0YWxsZWRGZWF0dXJlcyhmZWF0dXJlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBvbmx5Q29uZmlndXJlZAotCSAqIEByZXR1cm4gSUZlYXR1cmVbXSB3aXRoIGZlYXR1cmVzIG1hdGNoaW5nIGZlYXR1cmUgSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGZWF0dXJlW10gZ2V0SW5zdGFsbGVkRmVhdHVyZXMoSUZlYXR1cmUgZmVhdHVyZSwgYm9vbGVhbiBvbmx5Q29uZmlndXJlZCkgewotCQlyZXR1cm4gZ2V0SW5zdGFsbGVkRmVhdHVyZXMoZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCksIG9ubHlDb25maWd1cmVkKTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHZpZAotCSAqIEBwYXJhbSBvbmx5Q29uZmlndXJlZAotCSAqIEByZXR1cm4gSUZlYXR1cmVbXSB3aXRoIGZlYXR1cmVzIG1hdGNoaW5nIGZlYXR1cmUgSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGZWF0dXJlW10gZ2V0SW5zdGFsbGVkRmVhdHVyZXMoVmVyc2lvbmVkSWRlbnRpZmllciB2aWQsIGJvb2xlYW4gb25seUNvbmZpZ3VyZWQpIHsKLQkJVmVjdG9yIGZlYXR1cmVzID0gbmV3IFZlY3RvcigpOwotCQl0cnkgewotCQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJCUlDb25maWd1cmVkU2l0ZVtdIGlzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJCVN0cmluZyBpZCA9IHZpZC5nZXRJZGVudGlmaWVyKCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNvbmZpZ3VyZWRTaXRlIGlzaXRlID0gaXNpdGVzW2ldOwotCQkJCUlGZWF0dXJlW10gcmVzdWx0ID0gVXBkYXRlVXRpbHMuc2VhcmNoU2l0ZShpZCwgaXNpdGUsIG9ubHlDb25maWd1cmVkKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlc3VsdC5sZW5ndGg7IGorKykgewotCQkJCQlJRmVhdHVyZSBpbnN0YWxsZWRGZWF0dXJlID0gcmVzdWx0W2pdOwotCQkJCQlmZWF0dXJlcy5hZGQoaW5zdGFsbGVkRmVhdHVyZSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVV0aWxzLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gKElGZWF0dXJlW10pIGZlYXR1cmVzLnRvQXJyYXkobmV3IElGZWF0dXJlW2ZlYXR1cmVzLnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcGF0Y2gKLQkgKiBAcmV0dXJuIElGZWF0dXJlIG9yIG51bGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGZWF0dXJlIGdldFBhdGNoZWRGZWF0dXJlKElGZWF0dXJlIHBhdGNoKSB7Ci0JCUlJbXBvcnRbXSBpbXBvcnRzID0gcGF0Y2guZ2V0SW1wb3J0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCUlJbXBvcnQgaWltcG9ydCA9IGltcG9ydHNbaV07Ci0JCQlpZiAoaWltcG9ydC5pc1BhdGNoKCkpIHsKLQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHBhdGNoZWRWaWQgPSBpaW1wb3J0Ci0JCQkJCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJCS8vIGZlYXR1cmVzIHdpdGggbWF0Y2hpbmcgaWQKLQkJCQlJRmVhdHVyZVtdIGZlYXR1cmVzID0gZ2V0SW5zdGFsbGVkRmVhdHVyZXMocGF0Y2hlZFZpZCwgZmFsc2UpOwotCQkJCWZvciAoaW50IGYgPSAwOyBmIDwgZmVhdHVyZXMubGVuZ3RoOyBmKyspIHsKLQkJCQkJLy8gY2hlY2sgaWYgdmVyc2lvbiBtYXRjaAotCQkJCQlpZiAocGF0Y2hlZFZpZC5lcXVhbHMoZmVhdHVyZXNbZl0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSkgewotCQkJCQkJcmV0dXJuIGZlYXR1cmVzW2ZdOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BhdGNoKElGZWF0dXJlIGNhbmRpZGF0ZSkgewotCQlJSW1wb3J0W10gaW1wb3J0cyA9IGNhbmRpZGF0ZS5nZXRJbXBvcnRzKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSW1wb3J0IGlpbXBvcnQgPSBpbXBvcnRzW2ldOwotCQkJaWYgKGlpbXBvcnQuaXNQYXRjaCgpKSByZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGF0Y2goSUZlYXR1cmUgdGFyZ2V0LCBJRmVhdHVyZSBjYW5kaWRhdGUpIHsKLQkJVmVyc2lvbmVkSWRlbnRpZmllciB2aWQgPSB0YXJnZXQuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQlJSW1wb3J0W10gaW1wb3J0cyA9IGNhbmRpZGF0ZS5nZXRJbXBvcnRzKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSW1wb3J0IGlpbXBvcnQgPSBpbXBvcnRzW2ldOwotCQkJaWYgKGlpbXBvcnQuaXNQYXRjaCgpKSB7Ci0JCQkJVmVyc2lvbmVkSWRlbnRpZmllciBpdmlkID0gaWltcG9ydC5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQkJaWYgKHZpZC5lcXVhbHMoaXZpZCkpIHsKLQkJCQkJLy8gQmluZ28uCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb24gZ2V0QmFja3VwQ29uZmlndXJhdGlvbkZvcihJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCVN0cmluZyBrZXkgPSAiQCIgKyB2aWQuZ2V0SWRlbnRpZmllcigpICsgIl8iICsgdmlkLmdldFZlcnNpb24oKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRyeSB7Ci0JCQlJTG9jYWxTaXRlIGxzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCQlJSW5zdGFsbENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gbHNpdGUuZ2V0UHJlc2VydmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBjb25maWdzW2ldOwotCQkJCWlmIChjb25maWcuZ2V0TGFiZWwoKS5zdGFydHNXaXRoKGtleSkpCi0JCQkJCXJldHVybiBjb25maWc7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzTGljZW5zZShJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUlVUkxFbnRyeSBpbmZvID0gZmVhdHVyZS5nZXRMaWNlbnNlKCk7Ci0JCWlmIChpbmZvID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBsaWNlbnNlVHh0ID0gaW5mby5nZXRBbm5vdGF0aW9uKCk7Ci0JCWlmIChsaWNlbnNlVHh0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBsaWNlbnNlVHh0LnRyaW0oKS5sZW5ndGgoKSA+IDA7Ci0JfQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNPcHRpb25hbEZlYXR1cmVzKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJdHJ5IHsKLQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBpcmVmcyA9IGZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpcmVmcy5sZW5ndGg7IGkrKykgewotCQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgaXJlZiA9IGlyZWZzW2ldOwotCQkJCWlmIChpcmVmLmlzT3B0aW9uYWwoKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJLy8gc2VlIGlmIGl0IGhhcyBvcHRpb25hbCBjaGlsZHJlbgotCQkJCUlGZWF0dXJlIGNoaWxkID0gZ2V0SW5jbHVkZWRGZWF0dXJlKCBmZWF0dXJlLCBpcmVmKTsKLQkJCQlpZiAoaGFzT3B0aW9uYWxGZWF0dXJlcyhjaGlsZCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRmVhdHVyZSBnZXRMb2NhbEZlYXR1cmUoCi0JCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSwKLQkJSUZlYXR1cmUgZmVhdHVyZSkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBjc2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSByZWZzW2ldOwotCQkJVmVyc2lvbmVkSWRlbnRpZmllciByZWZWaWQgPSByZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJaWYgKGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyhyZWZWaWQpKQotCQkJCXJldHVybiByZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJQ29uZmlndXJlZFNpdGUgZ2V0Q29uZmlnU2l0ZSgKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJQ29uZmlndXJlZFNpdGVbXSBjb25maWdTaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdTaXRlcy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPSBjb25maWdTaXRlc1tpXTsKLQkJCWlmIChzaXRlLmdldFNpdGUoKS5lcXVhbHMoZmVhdHVyZS5nZXRTaXRlKCkpKSB7Ci0JCQkJcmV0dXJuIHNpdGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSUNvbmZpZ3VyZWRTaXRlIGdldERlZmF1bHRUYXJnZXRTaXRlKAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gcGVuZGluZ0NoYW5nZSkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdFRhcmdldFNpdGUoY29uZmlnLCBwZW5kaW5nQ2hhbmdlLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgIHN0YXRpYyBJQ29uZmlndXJlZFNpdGUgZ2V0RGVmYXVsdFRhcmdldFNpdGUoCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBwZW5kaW5nQ2hhbmdlLAotCQlib29sZWFuIGNoZWNrQWZmaW5pdHlGZWF0dXJlKSB7Ci0JCUlGZWF0dXJlIG9sZEZlYXR1cmUgPSBwZW5kaW5nQ2hhbmdlLmdldE9sZEZlYXR1cmUoKTsKLQkJSUZlYXR1cmUgbmV3RmVhdHVyZSA9IHBlbmRpbmdDaGFuZ2UuZ2V0RmVhdHVyZSgpOwotCQlpZiAob2xkRmVhdHVyZSAhPSBudWxsKSB7Ci0JCQkvLyBXZSBzaG91bGQgaW5zdGFsbCBpbnRvIHRoZSBzYW1lIHNpdGUgYXMKLQkJCS8vIHRoZSBvbGQgZmVhdHVyZQotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZ2V0Q29uZmlnU2l0ZShvbGRGZWF0dXJlLCBjb25maWcpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJbG9nRXhjZXB0aW9uKGUpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJLy8gVGhpcyBpcyBhIG5ldyBpbnN0YWxsLiBDaGVjayBpZiB0aGVyZSBpcyAKLQkJLy8gYSBkaXNhYmxlZCBmZWF0dXJlIHdpdGggdGhlIHNhbWUgSUQKLQkJU3RyaW5nIG5ld0ZlYXR1cmVJRCA9Ci0JCQluZXdGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCk7Ci0JCUlDb25maWd1cmVkU2l0ZSBzYW1lU2l0ZSA9IGdldFNpdGVXaXRoRmVhdHVyZShjb25maWcsIG5ld0ZlYXR1cmVJRCk7Ci0JCWlmIChzYW1lU2l0ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc2FtZVNpdGU7Ci0JCX0KLQotCQlpZiAoY2hlY2tBZmZpbml0eUZlYXR1cmUpIHsKLQkJCXJldHVybiBnZXRBZmZpbml0eVNpdGUoY29uZmlnLCBuZXdGZWF0dXJlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJQ29uZmlndXJlZFNpdGUgZ2V0QWZmaW5pdHlTaXRlKAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQlJRmVhdHVyZSBuZXdGZWF0dXJlKSB7Ci0JCS8vIGNoZWNrIGlmIHRoZSBhZmZpbml0eSBmZWF0dXJlIGlzIGluc3RhbGxlZAotCQlTdHJpbmcgYWZmaW5pdHlJRCA9IG5ld0ZlYXR1cmUuZ2V0QWZmaW5pdHlGZWF0dXJlKCk7Ci0JCWlmIChhZmZpbml0eUlEICE9IG51bGwpIHsKLQkJCUlDb25maWd1cmVkU2l0ZSBhZmZpbml0eVNpdGUgPQotCQkJCWdldFNpdGVXaXRoRmVhdHVyZShjb25maWcsIGFmZmluaXR5SUQpOwotCQkJaWYgKGFmZmluaXR5U2l0ZSAhPSBudWxsKQotCQkJCXJldHVybiBhZmZpbml0eVNpdGU7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBpZiB0aGlzIGlzIGEgcGF0Y2gsIGNvbGxvY2F0ZSB3aXRoIHRoZSBmZWF0dXJlCi0JCQlJRmVhdHVyZSBwYXRjaGVkRmVhdHVyZSA9IGdldFBhdGNoZWRGZWF0dXJlKG5ld0ZlYXR1cmUpOwotCQkJaWYgKHBhdGNoZWRGZWF0dXJlICE9IG51bGwpCi0JCQkJcmV0dXJuIGdldFNpdGVXaXRoRmVhdHVyZShjb25maWcsIHBhdGNoZWRGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUNvbmZpZ3VyZWRTaXRlIGdldFNpdGVXaXRoRmVhdHVyZSgKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJU3RyaW5nIGZlYXR1cmVJRCkgewotCQlpZiAoZmVhdHVyZUlEID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUNvbmZpZ3VyZWRTaXRlW10gc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmVkU2l0ZSBzaXRlID0gc2l0ZXNbaV07Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSByZWZzW2pdOwotCQkJCXRyeSB7Ci0JCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJaWYgKGZlYXR1cmVJRAotCQkJCQkJLmVxdWFscygKLQkJCQkJCQlmZWF0dXJlCi0JCQkJCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkJCQkJLmdldElkZW50aWZpZXIoKSkpIHsKLQkJCQkJCS8vIGZvdW5kIGl0Ci0JCQkJCQlyZXR1cm4gc2l0ZTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlsb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgY29sbGVjdE9sZEZlYXR1cmVzKAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwKLQkJQXJyYXlMaXN0IHJlc3VsdCkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gaW5jbHVkZWQgPQotCQkJZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZWQubGVuZ3RoOyBpKyspIHsKLQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgaXJlZiA9IGluY2x1ZGVkW2ldOwotCi0JCQlJRmVhdHVyZSBpZmVhdHVyZTsKLQotCQkJdHJ5IHsKLQkJCQlpZmVhdHVyZSA9IGlyZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWlmIChpcmVmLmlzT3B0aW9uYWwoKSkKLQkJCQkJY29udGludWU7Ci0JCQkJdGhyb3cgZTsKLQkJCX0KLQkJCS8vIGZpbmQgb3RoZXIgZmVhdHVyZXMgYW5kIHVuY29uZmlndXJlCi0JCQlTdHJpbmcgaWQgPSBpcmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCk7Ci0JCQlJRmVhdHVyZVtdIHNhbWVJZHMgPSBVcGRhdGVVdGlscy5zZWFyY2hTaXRlKGlkLCB0YXJnZXRTaXRlLCB0cnVlKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2FtZUlkcy5sZW5ndGg7IGorKykgewotCQkJCUlGZWF0dXJlIHNhbWVJZCA9IHNhbWVJZHNbal07Ci0JCQkJLy8gSWdub3JlIHNlbGYuCi0JCQkJaWYgKHNhbWVJZC5lcXVhbHMoaWZlYXR1cmUpKQotCQkJCQljb250aW51ZTsKLQkJCQlyZXN1bHQuYWRkKHNhbWVJZCk7Ci0JCQl9Ci0JCQljb2xsZWN0T2xkRmVhdHVyZXMoaWZlYXR1cmUsIHRhcmdldFNpdGUsIHJlc3VsdCk7Ci0JCX0KLQl9Ci0KLS8vCi0vLwlwdWJsaWMgc3RhdGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBjcmVhdGVJbnN0YWxsQ29uZmlndXJhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uewotLy8JCXRyeSB7Ci0vLwkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0vLwkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPQotLy8JCQkJbG9jYWxTaXRlLmNsb25lQ3VycmVudENvbmZpZ3VyYXRpb24oKTsKLS8vCQkJY29uZmlnLnNldExhYmVsKFV0aWxpdGllcy5mb3JtYXQoY29uZmlnLmdldENyZWF0aW9uRGF0ZSgpKSk7Ci0vLwkJCXJldHVybiBjb25maWc7Ci0vLwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0vLwkJCS8vIExldCBjYWxsZXJzIGhhbmRsZSBsb2dnaW5nCi0vLwkJCS8vbG9nRXhjZXB0aW9uKGUpOwotLy8JCQl0aHJvdyBlOwotLy8JCX0KLS8vCX0KLQkKLQlwdWJsaWMgc3RhdGljIFVwZGF0ZVNlYXJjaFJlcXVlc3QgY3JlYXRlTmV3VXBkYXRlc1JlcXVlc3QoSUZlYXR1cmUgW10gZmVhdHVyZXMpIHsKLQkJcmV0dXJuIGNyZWF0ZU5ld1VwZGF0ZXNSZXF1ZXN0KGZlYXR1cmVzLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBVcGRhdGVTZWFyY2hSZXF1ZXN0IGNyZWF0ZU5ld1VwZGF0ZXNSZXF1ZXN0KElGZWF0dXJlIFtdIGZlYXR1cmVzLCBib29sZWFuIGF1dG9tYXRpYykgewotCQlVcGRhdGVTZWFyY2hTY29wZSBzY29wZSA9IG5ldyBVcGRhdGVTZWFyY2hTY29wZSgpOwotCQlzY29wZS5zZXRVcGRhdGVNYXBVUkwoVXBkYXRlVXRpbHMuZ2V0VXBkYXRlTWFwVVJMKCkpOwotCQlVcGRhdGVzU2VhcmNoQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBuZXcgVXBkYXRlc1NlYXJjaENhdGVnb3J5KGF1dG9tYXRpYyk7Ci0JCWlmIChmZWF0dXJlcyE9bnVsbCkKLQkJCWNhdGVnb3J5LnNldEZlYXR1cmVzKGZlYXR1cmVzKTsKLQkJVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0ID0gbmV3IFVwZGF0ZVNlYXJjaFJlcXVlc3QoY2F0ZWdvcnksIHNjb3BlKTsKLQkJc2VhcmNoUmVxdWVzdC5hZGRGaWx0ZXIobmV3IEVudmlyb25tZW50RmlsdGVyKCkpOwotCQlzZWFyY2hSZXF1ZXN0LmFkZEZpbHRlcihuZXcgQmFja0xldmVsRmlsdGVyKCkpOwotCQlyZXR1cm4gc2VhcmNoUmVxdWVzdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOZXN0ZWRDaGlsZChJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLCBJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUlDb25maWd1cmVkU2l0ZVtdIGNzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBjc2l0ZXMgIT0gbnVsbCAmJiBpIDwgY3NpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0gY3NpdGVzW2ldLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQkJCWZvciAoaW50IGogPSAwOyByZWZzICE9IG51bGwgJiYgaiA8IHJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUZlYXR1cmUgcGFyZW50ID0gcmVmc1tqXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0KLQkJCQkJCXBhcmVudC5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQkJCWZvciAoaW50IGsgPSAwOwotCQkJCQkJY2hpbGRyZW4gIT0gbnVsbCAmJiBrIDwgY2hpbGRyZW4ubGVuZ3RoOwotCQkJCQkJaysrKSB7Ci0JCQkJCQlJRmVhdHVyZSBjaGlsZCA9IGNoaWxkcmVuW2tdLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJCQlpZiAoZmVhdHVyZS5lcXVhbHMoY2hpbGQpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHdpbGwgcmV0dXJuIGZhbHNlCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzT2Jzb2xldGVQYXRjaGVzKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJLy8gQ2hlY2sgYWxsIHRoZSBpbmNsdWRlZCBmZWF0dXJlcyB0aGF0Ci0JCS8vIGFyZSB1bmNvbmZpZ3VyZWQsIGFuZCBzZWUgaWYgdGhlaXIgcGF0Y2ggCi0JCS8vIHJlZmVyZW5jZXMgYXJlIGJldHRlciB0aGFuIHRoZSBvcmlnaW5hbC4KLQkJdHJ5IHsKLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gaXJlZnMgPSBmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRmVhdHVyZVJlZmVyZW5jZSBpcmVmID0gaXJlZnNbaV07Ci0JCQkJSUZlYXR1cmUgaWZlYXR1cmUgPSBpcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gaWZlYXR1cmUuZ2V0U2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpOwotCQkJCWlmICghY3NpdGUuaXNDb25maWd1cmVkKGlmZWF0dXJlKSkgewotCQkJCQlpZiAoIWlzUGF0Y2hIYXBweShpZmVhdHVyZSkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBBbGwgY2hlY2tzIHdlbnQgd2VsbAotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGF0Y2hIYXBweShJRmVhdHVyZSBmZWF0dXJlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIElmIHRoaXMgaXMgYSBwYXRjaCBhbmQgaXQgaW5jbHVkZXMgCi0JCS8vIGFub3RoZXIgcGF0Y2ggYW5kIHRoZSBpbmNsdWRlZCBwYXRjaAotCQkvLyBpcyBkaXNhYmxlZCBidXQgdGhlIGZlYXR1cmUgaXQgd2FzIGRlY2xhcmVkCi0JCS8vIHRvIHBhdGNoIGlzIG5vdyBuZXdlciAoYW5kIGlzIHByZXN1bWVkIHRvCi0JCS8vIGNvbnRhaW4gdGhlIG5vdyBkaXNhYmxlZCBwYXRjaCksIGFuZAotCQkvLyB0aGUgbmV3ZXIgcGF0Y2hlZCBmZWF0dXJlIGlzIGVuYWJsZWQsCi0JCS8vIGEgJ2xlYXAgb2YgZmFpdGgnIGFzc3VtcHRpb24gY2FuIGJlCi0JCS8vIG1hZGU6Ci0KLQkJLy8gQWx0aG91Z2ggdGhlIGluY2x1ZGVkIHBhdGNoIGlzIGRpc2FibGVkLAotCQkvLyB0aGUgZmVhdHVyZSBpdCB3YXMgZGVzaWduZWQgdG8gcGF0Y2gKLQkJLy8gaXMgbm93IG5ld2VyIGFuZCBtb3N0IGxpa2VseSBjb250YWlucwotCQkvLyB0aGUgZXF1aXZhbGVudCBmaXggYW5kIG1vcmUuIENvbnNlcXVlbnRseSwKLQkJLy8gd2UgY2FuIGNsYWltIHRoYXQgdGhlIHN0YXR1cyBhbmQgdGhlIGVycm9yCi0JCS8vIGljb24gb3ZlcmxheSBhcmUgbWlzbGVhZGluZyBiZWNhdXNlCi0JCS8vIGFsbCB0aGUgcmlnaHQgcGx1Zy1pbnMgYXJlIGNvbmZpZ3VyZWQuCi0JCUlJbXBvcnRbXSBpbXBvcnRzID0gZmVhdHVyZS5nZXRJbXBvcnRzKCk7Ci0JCUlJbXBvcnQgcGF0Y2hSZWZlcmVuY2UgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCUlJbXBvcnQgaWltcG9ydCA9IGltcG9ydHNbaV07Ci0JCQlpZiAoaWltcG9ydC5pc1BhdGNoKCkpIHsKLQkJCQlwYXRjaFJlZmVyZW5jZSA9IGlpbXBvcnQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHBhdGNoUmVmZXJlbmNlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVZlcnNpb25lZElkZW50aWZpZXIgcmVmVmlkID0gcGF0Y2hSZWZlcmVuY2UuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCi0JCS8vIEZpbmQgdGhlIHBhdGNoZWQgZmVhdHVyZSBhbmQgCi0JCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IGZlYXR1cmUuZ2V0U2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpOwotCQlpZiAoY3NpdGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNyZWZzID0gY3NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3JlZnMubGVuZ3RoOyBpKyspIHsKLQkJCUlGZWF0dXJlUmVmZXJlbmNlIGNyZWYgPSBjcmVmc1tpXTsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgY3ZpZCA9IGNyZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJaWYgKGN2aWQuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhyZWZWaWQuZ2V0SWRlbnRpZmllcigpKSkgewotCQkJCS8vIFRoaXMgaXMgdGhlIG9uZS4KLQkJCQlpZiAoY3ZpZC5nZXRWZXJzaW9uKCkuaXNHcmVhdGVyVGhhbihyZWZWaWQuZ2V0VmVyc2lvbigpKSkgewotCQkJCQkvLyBCaW5nbzogd2UgZm91bmQgdGhlIHJlZmVyZW5jZWQgZmVhdHVyZQotCQkJCQkvLyBhbmQgaXRzIHZlcnNpb24gaXMgZ3JlYXRlciAtIAotCQkJCQkvLyB3ZSBjYW4gYXNzdW1lIHRoYXQgaXQgY29udGFpbnMgYmV0dGVyIGNvZGUKLQkJCQkJLy8gdGhhbiB0aGUgcGF0Y2ggdGhhdCByZWZlcmVuY2VkIHRoZQotCQkJCQkvLyBvbGRlciB2ZXJzaW9uLgotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJMIGdldFVwZGF0ZU1hcFVSTCgpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIG1hcEZpbGUgPSBwcmVmLmdldFN0cmluZyhVcGRhdGVVdGlscy5QX1VQREFURV9QT0xJQ1lfVVJMKTsKLQkJaWYgKG1hcEZpbGUhPW51bGwgJiYgbWFwRmlsZS5sZW5ndGgoKT4wKSB7Ci0JCQl0cnkgewotCQkJCVVSTCB1cmwgPSBuZXcgVVJMKG1hcEZpbGUpOwotCQkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHVybCk7Ci0JCQkJcmV0dXJuIHJlc29sdmVkVVJMOwotCQkJfQotCQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJVXBkYXRlVXRpbHMubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIExvYWQgdGhlIHVwZGF0ZSBtYXAgdXNpbmcgdGhlIG1hcCBVUkwgZm91bmQgaW4gdGhlIHNjb3BlLgotCSAqLwkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgbG9hZFVwZGF0ZVBvbGljeShVcGRhdGVQb2xpY3kgbWFwLCBVUkwgdXJsLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VzLlVwZGF0ZVNlYXJjaFJlcXVlc3RfbG9hZGluZ1BvbGljeSk7IAotCQl0cnkgewotCQkJbWFwLmxvYWQodXJsLCBtb25pdG9yKTsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gZS5nZXRTdGF0dXMoKTsKLQkJCWlmIChzdGF0dXMgPT0gbnVsbAotCQkJCXx8IHN0YXR1cy5nZXRDb2RlKCkgIT0gSVNpdGUuU0lURV9BQ0NFU1NfRVhDRVBUSU9OKQotCQkJCXRocm93IGU7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRvd25sb2FkRmVhdHVyZUNvbnRlbnQoCi0gICAgICAgIElDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlLAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsQ2hpbGRyZW4sIC8vIG51bGwgd2hlbiBmZWF0dXJlIGhhcyBubyBvcHRpb25hbCBmZWF0dXJlcwotCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKQotCQl0aHJvd3MgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQkKLQkJLy9ERUJVRwotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfSU5TVEFMTCkgewotCQkJVXBkYXRlQ29yZS5kZWJ1ZygKLQkJCQkiRG93bmxvYWRpbmcuLi46IiArIGZlYXR1cmUuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIEdldCBzb3VyY2UgZmVhdHVyZSBwcm92aWRlciBhbmQgdmVyaWZpZXIuCi0JCS8vIEluaXRpYWxpemUgdGFyZ2V0IHZhcmlhYmxlcy4KLQkJZmluYWwgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPQotCQkJZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCk7Ci0JCUlQbHVnaW5FbnRyeVtdIHRhcmdldFNpdGVQbHVnaW5FbnRyaWVzID0gbnVsbDsKLQotCQkvLyBkZXRlcm1pbmUgbGlzdCBvZiBwbHVnaW5zIHRvIGluc3RhbGwKLQkJLy8gZmluZCB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gdGhlIHBsdWdpbiBlbnRyaWVzIGFscmVhZHkgY29udGFpbmVkCi0JCS8vIG9uIHRoZSB0YXJnZXQgc2l0ZSwgYW5kIHBsdWdpbiBlbnRyaWVzIHBhY2thZ2VkIGluIHNvdXJjZSBmZWF0dXJlCi0JCUlQbHVnaW5FbnRyeVtdIHNvdXJjZUZlYXR1cmVQbHVnaW5FbnRyaWVzID0gZmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0KLSAgICAgICAgYm9vbGVhbiBmZWF0dXJlQWxyZWFkeUluc3RhbGxlZCA9IGZhbHNlOwotICAgICAgICBpZiAodGFyZ2V0U2l0ZSA9PSBudWxsKQotICAgICAgICAgICAgdGFyZ2V0U2l0ZSA9IGdldFNpdGVXaXRoRmVhdHVyZShTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSwgKChGZWF0dXJlKSBmZWF0dXJlKQotICAgICAgICAgICAgICAgICAgICAuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSk7Ci0JCWlmICh0YXJnZXRTaXRlID09IG51bGwpIHsKLQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19JTlNUQUxMKSB7Ci0JCQkJVXBkYXRlQ29yZS5kZWJ1ZygiVGhlIHNpdGUgdG8gaW5zdGFsbCBpbiBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJdGFyZ2V0U2l0ZVBsdWdpbkVudHJpZXMgPSBuZXcgSVBsdWdpbkVudHJ5WzBdOwotCQl9IGVsc2UgewotCQkJdGFyZ2V0U2l0ZVBsdWdpbkVudHJpZXMgPSB0YXJnZXRTaXRlLmdldFNpdGUoKS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0gICAgICAgICAgICBmZWF0dXJlQWxyZWFkeUluc3RhbGxlZCA9IFVwZGF0ZVV0aWxzLmdldExvY2FsRmVhdHVyZSh0YXJnZXRTaXRlLGZlYXR1cmUpICE9IG51bGw7Ci0JCX0KLQkJSVBsdWdpbkVudHJ5W10gcGx1Z2luc1RvSW5zdGFsbCA9Ci0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMuZGlmZigKLQkJCQlzb3VyY2VGZWF0dXJlUGx1Z2luRW50cmllcywKLQkJCQl0YXJnZXRTaXRlUGx1Z2luRW50cmllcyk7Ci0JCUlOb25QbHVnaW5FbnRyeVtdIG5vblBsdWdpbnNUb0luc3RhbGwgPSBmZWF0dXJlLmdldE5vblBsdWdpbkVudHJpZXMoKTsKLQkJCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW4gPSBmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJaWYgKG9wdGlvbmFsQ2hpbGRyZW4gIT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPQotCQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5vcHRpb25hbENoaWxkcmVuVG9JbnN0YWxsKAotCQkJCQljaGlsZHJlbiwKLQkJCQkJb3B0aW9uYWxDaGlsZHJlbik7Ci0JCX0KLQotCQkvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhbiBJbnN0YWxsTW9uaXRvcgkJCi0JCUluc3RhbGxNb25pdG9yIG1vbml0b3I7Ci0JCWlmIChwcm9ncmVzcyA9PSBudWxsKQotCQkJbW9uaXRvciA9IG5ldyBJbnN0YWxsTW9uaXRvcihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJZWxzZSBpZiAocHJvZ3Jlc3MgaW5zdGFuY2VvZiBJbnN0YWxsTW9uaXRvcikKLQkJCW1vbml0b3IgPSAoSW5zdGFsbE1vbml0b3IpIHByb2dyZXNzOwotCQllbHNlCi0JCQltb25pdG9yID0gbmV3IEluc3RhbGxNb25pdG9yKHByb2dyZXNzKTsKLQotCQl0cnkgewotCQkJLy8gZGV0ZXJtaW5lIG51bWJlciBvZiBtb25pdG9yIHRhc2tzCi0JCQkvLyAgIDEgdGFzazEgZm9yIHRoZSBmZWF0dXJlIGphciAoZG93bmxvYWQpCi0JCQkvLyArIG4gdGFza3MgZm9yIHBsdWdpbiBlbnRyaWVzIChkb3dubG9hZCBmb3IgZWFjaCkKLQkJCS8vICsgbSB0YXNrcyBwZXIgbm9uLXBsdWdpbiBkYXRhIGVudHJ5IChkb3dubG9hZCBmb3IgZWFjaCkKLQkJCS8vIFRPRE8gY3VzdG9tIGluc3RhbGwgaGFuZGxlciAgKyAxIHRhc2sgZm9yIGN1c3RvbSBub24tcGx1Z2luIGVudHJ5IGhhbmRsaW5nICgxIGZvciBhbGwgY29tYmluZWQpCi0JCQkvLyArIDMqeCB0YXNrcyBmb3IgY2hpbGRyZW4gZmVhdHVyZXMgKDMgc3VidGFza3MgcGVyIGluc3RhbGwpCi0JCQlpbnQgdGFza0NvdW50ID0KLQkJCQkJMQotCQkJCQkrIHBsdWdpbnNUb0luc3RhbGwubGVuZ3RoCi0JCQkJCSsgbm9uUGx1Z2luc1RvSW5zdGFsbC5sZW5ndGgKLS8vCQkJCSsgMQotCQkJCQkrIDMgKiBjaGlsZHJlbi5sZW5ndGg7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgdGFza0NvdW50KTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQkvLyBEb3dubG9hZCBmZWF0dXJlIGFyY2hpdmUocykKLQkJCXByb3ZpZGVyLmdldEZlYXR1cmVFbnRyeUFyY2hpdmVSZWZlcmVuY2VzKG1vbml0b3IpOwotCQkJbW9uaXRvcldvcmsobW9uaXRvciwxKTsKLQkJCQotCQkJLy8gRG93bmxvYWQgcGx1Z2luIGFyY2hpdmVzCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbnNUb0luc3RhbGwubGVuZ3RoOyBpKyspIHsKLQkJCQlwcm92aWRlci5nZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKHBsdWdpbnNUb0luc3RhbGxbaV0sIG1vbml0b3IpOwotCQkJCW1vbml0b3JXb3JrKG1vbml0b3IsMSk7Ci0JCQl9Ci0JCQkKLQkJCQotCi0JCQkvLyBEb3dubG9hZCBub24tcGx1Z2luIGFyY2hpdmVzLiBWZXJpZmljYXRpb24gaGFuZGxlZCBieSBvcHRpb25hbCBpbnN0YWxsIGhhbmRsZXIKLSAgICAgICAgICAgIC8vIE5vdGU6IGRvIG5vdCBkb3dubG9hZCBub24tcGx1Z2luIGFyY2hpdmVzIGZvciBpbnN0YWxsZWQgZmVhdHVyZXMKLSAgICAgICAgICAgIGlmIChub25QbHVnaW5zVG9JbnN0YWxsLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyBTZXR1cCBvcHRpb25hbCBpbnN0YWxsIGhhbmRsZXIKLSAgICAgICAgICAgICAgICBJbnN0YWxsSGFuZGxlclByb3h5IGhhbmRsZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlLmdldEluc3RhbGxIYW5kbGVyRW50cnkoKSE9bnVsbCkKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IG5ldyBJbnN0YWxsSGFuZGxlclByb3h5KAotICAgICAgICAgICAgICAgICAgICAgICAgSUluc3RhbGxIYW5kbGVyLkhBTkRMRVJfQUNUSU9OX0lOU1RBTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZS5nZXRJbnN0YWxsSGFuZGxlckVudHJ5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yKTsKLSAgICAgICAgICAgIAkKLSAgICAgICAgICAgICAgICBpZiAoIWZlYXR1cmVBbHJlYWR5SW5zdGFsbGVkKQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vblBsdWdpbnNUb0luc3RhbGwubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyPT1udWxsIHx8IGhhbmRsZXIuYWNjZXB0Tm9uUGx1Z2luRGF0YShub25QbHVnaW5zVG9JbnN0YWxsW2ldKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIAlwcm92aWRlci5nZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25QbHVnaW5zVG9JbnN0YWxsW2ldLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3JXb3JrKG1vbml0b3IsIDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBtb25pdG9yV29yayhtb25pdG9yLCBub25QbHVnaW5zVG9JbnN0YWxsLmxlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgIAotCQkJLy8gRG93bmxvYWQgY2hpbGQgZmVhdHVyZXMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlJRmVhdHVyZSBjaGlsZEZlYXR1cmUgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWNoaWxkRmVhdHVyZSA9IGNoaWxkcmVuW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsKLQkJCQl9Ci0JCQkJaWYgKGNoaWxkRmVhdHVyZSAhPSBudWxsKSB7Ci0JCQkJCVN1YlByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAzKTsKLQkJCQkJZG93bmxvYWRGZWF0dXJlQ29udGVudCh0YXJnZXRTaXRlLCBjaGlsZEZlYXR1cmUsIG9wdGlvbmFsQ2hpbGRyZW4sIHN1Yk1vbml0b3IpOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBtb25pdG9yV29yayhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGludCB0aWNrKQotCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCW1vbml0b3Iud29ya2VkKHRpY2spOwotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCVN0cmluZyBtc2cgPSAiZG93bmxvYWQgY2FuY2VsbGVkIjsvL1BvbGljeS5iaW5kKCJGZWF0dXJlLkluc3RhbGxhdGlvbkNhbmNlbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24obXNnLCBudWxsKTsKLQkJfQotCX0KLX0KLQlwdWJsaWMgc3RhdGljIElGZWF0dXJlIGdldEluY2x1ZGVkRmVhdHVyZShJRmVhdHVyZSBmZWF0dXJlLCBJRmVhdHVyZVJlZmVyZW5jZSBpcmVmKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGZWF0dXJlIGlmZWF0dXJlID0gbnVsbDsKLQkJaWYgKGZlYXR1cmUuZ2V0U2l0ZSgpIGluc3RhbmNlb2YgRXh0ZW5kZWRTaXRlKSB7Ci0JCQlpZmVhdHVyZSA9ICgoRXh0ZW5kZWRTaXRlKWZlYXR1cmUuZ2V0U2l0ZSgpKS5nZXRMaXRlRmVhdHVyZShpcmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7Ci0JCX0KLQkJaWYgKGlmZWF0dXJlID09IG51bGwpIHsKLQkJCWlmZWF0dXJlID0gaXJlZi5nZXRGZWF0dXJlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JCXJldHVybiBpZmVhdHVyZTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9wcm92aXNpb25hbC9TaXRlT3B0aW1pemVyQXBwbGljYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1NpdGVPcHRpbWl6ZXJBcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTk3OWEyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1NpdGVPcHRpbWl6ZXJBcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgQ2hyaXMgQW5pc3pjenlrIChJQk0gQ29ycC4pIC0gTkwtZW5hYmxlZCB0aGUgc2l0ZSBvcHRpbWl6ZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphck91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbGF0Zm9ybVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuRGVmYXVsdFNpdGVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuRmVhdHVyZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkZlYXR1cmVNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuRmVhdHVyZVJlZmVyZW5jZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkltcG9ydE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLlBsdWdpbkVudHJ5TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuU2l0ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLlVSTEVudHJ5TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuRXh0ZW5kZWRTaXRlVVJMRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZU1hbmFnZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuamFycHJvY2Vzc29yLkphclByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuamFycHJvY2Vzc29yLkphclByb2Nlc3NvckV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5qYXJwcm9jZXNzb3IuTWFpbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogVGhlIGFwcGxpY2F0aW9uIGNsYXNzIHVzZWQgdG8gcGVyZm9ybSB1cGRhdGUgc2l0ZSBvcHRpbWl6YXRpb25zLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGNhbiBvbmx5IGJlIHJlZmVyZW5jZWQgZnJvbSA8Y29kZT5vcmcuZWNsaXBzZS5ydW50aW1lLmFwcGxpY2F0aW9uczwvY29kZT4KLSAqIGV4dGVuc2lvbiBwb2ludC4gSXQgc2hvdWxkIG5vdCBiZSBleHRlbmRlZCBvciBpbnN0YW50aWF0ZWQuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcwotICogQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDMuMgotICovCi1wdWJsaWMgY2xhc3MgU2l0ZU9wdGltaXplckFwcGxpY2F0aW9uIGltcGxlbWVudHMgSVBsYXRmb3JtUnVubmFibGUgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZWdlciBFWElUX0VSUk9SID0gbmV3IEludGVnZXIoMSk7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVJfUFJPQ0VTU09SID0gIi1qYXJQcm9jZXNzb3IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESUdFU1RfQlVJTERFUiA9ICItZGlnZXN0QnVpbGRlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElOUFVUID0gImlucHV0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgT1VUUFVUX0RJUiA9ICItb3V0cHV0RGlyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkVSQk9TRSA9ICItdmVyYm9zZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBUl9QUk9DRVNTT1JfUEFDSyA9ICItcGFjayI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBUl9QUk9DRVNTT1JfVU5QQUNLID0gIi11bnBhY2siOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVJfUFJPQ0VTU09SX1JFUEFDSyA9ICItcmVwYWNrIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFSX1BST0NFU1NPUl9TSUdOID0gIi1zaWduIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFSX1BST0NFU1NPUl9QUk9DRVNTX0FMTCA9ICItcHJvY2Vzc0FsbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNJVEVfWE1MID0gIi1zaXRlWE1MIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0lURV9BVFRSSUJVVEVTX0ZJTEUgPSAic2l0ZUF0dHJpYnV0ZXMudHh0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElHRVNUX09VVFBVVF9ESVIgPSAiLWRpZ2VzdE91dHB1dERpciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qCi0JICogcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERFU0NSSVBUSU9OID0gIkRFU0NSSVBUSU9OIjsgcHJpdmF0ZSBmaW5hbAotCSAqIHN0YXRpYyBTdHJpbmcgTElDRU5DRSA9ICJMSUNFTkNFIjsgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENPUFlSSUdIVCA9Ci0JICogIkNPUFlSSUdIVCI7IHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBGRUFUVVJFX0xBQkVMID0gIkZFQVRVUkVfTEFCRUwiOwotCSAqLwotCi0JLyoqCi0JICogUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgaW4gdGhlIGZvcm06IFsta2V5IFt2YWx1ZV1dKiBbaW5wdXR2YWx1ZV0gSWYgdGhlCi0JICogbGFzdCBhcmd1bWVudCBkb2VzIG5vdCBzdGFydCB3aXRoIGEgIi0iIHRoZW4gaXQgaXMgdGFrZW4gYXMgdGhlIGlucHV0Ci0JICogdmFsdWUgYW5kIG5vdCB0aGUgdmFsdWUgZm9yIGEgcHJlY2VkaW5nIC1rZXkKLQkgKiAKLQkgKiBAcGFyYW0gYXJncwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE1hcCBwYXJzZUNtZExpbmUoU3RyaW5nW10gYXJncykgewotCQlNYXAgY21kcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgPT0gYXJncy5sZW5ndGggLSAxICYmICFhcmdzW2ldLnN0YXJ0c1dpdGgoIi0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJY21kcy5wdXQoSU5QVVQsIGFyZ3NbaV0pOwotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcga2V5ID0gYXJnc1tpXTsKLQkJCQlTdHJpbmcgdmFsID0gbnVsbDsKLQkJCQlpZiAoaSA8IGFyZ3MubGVuZ3RoIC0gMiAmJiAhYXJnc1tpICsgMV0uc3RhcnRzV2l0aCgiLSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdmFsID0gYXJnc1srK2ldOwotCQkJCX0KLQotCQkJCWlmIChrZXkuc3RhcnRzV2l0aChTSVRFX1hNTCkpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKHZhbC5pbmRleE9mKCI6bnVsbCIpKTsKLQkJCQkJdmFsID0ga2V5LnN1YnN0cmluZyhrZXkuaW5kZXhPZigiPSIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGtleSArICI6IiArIHZhbCk7Ci0JCQkJCWNtZHMucHV0KFNJVEVfWE1MLCB2YWwpOwotCQkJCX0gZWxzZSBpZiAoa2V5LnN0YXJ0c1dpdGgoRElHRVNUX09VVFBVVF9ESVIpKSB7Ci0JCQkJCXZhbCA9IGtleS5zdWJzdHJpbmcoa2V5LmluZGV4T2YoIj0iKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihrZXkgKyAiOiIgKyB2YWwpOwotCQkJCQljbWRzLnB1dChESUdFU1RfT1VUUFVUX0RJUiwgdmFsKTsKLQkJCQl9IGVsc2UgewotCi0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihrZXkgKyAiOiIgKyB2YWwpOwotCQkJCQljbWRzLnB1dChrZXksIHZhbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjbWRzOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBydW5KYXJQcm9jZXNzb3IoTWFwIHBhcmFtcykgewotCQlNYWluLk9wdGlvbnMgb3B0aW9ucyA9IG5ldyBNYWluLk9wdGlvbnMoKTsKLQkJb3B0aW9ucy5wYWNrID0gcGFyYW1zLmNvbnRhaW5zS2V5KEpBUl9QUk9DRVNTT1JfUEFDSyk7Ci0JCW9wdGlvbnMudW5wYWNrID0gcGFyYW1zLmNvbnRhaW5zS2V5KEpBUl9QUk9DRVNTT1JfVU5QQUNLKTsKLQkJb3B0aW9ucy5yZXBhY2sgPSBwYXJhbXMuY29udGFpbnNLZXkoSkFSX1BST0NFU1NPUl9SRVBBQ0spOwotCQlvcHRpb25zLnByb2Nlc3NBbGwgPSBwYXJhbXMuY29udGFpbnNLZXkoSkFSX1BST0NFU1NPUl9QUk9DRVNTX0FMTCk7Ci0JCW9wdGlvbnMudmVyYm9zZSA9IHBhcmFtcy5jb250YWluc0tleShWRVJCT1NFKTsKLQkJb3B0aW9ucy5zaWduQ29tbWFuZCA9IChTdHJpbmcpIHBhcmFtcy5nZXQoSkFSX1BST0NFU1NPUl9TSUdOKTsKLQkJb3B0aW9ucy5vdXRwdXREaXIgPSAoU3RyaW5nKSBwYXJhbXMuZ2V0KE9VVFBVVF9ESVIpOwotCi0JCVN0cmluZyBwcm9ibGVtID0gbnVsbDsKLQotCQlTdHJpbmcgaW5wdXQgPSAoU3RyaW5nKSBwYXJhbXMuZ2V0KElOUFVUKTsKLQkJaWYgKGlucHV0ID09IG51bGwpCi0JCQlwcm9ibGVtID0gTWVzc2FnZXMuU2l0ZU9wdGltaXplcl9pbnB1dE5vdFNwZWNpZmllZDsKLQkJZWxzZSB7Ci0JCQlGaWxlIGlucHV0RmlsZSA9IG5ldyBGaWxlKGlucHV0KTsKLQkJCWlmIChpbnB1dEZpbGUuZXhpc3RzKCkpCi0JCQkJb3B0aW9ucy5pbnB1dCA9IGlucHV0RmlsZTsKLQkJCWVsc2UKLQkJCQlwcm9ibGVtID0gTkxTLmJpbmQoTWVzc2FnZXMuU2l0ZU9wdGltaXplcl9pbnB1dEZpbGVOb3RGb3VuZCwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7IGlucHV0IH0pOwotCQl9Ci0KLQkJaWYgKG9wdGlvbnMudW5wYWNrKSB7Ci0JCQlpZiAoIUphclByb2Nlc3Nvci5jYW5QZXJmb3JtVW5wYWNrKCkpIHsKLQkJCQlwcm9ibGVtID0gTWVzc2FnZXMuSmFyUHJvY2Vzc29yX3VucGFja05vdEZvdW5kOwotCQkJfSBlbHNlIGlmIChvcHRpb25zLnBhY2sgfHwgb3B0aW9ucy5yZXBhY2sKLQkJCQkJfHwgb3B0aW9ucy5zaWduQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJcHJvYmxlbSA9IE1lc3NhZ2VzLkphclByb2Nlc3Nvcl9ub1BhY2tVbnBhY2s7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoKG9wdGlvbnMucGFjayB8fCBvcHRpb25zLnJlcGFjaykKLQkJCQkmJiAhSmFyUHJvY2Vzc29yLmNhblBlcmZvcm1QYWNrKCkpIHsKLQkJCXByb2JsZW0gPSBNZXNzYWdlcy5KYXJQcm9jZXNzb3JfcGFja05vdEZvdW5kOwotCQl9Ci0KLQkJaWYgKHByb2JsZW0gIT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHByb2JsZW0pOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJbmV3IEphclByb2Nlc3NvckV4ZWN1dG9yKCkucnVuSmFyUHJvY2Vzc29yKG9wdGlvbnMpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcnVuRGlnZXN0QnVpbGRlcihNYXAgcGFyYW1zKSB7Ci0KLQkJTGlzdCBmZWF0dXJlTGlzdCA9IGdldEZlYXR1cmVMaXN0KHBhcmFtcyk7Ci0KLQkJaWYgKChmZWF0dXJlTGlzdCA9PSBudWxsKSB8fCBmZWF0dXJlTGlzdC5pc0VtcHR5KCkpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigibm8gZmVhdHVyZXMgdG8gcHJvY2VzcyIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJTWFwIHBlckZlYXR1cmVMb2NhbGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJTWFwIGF2YWlsYWJsZUxvY2FsZXMgPSBnZXRBdmFpbGFibGVMb2NhbGVzKGZlYXR1cmVMaXN0LAotCQkJCXBlckZlYXR1cmVMb2NhbGVzKTsKLQkJdHJ5IHsKLQkJCW9wZW5JbnB1dFN0cmVtYXMoYXZhaWxhYmxlTG9jYWxlcyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2FuIG5vdCBjcmVhdGUgZmlsZSBpbiBvdXRwdXQgZGlyZWNvdHJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBmZWF0dXJlTGlzdC5zaXplKCk7IGkrKykgewotCi0JCQlTdHJpbmcgZmVhdHVyZUphckZpbGVOYW1lID0gKFN0cmluZykgZmVhdHVyZUxpc3QuZ2V0KGkpOwotCi0JCQlpZiAoZmVhdHVyZUphckZpbGVOYW1lLmVuZHNXaXRoKCJqYXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9jZXNzaW5nLi4uICIgKyBmZWF0dXJlSmFyRmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2tpcHBpbmcuLi4gIiArIGZlYXR1cmVKYXJGaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJSmFyRmlsZSBmZWF0dXJlSmFyID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZmVhdHVyZUphciA9IG5ldyBKYXJGaWxlKGZlYXR1cmVKYXJGaWxlTmFtZSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIHdpdGggb3BlbmluZyBqYXI6ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJKyBmZWF0dXJlSmFyRmlsZU5hbWUpOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJRmVhdHVyZU1vZGVsRmFjdG9yeSBmbWYgPSBuZXcgRmVhdHVyZU1vZGVsRmFjdG9yeSgpOwotCi0JCQl0cnkgewotCQkJCVppcEVudHJ5IGZlYXR1cmVYTUxFbnRyeSA9IGZlYXR1cmVKYXIuZ2V0RW50cnkoImZlYXR1cmUueG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlNYXAgZmVhdHVyZVByb3BlcnRpZXMgPSBsb2FkUHJvcGVydGllcyhmZWF0dXJlSmFyLAotCQkJCQkJZmVhdHVyZUphckZpbGVOYW1lLCBwZXJGZWF0dXJlTG9jYWxlcyk7Ci0KLQkJCQlGZWF0dXJlTW9kZWwgZmVhdHVyZU1vZGVsID0gZm1mLnBhcnNlRmVhdHVyZShmZWF0dXJlSmFyCi0JCQkJCQkuZ2V0SW5wdXRTdHJlYW0oZmVhdHVyZVhNTEVudHJ5KSk7Ci0KLQkJCQlmZWF0dXJlTGlzdCA9IGFkZEZlYXR1cmVzVG9MaXN0KCAoU3RyaW5nKSBwYXJhbXMuZ2V0KFNJVEVfWE1MKSwgZmVhdHVyZUxpc3QsIGZlYXR1cmVNb2RlbC5nZXRGZWF0dXJlSW5jbHVkZWQoKSwgYXZhaWxhYmxlTG9jYWxlcywgcGVyRmVhdHVyZUxvY2FsZXMpOwotCi0JCQkJSXRlcmF0b3IgYXZhaWxhYmxlTG9jYWxlc0l0ZXJhdG9yID0gYXZhaWxhYmxlTG9jYWxlcy52YWx1ZXMoKQotCQkJCS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChhdmFpbGFibGVMb2NhbGVzSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCSgoQXZhaWxhYmxlTG9jYWxlKSBhdmFpbGFibGVMb2NhbGVzSXRlcmF0b3IubmV4dCgpKQotCQkJCQkud3JpdGVGZWF0dXJlRGlnZXN0cyhmZWF0dXJlTW9kZWwsCi0JCQkJCQkJZmVhdHVyZVByb3BlcnRpZXMpOwotCQkJCX0KLQotCQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCUl0ZXJhdG9yIGF2YWlsYWJsZUxvY2FsZXNJdGVyYXRvciA9IGF2YWlsYWJsZUxvY2FsZXMudmFsdWVzKCkKLQkJLml0ZXJhdG9yKCk7Ci0JCVN0cmluZyBvdXRwdXREaXJlY3RvcnkgPSAoU3RyaW5nKSBwYXJhbXMuZ2V0KERJR0VTVF9PVVRQVVRfRElSKTsKLQotCQlvdXRwdXREaXJlY3RvcnkgPSBvdXRwdXREaXJlY3Rvcnkuc3Vic3RyaW5nKG91dHB1dERpcmVjdG9yeQotCQkJCS5pbmRleE9mKCI9IikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIW91dHB1dERpcmVjdG9yeS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLQkJCW91dHB1dERpcmVjdG9yeSA9IG91dHB1dERpcmVjdG9yeSArIEZpbGUuc2VwYXJhdG9yOwotCQl9Ci0JCXdoaWxlIChhdmFpbGFibGVMb2NhbGVzSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQl0cnkgewotCQkJCSgoQXZhaWxhYmxlTG9jYWxlKSBhdmFpbGFibGVMb2NhbGVzSXRlcmF0b3IubmV4dCgpKQotCQkJCS5maW5pc2hEaWdlc3Qob3V0cHV0RGlyZWN0b3J5KTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNhbiBub3Qgd3JpdGUgaW4gZGlnZXN0IG91dHB1dCBkaXJlY3Rvcnk6ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJKyBvdXRwdXREaXJlY3RvcnkpOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiRG9uZSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgTGlzdCBhZGRGZWF0dXJlc1RvTGlzdCggU3RyaW5nIHNpdGVYTUwsIExpc3QgZmVhdHVyZUxpc3QsIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBpSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcywgTWFwIGF2YWlsYWJsZUxvY2FsZXMsIE1hcCBwZXJGZWF0dXJlTG9jYWxlcyApIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgZGlyZWN0b3J5TmFtZSA9IChuZXcgRmlsZShzaXRlWE1MKSkuZ2V0UGFyZW50KCk7Ci0JCWlmICghZGlyZWN0b3J5TmFtZS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLQkJCWRpcmVjdG9yeU5hbWUgPSBkaXJlY3RvcnlOYW1lICsgRmlsZS5zZXBhcmF0b3I7Ci0JCX0KLQkJZGlyZWN0b3J5TmFtZSA9IGRpcmVjdG9yeU5hbWUgKyAiZmVhdHVyZXMiICsgRmlsZS5zZXBhcmF0b3I7IC8vJE5PTi1OTFMtMSQKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgZmVhdHVyZVVSTCA9IGRpcmVjdG9yeU5hbWUgKyBpSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkgKyAiLmphciI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICghKGlzRmVhdHVyZUFscmVhZHlJbkxpc3QoZmVhdHVyZUxpc3QsIGZlYXR1cmVVUkwpKSkgewotCQkJCXRyeSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXh0cmFjdGluZyBsb2NhbGVzIGZyb20gaW5jbHVkZWQgZmVhdHVyZSAiICsgZmVhdHVyZVVSTCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJvY2Vzc0xvY2FsZXNJbkphcihhdmFpbGFibGVMb2NhbGVzLCBmZWF0dXJlVVJMLCBwZXJGZWF0dXJlTG9jYWxlcywgdHJ1ZSk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlpZiAoaUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXNbaV0uaXNPcHRpb25hbCgpKSAKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIHdoaWxlIGV4dHJhY3RpbmcgbG9jYWxlcyBmcm9tIGluY2x1ZGVkIGZlYXR1cmUgIiArIGZlYXR1cmVVUkwpOy8vJE5PTi1OTFMtMSQJCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLk9LLCAiRXJyb3Igd2hpbGUgZXh0cmFjdGluZyBsb2NhbGVzIGZyb20gaW5jbHVkZWQgZmVhdHVyZSAiICsgZmVhdHVyZVVSTCwgZSkpOyAvLyROT04tTkxTLTEkIAotCQkJCX0KLQkJCQlmZWF0dXJlTGlzdC5hZGQoZmVhdHVyZVVSTCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmVhdHVyZUxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRmVhdHVyZUFscmVhZHlJbkxpc3QoTGlzdCBmZWF0dXJlTGlzdCwgU3RyaW5nIGZlYXR1cmVVUkwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlTGlzdC5zaXplKCk7IGkrKykgewotCQkJU3RyaW5nIGN1cnJlbnRGZWF0dXJlVVJMID0gKFN0cmluZylmZWF0dXJlTGlzdC5nZXQoaSk7Ci0JCQlpZiAoY3VycmVudEZlYXR1cmVVUkwuZXF1YWxzKGZlYXR1cmVVUkwpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgTWFwIGxvYWRQcm9wZXJ0aWVzKEphckZpbGUgZmVhdHVyZUphciwgU3RyaW5nIGZlYXR1cmVKYXJGaWxlTmFtZSwKLQkJCU1hcCBwZXJGZWF0dXJlTG9jYWxlcykgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oCi0JCS8vICgoTGlzdClwZXJGZWF0dXJlTG9jYWxlcy5nZXQoZmVhdHVyZUphckZpbGVOYW1lKSkuc2l6ZSgpKTsKLQkJSXRlcmF0b3IgaXQgPSAoKExpc3QpIHBlckZlYXR1cmVMb2NhbGVzLmdldChmZWF0dXJlSmFyRmlsZU5hbWUpKQotCQkuaXRlcmF0b3IoKTsKLQkJTWFwIHJlc3VsdCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBwcm9wZXJ0eUZpbGVOYW1lID0gKFN0cmluZykgaXQubmV4dCgpOwotCi0JCQlaaXBFbnRyeSBmZWF0dXJlUHJvcGVydGllc0VudHJ5ID0gZmVhdHVyZUphcgotCQkJLmdldEVudHJ5KHByb3BlcnR5RmlsZU5hbWUpOwotCQkJUHJvcGVydGllcyBmZWF0dXJlUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQlpZiAoZmVhdHVyZVByb3BlcnRpZXNFbnRyeSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZmVhdHVyZVByb3BlcnRpZXMubG9hZChmZWF0dXJlSmFyCi0JCQkJCQkJLmdldElucHV0U3RyZWFtKGZlYXR1cmVQcm9wZXJ0aWVzRW50cnkpKTsKLQkJCQkJU3RyaW5nIGxvY2FsZVN0cmluZyA9IG51bGw7Ci0JCQkJCWlmIChwcm9wZXJ0eUZpbGVOYW1lLmVuZHNXaXRoKCJmZWF0dXJlLnByb3BlcnRpZXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlsb2NhbGVTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGVsc2UgewotCQkJCQkJbG9jYWxlU3RyaW5nID0gcHJvcGVydHlGaWxlTmFtZS5zdWJzdHJpbmcoOCwKLQkJCQkJCQkJcHJvcGVydHlGaWxlTmFtZS5pbmRleE9mKCcuJykpOwotCQkJCQl9Ci0JCQkJCXJlc3VsdC5wdXQobG9jYWxlU3RyaW5nLCBmZWF0dXJlUHJvcGVydGllcyk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuSW5wdXRTdHJlbWFzKE1hcCBhdmFpbGFibGVMb2NhbGVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJdGVyYXRvciBsb2NhbGVzID0gYXZhaWxhYmxlTG9jYWxlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAobG9jYWxlcy5oYXNOZXh0KCkpIHsKLQkJCUF2YWlsYWJsZUxvY2FsZSBhdmFpbGFibGVMb2NhbGUgPSAoQXZhaWxhYmxlTG9jYWxlKSBsb2NhbGVzLm5leHQoKTsKLQkJCWF2YWlsYWJsZUxvY2FsZS5vcGVuTG9jYWxpemVkT3V0cHV0U3RyZWFtKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE1hcCBnZXRBdmFpbGFibGVMb2NhbGVzKExpc3QgZmVhdHVyZUxpc3QsIE1hcCBwZXJGZWF0dXJlTG9jYWxlcykgewotCQlJdGVyYXRvciBmZWF0dXJlcyA9IGZlYXR1cmVMaXN0Lml0ZXJhdG9yKCk7Ci0JCU1hcCBsb2NhbGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJd2hpbGUgKGZlYXR1cmVzLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGZlYXR1cmUgPSAoU3RyaW5nKSBmZWF0dXJlcy5uZXh0KCk7Ci0JCQl0cnkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXh0cmFjdGluZyBsb2NhbGVzIGZyb20gIiArIGZlYXR1cmUpOyAvLyROT04tTkxTLTEkCi0JCQkJcHJvY2Vzc0xvY2FsZXNJbkphcihsb2NhbGVzLCBmZWF0dXJlLCBwZXJGZWF0dXJlTG9jYWxlcywgZmFsc2UpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igd2hpbGUgZXh0cmFjdGluZyBsb2NhbGVzIGZyb20gIiAvLyROT04tTkxTLTEkCi0JCQkJCQkrIGZlYXR1cmUpOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxvY2FsZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NMb2NhbGVzSW5KYXIoTWFwIGxvY2FsZXMsIFN0cmluZyBmZWF0dXJlLAotCQkJTWFwIHBlckZlYXR1cmVMb2NhbGVzLCBib29sZWFuIGlnbm9yZU5ld0xvY2FsZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJSmFyRmlsZSBqYXIgPSBuZXcgSmFyRmlsZShmZWF0dXJlKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGZlYXR1cmUpOwotCQlFbnVtZXJhdGlvbiBmaWxlcyA9IGphci5lbnRyaWVzKCk7Ci0KLQkJTGlzdCBsb2NhbGVzVGVtcCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcGVyRmVhdHVyZUxvY2FsZXMucHV0KGZlYXR1cmUsIGxvY2FsZXNUZW1wKTsKLQotCQl3aGlsZSAoZmlsZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVppcEVudHJ5IGZpbGUgPSAoWmlwRW50cnkpIGZpbGVzLm5leHRFbGVtZW50KCk7Ci0JCQlTdHJpbmcgbG9jYWxlU3RyaW5nID0gbnVsbDsKLQkJCVN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInByb2Nlc3NMb2NhbGVzSW5KYXI6IituYW1lKTsKLQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoImZlYXR1cmUiKSAmJiBuYW1lLmVuZHNXaXRoKCIucHJvcGVydGllcyIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihuYW1lKTsKLQkJCQlsb2NhbGVzVGVtcC5hZGQobmFtZSk7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKG5hbWUpOwotCQkJCWlmIChuYW1lLmVuZHNXaXRoKCJmZWF0dXJlLnByb3BlcnRpZXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWxvY2FsZVN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIHsKLQkJCQkJbG9jYWxlU3RyaW5nID0gbmFtZS5zdWJzdHJpbmcoOCwgbmFtZS5pbmRleE9mKCcuJykpOwotCQkJCX0KLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4obmFtZSArIjo6OjpcIiIgKyBsb2NhbGVTdHJpbmcgKyAiXCIiKTsKLQkJCQlpZiAoICFpZ25vcmVOZXdMb2NhbGVzICYmICFsb2NhbGVzLmNvbnRhaW5zS2V5KGxvY2FsZVN0cmluZykpIHsKLQkJCQkJbG9jYWxlcy5wdXQobG9jYWxlU3RyaW5nLCBuZXcgQXZhaWxhYmxlTG9jYWxlKGxvY2FsZVN0cmluZykpOwotCQkJCX0KLQkJCQlpZiAobG9jYWxlcy5jb250YWluc0tleShsb2NhbGVTdHJpbmcpKSB7Ci0JCQkJCUF2YWlsYWJsZUxvY2FsZSBjdXJyZW50TG9jYWxlID0gKEF2YWlsYWJsZUxvY2FsZSkgbG9jYWxlcy5nZXQobG9jYWxlU3RyaW5nKTsKLQkJCQkJY3VycmVudExvY2FsZS5hZGRGZWF0dXJlcyhmZWF0dXJlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRGZWF0dXJlTGlzdChNYXAgcGFyYW1zKSB7Ci0JCWlmIChwYXJhbXMuY29udGFpbnNLZXkoU0lURV9YTUwpCi0JCQkJJiYgKGZpbGVFeGlzdHMoKFN0cmluZykgcGFyYW1zLmdldChTSVRFX1hNTCkpKSkgewotCQkJcmV0dXJuIGdldEZlYXR1cmVMaXN0RnJvbVNpdGVYTUwoKFN0cmluZykgcGFyYW1zLmdldChTSVRFX1hNTCkpOwotCQl9IGVsc2UgaWYgKHBhcmFtcy5jb250YWluc0tleShJTlBVVCkKLQkJCQkmJiBpc0RpcmVjdG9yeSgoU3RyaW5nKSBwYXJhbXMKLQkJCQkJCS5nZXQoU2l0ZU9wdGltaXplckFwcGxpY2F0aW9uLklOUFVUKSkpIHsKLQkJCXJldHVybiBnZXRGZWF0dXJlTGlzdEZyb21EaXJlY3RvcnkoKFN0cmluZykgcGFyYW1zLmdldChJTlBVVCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBmaWxlRXhpc3RzKFN0cmluZyBmaWxlTmFtZSkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImZpbGVFeGlzdHM6IitmaWxlTmFtZSk7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJaWYgKChmaWxlICE9IG51bGwpICYmIGZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRGZWF0dXJlTGlzdEZyb21EaXJlY3RvcnkoU3RyaW5nIGRpcmVjdG9yeU5hbWUpIHsKLQkJTGlzdCBmZWF0dXJlc1VSTHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUoZGlyZWN0b3J5TmFtZSk7Ci0JCVN0cmluZ1tdIGZlYXR1cmVKYXJGaWxlTmFtZXMgPSBkaXJlY3RvcnkubGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVKYXJGaWxlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCWZlYXR1cmVzVVJMcy5hZGQoZGlyZWN0b3J5TmFtZSArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCSsgZmVhdHVyZUphckZpbGVOYW1lc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGZlYXR1cmVzVVJMczsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEaXJlY3RvcnkoU3RyaW5nIGZpbGVOYW1lKSB7Ci0KLQkJRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCWlmICgoZGlyZWN0b3J5ICE9IG51bGwpICYmIGRpcmVjdG9yeS5leGlzdHMoKQotCQkJCSYmIGRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0RmVhdHVyZUxpc3RGcm9tU2l0ZVhNTChTdHJpbmcgc2l0ZVhNTCkgewotCi0JCUxpc3QgZmVhdHVyZXNVUkxzID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmcgZGlyZWN0b3J5TmFtZSA9IChuZXcgRmlsZShzaXRlWE1MKSkuZ2V0UGFyZW50KCk7Ci0JCWlmICghZGlyZWN0b3J5TmFtZS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLQkJCWRpcmVjdG9yeU5hbWUgPSBkaXJlY3RvcnlOYW1lICsgRmlsZS5zZXBhcmF0b3I7Ci0JCX0KLQotCQlEZWZhdWx0U2l0ZVBhcnNlciBzaXRlUGFyc2VyID0gbmV3IERlZmF1bHRTaXRlUGFyc2VyKCk7Ci0JCXNpdGVQYXJzZXIuaW5pdChuZXcgRXh0ZW5kZWRTaXRlVVJMRmFjdG9yeSgpKTsKLQotCQl0cnkgewotCQkJU2l0ZU1vZGVsIHNpdGUgPSBzaXRlUGFyc2VyLnBhcnNlKG5ldyBGaWxlSW5wdXRTdHJlYW0oc2l0ZVhNTCkpOwotCQkJaWYoc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCkubGVuZ3RoID4gMCkgewotCQkJCXNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpWzBdLmdldFVSTFN0cmluZygpOwotCQkJCUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGZlYXR1cmVSZWZlcmVuY2VNb2RlbCA9IHNpdGUKLQkJCQkuZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZVJlZmVyZW5jZU1vZGVsLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWZlYXR1cmVzVVJMcy5hZGQoZGlyZWN0b3J5TmFtZQotCQkJCQkJCSsgZmVhdHVyZVJlZmVyZW5jZU1vZGVsW2ldLmdldFVSTFN0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmVhdHVyZXNVUkxzOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaWxlIG5vdCBmb3VuZDogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUGFyc2luZyBwcm9ibGVtOiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0gd2hpbGUgcGFyc2luZzogIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGxhdGZvcm1SdW5uYWJsZSNydW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHJ1bihPYmplY3QgYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBsYXRmb3JtLmVuZFNwbGFzaCgpOwotCQlpZiAoYXJncyA9PSBudWxsKQotCQkJcmV0dXJuIEVYSVRfRVJST1I7Ci0JCWlmIChhcmdzIGluc3RhbmNlb2YgU3RyaW5nW10pIHsKLQkJCU1hcCBwYXJhbXMgPSBwYXJzZUNtZExpbmUoKFN0cmluZ1tdKSBhcmdzKTsKLQkJCWlmIChwYXJhbXMuY29udGFpbnNLZXkoSkFSX1BST0NFU1NPUikpIHsKLQkJCQlpZiAoIXJ1bkphclByb2Nlc3NvcihwYXJhbXMpKQotCQkJCQlyZXR1cm4gRVhJVF9FUlJPUjsKLQkJCX0KLQotCQkJaWYgKHBhcmFtcy5jb250YWluc0tleShESUdFU1RfQlVJTERFUikpIHsKLQkJCQlpZiAoIXJ1bkRpZ2VzdEJ1aWxkZXIocGFyYW1zKSkKLQkJCQkJcmV0dXJuIEVYSVRfRVJST1I7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIElQbGF0Zm9ybVJ1bm5hYmxlLkVYSVRfT0s7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBBdmFpbGFibGVMb2NhbGUgewotCi0JCXByaXZhdGUgU3RyaW5nIFBSRUZJWCA9ICJ0ZW1wIjsgLy8kTk9OLU5MUy0xJAotCi0JCXByaXZhdGUgU3RyaW5nIGxvY2FsZTsKLQotCQlwcml2YXRlIE1hcCAvKiBWZXJzaW9uZWRJZGVudGlmaWVyICovZmVhdHVyZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCXByaXZhdGUgUHJpbnRXcml0ZXIgbG9jYWxpemVkUHJpbnRXcml0ZXI7Ci0KLQkJcHJpdmF0ZSBGaWxlIHRlbXBEaWdlc3REaXJlY3Rvcnk7Ci0KLQkJcHVibGljIHZvaWQgZmluaXNoRGlnZXN0KFN0cmluZyBvdXRwdXREaXJlY3RvcnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlsb2NhbGl6ZWRQcmludFdyaXRlci5wcmludGxuKCI8L2RpZ2VzdD4iKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGxvY2FsaXplZFByaW50V3JpdGVyICE9IG51bGwpIHsKLQkJCQlsb2NhbGl6ZWRQcmludFdyaXRlci5jbG9zZSgpOwotCQkJfQotCi0JCQlGaWxlIGRpZ2VzdCA9IG5ldyBGaWxlKG91dHB1dERpcmVjdG9yeSArIEZpbGUuc2VwYXJhdG9yICsgImRpZ2VzdCIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIChsb2NhbGUgPT0gbnVsbCB8fCBsb2NhbGUuZXF1YWxzKCIiKSA/ICIiIDogIl8iK2xvY2FsZSkgKyAiLnppcCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZGlnZXN0LmdldEFic29sdXRlUGF0aCgpKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihkaWdlc3QuZ2V0TmFtZSgpKTsKLQkJCWlmIChkaWdlc3QuZXhpc3RzKCkpIHsKLQkJCQlkaWdlc3QuZGVsZXRlKCk7Ci0JCQl9Ci0JCQlkaWdlc3QuY3JlYXRlTmV3RmlsZSgpOwotCQkJT3V0cHV0U3RyZWFtIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGlnZXN0KTsKLQkJCUphck91dHB1dFN0cmVhbSBqb3MgPSBuZXcgSmFyT3V0cHV0U3RyZWFtKG9zKTsKLQkJCWpvcy5wdXROZXh0RW50cnkobmV3IFppcEVudHJ5KCJkaWdlc3QueG1sIikpOyAvLyROT04tTkxTLTEkCi0JCQlJbnB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGVtcERpZ2VzdERpcmVjdG9yeSk7Ci0JCQlieXRlW10gYiA9IG5ldyBieXRlWzQwOTZdOwotCQkJaW50IGJ5dGVzUmVhZCA9IDA7Ci0JCQlkbyB7Ci0JCQkJYnl0ZXNSZWFkID0gaXMucmVhZChiKTsKLQkJCQlpZiAoYnl0ZXNSZWFkID4gMCkgewotCQkJCQlqb3Mud3JpdGUoYiwgMCwgYnl0ZXNSZWFkKTsKLQkJCQl9Ci0JCQl9IHdoaWxlIChieXRlc1JlYWQgPiAwKTsKLQotCQkJam9zLmNsb3NlRW50cnkoKTsKLQkJCWpvcy5jbG9zZSgpOwotCQkJb3MuY2xvc2UoKTsKLQkJCWlzLmNsb3NlKCk7Ci0JCQl0ZW1wRGlnZXN0RGlyZWN0b3J5LmRlbGV0ZSgpOwotCi0JCX0KLQotCQlwdWJsaWMgQXZhaWxhYmxlTG9jYWxlKFN0cmluZyBsb2NhbGUpIHsKLQkJCXRoaXMubG9jYWxlID0gbG9jYWxlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkRmVhdHVyZXMoU3RyaW5nIGZlYXR1cmUpIHsKLQkJCWZlYXR1cmVzLnB1dChmZWF0dXJlLCBmZWF0dXJlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG9wZW5Mb2NhbGl6ZWRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJdGVtcERpZ2VzdERpcmVjdG9yeSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoUFJFRklYLCBudWxsKTsKLQkJCUZpbGVPdXRwdXRTdHJlYW0gZnN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBEaWdlc3REaXJlY3RvcnkpOwotCQkJbG9jYWxpemVkUHJpbnRXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihmc3RyZWFtLCAiVVRGLTgiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWxvY2FsaXplZFByaW50V3JpdGVyCi0JCQkucHJpbnRsbigiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4gPGRpZ2VzdD4iKTsgLy8kTk9OLU5MUy0xJAotCQkJdGVtcERpZ2VzdERpcmVjdG9yeS5kZWxldGVPbkV4aXQoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlyZXR1cm4gbG9jYWxlLmhhc2hDb2RlKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCi0JCQlpZiAodGhpcyA9PSBvYmopCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZmluYWwgQXZhaWxhYmxlTG9jYWxlIG90aGVyID0gKEF2YWlsYWJsZUxvY2FsZSkgb2JqOwotCQkJaWYgKGxvY2FsZSA9PSBudWxsKSB7Ci0JCQkJaWYgKG90aGVyLmxvY2FsZSAhPSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgaWYgKCFsb2NhbGUuZXF1YWxzKG90aGVyLmxvY2FsZSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3cml0ZUZlYXR1cmVEaWdlc3RzKEZlYXR1cmVNb2RlbCBmZWF0dXJlTW9kZWwsCi0JCQkJTWFwIGZlYXR1cmVQcm9wZXJ0aWVzKSB7Ci0KLQkJCWlmICh0aGlzLmxvY2FsZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl3cml0ZUZlYXR1cmVEaWdlc3QobG9jYWxpemVkUHJpbnRXcml0ZXIsIGZlYXR1cmVNb2RlbCwKLQkJCQkJCShQcm9wZXJ0aWVzKSBmZWF0dXJlUHJvcGVydGllcy5nZXQoIiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCVByb3BlcnRpZXMgdGVtcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQlpZiAobG9jYWxlLmluZGV4T2YoIl8iKSA8IDApIHsgLy8kTk9OLU5MUy0xJAotCQkJCXRlbXAgPSBjb21iaW5lUHJvcGVydGllcygKLQkJCQkJCShQcm9wZXJ0aWVzKSBmZWF0dXJlUHJvcGVydGllcy5nZXQoIiIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkoUHJvcGVydGllcykgZmVhdHVyZVByb3BlcnRpZXMuZ2V0KGxvY2FsZSksIG51bGwpOwotCQkJCXdyaXRlRmVhdHVyZURpZ2VzdChsb2NhbGl6ZWRQcmludFdyaXRlciwgZmVhdHVyZU1vZGVsLCB0ZW1wKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGVtcCA9IGNvbWJpbmVQcm9wZXJ0aWVzKAotCQkJCQkJKFByb3BlcnRpZXMpIGZlYXR1cmVQcm9wZXJ0aWVzLmdldCgiIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCShQcm9wZXJ0aWVzKSBmZWF0dXJlUHJvcGVydGllcy5nZXQobG9jYWxlLnN1YnN0cmluZygwLCBsb2NhbGUuaW5kZXhPZigiXyIpKSksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCShQcm9wZXJ0aWVzKSBmZWF0dXJlUHJvcGVydGllcy5nZXQobG9jYWxlKSApOwotCQkJCXdyaXRlRmVhdHVyZURpZ2VzdChsb2NhbGl6ZWRQcmludFdyaXRlciwgZmVhdHVyZU1vZGVsLCB0ZW1wKTsKLQkJCX0KLQotCQl9Ci0JCQotCQkvKioKLQkJICogQHBhcmFtIGRlZmF1bHRzCVNob3VsZCBiZSBsYW5nX2NvdW50cnkKLQkJICogQHBhcmFtIHNlY29uZGFyeQlTaG91bGQgYmUgbGFuZwotCQkgKiBAcGFyYW0gcHJlZmVycmVkCVNob3VsZCBiZSBkZWZhdWx0Ci0JCSAqIEByZXR1cm4KLQkJICovCi0KLQkJcHJpdmF0ZSBQcm9wZXJ0aWVzIGNvbWJpbmVQcm9wZXJ0aWVzKFByb3BlcnRpZXMgZGVmYXVsdHMsCi0JCQkJUHJvcGVydGllcyBzZWNvbmRhcnksIFByb3BlcnRpZXMgcHJlZmVycmVkKSB7Ci0JCQlyZXR1cm4gbmV3IENvbWJpbmVkUHJvcGVydGllcyhwcmVmZXJyZWQsIHNlY29uZGFyeSwgZGVmYXVsdHMpOwotCi0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUZlYXR1cmVEaWdlc3QoUHJpbnRXcml0ZXIgZGlnZXN0LAotCQkJRmVhdHVyZU1vZGVsIGZlYXR1cmVNb2RlbCwgUHJvcGVydGllcyBmZWF0dXJlUHJvcGVydGllcykgewotCi0JCVN0cmluZyBsYWJlbCA9IG51bGw7Ci0JCVN0cmluZyBwcm92aWRlciA9IG51bGw7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7Ci0JCVN0cmluZyBsaWNlbnNlID0gbnVsbDsKLQkJU3RyaW5nIGNvcHlyaWdodCA9IG51bGw7Ci0KLQkJaWYgKChmZWF0dXJlUHJvcGVydGllcyAhPSBudWxsKQotCQkJCSYmIGZlYXR1cmVNb2RlbC5nZXRMYWJlbCgpLnN0YXJ0c1dpdGgoIiUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlsYWJlbCA9IGZlYXR1cmVQcm9wZXJ0aWVzLmdldFByb3BlcnR5KGZlYXR1cmVNb2RlbC5nZXRMYWJlbCgpCi0JCQkJCS5zdWJzdHJpbmcoMSkpOwotCQl9IGVsc2UgewotCQkJbGFiZWwgPSBmZWF0dXJlTW9kZWwuZ2V0TGFiZWwoKTsKLQkJfQotCQlpZiAoKGZlYXR1cmVQcm9wZXJ0aWVzICE9IG51bGwpCi0JCQkJJiYgKGZlYXR1cmVNb2RlbC5nZXREZXNjcmlwdGlvbk1vZGVsKCkgIT0gbnVsbCkKLQkJCQkmJiAoZmVhdHVyZU1vZGVsLmdldERlc2NyaXB0aW9uTW9kZWwoKS5nZXRBbm5vdGF0aW9uKCkgIT0gbnVsbCkKLQkJCQkmJiBmZWF0dXJlTW9kZWwuZ2V0RGVzY3JpcHRpb25Nb2RlbCgpLmdldEFubm90YXRpb24oKQotCQkJCS5zdGFydHNXaXRoKCIlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGZlYXR1cmVQcm9wZXJ0aWVzLmdldFByb3BlcnR5KGZlYXR1cmVNb2RlbC5nZXREZXNjcmlwdGlvbk1vZGVsKCkuZ2V0QW5ub3RhdGlvbigpLnN1YnN0cmluZygxKSkpOwotCQkJZGVzY3JpcHRpb24gPSBmZWF0dXJlUHJvcGVydGllcy5nZXRQcm9wZXJ0eShmZWF0dXJlTW9kZWwKLQkJCQkJLmdldERlc2NyaXB0aW9uTW9kZWwoKS5nZXRBbm5vdGF0aW9uKCkuc3Vic3RyaW5nKDEpKTsKLQkJfSBlbHNlIHsKLQkJCVVSTEVudHJ5TW9kZWwgZGVzY3JpcHRpb25Nb2RlbCA9IGZlYXR1cmVNb2RlbC5nZXREZXNjcmlwdGlvbk1vZGVsKCk7Ci0JCQlpZiggZGVzY3JpcHRpb25Nb2RlbCA9PSBudWxsICkKLQkJCQlkZXNjcmlwdGlvbiA9ICIiOwotCQkJZWxzZQotCQkJCWRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb25Nb2RlbC5nZXRBbm5vdGF0aW9uKCk7Ci0JCX0KLQkJU3RyaW5nIHB2YWx1ZSA9IGZlYXR1cmVNb2RlbC5nZXRQcm92aWRlcigpOwotCQlpZiAoKGZlYXR1cmVQcm9wZXJ0aWVzICE9IG51bGwpCi0JCQkJJiYgcHZhbHVlIT1udWxsICYmIHB2YWx1ZS5zdGFydHNXaXRoKCIlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvdmlkZXIgPSBmZWF0dXJlUHJvcGVydGllcy5nZXRQcm9wZXJ0eShmZWF0dXJlTW9kZWwuZ2V0UHJvdmlkZXIoKQotCQkJCQkuc3Vic3RyaW5nKDEpKTsKLQkJfSBlbHNlIHsKLQkJCXByb3ZpZGVyID0gcHZhbHVlOwotCQl9Ci0JCWlmIChwcm92aWRlcj09bnVsbCkgcHJvdmlkZXIgPSAiIjsKLQotCQlpZiAoKChmZWF0dXJlUHJvcGVydGllcyAhPSBudWxsKSAmJiBmZWF0dXJlTW9kZWwuZ2V0Q29weXJpZ2h0TW9kZWwoKSAhPSBudWxsKQotCQkJCSYmIGZlYXR1cmVNb2RlbC5nZXRDb3B5cmlnaHRNb2RlbCgpLmdldEFubm90YXRpb24oKS5zdGFydHNXaXRoKAotCQkJCSIlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJY29weXJpZ2h0ID0gZmVhdHVyZVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoZmVhdHVyZU1vZGVsCi0JCQkJCS5nZXRDb3B5cmlnaHRNb2RlbCgpLmdldEFubm90YXRpb24oKS5zdWJzdHJpbmcoMSkpOwotCQl9IGVsc2UgewotCQkJaWYgKGZlYXR1cmVNb2RlbC5nZXRDb3B5cmlnaHRNb2RlbCgpICE9IG51bGwpIHsKLQkJCQljb3B5cmlnaHQgPSBmZWF0dXJlTW9kZWwuZ2V0Q29weXJpZ2h0TW9kZWwoKS5nZXRBbm5vdGF0aW9uKCk7Ci0JCQl9IGVsc2UgewotCQkJCWNvcHlyaWdodCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoKGZlYXR1cmVQcm9wZXJ0aWVzICE9IG51bGwpCi0JCQkJJiYgKGZlYXR1cmVNb2RlbC5nZXRMaWNlbnNlTW9kZWwoKSAhPSBudWxsKQotCQkJCSYmIGZlYXR1cmVNb2RlbC5nZXRMaWNlbnNlTW9kZWwoKS5nZXRBbm5vdGF0aW9uKCkuc3RhcnRzV2l0aCgKLQkJCQkiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWxpY2Vuc2UgPSBmZWF0dXJlUHJvcGVydGllcy5nZXRQcm9wZXJ0eShmZWF0dXJlTW9kZWwKLQkJCQkJLmdldExpY2Vuc2VNb2RlbCgpLmdldEFubm90YXRpb24oKS5zdWJzdHJpbmcoMSkpOwotCQl9IGVsc2UgewotCQkJbGljZW5zZSA9IGZlYXR1cmVNb2RlbC5nZXRMaWNlbnNlTW9kZWwoKS5nZXRBbm5vdGF0aW9uKCk7Ci0JCX0KLQotCQlkaWdlc3QucHJpbnQoIjxmZWF0dXJlICIpOyAvLyROT04tTkxTLTEkCi0JCWRpZ2VzdC5wcmludCgibGFiZWw9XCIiICsgZ2V0VVRGOFN0cmluZyhsYWJlbCkgKyAiXCIgIik7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQlkaWdlc3QucHJpbnQoInByb3ZpZGVyLW5hbWU9XCIiICsgZ2V0VVRGOFN0cmluZyhwcm92aWRlcikgKyAiXCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlkaWdlc3QucHJpbnQoImlkPVwiIiArIGZlYXR1cmVNb2RlbC5nZXRGZWF0dXJlSWRlbnRpZmllcigpICsgIlwiICIpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJZGlnZXN0LnByaW50KCJ2ZXJzaW9uPVwiIiArIGZlYXR1cmVNb2RlbC5nZXRGZWF0dXJlVmVyc2lvbigpICsgIlwiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKGZlYXR1cmVNb2RlbC5nZXRPUygpICE9IG51bGwpCi0JCQlkaWdlc3QucHJpbnQoIm9zPVwiIiArIGZlYXR1cmVNb2RlbC5nZXRPUygpICsgIlwiICIpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJaWYgKGZlYXR1cmVNb2RlbC5nZXROTCgpICE9IG51bGwpCi0JCQlkaWdlc3QucHJpbnQoIm5sPVwiIiArIGZlYXR1cmVNb2RlbC5nZXROTCgpICsgIlwiICIpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJaWYgKGZlYXR1cmVNb2RlbC5nZXRXUygpICE9IG51bGwpCi0JCQlkaWdlc3QucHJpbnQoIndzPVwiIiArIGZlYXR1cmVNb2RlbC5nZXRXUygpICsgIlwiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKGZlYXR1cmVNb2RlbC5nZXRPU0FyY2goKSAhPSBudWxsKQotCQkJZGlnZXN0LnByaW50KCJhcmNoPVwiIiArIGZlYXR1cmVNb2RlbC5nZXRPU0FyY2goKSArICJcIiAiKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWlmIChmZWF0dXJlTW9kZWwuaXNFeGNsdXNpdmUoKSkKLQkJCWRpZ2VzdC5wcmludCgiZXhjbHVzaXZlPVwiIiArIGZlYXR1cmVNb2RlbC5pc0V4Y2x1c2l2ZSgpICsgIlwiICIpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQotCQlpZiAoKChmZWF0dXJlTW9kZWwuZ2V0SW1wb3J0TW9kZWxzKCkgPT0gbnVsbCkgfHwgKGZlYXR1cmVNb2RlbAotCQkJCS5nZXRJbXBvcnRNb2RlbHMoKS5sZW5ndGggPT0gMCkpCi0JCQkJJiYgKChmZWF0dXJlTW9kZWwuZ2V0RGVzY3JpcHRpb25Nb2RlbCgpID09IG51bGwpCi0JCQkJCQl8fCAoZmVhdHVyZU1vZGVsLmdldERlc2NyaXB0aW9uTW9kZWwoKS5nZXRBbm5vdGF0aW9uKCkgPT0gbnVsbCkgfHwgKGZlYXR1cmVNb2RlbAotCQkJCQkJCQkuZ2V0RGVzY3JpcHRpb25Nb2RlbCgpLmdldEFubm90YXRpb24oKS50cmltKCkubGVuZ3RoKCkgPT0gMCkpCi0JCQkJCQkJCSYmICgoZmVhdHVyZU1vZGVsLmdldENvcHlyaWdodE1vZGVsKCkgPT0gbnVsbCkKLQkJCQkJCQkJCQl8fCAoZmVhdHVyZU1vZGVsLmdldENvcHlyaWdodE1vZGVsKCkuZ2V0QW5ub3RhdGlvbigpID09IG51bGwpIHx8IChmZWF0dXJlTW9kZWwKLQkJCQkJCQkJCQkJCS5nZXRDb3B5cmlnaHRNb2RlbCgpLmdldEFubm90YXRpb24oKS50cmltKCkubGVuZ3RoKCkgPT0gMCkpCi0JCQkJCQkJCQkJCQkmJiAoKGZlYXR1cmVNb2RlbC5nZXRMaWNlbnNlTW9kZWwoKSA9PSBudWxsKQotCQkJCQkJCQkJCQkJCQl8fCAoZmVhdHVyZU1vZGVsLmdldExpY2Vuc2VNb2RlbCgpLmdldEFubm90YXRpb24oKSA9PSBudWxsKSB8fCAoZmVhdHVyZU1vZGVsCi0JCQkJCQkJCQkJCQkJCQkJLmdldExpY2Vuc2VNb2RlbCgpLmdldEFubm90YXRpb24oKS50cmltKCkubGVuZ3RoKCkgPT0gMCkpIAotCQkJCQkJCQkJCQkJCQkJCSYmICgoZmVhdHVyZU1vZGVsLmdldEZlYXR1cmVJbmNsdWRlZCgpID09IG51bGwpIHx8IChmZWF0dXJlTW9kZWwKLQkJCQkJCQkJCQkJCQkJCQkJCS5nZXRGZWF0dXJlSW5jbHVkZWQoKS5sZW5ndGggPT0gMCkpKXsKLQkJCWRpZ2VzdC5wcmludGxuKCIvPiAiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJZGlnZXN0LnByaW50bG4oIj4gIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChmZWF0dXJlTW9kZWwuZ2V0SW1wb3J0TW9kZWxzKCkubGVuZ3RoID4gMCkgewotCi0JCQkJZGlnZXN0LnByaW50bG4oIlx0PHJlcXVpcmVzPiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCUltcG9ydE1vZGVsW10gaW1wb3J0cyA9IGZlYXR1cmVNb2RlbC5nZXRJbXBvcnRNb2RlbHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGltcG9ydHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJZGlnZXN0LnByaW50KCJcdFx0PGltcG9ydCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoaW1wb3J0c1tqXS5pc0ZlYXR1cmVJbXBvcnQoKSkgewotCQkJCQkJZGlnZXN0LnByaW50KCJmZWF0dXJlPVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWRpZ2VzdC5wcmludCgicGx1Z2luPVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlkaWdlc3QucHJpbnQoaW1wb3J0c1tqXS5nZXRJZGVudGlmaWVyKCkgKyAiXCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZGlnZXN0LnByaW50KCJ2ZXJzaW9uPVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZGlnZXN0LnByaW50KGltcG9ydHNbal0uZ2V0VmVyc2lvbigpICsgIlwiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWRpZ2VzdC5wcmludCgibWF0Y2g9XCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlkaWdlc3QucHJpbnQoaW1wb3J0c1tqXS5nZXRNYXRjaGluZ1J1bGVOYW1lKCkgKyAiXCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGltcG9ydHNbal0uaXNQYXRjaCgpKSB7Ci0JCQkJCQlkaWdlc3QucHJpbnQoInBhdGNoPVwidHJ1ZVwiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZGlnZXN0LnByaW50bG4oIiAvPiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCi0JCQkJZGlnZXN0LnByaW50bG4oIlx0PC9yZXF1aXJlcz4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQl9Ci0KLQkJCWlmICgoZmVhdHVyZU1vZGVsLmdldERlc2NyaXB0aW9uTW9kZWwoKSAhPSBudWxsKQotCQkJCQkmJiAoZmVhdHVyZU1vZGVsLmdldERlc2NyaXB0aW9uTW9kZWwoKS5nZXRBbm5vdGF0aW9uKCkgIT0gbnVsbCkKLQkJCQkJJiYgKGZlYXR1cmVNb2RlbC5nZXREZXNjcmlwdGlvbk1vZGVsKCkuZ2V0QW5ub3RhdGlvbigpCi0JCQkJCQkJLnRyaW0oKS5sZW5ndGgoKSAhPSAwKSkgewotCQkJCWRpZ2VzdC5wcmludGxuKCJcdDxkZXNjcmlwdGlvbj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWRpZ2VzdC5wcmludGxuKCJcdFx0IiArIFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRXcml0YWJsZVhNTFN0cmluZyhkZXNjcmlwdGlvbikpOyAvLyROT04tTkxTLTEkCi0JCQkJZGlnZXN0LnByaW50bG4oIlx0PC9kZXNjcmlwdGlvbj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAoZmVhdHVyZU1vZGVsLmdldENvcHlyaWdodE1vZGVsKCkgIT0gbnVsbCkgewotCQkJCWlmIChmZWF0dXJlTW9kZWwuZ2V0Q29weXJpZ2h0TW9kZWwoKS5nZXRBbm5vdGF0aW9uKCkgIT0gbnVsbCkgewotCQkJCQkvLyBpZgotCQkJCQkvLyAoZmVhdHVyZU1vZGVsLmdldERlc2NyaXB0aW9uTW9kZWwoKS5nZXRBbm5vdGF0aW9uKCkubGVuZ3RoKCkKLQkJCQkJLy8gIT0gMCkgewotCQkJCQlkaWdlc3QucHJpbnRsbigiXHQ8Y29weXJpZ2h0PiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWRpZ2VzdC5wcmludGxuKCJcdFx0IiArIFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRXcml0YWJsZVhNTFN0cmluZyhjb3B5cmlnaHQpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlkaWdlc3QucHJpbnRsbigiXHQ8L2NvcHlyaWdodD4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyB9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoKGZlYXR1cmVNb2RlbC5nZXRMaWNlbnNlTW9kZWwoKSAhPSBudWxsKQotCQkJCQkmJiAoZmVhdHVyZU1vZGVsLmdldExpY2Vuc2VNb2RlbCgpLmdldEFubm90YXRpb24oKSAhPSBudWxsKQotCQkJCQkmJiAoZmVhdHVyZU1vZGVsLmdldExpY2Vuc2VNb2RlbCgpLmdldEFubm90YXRpb24oKQotCQkJCQkJCS50cmltKCkubGVuZ3RoKCkgIT0gMCkpIHsKLQkJCQlkaWdlc3QucHJpbnRsbigiXHQ8bGljZW5zZT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWRpZ2VzdC5wcmludGxuKCJcdFx0IiArIFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRXcml0YWJsZVhNTFN0cmluZyhsaWNlbnNlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlkaWdlc3QucHJpbnRsbigiXHQ8L2xpY2Vuc2U+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJUGx1Z2luRW50cnlNb2RlbFtdIHBsdWdpbnMgPSBmZWF0dXJlTW9kZWwuZ2V0UGx1Z2luRW50cnlNb2RlbHMoKTsKLQkJCWlmICgocGx1Z2lucyAhPSBudWxsKSAmJiAocGx1Z2lucy5sZW5ndGggIT0gMCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZGlnZXN0LnByaW50KCJcdDxwbHVnaW4gIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZGlnZXN0LnByaW50KCJpZD1cIiIgKyBwbHVnaW5zW2ldLmdldFBsdWdpbklkZW50aWZpZXIoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyAiXCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZGlnZXN0LnByaW50KCJ2ZXJzaW9uPVwiIiArIHBsdWdpbnNbaV0uZ2V0UGx1Z2luVmVyc2lvbigpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrICJcIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAocGx1Z2luc1tpXS5nZXRPUygpICE9IG51bGwpCi0JCQkJCQlkaWdlc3QucHJpbnQoIm9zPVwiIiArIHBsdWdpbnNbaV0uZ2V0T1MoKSArICJcIiAiKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJCWlmIChwbHVnaW5zW2ldLmdldE5MKCkgIT0gbnVsbCkKLQkJCQkJCWRpZ2VzdC5wcmludCgibmw9XCIiICsgcGx1Z2luc1tpXS5nZXROTCgpICsgIlwiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJaWYgKHBsdWdpbnNbaV0uZ2V0V1MoKSAhPSBudWxsKQotCQkJCQkJZGlnZXN0LnByaW50KCJ3cz1cIiIgKyBwbHVnaW5zW2ldLmdldFdTKCkgKyAiXCIgIik7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJCQlpZiAocGx1Z2luc1tpXS5nZXRPU0FyY2goKSAhPSBudWxsKQotCQkJCQkJZGlnZXN0Ci0JCQkJCQkucHJpbnQoImFyY2g9XCIiICsgcGx1Z2luc1tpXS5nZXRPU0FyY2goKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgIlwiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChwbHVnaW5zW2ldLmdldERvd25sb2FkU2l6ZSgpID4gMCkKLQkJCQkJCWRpZ2VzdC5wcmludCgiZG93bmxvYWQtc2l6ZT1cIiIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkrIHBsdWdpbnNbaV0uZ2V0RG93bmxvYWRTaXplKCkgKyAiXCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKHBsdWdpbnNbaV0uZ2V0SW5zdGFsbFNpemUoKSA+IDApCi0JCQkJCQlkaWdlc3QucHJpbnQoImluc3RhbGwtc2l6ZT1cIiIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkrIHBsdWdpbnNbaV0uZ2V0SW5zdGFsbFNpemUoKSArICJcIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoIXBsdWdpbnNbaV0uaXNVbnBhY2soKSkKLQkJCQkJCWRpZ2VzdC5wcmludCgidW5wYWNrPVwiIiArIHBsdWdpbnNbaV0uaXNVbnBhY2soKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgIlwiICIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJZGlnZXN0LnByaW50bG4oIi8+ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQkKLQotCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGluY2x1ZGVkRmVhdHVyZXMgPSBmZWF0dXJlTW9kZWwuZ2V0RmVhdHVyZUluY2x1ZGVkKCk7Ci0KLQkJCWlmICgoaW5jbHVkZWRGZWF0dXJlcyAhPSBudWxsKSAmJiAoaW5jbHVkZWRGZWF0dXJlcy5sZW5ndGggIT0gMCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluY2x1ZGVkRmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWRpZ2VzdC5wcmludCgiXHQ8aW5jbHVkZXMgIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQkJZGlnZXN0LnByaW50KCJpZD1cIiIgKyBpbmNsdWRlZEZlYXR1cmVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkgKyAiXCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJZGlnZXN0LnByaW50KCJ2ZXJzaW9uPVwiIiArIGluY2x1ZGVkRmVhdHVyZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKSArICJcIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlpZiAoaW5jbHVkZWRGZWF0dXJlc1tpXS5nZXRPUygpICE9IG51bGwpCi0JCQkJCQkJZGlnZXN0LnByaW50KCJvcz1cIiIgKyBpbmNsdWRlZEZlYXR1cmVzW2ldLmdldE9TKCkgKyAiXCIgIik7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJCQkJaWYgKGluY2x1ZGVkRmVhdHVyZXNbaV0uZ2V0TkwoKSAhPSBudWxsKQotCQkJCQkJCWRpZ2VzdC5wcmludCgibmw9XCIiICsgaW5jbHVkZWRGZWF0dXJlc1tpXS5nZXROTCgpICsgIlwiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWlmIChpbmNsdWRlZEZlYXR1cmVzW2ldLmdldFdTKCkgIT0gbnVsbCkKLQkJCQkJCQlkaWdlc3QucHJpbnQoIndzPVwiIiArIGluY2x1ZGVkRmVhdHVyZXNbaV0uZ2V0V1MoKSArICJcIiAiKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJCQlpZiAoaW5jbHVkZWRGZWF0dXJlc1tpXS5nZXRPU0FyY2goKSAhPSBudWxsKQotCQkJCQkJCWRpZ2VzdC5wcmludCgiYXJjaD1cIiIgKyBpbmNsdWRlZEZlYXR1cmVzW2ldLmdldE9TQXJjaCgpICsgIlwiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkJCQkJCQkJCQotCQkJCQkJaWYgKCAoaW5jbHVkZWRGZWF0dXJlc1tpXSBpbnN0YW5jZW9mIEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSkgJiYgKCgoSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKWluY2x1ZGVkRmVhdHVyZXNbaV0pLmdldExhYmVsKCkgIT0gbnVsbCkpCi0JCQkJCQkJZGlnZXN0LnByaW50KCJuYW1lPVwiIiArIGluY2x1ZGVkRmVhdHVyZXNbaV0uZ2V0TmFtZSgpICsgIlwiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkJCQkJCQkKLQkJCQkJCWlmIChpbmNsdWRlZEZlYXR1cmVzW2ldLmlzT3B0aW9uYWwoKSkKLQkJCQkJCQlkaWdlc3QucHJpbnQoIm9wdGlvbmFsPVwidHJ1ZVwiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlkaWdlc3QucHJpbnQoInNlYXJjaC1sb2NhdGlvbj1cIiIgKyBpbmNsdWRlZEZlYXR1cmVzW2ldLmdldFNlYXJjaExvY2F0aW9uKCkgKyAiXCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkJCQlkaWdlc3QucHJpbnRsbigiLz4gIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZGlnZXN0LnByaW50bG4oIjwvZmVhdHVyZT4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBDb21iaW5lZFByb3BlcnRpZXMgZXh0ZW5kcyBQcm9wZXJ0aWVzIHsKLQotCQlwcml2YXRlIFByb3BlcnRpZXMgcHJvcGVydGllczE7Ci0KLQkJcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BlcnRpZXMyOwotCi0JCXByaXZhdGUgUHJvcGVydGllcyBwcm9wZXJ0aWVzMzsKLQotCQkvKioKLQkJICogQHBhcmFtIHByZWZlcnJlZCBwcmVmZXJyZWQsIHN1Y2ggYXMgbGFuZ19jb3VudHJ5Ci0JCSAqIEBwYXJhbSBzZWNvbmRhcnkgc2Vjb25kYXJ5LCBzdWNoIGFzIGxhbmcKLQkJICogQHBhcmFtIGRlZmF1bHRzIGRlZmF1bHQsCi0JCSAqLwotCQlwdWJsaWMgQ29tYmluZWRQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJlZmVycmVkLAotCQkJCVByb3BlcnRpZXMgc2Vjb25kYXJ5LCBQcm9wZXJ0aWVzIGRlZmF1bHRzKSB7Ci0JCQl0aGlzLnByb3BlcnRpZXMxID0gcHJlZmVycmVkOwotCQkJdGhpcy5wcm9wZXJ0aWVzMiA9IHNlY29uZGFyeTsKLQkJCXRoaXMucHJvcGVydGllczMgPSBkZWZhdWx0czsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgewotCQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAocHJvcGVydGllczMgIT0gbnVsbCAmJiBwcm9wZXJ0aWVzMy5jb250YWluc0tleShrZXkpKQotCQkJCXJlc3VsdCA9IHByb3BlcnRpZXMzLmdldFByb3BlcnR5KGtleSk7Ci0JCQlpZiAocHJvcGVydGllczIgIT0gbnVsbCAmJiBwcm9wZXJ0aWVzMi5jb250YWluc0tleShrZXkpKQotCQkJCXJlc3VsdCA9IHByb3BlcnRpZXMyLmdldFByb3BlcnR5KGtleSk7Ci0JCQlpZiAocHJvcGVydGllczEgIT0gbnVsbCAmJiBwcm9wZXJ0aWVzMS5jb250YWluc0tleShrZXkpKQotCQkJCXJlc3VsdCA9IHByb3BlcnRpZXMxLmdldFByb3BlcnR5KGtleSk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0VVRGOFN0cmluZyhTdHJpbmcgcykgewotCQlpZihzID09IG51bGwpCi0JCQlyZXR1cm4gIiI7Ci0JCXJldHVybiBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0V3JpdGFibGVYTUxTdHJpbmcocyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvQmFzZVNlYXJjaENhdGVnb3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvQmFzZVNlYXJjaENhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZTE1MDEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL0Jhc2VTZWFyY2hDYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLio7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlU2VhcmNoQ2F0ZWdvcnkgaW1wbGVtZW50cyBJVXBkYXRlU2VhcmNoQ2F0ZWdvcnkgewotCXByaXZhdGUgU3RyaW5nIGlkOwotCQotCXByb3RlY3RlZCBCYXNlU2VhcmNoQ2F0ZWdvcnkoU3RyaW5nIGlkKSB7Ci0JCXNldElkKGlkKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKLQkJaWYgKHRoaXMuaWQ9PW51bGwpCi0JCQl0aGlzLmlkID0gaWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL09wdGlvbmFsRmVhdHVyZVNlYXJjaENhdGVnb3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvT3B0aW9uYWxGZWF0dXJlU2VhcmNoQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE0NjNkMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvT3B0aW9uYWxGZWF0dXJlU2VhcmNoQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLio7Ci0KLS8qKgotICogU2VhcmNoZXMgZm9yIG9wdGlvbmFsIGZlYXR1cmVzCi0gKi8KLXB1YmxpYyBjbGFzcyBPcHRpb25hbEZlYXR1cmVTZWFyY2hDYXRlZ29yeSBleHRlbmRzIEJhc2VTZWFyY2hDYXRlZ29yeSB7Ci0JcHJpdmF0ZSBJVXBkYXRlU2VhcmNoUXVlcnlbXSBxdWVyaWVzOwotCXByaXZhdGUgQXJyYXlMaXN0IHZpZHM7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX0lEID0KLQkJIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnVuaWZpZWQtc2VhcmNoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBjbGFzcyBPcHRpb25hbFF1ZXJ5IGltcGxlbWVudHMgSVVwZGF0ZVNlYXJjaFF1ZXJ5IHsKLQkJcHVibGljIHZvaWQgcnVuKAotCQkJSVNpdGUgc2l0ZSwKLQkJCVN0cmluZ1tdIGNhdGVnb3JpZXNUb1NraXAsCi0JCQlJVXBkYXRlU2VhcmNoRmlsdGVyIGZpbHRlciwKLQkJCUlVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IgY29sbGVjdG9yLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCB2aWRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmlkcy5zaXplKCk7IGkrKykgewotCQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gKFZlcnNpb25lZElkZW50aWZpZXIpIHZpZHMuZ2V0KGkpOwotCQkJCW1vbml0b3Iuc3ViVGFzayh2aWQudG9TdHJpbmcoKSk7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9Ci0JCQkJCWNyZWF0ZUZlYXR1cmUoCi0JCQkJCQlzaXRlLAotCQkJCQkJdmlkLAotCQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0JCQkJaWYgKGZlYXR1cmUhPW51bGwgJiYgZmlsdGVyLmFjY2VwdChmZWF0dXJlKSkKLQkJCQkJY29sbGVjdG9yLmFjY2VwdChmZWF0dXJlKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgSUZlYXR1cmUgY3JlYXRlRmVhdHVyZSgKLQkJCUlTaXRlIHNpdGUsCi0JCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJdHJ5IHsKLQkJCQlVUkwgc2l0ZVVSTCA9IHNpdGUuZ2V0VVJMKCk7Ci0JCQkJLy9UT0RPIFRoaXMgYXNzdW1wdGlvbiBzdGFuZHMgb25seSBpbiB0aGUgZGVmYXVsdCBjYXNlCi0JCQkJLy8gSW4gZ2VuZXJhbCwgZmVhdHVyZSBhcmNoaXZlIFVSTCBtYXkgYmUgbWFwcGVkIG9uIHNpdGUuCi0JCQkJLy8gQWxzbywgZmVhdHVyZSB0eXBlIG1heSBiZSBzb21ldGhpbmcgZWxzZSAobm90IHBhY2thZ2VkKS4KLQkJCQkvLyBXZSBtYXkgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIChub3Qgb25seSBpZCBhbmQgdmVyc2lvbikKLQkJCQkvLyBpbiBvcmRlciB0byBjcmVhdGUgYSBmZWF0dXJlIG9uIGEgc2l0ZS4KLQkJCQlTdHJpbmcgcmVsYXRpdmUgPSB2aWQudG9TdHJpbmcoKTsKLQkJCQlVUkwgZmVhdHVyZVVSTCA9IG5ldyBVUkwoc2l0ZVVSTCwgImZlYXR1cmVzLyIgKyByZWxhdGl2ZSsiLmphciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXR1cm4gc2l0ZS5jcmVhdGVGZWF0dXJlKAotCQkJCQkib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUucGFja2FnZWQiLCAvLyROT04tTkxTLTEkCi0JCQkJCWZlYXR1cmVVUkwsCi0JCQkJCW1vbml0b3IpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VhcmNoLklTZWFyY2hRdWVyeSNnZXRTZWFyY2hTaXRlKCkKLQkJICovCi0JCXB1YmxpYyBJUXVlcnlVcGRhdGVTaXRlQWRhcHRlciBnZXRRdWVyeVNlYXJjaFNpdGUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFZlcnNpb25lZElkZW50aWZpZXIoVmVyc2lvbmVkSWRlbnRpZmllciB2aWQpIHsKLQkJdmlkcy5hZGQodmlkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJdmlkcy5jbGVhcigpOwotCX0KLQotCXB1YmxpYyBPcHRpb25hbEZlYXR1cmVTZWFyY2hDYXRlZ29yeSgpIHsKLQkJc3VwZXIoQ0FURUdPUllfSUQpOwotCQl2aWRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlxdWVyaWVzID0gbmV3IElVcGRhdGVTZWFyY2hRdWVyeVtdIHsgbmV3IE9wdGlvbmFsUXVlcnkoKX07Ci0JfQotCi0JcHVibGljIElVcGRhdGVTZWFyY2hRdWVyeVtdIGdldFF1ZXJpZXMoKSB7Ci0JCXJldHVybiBxdWVyaWVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9RdWVyeVVwZGF0ZVNpdGVBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvUXVlcnlVcGRhdGVTaXRlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzBkMzkxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9RdWVyeVVwZGF0ZVNpdGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLio7Ci0KLXB1YmxpYyBjbGFzcyBRdWVyeVVwZGF0ZVNpdGVBZGFwdGVyIGV4dGVuZHMgVXBkYXRlU2l0ZUFkYXB0ZXIgaW1wbGVtZW50cyBJUXVlcnlVcGRhdGVTaXRlQWRhcHRlciB7Ci0JcHJpdmF0ZSBTdHJpbmcgbWFwcGluZ0lkOwotCi0JcHVibGljIFF1ZXJ5VXBkYXRlU2l0ZUFkYXB0ZXIoU3RyaW5nIGxhYmVsLCBVUkwgdXJsLCBTdHJpbmcgbWFwcGluZ0lkKSB7Ci0JCXN1cGVyKGxhYmVsLCB1cmwpOwotCQl0aGlzLm1hcHBpbmdJZCA9IG1hcHBpbmdJZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nSWQoKSB7Ci0JCXJldHVybiBtYXBwaW5nSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL1NpdGVTZWFyY2hDYXRlZ29yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL1NpdGVTZWFyY2hDYXRlZ29yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGJkN2FmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9TaXRlU2VhcmNoQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiAgQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEphbWVzIEQgTWlsZXMgKElCTSBDb3JwLikgLSBidWcgMTgxMzc1LCBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaW4gU2l0ZVNlYXJjaENhdGVnb3J5JFF1ZXJ5Ci0gKiAgICAgSmFtZXMgRCBNaWxlcyAoSUJNIENvcnAuKSAtIGJ1ZyAxOTE3ODMsIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIEZlYXR1cmVEb3dubG9hZGVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlYXJjaDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGVGZWF0dXJlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkV4dGVuZGVkU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5MaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guSVF1ZXJ5VXBkYXRlU2l0ZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC5JVXBkYXRlU2VhcmNoRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guSVVwZGF0ZVNlYXJjaFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guSVVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3RvcjsKLQotLyoqCi0gKiBTZWFyY2hlcyBhbiB1cGRhdGUgc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgU2l0ZVNlYXJjaENhdGVnb3J5IGV4dGVuZHMgQmFzZVNlYXJjaENhdGVnb3J5IHsKLQlwcml2YXRlIElVcGRhdGVTZWFyY2hRdWVyeVtdIHF1ZXJpZXM7Ci0JcHJpdmF0ZSBib29sZWFuIGxpdGVGZWF0dXJlc0FyZU9LOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9JRCA9Ci0JCSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS51bmlmaWVkLXNlYXJjaCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFF1ZXJ5IGltcGxlbWVudHMgSVVwZGF0ZVNlYXJjaFF1ZXJ5IHsKLQkJCi0JCXByaXZhdGUgYm9vbGVhbiBsaXRlRmVhdHVyZXNBcmVPSzsKLQkJCi0JCQotCQlwdWJsaWMgUXVlcnkoKSB7Ci0JCQlsaXRlRmVhdHVyZXNBcmVPSyA9IGZhbHNlOwotCQl9Ci0JCQotCQlwdWJsaWMgUXVlcnkoYm9vbGVhbiBsaXRlRmVhdHVyZXNBcmVPSykgewotCQkJdGhpcy5saXRlRmVhdHVyZXNBcmVPSyA9IGxpdGVGZWF0dXJlc0FyZU9LOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRMaXRlRmVhdHVyZXNBcmVPSyhib29sZWFuIGxpdGVGZWF0dXJlc0FyZU9LKSB7Ci0JCQl0aGlzLmxpdGVGZWF0dXJlc0FyZU9LID0gbGl0ZUZlYXR1cmVzQXJlT0s7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJ1bigKLQkJCUlTaXRlIHNpdGUsCi0JCQlTdHJpbmdbXSBjYXRlZ29yaWVzVG9Ta2lwLAotCQkJSVVwZGF0ZVNlYXJjaEZpbHRlciBmaWx0ZXIsCi0JCQlJVXBkYXRlU2VhcmNoUmVzdWx0Q29sbGVjdG9yIGNvbGxlY3RvciwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCi0JCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJSGFzaFNldCBpZ25vcmVzID0gbmV3IEhhc2hTZXQoKTsJCQkKLQkJCU1hcCBsaXRlRmVhdHVyZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJCi0JCQlpZiAoY2F0ZWdvcmllc1RvU2tpcCAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yaWVzVG9Ta2lwLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlnbm9yZXMuYWRkKGNhdGVnb3JpZXNUb1NraXBbaV0pOwotCQkJCX0KLQkJCX0KLQkJCUxpc3Qgc2l0ZUZlYXR1cmVSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHJlZnMpKTsKLQkJCQotCQkJaWYgKGxpdGVGZWF0dXJlc0FyZU9LICYmIChzaXRlIGluc3RhbmNlb2YgRXh0ZW5kZWRTaXRlKSApIHsKLQkJCQkKLQkJCQlFeHRlbmRlZFNpdGUgZXh0ZW5kZWRTaXRlID0gKEV4dGVuZGVkU2l0ZSlzaXRlOwotCQkJCUxpdGVGZWF0dXJlW10gbGl0ZUZlYXR1cmVzQXJyYXkgPSAgZXh0ZW5kZWRTaXRlLmdldExpdGVGZWF0dXJlcygpOwotCQkJCWlmICggKGxpdGVGZWF0dXJlc0FycmF5ICE9IG51bGwpICYmICggbGl0ZUZlYXR1cmVzQXJyYXkubGVuZ3RoICE9IDApKSB7Ci0JCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBsaXRlRmVhdHVyZXNBcnJheS5sZW5ndGg7IGkrKykgewotCQkJCQkJbGl0ZUZlYXR1cmVzLnB1dChsaXRlRmVhdHVyZXNBcnJheVtpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCksIGxpdGVGZWF0dXJlc0FycmF5W2ldKTsJCQkJCQotCQkJCQl9Ci0JCQkJCShuZXcgRmVhdHVyZURvd25sb2FkZXIoc2l0ZUZlYXR1cmVSZWZlcmVuY2VzLCBjb2xsZWN0b3IsIGZpbHRlciwgaWdub3JlcywgbW9uaXRvciwgdHJ1ZSwgbGl0ZUZlYXR1cmVzKSkucnVuKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9IGVsc2UgewotCQkJCQlsaXRlRmVhdHVyZXNBcmVPSyA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCQotCi0JCQkKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCByZWZzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCVRocmVhZEdyb3VwIGZlYXR1cmVEb3dubG9hZGVycyA9IG5ldyBUaHJlYWRHcm91cCgiRmVhdHVyZURvd25sb2FkZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJaW50IG51bWJlck9mVGhyZWFkcyA9IChyZWZzLmxlbmd0aCA+IDUpPyA1OiByZWZzLmxlbmd0aDsKLQotCQkJVGhyZWFkW10gZmVhdHVyZURvd25sb2FkZXIgPSBuZXcgVGhyZWFkW251bWJlck9mVGhyZWFkc107Ci0JCQlmb3IoIGludCBpID0gMDsgaSA8IG51bWJlck9mVGhyZWFkczsgaSsrKSB7Ci0JCQkJZmVhdHVyZURvd25sb2FkZXJbaV0gPSBuZXcgVGhyZWFkKGZlYXR1cmVEb3dubG9hZGVycywgbmV3IEZlYXR1cmVEb3dubG9hZGVyKHNpdGVGZWF0dXJlUmVmZXJlbmNlcywgY29sbGVjdG9yLCBmaWx0ZXIsIGlnbm9yZXMsIG1vbml0b3IpKTsKLQkJCQlmZWF0dXJlRG93bmxvYWRlcltpXS5zdGFydCgpOwotCQkJfQotCQkJCi0JCQlpbnQgaSA9MDsKLQkJCXdoaWxlKGkgPCBudW1iZXJPZlRocmVhZHMpewotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQlzeW5jaHJvbml6ZWQoc2l0ZUZlYXR1cmVSZWZlcmVuY2VzKSB7IAotCQkJCQkJc2l0ZUZlYXR1cmVSZWZlcmVuY2VzLmNsZWFyKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdHJ5CXsKLQkJCQkJZmVhdHVyZURvd25sb2FkZXJbaV0uam9pbigyNTApOwotCQkJCQlpZighZmVhdHVyZURvd25sb2FkZXJbaV0uaXNBbGl2ZSgpKXsKLQkJCQkJCWkrKzsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZWFyY2guSVNlYXJjaFF1ZXJ5I2dldFNlYXJjaFNpdGUoKQotCQkgKi8KLQkJcHVibGljIElRdWVyeVVwZGF0ZVNpdGVBZGFwdGVyIGdldFF1ZXJ5U2VhcmNoU2l0ZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIFNpdGVTZWFyY2hDYXRlZ29yeSgpIHsKLQkJc3VwZXIoQ0FURUdPUllfSUQpOwotCQlxdWVyaWVzID0gbmV3IElVcGRhdGVTZWFyY2hRdWVyeVtdIHsgbmV3IFF1ZXJ5KCl9OwotCX0KLQotCXB1YmxpYyBTaXRlU2VhcmNoQ2F0ZWdvcnkoYm9vbGVhbiBsaXRlRmVhdHVyZXNBcmVPSykgewotCQl0aGlzKCk7Ci0JCXRoaXMubGl0ZUZlYXR1cmVzQXJlT0sgPSBsaXRlRmVhdHVyZXNBcmVPSzsKLQkJcXVlcmllcyA9IG5ldyBJVXBkYXRlU2VhcmNoUXVlcnlbXSB7IG5ldyBRdWVyeShsaXRlRmVhdHVyZXNBcmVPSyl9OwotCX0KLQotCXB1YmxpYyBJVXBkYXRlU2VhcmNoUXVlcnlbXSBnZXRRdWVyaWVzKCkgewotCQlyZXR1cm4gcXVlcmllczsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmVhdHVyZURvd25sb2FkZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCQotCQlwcml2YXRlIExpc3Qgc2l0ZUZlYXR1cmVSZWZlcmVuY2VzOwotCQkKLQkJcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci0JCQotCQlwcml2YXRlIElVcGRhdGVTZWFyY2hGaWx0ZXIgZmlsdGVyOwotCQkKLQkJcHJpdmF0ZSBJVXBkYXRlU2VhcmNoUmVzdWx0Q29sbGVjdG9yIGNvbGxlY3RvcjsKLQkJCi0JCXByaXZhdGUgSGFzaFNldCBpZ25vcmVzOwotCi0JCXByaXZhdGUgYm9vbGVhbiBsaXRlRmVhdHVyZXNBcmVPSzsKLQotCQlwcml2YXRlIE1hcCBsaXRlRmVhdHVyZXM7Ci0KLQkJcHVibGljIEZlYXR1cmVEb3dubG9hZGVyKExpc3Qgc2l0ZUZlYXR1cmVSZWZlcmVuY2VzLCBJVXBkYXRlU2VhcmNoUmVzdWx0Q29sbGVjdG9yIGNvbGxlY3RvciwgSVVwZGF0ZVNlYXJjaEZpbHRlciBmaWx0ZXIsIEhhc2hTZXQgaWdub3JlcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlzdXBlcigpOwotCi0JCQl0aGlzLmNvbGxlY3RvciA9IGNvbGxlY3RvcjsKLQkJCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQkJdGhpcy5pZ25vcmVzID0gaWdub3JlczsKLQkJCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JCQl0aGlzLnNpdGVGZWF0dXJlUmVmZXJlbmNlcyA9IHNpdGVGZWF0dXJlUmVmZXJlbmNlczsKLQkJfQotCQkKLQkJcHVibGljIEZlYXR1cmVEb3dubG9hZGVyKExpc3Qgc2l0ZUZlYXR1cmVSZWZlcmVuY2VzLCBJVXBkYXRlU2VhcmNoUmVzdWx0Q29sbGVjdG9yIGNvbGxlY3RvciwgSVVwZGF0ZVNlYXJjaEZpbHRlciBmaWx0ZXIsIEhhc2hTZXQgaWdub3JlcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBib29sZWFuIGxpdGVGZWF0dXJlc0FyZU9LLCBNYXAgbGl0ZUZlYXR1cmVzKSB7Ci0JCQl0aGlzKHNpdGVGZWF0dXJlUmVmZXJlbmNlcywgY29sbGVjdG9yLCBmaWx0ZXIsIGlnbm9yZXMsIG1vbml0b3IpOwotCQkJdGhpcy5saXRlRmVhdHVyZXNBcmVPSyA9IGxpdGVGZWF0dXJlc0FyZU9LICYmIChsaXRlRmVhdHVyZXMgIT0gbnVsbCk7Ci0JCQl0aGlzLmxpdGVGZWF0dXJlcyA9IGxpdGVGZWF0dXJlczsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQotCQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlIHNpdGVGZWF0dXJlUmVmZXJlbmNlID0gbnVsbDsKLQkJCQotCQkJd2hpbGUgKHNpdGVGZWF0dXJlUmVmZXJlbmNlcy5zaXplKCkgIT0gMCkgewotCQkJCQotCQkJCXN5bmNocm9uaXplZChzaXRlRmVhdHVyZVJlZmVyZW5jZXMpIHsgCi0JCQkJCXRyeXsKLQkJCQkJCXNpdGVGZWF0dXJlUmVmZXJlbmNlID0gKElTaXRlRmVhdHVyZVJlZmVyZW5jZSlzaXRlRmVhdHVyZVJlZmVyZW5jZXMucmVtb3ZlKDApOwotCQkJCQl9Y2F0Y2goSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKXsKLQkJCQkJCXNpdGVGZWF0dXJlUmVmZXJlbmNlID0gbnVsbDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChzaXRlRmVhdHVyZVJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQkJCWJvb2xlYW4gc2tpcEZlYXR1cmUgPSBmYWxzZTsKLQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQkJYnJlYWs7Ci0JCQkJCWlmIChpZ25vcmVzLnNpemUoKSA+IDApIHsKLQkJCQkJCUlDYXRlZ29yeVtdIGNhdGVnb3JpZXMgPSBzaXRlRmVhdHVyZVJlZmVyZW5jZS5nZXRDYXRlZ29yaWVzKCk7Ci0JCQkJCQkKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2F0ZWdvcmllcy5sZW5ndGg7IGorKykgewotCQkJCQkJCUlDYXRlZ29yeSBjYXRlZ29yeSA9IGNhdGVnb3JpZXNbal07Ci0JCQkJCQkJaWYgKGlnbm9yZXMuY29udGFpbnMoY2F0ZWdvcnkuZ2V0TmFtZSgpKSkgewotCQkJCQkJCQlza2lwRmVhdHVyZSA9IHRydWU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJaWYgKCFza2lwRmVhdHVyZSkgewotCQkJCQkJCWlmIChmaWx0ZXIuYWNjZXB0KHNpdGVGZWF0dXJlUmVmZXJlbmNlKSkgewotCQkJCQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gbnVsbDsKLQkJCQkJCQkJaWYobGl0ZUZlYXR1cmVzQXJlT0spIHsKLQkJCQkJCQkJCWZlYXR1cmUgPSAoSUZlYXR1cmUpbGl0ZUZlYXR1cmVzLmdldChzaXRlRmVhdHVyZVJlZmVyZW5jZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChmZWF0dXJlID09IG51bGwpewotCQkJCQkJCQkJZmVhdHVyZSA9IHNpdGVGZWF0dXJlUmVmZXJlbmNlLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJc3luY2hyb25pemVkKHNpdGVGZWF0dXJlUmVmZXJlbmNlcykgewotCQkJCQkJCQkJaWYgKCAoZmVhdHVyZSAhPSBudWxsKSAmJiAoZmlsdGVyLmFjY2VwdChzaXRlRmVhdHVyZVJlZmVyZW5jZSkpICkgewkJCQkJCQkJCi0JCQkJCQkJCQkJY29sbGVjdG9yLmFjY2VwdChmZWF0dXJlKTsJCQkJCQkJICAgIAotCQkJCQkJCQkJCW1vbml0b3Iuc3ViVGFzayhmZWF0dXJlLmdldExhYmVsKCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVVwZGF0ZUNvcmUubG9nKGUpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTGl0ZUZlYXR1cmVzQXJlT0soKSB7Ci0JCXJldHVybiBsaXRlRmVhdHVyZXNBcmVPSzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaXRlRmVhdHVyZXNBcmVPSyhib29sZWFuIGxpdGVGZWF0dXJlc0FyZU9LKSB7Ci0JCXRoaXMubGl0ZUZlYXR1cmVzQXJlT0sgPSBsaXRlRmVhdHVyZXNBcmVPSzsKLQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBxdWVyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkoKFF1ZXJ5KXF1ZXJpZXNbaV0pLnNldExpdGVGZWF0dXJlc0FyZU9LKGxpdGVGZWF0dXJlc0FyZU9LKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9VcGRhdGVQb2xpY3kuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9VcGRhdGVQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU2MmE4Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvVXBkYXRlUG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEphbWVzIEQgTWlsZXMgKElCTSBDb3JwLikgLSBidWcgMTkxMzY4LCBQb2xpY3kgVVJMIGRvZXNuJ3Qgc3VwcG9ydCBVVEYtOCBjaGFyYWN0ZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVVJMRW5jb2RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVNYW5hZ2VyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuY29ubmVjdGlvbi5Db25uZWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5jb25uZWN0aW9uLklSZXNwb25zZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLklVcGRhdGVTaXRlQWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogCi0gKiBUaGlzIGNsYXNzIG9wZW5zIGNvbm5lY3Rpb24gdG8gdGhlIHVwZGF0ZSBtYXAgcmVzb3VyY2UKLSAqIGFuZCBwYXJzZXMgdGhlIGZpbGUgdG8gbG9hZCB1cGRhdGUgVVJMIG1hcHBpbmdzLgotICogVGhlc2UgbWFwcGluZ3MgYXJlIHVzZWQgdG8gcmVkaXJlY3QgbmV3IHVwZGF0ZXMgc2VhcmNoCi0gKiB3aGVuIHRoZSByZWRpcmVjdGlvbiBwYXR0ZXJuIG1hdGNoZXMuCi0gKi8KLQotcHVibGljIGNsYXNzIFVwZGF0ZVBvbGljeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QT0xJQ1kgPSAidXBkYXRlLXBvbGljeSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1VSTF9NQVAgPSAidXJsLW1hcCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1VSTCA9ICJ1cmwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QQVRURVJOID0gInBhdHRlcm4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UWVBFID0gInVybC10eXBlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVFlQRV9WQUxVRV9VUERBVEUgPSAidXBkYXRlIjsgLy8kTk9OLU5MUy0xJAotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UWVBFX1ZBTFVFX0JPVEggPSAiYm90aCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1RZUEVfVkFMVUVfRElTQ09WRVJZID0gImRpc2NvdmVyeSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1hcFNpdGUgaW1wbGVtZW50cyBJVXBkYXRlU2l0ZUFkYXB0ZXIgewotCQlwcml2YXRlIFVSTCB1cmw7Ci0JCXB1YmxpYyBNYXBTaXRlKFVSTCB1cmwpIHsKLQkJCXRoaXMudXJsID0gdXJsOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCQlpZiAodXJsID09IG51bGwpIHsKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiB1cmwudG9TdHJpbmcoKTsKLQkJfQotCQlwdWJsaWMgVVJMIGdldFVSTCgpIHsKLQkJCXJldHVybiB1cmw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBVcGRhdGVNYXBFbnRyeSB7Ci0JCXByaXZhdGUgSVVwZGF0ZVNpdGVBZGFwdGVyIHNpdGU7Ci0JCXByaXZhdGUgU3RyaW5nIHBhdHRlcm47Ci0KLQkJcHVibGljIFVwZGF0ZU1hcEVudHJ5KFN0cmluZyBwYXR0ZXJuLCBVUkwgdXJsKSB7Ci0JCQl0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOwotCQkJdGhpcy5zaXRlID0gbmV3IE1hcFNpdGUodXJsKTsKLQkJfQotCQlwdWJsaWMgSVVwZGF0ZVNpdGVBZGFwdGVyIGdldFNpdGUoKSB7Ci0JCQlyZXR1cm4gc2l0ZTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBpZCkgewotCQkJcmV0dXJuIGlkLnN0YXJ0c1dpdGgocGF0dGVybik7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuKCkgewotCQkJcmV0dXJuIHBhdHRlcm47Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBlbnRyaWVzOwotCXByaXZhdGUgQXJyYXlMaXN0IGRpc2NvdmVyeUVudHJpZXM7Ci0JcHJpdmF0ZSBJVXBkYXRlU2l0ZUFkYXB0ZXIgZGVmYXVsdFNpdGU7Ci0JcHJpdmF0ZSBJVXBkYXRlU2l0ZUFkYXB0ZXIgZGVmYXVsdERpc2NvdmVyeVNpdGU7Ci0JcHJpdmF0ZSBib29sZWFuIGxvYWRlZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmYWxsYmFja0FsbG93ZWQgPSB0cnVlOwotCi0JcHVibGljIFVwZGF0ZVBvbGljeSgpIHsKLQkJZW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZGlzY292ZXJ5RW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKFVSTCBtYXBGaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gcG9saWN5U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlSZXNwb25zZSByZXNwb25zZSA9IENvbm5lY3Rpb25GYWN0b3J5LmdldChtYXBGaWxlKTsKLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5jaGVja0Nvbm5lY3Rpb25SZXN1bHQocmVzcG9uc2UsIG1hcEZpbGUpOwotCQkJcG9saWN5U3RyZWFtID0gcmVzcG9uc2UuZ2V0SW5wdXRTdHJlYW0obW9uaXRvcik7Ci0JCQkvLyB0aGUgc3RyZWFtIGNhbiBiZSBudWxsIGlmIHRoZSB1c2VyIGNhbmNlbHMgdGhlIGNvbm5lY3Rpb24KLQkJCWlmIChwb2xpY3lTdHJlYW0gPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCWRvY3VtZW50QnVpbGRlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0JCQlEb2N1bWVudEJ1aWxkZXIgcGFyc2VyID0gZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJCURvY3VtZW50IGRvYyA9IHBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UocG9saWN5U3RyZWFtKSk7Ci0KLQkJCXByb2Nlc3NVcGRhdGVQb2xpY3koZG9jKTsKLQkJCWxvYWRlZCA9IHRydWU7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJCU5MUy5iaW5kKE1lc3NhZ2VzLlNpdGVVUkxGYWN0b3J5X1VuYWJsZVRvQWNjZXNzU2l0ZVN0cmVhbSwgKG5ldyBTdHJpbmdbXSB7IG1hcEZpbGUgPT0gbnVsbCA/ICIiIDogbWFwRmlsZS50b0V4dGVybmFsRm9ybSgpIH0pKSwgLy8kTk9OLU5MUy0xJAotCQkJCUlTaXRlLlNJVEVfQUNDRVNTX0VYQ0VQVElPTiwKLQkJCQllKTsKLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJCU1lc3NhZ2VzLlVwZGF0ZVBvbGljeV9wYXJzZVBvbGljeSwgCi0JCQkJMCwKLQkJCQllKTsKLQotCQl9IGNhdGNoKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJTWVzc2FnZXMuVXBkYXRlUG9saWN5X3BhcnNlUG9saWN5LCAKLQkJCQkwLAotCQkJCWUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHBvbGljeVN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcG9saWN5U3RyZWFtLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTG9hZGVkKCkgewotCQlyZXR1cm4gbG9hZGVkOwotCX0KLQkKLQkvKgotCSAqIEdpdmVuIHRoZSBmZWF0dXJlIElELCByZXR1cm5zIHRoZSBtYXBwZWQgdXBkYXRlIFVSTCBpZgotCSAqIGZvdW5kIGluIHRoZSBtYXBwaW5ncy4gVGhpcyBVUkwgd2lsbCBiZSB1c2VkIElOU1RFQUQgb2YKLQkgKiB0aGUgdXBkYXRlIFVSTCBlbmNvZGVkIGluIHRoZSBmZWF0dXJlIGl0c2VsZiBkdXJpbmcgdGhlCi0JICogbmV3IHVwZGF0ZSBzZWFyY2guCi0JICogPHA+SW4gY2FzZSBvZiBtdWx0aXBsZSBtYXRjaGVzIChlLmcuIG9yZy5lY2xpcHNlIGFuZCBvcmcuZWNsaXBzZS5wbGF0Zm9ybSkKLQkgKiB0aGUgVVJMIGZvciB0aGUgbG9uZ2VyIHBhdHRlcm4gd2lsbCBiZSBwaWNrZWQgKGkuZS4gb3JnLmVjbGlwc2UucGxhdGZvcm0pLgotCSAqLwotCXB1YmxpYyBJVXBkYXRlU2l0ZUFkYXB0ZXIgZ2V0TWFwcGVkU2l0ZShTdHJpbmcgaWQpIHsKLQkJVXBkYXRlTWFwRW50cnkgbGFzdEVudHJ5ID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLnNpemUoKTsgaSsrKSB7Ci0JCQlVcGRhdGVNYXBFbnRyeSBlbnRyeSA9IChVcGRhdGVNYXBFbnRyeSkgZW50cmllcy5nZXQoaSk7Ci0JCQlpZiAoZW50cnkubWF0Y2hlcyhpZCkpIHsKLQkJCQlpZiAobGFzdEVudHJ5ID09IG51bGwpCi0JCQkJCWxhc3RFbnRyeSA9IGVudHJ5OwotCQkJCWVsc2UgewotCQkJCQkvLyBDaG9vc2UgdGhlIG1hdGNoIHdpdGggbG9uZ2VyIHBhdHRlcm4uCi0JCQkJCS8vIEZvciBleGFtcGxlLCBpZiB0d28gbWF0Y2hlcyBhcmUgZm91bmQ6Ci0JCQkJCS8vICdvcmcuZWNsaXBzZScgYW5kICdvcmcuZWNsaXBzZS5wbGF0Zm9ybScsCi0JCQkJCS8vIHBpY2sgJ29yZy5lY2xpcHNlLnBsYXRmb3JtJy4KLQkJCQkJU3RyaW5nIHBhdHRlcm4gPSBlbnRyeS5nZXRQYXR0ZXJuKCk7Ci0JCQkJCVN0cmluZyBsYXN0UGF0dGVybiA9IGxhc3RFbnRyeS5nZXRQYXR0ZXJuKCk7Ci0JCQkJCWlmIChwYXR0ZXJuLmxlbmd0aCgpID4gbGFzdFBhdHRlcm4ubGVuZ3RoKCkpCi0JCQkJCQlsYXN0RW50cnkgPSBlbnRyeTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGxhc3RFbnRyeSAhPSBudWxsKQotCQkJcmV0dXJuIGxhc3RFbnRyeS5nZXRTaXRlKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBkZWZhdWx0U2l0ZTsKLQl9Ci0JCi0JLyoKLQkgKiBHaXZlbiB0aGUgZmVhdHVyZSBJRCwgcmV0dXJucyB0aGUgbWFwcGVkIGRpc2NvdmVyeSBVUkwgaWYKLQkgKiBmb3VuZCBpbiB0aGUgbWFwcGluZ3MuIFRoaXMgVVJMIHdpbGwgYmUgdXNlZCBJTlNURUFEIG9mCi0JICogdGhlIGRpc2NvdmVyeSBVUkwgZW5jb2RlZCBpbiB0aGUgZmVhdHVyZSBpdHNlbGYgZHVyaW5nIHRoZQotCSAqIG5ldyBzZWFyY2guCi0JICogPHA+SW4gY2FzZSBvZiBtdWx0aXBsZSBtYXRjaGVzIChlLmcuIG9yZy5lY2xpcHNlIGFuZCBvcmcuZWNsaXBzZS5wbGF0Zm9ybSkKLQkgKiB0aGUgVVJMIGZvciB0aGUgbG9uZ2VyIHBhdHRlcm4gd2lsbCBiZSBwaWNrZWQgKGkuZS4gb3JnLmVjbGlwc2UucGxhdGZvcm0pLgotCSAqLwotCXB1YmxpYyBJVXBkYXRlU2l0ZUFkYXB0ZXIgZ2V0TWFwcGVkRGlzY292ZXJ5U2l0ZShTdHJpbmcgaWQpIHsKLQkJVXBkYXRlTWFwRW50cnkgbGFzdEVudHJ5ID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXNjb3ZlcnlFbnRyaWVzLnNpemUoKTsgaSsrKSB7Ci0JCQlVcGRhdGVNYXBFbnRyeSBlbnRyeSA9IChVcGRhdGVNYXBFbnRyeSkgZGlzY292ZXJ5RW50cmllcy5nZXQoaSk7Ci0JCQlpZiAoZW50cnkubWF0Y2hlcyhpZCkpIHsKLQkJCQlpZiAobGFzdEVudHJ5ID09IG51bGwpCi0JCQkJCWxhc3RFbnRyeSA9IGVudHJ5OwotCQkJCWVsc2UgewotCQkJCQkvLyBDaG9vc2UgdGhlIG1hdGNoIHdpdGggbG9uZ2VyIHBhdHRlcm4uCi0JCQkJCS8vIEZvciBleGFtcGxlLCBpZiB0d28gbWF0Y2hlcyBhcmUgZm91bmQ6Ci0JCQkJCS8vICdvcmcuZWNsaXBzZScgYW5kICdvcmcuZWNsaXBzZS5wbGF0Zm9ybScsCi0JCQkJCS8vIHBpY2sgJ29yZy5lY2xpcHNlLnBsYXRmb3JtJy4KLQkJCQkJU3RyaW5nIHBhdHRlcm4gPSBlbnRyeS5nZXRQYXR0ZXJuKCk7Ci0JCQkJCVN0cmluZyBsYXN0UGF0dGVybiA9IGxhc3RFbnRyeS5nZXRQYXR0ZXJuKCk7Ci0JCQkJCWlmIChwYXR0ZXJuLmxlbmd0aCgpID4gbGFzdFBhdHRlcm4ubGVuZ3RoKCkpCi0JCQkJCQlsYXN0RW50cnkgPSBlbnRyeTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGxhc3RFbnRyeSAhPSBudWxsKQotCQkJcmV0dXJuIGxhc3RFbnRyeS5nZXRTaXRlKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBkZWZhdWx0RGlzY292ZXJ5U2l0ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhbGxiYWNrQWxsb3dlZCgpIHsKLQkJcmV0dXJuIGZhbGxiYWNrQWxsb3dlZDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlc2V0KCkgewotCQlpZiAoIWVudHJpZXMuaXNFbXB0eSgpKQotCQkJZW50cmllcy5jbGVhcigpOwotCQlpZiAoIWRpc2NvdmVyeUVudHJpZXMuaXNFbXB0eSgpKQotCQkJZGlzY292ZXJ5RW50cmllcy5jbGVhcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzVXBkYXRlUG9saWN5KERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCU5vZGUgcm9vdCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCQlyZXNldCgpOwotCQkKLQkJaWYgKHJvb3QuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoVEFHX1BPTElDWSk9PWZhbHNlKQotCQkJdGhyb3dDb3JlRXhjZXB0aW9uKCInIitUQUdfUE9MSUNZK01lc3NhZ2VzLlVwZGF0ZVBvbGljeV9wb2xpY3lFeHBlY3RlZCwgbnVsbCk7ICAvLyROT04tTkxTLTEkCi0JCQkJCi0JCU5vZGVMaXN0IG5vZGVzID0gcm9vdC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQotCQlmb3IgKGludCBpPTA7IGk8bm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZCA9IG5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyB0YWcgPSBjaGlsZC5nZXROb2RlTmFtZSgpOwotCQkJaWYgKHRhZy5lcXVhbHMoVEFHX1VSTF9NQVApKQotCQkJCXByb2Nlc3NNYXBOb2RlKGNoaWxkKTsKLQkJfQotCX0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc01hcE5vZGUoTm9kZSBub2RlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBwYXR0ZXJuID0gZ2V0QXR0cmlidXRlKG5vZGUsIEFUVF9QQVRURVJOKTsKLQkJU3RyaW5nIHVybE5hbWUgPSBnZXRBdHRyaWJ1dGUobm9kZSwgQVRUX1VSTCk7Ci0JCVN0cmluZyB0eXBlID0gZ2V0QXR0cmlidXRlKG5vZGUsIEFUVF9UWVBFKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoQVRUX1BBVFRFUk4sIHBhdHRlcm4pOwotCQlhc3NlcnROb3ROdWxsKEFUVF9VUkwsIHVybE5hbWUpOwotCQkKLQkJLy8gZW1wdHkgdXJsIG1lYW5zIGZlYXR1cmUgaXMgbm90IHVwZGF0ZWFibGUKLQkJaWYgKHVybE5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWFkZFVwZGF0ZUVudHJ5KHBhdHRlcm4sIG51bGwsIHR5cGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKHVybE5hbWUpOwotCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUodXJsKTsKLQkJCWFkZFVwZGF0ZUVudHJ5KHBhdHRlcm4sIHJlc29sdmVkVVJMLCB0eXBlKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93Q29yZUV4Y2VwdGlvbihNZXNzYWdlcy5VcGRhdGVQb2xpY3lfaW52YWxpZFVSTCt1cmxOYW1lLCBudWxsKTsgCi0JCX0gCi0JfQotCQotCXByaXZhdGUgdm9pZCBhc3NlcnROb3ROdWxsKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHZhbHVlPT1udWxsKQotCQkJdGhyb3dDb3JlRXhjZXB0aW9uKG5hbWUrTWVzc2FnZXMuVXBkYXRlUG9saWN5X25hbWVOb051bGwsIG51bGwpOyAKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXR0cmlidXRlKE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUpIHsKLQkJTmFtZWROb2RlTWFwIGF0dE1hcCA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQlOb2RlIGF0dCA9IGF0dE1hcC5nZXROYW1lZEl0ZW0obmFtZSk7Ci0JCWlmIChhdHQ9PW51bGwpIHJldHVybiBudWxsOwotCQlyZXR1cm4gYXR0LmdldE5vZGVWYWx1ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRVcGRhdGVFbnRyeShTdHJpbmcgcGF0dGVybiwgVVJMIHVybCwgU3RyaW5nIHR5cGUpIHsKLQkJaWYgKHBhdHRlcm4uZXF1YWxzSWdub3JlQ2FzZSgiKiIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCQlkZWZhdWx0U2l0ZSA9IG5ldyBNYXBTaXRlKHVybCk7Ci0JCQllbHNlIGlmICh0eXBlLmVxdWFscyhBVFRfVFlQRV9WQUxVRV9VUERBVEUpKQotCQkJCWRlZmF1bHRTaXRlID0gbmV3IE1hcFNpdGUodXJsKTsKLQkJCWVsc2UgaWYgKHR5cGUuZXF1YWxzKEFUVF9UWVBFX1ZBTFVFX0RJU0NPVkVSWSkpCi0JCQkJZGVmYXVsdERpc2NvdmVyeVNpdGUgPSBuZXcgTWFwU2l0ZSh1cmwpOwotCQkJZWxzZSB7Ci0JCQkJZGVmYXVsdFNpdGUgPSBuZXcgTWFwU2l0ZSh1cmwpOwotCQkJCWRlZmF1bHREaXNjb3ZlcnlTaXRlID0gbmV3IE1hcFNpdGUodXJsKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0eXBlID09IG51bGwgKQotCQkJCWVudHJpZXMuYWRkKG5ldyBVcGRhdGVNYXBFbnRyeShwYXR0ZXJuLCB1cmwpKTsKLQkJCWVsc2UgaWYgKHR5cGUuZXF1YWxzKEFUVF9UWVBFX1ZBTFVFX1VQREFURSkpCi0JCQkJZW50cmllcy5hZGQobmV3IFVwZGF0ZU1hcEVudHJ5KHBhdHRlcm4sIHVybCkpOwotCQkJZWxzZSBpZiAodHlwZS5lcXVhbHMoQVRUX1RZUEVfVkFMVUVfRElTQ09WRVJZKSkKLQkJCQlkaXNjb3ZlcnlFbnRyaWVzLmFkZChuZXcgVXBkYXRlTWFwRW50cnkocGF0dGVybiwgdXJsKSk7Ci0JCQllbHNlIHsKLQkJCQllbnRyaWVzLmFkZChuZXcgVXBkYXRlTWFwRW50cnkocGF0dGVybiwgdXJsKSk7Ci0JCQkJZGlzY292ZXJ5RW50cmllcy5hZGQobmV3IFVwZGF0ZU1hcEVudHJ5KHBhdHRlcm4sIHVybCkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCB0aHJvd0NvcmVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmdWxsTWVzc2FnZSA9IE1lc3NhZ2VzLlVwZGF0ZVBvbGljeV9VcGRhdGVQb2xpY3krbWVzc2FnZTsgCi0JCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKGZ1bGxNZXNzYWdlLCAwLCBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvVXBkYXRlU2l0ZUFkYXB0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9VcGRhdGVTaXRlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWMxZTU5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9VcGRhdGVTaXRlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC4qOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZVNpdGVBZGFwdGVyIGltcGxlbWVudHMgSVVwZGF0ZVNpdGVBZGFwdGVyIHsKLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQlwcml2YXRlIFVSTCB1cmw7Ci0JCi0JcHVibGljIFVwZGF0ZVNpdGVBZGFwdGVyKFN0cmluZyBsYWJlbCwgVVJMIHVybCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLS8qCi0JcHVibGljIElTaXRlIGdldFNpdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShnZXRVUkwoKSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0qLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQkJcmV0dXJuICIiICsgZ2V0VVJMKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvVXBkYXRlc1NlYXJjaENhdGVnb3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvVXBkYXRlc1NlYXJjaENhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMWRiMDkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL1VwZGF0ZXNTZWFyY2hDYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqICBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpblZlcnNpb25JZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUluc3RhbGxDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklMb2NhbFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZUZlYXR1cmVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVVSTEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklVcGRhdGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVmVyc2lvbmVkSWRlbnRpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLkZlYXR1cmVIaWVyYXJjaHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5PcGVyYXRpb25zTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLklRdWVyeVVwZGF0ZVNpdGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guSVVwZGF0ZVNlYXJjaEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLklVcGRhdGVTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLklVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVzU2VhcmNoQ2F0ZWdvcnkgZXh0ZW5kcyBCYXNlU2VhcmNoQ2F0ZWdvcnkgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9JRCA9Ci0JCSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5uZXctdXBkYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElGZWF0dXJlIFtdIGZlYXR1cmVzOwotCXByaXZhdGUgYm9vbGVhbiBhdXRvbWF0aWM7Ci0KLQljbGFzcyBDYW5kaWRhdGUgewotCQlBcnJheUxpc3QgY2hpbGRyZW47Ci0JCUNhbmRpZGF0ZSBwYXJlbnQ7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlIHJlZjsKLQkJcHVibGljIENhbmRpZGF0ZShJRmVhdHVyZVJlZmVyZW5jZSByZWYpIHsKLQkJCXRoaXMucmVmID0gcmVmOwotCQl9Ci0JCXB1YmxpYyBDYW5kaWRhdGUoSUZlYXR1cmVSZWZlcmVuY2UgcmVmLCBDYW5kaWRhdGUgcGFyZW50KSB7Ci0JCQl0aGlzKHJlZik7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGQoQ2FuZGlkYXRlIGNoaWxkKSB7Ci0JCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCX0KLQkJdm9pZCBzZXRQYXJlbnQoQ2FuZGlkYXRlIHBhcmVudCkgewotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCX0KLQkJcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGdldFJlZmVyZW5jZSgpIHsKLQkJCXJldHVybiByZWY7Ci0JCX0KLQkJdm9pZCBzZXRSZWZlcmVuY2UoSUZlYXR1cmVSZWZlcmVuY2UgcmVmKSB7Ci0JCQl0aGlzLnJlZiA9IHJlZjsKLQkJfQotCQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHJlZi5nZXRGZWF0dXJlKG1vbml0b3IpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIENhbmRpZGF0ZSBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0JCXB1YmxpYyBDYW5kaWRhdGUgZ2V0Um9vdCgpIHsKLQkJCUNhbmRpZGF0ZSByb290ID0gdGhpczsKLQotCQkJd2hpbGUgKHJvb3QuZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotCQkJCXJvb3QgPSByb290LmdldFBhcmVudCgpOwotCQkJfQotCQkJcmV0dXJuIHJvb3Q7Ci0JCX0KLQkJcHVibGljIElVUkxFbnRyeSBnZXRVcGRhdGVFbnRyeSgpIHsKLQkJCWludCBsb2NhdGlvbiA9IElVcGRhdGVDb25zdGFudHMuU0VBUkNIX1JPT1Q7Ci0KLQkJCWlmIChyZWYgaW5zdGFuY2VvZiBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKQotCQkJCWxvY2F0aW9uID0KLQkJCQkJKChJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKSByZWYpLmdldFNlYXJjaExvY2F0aW9uKCk7Ci0JCQlpZiAocGFyZW50ID09IG51bGwgfHwgbG9jYXRpb24gPT0gSVVwZGF0ZUNvbnN0YW50cy5TRUFSQ0hfU0VMRikgewotCQkJCXJldHVybiBnZXRGZWF0dXJlKG51bGwpLmdldFVwZGF0ZVNpdGVFbnRyeSgpOwotCQkJfQotCQkJcmV0dXJuIGdldFJvb3QoKS5nZXRVcGRhdGVFbnRyeSgpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gcmVmLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBzb3VyY2UpIHsKLQkJCWlmIChzb3VyY2UgaW5zdGFuY2VvZiBDYW5kaWRhdGUpIHsKLQkJCQlyZXR1cm4gdGhpcy5yZWYuZXF1YWxzKCgoQ2FuZGlkYXRlKSBzb3VyY2UpLmdldFJlZmVyZW5jZSgpKTsKLQkJCX0KLQkJCWlmIChzb3VyY2UgaW5zdGFuY2VvZiBJRmVhdHVyZVJlZmVyZW5jZSkgewotCQkJCXJldHVybiB0aGlzLnJlZi5lcXVhbHMoc291cmNlKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRUb0ZsYXRMaXN0KEFycmF5TGlzdCBsaXN0LCBib29sZWFuIHVwZGF0YWJsZU9ubHkpIHsKLQkJCS8vIGFkZCBpdHNlbGYKLQkJCWlmICghdXBkYXRhYmxlT25seSB8fCBpc1VwZGF0YWJsZSgpKQotCQkJCWxpc3QuYWRkKHRoaXMpOwotCQkJLy8gYWRkIGNoaWxkcmVuCi0JCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCQkJQ2FuZGlkYXRlIGNoaWxkID0gKENhbmRpZGF0ZSkgY2hpbGRyZW4uZ2V0KGkpOwotCQkJCQljaGlsZC5hZGRUb0ZsYXRMaXN0KGxpc3QsIHVwZGF0YWJsZU9ubHkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0YWJsZSgpIHsKLQkJCXJldHVybiAocGFyZW50ID09IG51bGwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSGl0IHsKLQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmOwotCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gcGF0Y2hGb3I7Ci0JCWJvb2xlYW4gcGF0Y2g7Ci0JCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2I7Ci0JCQotCQlwdWJsaWMgSGl0KElGZWF0dXJlIGNhbmRpZGF0ZSwgSUZlYXR1cmVSZWZlcmVuY2UgcmVmKSB7Ci0JCQl0aGlzLnJlZiA9IHJlZjsKLQkJfQotCQlwdWJsaWMgSGl0KElGZWF0dXJlIGNhbmRpZGF0ZSwgSUZlYXR1cmVSZWZlcmVuY2UgcmVmLCBib29sZWFuIHBhdGNoKSB7Ci0JCQl0aGlzKGNhbmRpZGF0ZSwgcmVmKTsKLQkJCXRoaXMucGF0Y2ggPSBwYXRjaDsKLQkJfQotCi0JCXB1YmxpYyBIaXQoSUZlYXR1cmUgY2FuZGlkYXRlLCBJRmVhdHVyZVJlZmVyZW5jZSByZWYsIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBwYXRjaEZvcikgewotCQkJdGhpcyhjYW5kaWRhdGUsIHJlZiwgdHJ1ZSk7Ci0JCQl0aGlzLnBhdGNoRm9yID0gcGF0Y2hGb3I7Ci0JCX0KLQotCQlwdWJsaWMgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGdldEpvYigpIHsKLQkJCWlmIChqb2IgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJam9iID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpLmNyZWF0ZUluc3RhbGxPcGVyYXRpb24obnVsbCwgZmVhdHVyZSwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVVwZGF0ZUNvcmUubG9nKGUpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBqb2I7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1BhdGNoKCkgewotCQkJcmV0dXJuIHBhdGNoOwotCQl9Ci0JCXB1YmxpYyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gZ2V0UGF0Y2hlZEpvYigpIHsKLQkJCXJldHVybiBwYXRjaEZvcjsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBVcGRhdGVRdWVyeSBpbXBsZW1lbnRzIElVcGRhdGVTZWFyY2hRdWVyeSB7Ci0JCUlGZWF0dXJlIGNhbmRpZGF0ZTsKLQkJSVF1ZXJ5VXBkYXRlU2l0ZUFkYXB0ZXIgYWRhcHRlcjsKLQotCQlwdWJsaWMgVXBkYXRlUXVlcnkoCi0JCQlJRmVhdHVyZSBjYW5kaWRhdGUsCi0JCQlJVVJMRW50cnkgdXBkYXRlRW50cnkpIHsKLQkJCXRoaXMuY2FuZGlkYXRlID0gY2FuZGlkYXRlOwotCQkJaWYgKHVwZGF0ZUVudHJ5ICE9IG51bGwgJiYgdXBkYXRlRW50cnkuZ2V0VVJMKCkgIT0gbnVsbCkKLQkJCQlhZGFwdGVyID0KLQkJCQkJbmV3IFF1ZXJ5VXBkYXRlU2l0ZUFkYXB0ZXIoCi0JCQkJCQlnZXRMYWJlbEZvckVudHJ5KHVwZGF0ZUVudHJ5KSwKLQkJCQkJCXVwZGF0ZUVudHJ5LmdldFVSTCgpLAotCQkJCQkJY2FuZGlkYXRlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkpOwotCQl9Ci0JCXByaXZhdGUgU3RyaW5nIGdldExhYmVsRm9yRW50cnkoSVVSTEVudHJ5IGVudHJ5KSB7Ci0JCQlTdHJpbmcgbGFiZWwgPSBlbnRyeS5nZXRBbm5vdGF0aW9uKCk7Ci0JCQlpZiAobGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwKQotCQkJCWxhYmVsID0gZW50cnkuZ2V0VVJMKCkudG9TdHJpbmcoKTsKLQkJCXJldHVybiBsYWJlbDsKLQkJfQotCi0JCXB1YmxpYyBJUXVlcnlVcGRhdGVTaXRlQWRhcHRlciBnZXRRdWVyeVNlYXJjaFNpdGUoKSB7Ci0JCQlyZXR1cm4gYWRhcHRlcjsKLQkJfQotCQlwcml2YXRlIGJvb2xlYW4gaXNCcm9rZW4oKSB7Ci0JCQl0cnkgewotCQkJCUlTdGF0dXMgc3RhdHVzID0KLQkJCQkJU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0RmVhdHVyZVN0YXR1cyhjYW5kaWRhdGUpOwotCQkJCXJldHVybiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXByaXZhdGUgYm9vbGVhbiBpc01pc3NpbmdPcHRpb25hbENoaWxkcmVuKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJCXRyeSB7Ci0JCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0KLQkJCQkJZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IGNoaWxkcmVuW2ldOwotCQkJCQl0cnkgewotCQkJCQkJSUZlYXR1cmUgY2hpbGQgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJCS8vIElmIHdlIGFyZSBoZXJlLCB0aGUgY2hpbGQgaXMgbm90IG1pc3NpbmcuCi0JCQkJCQkvLyBDaGVjayBpdCdzIGNoaWxkcmVuIHJlY3Vyc2l2ZWx5LgotCQkJCQkJaWYgKGlzTWlzc2luZ09wdGlvbmFsQ2hpbGRyZW4oY2hpbGQpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIE1pc3NpbmcgY2hpbGQuIFJldHVybiB0cnVlIGlmIG9wdGlvbmFsLAotCQkJCQkJLy8gb3RoZXJ3aXNlIGl0IGlzIGEgYnJva2VuIGZlYXR1cmUgdGhhdCB3ZSAKLQkJCQkJCS8vIGRvIG5vdCBjYXJlIGFib3V0LgotCQkJCQkJaWYgKHJlZi5pc09wdGlvbmFsKCkpIHsKLQkJCQkJCQlyZXR1cm4gRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQuaGFzT2xkZXJWZXJzaW9uKHJlZik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBydW4oCi0JCQlJU2l0ZSBzaXRlLAotCQkJU3RyaW5nW10gY2F0ZWdvcmllc1RvU2tpcCwKLQkJCUlVcGRhdGVTZWFyY2hGaWx0ZXIgZmlsdGVyLAotCQkJSVVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3RvciBjb2xsZWN0b3IsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCUFycmF5TGlzdCBoaXRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJYm9vbGVhbiBicm9rZW4gPSBpc0Jyb2tlbigpOwotCQkJYm9vbGVhbiBtaXNzaW5nT3B0aW9uYWxDaGlsZHJlbiA9IGZhbHNlOwotCi0JCQkvLyBEb24ndCBib3RoZXIgdG8gY29tcHV0ZSBtaXNzaW5nIG9wdGlvbmFsIGNoaWxkcmVuCi0JCQkvLyBpZiB0aGUgZmVhdHVyZSBpcyBicm9rZW4gLSBhbGwgd2Ugd2FudCBpcyB0byAKLQkJCS8vIHNlZSBpZiB3ZSBzaG91bGQgYWxsb3cgc2FtZS12ZXJzaW9uIHJlLWluc3RhbGwuCi0JCQlpZiAoIWJyb2tlbikKLQkJCQltaXNzaW5nT3B0aW9uYWxDaGlsZHJlbiA9IGlzTWlzc2luZ09wdGlvbmFsQ2hpbGRyZW4oY2FuZGlkYXRlKTsKLQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgcmVmcy5sZW5ndGggKyAxKTsgLy8kTk9OLU5MUy0xJAotCQkJQXJyYXlMaXN0IHVwZGF0ZUpvYnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gcmVmc1tpXTsKLQkJCQl0cnkgewotCQkJCQlpZiAoaXNOZXdlclZlcnNpb24oY2FuZGlkYXRlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSxyZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSkgewotCQkJCQkJSGl0IGggPSBuZXcgSGl0KGNhbmRpZGF0ZSwgcmVmKTsKLQkJCQkJCWhpdHMuYWRkKGgpOwotCQkJCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IGguZ2V0Sm9iKCk7Ci0JCQkJCQlpZiAoam9iICE9IG51bGwpCi0JCQkJCQkJdXBkYXRlSm9icy5hZGQoam9iKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGFjY2VwdCB0aGUgc2FtZSBmZWF0dXJlIGlmIHRoZSBpbnN0YWxsZWQKLQkJCQkJCS8vIGZlYXR1cmUgaXMgYnJva2VuCi0JCQkJCQlpZiAoKGJyb2tlbiB8fCBtaXNzaW5nT3B0aW9uYWxDaGlsZHJlbikKLQkJCQkJCQkmJiBjYW5kaWRhdGUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscygKLQkJCQkJCQkJcmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpewotCQkJCQkJCWhpdHMuYWRkKG5ldyBIaXQoY2FuZGlkYXRlLCByZWYpKTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGNoZWNrIGZvciBwYXRjaGVzCi0JCQkJCQkJaWYgKGlzUGF0Y2goY2FuZGlkYXRlLCByZWYpKXsKLQkJCQkJCQkJaGl0cy5hZGQobmV3IEhpdChjYW5kaWRhdGUsIHJlZiwgdHJ1ZSkpOwotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKXsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkKLQkJCX0KLQkJCS8vIGFjY2VwdCBwYXRjaGVzIGZvciB1cGRhdGVkIGZlYXR1cmVzCi0JCQlmb3IgKGludCBuID0gMDsgbiA8IHVwZGF0ZUpvYnMuc2l6ZSgpOyBuKyspIHsKLQkJCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iID0gKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgdXBkYXRlSm9icwotCQkJCQkJLmdldChuKTsKLQkJCQkJSUZlYXR1cmUgbmV3Q2FuZGlkYXRlID0gam9iLmdldEZlYXR1cmUoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gcmVmc1tpXTsKLQkJCQkJCWlmIChpc1BhdGNoKG5ld0NhbmRpZGF0ZSwgcmVmKSkgewotCQkJCQkJCUhpdCBoID0gbmV3IEhpdChuZXdDYW5kaWRhdGUsIHJlZiwgam9iKTsKLQkJCQkJCQloaXRzLmFkZChoKTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCS8vbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCX0KLQkJCWlmIChoaXRzLnNpemUoKSA+IDApIHsKLQkJCQljb2xsZWN0VmFsaWRIaXRzKGhpdHMsIGZpbHRlciwgY29sbGVjdG9yKTsKLQkJCX0KLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBSZXR1cm5zIElGZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgSVVwZGF0ZVNlYXJjaFF1ZXJ5Ci0JCSAqLwotCQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsKLQkJCXJldHVybiBjYW5kaWRhdGU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBjYW5kaWRhdGVzOwotCi0JcHVibGljIFVwZGF0ZXNTZWFyY2hDYXRlZ29yeSgpIHsKLQkJdGhpcyh0cnVlKTsKLQl9Ci0JCi0JcHVibGljIFVwZGF0ZXNTZWFyY2hDYXRlZ29yeShib29sZWFuIGF1dG9tYXRpYykgewotCQlzdXBlcihDQVRFR09SWV9JRCk7Ci0JCXRoaXMuYXV0b21hdGljID0gYXV0b21hdGljOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb2xsZWN0VmFsaWRIaXRzKAotCQlBcnJheUxpc3QgaGl0cywKLQkJSVVwZGF0ZVNlYXJjaEZpbHRlciBmaWx0ZXIsCi0JCUlVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IgY29sbGVjdG9yKSB7Ci0JCS8vT2JqZWN0W10gYXJyYXkgPSBoaXRzLnRvQXJyYXkoKTsKLQkJSUZlYXR1cmUgdG9wSGl0ID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBoaXRzLnNpemUoKTsgaSsrKSB7Ci0JCQlIaXQgaGl0ID0gKEhpdCkgaGl0cy5nZXQoaSk7Ci0JCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iID0gaGl0LmdldEpvYigpOwotCQkJaWYgKGpvYiA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJLy8gZG8gbm90IGFjY2VwdCB1cGRhdGVzIHdpdGhvdXQgYSBsaWNlbnNlCi0JCQlpZiAoIVVwZGF0ZVV0aWxzLmhhc0xpY2Vuc2Uoam9iLmdldEZlYXR1cmUoKSkpIHsKLQkJCQlVcGRhdGVDb3JlLmxvZyhqb2IuZ2V0RmVhdHVyZSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSArICI6ICIgKyBNZXNzYWdlcy5EZWZhdWx0RmVhdHVyZVBhcnNlcl9Ob0xpY2Vuc2VUZXh0LCBudWxsKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJCQotCQkJLy8gRml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMyNDUwCi0JCQkvLyBPbmx5IHZhbGlkYXRlIGZvciBhdXRvbWF0aWMgdXBkYXRlcyBiZWNhdXNlCi0JCQkvLyBub24tYXV0b21hdGljIG9uY2Ugd2lsbCBhcnJpdmUgaW4gdGhlIHJldmlldyB3aXphcmQKLQkJCS8vIHdoZXJlIGFkZGl0aW9uYWwgdmFsaWRhdGlvbiB3aWxsIGJlIHBlcmZvcm1lZAotCQkJaWYgKGF1dG9tYXRpYykgewotCQkJCWlmKCBoaXQuZ2V0UGF0Y2hlZEpvYigpPT1udWxsKXsKLQkJCQkJc3RhdHVzID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQZW5kaW5nSW5zdGFsbChqb2IuZ2V0T2xkRmVhdHVyZSgpLCBqb2IuZ2V0RmVhdHVyZSgpKTsKLQkJCQl9ZWxzZXsKLQkJCQkJc3RhdHVzID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQZW5kaW5nQ2hhbmdlcyhuZXcgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW117aGl0LmdldFBhdGNoZWRKb2IoKSwgam9ifSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5nZXRDb2RlKCkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7Ci0JCQkJaWYgKGhpdC5pc1BhdGNoKCkpIHsKLQkJCQkJSUZlYXR1cmUgcGF0Y2ggPSBqb2IuZ2V0RmVhdHVyZSgpOwotCQkJCQkvLyBEbyBub3QgYWRkIHRoZSBwYXRjaCBpZiBhbHJlYWR5IGluc3RhbGxlZAotCQkJCQlJRmVhdHVyZVtdIHNhbWVJZCA9IFVwZGF0ZVV0aWxzLmdldEluc3RhbGxlZEZlYXR1cmVzKHBhdGNoLCBmYWxzZSk7Ci0JCQkJCWlmIChzYW1lSWQubGVuZ3RoPT0wKSB7Ci0JCQkJCQlpZiAoZmlsdGVyLmFjY2VwdChwYXRjaCkpCi0JCQkJCQkJY29sbGVjdG9yLmFjY2VwdChwYXRjaCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSAgewotCQkJCQl0b3BIaXQgPSBqb2IuZ2V0RmVhdHVyZSgpOwotCQkJCQlpZiAoZmlsdGVyLmFjY2VwdCh0b3BIaXQpKQotCQkJCQkJY29sbGVjdG9yLmFjY2VwdCh0b3BIaXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQljYW5kaWRhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJCUlDb25maWd1cmVkU2l0ZVtdIGlzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJY29udHJpYnV0ZUNhbmRpZGF0ZXMoaXNpdGVzW2ldKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVDb3JlLmxvZygKLQkJCQlNZXNzYWdlcy5VcGRhdGVzU2VhcmNoQ2F0ZWdvcnlfZXJyb3JTZWFyY2hpbmdGb3JVcGRhdGVzLCAKLQkJCQllKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjb250cmlidXRlQ2FuZGlkYXRlcyhJQ29uZmlndXJlZFNpdGUgaXNpdGUpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0gaXNpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCUFycmF5TGlzdCBjYW5kaWRhdGVzUGVyU2l0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSByZWZzW2ldOwotCQkJLy8gRG9uJ3Qgd2FzdGUgdGltZSBzZWFyY2hpbmcgZm9yIHVwZGF0ZXMgdG8gCi0JCQkvLyBwYXRjaGVzLgotCQkJdHJ5IHsKLQkJCQlpZiAoVXBkYXRlVXRpbHMuaXNQYXRjaChyZWYuZ2V0RmVhdHVyZShudWxsKSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJQ2FuZGlkYXRlIGMgPSBuZXcgQ2FuZGlkYXRlKHJlZik7Ci0JCQljYW5kaWRhdGVzUGVyU2l0ZS5hZGQoYyk7Ci0JCX0KLQkJLy8gQ3JlYXRlIGEgdHJlZSBmcm9tIGEgZmxhdCBsaXN0Ci0JCWJ1aWxkSGllcmFyY2h5KGNhbmRpZGF0ZXNQZXJTaXRlKTsKLQkJLy8gQWRkIHRoZSByZW1haW5pbmcgcm9vdCBjYW5kaWRhdGVzIHRvIAotCQkvLyB0aGUgZ2xvYmFsIGxpc3Qgb2YgY2FuZGlkYXRlcy4KLQkJY2FuZGlkYXRlcy5hZGRBbGwoY2FuZGlkYXRlc1BlclNpdGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEhpZXJhcmNoeShBcnJheUxpc3QgY2FuZGlkYXRlcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlDYW5kaWRhdGVbXSBhcnJheSA9Ci0JCQkoQ2FuZGlkYXRlW10pIGNhbmRpZGF0ZXMudG9BcnJheShuZXcgQ2FuZGlkYXRlW2NhbmRpZGF0ZXMuc2l6ZSgpXSk7Ci0JCS8vIGZpbHRlciBvdXQgaW5jbHVkZWQgZmVhdHVyZXMgc28gdGhhdCBvbmx5IHRvcC1sZXZlbCBmZWF0dXJlcyByZW1haW4gb24gdGhlIGxpc3QKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJQ2FuZGlkYXRlIHBhcmVudCA9IGFycmF5W2ldOwotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IHBhcmVudC5nZXRGZWF0dXJlKG51bGwpOwotCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBpbmNsdWRlZCA9Ci0JCQkJZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGluY2x1ZGVkLmxlbmd0aDsgaisrKSB7Ci0JCQkJSUZlYXR1cmVSZWZlcmVuY2UgZnJlZiA9IGluY2x1ZGVkW2pdOwotCQkJCUNhbmRpZGF0ZSBjaGlsZCA9IGZpbmRDYW5kaWRhdGUoY2FuZGlkYXRlcywgZnJlZik7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJcGFyZW50LmFkZChjaGlsZCk7Ci0JCQkJCWNoaWxkLnNldFJlZmVyZW5jZShmcmVmKTsKLQkJCQkJY2FuZGlkYXRlcy5yZW1vdmUoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlwcml2YXRlIENhbmRpZGF0ZSBmaW5kQ2FuZGlkYXRlKEFycmF5TGlzdCBsaXN0LCBJRmVhdHVyZVJlZmVyZW5jZSByZWYpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlDYW5kaWRhdGUgYyA9IChDYW5kaWRhdGUpIGxpc3QuZ2V0KGkpOwotCQkJaWYgKGMucmVmLmVxdWFscyhyZWYpKQotCQkJCXJldHVybiBjOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJVXBkYXRlU2VhcmNoUXVlcnlbXSBnZXRRdWVyaWVzKCkgewotCQlpbml0aWFsaXplKCk7Ci0JCUFycmF5TGlzdCBhbGxDYW5kaWRhdGVzID0gZ2V0QWxsQ2FuZGlkYXRlcygpOwotCi0JCUlVcGRhdGVTZWFyY2hRdWVyeVtdIHF1ZXJpZXMgPQotCQkJbmV3IElVcGRhdGVTZWFyY2hRdWVyeVthbGxDYW5kaWRhdGVzLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcXVlcmllcy5sZW5ndGg7IGkrKykgewotCQkJQ2FuZGlkYXRlIGNhbmRpZGF0ZSA9IChDYW5kaWRhdGUpIGFsbENhbmRpZGF0ZXMuZ2V0KGkpOwotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGNhbmRpZGF0ZS5nZXRGZWF0dXJlKG51bGwpOwotCQkJSVVSTEVudHJ5IHVwZGF0ZUVudHJ5ID0gY2FuZGlkYXRlLmdldFVwZGF0ZUVudHJ5KCk7Ci0JCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQkJcXVlcmllc1tpXSA9IG51bGw7Ci0JCQl9IGVsc2UgewotCQkJCXF1ZXJpZXNbaV0gPSBuZXcgVXBkYXRlUXVlcnkoZmVhdHVyZSwgdXBkYXRlRW50cnkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBxdWVyaWVzOwotCX0KLQkKLS8qKgotICogU2V0cyB0aGUgZmVhdHVyZXMgZm9yIHdoaWNoIG5ldyB1cGRhdGVzIG5lZWQgdG8gYmUgZm91bmQuIElmCi0gKiBub3Qgc2V0LCB1cGRhdGVzIHdpbGwgYmUgc2VhcmNoZWQgZm9yIGFsbCB0aGUgaW5zdGFsbGVkCi0gKiBhbmQgY29uZmlndXJlZCBmZWF0dXJlcy4KLSAqIEBwYXJhbSBmZWF0dXJlcyB0aGUgZmVhdHVyZXMgdG8gc2VhcmNoIHVwZGF0ZXMgZm9yCi0gKi8JCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZXMoSUZlYXR1cmUgW10gZmVhdHVyZXMpIHsKLQkJdGhpcy5mZWF0dXJlcyA9IGZlYXR1cmVzOwotCX0KLQkKLS8qKgotICogUmV0dXJucyBhbiBhcnJheSBvZiBmZWF0dXJlcyBmb3Igd2hpY2ggdXBkYXRlcyBuZWVkIHRvCi0gKiBiZSBmb3VuZC4gCi0gKiBAcmV0dXJuIGFuIGFycmF5IG9mIGZlYXR1cmVzIG9yIDxzYW1wPm51bGw8L3NhbXA+IGlmIG5vdAotICogc2V0LgotICovCQotCXB1YmxpYyBJRmVhdHVyZSBbXSBnZXRGZWF0dXJlcygpIHsKLQkJcmV0dXJuIGZlYXR1cmVzOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZnZpCi0JICogQHBhcmFtIGN2aQotCSAqIEByZXR1cm4gZnZpIDwgY3ZpCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTmV3ZXJWZXJzaW9uKAotCQlWZXJzaW9uZWRJZGVudGlmaWVyIGZ2aSwKLQkJVmVyc2lvbmVkSWRlbnRpZmllciBjdmkpIHsKLQkJaWYgKCFmdmkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhjdmkuZ2V0SWRlbnRpZmllcigpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgZnYgPSBmdmkuZ2V0VmVyc2lvbigpOwotCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciBjdiA9IGN2aS5nZXRWZXJzaW9uKCk7Ci0JCVN0cmluZyBtb2RlID0gZ2V0VXBkYXRlVmVyc2lvbnNNb2RlKCk7Ci0JCWJvb2xlYW4gZ3JlYXRlciA9IGN2LmlzR3JlYXRlclRoYW4oZnYpOwotCQlpZiAoIWdyZWF0ZXIpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChtb2RlLmVxdWFscyhVcGRhdGVDb3JlLkVRVUlWQUxFTlRfVkFMVUUpKQotCQkJcmV0dXJuIGN2LmlzRXF1aXZhbGVudFRvKGZ2KTsKLQkJZWxzZSBpZiAobW9kZS5lcXVhbHMoVXBkYXRlQ29yZS5DT01QQVRJQkxFX1ZBTFVFKSkKLQkJCXJldHVybiBjdi5pc0NvbXBhdGlibGVXaXRoKGZ2KTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1BhdGNoKElGZWF0dXJlIGNhbmRpZGF0ZSwgSVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZikgewotCQlpZiAocmVmLmlzUGF0Y2goKSA9PSBmYWxzZSkKLQkJCXJldHVybiBmYWxzZTsKLQkJdHJ5IHsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCWlmKCBVcGRhdGVVdGlscy5pc1BhdGNoKGNhbmRpZGF0ZSwgZmVhdHVyZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkvLyBDaGVjayBpZiBwYXRjaCBpcyBmb3IgY2hpbGRyZW4KLQkJCXRyeSB7Ci0JCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0KLQkJCQkJY2FuZGlkYXRlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgY3JlZiA9IGNoaWxkcmVuW2ldOwotCQkJCQl0cnkgewotCQkJCQkJSUZlYXR1cmUgY2hpbGQgPSBjcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJCQlpZiAoaXNQYXRjaChjaGlsZCwgcmVmKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VXBkYXRlVmVyc2lvbnNNb2RlKCkgewotCQlQcmVmZXJlbmNlcyBzdG9yZSA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHN0b3JlLmdldFN0cmluZyhVcGRhdGVDb3JlLlBfVVBEQVRFX1ZFUlNJT05TKTsKLQl9Ci0vKgotICogVGhpcyBtZXRob2QgcmVjdXJzaXZlbHkgd2Fsa3MgdGhlIGxpc3Qgb2YgY2FuZGlkYXRlcwotICogYnVpbGRpbmcgdGhlIGZsYXQgdGhhdCBzdGFydHMgd2l0aCB0aGUgcm9vdHMgYnV0Ci0gKiBhbHNvIGluY2x1ZGVzIGFsbCB0aGUgY2hpbGRyZW4gdGhhdCBhcmUgdXBkYXRhYmxlCi0gKiAodXNlICdpbmNsdWRlJyBjbGF1c2Ugd2l0aCBhIG1hdGNoIHRoYXQgaXMgbm90ICdwZXJmZWN0JykuCi0gKi8KLQlwcml2YXRlIEFycmF5TGlzdCBnZXRBbGxDYW5kaWRhdGVzKCkgewotCQlBcnJheUxpc3Qgc2VsZWN0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGk9MDsgaTxjYW5kaWRhdGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlDYW5kaWRhdGUgYyA9IChDYW5kaWRhdGUpY2FuZGlkYXRlcy5nZXQoaSk7Ci0JCQlpZiAoaXNPblRoZUxpc3QoYykpCi0JCQkJYy5hZGRUb0ZsYXRMaXN0KHNlbGVjdGVkLCB0cnVlKTsKLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWQ7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc09uVGhlTGlzdChDYW5kaWRhdGUgYykgewotCQlpZiAoZmVhdHVyZXM9PW51bGwpIHJldHVybiB0cnVlOwotCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZDsKLQkJdHJ5IHsKLQkJCXZpZCA9IGMuZ2V0UmVmZXJlbmNlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpPTA7IGk8ZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBmZWF0dXJlc1tpXTsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgZnZpZCA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJaWYgKGZ2aWQuZXF1YWxzKHZpZCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlY3VyaXR5L0NlcnRpZmljYXRlUGFpci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VjdXJpdHkvQ2VydGlmaWNhdGVQYWlyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMGM0YzEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VjdXJpdHkvQ2VydGlmaWNhdGVQYWlyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VjdXJpdHk7Ci0gCi0gaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC4qOwotIAotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ2VydGlmaWNhdGVQYWlyIHsKLQlwcml2YXRlIENlcnRpZmljYXRlIHJvb3Q7Ci0JcHJpdmF0ZSBDZXJ0aWZpY2F0ZSBpc3N1ZXI7Ci0JCi0JCi0KLQkvKioKLQkgKiBHZXRzIHRoZSByb290LgotCSAqIEByZXR1cm4gUmV0dXJucyBhIENlcnRpZmljYXRlCi0JICovCi0JcHVibGljIENlcnRpZmljYXRlIGdldFJvb3QoKSB7Ci0JCXJldHVybiByb290OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJvb3QuCi0JICogQHBhcmFtIHJvb3QgVGhlIHJvb3QgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Um9vdChDZXJ0aWZpY2F0ZSByb290KSB7Ci0JCXRoaXMucm9vdCA9IHJvb3Q7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaXNzdWVyLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIENlcnRpZmljYXRlCi0JICovCi0JcHVibGljIENlcnRpZmljYXRlIGdldElzc3VlcigpIHsKLQkJcmV0dXJuIGlzc3VlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpc3N1ZXIuCi0JICogQHBhcmFtIGlzc3VlciBUaGUgaXNzdWVyIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzc3VlcihDZXJ0aWZpY2F0ZSBpc3N1ZXIpIHsKLQkJdGhpcy5pc3N1ZXIgPSBpc3N1ZXI7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE9iamVjdCNlcXVhbHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQotCQlpZiAob2JqPT1udWxsKSByZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBDZXJ0aWZpY2F0ZVBhaXIpKSByZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAocm9vdD09bnVsbCB8fCBpc3N1ZXI9PW51bGwpIHJldHVybiBmYWxzZTsKLQkJCi0JCUNlcnRpZmljYXRlUGFpciBwYWlyID0gKENlcnRpZmljYXRlUGFpcilvYmo7Ci0JCQotCQlyZXR1cm4gKHJvb3QuZXF1YWxzKHBhaXIuZ2V0Um9vdCgpKSAmJiBpc3N1ZXIuZXF1YWxzKHBhaXIuZ2V0SXNzdWVyKCkpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvblJlc3VsdC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VjdXJpdHkvSmFyVmVyaWZpY2F0aW9uUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NDA2ZjcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VjdXJpdHkvSmFyVmVyaWZpY2F0aW9uUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWN1cml0eTsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuKjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuKjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7Ci1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuTWVzc2FnZXM7Ci0KLS8qKgotICogUmVzdWx0IG9mIHRoZSBzZXJ2aWNlCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXJWZXJpZmljYXRpb25SZXN1bHQgaW1wbGVtZW50cyBJVmVyaWZpY2F0aW9uUmVzdWx0IHsKLQotCi0JcHJpdmF0ZSBpbnQgcmVzdWx0Q29kZTsKLQlwcml2YXRlIGludCB2ZXJpZmljYXRpb25Db2RlOwotCXByaXZhdGUgRXhjZXB0aW9uIHJlc3VsdEV4Y2VwdGlvbjsKLQlwcml2YXRlIExpc3QgLypvZiBDZXJ0aWZpY2F0ZXNbXSAqLwotCWNlcnRpZmljYXRlczsKLQlwcml2YXRlIENlcnRpZmljYXRlUGFpcltdIHJvb3RDZXJ0aWZpY2F0ZXM7Ci0JcHJpdmF0ZSBDZXJ0aWZpY2F0ZVBhaXIgZm91bmRDZXJ0aWZpY2F0ZTsgLy8gY2VydGlmaWNhdGUgZm91bmQgaW4gb25lIGtleXN0b3JlCi0JCi0JcHJpdmF0ZSBTdHJpbmcgc2lnbmVySW5mbzsKLQlwcml2YXRlIFN0cmluZyB2ZXJpZmllckluZm87Ci0JcHJpdmF0ZSBDb250ZW50UmVmZXJlbmNlIGNvbnRlbnRSZWZlcmVuY2U7Ci0JcHJpdmF0ZSBJRmVhdHVyZSBmZWF0dXJlOwotCXByaXZhdGUgYm9vbGVhbiBmZWF0dXJlVmVyaWZpY2F0aW9uOwotCXByaXZhdGUgYm9vbGVhbiBhbHJlYWR5U2VlbjsKLQotCXB1YmxpYyBKYXJWZXJpZmljYXRpb25SZXN1bHQoKSB7Ci0JfQotCQotCS8qCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRSZXN1bHRDb2RlKCkgewotCQlyZXR1cm4gcmVzdWx0Q29kZTsKLQl9Ci0JCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRXhjZXB0aW9uIGdldFZlcmlmaWNhdGlvbkV4Y2VwdGlvbigpIHsKLQkJcmV0dXJuIHJlc3VsdEV4Y2VwdGlvbjsKLQl9Ci0JCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bHRDb2RlKGludCBuZXdSZXN1bHRDb2RlKSB7Ci0JCXJlc3VsdENvZGUgPSBuZXdSZXN1bHRDb2RlOwotCX0KLQkKLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc3VsdEV4Y2VwdGlvbihFeGNlcHRpb24gbmV3UmVzdWx0RXhjZXB0aW9uKSB7Ci0JCXJlc3VsdEV4Y2VwdGlvbiA9IG5ld1Jlc3VsdEV4Y2VwdGlvbjsKLQl9Ci0JCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZlcmlmaWNhdGlvbkNvZGUoKSB7Ci0JCXJldHVybiB2ZXJpZmljYXRpb25Db2RlOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyaWZpY2F0aW9uQ29kZShpbnQgdmVyaWZpY2F0aW9uQ29kZSkgewotCQl0aGlzLnZlcmlmaWNhdGlvbkNvZGUgPSB2ZXJpZmljYXRpb25Db2RlOwotCX0KLQotCS8qCi0JICogYWRkcyBhbiBhcnJheSBvZiBDZXJ0aWZpY2F0ZXMgdG8gdGhlIGxpc3QKLQkgKiBmb3JjZSByZWNvbXB1dGF0aW9uIG9mIHJvb3QgY2VydAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENlcnRpZmljYXRlcyhDZXJ0aWZpY2F0ZVtdIGNlcnRzKSB7Ci0JCWlmIChjZXJ0aWZpY2F0ZXMgPT0gbnVsbCkKLQkJCWNlcnRpZmljYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJY2VydGlmaWNhdGVzLmFkZChjZXJ0cyk7Ci0JCXJvb3RDZXJ0aWZpY2F0ZXMgPSBudWxsOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiByb290IGNlcnRpZmljYXRlcwotCSAqIFRoZSBsaXN0IG9mIGNlcnRpZmljYXRlcyB3ZSByZWNlaXZlZCBpcyBhbiBhcnJheSBvZiBjZXJ0aWZpY2F0ZXMKLQkgKiB3ZSBoYXZlIHRvIGRldGVybWluZSAKLQkgKiAxKSBob3cgbWFueSBjaGFpbiBkbyB3ZSBoYXZlIChhIGNoYWluIHN0b3BzIHdoZW4gdmVyaWZpZXIgb2YgYSBjZXJ0IGlzIAotCSAqIG5vdCB0aGUgc2lnbmVyIG9mIHRoZSBuZXh0IGNlcnQgaW4gdGhlIGxpc3QgCi0JICogMikgYnVpbGQgYSBjZXJ0IHdpdGggdGhlIGxlYWYgc2lnbmVyIGFuZCB0aGUgcm9vdCB2ZXJpZmllciBmb3IgZWFjaCBjaGFpbgotCSAqLwotCXB1YmxpYyBDZXJ0aWZpY2F0ZVBhaXJbXSBnZXRSb290Q2VydGlmaWNhdGVzKCkgewotCQlpZiAocm9vdENlcnRpZmljYXRlcyA9PSBudWxsKSB7Ci0JCQlyb290Q2VydGlmaWNhdGVzID0gbmV3IENlcnRpZmljYXRlUGFpclswXTsJCQkKLQkJCUxpc3Qgcm9vdENlcnRpZmljYXRlc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAoY2VydGlmaWNhdGVzICE9IG51bGwgJiYgY2VydGlmaWNhdGVzLnNpemUoKSA+IDApIHsKLQkJCQlJdGVyYXRvciBpdGVyID0gY2VydGlmaWNhdGVzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0KLQkJCQkJQ2VydGlmaWNhdGVbXSBjZXJ0cyA9IChDZXJ0aWZpY2F0ZVtdKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGNlcnRzICE9IG51bGwgJiYgY2VydHMubGVuZ3RoID4gMCkgewotCi0JCQkJCQlDZXJ0aWZpY2F0ZVBhaXIgcGFpciA9IG5ldyBDZXJ0aWZpY2F0ZVBhaXIoKTsKLQkJCQkJCXBhaXIuc2V0SXNzdWVyKGNlcnRzWzBdKTsKLQotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjZXJ0cy5sZW5ndGggLSAxOyBpKyspIHsKLQkJCQkJCQlYNTA5Q2VydGlmaWNhdGUgeDUwOWNlcnRSb290ID0gKFg1MDlDZXJ0aWZpY2F0ZSkgY2VydHNbaV07Ci0JCQkJCQkJWDUwOUNlcnRpZmljYXRlIHg1MDljZXJ0SXNzdWVyID0gKFg1MDlDZXJ0aWZpY2F0ZSkgY2VydHNbaSsxXTsKLQkJCQkJCQlpZiAoIXg1MDljZXJ0Um9vdC5nZXRJc3N1ZXJETigpLmVxdWFscyh4NTA5Y2VydElzc3Vlci5nZXRTdWJqZWN0RE4oKSkpIHsKLQkJCQkJCQkJcGFpci5zZXRSb290KHg1MDljZXJ0Um9vdCk7Ci0JCQkJCQkJCWlmICghcm9vdENlcnRpZmljYXRlc0xpc3QuY29udGFpbnMocGFpcikpIHsKLQkJCQkJCQkJCXJvb3RDZXJ0aWZpY2F0ZXNMaXN0LmFkZChwYWlyKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlwYWlyID0gbmV3IENlcnRpZmljYXRlUGFpcigpOwotCQkJCQkJCQlwYWlyLnNldElzc3Vlcih4NTA5Y2VydElzc3Vlcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQkvLyBhZGQgdGhlIGxhdGVzdCBvbmUKLQkJCQkJCWlmIChwYWlyICE9IG51bGwpIHsKLQkJCQkJCQlwYWlyLnNldFJvb3QoY2VydHNbY2VydHMubGVuZ3RoIC0gMV0pOwotCQkJCQkJCWlmICghcm9vdENlcnRpZmljYXRlc0xpc3QuY29udGFpbnMocGFpcikpIHsKLQkJCQkJCQkJcm9vdENlcnRpZmljYXRlc0xpc3QuYWRkKHBhaXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQkJCi0JCQlpZiAocm9vdENlcnRpZmljYXRlc0xpc3Quc2l6ZSgpID4gMCkgewotCQkJCXJvb3RDZXJ0aWZpY2F0ZXMgPSBuZXcgQ2VydGlmaWNhdGVQYWlyW3Jvb3RDZXJ0aWZpY2F0ZXNMaXN0LnNpemUoKV07CQkJCQotCQkJCXJvb3RDZXJ0aWZpY2F0ZXNMaXN0LnRvQXJyYXkocm9vdENlcnRpZmljYXRlcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJvb3RDZXJ0aWZpY2F0ZXM7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENlcnRpZmljYXRlUGFpciBnZXRGb3VuZENlcnRpZmljYXRlKCkgewotCQlyZXR1cm4gZm91bmRDZXJ0aWZpY2F0ZTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvdW5kQ2VydGlmaWNhdGUoQ2VydGlmaWNhdGVQYWlyIGZvdW5kQ2VydGlmaWNhdGUpIHsKLQkJdGhpcy5mb3VuZENlcnRpZmljYXRlID0gZm91bmRDZXJ0aWZpY2F0ZTsKLQl9Ci0KLQotCS8qCi0JICogSW5pdGlhbGl6ZXMgdGhlIHNpZ25lckluZm8gYW5kIHRoZSBWZXJpZmllckluZm8gZnJvbSB0aGUgQ2VydGlmaWNhdGUgUGFpcgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQ2VydGlmaWNhdGVzKCl7Ci0JCVg1MDlDZXJ0aWZpY2F0ZSBjZXJ0Um9vdCA9IG51bGw7Ci0JCVg1MDlDZXJ0aWZpY2F0ZSBjZXJ0SXNzdWVyID0gbnVsbDsKLQkJQ2VydGlmaWNhdGVQYWlyIHRydXN0ZWRDZXJ0aWZpY2F0ZTsKLQkJaWYgKGdldEZvdW5kQ2VydGlmaWNhdGUoKSA9PSBudWxsKSB7Ci0JCQlDZXJ0aWZpY2F0ZVBhaXJbXSBjZXJ0cyA9IGdldFJvb3RDZXJ0aWZpY2F0ZXMoKTsKLQkJCWlmIChjZXJ0cy5sZW5ndGggPT0gMCkKLQkJCQlyZXR1cm47Ci0JCQl0cnVzdGVkQ2VydGlmaWNhdGUgPSBjZXJ0c1swXTsKLQkJfSBlbHNlIHsKLQkJCXRydXN0ZWRDZXJ0aWZpY2F0ZSA9IGdldEZvdW5kQ2VydGlmaWNhdGUoKTsKLQkJfQotCQljZXJ0Um9vdCA9IChYNTA5Q2VydGlmaWNhdGUpIHRydXN0ZWRDZXJ0aWZpY2F0ZS5nZXRSb290KCk7Ci0JCWNlcnRJc3N1ZXIgPSAoWDUwOUNlcnRpZmljYXRlKSB0cnVzdGVkQ2VydGlmaWNhdGUuZ2V0SXNzdWVyKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHN0cmIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXN0cmIuYXBwZW5kKGlzc3VlclN0cmluZyhjZXJ0SXNzdWVyLmdldFN1YmplY3RETigpKSk7Ci0JCXN0cmIuYXBwZW5kKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJc3RyYi5hcHBlbmQoTkxTLmJpbmQoTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uUmVzdWx0X1ZhbGlkQmV0d2VlbiwgKG5ldyBTdHJpbmdbXSB7IGRhdGVTdHJpbmcoY2VydElzc3Vlci5nZXROb3RCZWZvcmUoKSksIGRhdGVTdHJpbmcoY2VydElzc3Vlci5nZXROb3RBZnRlcigpKSB9KSkpOwotCQlzdHJiLmFwcGVuZChjaGVja1ZhbGlkaXR5KGNlcnRJc3N1ZXIpKTsKLQkJc2lnbmVySW5mbyA9IHN0cmIudG9TdHJpbmcoKTsKLQkJaWYgKGNlcnRJc3N1ZXIgIT0gbnVsbCAmJiAhY2VydElzc3Vlci5lcXVhbHMoY2VydFJvb3QpKSB7Ci0JCQlzdHJiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwkKLQkJCXN0cmIuYXBwZW5kKGlzc3VlclN0cmluZyhjZXJ0SXNzdWVyLmdldElzc3VlckROKCkpKTsKLQkJCXN0cmIuYXBwZW5kKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCXN0cmIuYXBwZW5kKE5MUy5iaW5kKE1lc3NhZ2VzLkphclZlcmlmaWNhdGlvblJlc3VsdF9WYWxpZEJldHdlZW4sIChuZXcgU3RyaW5nW10geyBkYXRlU3RyaW5nKGNlcnRSb290LmdldE5vdEJlZm9yZSgpKSwgZGF0ZVN0cmluZyhjZXJ0Um9vdC5nZXROb3RBZnRlcigpKSB9KSkpOyAKLQkJCXN0cmIuYXBwZW5kKGNoZWNrVmFsaWRpdHkoY2VydFJvb3QpKTsKLQkJCXZlcmlmaWVySW5mbyA9IHN0cmIudG9TdHJpbmcoKTsKLQkJfQotCi0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIGEgU3RyaW5nIHRvIHNob3cgaWYgdGhlIGNlcnRpZmljYXRlIGlzIHZhbGlkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY2hlY2tWYWxpZGl0eShYNTA5Q2VydGlmaWNhdGUgY2VydCkgewotCi0JCXRyeSB7Ci0JCQljZXJ0LmNoZWNrVmFsaWRpdHkoKTsKLQkJfSBjYXRjaCAoQ2VydGlmaWNhdGVFeHBpcmVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAoIlxyXG4iICsgTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uUmVzdWx0X0V4cGlyZWRDZXJ0aWZpY2F0ZSk7ICAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKENlcnRpZmljYXRlTm90WWV0VmFsaWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICgiXHJcbiIgKyBNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25SZXN1bHRfQ2VydGlmaWNhdGVOb3RZZXRWYWxpZCk7ICAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuICgiXHJcbiIgKyBNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25SZXN1bHRfQ2VydGlmaWNhdGVWYWxpZCk7ICAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBsYWJlbCBTdHJpbmcgZnJvbSBhIFg1MG5hbWUKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBpc3N1ZXJTdHJpbmcoUHJpbmNpcGFsIHByaW5jaXBhbCkgewotLy8gMTk5MDIKLS8vCQl0cnkgewotLy8JCQlpZiAocHJpbmNpcGFsIGluc3RhbmNlb2YgWDUwME5hbWUpIHsKLS8vCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0vLwkJCQlYNTAwTmFtZSBuYW1lID0gKFg1MDBOYW1lKSBwcmluY2lwYWw7Ci0vLwkJCQlidWYuYXBwZW5kKChuYW1lLmdldEROUXVhbGlmaWVyKCkgIT0gbnVsbCkgPyBuYW1lLmdldEROUXVhbGlmaWVyKCkgKyAiLCAiIDogIiIpOwotLy8JCQkJYnVmLmFwcGVuZChuYW1lLmdldENvbW1vbk5hbWUoKSk7Ci0vLwkJCQlidWYuYXBwZW5kKChuYW1lLmdldE9yZ2FuaXphdGlvbmFsVW5pdCgpICE9IG51bGwpID8gIiwgIiArIG5hbWUuZ2V0T3JnYW5pemF0aW9uYWxVbml0KCkgOiAiIik7Ci0vLwkJCQlidWYuYXBwZW5kKChuYW1lLmdldE9yZ2FuaXphdGlvbigpICE9IG51bGwpID8gIiwgIiArIG5hbWUuZ2V0T3JnYW5pemF0aW9uKCkgOiAiIik7Ci0vLwkJCQlidWYuYXBwZW5kKChuYW1lLmdldExvY2FsaXR5KCkgIT0gbnVsbCkgPyAiLCAiICsgbmFtZS5nZXRMb2NhbGl0eSgpIDogIiIpOwotLy8JCQkJYnVmLmFwcGVuZCgobmFtZS5nZXRDb3VudHJ5KCkgIT0gbnVsbCkgPyAiLCAiICsgbmFtZS5nZXRDb3VudHJ5KCkgOiAiIik7Ci0vLwkJCQlyZXR1cm4gbmV3IFN0cmluZyhidWYpOwotLy8JCQl9Ci0vLwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vCQkJVXBkYXRlQ29yZS53YXJuKCJFcnJvciBwYXJzaW5nIFg1MDAgQ2VydGlmaWNhdGUiLGUpOwotLy8JCX0KLQkJcmV0dXJuIHByaW5jaXBhbC50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGF0ZVN0cmluZyhEYXRlIGRhdGUpIHsKLQkJcmV0dXJuIERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCkuZm9ybWF0KGRhdGUpOwotCX0KLQotCS8qCi0JICoKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNpZ25lckluZm8oKSB7Ci0JCWlmIChzaWduZXJJbmZvPT1udWxsKSBpbml0aWFsaXplQ2VydGlmaWNhdGVzKCk7Ci0JCXJldHVybiBzaWduZXJJbmZvOwotCX0KLQotCS8qCi0JICoKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcmlmaWVySW5mbygpIHsKLQkJaWYgKHNpZ25lckluZm89PW51bGwpIGluaXRpYWxpemVDZXJ0aWZpY2F0ZXMoKTsJCQotCQlyZXR1cm4gdmVyaWZpZXJJbmZvOwotCX0KLQotCS8qCi0JICoKLQkgKi8KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZSBnZXRDb250ZW50UmVmZXJlbmNlKCkgewotCQlyZXR1cm4gY29udGVudFJlZmVyZW5jZTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRSZWZlcmVuY2UoQ29udGVudFJlZmVyZW5jZSByZWYpIHsKLQkJdGhpcy5jb250ZW50UmVmZXJlbmNlID0gcmVmOwotCX0KLQotCi0JLyoKLQkgKgotCSAqLwotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoSUZlYXR1cmUgZmVhdHVyZSkgewotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGZWF0dXJlVmVyaWZpY2F0aW9uKCkgewotCQlyZXR1cm4gZmVhdHVyZVZlcmlmaWNhdGlvbjsKLQl9Ci0JCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBpc0ZlYXR1cmVWZXJpZmljYXRpb24oYm9vbGVhbiBmZWF0dXJlVmVyaWZpY2F0aW9uKSB7Ci0JCXRoaXMuZmVhdHVyZVZlcmlmaWNhdGlvbiA9IGZlYXR1cmVWZXJpZmljYXRpb247Ci0JfQotCi0JLyoKLQkgKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFscmVhZHlTZWVuKCkgewotCQlyZXR1cm4gYWxyZWFkeVNlZW47Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhbHJlYWR5U2Vlbihib29sZWFuIHNlZW4pIHsKLQkJcmV0dXJuIHRoaXMuYWxyZWFkeVNlZW4gPSBzZWVuOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VjdXJpdHkvSmFyVmVyaWZpZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlY3VyaXR5L0phclZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYjI1YjIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VjdXJpdHkvSmFyVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlY3VyaXR5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkNvbnRlbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVZlcmlmaWNhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JVmVyaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSW5zdGFsbE1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSmFyQ29udGVudFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVmVyaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5jb25uZWN0aW9uLkNvbm5lY3Rpb25GYWN0b3J5OwotCi0vKioKLSAqIFRoZSBKYXJWZXJpZmllciB3aWxsIGNoZWNrIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIEpBUi4KLSAqIElmIHRoZSBKYXIgaXMgc2lnbmVkIGFuZCB0aGUgaW50ZWdyaXR5IGlzIHZhbGlkYXRlZCwKLSAqIGl0IHdpbGwgY2hlY2sgaWYgb25lIG9mIHRoZSBjZXJ0aWZpY2F0ZSBvZiBlYWNoIGZpbGUKLSAqIGlzIGluIG9uZSBvZiB0aGUga2V5c3RvcmUuCi0gKgotICovCi0KLXB1YmxpYyBjbGFzcyBKYXJWZXJpZmllciBleHRlbmRzIFZlcmlmaWVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5JRkVTVCA9ICJNRVRBLUlORiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSmFyVmVyaWZpY2F0aW9uUmVzdWx0IHJlc3VsdDsKLQlwcml2YXRlIExpc3QgLypvZiBDZXJ0aWZpY2F0ZVBhaXIqLwotCXRydXN0ZWRDZXJ0aWZpY2F0ZXM7Ci0JcHJpdmF0ZSBib29sZWFuIGFjY2VwdFVuc2lnbmVkRmlsZXM7Ci0JcHJpdmF0ZSBMaXN0IC8qIG9mIEtleVN0b3JlICovCi0JbGlzdE9mS2V5c3RvcmVzOwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCXByaXZhdGUgRmlsZSBqYXJGaWxlOwotCi0JcHJpdmF0ZSBzdGF0aWMJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzgxOTJdOwotCQotCS8qCi0JICogRGVmYXVsdCBDb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBKYXJWZXJpZmllcigpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiB0aGUga2V5c3RvcmVzLgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRLZXlTdG9yZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChsaXN0T2ZLZXlzdG9yZXMgPT0gbnVsbCkgewotCQkJbGlzdE9mS2V5c3RvcmVzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJCUtleVN0b3JlcyBsaXN0T2ZLZXlzdG9yZUhhbmRsZXMgPSBuZXcgS2V5U3RvcmVzKCk7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCQlLZXlTdG9yZSBrZXlzdG9yZSA9IG51bGw7Ci0JCQlLZXlzdG9yZUhhbmRsZSBoYW5kbGUgPSBudWxsOwotCQkJd2hpbGUgKGxpc3RPZktleXN0b3JlSGFuZGxlcy5oYXNOZXh0KCkpIHsKLQkJCQl0cnkgewotCQkJCQloYW5kbGUgPSBsaXN0T2ZLZXlzdG9yZUhhbmRsZXMubmV4dCgpOwotCQkJCQlpbiA9IENvbm5lY3Rpb25GYWN0b3J5LmdldChoYW5kbGUuZ2V0TG9jYXRpb24oKSkuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWtleXN0b3JlID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoaGFuZGxlLmdldFR5cGUoKSk7Ci0JCQkJCQlrZXlzdG9yZS5sb2FkKGluLCBudWxsKTsgLy8gbm8gcGFzc3dvcmQKLQkJCQkJfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkphclZlcmlmaWVyX1VuYWJsZVRvRmluZEVuY3J5cHRpb24sIChuZXcgU3RyaW5nW10geyBoYW5kbGUuZ2V0TG9jYXRpb24oKS50b0V4dGVybmFsRm9ybSgpIH0pKSwgZSk7Ci0JCQkJCX0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkphclZlcmlmaWVyX1VuYWJsZVRvTG9hZENlcnRpZmljYXRlLCAobmV3IFN0cmluZ1tdIHsgaGFuZGxlLmdldExvY2F0aW9uKCkudG9FeHRlcm5hbEZvcm0oKSB9KSksIGUpOwotCQkJCQl9IGNhdGNoIChLZXlTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5KYXJWZXJpZmllcl9VbmFibGVUb0ZpbmRQcm92aWRlckZvcktleXN0b3JlLCAobmV3IFN0cmluZ1tdIHsgaGFuZGxlLmdldFR5cGUoKSB9KSksIGUpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJaWYgKGluICE9IG51bGwpIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpbi5jbG9zZSgpOwotCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl9IC8vIG5vdGhpbmcKLQkJCQkJCX0KLQkJCQkJfSAvLyB0cnkgbG9hZGluZyBhIGtleVN0b3JlCi0KLQkJCQkJLy8ga2V5c3RvcmUgd2FzIGxvYWRlZAotCQkJCQlsaXN0T2ZLZXlzdG9yZXMuYWRkKGtleXN0b3JlKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIG5vdGhpbmcuLi4gaWYgdGhlIGtleXN0b3JlIGRvZXNuJ3QgZXhpc3QsIGNvbnRpbnVlCQotCQkJCX0KLQotCQkJfSAvLyB3aGlsZSBhbGwga2V5IHN0b3JlcwotCi0JCX0KLQotCQlyZXR1cm4gbGlzdE9mS2V5c3RvcmVzOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXJlc3VsdCA9IG51bGw7Ci0JCXRydXN0ZWRDZXJ0aWZpY2F0ZXMgPSBudWxsOwotCQlhY2NlcHRVbnNpZ25lZEZpbGVzID0gZmFsc2U7Ci0JCWxpc3RPZktleXN0b3JlcyA9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBpbml0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXQoSUZlYXR1cmUgZmVhdHVyZSwgQ29udGVudFJlZmVyZW5jZSBjb250ZW50UmVmKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWphckZpbGUgPSBudWxsOwotCQlpZiAoY29udGVudFJlZiBpbnN0YW5jZW9mIEphckNvbnRlbnRSZWZlcmVuY2UpIHsKLQkJCUphckNvbnRlbnRSZWZlcmVuY2UgamFyUmVmZXJlbmNlID0gKEphckNvbnRlbnRSZWZlcmVuY2UpIGNvbnRlbnRSZWY7Ci0JCQl0cnkgewotCQkJCWphckZpbGUgPSBqYXJSZWZlcmVuY2UuYXNGaWxlKCk7Ci0JCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0lOU1RBTEwpCi0JCQkJCVVwZGF0ZUNvcmUuZGVidWcoIkF0dGVtcHRpbmcgdG8gcmVhZCBKQVIgZmlsZToiK2phckZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCQkvLyAjIG9mIGVudHJpZXMKLQkJCQlpZiAoIWphckZpbGUuZXhpc3RzKCkpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwotCQkJCUphckZpbGUgamFyID0gbmV3IEphckZpbGUoamFyRmlsZSk7Ci0JCQkJaWYgKGphciAhPW51bGwpewotCQkJCQl0cnkgewotCQkJCQkJamFyLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkvLyB1bmNoZWNrZWQKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKFppcEV4Y2VwdGlvbiBlKXsKLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5KYXJWZXJpZmllcl9JbnZhbGlkSmFyLCAobmV3IFN0cmluZ1tdIHsgamFyUmVmZXJlbmNlLnRvU3RyaW5nKCkgfSkpLCBlKTsJCQkJCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuSmFyVmVyaWZpZXJfVW5hYmxlVG9BY2Nlc3NKYXIsIChuZXcgU3RyaW5nW10geyBqYXJSZWZlcmVuY2UudG9TdHJpbmcoKSB9KSksIGUpOwotCQkJfQotCQl9Ci0KLQkJcmVzdWx0ID0gbmV3IEphclZlcmlmaWNhdGlvblJlc3VsdCgpOwotCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlVOS05PV05fRVJST1IpOwotCQlyZXN1bHQuc2V0UmVzdWx0RXhjZXB0aW9uKG51bGwpOwotCQlyZXN1bHQuc2V0RmVhdHVyZShmZWF0dXJlKTsKLQkJcmVzdWx0LnNldENvbnRlbnRSZWZlcmVuY2UoY29udGVudFJlZik7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRydWUgaWYgb25lIG9mIHRoZSBjZXJ0aWZpY2F0ZSBleGlzdHMgaW4gdGhlIGtleXN0b3JlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGV4aXN0c0luS2V5c3RvcmUoQ2VydGlmaWNhdGUgY2VydCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJTGlzdCBrZXlTdG9yZXMgPSBnZXRLZXlTdG9yZXMoKTsKLQkJCWlmICgha2V5U3RvcmVzLmlzRW1wdHkoKSkgewotCQkJCUl0ZXJhdG9yIGxpc3RPZktleXN0b3JlcyA9IGtleVN0b3Jlcy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChsaXN0T2ZLZXlzdG9yZXMuaGFzTmV4dCgpKSB7Ci0JCQkJCUtleVN0b3JlIGtleXN0b3JlID0gKEtleVN0b3JlKSBsaXN0T2ZLZXlzdG9yZXMubmV4dCgpOwotCi0JCQkJCWlmIChrZXlzdG9yZS5nZXRDZXJ0aWZpY2F0ZUFsaWFzKGNlcnQpICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChLZXlTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihNZXNzYWdlcy5KYXJWZXJpZmllcl9LZXlTdG9yZU5vdExvYWRlZCwgZSk7IAotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgTGlzdCByZWFkSmFyRmlsZShKYXJGaWxlIGphckZpbGUsIFN0cmluZyBpZGVudGlmaWVyKQotCQl0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUVudW1lcmF0aW9uIGVudHJpZXMgPSBqYXJGaWxlLmVudHJpZXMoKTsKLQkJSmFyRW50cnkgY3VycmVudEVudHJ5ID0gbnVsbDsKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJbW9uaXRvci5zZXRUYXNrTmFtZShOTFMuYmluZChNZXNzYWdlcy5KYXJWZXJpZmllcl9WZXJpZnksIChuZXcgU3RyaW5nW10geyBpZGVudGlmaWVyID09IG51bGwgPyBqYXJGaWxlLmdldE5hbWUoKTogaWRlbnRpZmllciB9KSkpOyAKLQotCQl0cnkgewotCQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQljdXJyZW50RW50cnkgPSAoSmFyRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKTsKLQkJCQlsaXN0LmFkZChjdXJyZW50RW50cnkpOwotCQkJCWluID0gamFyRmlsZS5nZXRJbnB1dFN0cmVhbShjdXJyZW50RW50cnkpOwotCQkJCXdoaWxlICgoaW4ucmVhZChidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpKSAhPSAtMSkgewotCQkJCQkvLyBTZWN1cml0eSBlcnJvciB0aHJvd24gaWYgdGVtcGVyZWQKLQkJCQl9Ci0JCQkJaWYgKGluIT1udWxsKQotCQkJCQlpbi5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlVOS05PV05fRVJST1IpOwotCQkJcmVzdWx0LnNldFJlc3VsdEV4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGluICE9IG51bGwpCi0JCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoKLQkgKiBAcGFyYW0gbmV3TW9uaXRvciBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vbml0b3IoSVByb2dyZXNzTW9uaXRvciBuZXdNb25pdG9yKSB7Ci0JCW1vbml0b3IgPSBuZXdNb25pdG9yOwotCX0KLQotCS8qCi0JICogQHNlZSBJVmVyaWZpZXIjdmVyaWZ5KElGZWF0dXJlLENvbnRlbnRSZWZlcmVuY2UsYm9vbGVhbiwgSW5zdGFsbE1vbml0b3IpCi0JICovCi0JcHVibGljIElWZXJpZmljYXRpb25SZXN1bHQgdmVyaWZ5KAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlDb250ZW50UmVmZXJlbmNlIHJlZmVyZW5jZSwKLQkJYm9vbGVhbiBpc0ZlYXR1cmVWZXJpZmljYXRpb24sCi0JCUluc3RhbGxNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlpZiAocmVmZXJlbmNlID09IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCi0JCS8vIGlmIHBhcmVudCBrbm93cyBob3cgdG8gdmVyaWZ5LCBhc2sgdGhlIHBhcmVudCBmaXJzdAotCQlpZiAoZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotCQkJSVZlcmlmaWNhdGlvblJlc3VsdCB2ciA9Ci0JCQkJZ2V0UGFyZW50KCkudmVyaWZ5KGZlYXR1cmUsIHJlZmVyZW5jZSwgaXNGZWF0dXJlVmVyaWZpY2F0aW9uLCBtb25pdG9yKTsKLQkJCWlmICh2ci5nZXRWZXJpZmljYXRpb25Db2RlKCkgIT0gSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX1VOUkVDT0dOSVpFRCkKLQkJCQlyZXR1cm4gdnI7Ci0JCX0KLQotCQkvLyB0aGUgcGFyZW50IGNvdWxkbid0IHZlcmlmeQotCQlzZXRNb25pdG9yKG1vbml0b3IpOwotCQlpbml0KGZlYXR1cmUsIHJlZmVyZW5jZSk7Ci0JCXJlc3VsdC5pc0ZlYXR1cmVWZXJpZmljYXRpb24oaXNGZWF0dXJlVmVyaWZpY2F0aW9uKTsKLQotCQlpZiAoamFyRmlsZSE9bnVsbCkgewotCQkJCXJlc3VsdCA9IHZlcmlmeShqYXJGaWxlLmdldEFic29sdXRlUGF0aCgpLCByZWZlcmVuY2UuZ2V0SWRlbnRpZmllcigpKTsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdC5zZXRWZXJpZmljYXRpb25Db2RlKElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9VTlJFQ09HTklaRUQpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgSmFyVmVyaWZpY2F0aW9uUmVzdWx0IHZlcmlmeShTdHJpbmcgZmlsZSwgU3RyaW5nIGlkZW50aWZpZXIpIHsKLQotCQl0cnkgewotCi0JCQkvLyB2ZXJpZnkgaW50ZWdyaXR5Ci0JCQl2ZXJpZnlJbnRlZ3JpdHkoZmlsZSwgaWRlbnRpZmllcik7Ci0KLQkJCS8vIGRvIG5vdCBjbG9zZSBpbnB1dCBzdHJlYW0KLQkJCS8vIGFzIHZlcmlmeUludGVncml0eSBhbHJlYWR5IGRpZCBpdAotCi0JCQkvL2lmIHVzZXIgYWxyZWFkeSBzYWlkIHllcwotCQkJcmVzdWx0LmFscmVhZHlTZWVuKGFscmVhZHlWYWxpZGF0ZWQoKSk7Ci0KLQkJCS8vIHZlcmlmeSBzb3VyY2UgY2VydGlmaWNhdGUKLQkJCWlmIChyZXN1bHQuZ2V0VmVyaWZpY2F0aW9uQ29kZSgpCi0JCQkJPT0gSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX1NJR05FRF9VTlJFQ09HTklaRUQpIHsKLQkJCQl2ZXJpZnlBdXRoZW50aWNhdGlvbigpOwotCQkJfQotCi0JCQkvLyBzYXZlIHRoZSBmYWN0IHRoZSBmaWxlIGlzIG5vdCBzaWduZWQsIHNvIHRoZSB1c2VyIHdpbGwgbm90IGJlIHByb21wdGVkIGFnYWluIAotCQkJaWYgKHJlc3VsdC5nZXRWZXJpZmljYXRpb25Db2RlKCkKLQkJCQk9PSBJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfTk9UX1NJR05FRCkgewotCQkJCWFjY2VwdFVuc2lnbmVkRmlsZXMgPSB0cnVlOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlVOS05PV05fRVJST1IpOwotCQkJcmVzdWx0LnNldFJlc3VsdEV4Y2VwdGlvbihlKTsKLQkJfQotCi0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJcmVzdWx0LnNldFZlcmlmaWNhdGlvbkNvZGUoSVZlcmlmaWNhdGlvblJlc3VsdC5WRVJJRklDQVRJT05fQ0FOQ0VMTEVEKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBWZXJpZmllcyB0aGF0IGVhY2ggZmlsZSBoYXMgYXQgbGVhc3Qgb25lIGNlcnRpZmljYXRlCi0JICogdmFsaWQgaW4gdGhlIGtleXN0b3JlCi0JICoKLQkgKiBBdCBsZWFzdCBvbmUgY2VydGlmaWNhdGUgZnJvbSBlYWNoIENlcnRpZmljYXRlIEFycmF5Ci0JICogb2YgdGhlIEphciBmaWxlIG11c3QgYmUgZm91bmQgaW4gdGhlIGtub3duIENlcnRpZmljYXRlcwotCSAqLwotCXByaXZhdGUgdm9pZCB2ZXJpZnlBdXRoZW50aWNhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlDZXJ0aWZpY2F0ZVBhaXJbXSBlbnRyaWVzID0gcmVzdWx0LmdldFJvb3RDZXJ0aWZpY2F0ZXMoKTsKLQkJYm9vbGVhbiBjZXJ0aWZpY2F0ZUZvdW5kID0gZmFsc2U7Ci0KLQkJLy8gSWYgYWxsIHRoZSBjZXJ0aWZpY2F0ZSBvZiBhbiBlbnRyeSBhcmUKLQkJLy8gbm90IGZvdW5kIGluIHRoZSBsaXN0IG9mIGtub3duIGNlcnRpZmNhdGUKLQkJLy8gdGhlIGNlcnRpZmljYXRlIGlzIG5vdCB0cnVzdGVkIGJ5IGFueSBrZXlzdG9yZS4KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQljZXJ0aWZpY2F0ZUZvdW5kID0gZXhpc3RzSW5LZXlzdG9yZShlbnRyaWVzW2ldLmdldFJvb3QoKSk7Ci0JCQlpZiAoY2VydGlmaWNhdGVGb3VuZCkgewotCQkJCXJlc3VsdC5zZXRWZXJpZmljYXRpb25Db2RlKElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9TSUdORURfUkVDT0dOSVpFRCk7Ci0JCQkJcmVzdWx0LnNldEZvdW5kQ2VydGlmaWNhdGUoZW50cmllc1tpXSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBWZXJpZmllcyB0aGUgaW50ZWdyaXR5IG9mIHRoZSBKQVIKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SW50ZWdyaXR5KFN0cmluZyBmaWxlLCBTdHJpbmcgaWRlbnRpZmllcikgewotCi0JCUphckZpbGUgamFyRmlsZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCS8vIElmIHRoZSBKQVIgaXMgc2lnbmVkIGFuZCBub3QgdmFsaWQKLQkJCS8vIGEgc2VjdXJpdHkgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duCi0JCQkvLyB3aGlsZSByZWFkaW5nIGl0Ci0JCQlqYXJGaWxlID0gbmV3IEphckZpbGUoZmlsZSwgdHJ1ZSk7Ci0JCQlMaXN0IGZpbGVzSW5KYXIgPSByZWFkSmFyRmlsZShqYXJGaWxlLCBpZGVudGlmaWVyKTsKLQotCQkJLy8geW91IGhhdmUgdG8gcmVhZCBhbGwgdGhlIGZpbGVzIG9uY2UKLQkJCS8vIGJlZm9yZSBnZXR0aW5nIHRoZSBjZXJ0aWZpY2F0ZXMgCi0JCQlpZiAoamFyRmlsZS5nZXRNYW5pZmVzdCgpICE9IG51bGwpIHsKLQkJCQlJdGVyYXRvciBpdGVyID0gZmlsZXNJbkphci5pdGVyYXRvcigpOwotCQkJCWJvb2xlYW4gY2VydGlmaWNhdGVGb3VuZCA9IGZhbHNlOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlKYXJFbnRyeSBjdXJyZW50SmFyRW50cnkgPSAoSmFyRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCQlDZXJ0aWZpY2F0ZVtdIGNlcnRzID0gY3VycmVudEphckVudHJ5LmdldENlcnRpZmljYXRlcygpOwotCQkJCQlpZiAoKGNlcnRzICE9IG51bGwpICYmIChjZXJ0cy5sZW5ndGggIT0gMCkpIHsKLQkJCQkJCWNlcnRpZmljYXRlRm91bmQgPSB0cnVlOwotCQkJCQkJcmVzdWx0LmFkZENlcnRpZmljYXRlcyhjZXJ0cyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmcgamFyRW50cnlOYW1lID0gY3VycmVudEphckVudHJ5LmdldE5hbWUoKTsKLQkJCQkJCWlmICghamFyRW50cnlOYW1lLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChNQU5JRkVTVCkKLQkJCQkJCQkmJiAhY3VycmVudEphckVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJCQkvLyBpZiB0aGUgamFyRW50cnkgaXMgbm90IGluIE1BTklGRVNULCBjb25zaWRlciB0aGUgd2hvbGUgZmlsZSB1bnNpZ25lZAkJCQkJCQkKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGNlcnRpZmljYXRlRm91bmQpCi0JCQkJCXJlc3VsdC5zZXRWZXJpZmljYXRpb25Db2RlKElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9TSUdORURfVU5SRUNPR05JWkVEKTsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdC5zZXRWZXJpZmljYXRpb25Db2RlKElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9OT1RfU0lHTkVEKTsKLQkJCX0gZWxzZSB7Ci0JCQkJRXhjZXB0aW9uIGUgPSBuZXcgRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkphclZlcmlmaWVyX0ludmFsaWRGaWxlLCAobmV3IFN0cmluZ1tdIHsgZmlsZSB9KSkpOwotCQkJCXJlc3VsdC5zZXRSZXN1bHRFeGNlcHRpb24oZSk7Ci0JCQkJcmVzdWx0LnNldFZlcmlmaWNhdGlvbkNvZGUoSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX05PVF9TSUdORUQpOwotCQkJCVVwZGF0ZUNvcmUud2FybihudWxsLGUpOwotCQkJfQotCQl9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBKYXIgZmlsZSBpcyBzaWduZWQKLQkJCS8vIGJ1dCBjb250ZW50IGhhcyBjaGFuZ2VkIHNpbmNlIHNpZ25lZAotCQkJcmVzdWx0LnNldFZlcmlmaWNhdGlvbkNvZGUoSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX0NPUlJVUFRFRCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdC5zZXRWZXJpZmljYXRpb25Db2RlKElWZXJpZmljYXRpb25SZXN1bHQuVkVSSUZJQ0FUSU9OX0NBTkNFTExFRCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlVOS05PV05fRVJST1IpOwotCQkJcmVzdWx0LnNldFJlc3VsdEV4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChqYXJGaWxlIT1udWxsKXsKLQkJCQl0cnkge2phckZpbGUuY2xvc2UoKTt9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKXt9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGFscmVhZHlWYWxpZGF0ZWQoKSB7Ci0KLQkJaWYgKHJlc3VsdC5nZXRWZXJpZmljYXRpb25Db2RlKCkgPT0gSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX05PVF9TSUdORUQpCi0JCQlyZXR1cm4gKGFjY2VwdFVuc2lnbmVkRmlsZXMpOwotCi0JCWlmIChnZXRUcnVzdGVkQ2VydGlmaWNhdGVzKCkgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXRlciA9IGdldFRydXN0ZWRDZXJ0aWZpY2F0ZXMoKS5pdGVyYXRvcigpOwotCQkJQ2VydGlmaWNhdGVQYWlyW10gamFyUGFpcnMgPSByZXN1bHQuZ2V0Um9vdENlcnRpZmljYXRlcygpOwotCi0JCQkvLyBjaGVjayBpZiB0aGlzIGlzIG5vdCBhIHVzZXIgYWNjZXB0ZWQgY2VydGlmaWNhdGUgZm9yIHRoaXMgZmVhdHVyZQkKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCUNlcnRpZmljYXRlUGFpciB0cnVzdGVkQ2VydGlmaWNhdGUgPSAoQ2VydGlmaWNhdGVQYWlyKSBpdGVyLm5leHQoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGphclBhaXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICh0cnVzdGVkQ2VydGlmaWNhdGUuZXF1YWxzKGphclBhaXJzW2ldKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGlmIGNlcnRpZmljYXRlIHBhaXIgbm90IGZvdW5kIGluIHRydXN0ZWQgYWRkIGl0IGZvciBuZXh0IHRpbWUKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgamFyUGFpcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlhZGRUcnVzdGVkQ2VydGlmaWNhdGUoamFyUGFpcnNbaV0pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRydXN0ZWRDZXJ0aWZpY2F0ZShDZXJ0aWZpY2F0ZVBhaXIgcGFpcikgewotCQlpZiAodHJ1c3RlZENlcnRpZmljYXRlcyA9PSBudWxsKQotCQkJdHJ1c3RlZENlcnRpZmljYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHBhaXIgIT0gbnVsbCkKLQkJCXRydXN0ZWRDZXJ0aWZpY2F0ZXMuYWRkKHBhaXIpOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFRydXN0ZWRDZXJ0aWZpY2F0ZXMoKSB7Ci0JCWlmICh0cnVzdGVkQ2VydGlmaWNhdGVzID09IG51bGwpCi0JCQl0cnVzdGVkQ2VydGlmaWNhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gdHJ1c3RlZENlcnRpZmljYXRlczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElWZXJpZmllciNzZXRQYXJlbnQoSVZlcmlmaWVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChJVmVyaWZpZXIgcGFyZW50VmVyaWZpZXIpIHsKLQkJc3VwZXIuc2V0UGFyZW50KHBhcmVudFZlcmlmaWVyKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VjdXJpdHkvS2V5U3RvcmVzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWN1cml0eS9LZXlTdG9yZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkwN2NhNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWN1cml0eS9LZXlTdG9yZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlY3VyaXR5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cml0eTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuY29ubmVjdGlvbi5Db25uZWN0aW9uRmFjdG9yeTsKLS8qKgotICogQ2xhc3MgdG8gbWFuYWdlIHRoZSBkaWZmZXJlbnQgS2V5U3RvcmVzIHdlIHNob3VsZAotICogY2hlY2sgZm9yIGNlcnRpZmljYXRlcyBvZiBTaWduZWQgSkFSCi0gKi8KLXB1YmxpYyBjbGFzcyBLZXlTdG9yZXMgewotCi0KLQkvKioKLQkgKiBqYXZhLnBvbGljeSBmaWxlcyBwcm9wZXJ0aWVzIG9mIHRoZSBqYXZhLnNlY3VyaXR5IGZpbGUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9QT0xJQ1lfVVJMID0gInBvbGljeS51cmwuIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRGVmYXVsdCBrZXlzdG9yZSB0eXBlIGluIGphdmEuc2VjdXJpdHkgZmlsZQotCSAqLwkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9LRVlTVE9SRV9UWVBFID0gImtleXN0b3JlLnR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBMaXN0IG9mIEtleXN0b3JlSGFuZGxlIHBvaW50aW5nIG9mIHZhbGlkIEtleVN0b3JlcwotCSAqIHRoZSBVUkwgb2YgdGhlIEtleXN0b3JlSGFuZGxlIGlzIG5vdCB0ZXN0ZWQgeWV0Li4uCi0JICovCi0JcHJpdmF0ZSBMaXN0IC8qIG9mIEtleXN0b3JlSGFuZGxlICovIGxpc3RPZktleVN0b3JlczsKLQotCS8qKgotCSAqIEl0ZXJhdG9yCi0JICovCi0JcHJpdmF0ZSBJdGVyYXRvciBpdGVyYXRvcjsKLQkvKioKLQkgKiBLZXlTdG9yZXMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgS2V5U3RvcmVzKCkgewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplRGVmYXVsdEtleVN0b3JlcygpOwotCX0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIEl0ZXJhdG9yIGdldEl0ZXJhdG9yKCkgewotCQlpZiAoaXRlcmF0b3IgPT0gbnVsbCkKLQkJCWl0ZXJhdG9yID0gbGlzdE9mS2V5U3RvcmVzLml0ZXJhdG9yKCk7Ci0JCXJldHVybiBpdGVyYXRvcjsKLQl9Ci0JLyoqCi0JICogcmV0dXJucyB0cnVzIGlmIHRoZXJlIGlzIG1vcmUgS2V5c3RvcmVzIGluIHRoZSBsaXN0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIGdldEl0ZXJhdG9yKCkuaGFzTmV4dCgpOwotCX0KLQkvKioKLQkgKiBwb3B1bGF0ZSB0aGUgbGlzdCBvZiBLZXlzdG9yZXMKLQkgKiBzaG91bGQgYmUgZG9uZSB3aXRoIERpYWxvZyB3aXRoIENhbmNlbC9Ta2lwIGJ1dHRvbiBpZgotCSAqIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBVUkwgaXMgZG93bi4uLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRGVmYXVsdEtleVN0b3JlcygpIHsKLQotCQlsaXN0T2ZLZXlTdG9yZXMgPSBuZXcgQXJyYXlMaXN0KDUpOwotCi0JCS8vIGdldCBKUkUgY2FjZXJ0cwotCQl0cnkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwoImZpbGUiLCBudWxsLCAwLCBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpICsgRmlsZS5zZXBhcmF0b3IgKyAibGliIiArIEZpbGUuc2VwYXJhdG9yICsgInNlY3VyaXR5IiArIEZpbGUuc2VwYXJhdG9yICsgImNhY2VydHMiKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJbGlzdE9mS2V5U3RvcmVzLmFkZChuZXcgS2V5c3RvcmVIYW5kbGUodXJsLFNlY3VyaXR5LmdldFByb3BlcnR5KERFRkFVTFRfS0VZU1RPUkVfVFlQRSkpKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNob3VsZCBub3QgaGFwcGVuLCBoYXJkY29kZWQuLi4KLQkJfQotCi0JCS8vIGdldCBqYXZhLmhvbWUgLmtleXN0b3JlCi0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsIG51bGwsIDAsIFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIikgKyBGaWxlLnNlcGFyYXRvciArICIua2V5c3RvcmUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCWxpc3RPZktleVN0b3Jlcy5hZGQobmV3IEtleXN0b3JlSGFuZGxlKHVybCxTZWN1cml0eS5nZXRQcm9wZXJ0eShERUZBVUxUX0tFWVNUT1JFX1RZUEUpKSk7Ci0JCX0KLQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaG91bGQgbm90IGhhcHBlbiwgaGFyZGNvZGVkLi4uCi0JCX0KLQotCQkvLyBnZXQgS2V5U3RvcmVzIGZyb20gcG9saWN5IGZpbGVzLi4uCi0JCWludCBpbmRleCA9IDE7Ci0JCVN0cmluZyBqYXZhX3BvbGljeSA9IFNlY3VyaXR5LmdldFByb3BlcnR5KEpBVkFfUE9MSUNZX1VSTCtpbmRleCk7Ci0JCXdoaWxlIChqYXZhX3BvbGljeSE9bnVsbCl7Ci0JCQkvLyByZXRyaWV2ZSBrZXlzdG9yZSB1cmwgZnJvbSBqYXZhLnBvbGljeQotCQkJLy8gYWxzbyByZXRyaWV2ZSBrZXlzdG9yZSB0eXBlCi0JCQlLZXlzdG9yZUhhbmRsZSBrZXlzdG9yZSA9IGdldEtleXN0b3JlRnJvbUxvY2F0aW9uKGphdmFfcG9saWN5KTsKLQkJCWlmIChrZXlzdG9yZSE9bnVsbCl7Ci0JCQkJbGlzdE9mS2V5U3RvcmVzLmFkZChrZXlzdG9yZSk7Ci0JCQl9Ci0JCQlpbmRleCsrOwkKLQkJCWphdmFfcG9saWN5ID0gU2VjdXJpdHkuZ2V0UHJvcGVydHkoSkFWQV9QT0xJQ1lfVVJMK2luZGV4KTsJCQkKLQkJfQotCi0JfQotCS8qKgotCSAqIHJldHVybnMgdGhlIFVSTCBmb3IgdGhlIE5leHQgS2V5c3RvcmVIYW5kbGUKLQkgKi8KLQlwdWJsaWMgS2V5c3RvcmVIYW5kbGUgbmV4dCgpIHsKLQkJcmV0dXJuIChLZXlzdG9yZUhhbmRsZSkgZ2V0SXRlcmF0b3IoKS5uZXh0KCk7Ci0JfQotCQotCS8qKgotCSAqIHJldHJpZXZlIHRoZSBrZXlzdG9yZSBmcm9tIGphdmEucG9saWN5IGZpbGUKLQkgKi8KLQlwcml2YXRlIEtleXN0b3JlSGFuZGxlIGdldEtleXN0b3JlRnJvbUxvY2F0aW9uKFN0cmluZyBsb2NhdGlvbil7Ci0JCQotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCWNoYXJbXSBidWZmID0gbmV3IGNoYXJbNDA5Nl07Ci0JCQotCQkKLQkJaW50IGluZGV4T2YkID0gbG9jYXRpb24uaW5kZXhPZigiJHsiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgaW5kZXhPZkN1cmx5ID0gbG9jYXRpb24uaW5kZXhPZignfScsaW5kZXhPZiQpOwotCQlpZiAoaW5kZXhPZiQhPS0xICYmIGluZGV4T2ZDdXJseSE9LTEpewotCQkJU3RyaW5nIHByb3AgPSBTeXN0ZW0uZ2V0UHJvcGVydHkobG9jYXRpb24uc3Vic3RyaW5nKGluZGV4T2YkKzIsaW5kZXhPZkN1cmx5KSk7Ci0JCQlTdHJpbmcgbG9jYXRpb24yID0gbG9jYXRpb24uc3Vic3RyaW5nKDAsaW5kZXhPZiQpOwotCQkJbG9jYXRpb24yICs9IHByb3A7Ci0JCQlsb2NhdGlvbjIgKz0gbG9jYXRpb24uc3Vic3RyaW5nKGluZGV4T2ZDdXJseSsxKTsKLQkJCWxvY2F0aW9uID0gbG9jYXRpb24yOwotCQl9Ci0JCQotCQkKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKGxvY2F0aW9uKTsKLQkJCWluID0gQ29ubmVjdGlvbkZhY3RvcnkuZ2V0KHVybCkuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pOwotCQkJaW50IHJlc3VsdCA9IHJlYWRlci5yZWFkKGJ1ZmYpOwotCQkJU3RyaW5nQnVmZmVyIGNvbnRlbnRCdWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJd2hpbGUgKHJlc3VsdCE9LTEpewotCQkJCWNvbnRlbnRCdWZmLmFwcGVuZChidWZmLDAscmVzdWx0KTsKLQkJCQlyZXN1bHQgPSByZWFkZXIucmVhZChidWZmKTsJCQkJCi0JCQl9Ci0KLQkJCWlmIChjb250ZW50QnVmZi5sZW5ndGgoKT4wKXsJCQkKLQkJCQlTdHJpbmcgY29udGVudCA9IG5ldyBTdHJpbmcoY29udGVudEJ1ZmYpOwotCQkJCWludCBpbmRleE9mS2V5c3RvcmUgPSBjb250ZW50LmluZGV4T2YoImtleXN0b3JlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoaW5kZXhPZktleXN0b3JlICE9IC0xKXsKLQkJCQkJaW50IGluZGV4T2ZTZW1pQ29sdW1uID0gY29udGVudC5pbmRleE9mKCc7JyxpbmRleE9mS2V5c3RvcmUpOwotCQkJCQlyZXR1cm4gZ2V0S2V5c3RvcmVGcm9tU3RyaW5nKGNvbnRlbnQuc3Vic3RyaW5nKGluZGV4T2ZLZXlzdG9yZSxpbmRleE9mU2VtaUNvbHVtbiksdXJsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXsKLQkJCWxvZyhlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7Ci0JCQkvLyB1cmwub3BlblN0cmVhbSwgcmVhZGVyLnJlYWQgKHgyKQotCQkJLy8gb25seSBsb2csIHRoZSBrZXlzdG9yZSBtYXkgbm90IGV4aXN0Ci0JCQlsb2coZSk7CQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluIT1udWxsKXsKLQkJCQl0cnkgewotCQkJCQlpbi5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpe30KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogcmV0cmlldmUgdGhlIGtleXN0b3JlIGZyb20gamF2YS5wb2xpY3kgZmlsZQotCSAqLwotCXByaXZhdGUgS2V5c3RvcmVIYW5kbGUgZ2V0S2V5c3RvcmVGcm9tU3RyaW5nKFN0cmluZyBjb250ZW50LFVSTCByb290VVJMKXsKLQkJS2V5c3RvcmVIYW5kbGUgaGFuZGxlID0gbnVsbDsKLQkJU3RyaW5nIGtleVN0b3JlVHlwZSA9IFNlY3VyaXR5LmdldFByb3BlcnR5KERFRkFVTFRfS0VZU1RPUkVfVFlQRSk7Ci0JCQotCQkKLQkJaW50IGluZGV4T2ZTcGFjZSA9IGNvbnRlbnQuaW5kZXhPZignICcpOwotCQlpZiAoaW5kZXhPZlNwYWNlPT0tMSkgcmV0dXJuIG51bGw7Ci0JCQotCQlpbnQgc2Vjb25kU3BhY2UgPSBjb250ZW50Lmxhc3RJbmRleE9mKCcsJyk7Ci0JCWlmIChzZWNvbmRTcGFjZT09LTEpIHsKLQkJCXNlY29uZFNwYWNlID0gY29udGVudC5sZW5ndGgoKTsKLQkJfSBlbHNlIHsKLQkJCWtleVN0b3JlVHlwZSA9IGNvbnRlbnQuc3Vic3RyaW5nKHNlY29uZFNwYWNlKzEsY29udGVudC5sZW5ndGgoKSkudHJpbSgpOwotCQl9Ci0JCQotCQlVUkwgdXJsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXVybCA9IG5ldyBVUkwoY29udGVudC5zdWJzdHJpbmcoaW5kZXhPZlNwYWNlLHNlY29uZFNwYWNlKSk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXsKLQkJCWxvZyhlKTsKLQkJCS8vIHRoZSB1cmwgbWF5YmUgcmVsYXRpdmUKLQkJCXRyeSB7Ci0JCQl1cmwgPSBuZXcgVVJMKHJvb3RVUkwsY29udGVudC5zdWJzdHJpbmcoaW5kZXhPZlNwYWNlLHNlY29uZFNwYWNlKSk7CQkJCQotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUxKXsKLQkJCQlsb2coZTEpOwkJCQotCQkJfQotCQl9Ci0KLQkJaWYgKHVybCE9bnVsbCkKLQkJCWhhbmRsZSA9IG5ldyBLZXlzdG9yZUhhbmRsZSh1cmwsa2V5U3RvcmVUeXBlKTsJCQkJCi0JCQkKLQkJcmV0dXJuIGhhbmRsZTsKLQl9CQotCQotCXByaXZhdGUgdm9pZCBsb2coRXhjZXB0aW9uIGUpewotCQlVcGRhdGVDb3JlLndhcm4oIkNhbm5vdCByZXRyaWV2ZSBhIEtleVN0b3JlIixlKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlY3VyaXR5L0tleXN0b3JlSGFuZGxlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWN1cml0eS9LZXlzdG9yZUhhbmRsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWE3YjI5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlY3VyaXR5L0tleXN0b3JlSGFuZGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlY3VyaXR5OwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLQotCi0gCi0vKioKLSAqIE1hbmFnZXMgYSBoYW5kbGUgdG8gYSBrZXlzdG9yZQotICovCi1wdWJsaWMgY2xhc3MgS2V5c3RvcmVIYW5kbGUgewotCQotCXByaXZhdGUgVVJMIGxvY2F0aW9uOwotCXByaXZhdGUgU3RyaW5nIHR5cGU7Ci0JCi0JcHVibGljIEtleXN0b3JlSGFuZGxlKFVSTCB1cmwsIFN0cmluZyB0eXBlKXsKLQkJdGhpcy5sb2NhdGlvbiA9IHVybDsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsb2NhdGlvbi4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBVUkwKLQkgKi8KLQlwdWJsaWMgVVJMIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbG9jYXRpb24uCi0JICogQHBhcmFtIGxvY2F0aW9uIFRoZSBsb2NhdGlvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihVUkwgbG9jYXRpb24pIHsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHR5cGUuCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0eXBlLgotCSAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3ZlcmlmaWVyL0NlcnRWZXJpZmljYXRpb25SZXN1bHQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3ZlcmlmaWVyL0NlcnRWZXJpZmljYXRpb25SZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjM2I5ZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC92ZXJpZmllci9DZXJ0VmVyaWZpY2F0aW9uUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC52ZXJpZmllcjsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC4qOwotaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2lnbmVkY29udGVudC5TaWduZWRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2lnbmVkY29udGVudC5TaWduZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5NZXNzYWdlczsKLQotLyoqCi0gKiBSZXN1bHQgb2YgdGhlIHNlcnZpY2UKLSAqLwotcHVibGljIGNsYXNzIENlcnRWZXJpZmljYXRpb25SZXN1bHQgaW1wbGVtZW50cyBJVmVyaWZpY2F0aW9uUmVzdWx0IHsKLQotCi0JcHJpdmF0ZSBpbnQgcmVzdWx0Q29kZTsKLQlwcml2YXRlIGludCB2ZXJpZmljYXRpb25Db2RlOwotCXByaXZhdGUgRXhjZXB0aW9uIHJlc3VsdEV4Y2VwdGlvbjsKLQotCXByaXZhdGUgU2lnbmVkQ29udGVudCBzaWduZWRDb250ZW50OwotCXByaXZhdGUgU3RyaW5nIHNpZ25lckluZm87Ci0JcHJpdmF0ZSBTdHJpbmcgdmVyaWZpZXJJbmZvOwotCXByaXZhdGUgQ29udGVudFJlZmVyZW5jZSBjb250ZW50UmVmZXJlbmNlOwotCXByaXZhdGUgSUZlYXR1cmUgZmVhdHVyZTsKLQlwcml2YXRlIGJvb2xlYW4gZmVhdHVyZVZlcmlmaWNhdGlvbjsKLQlwcml2YXRlIGJvb2xlYW4gYWxyZWFkeVNlZW47Ci0KLQlwdWJsaWMgQ2VydFZlcmlmaWNhdGlvblJlc3VsdCgpIHsKLQl9Ci0JCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlc3VsdENvZGUoKSB7Ci0JCXJldHVybiByZXN1bHRDb2RlOwotCX0KLQkKLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyBFeGNlcHRpb24gZ2V0VmVyaWZpY2F0aW9uRXhjZXB0aW9uKCkgewotCQlyZXR1cm4gcmVzdWx0RXhjZXB0aW9uOwotCX0KLQkKLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc3VsdENvZGUoaW50IG5ld1Jlc3VsdENvZGUpIHsKLQkJcmVzdWx0Q29kZSA9IG5ld1Jlc3VsdENvZGU7Ci0JfQotCQotCS8qCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzdWx0RXhjZXB0aW9uKEV4Y2VwdGlvbiBuZXdSZXN1bHRFeGNlcHRpb24pIHsKLQkJcmVzdWx0RXhjZXB0aW9uID0gbmV3UmVzdWx0RXhjZXB0aW9uOwotCX0KLQkKLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmVyaWZpY2F0aW9uQ29kZSgpIHsKLQkJcmV0dXJuIHZlcmlmaWNhdGlvbkNvZGU7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJpZmljYXRpb25Db2RlKGludCB2ZXJpZmljYXRpb25Db2RlKSB7Ci0JCXRoaXMudmVyaWZpY2F0aW9uQ29kZSA9IHZlcmlmaWNhdGlvbkNvZGU7Ci0JfQotCi0Jdm9pZCBzZXRTaWduZWRDb250ZW50KFNpZ25lZENvbnRlbnQgc2lnbmVkQ29udGVudCkgewotCQl0aGlzLnNpZ25lZENvbnRlbnQgPSBzaWduZWRDb250ZW50OwotCX0KLQotCXB1YmxpYyBTaWduZXJJbmZvW10gZ2V0U2lnbmVycygpIHsKLQkJcmV0dXJuIHNpZ25lZENvbnRlbnQuZ2V0U2lnbmVySW5mb3MoKTsKLQl9Ci0KLQkvKgotCSAqIEluaXRpYWxpemVzIHRoZSBzaWduZXJJbmZvIGFuZCB0aGUgVmVyaWZpZXJJbmZvIGZyb20gdGhlIENlcnRpZmljYXRlIFBhaXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUNlcnRpZmljYXRlcygpewotCQlYNTA5Q2VydGlmaWNhdGUgY2VydFJvb3QgPSBudWxsOwotCQlYNTA5Q2VydGlmaWNhdGUgY2VydElzc3VlciA9IG51bGw7Ci0JCVNpZ25lckluZm8gdHJ1c3RlZFNpZ25lcjsKLQkJU2lnbmVySW5mb1tdIHNpZ25lcnMgPSBnZXRTaWduZXJzKCk7Ci0JCWlmIChzaWduZXJzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQl0cnVzdGVkU2lnbmVyID0gc2lnbmVyc1swXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaWduZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoc2lnbmVyc1tpXS5pc1RydXN0ZWQoKSkgewotCQkJCXRydXN0ZWRTaWduZXIgPSBzaWduZXJzW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCUNlcnRpZmljYXRlW10gY2VydHMgPSB0cnVzdGVkU2lnbmVyLmdldENlcnRpZmljYXRlQ2hhaW4oKTsKLQkJaWYgKGNlcnRzID09IG51bGwgfHwgY2VydHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0JCWNlcnRSb290ID0gKFg1MDlDZXJ0aWZpY2F0ZSkgY2VydHNbY2VydHMubGVuZ3RoIC0gMV07Ci0JCWNlcnRJc3N1ZXIgPSAoWDUwOUNlcnRpZmljYXRlKSBjZXJ0c1swXTsKLQotCQlTdHJpbmdCdWZmZXIgc3RyYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc3RyYi5hcHBlbmQoaXNzdWVyU3RyaW5nKGNlcnRJc3N1ZXIuZ2V0U3ViamVjdEROKCkpKTsKLQkJc3RyYi5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQlzdHJiLmFwcGVuZChOTFMuYmluZChNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25SZXN1bHRfVmFsaWRCZXR3ZWVuLCAobmV3IFN0cmluZ1tdIHsgZGF0ZVN0cmluZyhjZXJ0SXNzdWVyLmdldE5vdEJlZm9yZSgpKSwgZGF0ZVN0cmluZyhjZXJ0SXNzdWVyLmdldE5vdEFmdGVyKCkpIH0pKSk7Ci0JCXN0cmIuYXBwZW5kKGNoZWNrVmFsaWRpdHkodHJ1c3RlZFNpZ25lcikpOwotCQlzaWduZXJJbmZvID0gc3RyYi50b1N0cmluZygpOwotCQlpZiAoY2VydElzc3VlciAhPSBudWxsICYmICFjZXJ0SXNzdWVyLmVxdWFscyhjZXJ0Um9vdCkpIHsKLQkJCXN0cmIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CQotCQkJc3RyYi5hcHBlbmQoaXNzdWVyU3RyaW5nKGNlcnRJc3N1ZXIuZ2V0SXNzdWVyRE4oKSkpOwotCQkJc3RyYi5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJc3RyYi5hcHBlbmQoTkxTLmJpbmQoTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uUmVzdWx0X1ZhbGlkQmV0d2VlbiwgKG5ldyBTdHJpbmdbXSB7IGRhdGVTdHJpbmcoY2VydFJvb3QuZ2V0Tm90QmVmb3JlKCkpLCBkYXRlU3RyaW5nKGNlcnRSb290LmdldE5vdEFmdGVyKCkpIH0pKSk7IAotCQkJdmVyaWZpZXJJbmZvID0gc3RyYi50b1N0cmluZygpOwotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgYSBTdHJpbmcgdG8gc2hvdyBpZiB0aGUgY2VydGlmaWNhdGUgaXMgdmFsaWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjaGVja1ZhbGlkaXR5KFNpZ25lckluZm8gc2lnbmVyKSB7Ci0KLQkJdHJ5IHsKLQkJCXNpZ25lZENvbnRlbnQuY2hlY2tWYWxpZGl0eShzaWduZXIpOwotCQl9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICgiXHJcbiIgKyBNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25SZXN1bHRfRXhwaXJlZENlcnRpZmljYXRlKTsgIC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ2VydGlmaWNhdGVOb3RZZXRWYWxpZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gKCJcclxuIiArIE1lc3NhZ2VzLkphclZlcmlmaWNhdGlvblJlc3VsdF9DZXJ0aWZpY2F0ZU5vdFlldFZhbGlkKTsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gKCJcclxuIiArIE1lc3NhZ2VzLkphclZlcmlmaWNhdGlvblJlc3VsdF9DZXJ0aWZpY2F0ZVZhbGlkKTsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIGxhYmVsIFN0cmluZyBmcm9tIGEgWDUwbmFtZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGlzc3VlclN0cmluZyhQcmluY2lwYWwgcHJpbmNpcGFsKSB7Ci0vLyAxOTkwMgotLy8JCXRyeSB7Ci0vLwkJCWlmIChwcmluY2lwYWwgaW5zdGFuY2VvZiBYNTAwTmFtZSkgewotLy8JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLS8vCQkJCVg1MDBOYW1lIG5hbWUgPSAoWDUwME5hbWUpIHByaW5jaXBhbDsKLS8vCQkJCWJ1Zi5hcHBlbmQoKG5hbWUuZ2V0RE5RdWFsaWZpZXIoKSAhPSBudWxsKSA/IG5hbWUuZ2V0RE5RdWFsaWZpZXIoKSArICIsICIgOiAiIik7Ci0vLwkJCQlidWYuYXBwZW5kKG5hbWUuZ2V0Q29tbW9uTmFtZSgpKTsKLS8vCQkJCWJ1Zi5hcHBlbmQoKG5hbWUuZ2V0T3JnYW5pemF0aW9uYWxVbml0KCkgIT0gbnVsbCkgPyAiLCAiICsgbmFtZS5nZXRPcmdhbml6YXRpb25hbFVuaXQoKSA6ICIiKTsKLS8vCQkJCWJ1Zi5hcHBlbmQoKG5hbWUuZ2V0T3JnYW5pemF0aW9uKCkgIT0gbnVsbCkgPyAiLCAiICsgbmFtZS5nZXRPcmdhbml6YXRpb24oKSA6ICIiKTsKLS8vCQkJCWJ1Zi5hcHBlbmQoKG5hbWUuZ2V0TG9jYWxpdHkoKSAhPSBudWxsKSA/ICIsICIgKyBuYW1lLmdldExvY2FsaXR5KCkgOiAiIik7Ci0vLwkJCQlidWYuYXBwZW5kKChuYW1lLmdldENvdW50cnkoKSAhPSBudWxsKSA/ICIsICIgKyBuYW1lLmdldENvdW50cnkoKSA6ICIiKTsKLS8vCQkJCXJldHVybiBuZXcgU3RyaW5nKGJ1Zik7Ci0vLwkJCX0KLS8vCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8JCQlVcGRhdGVDb3JlLndhcm4oIkVycm9yIHBhcnNpbmcgWDUwMCBDZXJ0aWZpY2F0ZSIsZSk7Ci0vLwkJfQotCQlyZXR1cm4gcHJpbmNpcGFsLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkYXRlU3RyaW5nKERhdGUgZGF0ZSkgewotCQlyZXR1cm4gRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoKS5mb3JtYXQoZGF0ZSk7Ci0JfQotCi0JLyoKLQkgKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2lnbmVySW5mbygpIHsKLQkJaWYgKHNpZ25lckluZm89PW51bGwpIGluaXRpYWxpemVDZXJ0aWZpY2F0ZXMoKTsKLQkJcmV0dXJuIHNpZ25lckluZm87Ci0JfQotCi0JLyoKLQkgKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyaWZpZXJJbmZvKCkgewotCQlpZiAoc2lnbmVySW5mbz09bnVsbCkgaW5pdGlhbGl6ZUNlcnRpZmljYXRlcygpOwkJCi0JCXJldHVybiB2ZXJpZmllckluZm87Ci0JfQotCi0JLyoKLQkgKgotCSAqLwotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlIGdldENvbnRlbnRSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBjb250ZW50UmVmZXJlbmNlOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudFJlZmVyZW5jZShDb250ZW50UmVmZXJlbmNlIHJlZikgewotCQl0aGlzLmNvbnRlbnRSZWZlcmVuY2UgPSByZWY7Ci0JfQotCi0KLQkvKgotCSAqCi0JICovCi0JcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZShJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZlYXR1cmVWZXJpZmljYXRpb24oKSB7Ci0JCXJldHVybiBmZWF0dXJlVmVyaWZpY2F0aW9uOwotCX0KLQkKLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGlzRmVhdHVyZVZlcmlmaWNhdGlvbihib29sZWFuIGZlYXR1cmVWZXJpZmljYXRpb24pIHsKLQkJdGhpcy5mZWF0dXJlVmVyaWZpY2F0aW9uID0gZmVhdHVyZVZlcmlmaWNhdGlvbjsKLQl9Ci0KLQkvKgotCSAqCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWxyZWFkeVNlZW4oKSB7Ci0JCXJldHVybiBhbHJlYWR5U2VlbjsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGFscmVhZHlTZWVuKGJvb2xlYW4gc2VlbikgewotCQlyZXR1cm4gdGhpcy5hbHJlYWR5U2VlbiA9IHNlZW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC92ZXJpZmllci9DZXJ0VmVyaWZpZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3ZlcmlmaWVyL0NlcnRWZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGM4NDQwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3ZlcmlmaWVyL0NlcnRWZXJpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudmVyaWZpZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zaWduZWRjb250ZW50Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZUNvcmU7Ci0KLS8qKgotICogVGhlIEphclZlcmlmaWVyIHdpbGwgY2hlY2sgdGhlIGludGVncml0eSBvZiB0aGUgSkFSLgotICogSWYgdGhlIEphciBpcyBzaWduZWQgYW5kIHRoZSBpbnRlZ3JpdHkgaXMgdmFsaWRhdGVkLAotICogaXQgd2lsbCBjaGVjayBpZiBvbmUgb2YgdGhlIGNlcnRpZmljYXRlIG9mIGVhY2ggZmlsZQotICogaXMgaW4gb25lIG9mIHRoZSBrZXlzdG9yZS4KLSAqCi0gKi8KLQotcHVibGljIGNsYXNzIENlcnRWZXJpZmllciBleHRlbmRzIFZlcmlmaWVyIHsKLQotCXByaXZhdGUgQ2VydFZlcmlmaWNhdGlvblJlc3VsdCByZXN1bHQ7Ci0JcHJpdmF0ZSBib29sZWFuIGFjY2VwdFVuc2lnbmVkRmlsZXM7Ci0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci0JcHJpdmF0ZSBGaWxlIGphckZpbGU7Ci0JcHJpdmF0ZSBTaWduZWRDb250ZW50RmFjdG9yeSBmYWN0b3J5OwotCXByaXZhdGUgTGlzdCB0cnVzdGVkU2lnbmVySW5mb3M7Ci0KLQkvKgotCSAqIERlZmF1bHQgQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQ2VydFZlcmlmaWVyKFNpZ25lZENvbnRlbnRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJcmVzdWx0ID0gbnVsbDsKLQkJYWNjZXB0VW5zaWduZWRGaWxlcyA9IGZhbHNlOwotCX0KLQotCS8qCi0JICogaW5pdAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0KElGZWF0dXJlIGZlYXR1cmUsIENvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlqYXJGaWxlID0gbnVsbDsKLQkJaWYgKGNvbnRlbnRSZWYgaW5zdGFuY2VvZiBKYXJDb250ZW50UmVmZXJlbmNlKSB7Ci0JCQlKYXJDb250ZW50UmVmZXJlbmNlIGphclJlZmVyZW5jZSA9IChKYXJDb250ZW50UmVmZXJlbmNlKSBjb250ZW50UmVmOwotCQkJdHJ5IHsKLQkJCQlqYXJGaWxlID0gamFyUmVmZXJlbmNlLmFzRmlsZSgpOwotCQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19JTlNUQUxMKQotCQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJBdHRlbXB0aW5nIHRvIHJlYWQgSkFSIGZpbGU6IitqYXJGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQkJLy8gIyBvZiBlbnRyaWVzCi0JCQkJaWYgKCFqYXJGaWxlLmV4aXN0cygpKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKLQkJCQlKYXJGaWxlIGphciA9IG5ldyBKYXJGaWxlKGphckZpbGUpOwotCQkJCWlmIChqYXIgIT1udWxsKXsKLQkJCQkJdHJ5IHsKLQkJCQkJCWphci5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gdW5jaGVja2VkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChaaXBFeGNlcHRpb24gZSl7Ci0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuSmFyVmVyaWZpZXJfSW52YWxpZEphciwgKG5ldyBTdHJpbmdbXSB7IGphclJlZmVyZW5jZS50b1N0cmluZygpIH0pKSwgZSk7CQkJCQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkphclZlcmlmaWVyX1VuYWJsZVRvQWNjZXNzSmFyLCAobmV3IFN0cmluZ1tdIHsgamFyUmVmZXJlbmNlLnRvU3RyaW5nKCkgfSkpLCBlKTsKLQkJCX0KLQkJfQotCi0JCXJlc3VsdCA9IG5ldyBDZXJ0VmVyaWZpY2F0aW9uUmVzdWx0KCk7Ci0JCXJlc3VsdC5zZXRWZXJpZmljYXRpb25Db2RlKElWZXJpZmljYXRpb25SZXN1bHQuVU5LTk9XTl9FUlJPUik7Ci0JCXJlc3VsdC5zZXRSZXN1bHRFeGNlcHRpb24obnVsbCk7Ci0JCXJlc3VsdC5zZXRGZWF0dXJlKGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q29udGVudFJlZmVyZW5jZShjb250ZW50UmVmKTsKLQl9Ci0KLQkvKgotCSAqIEBwYXJhbSBuZXdNb25pdG9yIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldE1vbml0b3IoSVByb2dyZXNzTW9uaXRvciBuZXdNb25pdG9yKSB7Ci0JCW1vbml0b3IgPSBuZXdNb25pdG9yOwotCX0KLQotCS8qCi0JICogQHNlZSBJVmVyaWZpZXIjdmVyaWZ5KElGZWF0dXJlLENvbnRlbnRSZWZlcmVuY2UsYm9vbGVhbiwgSW5zdGFsbE1vbml0b3IpCi0JICovCi0JcHVibGljIElWZXJpZmljYXRpb25SZXN1bHQgdmVyaWZ5KAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlDb250ZW50UmVmZXJlbmNlIHJlZmVyZW5jZSwKLQkJYm9vbGVhbiBpc0ZlYXR1cmVWZXJpZmljYXRpb24sCi0JCUluc3RhbGxNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlpZiAocmVmZXJlbmNlID09IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCi0JCS8vIGlmIHBhcmVudCBrbm93cyBob3cgdG8gdmVyaWZ5LCBhc2sgdGhlIHBhcmVudCBmaXJzdAotCQlpZiAoZ2V0UGFyZW50KCkgIT0gbnVsbCkgewotCQkJSVZlcmlmaWNhdGlvblJlc3VsdCB2ciA9Ci0JCQkJZ2V0UGFyZW50KCkudmVyaWZ5KGZlYXR1cmUsIHJlZmVyZW5jZSwgaXNGZWF0dXJlVmVyaWZpY2F0aW9uLCBtb25pdG9yKTsKLQkJCWlmICh2ci5nZXRWZXJpZmljYXRpb25Db2RlKCkgIT0gSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX1VOUkVDT0dOSVpFRCkKLQkJCQlyZXR1cm4gdnI7Ci0JCX0KLQotCQkvLyB0aGUgcGFyZW50IGNvdWxkbid0IHZlcmlmeQotCQlzZXRNb25pdG9yKG1vbml0b3IpOwotCQlpbml0KGZlYXR1cmUsIHJlZmVyZW5jZSk7Ci0JCXJlc3VsdC5pc0ZlYXR1cmVWZXJpZmljYXRpb24oaXNGZWF0dXJlVmVyaWZpY2F0aW9uKTsKLQotCQlpZiAoamFyRmlsZSE9bnVsbCkgewotCQkJcmVzdWx0ID0gdmVyaWZ5KGphckZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHJlZmVyZW5jZS5nZXRJZGVudGlmaWVyKCkpOwotCQl9IGVsc2UgewotCQkJcmVzdWx0LnNldFZlcmlmaWNhdGlvbkNvZGUoSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX1VOUkVDT0dOSVpFRCk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSBDZXJ0VmVyaWZpY2F0aW9uUmVzdWx0IHZlcmlmeShTdHJpbmcgZmlsZSwgU3RyaW5nIGlkZW50aWZpZXIpIHsKLQotCQl0cnkgewotCQkJU2lnbmVkQ29udGVudCB2ZXJpZmllciA9IGZhY3RvcnkuZ2V0U2lnbmVkQ29udGVudChuZXcgRmlsZShmaWxlKSk7Ci0JCQkvLyB2ZXJpZnkgaW50ZWdyaXR5Ci0JCQl2ZXJpZnlJbnRlZ3JpdHkodmVyaWZpZXIsIGlkZW50aWZpZXIpOwotCi0JCQkvL2lmIHVzZXIgYWxyZWFkeSBzYWlkIHllcwotCQkJcmVzdWx0LmFscmVhZHlTZWVuKGFscmVhZHlWYWxpZGF0ZWQoKSk7Ci0KLQkJCS8vIHNhdmUgdGhlIGZhY3QgdGhlIGZpbGUgaXMgbm90IHNpZ25lZCwgc28gdGhlIHVzZXIgd2lsbCBub3QgYmUgcHJvbXB0ZWQgYWdhaW4gCi0JCQlpZiAocmVzdWx0LmdldFZlcmlmaWNhdGlvbkNvZGUoKQotCQkJCT09IElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9OT1RfU0lHTkVEKSB7Ci0JCQkJYWNjZXB0VW5zaWduZWRGaWxlcyA9IHRydWU7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdC5zZXRWZXJpZmljYXRpb25Db2RlKElWZXJpZmljYXRpb25SZXN1bHQuVU5LTk9XTl9FUlJPUik7Ci0JCQlyZXN1bHQuc2V0UmVzdWx0RXhjZXB0aW9uKGUpOwotCQl9Ci0KLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlZFUklGSUNBVElPTl9DQU5DRUxMRUQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIFZlcmlmaWVzIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIEpBUgotCSAqLwotCXByaXZhdGUgdm9pZCB2ZXJpZnlJbnRlZ3JpdHkoU2lnbmVkQ29udGVudCB2ZXJpZmllciwgU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJdHJ5IHsKLQkJCWlmICh2ZXJpZmllci5pc1NpZ25lZCgpKSB7Ci0JCQkJLy8gSWYgdGhlIEpBUiBpcyBzaWduZWQgYW5kIGludmFsaWQgdGhlbiBtYXJrIGFzIGNvcnJ1cHRlZAotCQkJCWlmIChoYXNWYWxpZENvbnRlbnQodmVyaWZpZXIuZ2V0U2lnbmVkRW50cmllcygpKSkgewotCQkJCQlyZXN1bHQuc2V0U2lnbmVkQ29udGVudCh2ZXJpZmllcik7Ci0JCQkJCVNpZ25lckluZm9bXSBzaWduZXJzID0gdmVyaWZpZXIuZ2V0U2lnbmVySW5mb3MoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaWduZXJzLmxlbmd0aDsgaSsrKQotCQkJCQkJaWYgKHNpZ25lcnNbaV0uaXNUcnVzdGVkKCkpIHsKLQkJCQkJCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfU0lHTkVEX1JFQ09HTklaRUQpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQlpZiAocmVzdWx0LmdldFZlcmlmaWNhdGlvbkNvZGUoKSAhPSBJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfU0lHTkVEX1JFQ09HTklaRUQpCi0JCQkJCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfU0lHTkVEX1VOUkVDT0dOSVpFRCk7Ci0JCQkJfSBlbHNlCi0JCQkJCXJlc3VsdC5zZXRWZXJpZmljYXRpb25Db2RlKElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9DT1JSVVBURUQpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfTk9UX1NJR05FRCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0LnNldFZlcmlmaWNhdGlvbkNvZGUoSVZlcmlmaWNhdGlvblJlc3VsdC5VTktOT1dOX0VSUk9SKTsKLQkJCXJlc3VsdC5zZXRSZXN1bHRFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzVmFsaWRDb250ZW50KFNpZ25lZENvbnRlbnRFbnRyeVtdIHNpZ25lZEVudHJpZXMpIHsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2lnbmVkRW50cmllcy5sZW5ndGg7IGkrKykKLQkJCQlzaWduZWRFbnRyaWVzW2ldLnZlcmlmeSgpOwotCQl9IGNhdGNoIChJbnZhbGlkQ29udGVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGFscmVhZHlWYWxpZGF0ZWQoKSB7Ci0JCWludCB2ZXJpZnlDb2RlID0gcmVzdWx0LmdldFZlcmlmaWNhdGlvbkNvZGUoKTsKLQkJaWYgKHZlcmlmeUNvZGUgPT0gSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX05PVF9TSUdORUQpCi0JCQlyZXR1cm4gKGFjY2VwdFVuc2lnbmVkRmlsZXMpOwotCQlpZiAodmVyaWZ5Q29kZSA9PSBJVmVyaWZpY2F0aW9uUmVzdWx0LlVOS05PV05fRVJST1IpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChyZXN1bHQuZ2V0U2lnbmVycygpICE9IG51bGwpIHsgLy9nZXRUcnVzdGVkQ2VydGlmaWNhdGVzKCkgY2FuJ3QgYmUgbnVsbCBhcyBpdCBpcyBsYXp5IGluaXRpYWxpemVkCi0JCQlJdGVyYXRvciBpdGVyID0gZ2V0VHJ1c3RlZEluZm9zKCkuaXRlcmF0b3IoKTsKLQkJCVNpZ25lckluZm9bXSBzaWduZXJzID0gcmVzdWx0LmdldFNpZ25lcnMoKTsKLQotCQkJLy8gY2hlY2sgaWYgdGhpcyBpcyBub3QgYSB1c2VyIGFjY2VwdGVkIGNlcnRpZmljYXRlIGZvciB0aGlzIGZlYXR1cmUJCi0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlTaWduZXJJbmZvIGNoYWluID0gKFNpZ25lckluZm8pIGl0ZXIubmV4dCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2lnbmVycy5sZW5ndGg7IGkrKykKLQkJCQkJaWYgKGNoYWluLmVxdWFscyhzaWduZXJzW2ldKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQkvLyBpZiBjZXJ0aWZpY2F0ZSBwYWlyIG5vdCBmb3VuZCBpbiB0cnVzdGVkIGFkZCBpdCBmb3IgbmV4dCB0aW1lCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpZ25lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlhZGRUcnVzdGVkU2lnbmVySW5mbyhzaWduZXJzW2ldKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRUcnVzdGVkU2lnbmVySW5mbyhTaWduZXJJbmZvIHNpZ25lcikgewotCQlpZiAodHJ1c3RlZFNpZ25lckluZm9zID09IG51bGwpCi0JCQl0cnVzdGVkU2lnbmVySW5mb3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChzaWduZXIgIT0gbnVsbCkKLQkJCXRydXN0ZWRTaWduZXJJbmZvcy5hZGQoc2lnbmVyKTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRUcnVzdGVkSW5mb3MoKSB7Ci0JCWlmICh0cnVzdGVkU2lnbmVySW5mb3MgPT0gbnVsbCkKLQkJCXRydXN0ZWRTaWduZXJJbmZvcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHRydXN0ZWRTaWduZXJJbmZvczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElWZXJpZmllciNzZXRQYXJlbnQoSVZlcmlmaWVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChJVmVyaWZpZXIgcGFyZW50VmVyaWZpZXIpIHsKLQkJc3VwZXIuc2V0UGFyZW50KHBhcmVudFZlcmlmaWVyKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy8uY2xhc3NwYXRoIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTkxZThlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy8uY3ZzaWdub3JlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWNiNTRhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlczwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCQk8cHJvamVjdD5vcmcuYXBhY2hlLnhlcmNlczwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUuYm9vdDwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlPC9wcm9qZWN0Pg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS51aS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUudWkuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUudWkuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUuY3ZzbmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjQ5ZmY5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotI1dlZCBGZWIgMTEgMTM6MDI6NTcgRVNUIDIwMDkKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmNvbXBhcmluZ0lkZW50aWNhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlYWRDb2RlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0hhc2hDb2RlTWV0aG9kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTeW5jaHJvbml6ZWRPbkluaGVyaXRlZE1ldGhvZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMzk0MjUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVuYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXM7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDIuMC4wCi1CdW5kbGUtQ2xhc3NQYXRoOiB1cGRhdGVleGFtcGxlcy5qYXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuY29tcGF0aWJpbGl0eS5QbHVnaW5BY3RpdmF0b3IKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlci1uYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eSwKLSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IjIuMSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL1NjcmFwYm9vazIuanBhZ2UgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL1NjcmFwYm9vazIuanBhZ2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZGE5OWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9TY3JhcGJvb2syLmpwYWdlCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLVNpdGVNYW5hZ2VyLmdldFNpdGUoVVJMKXRocm93cyBDb3JlRXhjZXB0aW9uDQotICBTdHJpbmcgdHlwZSA9IGdldFR5cGVGb3Jwcm90b2NvbChVUkwuZ2V0cHJvdG9jb2wpOw0KLSAgdHJ5IHsNCi0gICAgaWYgKHR5cGUgIT0gbnVsbCl7DQotCWF0dGVtcHRDcmVhdGlvblNpdGUodHlwZSxVUkwpOw0KLSAgICB9IGVsc2Ugew0KLQlhdHRlbXB0Q3JlYXRpb25TaXRlKCJodHRwIixVUkwpOw0KLSAgICB9DQotICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpew0KLSAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBzaXRlIixlLmdldE1lc3NhZ2UoKSk7DQotICB9DQotDQotU2l0ZU1hbmFnZXIuYXR0ZW1wdENyZWF0aW9uU2l0ZSh0eXBlLFVSTCl0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLSAgdHJ5IHsNCi0gICAgY3JlYXRlU2l0ZSh0eXBlLFVSTCk7DQotICB9IGNhdGNoIChJbnZhbGlkVHlwZUV4Y2VwdGlvbiBlKXsNCi0gICAgdHJ5IHsNCi0gICAgICBjcmVhdGVTaXRlKGUuZ2V0UmVhbFR5cGUoKSxVUkwpOw0KLSAgICB9IGNhdGNoIChJbnZhbGlkU2l0ZUV4ZXB0aW9uIGUpew0KLSAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCJXcm9uZyBzaXRlIHR5cGUiKTsNCi0gICAgfQ0KLSAgfQ0KLQ0KLVNpdGVNYW5hZ2VyLmNyZWF0ZVNpdGUodHlwZSxVUkwpIHRocm93cyBDb3JlRXhlcHRpb24sIEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbg0KLQ0KLQ0KLXRyeSB7DQotCQkJDQotCWZhY3RvcnkuY3JlYXRlU2l0ZSh1cmwsIGZvcmNlQ3JlYXRpb24pOw0KLQkNCi19IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCS8vIGlmIHRoZSBVUkwgaXMgcG9pbnRpbmcgdG8gZWl0aGVyIGEgZmlsZSANCi0vLyBvciBhIGRpcmVjdG9yeSwgd2l0aG91dCByZWZlcmVuY2UJCQkNCi1pZiAodXJsLmdldFJlZigpICE9IG51bGwpIHsNCi0JLy8gNCBub3RoaW5nIHdlIGNhbiBkbw0KLQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJFcnJvciBhY2Nlc3NpbmcgdXJsOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIlxyXG4iK2UuZ2V0TWVzc2FnZSgpLGUpOw0KLX0gZWxzZSBpZiAodXJsLmdldEZpbGUoKS5lbmRzV2l0aCgiLyIpKSB7DQotCS8vIDEgdHJ5IHRvIGFkZCBzaXRlLnhtbA0KLQl0cnkgew0KLQkJdXJsID0gbmV3IFVSTCh1cmwsU2l0ZS5TSVRFX1hNTCk7DQotCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMSl7DQotCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIFVSTDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyIrIitTaXRlLlNJVEVfWE1MLGUxKTsNCi0JfQ0KLQl0cnkgew0KLQkJc2l0ZSA9IGZhY3RvcnkuY3JlYXRlU2l0ZSh1cmwsIGZvcmNlQ3JlYXRpb24pOw0KLQl9IGNhdGNoIChQYXJzaW5nRXhjZXB0aW9uIGUxKXsNCi0JCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkVycm9yIHBhcnNpbmcgVVJMOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIlxyXG4iK2UxLmdldE1lc3NhZ2UoKSxlMSk7CQkJCQkNCi0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpew0KLQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiRXJyb3IgYWNjZXNzaW5nIHVybDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyJcclxuIitlMS5nZXRNZXNzYWdlKCksZTEpOwkJCQkJDQotCX0NCi19IGVsc2UgaWYgKHVybC5nZXRGaWxlKCkuZW5kc1dpdGgoU2l0ZS5TSVRFX1hNTCkpIHsNCi0JLy8gMyBub3RoaW5nIHdlIGNhbiBkbw0KLQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJFcnJvciBhY2Nlc3NpbmcgdXJsOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIlxyXG4iK2UuZ2V0TWVzc2FnZSgpLGUpOw0KLX0gZWxzZSB7DQotCS8vIDIgdHJ5IHRvIGFkZCAvc2l0ZS54bWwNCi0JdHJ5IHsNCi0JCXVybCA9IG5ldyBVUkwodXJsLmdldFByb3RvY29sKCksdXJsLmdldEhvc3QoKSwgdXJsLmdldFBvcnQoKSwgdXJsLmdldEZpbGUoKSsiLyIrU2l0ZS5TSVRFX1hNTCk7DQotCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMSl7DQotCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIFVSTDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyIrIitTaXRlLlNJVEVfWE1MLGUxKTsNCi0JfQ0KLQkNCi0JdHJ5IHsNCi0JCXNpdGUgPSBmYWN0b3J5LmNyZWF0ZVNpdGUodXJsLCBmb3JjZUNyZWF0aW9uKTsNCi0JfSBjYXRjaCAoUGFyc2luZ0V4Y2VwdGlvbiBlMSl7DQotCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJFcnJvciBwYXJzaW5nIFVSTDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyJcclxuIitlMS5nZXRNZXNzYWdlKCkrIlxyXG5QcmV2aW91cyBJbnB1dC9PdXRwdXQgRXJyb3I6IitlLmdldE1lc3NhZ2UoKSxlMSk7CQkJCQkNCi0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpew0KLQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiRXJyb3IgYWNjZXNzaW5nIHVybDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyJcclxuIitlMS5nZXRNZXNzYWdlKCkrIlxyXG5QcmV2aW91cyBJbnB1dC9PdXRwdXQgRXJyb3I6IitlLmdldE1lc3NhZ2UoKSxlMSk7CQkJCQkNCi0JCQkJfQkJCQkNCi0JCQl9DQotDQotCQl9IGNhdGNoIChQYXJzaW5nRXhjZXB0aW9uIGUpIHsNCi0JCQkNCi0JCQkvLyBpZiB0aGUgVVJMIGlzIHBvaW50aW5nIHRvIGVpdGhlciBhIGZpbGUgDQotLy8gb3IgYSBkaXJlY3RvcnksIHdpdGhvdXQgcmVmZXJlbmNlCQkJDQotaWYgKHVybC5nZXRSZWYoKSAhPSBudWxsKSB7DQotCS8vIDQgbm90aGluZyB3ZSBjYW4gZG8NCi0JdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiRXJyb3IgcGFyc2luZyBVUkw6Iit1cmwudG9FeHRlcm5hbEZvcm0oKSsiXHJcbiIrZS5nZXRNZXNzYWdlKCksZSk7DQotfSBlbHNlIGlmICh1cmwuZ2V0RmlsZSgpLmVuZHNXaXRoKCIvIikpIHsNCi0JLy8gMSB0cnkgdG8gYWRkIHNpdGUueG1sDQotCXRyeSB7DQotCQl1cmwgPSBuZXcgVVJMKHVybCxTaXRlLlNJVEVfWE1MKTsNCi0JfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUxKXsNCi0JCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgVVJMOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIisiK1NpdGUuU0lURV9YTUwsZTEpOw0KLQl9DQotCXRyeSB7DQotCQlzaXRlID0gZmFjdG9yeS5jcmVhdGVTaXRlKHVybCwgZm9yY2VDcmVhdGlvbik7DQotCX0gY2F0Y2ggKFBhcnNpbmdFeGNlcHRpb24gZTEpew0KLQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiRXJyb3IgcGFyc2luZyBVUkw6Iit1cmwudG9FeHRlcm5hbEZvcm0oKSsiXHJcbiIrZTEuZ2V0TWVzc2FnZSgpLGUxKTsJCQkJCQ0KLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSl7DQotCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJFcnJvciBhY2Nlc3NpbmcgdXJsOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIlxyXG4iK2UxLmdldE1lc3NhZ2UoKSxlMSk7DQotCQkJCX0JCQkJDQotDQotCQkJfSBlbHNlIGlmICh1cmwuZ2V0RmlsZSgpLmVuZHNXaXRoKFNpdGUuU0lURV9YTUwpKSB7DQotCQkJCS8vIDMgbm90aGluZyB3ZSBjYW4gZG8NCi0JdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiRXJyb3IgcGFyc2luZyBVUkw6Iit1cmwudG9FeHRlcm5hbEZvcm0oKSsiXHJcbiIrZS5nZXRNZXNzYWdlKCksZSk7CQkJCQkNCi19IGVsc2Ugew0KLQkvLyAyIHRyeSB0byBhZGQgL3NpdGUueG1sDQotCQ0KLQl0cnkgew0KLQkJdXJsID0gbmV3IFVSTCh1cmwuZ2V0UHJvdG9jb2woKSx1cmwuZ2V0SG9zdCgpLCB1cmwuZ2V0UG9ydCgpLCB1cmwuZ2V0RmlsZSgpKyIvIitTaXRlLlNJVEVfWE1MKTsNCi0JfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUxKXsNCi0JCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgVVJMOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIisiK1NpdGUuU0lURV9YTUwsZTEpOw0KLQl9DQotCXRyeSB7DQotCQlzaXRlID0gZmFjdG9yeS5jcmVhdGVTaXRlKHVybCwgZm9yY2VDcmVhdGlvbik7DQotCX0gY2F0Y2ggKFBhcnNpbmdFeGNlcHRpb24gZTEpew0KLQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiRXJyb3IgcGFyc2luZyBVUkw6Iit1cmwudG9FeHRlcm5hbEZvcm0oKSsiXHJcbiIrZTEuZ2V0TWVzc2FnZSgpKyJcclxuUHJldmlvdXMgUGFyc2luZyBlcnJvcjoiK2UuZ2V0TWVzc2FnZSgpLGUxKTsJCQkJCQ0KLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSl7DQotCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJFcnJvciBhY2Nlc3NpbmcgdXJsOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIlxyXG4iK2UxLmdldE1lc3NhZ2UoKSsiXHJcblByZXZpb3VzIFBhcnNpbmcgZXJyb3I6IitlLmdldE1lc3NhZ2UoKSxlMSk7DQotCQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvYWJvdXQuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4MzI0ZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08aHRtbD4NCi08aGVhZD4NCi08dGl0bGU+QWJvdXQ8L3RpdGxlPg0KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQotcCwgdGFibGUsIHRkLCB0aCB7IGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMTBwdH0NCi1wcmUgeyBmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ubzsgZm9udC1zaXplOiAxMHB0fQ0KLWgyIHsgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAxOHB0OyBmb250LXdlaWdodDogYm9sZCA7IGxpbmUtaGVpZ2h0OiAxNHB4fQ0KLWNvZGUgeyBmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ubzsgZm9udC1zaXplOiAxMHB0fQ0KLXN1cCB7IGZvbnQtZmFtaWx5OiBhcmlhbCxoZWx2ZXRpY2EsZ2VuZXZhOyBmb250LXNpemU6IDEwcHh9DQotaDMgeyBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtd2VpZ2h0OiBib2xkfQ0KLWxpIHsgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAxMHB0fQ0KLWgxIHsgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAyOHB4OyBmb250LXdlaWdodDogYm9sZH0NCi1ib2R5IHsgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAxMHB0OyBjbGlwOiByZWN0KCAgICk7IG1hcmdpbi10b3A6IDVtbTsgbWFyZ2luLWxlZnQ6IDNtbX0NCi08L3N0eWxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz0iYmx1ZSIgdmxpbms9InB1cnBsZSI+DQotPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjUiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSIgPg0KLSAgPHRyPiANCi0gICAgPHRkIGFsaWduPSJMRUZUIiB2YWxpZ249IlRPUCIgY29sc3Bhbj0iMiIgYmdjb2xvcj0iIzAwODBDMCI+PGI+PGZvbnQgY29sb3I9IiNGRkZGRkYiPkFib3V0IFRoaXMgQ29udGVudDwvZm9udD48L2I+PC90ZD4NCi0gIDwvdHI+DQotICA8dHI+IA0KLSAgICA8dGQ+IA0KLTxwPjExdGggRGVjZW1iZXIsIDIwMDE8L3A+CQ0KLTxoMz5MaWNlbnNlPC9oMz4NCi08cD5FY2xpcHNlLm9yZyBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICZxdW90O0NvbnRlbnQmcXVvdDsuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUNCi08YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbCI+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMC41PC9hPiAmcXVvdDtDUEwmcXVvdDsuICBGb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPg0KLQ0KLTxoMz5Db250cmlidXRpb25zPC9oMz4NCi0NCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMLCBhbnkgQ29udHJpYnV0aW9ucywgYXMgZGVmaW5lZCBpbiB0aGUgQ1BMLCB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UNCi1tYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlIGhvc3Qgb2YgRWNsaXBzZS5vcmcgd2ViIHNpdGUsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoDQotQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDUEwuPC9wPg0KLQ0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvdGhlciB0aGFuIHRoZSBDUEwgJnF1b3Q7T3RoZXIgTGljZW5zZSZxdW90OywgYW55IG1vZGlmaWNhdGlvbnMsIGVuaGFuY2VtZW50cyBhbmQvb3INCi1vdGhlciBjb2RlIGFuZC9vciBkb2N1bWVudGF0aW9uICZxdW90O01vZGlmaWNhdGlvbnMmcXVvdDsgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUNCi1ob3N0IG9mIEVjbGlwc2Uub3JnLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaCBDb250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgT3RoZXIgTGljZW5zZSBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlDQotdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3RoZXIgTGljZW5zZS4gIEluIGFkZGl0aW9uLCB3aXRoIHJlZ2FyZCB0byBNb2RpZmljYXRpb25zIGZvciB3aGljaCB5b3UgYXJlIHRoZSBjb3B5cmlnaHQgaG9sZGVyLCB5b3UgYXJlIGFsc28NCi1wcm92aWRpbmcgdGhlIE1vZGlmaWNhdGlvbnMgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIHN1Y2ggTW9kaWZpY2F0aW9ucyBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZg0KLXRoZSBDUEwuPC9wPg0KLTwvdGQ+PC90cj48L3RhYmxlPg0KLTwvYm9keT4NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9idWlsZC5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjVlMmFhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIyANCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotc291cmNlLnVwZGF0ZWV4YW1wbGVzY29yZS5qYXIgPSBzcmMvDQotc3JjLmluY2x1ZGVzPWFib3V0Lmh0bWwNCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgKi5qYXIsXA0KLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLw0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvcGx1Z2luLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTM1YmU0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMgDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLW5hbWUgPSBJbnN0YWxsL1VwZGF0ZSBCdWlsZFppcCBFeGFtcGxlDQotcHJvdmlkZXItbmFtZSA9IEVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTg4MzE4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9mZWF0dXJlcy9jb20ucmVkZG90LnJlZGRvdF8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvZmVhdHVyZXMvY29tLnJlZGRvdC5yZWRkb3RfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjUwN2E3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9mZWF0dXJlcy9jb20ucmVkZG90LnJlZGRvdF8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvZmVhdHVyZXMvY29tLnJlZGRvdC5yZWRkb3RfMi4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL2ZlYXR1cmVzL2NvbS5yZWRkb3QucmVkZG90XzIuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIzNjgxNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvZmVhdHVyZXMvY29tLnJlZGRvdC5yZWRkb3RfMi4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL2luZm8vaW1hZ2VzL3JlZERvdC5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvaW5mby9pbWFnZXMvcmVkRG90LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBmYjVjMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvaW5mby9pbWFnZXMvcmVkRG90LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9wbHVnaW5zL2NvbS5yZWRkb3QucmVkZG90XzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9wbHVnaW5zL2NvbS5yZWRkb3QucmVkZG90XzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4Yjc5My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvcGx1Z2lucy9jb20ucmVkZG90LnJlZGRvdF8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvcGx1Z2lucy9jb20ucmVkZG90LnJlZGRvdF8yLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvcGx1Z2lucy9jb20ucmVkZG90LnJlZGRvdF8yLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMzFhZDMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL3BsdWdpbnMvY29tLnJlZGRvdC5yZWRkb3RfMi4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWM4NThiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcENvbnZlcnRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZDRhNzUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMuYnVpbGR6aXA7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ0J1ZmZlcklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOw0KLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5Ow0KLWltcG9ydCBqYXZhLnV0aWwuamFyLkphck91dHB1dFN0cmVhbTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQ29udGVudFJlZmVyZW5jZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkphckNvbnRlbnRSZWZlcmVuY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkluc3RhbGxBYm9ydGVkRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIENvbnZlcnRzIGVjbGlwc2UgYnVpbGQgLnppcCBmaWxlcyBpbnRvIHBhY2thZ2VkIGZlYXR1cmUNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQnVpbGRaaXBDb252ZXJ0ZXIgew0KLQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7DQotCQlpZiAoYXJncy5sZW5ndGggPD0wKSB7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogICAgIEJ1aWxkWmlwQ29udmVydGVyIDxwYXRoIHRvIHRoZSB6aXAgZmlsZT4uXHJcbkV4YW1wbGU6IEJ1aWxkWmlwQ29udmVydGVyIGQ6L2Rvd25sb2FkL2ludGVncmF0aW9uLWVjbGlwc2UtU0RLLTIwMDIwMTA5LXdpbjMyLnppcCIpOw0KLQkJCXJldHVybjsNCi0JCX0NCi0JCXRyeSB7DQotCQkJVVJMIGJ1aWxkemlwID0gbmV3IFVSTCgoImZpbGU6IithcmdzWzBdKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKSk7DQotCQkJQnVpbGRaaXBGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEJ1aWxkWmlwRmVhdHVyZUZhY3RvcnkoKTsNCi0JCQlJRmVhdHVyZSBmZWF0dXJlID0gZmFjdG9yeS5jcmVhdGVGZWF0dXJlKGJ1aWxkemlwLCBudWxsKTsNCi0JCQlJRmVhdHVyZUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpOw0KLQkJCQ0KLQkJCUNvbnRlbnRSZWZlcmVuY2VbXSByZWZzID0gcHJvdmlkZXIuZ2V0RmVhdHVyZUVudHJ5Q29udGVudFJlZmVyZW5jZXMobnVsbCk7DQotCQkJDQotCQkJRmlsZSBzaXRlID0gbmV3IEZpbGUoKGFyZ3NbMF0rIi5wYWNrYWdlZC8iKS5yZXBsYWNlKCcvJyxGaWxlLnNlcGFyYXRvckNoYXIpKTsNCi0JCQlzaXRlLm1rZGlycygpOw0KLQkJCUZpbGUgZmVhdHVyZXNEaXIgPSBuZXcgRmlsZShzaXRlLCJmZWF0dXJlcyIpOw0KLQkJCWZlYXR1cmVzRGlyLm1rZGlycygpOw0KLQkJCUZpbGUgcGx1Z2luc0RpciA9IG5ldyBGaWxlKHNpdGUsICJwbHVnaW5zIik7DQotCQkJcGx1Z2luc0Rpci5ta2RpcnMoKTsNCi0JCQkNCi0JCQlGaWxlIGphckZpbGUgPSBuZXcgRmlsZShmZWF0dXJlc0RpcixmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSsiLmphciIpOw0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigid3JpdGluZyBmZWF0dXJlIGFyY2hpdmU6ICIrZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkrIi5qYXIiKTsNCi0JCQl3cml0ZUphcihqYXJGaWxlLCByZWZzLCBmZWF0dXJlLCBudWxsLCBudWxsKTsNCi0JCQlKYXJDb250ZW50UmVmZXJlbmNlIGphciA9IG5ldyBKYXJDb250ZW50UmVmZXJlbmNlKCJidWlsZC56aXAiLGJ1aWxkemlwKTsNCi0JCQlQcm9wZXJ0aWVzIG1hbmlmZXN0ID0gZ2V0QnVpbGRNYW5pZmVzdChqYXIpOw0KLQkJCQ0KLQkJCUlQbHVnaW5FbnRyeVtdIHBsdWdpbnMgPSBmZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsNCi0JCQlmb3IgKGludCBpPTA7IGk8cGx1Z2lucy5sZW5ndGg7IGkrKykgew0KLQkJCQlyZWZzID0gcHJvdmlkZXIuZ2V0UGx1Z2luRW50cnlDb250ZW50UmVmZXJlbmNlcyhwbHVnaW5zW2ldLCBudWxsKTsNCi0JCQkJamFyRmlsZSA9IG5ldyBGaWxlKHBsdWdpbnNEaXIscGx1Z2luc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkrIi5qYXIiKTsNCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJ3cml0aW5nIHBsdWdpbiBhcmNoaXZlOiAiK3BsdWdpbnNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKyIuamFyIik7DQotCQkJCXdyaXRlSmFyKGphckZpbGUsIHJlZnMsIGZlYXR1cmUsIHBsdWdpbnNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKSwgbWFuaWZlc3QpOw0KLQkJCX0NCi0JCQkNCi0JCQl3cml0ZVNpdGVNYW5pZmVzdChzaXRlLCBmZWF0dXJlKTsNCi0JCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVKYXIoRmlsZSBqYXJGaWxlLENvbnRlbnRSZWZlcmVuY2VbXSByZWZzLCBJRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmcgcGx1Z2luSWQsIFByb3BlcnRpZXMgbWFuaWZlc3QpIHsNCi0JCQkNCi0JCUphck91dHB1dFN0cmVhbSBqb3MgPSBudWxsOw0KLQkJRmlsZU91dHB1dFN0cmVhbSBvcyA9IG51bGw7DQotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7DQotCQkNCi0JCXRyeSB7DQotCQkJb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShqYXJGaWxlKTsNCi0JCQlqb3MgPSBuZXcgSmFyT3V0cHV0U3RyZWFtKG9zKTsNCi0JCQlKYXJFbnRyeSBlbnRyeSA9IG51bGw7DQotCQkJU3RyaW5nIGJ1ZiA9IG51bGw7DQotCQkJU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0gc2JpcyA9IG51bGw7DQotCQkJDQotCQkJLy8gd3JpdGUgamFyIG1hbmlmZXN0IChmaXJzdCBlbnRyeSBpbiBvdXRwdXQgc3RyZWFtKQ0KLQkJCWJ1ZiA9ICJNYW5pZmVzdC1WZXJzaW9uOiAxLjBcbkNyZWF0ZWQtQnk6IDIuMC4wICh3d3cuZWNsaXBzZS5vcmcgRmVhdHVyZSBQYWNrYWdlcilcbiI7DQotCQkJc2JpcyA9IG5ldyBTdHJpbmdCdWZmZXJJbnB1dFN0cmVhbShidWYpOw0KLQkJCWVudHJ5ID0gbmV3IEphckVudHJ5KCJNRVRBLUlORi9NQU5JRkVTVC5NRiIpOw0KLQkJCWpvcy5wdXROZXh0RW50cnkoZW50cnkpOw0KLQkJCVV0aWxpdGllcy5jb3B5KHNiaXMsam9zLG51bGwpOw0KLQkJCXNiaXMuY2xvc2UoKTsNCi0JCQkNCi0JCQkvLyBqYXIgdXAgdGhlIHJlZmVyZW5jZXMNCi0JCQlmb3IgKGludCBpPTA7IGk8cmVmcy5sZW5ndGg7IGkrKykgew0KLQkJCQlTdHJpbmcgaWQgPSByZWZzW2ldLmdldElkZW50aWZpZXIoKTsNCi0JCQkJZW50cnkgPSBuZXcgSmFyRW50cnkoaWQpOw0KLQkJCQlqb3MucHV0TmV4dEVudHJ5KGVudHJ5KTsNCi0JCQkJaXMgPSByZWZzW2ldLmdldElucHV0U3RyZWFtKCk7DQotCQkJCVV0aWxpdGllcy5jb3B5KGlzLGpvcyxudWxsKTsNCi0JCQkJaXMuY2xvc2UoKTsgaXMgPSBudWxsOw0KLQkJCX0NCi0JCQkNCi0JCQkvLyBmb3IgcGx1Z2luIGphcnMsIHdyaXRlIGJ1aWxkIG1hbmlmZXN0DQotCQkJaWYgKHBsdWdpbklkICE9IG51bGwgJiYgbWFuaWZlc3QgIT0gbnVsbCkgew0KLQkJCQlTdHJpbmcga2V5ID0gInBsdWdpbkAiK3BsdWdpbklkOw0KLQkJCQlTdHJpbmcgdmFsdWUgPSBtYW5pZmVzdC5nZXRQcm9wZXJ0eShrZXkpOw0KLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgew0KLQkJCQkJaWYgKHZhbHVlLmVxdWFscygiSEVBRCIpKSB7DQotCQkJCQkJdmFsdWUgKz0gIi0iICsgZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLmdldE1ham9yQ29tcG9uZW50KCk7DQotCQkJCQl9DQotCQkJCQlidWYgPSBrZXkgKyAiPSIgKyB2YWx1ZTsNCi0JCQkJCXNiaXMgPSBuZXcgU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0oYnVmKTsNCi0JCQkJCWVudHJ5ID0gbmV3IEphckVudHJ5KCJidWlsZG1hbmlmZXN0LnByb3BlcnRpZXMiKTsNCi0JCQkJCWpvcy5wdXROZXh0RW50cnkoZW50cnkpOw0KLQkJCQkJVXRpbGl0aWVzLmNvcHkoc2Jpcyxqb3MsbnVsbCk7DQotCQkJCQlzYmlzLmNsb3NlKCk7DQotCQkJCX0NCi0JCQl9DQotCQkJDQotCQkJLy8gY2xvc2UgamFyDQotCQkJam9zLmNsb3NlKCk7IGpvcyA9IG51bGw7IG9zID0gbnVsbDsNCi0JCX0gY2F0Y2goRXhjZXB0aW9uIGUpIHsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJfSBmaW5hbGx5IHsNCi0JCQlpZiAoaXMgIT0gbnVsbCkgDQotCQkJCXRyeSB7aXMuY2xvc2UoKTt9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHt9DQotCQkJCQ0KLQkJCWlmIChqb3MgIT0gbnVsbCkgDQotCQkJCXRyeSB7am9zLmNsb3NlKCk7fSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7fQ0KLQkJCWVsc2UgaWYgKG9zICE9IG51bGwpDQotCQkJCXRyeSB7b3MuY2xvc2UoKTt9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHt9DQotCQl9CQkNCi0JfQ0KLQkNCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlU2l0ZU1hbmlmZXN0KEZpbGUgc2l0ZSwgSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiB7DQotCQlGaWxlIG1hbmlmZXN0ID0gbmV3IEZpbGUoc2l0ZSwgInNpdGUueG1sIik7DQotCQlGaWxlT3V0cHV0U3RyZWFtIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obWFuaWZlc3QpOw0KLQkJU3RyaW5nIHNpdGVYTUwgPSAiPHNpdGU+XG4gICA8ZmVhdHVyZSB1cmw9XCJmZWF0dXJlcy8iK2ZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkrIi5qYXJcIi8+XG48L3NpdGU+IjsNCi0JCVN0cmluZ0J1ZmZlcklucHV0U3RyZWFtIHNiaXMgPSBuZXcgU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0oc2l0ZVhNTCk7DQotCQlVdGlsaXRpZXMuY29weShzYmlzLG9zLG51bGwpOw0KLQkJb3MuY2xvc2UoKTsNCi0JCXNiaXMuY2xvc2UoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0aWVzIGdldEJ1aWxkTWFuaWZlc3QoSmFyQ29udGVudFJlZmVyZW5jZSBqYXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQlDb250ZW50UmVmZXJlbmNlIG1hbmlmZXN0RW50cnkgPSBqYXIucGVlaygiZWNsaXBzZS9idWlsZG1hbmlmZXN0LnByb3BlcnRpZXMiLG51bGwvKkNvbnRlbnRTZWxlY3RvciovLCBudWxsLypQcm9ncmVzc01vbml0b3IqLyk7DQotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7DQotCQlQcm9wZXJ0aWVzIHByb3BzID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOw0KLQkJCWlzID0gbWFuaWZlc3RFbnRyeS5nZXRJbnB1dFN0cmVhbSgpOw0KLQkJCXByb3BzLmxvYWQoaXMpOw0KLQkJfSBmaW5hbGx5IHsNCi0JCQlpZiAoaXMgIT0gbnVsbCkgdHJ5eyBpcy5jbG9zZSgpOyB9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHt9DQotCQl9DQotCQlyZXR1cm4gcHJvcHM7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjFkZDVhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcEZlYXR1cmVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcDsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5Db250ZW50UmVmZXJlbmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5GZWF0dXJlQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSU5vblBsdWdpbkVudHJ5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklWZXJpZmllcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSW5zdGFsbE1vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkphckNvbnRlbnRSZWZlcmVuY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkphckNvbnRlbnRSZWZlcmVuY2UuQ29udGVudFNlbGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5GZWF0dXJlTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkluc3RhbGxBYm9ydGVkRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEFuIGV4YW1wbGUgZmVhdHVyZSBjb250ZW50IHByb3ZpZGVyLiBJdCBoYW5kbGVzIGZlYXR1cmVzIHBhY2thZ2VkIGFzDQotICogYnVpbGQgemlwJ3MgdXNpbmcgdGhlIGZvcm1hdCB1c2VkIGZvciBpbnRlZ3JhdGlvbiBhbmQgc3RhYmxlIGJ1aWxkcw0KLSAqIHBvc3RlZCBvbiB0aGUgZG93bmxvYWRzIHBhZ2VzIGF0IHd3dy5lY2xpcHNlLm9yZw0KLSAqIDwvcD4NCi0gKiBAc2luY2UgMi4wDQotICovDQotDQotcHVibGljIGNsYXNzIEJ1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEZlYXR1cmVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciB7DQotDQotCXByaXZhdGUgSmFyQ29udGVudFJlZmVyZW5jZSBiYXNlUmVmZXJlbmNlOw0KLQlwcml2YXRlIENvbnRlbnRSZWZlcmVuY2UgZ2VuZXJhdGVkRmVhdHVyZU1hbmlmZXN0OwkNCi0JcHJpdmF0ZSBDb250ZW50UmVmZXJlbmNlW10gZmVhdHVyZUVudHJ5Q29udGVudFJlZmVyZW5jZXM7DQotCXByaXZhdGUgSVBsdWdpbkVudHJ5IGN1cnJlbnRQbHVnaW5FbnRyeTsNCi0JcHJpdmF0ZSBJTm9uUGx1Z2luRW50cnkgY3VycmVudE5vblBsdWdpbkVudHJ5Ow0KLQkNCi0JcHVibGljIEJ1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlcihVUkwgYmFzZSkgew0KLQkJc3VwZXIoYmFzZSk7DQotCQl0aGlzLmJhc2VSZWZlcmVuY2UgPSBuZXcgSmFyQ29udGVudFJlZmVyZW5jZSgiYnVpbGQuemlwIixiYXNlKTsNCi0JfQ0KLQkNCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRGZWF0dXJlTWFuaWZlc3QoKQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2UgZ2V0RmVhdHVyZU1hbmlmZXN0UmVmZXJlbmNlKEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCWlmIChnZW5lcmF0ZWRGZWF0dXJlTWFuaWZlc3QgPT0gbnVsbCkgew0KLQkJCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkZlYXR1cmUgbWFuaWZlc3QgaXMgbm90IGF2YWlsYWJsZSIsbnVsbCk7DQotCQl9DQotCQllbHNlDQotCQkJcmV0dXJuIGdlbmVyYXRlZEZlYXR1cmVNYW5pZmVzdDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldEFyY2hpdmVSZWZlcmVuY2VzKCkNCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0QXJjaGl2ZVJlZmVyZW5jZXMoSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgew0KLQkJLy8gdGhlIGZlYXR1cmUgYW5kIGFsbCBpdHMgcGx1Z2lucyBmaWxlcyBhcmUgcGFja2FnZWQgaW4gYSBzaW5nbGUgYXJjaGl2ZQ0KLQkJcmV0dXJuIG5ldyBDb250ZW50UmVmZXJlbmNlW10geyBiYXNlUmVmZXJlbmNlIH07DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcygpDQotCSAqLw0KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldEZlYXR1cmVFbnRyeUFyY2hpdmVSZWZlcmVuY2VzKEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHsNCi0JCS8vIHRoZSBmZWF0dXJlIGFuZCBhbGwgaXRzIHBsdWdpbnMgZmlsZXMgYXJlIHBhY2thZ2VkIGluIGEgc2luZ2xlIGFyY2hpdmUNCi0JCXJldHVybiBuZXcgQ29udGVudFJlZmVyZW5jZVtdIHsgYmFzZVJlZmVyZW5jZSB9Ow0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0UGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhJUGx1Z2luRW50cnkpDQotCSAqLw0KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5LCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB7DQotCQkvLyB0aGUgZmVhdHVyZSBhbmQgYWxsIGl0cyBwbHVnaW5zIGZpbGVzIGFyZSBwYWNrYWdlZCBpbiBhIHNpbmdsZSBhcmNoaXZlDQotCQlyZXR1cm4gbmV3IENvbnRlbnRSZWZlcmVuY2VbXSB7IGJhc2VSZWZlcmVuY2UgfTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldE5vblBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoSU5vblBsdWdpbkVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKElOb25QbHVnaW5FbnRyeSBub25QbHVnaW5FbnRyeSwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQl0cnkgew0KLQkJCXJldHVybiBwZWVrTm9uUGx1Z2luRW50cnlDb250ZW50KG5vblBsdWdpbkVudHJ5LG1vbml0b3IpOw0KLQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHJldHVybiBjb250ZW50IGZvciBub24gcGx1Z2luIGVudHJ5ICIrbm9uUGx1Z2luRW50cnkuZ2V0SWRlbnRpZmllcigpLGUpOw0KLQkJfQ0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0RmVhdHVyZUVudHJ5Q29udGVudFJlZmVyZW5jZXMoKQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRGZWF0dXJlRW50cnlDb250ZW50UmVmZXJlbmNlcyhJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB7DQotCQlpZiAoZmVhdHVyZUVudHJ5Q29udGVudFJlZmVyZW5jZXMgPT0gbnVsbCkNCi0JCQlyZXR1cm4gbmV3IENvbnRlbnRSZWZlcmVuY2VbMF07DQotCQllbHNlDQotCQkJcmV0dXJuICBmZWF0dXJlRW50cnlDb250ZW50UmVmZXJlbmNlczsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldFBsdWdpbkVudHJ5Q29udGVudFJlZmVyZW5jZXMoSVBsdWdpbkVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRQbHVnaW5FbnRyeUNvbnRlbnRSZWZlcmVuY2VzKElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXRyeSB7DQotCQkJcmV0dXJuIHBlZWtQbHVnaW5FbnRyeUNvbnRlbnQocGx1Z2luRW50cnksIG1vbml0b3IpOw0KLQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHJldHVybiBjb250ZW50IGZvciBwbHVnaW4gZW50cnkgIitwbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCksZSk7DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyBVUkwgZ2V0RmVhdHVyZUJhc2VVUkwoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJcmV0dXJuIGdldFdvcmtpbmdEaXJlY3RvcnkoKS50b1VSTCgpOw0KLQkJCQ0KLQl9DQotDQotCUNvbnRlbnRSZWZlcmVuY2UgZ2V0RmVhdHVyZUJ1aWxkTWFuaWZlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCXJldHVybiBiYXNlUmVmZXJlbmNlLnBlZWsoImVjbGlwc2UvYnVpbGRtYW5pZmVzdC5wcm9wZXJ0aWVzIixudWxsLypDb250ZW50U2VsZWN0b3IqLywgbnVsbC8qUHJvZ3Jlc3NNb25pdG9yKi8pOw0KLQl9DQotDQotCUNvbnRlbnRSZWZlcmVuY2UgZ2V0UGx1Z2luTWFuaWZlc3QoU3RyaW5nIHBsdWdpbklkLCBib29sZWFuIGlzRnJhZ21lbnQpIHRocm93cyBFeGNlcHRpb24gewkJCQ0KLQkJU3RyaW5nIG1hbmlmZXN0TmFtZSA9ICJlY2xpcHNlL3BsdWdpbnMvIiArIHBsdWdpbklkICsgIi8iICsgKGlzRnJhZ21lbnQgPyAiZnJhZ21lbnQueG1sIiA6ICJwbHVnaW4ueG1sIik7DQotCQlyZXR1cm4gYmFzZVJlZmVyZW5jZS5wZWVrKG1hbmlmZXN0TmFtZSwgbnVsbC8qQ29udGVudFNlbGVjdG9yKi8sIG51bGwvKlByb2dyZXNzTW9uaXRvciovKTsNCi0JfQ0KLQkNCi0Jdm9pZCB1bnBhY2tGZWF0dXJlRW50cnlDb250ZW50KEZlYXR1cmVNb2RlbCBmZWF0dXJlLCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uIHsNCi0JCQkNCi0JCS8vIGRlZmluZSBzZWxlY3RvciBmb3IgZmVhdHVyZSBlbnRyeSBmaWxlcw0KLQkJQ29udGVudFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IENvbnRlbnRTZWxlY3RvcigpIHsNCi0JCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKEphckVudHJ5IGphckVudHJ5KSB7DQotCQkJCWlmIChqYXJFbnRyeS5pc0RpcmVjdG9yeSgpKQ0KLQkJCQkJcmV0dXJuIGZhbHNlOwkJCQkJDQotCQkJCVN0cmluZyBlbnRyeSA9IGphckVudHJ5LmdldE5hbWUoKTsNCi0JCQkJaWYgKGVudHJ5LnN0YXJ0c1dpdGgoImVjbGlwc2UvcmVhZG1lLyIpKQ0KLQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCWVsc2UgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoImVjbGlwc2Uvc3BsYXNoLyIpKQ0KLQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCWVsc2UgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoImVjbGlwc2UvIikgJiYgZW50cnkuaW5kZXhPZigiLyIsOCk9PS0xICYmIGVudHJ5LmVuZHNXaXRoKCIuaHRtbCIpKQ0KLQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCWVsc2UNCi0JCQkJCXJldHVybiBmYWxzZTsJDQotCQkJfQ0KLQkJCXB1YmxpYyBTdHJpbmcgZGVmaW5lSWRlbnRpZmllcihKYXJFbnRyeSBqYXJFbnRyeSkgew0KLQkJCQlTdHJpbmcgZW50cnkgPSBqYXJFbnRyeS5nZXROYW1lKCk7DQotCQkJCWlmIChlbnRyeS5zdGFydHNXaXRoKCJlY2xpcHNlLyIpKQ0KLQkJCQkJcmV0dXJuIGVudHJ5LnN1YnN0cmluZyg4KTsNCi0JCQkJZWxzZQ0KLQkJCQkJcmV0dXJuIGVudHJ5Ow0KLQkJCX0NCi0JCX07DQotCQkNCi0JCS8vIHVucGFjayBmZWF0dXJlIGVudHJ5IGZpbGVzDQotCQlGaWxlIHRtcERpciA9IGdldFdvcmtpbmdEaXJlY3RvcnkoKTsNCi0JCUNvbnRlbnRSZWZlcmVuY2VbXSByZWZzID0gYmFzZVJlZmVyZW5jZS51bnBhY2sodG1wRGlyLCBzZWxlY3RvciwgbW9uaXRvcik7DQotCQkNCi0JCS8vIHdyaXRlIG91dCBmZWF0dXJlIG1hbmlmZXN0IChmZWF0dXJlLnhtbCk7DQotCQlGaWxlIG1hbmlmZXN0ID0gVXRpbGl0aWVzLmNyZWF0ZUxvY2FsRmlsZSh0bXBEaXIsImZlYXR1cmUueG1sIik7DQotCQlDb250ZW50UmVmZXJlbmNlIG1hbmlmZXN0UmVmZXJlbmNlID0gbmV3IENvbnRlbnRSZWZlcmVuY2UoImZlYXR1cmUueG1sIiwgbWFuaWZlc3QpOw0KLQkJRGVmYXVsdE1vZGVsV3JpdGVyIHcgPSBuZXcgRGVmYXVsdE1vZGVsV3JpdGVyKGZlYXR1cmUpOw0KLQkJRmlsZU91dHB1dFN0cmVhbSBvcyA9IG51bGw7DQotCQl0cnkgew0KLQkJCW9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obWFuaWZlc3QpOw0KLQkJCXcud3JpdGVGZWF0dXJlTWFuaWZlc3Qob3MpOw0KLQkJfSBmaW5hbGx5IHsNCi0JCQlpZiAob3MgIT0gbnVsbCkgdHJ5IHsgb3MuY2xvc2UoKTsgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7fQ0KLQkJfQ0KLQkJdGhpcy5nZW5lcmF0ZWRGZWF0dXJlTWFuaWZlc3QgPSBtYW5pZmVzdFJlZmVyZW5jZTsNCi0JCQ0KLQkJLy8gc2F2ZSByZWZlcmVuY2VzIChuZXdseS13cml0dGVuIGZlYXR1cmUueG1sIHBsdXMgcmVzdCBvZiBzZWxlY3RlZCBmZWF0dXJlIGZpbGVzKQ0KLQkJQ29udGVudFJlZmVyZW5jZVtdIGFsbFJlZnMgPSBuZXcgQ29udGVudFJlZmVyZW5jZVtyZWZzLmxlbmd0aCsxXTsNCi0JCWFsbFJlZnNbMF0gPSBtYW5pZmVzdFJlZmVyZW5jZTsNCi0JCVN5c3RlbS5hcnJheWNvcHkocmVmcywwLGFsbFJlZnMsMSxyZWZzLmxlbmd0aCk7DQotCQlmZWF0dXJlRW50cnlDb250ZW50UmVmZXJlbmNlcyA9IGFsbFJlZnM7DQotCX0NCi0JCQ0KLQlDb250ZW50UmVmZXJlbmNlW10gcGVla1BsdWdpbkVudHJ5Q29udGVudChJUGx1Z2luRW50cnkgcGx1Z2luLCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJDQotCQkvLyBkZWZpbmUgc2VsZWN0b3IgZm9yIHBsdWdpbiBlbnRyeSBmaWxlcw0KLQkJQ29udGVudFNlbGVjdG9yIHNlbGVjdG9yID0gbmV3IENvbnRlbnRTZWxlY3RvcigpIHsNCi0JCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKEphckVudHJ5IGphckVudHJ5KSB7DQotCQkJCWlmIChqYXJFbnRyeS5pc0RpcmVjdG9yeSgpKQ0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQlTdHJpbmcgZW50cnkgPSBqYXJFbnRyeS5nZXROYW1lKCk7DQotCQkJCVN0cmluZyBpZCA9IGN1cnJlbnRQbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpOw0KLQkJCQlpZiAoaWQ9PW51bGwpDQotCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJCWVsc2UgaWYgKGVudHJ5LnN0YXJ0c1dpdGgoImVjbGlwc2UvcGx1Z2lucy8iK2lkKyIvIikpDQotCQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQkJZWxzZQ0KLQkJCQkJcmV0dXJuIGZhbHNlOwkNCi0JCQl9DQotCQkJcHVibGljIFN0cmluZyBkZWZpbmVJZGVudGlmaWVyKEphckVudHJ5IGphckVudHJ5KSB7DQotCQkJCVN0cmluZyBlbnRyeSA9IGphckVudHJ5LmdldE5hbWUoKTsNCi0JCQkJaW50IGl4ID0gZW50cnkuaW5kZXhPZigiLyIsMTYpOw0KLQkJCQlpZiAoaXggIT0gLTEpIHsNCi0JCQkJCXJldHVybiBlbnRyeS5zdWJzdHJpbmcoaXgrMSk7DQotCQkJCX0gZWxzZSB7DQotCQkJCQlyZXR1cm4gZW50cnk7DQotCQkJCX0NCi0JCQl9DQotCQl9Ow0KLQkJDQotCQkvLyB1bnBhY2sgcGx1Z2luIGVudHJ5IGZpbGVzDQotCQljdXJyZW50UGx1Z2luRW50cnkgPSBwbHVnaW47DQotCQlyZXR1cm4gYmFzZVJlZmVyZW5jZS5wZWVrKHNlbGVjdG9yLCBtb25pdG9yKTsNCi0JfQ0KLQkJDQotCUNvbnRlbnRSZWZlcmVuY2VbXSBwZWVrTm9uUGx1Z2luRW50cnlDb250ZW50KElOb25QbHVnaW5FbnRyeSBkYXRhLCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJDQotCQkvLyBkZWZpbmUgc2VsZWN0b3IgZm9yIG5vbiBwbHVnaW4gZW50cnkgZmlsZXMNCi0JCUNvbnRlbnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBDb250ZW50U2VsZWN0b3IoKSB7DQotCQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShKYXJFbnRyeSBqYXJFbnRyeSkgew0KLQkJCQlpZiAoamFyRW50cnkuaXNEaXJlY3RvcnkoKSkNCi0JCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJU3RyaW5nIGVudHJ5ID0gamFyRW50cnkuZ2V0TmFtZSgpOw0KLQkJCQlTdHJpbmcgaWQgPSBjdXJyZW50Tm9uUGx1Z2luRW50cnkuZ2V0SWRlbnRpZmllcigpOw0KLQkJCQlpZiAoIWlkLmVxdWFscygicm9vdCIpKQ0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQllbHNlIGlmICghZW50cnkuc3RhcnRzV2l0aCgiZWNsaXBzZS9wbHVnaW5zLyIpKQ0KLQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCWVsc2UNCi0JCQkJCXJldHVybiBmYWxzZTsJDQotCQkJfQ0KLQkJCXB1YmxpYyBTdHJpbmcgZGVmaW5lSWRlbnRpZmllcihKYXJFbnRyeSBqYXJFbnRyeSkgew0KLQkJCQlTdHJpbmcgZW50cnkgPSBqYXJFbnRyeS5nZXROYW1lKCk7DQotCQkJCWlmIChlbnRyeS5zdGFydHNXaXRoKCJlY2xpcHNlLyIpKQ0KLQkJCQkJcmV0dXJuIGVudHJ5LnN1YnN0cmluZyg4KTsNCi0JCQkJZWxzZQ0KLQkJCQkJcmV0dXJuIGVudHJ5Ow0KLQkJCX0NCi0JCX07DQotCQkNCi0JCS8vIHVucGFjayBub24gcGx1Z2luIGVudHJ5IGZpbGVzDQotCQljdXJyZW50Tm9uUGx1Z2luRW50cnkgPSBkYXRhOw0KLQkJcmV0dXJuIGJhc2VSZWZlcmVuY2UucGVlayhzZWxlY3RvciwgbW9uaXRvcik7DQotCX0NCi0JDQotCXByaXZhdGUgQ29yZUV4Y2VwdGlvbiBuZXdDb3JlRXhjZXB0aW9uKFN0cmluZyBzLCBUaHJvd2FibGUgZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwib3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzIiwwLHMsZSkpOw0KLQl9DQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0VmVyaWZpZXIoKQ0KLQkgKi8NCi0JcHVibGljIElWZXJpZmllciBnZXRWZXJpZmllcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcEZlYXR1cmVGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBGZWF0dXJlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGY1ODBkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcEZlYXR1cmVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcDsNCi0NCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5CYXNlRmVhdHVyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5GZWF0dXJlTW9kZWw7DQotDQotLyoqDQotICogQW4gZXhhbXBsZSBmZWF0dXJlIGZhY3RvcnkgYmFzZWQgb24gdGhlIHBhY2thZ2luZyANCi0gKiBmb3JtYXQgdXNlZCBmb3IgaW50ZWdyYXRpb24gYW5kIHN0YWJsZSBidWlsZHMNCi0gKiBwb3N0ZWQgb24gdGhlIGRvd25sb2FkcyBwYWdlcyBhdCB3d3cuZWNsaXBzZS5vcmcNCi0gKiA8L3A+DQotICogQHNpbmNlIDIuMA0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBCdWlsZFppcEZlYXR1cmVGYWN0b3J5DQotCWV4dGVuZHMgQmFzZUZlYXR1cmVGYWN0b3J5DQotCWltcGxlbWVudHMgSUZlYXR1cmVGYWN0b3J5IHsNCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUZhY3RvcnkjY3JlYXRlRmVhdHVyZShVUkwsIElTaXRlLCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlIGNyZWF0ZUZlYXR1cmUoVVJMIHVybCwgSVNpdGUgc2l0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQl0cnkgew0KLQkJCS8vIGNyZWF0ZSBjb250ZW50IHByb3ZpZGVyIGZvciBmZWF0dXJlDQotCQkJQnVpbGRaaXBGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNwID0gbmV3IEJ1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlcih1cmwpOw0KLQkJCUZlYXR1cmUgZmVhdHVyZSA9IG51bGw7DQotCQkJDQotCQkJLy8gcGFyc2UgdGhlIGZlYXR1cmUNCi0JCQlmZWF0dXJlID0gKEZlYXR1cmUpIHBhcnNlRmVhdHVyZShjcCk7DQotCQkJDQotCQkJLy8gaW5pdGlhbGl6ZSBmZWF0dXJlDQotCQkJZmVhdHVyZS5zZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKGNwKTsNCi0JCQlmZWF0dXJlLnNldFNpdGUoc2l0ZSk7DQotCQkJZmVhdHVyZS5yZXNvbHZlKGNwLmdldEZlYXR1cmVCYXNlVVJMKCksIG51bGwpOyANCi0JCQlmZWF0dXJlLm1hcmtSZWFkT25seSgpOw0KLQkJCXJldHVybiBmZWF0dXJlOw0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIm9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcCIsMCwiVW5hYmxlIHRvIGNyZWF0ZSBmZWF0dXJlIixlKSk7DQotCQl9DQotCX0NCi0NCi0JLyoNCi0JICogcGFyc2UgdGhlIGJ1aWxkIHppcCB0byByZWNvbnN0cnVjdCBhIGZlYXR1cmUgbW9kZWwNCi0JICovDQotCXB1YmxpYyBGZWF0dXJlTW9kZWwgcGFyc2VGZWF0dXJlKEJ1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlciBjcCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gKG5ldyBCdWlsZFppcEZlYXR1cmVQYXJzZXIodGhpcykpLnBhcnNlKGNwKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBGZWF0dXJlUGFyc2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBGZWF0dXJlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMzJiM2MuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwRmVhdHVyZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLmJ1aWxkemlwOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOw0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247DQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOw0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luVmVyc2lvbklkZW50aWZpZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkNvbnRlbnRSZWZlcmVuY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkZlYXR1cmVNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuUGx1Z2luRW50cnlNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuVVJMRW50cnlNb2RlbDsNCi0NCi0vKioNCi0gKiBBbiBleGFtcGxlIGZlYXR1cmUgcGFyc2VyLiBJdCBoYW5kbGVzIGZlYXR1cmVzIHBhY2thZ2VkIGFzDQotICogYnVpbGQgemlwJ3MgdXNpbmcgdGhlIGZvcm1hdCB1c2VkIGZvciBpbnRlZ3JhdGlvbiBhbmQgc3RhYmxlIGJ1aWxkcw0KLSAqIHBvc3RlZCBvbiB0aGUgZG93bmxvYWRzIHBhZ2VzIGF0IHd3dy5lY2xpcHNlLm9yZw0KLSAqIDwvcD4NCi0gKiBAc2luY2UgMi4wDQotICovDQotDQotcHVibGljIGNsYXNzIEJ1aWxkWmlwRmVhdHVyZVBhcnNlciB7CQ0KLQkNCi0JcHJpdmF0ZSBCdWlsZFppcEZlYXR1cmVGYWN0b3J5IGZhY3Rvcnk7DQotCXByaXZhdGUgQnVpbGRaaXBQbHVnaW5QYXJzZXIgcGx1Z2luUGFyc2VyOw0KLQkNCi0JcHVibGljIEJ1aWxkWmlwRmVhdHVyZVBhcnNlcihCdWlsZFppcEZlYXR1cmVGYWN0b3J5IGZhY3RvcnkpIHsNCi0JCXRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7DQotCX0NCi0JDQotCXB1YmxpYyBGZWF0dXJlTW9kZWwgcGFyc2UoQnVpbGRaaXBGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNwKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQkJDQotCQlyZXR1cm4gcGFyc2VGZWF0dXJlKGNwKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBGZWF0dXJlTW9kZWwgcGFyc2VGZWF0dXJlKEJ1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlciBjcCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkNCi0JCQ0KLQkJLy8gZ2V0IHJlZmVyZW5jZSB0byB0aGUgYnVpbGQgbWFuaWZlc3QNCi0JCUNvbnRlbnRSZWZlcmVuY2UgbWFuaWZlc3RSZWYgPSBjcC5nZXRGZWF0dXJlQnVpbGRNYW5pZmVzdCgpOw0KLQkJSW5wdXRTdHJlYW0gaXMgPSBtYW5pZmVzdFJlZi5nZXRJbnB1dFN0cmVhbSgpOwkJDQotCQkNCi0JCS8vIGxvYWQgYnVpbGRtYW5pZmVzdC5wcm9wZXJ0aWVzDQotCQlQcm9wZXJ0aWVzIG1hbmlmZXN0ID0gbmV3IFByb3BlcnRpZXMoKTsNCi0JCXRyeSB7DQotCQkJbWFuaWZlc3QubG9hZChpcyk7DQotCQl9IGZpbmFsbHkgew0KLQkJCWlmIChpcyE9bnVsbCkgdHJ5IHsgaXMuY2xvc2UoKTsgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7fQ0KLQkJfQ0KLQkJDQotCQkvLyBwb3B1bGF0ZSBmZWF0dXJlIG1vZGVsDQotCQlGZWF0dXJlTW9kZWwgZmVhdHVyZSA9IGZhY3RvcnkuY3JlYXRlRmVhdHVyZU1vZGVsKCk7DQotCQlwYXJzZUZlYXR1cmVFbnRyeShjcCwgZmVhdHVyZSwgbWFuaWZlc3QpOw0KLQkJDQotCQkvLyBwYXJzZSBwbHVnaW4gZW50cmllcw0KLQkJcGFyc2VQbHVnaW5FbnRyaWVzKGNwLCBmZWF0dXJlLCBtYW5pZmVzdCk7IA0KLQkJDQotCQkvLyBwYXJzZSBub24tcGx1Z2luIGVudHJpZXMNCi0JCXBhcnNlTm9uUGx1Z2luRW50cmllcyhjcCwgZmVhdHVyZSwgbWFuaWZlc3QpOw0KLQkJDQotCQkvLyB1bnBhY2sgZmVhdHVyZSBlbnRyeSBjb250ZW50DQotCQljcC51bnBhY2tGZWF0dXJlRW50cnlDb250ZW50KGZlYXR1cmUsIG51bGwvKklQcm9ncmVzc01vbml0b3IqLyk7DQotCQkNCi0JCXJldHVybiBmZWF0dXJlOw0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgcGFyc2VGZWF0dXJlRW50cnkoQnVpbGRaaXBGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNwLCBGZWF0dXJlTW9kZWwgZmVhdHVyZSwgUHJvcGVydGllcyBtYW5pZmVzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQkNCi0JCS8vIHBhcnNlIG91dCBidWlsZCB6aXAgZmlsZSBuYW1lLiBJdCBpcyBhc3N1bWVkIHRvIGJlIGluIHRoZQ0KLQkJLy8gZm9ybSA8cGFja2FnZSBpZGVudGlmaWVyPi08YnVpbGQgZGF0ZT4tPHRhcmdldCBwbGF0Zm9ybT4uemlwLA0KLQkJLy8gd2hlcmUNCi0JCS8vCQk8cGFja2FnZSBpZGVudGlmaWVyPiBpcyBoeXBoZW4gKC0pIHNlcGFyYXRlcmQgdG9rZW4gbGlzdA0KLQkJLy8JCTxidWlsZCBkYXRlPiBpcyBzaW5nbGUgYWxsLW51bWVyaWMgdG9rZW4NCi0JCS8vCQk8dGFyZ2V0IHBsYXRmb3JtPiBpcyBoeXBoZW4gKC0pIHNlcGFyYXRlcmQgdG9rZW4gbGlzdA0KLQkJDQotCQlTdHJpbmcgcGtnSWQgPSAiIjsNCi0JCVN0cmluZyB0YXJnZXQgPSAiIjsNCi0JCVN0cmluZyBidWlsZCA9ICIiOw0KLQkJU3RyaW5nIHN0YXRlID0gIklEIjsNCi0JCWJvb2xlYW4gZmlyc3RUb2tlbiA9IHRydWU7DQotCQlTdHJpbmcgemlwTmFtZSA9IFVSTERlY29kZXIuZGVjb2RlKGNwLmdldFVSTCgpLmdldEZpbGUoKSk7DQotCQlpbnQgaXggPSB6aXBOYW1lLmxhc3RJbmRleE9mKCIvIik7DQotCQlpZiAoaXggIT0gLTEpDQotCQkJemlwTmFtZSA9IHppcE5hbWUuc3Vic3RyaW5nKGl4KzEpOw0KLQkJaWYgKHppcE5hbWUuZW5kc1dpdGgoIi56aXAiKSkgew0KLQkJCXppcE5hbWUgPSB6aXBOYW1lLnN1YnN0cmluZygwLHppcE5hbWUubGVuZ3RoKCktNCk7DQotCQl9DQotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih6aXBOYW1lLCItIixmYWxzZSk7DQotCQlTdHJpbmcgdG9rZW47DQotCQl3aGlsZSh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7DQotCQkJdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7DQotCQkJdHJ5IHsNCi0JCQkJTG9uZy5wYXJzZUxvbmcodG9rZW4pOw0KLQkJCQlzdGF0ZSA9ICJUQVJHRVQiOw0KLQkJCQl0YXJnZXQgPSAiIjsNCi0JCQkJZmlyc3RUb2tlbiA9IHRydWU7DQotCQkJCWJ1aWxkID0gdG9rZW4rIi4wLjAiOw0KLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7DQotCQkJCWlmIChzdGF0ZS5lcXVhbHMoIklEIikpIHsNCi0JCQkJCXBrZ0lkICs9IChmaXJzdFRva2VuID8gIiIgOiAiICIpICsgdG9rZW47DQotCQkJCX0gZWxzZSB7DQotCQkJCQl0YXJnZXQgKz0gKGZpcnN0VG9rZW4gPyAiIiA6ICIgIikgKyB0b2tlbjsNCi0JCQkJfQ0KLQkJCQlmaXJzdFRva2VuID0gZmFsc2U7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQkvLyBnZW5lcmF0ZSBiYXNlIGZlYXR1cmUgYXR0cmlidXRlcw0KLQkJZmVhdHVyZS5zZXRGZWF0dXJlSWRlbnRpZmllcihwa2dJZC5yZXBsYWNlKCcgJywnLicpKTsNCi0JCWZlYXR1cmUuc2V0RmVhdHVyZVZlcnNpb24oYnVpbGQpOw0KLQkJZmVhdHVyZS5zZXRMYWJlbChwa2dJZC5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgcGtnSWQuc3Vic3RyaW5nKDEpICsgIiBmb3IgIiArIHRhcmdldCk7DQotCQlmZWF0dXJlLnNldFByb3ZpZGVyKCJ3d3cuZWNsaXBzZS5vcmciKTsNCi0JCWZlYXR1cmUuc2V0SW1hZ2VVUkxTdHJpbmcoInNwbGFzaC9zcGxhc2hfZnVsbC5ibXAiKTsNCi0JCWZlYXR1cmUuc2V0T1ModGFyZ2V0LnJlcGxhY2UoJyAnLCctJykpOwkNCi0JCQ0KLQkJLy8gYWRkIGRlc2NyaXB0aW9uDQotCQlVUkxFbnRyeU1vZGVsIGRlc2NyaXB0aW9uID0gZmFjdG9yeS5jcmVhdGVVUkxFbnRyeU1vZGVsKCk7DQotCQlkZXNjcmlwdGlvbi5zZXRVUkxTdHJpbmcoInJlYWRtZS9yZWFkbWUuaHRtbCIpOw0KLQkJZGVzY3JpcHRpb24uc2V0QW5ub3RhdGlvbigieCIpOw0KLQkJZmVhdHVyZS5zZXREZXNjcmlwdGlvbk1vZGVsKGRlc2NyaXB0aW9uKTsNCi0JCQ0KLQkJLy8gYWRkIGxpY2Vuc2UNCi0JCVVSTEVudHJ5TW9kZWwgbGljZW5zZSA9IGZhY3RvcnkuY3JlYXRlVVJMRW50cnlNb2RlbCgpOw0KLQkJbGljZW5zZS5zZXRVUkxTdHJpbmcoImFib3V0Lmh0bWwiKTsNCi0JCWxpY2Vuc2Uuc2V0QW5ub3RhdGlvbigiWW91IG11c3QgdmlldyB0aGUgZnVsbCBsaWNlbnNlIGJ5IGZvbGxvd2luZyB0aGUgXCJMaWNlbnNlXCIgbGluayBpbiB0aGUgZmVhdHVyZSBwcmV2aWV3LlxuU2VsZWN0aW5nIFwiQWNjZXB0XCIgaW5kaWNhdGVzIHRoYXQgeW91IGhhdmUgdmlld2VkIGFuZCBhY2NlcHRlZCB0aGUgZmVhdHVyZSBsaWNlbnNlLiIpOw0KLQkJZmVhdHVyZS5zZXRMaWNlbnNlTW9kZWwobGljZW5zZSk7DQotCQkNCi0JCS8vIGFkZCBjb3B5cmlnaHQNCi0JCVVSTEVudHJ5TW9kZWwgY29weXJpZ2h0ID0gZmFjdG9yeS5jcmVhdGVVUkxFbnRyeU1vZGVsKCk7DQotCQljb3B5cmlnaHQuc2V0VVJMU3RyaW5nKCJub3RpY2UuaHRtbCIpOw0KLQkJY29weXJpZ2h0LnNldEFubm90YXRpb24oIngiKTsNCi0JCWZlYXR1cmUuc2V0Q29weXJpZ2h0TW9kZWwoY29weXJpZ2h0KTsNCi0JfQkNCi0JDQotCXByaXZhdGUgdm9pZCBwYXJzZVBsdWdpbkVudHJpZXMoQnVpbGRaaXBGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNwLCBGZWF0dXJlTW9kZWwgZmVhdHVyZSwgUHJvcGVydGllcyBtYW5pZmVzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQkNCi0JCUVudW1lcmF0aW9uIGVudHJpZXMgPSBtYW5pZmVzdC5rZXlzKCk7DQotCQlTdHJpbmcgcGx1Z2luOw0KLQkJU3RyaW5nIHBsdWdpbklkOw0KLQkJU3RyaW5nIHBsdWdpblZlcnNpb247DQotCQlTdHJpbmcgcGx1Z2luQnVpbGRWZXJzaW9uOw0KLQkJUGx1Z2luRW50cnlNb2RlbCBwbHVnaW5FbnRyeTsNCi0JCXdoaWxlKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsNCi0JCQlwbHVnaW4gPSAoU3RyaW5nKSBlbnRyaWVzLm5leHRFbGVtZW50KCk7DQotCQkJaWYgKHBsdWdpbi5zdGFydHNXaXRoKCJwbHVnaW5AIikpIHsNCi0JCQkJcGx1Z2luSWQgPSBwbHVnaW4uc3Vic3RyaW5nKDcpOw0KLQkJCQlwbHVnaW5CdWlsZFZlcnNpb24gPSBtYW5pZmVzdC5nZXRQcm9wZXJ0eShwbHVnaW4pOw0KLQkJCQlpZiAocGx1Z2luQnVpbGRWZXJzaW9uLmVxdWFscygiSEVBRCIpKSB7DQotCQkJCQlTdHJpbmcgZmVhdHVyZVZlcnNpb24gPSBmZWF0dXJlLmdldEZlYXR1cmVWZXJzaW9uKCk7DQotCQkJCQlpbnQgaXggPSBmZWF0dXJlVmVyc2lvbi5pbmRleE9mKCIuIik7DQotCQkJCQlTdHJpbmcgZmVhdHVyZU1ham9yID0gaXg9PS0xID8gZmVhdHVyZVZlcnNpb24gOiBmZWF0dXJlVmVyc2lvbi5zdWJzdHJpbmcoMCxpeCk7DQotCQkJCQlwbHVnaW5CdWlsZFZlcnNpb24gKz0gIi0iICsgZmVhdHVyZU1ham9yOw0KLQkJCQl9DQotCQkJCXBsdWdpbkVudHJ5ID0gZmFjdG9yeS5jcmVhdGVQbHVnaW5FbnRyeU1vZGVsKCk7DQotCQkJCXBsdWdpblZlcnNpb24gPSBwYXJzZVBsdWdpblZlcnNpb25Jbk1hbmlmZXN0KGNwLCBwbHVnaW5JZCwgcGx1Z2luRW50cnkpOw0KLQkJCQlpZiAocGx1Z2luVmVyc2lvbiAhPSBudWxsKSB7DQotCQkJCQlwbHVnaW5FbnRyeS5zZXRQbHVnaW5JZGVudGlmaWVyKHBsdWdpbklkKTsNCi0JCQkJCXBsdWdpbkVudHJ5LnNldFBsdWdpblZlcnNpb24oKG5ldyBQbHVnaW5WZXJzaW9uSWRlbnRpZmllcihwbHVnaW5WZXJzaW9uKSkudG9TdHJpbmcoKSsiLiIrcGx1Z2luQnVpbGRWZXJzaW9uKTsNCi0JCQkJCWZlYXR1cmUuYWRkUGx1Z2luRW50cnlNb2RlbChwbHVnaW5FbnRyeSk7DQotCQkJCX0NCi0JCQl9DQotCQl9CQkNCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIHBhcnNlTm9uUGx1Z2luRW50cmllcyhCdWlsZFppcEZlYXR1cmVDb250ZW50UHJvdmlkZXIgY3AsIEZlYXR1cmVNb2RlbCBmZWF0dXJlLCBQcm9wZXJ0aWVzIG1hbmlmZXN0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JLy8JTm9uUGx1Z2luRW50cnlNb2RlbCBub25QbHVnaW5FbnRyeSA9IGZhY3RvcnkuY3JlYXRlTm9uUGx1Z2luRW50cnlNb2RlbCgpOw0KLQkvLwlub25QbHVnaW5FbnRyeS5zZXRJZGVudGlmaWVyKCJyb290Iik7DQotCS8vCWZlYXR1cmUuYWRkTm9uUGx1Z2luRW50cnlNb2RlbChub25QbHVnaW5FbnRyeSk7DQotCX0NCi0JDQotCXByaXZhdGUgU3RyaW5nIHBhcnNlUGx1Z2luVmVyc2lvbkluTWFuaWZlc3QoQnVpbGRaaXBGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNwLCBTdHJpbmcgcGx1Z2luSWQsIFBsdWdpbkVudHJ5TW9kZWwgcGx1Z2luRW50cnkpIHsNCi0NCi0JCWlmIChwbHVnaW5QYXJzZXIgPT0gbnVsbCkNCi0JCQlwbHVnaW5QYXJzZXIgPSBuZXcgQnVpbGRaaXBQbHVnaW5QYXJzZXIoKTsNCi0JCQkJDQotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7CQkJCQ0KLQkJQ29udGVudFJlZmVyZW5jZSBwbHVnaW5NYW5pZmVzdDsNCi0JCXRyeSB7DQotCQkJLy8gdHJ5IHBsdWdpbi54bWwNCi0JCQlwbHVnaW5NYW5pZmVzdCAgPSBjcC5nZXRQbHVnaW5NYW5pZmVzdChwbHVnaW5JZCwgZmFsc2UpOw0KLQkJCWlzID0gcGx1Z2luTWFuaWZlc3QuZ2V0SW5wdXRTdHJlYW0oKTsNCi0JCQlyZXR1cm4gcGx1Z2luUGFyc2VyLnBhcnNlKGlzKTsNCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotCQkJdHJ5IHsNCi0JCQkJLy8gcmV0cnkgd2l0aCBmZWF0dXJlLnhtbA0KLQkJCQlwbHVnaW5NYW5pZmVzdCAgPSBjcC5nZXRQbHVnaW5NYW5pZmVzdChwbHVnaW5JZCwgdHJ1ZSk7DQotCQkJCWlzID0gcGx1Z2luTWFuaWZlc3QuZ2V0SW5wdXRTdHJlYW0oKTsNCi0JCQkJU3RyaW5nIHJlc3VsdCA9IHBsdWdpblBhcnNlci5wYXJzZShpcyk7DQotCQkJCXBsdWdpbkVudHJ5LmlzRnJhZ21lbnQodHJ1ZSk7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7DQotCQkJCXJldHVybiBudWxsOw0KLQkJCX0NCi0JCX0gZmluYWxseSB7DQotCQkJaWYgKGlzICE9IG51bGwpIHRyeSB7IGlzLmNsb3NlKCk7IH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwUGx1Z2luUGFyc2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBQbHVnaW5QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU3MDgwNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBQbHVnaW5QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLmJ1aWxkemlwOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLQ0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlcjsNCi1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsNCi1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7DQotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsNCi0NCi0vKioNCi0gKiBQYXJzZSBkZWZhdWx0IGZlYXR1cmUueG1sDQotICovDQotDQotcHVibGljIGNsYXNzIEJ1aWxkWmlwUGx1Z2luUGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgew0KLQ0KLQlwcml2YXRlIFNBWFBhcnNlciBwYXJzZXI7DQotCXByaXZhdGUgU3RyaW5nIHZlcnNpb247DQotCQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOID0gInBsdWdpbiI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFHTUVOVCA9ICJmcmFnbWVudCI7DQotCQ0KLQlwcml2YXRlIGNsYXNzIFBhcnNlQ29tcGxldGVFeGNlcHRpb24gZXh0ZW5kcyBTQVhFeGNlcHRpb24gew0KLQkJcHVibGljIFBhcnNlQ29tcGxldGVFeGNlcHRpb24oU3RyaW5nIGFyZzApIHsNCi0JCQlzdXBlcihhcmcwKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgZm9yIERlZmF1bHRGZWF0dXJlUGFyc2VyDQotCSAqLw0KLQlwdWJsaWMgQnVpbGRaaXBQbHVnaW5QYXJzZXIoKSB7DQotCQlzdXBlcigpOw0KLQkJdGhpcy5wYXJzZXIgPSBuZXcgU0FYUGFyc2VyKCk7DQotCQl0aGlzLnBhcnNlci5zZXRDb250ZW50SGFuZGxlcih0aGlzKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHBhcnNlKElucHV0U3RyZWFtIGluKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7DQotCQl0cnkgew0KLQkJCXZlcnNpb24gPSBudWxsOw0KLQkJCXBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW4pKTsNCi0JCX0gY2F0Y2goUGFyc2VDb21wbGV0ZUV4Y2VwdGlvbiBlKSB7DQotCQl9DQotCQlyZXR1cm4gdmVyc2lvbjsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjc3RhcnRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIEF0dHJpYnV0ZXMpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSxTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7DQotCQkNCi0JCVN0cmluZyB0YWcgPSBsb2NhbE5hbWUudHJpbSgpOw0KLQkNCi0JCWlmICh0YWcuZXF1YWxzSWdub3JlQ2FzZShQTFVHSU4pKSB7DQotCQkJcHJvY2Vzc1BsdWdpbihhdHRyaWJ1dGVzKTsNCi0JCQlyZXR1cm47DQotCQl9DQotCQ0KLQkJaWYgKHRhZy5lcXVhbHNJZ25vcmVDYXNlKEZSQUdNRU5UKSkgew0KLQkJCXByb2Nlc3NQbHVnaW4oYXR0cmlidXRlcyk7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQl9DQotCQ0KLQkvKiogDQotCSAqIHByb2Nlc3MgcGx1Z2luIGVudHJ5IGluZm8NCi0JICovDQotCXByaXZhdGUgdm9pZCBwcm9jZXNzUGx1Z2luKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFBhcnNlQ29tcGxldGVFeGNlcHRpb24gew0KLQkJdmVyc2lvbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInZlcnNpb24iKTsNCi0JCXRocm93IG5ldyBQYXJzZUNvbXBsZXRlRXhjZXB0aW9uKCIiKTsNCi0JfQ0KLX0NCi0NCi0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBTaXRlQ29udGVudFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBTaXRlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NDgwOTEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwU2l0ZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMuYnVpbGR6aXA7DQotDQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVDb250ZW50UHJvdmlkZXI7DQotDQotcHVibGljIGNsYXNzIEJ1aWxkWmlwU2l0ZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIFNpdGVDb250ZW50UHJvdmlkZXIgew0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgZm9yIFNpdGVDb250ZW50UHJvdmlkZXIuDQotCSAqLw0KLQlwdWJsaWMgQnVpbGRaaXBTaXRlQ29udGVudFByb3ZpZGVyKFVSTCB1cmwpIHsNCi0JCXN1cGVyKHVybCk7DQotCX0NCi0JDQotCS8qDQotCSAqIEBzZWUgSVNpdGVDb250ZW50UHJvdmlkZXIjZ2V0QXJjaGl2ZVJlZmVyZW5jZShTdHJpbmcpDQotCSAqLw0KLQlwdWJsaWMgVVJMIGdldEFyY2hpdmVSZWZlcmVuY2UoU3RyaW5nIGlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQkvLyBidWlsZCB6aXAgZmVhdHVyZXMgZG8gbm90IGhhdmUgYXNzb2NpYXRlZCBhcmNoaXZlcw0KLQkJLy8gdGhlIHppcCBmaWxlIGFsc28gY29udGFpbnMgdGhlIGFyY2hpdmVzIGZpbGVzDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBTaXRlRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwU2l0ZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5OGJmNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBTaXRlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMuYnVpbGR6aXA7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsNCi1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsNCi1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQmFzZVNpdGVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5DYXRlZ29yeU1vZGVsOw0KLQ0KLXB1YmxpYyBjbGFzcyBCdWlsZFppcFNpdGVGYWN0b3J5IGV4dGVuZHMgQmFzZVNpdGVGYWN0b3J5IHsNCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZUZhY3RvcnkjY3JlYXRlU2l0ZShVUkwpDQotCSAqLw0KLQlwdWJsaWMgSVNpdGUgY3JlYXRlU2l0ZShVUkwgdXJsKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbixJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24gew0KLQ0KLQkJU2l0ZSBzaXRlID0gbnVsbDsNCi0NCi0JCS8vIGNyZWF0ZSBzaXRlIGFuZCBhZGQgY2F0ZWdvcnkNCi0JCXNpdGUgPSAoU2l0ZSkgY3JlYXRlU2l0ZU1hcE1vZGVsKCk7DQotCQlDYXRlZ29yeU1vZGVsIGNhdGVnb3J5ID0gY3JlYXRlU2l0ZUNhdGVnb3J5TW9kZWwoKTsNCi0JCWNhdGVnb3J5LnNldE5hbWUoImVjbGlwc2UtYnVpbGRzIik7DQotCQljYXRlZ29yeS5zZXRMYWJlbCgiRWNsaXBzZSBCdWlsZHMiKTsNCi0JCXNpdGUuYWRkQ2F0ZWdvcnlNb2RlbChjYXRlZ29yeSk7DQotDQotCQkvLyBzZXQgY29udGVudCBwcm92aWRlcg0KLQkJQnVpbGRaaXBTaXRlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBCdWlsZFppcFNpdGVDb250ZW50UHJvdmlkZXIodXJsKTsNCi0JCXNpdGUuc2V0U2l0ZUNvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOw0KLQ0KLQkJLy8gZ2V0IGFsbCBtYXRjaGluZyB6aXAgZmlsZXMgb24gdGhlIHNpdGUNCi0JCUZpbGVGaWx0ZXIgZmlsdGVyID0gbmV3IEZpbGVGaWx0ZXIoKSB7DQotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZmlsZSkgew0KLQkJCQlpZiAoZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi56aXAiKSkgew0KLQkJCQkJdHJ5IHsNCi0JCQkJCQlaaXBGaWxlIHppcCA9IG5ldyBaaXBGaWxlKGZpbGUpOw0KLQkJCQkJCVppcEVudHJ5IGVudHJ5ID0gemlwLmdldEVudHJ5KCJlY2xpcHNlL2J1aWxkbWFuaWZlc3QucHJvcGVydGllcyIpOw0KLQkJCQkJCWlmIChlbnRyeSA9PSBudWxsKQ0KLQkJCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJCQkJZWxzZQ0KLQkJCQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJCQl9DQotCQkJCX0gZWxzZQ0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCX0NCi0JCX07DQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShVUkxEZWNvZGVyLmRlY29kZSh1cmwuZ2V0RmlsZSgpKSk7DQotCQlGaWxlW10gemlwcyA9IGZpbGUubGlzdEZpbGVzKGZpbHRlcik7DQotDQotCQkvLyBjcmVhdGUgYSByZWZlcmVuY2UgZm9yIGVhY2ggbWF0Y2hpbmcgemlwDQotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIHJlZiA9IG51bGw7DQotCQlmb3IgKGludCBpID0gMDsgemlwcyAhPSBudWxsICYmIGkgPCB6aXBzLmxlbmd0aDsgaSsrKSB7DQotCQkJcmVmID0gY3JlYXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKCk7DQotCQkJcmVmLnNldFR5cGUoIm9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy56aXAiKTsNCi0JCQlyZWYuc2V0U2l0ZU1vZGVsKHNpdGUpOw0KLQkJCXJlZi5zZXRVUkxTdHJpbmcoImZpbGU6IiArIHppcHNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpOw0KLQkJCXJlZi5zZXRDYXRlZ29yeU5hbWVzKG5ldyBTdHJpbmdbXSB7ICJlY2xpcHNlLWJ1aWxkcyIgfSk7DQotCQkJc2l0ZS5hZGRGZWF0dXJlUmVmZXJlbmNlTW9kZWwocmVmKTsNCi0JCX0NCi0JCXRyeSB7DQotCQkJc2l0ZS5yZXNvbHZlKHVybCwgbnVsbCk7IC8vIHJlc29sdmUgYW55IFVSTHMgcmVsYXRpdmUgdG8gdGhlIHNpdGUNCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigiIixlKTsNCi0JCX0NCi0NCi0JCXJldHVybiBzaXRlOw0KLQl9DQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9EZWZhdWx0TW9kZWxXcml0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9EZWZhdWx0TW9kZWxXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA5ZTU0My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvRGVmYXVsdE1vZGVsV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcDsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotCi0vKioKLSAqIFdyaXRlIHN0YW5kYXJkIGZlYXR1cmUgbWFuaWZlc3QgKGZlYXR1cmUueG1sKSBmcm9tIG1vZGVsLgotICogPC9wPgotICogQHNpbmNlIDIuMAotICovCi0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TW9kZWxXcml0ZXIgewotCQotCXByaXZhdGUgRmVhdHVyZU1vZGVsIGZlYXR1cmU7Ci0JCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBEZWZhdWx0TW9kZWxXcml0ZXIoRmVhdHVyZU1vZGVsIGZlYXR1cmUpIHsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlRmVhdHVyZU1hbmlmZXN0KE91dHB1dFN0cmVhbSBvcykgewotCQlQcmludFdyaXRlciB3ID0gbmV3IFByaW50V3JpdGVyKG9zKTsKLQkJd3JpdGVGZWF0dXJlKHcsMCxmZWF0dXJlKTsKLQkJdy5mbHVzaCgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgd3JpdGVGZWF0dXJlKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgRmVhdHVyZU1vZGVsIGZlYXR1cmUpIHsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgcmV0dXJuOwotCQkKLQkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsKLQkJdy5wcmludGxuKGluKyI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iKTsKLQkJCi0JCXcucHJpbnRsbihpbisiPGZlYXR1cmUiKTsKLQkJaWYgKGZlYXR1cmUuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSE9bnVsbCkKLQkJCXcucHJpbnRsbihpbisiICAgIisiaWQ9XCIiK2ZlYXR1cmUuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSsiXCIiKTsKLQkJaWYgKGZlYXR1cmUuZ2V0RmVhdHVyZVZlcnNpb24oKSE9bnVsbCkKLQkJCXcucHJpbnRsbihpbisiICAgIisidmVyc2lvbj1cIiIrZmVhdHVyZS5nZXRGZWF0dXJlVmVyc2lvbigpKyJcIiIpOwotCQlpZiAoZmVhdHVyZS5nZXRMYWJlbE5vbkxvY2FsaXplZCgpIT1udWxsKQotCQkJdy5wcmludGxuKGluKyIgICAiKyJsYWJlbD1cIiIrZmVhdHVyZS5nZXRMYWJlbE5vbkxvY2FsaXplZCgpKyJcIiIpOwotCQlpZiAoZmVhdHVyZS5nZXRQcm92aWRlck5vbkxvY2FsaXplZCgpIT1udWxsKQotCQkJdy5wcmludGxuKGluKyIgICAiKyJwcm92aWRlci1uYW1lPVwiIitmZWF0dXJlLmdldFByb3ZpZGVyTm9uTG9jYWxpemVkKCkrIlwiIik7Ci0JCWlmIChmZWF0dXJlLmdldEltYWdlVVJMU3RyaW5nKCkhPW51bGwpCi0JCQl3LnByaW50bG4oaW4rIiAgICIrImltYWdlPVwiIitmZWF0dXJlLmdldEltYWdlVVJMU3RyaW5nKCkrIlwiIik7Ci0JCWlmIChmZWF0dXJlLmdldE9TKCkhPW51bGwpCi0JCQl3LnByaW50bG4oaW4rIiAgICIrIm9zPVwiIitmZWF0dXJlLmdldE9TKCkrIlwiIik7Ci0JCWlmIChmZWF0dXJlLmdldFdTKCkhPW51bGwpCi0JCQl3LnByaW50bG4oaW4rIiAgICIrIndzPVwiIitmZWF0dXJlLmdldFdTKCkrIlwiIik7Ci0JCWlmIChmZWF0dXJlLmdldE5MKCkhPW51bGwpCi0JCQl3LnByaW50bG4oaW4rIiAgICIrIm5sPVwiIitmZWF0dXJlLmdldE5MKCkrIlwiIik7Ci0JCWlmIChmZWF0dXJlLmdldEFwcGxpY2F0aW9uKCkhPW51bGwpCi0JCQl3LnByaW50bG4oaW4rIiAgICIrImFwcGxpY2F0aW9uPVwiIitmZWF0dXJlLmdldEFwcGxpY2F0aW9uKCkrIlwiIik7Ci0JCXcucHJpbnRsbihpbisiICAgIisiPiIpOwotCQkKLQkJd3JpdGVEZXNjcmlwdGlvbih3LCBsZXZlbCsxLCBmZWF0dXJlLmdldERlc2NyaXB0aW9uTW9kZWwoKSk7Ci0JCXdyaXRlQ29weXJpZ2h0KHcsIGxldmVsKzEsIGZlYXR1cmUuZ2V0Q29weXJpZ2h0TW9kZWwoKSk7Ci0JCXdyaXRlTGljZW5zZSh3LCBsZXZlbCsxLCBmZWF0dXJlLmdldExpY2Vuc2VNb2RlbCgpKTsKLQkJd3JpdGVVUkxzKHcsIGxldmVsKzEsIGZlYXR1cmUpOwotCQl3cml0ZVByZXJlcXModywgbGV2ZWwrMSwgZmVhdHVyZSk7Ci0JCXdyaXRlUGx1Z2luRW50cmllcyh3LCBsZXZlbCsxLCBmZWF0dXJlKTsKLQkJd3JpdGVOb25QbHVnaW5FbnRyaWVzKHcsIGxldmVsKzEsIGZlYXR1cmUpOwotICAgICAgICAgCi0gICAgICAgIHcucHJpbnRsbigiIik7Ci0gICAgICAgIHcucHJpbnRsbihpbisiPC9mZWF0dXJlPiIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgd3JpdGVEZXNjcmlwdGlvbihQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIFVSTEVudHJ5TW9kZWwgdWUpIHsKLQkJd3JpdGVEZXNjcmlwdGlvbkVudHJ5KHcsbGV2ZWwsIHVlLCAiZGVzY3JpcHRpb24iKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHdyaXRlQ29weXJpZ2h0KFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgVVJMRW50cnlNb2RlbCB1ZSkgewotCQl3cml0ZURlc2NyaXB0aW9uRW50cnkodyxsZXZlbCwgdWUsICJjb3B5cmlnaHQiKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHdyaXRlTGljZW5zZShQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIFVSTEVudHJ5TW9kZWwgdWUpIHsKLQkJd3JpdGVEZXNjcmlwdGlvbkVudHJ5KHcsbGV2ZWwsIHVlLCAibGljZW5zZSIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgd3JpdGVEZXNjcmlwdGlvbkVudHJ5KFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgVVJMRW50cnlNb2RlbCB1ZSwgU3RyaW5nIHRhZykgewotCQlpZiAodWUgPT0gbnVsbCkgcmV0dXJuOwotCQlTdHJpbmcgdXJsID0gdWUuZ2V0VVJMU3RyaW5nKCk7Ci0JCVN0cmluZyB0eHQgPSB1ZS5nZXRBbm5vdGF0aW9uTm9uTG9jYWxpemVkKCk7Ci0JCWlmICh1cmw9PW51bGwgJiYgdHh0PT1udWxsKSByZXR1cm47Ci0JCQotCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOwotCQl3LnByaW50bG4oIiIpOwotCQlpZiAodXJsPT1udWxsKQotCQkJdy5wcmludGxuKGluKyI8Iit0YWcrIj4iKTsKLQkJZWxzZSB7Ci0JCQl3LnByaW50KGluKyI8Iit0YWcrIiB1cmw9XCIiK3VlLmdldFVSTFN0cmluZygpKyJcIiIpOwotCQkJaWYgKHR4dD09bnVsbCkKLQkJCQl3LnByaW50bG4oIi8+Iik7Ci0JCQllbHNlCi0JCQkJdy5wcmludGxuKCI+Iik7Ci0JCX0KLQkJaWYgKHR4dCE9bnVsbCkgewotCQkJdy5wcmludGxuKGluICsgdHh0KTsKLQkJCXcucHJpbnRsbihpbisiPC8iK3RhZysiPiIpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCB3cml0ZVVSTHMoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBGZWF0dXJlTW9kZWwgZmVhdHVyZSkgewkKLQkJVVJMRW50cnlNb2RlbCB1cGRhdGUgPSBmZWF0dXJlLmdldFVwZGF0ZVNpdGVFbnRyeU1vZGVsKCk7Ci0JCVVSTEVudHJ5TW9kZWxbXSBkaXNjb3ZlcnkgPSBmZWF0dXJlLmdldERpc2NvdmVyeVNpdGVFbnRyeU1vZGVscygpOwkJCi0JCWlmICh1cGRhdGUgPT0gbnVsbCAmJiAoZGlzY292ZXJ5ID09IG51bGwgfHwgZGlzY292ZXJ5Lmxlbmd0aD09MCkpIHJldHVybjsKLQkJCi0JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7Ci0JCVN0cmluZyBpbjIgPSBnZXRJbmRlbnQobGV2ZWwrMSk7CQkKLQkJdy5wcmludGxuKCIiKTsKLQkJdy5wcmludGxuKGluKyI8dXJsPiIpOwotCQkKLQkJaWYgKHVwZGF0ZSAhPSBudWxsKSB7Ci0JCQl3LnByaW50bG4oaW4yKyI8dXBkYXRlIik7Ci0JCQlpZiAodXBkYXRlLmdldFVSTFN0cmluZygpIT1udWxsKQotCQkJCXcucHJpbnRsbihpbjIrIiAgICIrInVybD1cIiIrdXBkYXRlLmdldFVSTFN0cmluZygpKyJcIiIpOwotCQkJaWYgKHVwZGF0ZS5nZXRBbm5vdGF0aW9uTm9uTG9jYWxpemVkKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluMisiICAgIisibGFiZWw9XCIiK3VwZGF0ZS5nZXRBbm5vdGF0aW9uTm9uTG9jYWxpemVkKCkrIlwiIik7Ci0JCQl3LnByaW50bG4oaW4yKyIgICAiKyIvPiIpOwotCQl9Ci0JCQotCQlmb3IgKGludCBpPTA7IGRpc2NvdmVyeSE9bnVsbCAmJiBpPGRpc2NvdmVyeS5sZW5ndGg7IGkrKykgewotCQkJdy5wcmludGxuKGluMisiPGRpc2NvdmVyeSIpOwotCQkJaWYgKGRpc2NvdmVyeVtpXS5nZXRVUkxTdHJpbmcoKSE9bnVsbCkJCi0JCQkJdy5wcmludGxuKGluMisiICAgIisidXJsPVwiIitkaXNjb3ZlcnlbaV0uZ2V0VVJMU3RyaW5nKCkrIlwiIik7Ci0JCQlpZiAoZGlzY292ZXJ5W2ldLmdldEFubm90YXRpb25Ob25Mb2NhbGl6ZWQoKSE9bnVsbCkKLQkJCQl3LnByaW50bG4oaW4yKyIgICAiKyJsYWJlbD1cIiIrZGlzY292ZXJ5W2ldLmdldEFubm90YXRpb25Ob25Mb2NhbGl6ZWQoKSsiXCIiKTsKLQkJCXcucHJpbnRsbihpbjIrIiAgICIrIi8+Iik7Ci0JCX0KLQkJCi0JCXcucHJpbnRsbihpbisiPC91cmw+Iik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB3cml0ZVByZXJlcXMoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBGZWF0dXJlTW9kZWwgZmVhdHVyZSkgewkKLQkJSW1wb3J0TW9kZWxbXSBpbXAgPSBmZWF0dXJlLmdldEltcG9ydE1vZGVscygpOwkKLQkJaWYgKGltcCA9PSBudWxsIHx8IGltcC5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkKLQkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsKLQkJU3RyaW5nIGluMiA9IGdldEluZGVudChsZXZlbCsxKTsKLQkJdy5wcmludGxuKCIiKTsKLQkJdy5wcmludGxuKGluKyI8cmVxdWlyZXM+Iik7Ci0JCQotCQlmb3IgKGludCBpPTA7IGltcCE9bnVsbCAmJiBpPGltcC5sZW5ndGg7IGkrKykgewotCQkJdy5wcmludGxuKGluMisiPGltcG9ydCIpOwotCQkJaWYgKGltcFtpXS5nZXRJZGVudGlmaWVyKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluMisiICAgIisicGx1Z2luPVwiIitpbXBbaV0uZ2V0SWRlbnRpZmllcigpKyJcIiIpOwotCQkJaWYgKGltcFtpXS5nZXRWZXJzaW9uKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluMisiICAgIisidmVyc2lvbj1cIiIraW1wW2ldLmdldFZlcnNpb24oKSsiXCIiKTsKLQkJCWlmIChpbXBbaV0uZ2V0TWF0Y2hpbmdSdWxlTmFtZSgpIT1udWxsKQotCQkJCXcucHJpbnRsbihpbjIrIiAgICIrIm1hdGNoPVwiIitpbXBbaV0uZ2V0TWF0Y2hpbmdSdWxlTmFtZSgpKyJcIiIpOwotCQkJdy5wcmludGxuKGluMisiICAgIisiLz4iKTsKLQkJfQotCQkKLQkJdy5wcmludGxuKGluKyI8L3JlcXVpcmVzPiIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgd3JpdGVQbHVnaW5FbnRyaWVzKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgRmVhdHVyZU1vZGVsIGZlYXR1cmUpIHsKLQkJUGx1Z2luRW50cnlNb2RlbFtdIHBsdWdpbiA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cnlNb2RlbHMoKTsKLQkJaWYgKHBsdWdpbiA9PSBudWxsIHx8IHBsdWdpbi5sZW5ndGggPT0gMCkgcmV0dXJuOwotCQkKLQkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsKLQkJdy5wcmludGxuKCIiKTsKLQkJCi0JCWZvciAoaW50IGk9MDsgaTxwbHVnaW4ubGVuZ3RoOyBpKyspIHsKLQkJCXcucHJpbnRsbihpbisiPHBsdWdpbiIpOwotCQkJaWYgKHBsdWdpbltpXS5nZXRQbHVnaW5JZGVudGlmaWVyKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluKyIgICAiKyJpZD1cIiIrcGx1Z2luW2ldLmdldFBsdWdpbklkZW50aWZpZXIoKSsiXCIiKTsKLQkJCWlmIChwbHVnaW5baV0uZ2V0UGx1Z2luVmVyc2lvbigpIT1udWxsKQotCQkJCXcucHJpbnRsbihpbisiICAgIisidmVyc2lvbj1cIiIrcGx1Z2luW2ldLmdldFBsdWdpblZlcnNpb24oKSsiXCIiKTsKLQkJCWlmIChwbHVnaW5baV0uaXNGcmFnbWVudCgpKQotCQkJCXcucHJpbnRsbihpbisiICAgIisiZnJhZ21lbnQ9XCIiK3BsdWdpbltpXS5pc0ZyYWdtZW50KCkrIlwiIik7Ci0JCQlpZiAocGx1Z2luW2ldLmdldE9TKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluKyIgICAiKyJvcz1cIiIrcGx1Z2luW2ldLmdldE9TKCkrIlwiIik7Ci0JCQlpZiAocGx1Z2luW2ldLmdldFdTKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluKyIgICAiKyJ3cz1cIiIrcGx1Z2luW2ldLmdldFdTKCkrIlwiIik7Ci0JCQlpZiAocGx1Z2luW2ldLmdldE5MKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluKyIgICAiKyJubD1cIiIrcGx1Z2luW2ldLmdldE5MKCkrIlwiIik7Ci0JCQlpZiAocGx1Z2luW2ldLmdldERvd25sb2FkU2l6ZSgpIT1Db250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkUpCi0JCQkJdy5wcmludGxuKGluKyIgICAiKyJkb3dubG9hZC1zaXplPVwiIitwbHVnaW5baV0uZ2V0RG93bmxvYWRTaXplKCkrIlwiIik7Ci0JCQlpZiAocGx1Z2luW2ldLmdldEluc3RhbGxTaXplKCkhPUNvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRSkKLQkJCQl3LnByaW50bG4oaW4rIiAgICIrImluc3RhbGwtc2l6ZT1cIiIrcGx1Z2luW2ldLmdldEluc3RhbGxTaXplKCkrIlwiIik7Ci0JCQl3LnByaW50bG4oaW4rIiAgICIrIi8+Iik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHdyaXRlTm9uUGx1Z2luRW50cmllcyhQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIEZlYXR1cmVNb2RlbCBmZWF0dXJlKSB7Ci0JCU5vblBsdWdpbkVudHJ5TW9kZWxbXSBkYXRhID0gZmVhdHVyZS5nZXROb25QbHVnaW5FbnRyeU1vZGVscygpOwotCQlpZiAoZGF0YSA9PSBudWxsIHx8IGRhdGEubGVuZ3RoID09IDApIHJldHVybjsKLQkJCi0JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7Ci0JCXcucHJpbnRsbigiIik7Ci0JCQotCQlmb3IgKGludCBpPTA7IGk8ZGF0YS5sZW5ndGg7IGkrKykgewotCQkJdy5wcmludGxuKGluKyI8ZGF0YSIpOwotCQkJaWYgKGRhdGFbaV0uZ2V0SWRlbnRpZmllcigpIT1udWxsKQotCQkJCXcucHJpbnRsbihpbisiICAgIisiaWQ9XCIiK2RhdGFbaV0uZ2V0SWRlbnRpZmllcigpKyJcIiIpOwotCQkJaWYgKGRhdGFbaV0uZ2V0T1MoKSE9bnVsbCkKLQkJCQl3LnByaW50bG4oaW4rIiAgICIrIm9zPVwiIitkYXRhW2ldLmdldE9TKCkrIlwiIik7Ci0JCQlpZiAoZGF0YVtpXS5nZXRXUygpIT1udWxsKQotCQkJCXcucHJpbnRsbihpbisiICAgIisid3M9XCIiK2RhdGFbaV0uZ2V0V1MoKSsiXCIiKTsKLQkJCWlmIChkYXRhW2ldLmdldE5MKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluKyIgICAiKyJubD1cIiIrZGF0YVtpXS5nZXROTCgpKyJcIiIpOwotCQkJaWYgKGRhdGFbaV0uZ2V0RG93bmxvYWRTaXplKCkhPUNvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRSkKLQkJCQl3LnByaW50bG4oaW4rIiAgICIrImRvd25sb2FkLXNpemU9XCIiK2RhdGFbaV0uZ2V0RG93bmxvYWRTaXplKCkrIlwiIik7Ci0JCQlpZiAoZGF0YVtpXS5nZXRJbnN0YWxsU2l6ZSgpIT1Db250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkUpCi0JCQkJdy5wcmludGxuKGluKyIgICAiKyJpbnN0YWxsLXNpemU9XCIiK2RhdGFbaV0uZ2V0SW5zdGFsbFNpemUoKSsiXCIiKTsKLQkJCXcucHJpbnRsbihpbisiICAgIisiLz4iKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIFN0cmluZyBnZXRJbmRlbnQoaW50IGxldmVsKSB7Ci0JCVN0cmluZyBpbmRlbnQgPSAiIjsKLQkJZm9yIChpbnQgaT0wOyBpPGxldmVsOyBpKyspIAotCQkJaW5kZW50ICs9ICIgICAiOwotCQlyZXR1cm4gaW5kZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9UZXN0LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTQ2YWNjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcDsNCi0NCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLSANCi0vKioNCi0gKiB1bml0IHRlc3QgaGFybmVzcw0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0IHsNCi0NCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgew0KLQkJDQotCQl0cnkgew0KLQkJCVVSTCB1cmwgPSBuZXcgVVJMKCJmaWxlOmQ6L2Rvd25sb2Fkcy9lY2xpcHNlIDIuMC9pbnRlZ3JhdGlvbi1lY2xpcHNlLVNESy0yMDAyMDEwOS13aW4zMi56aXAiKTsNCi0JCQlCdWlsZFppcEZlYXR1cmVGYWN0b3J5IGZhY3RvcnkgPSBuZXcgQnVpbGRaaXBGZWF0dXJlRmFjdG9yeSgpOw0KLQkJCUZlYXR1cmUgZmVhdHVyZSA9IChGZWF0dXJlKSBmYWN0b3J5LmNyZWF0ZUZlYXR1cmUodXJsLG51bGwvKklTaXRlKi8pOw0KLQkJCURlZmF1bHRNb2RlbFdyaXRlciB3ID0gbmV3IERlZmF1bHRNb2RlbFdyaXRlcihmZWF0dXJlKTsNCi0JCQl3LndyaXRlRmVhdHVyZU1hbmlmZXN0KFN5c3RlbS5vdXQpOw0KLQkJCQ0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGZWF0dXJlIGVudHJ5IHJlZmVyZW5jZXMiKTsNCi0JCQlDb250ZW50UmVmZXJlbmNlW10gcmVmcyA9IGZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpLmdldEZlYXR1cmVFbnRyeUNvbnRlbnRSZWZlcmVuY2VzKG51bGwpOw0KLQkJCWZvciAoaW50IGk9MDsgaTwgcmVmcy5sZW5ndGg7IGkrKykgew0KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICIrcmVmc1tpXS5nZXRJZGVudGlmaWVyKCkpOw0KLQkJCX0NCi0JCQkNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOw0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUGx1Zy1pbiBlbnRyeSByZWZlcmVuY2VzIik7DQotCQkJSVBsdWdpbkVudHJ5W10gZW50cnkgPSBmZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsNCi0JCQlyZWZzID0gZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkuZ2V0UGx1Z2luRW50cnlDb250ZW50UmVmZXJlbmNlcyhlbnRyeVswXSwgbnVsbCk7DQotCQkJZm9yIChpbnQgaT0wOyBpPCByZWZzLmxlbmd0aDsgaSsrKSB7DQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIityZWZzW2ldLmdldElkZW50aWZpZXIoKSk7DQotCQkJfQkJCQ0KLQkJCQ0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb24tcGx1Zy1pbiBlbnRyeSByZWZlcmVuY2VzIik7DQotCQkJSU5vblBsdWdpbkVudHJ5W10gZGF0YSA9IGZlYXR1cmUuZ2V0Tm9uUGx1Z2luRW50cmllcygpOw0KLQkJCXJlZnMgPSBmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKS5nZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKGRhdGFbMF0sIG51bGwpOw0KLQkJCWZvciAoaW50IGk9MDsgaTwgcmVmcy5sZW5ndGg7IGkrKykgew0KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICIrcmVmc1tpXS5nZXRJZGVudGlmaWVyKCkpOw0KLQkJCX0JCQkNCi0JCQkNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUgLi4uIik7DQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7DQotCQl9CQkNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvamF2YS5wYWdlLmpwYWdlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL2phdmEucGFnZS5qcGFnZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNiMjRiZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvamF2YS5wYWdlLmpwYWdlCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotDQotDQotamF2YS51dGlsLlByb3BlcnRpZXMgcCA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCk7DQotamF2YS51dGlsLkVudW1lcmF0aW9uIGtleXMgPSBwLmtleXMoKTsNCi13aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgew0KLQlTdHJpbmcga2V5ID0gKFN0cmluZylrZXlzLm5leHRFbGVtZW50KCk7DQotCVN5c3RlbS5vdXQucHJpbnRsbihrZXkgKyAiID0gIiArIChTdHJpbmcpcC5nZXQoa2V5KSk7DQotfQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLVN0cmluZyBmaWxlTmFtZSA9ICJkOlxcZG93bmxvYWRzXFxlY2xpcHNlIDIuMFxcaW50ZWdyYXRpb24tZWNsaXBzZS1TREstMjAwMjAxMDktd2luMzIuemlwIjsNCi1qYXZhLmlvLkZpbGUgYXJjaGl2ZUZpbGUgPSBuZXcgamF2YS5pby5GaWxlKGZpbGVOYW1lKTsNCi1qYXZhLnV0aWwuamFyLkphckZpbGUgamFyQXJjaGl2ZSA9IG5ldyBqYXZhLnV0aWwuamFyLkphckZpbGUoYXJjaGl2ZUZpbGUpOw0KLWphdmEudXRpbC5qYXIuSmFyRW50cnkgZW50cnk7DQotamF2YS51dGlsLkVudW1lcmF0aW9uIGVudHJpZXMgPSBqYXJBcmNoaXZlLmVudHJpZXMoKTsNCi13aGlsZShlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7DQotCWVudHJ5ID0gKGphdmEudXRpbC5qYXIuSmFyRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKTsNCi0JU3lzdGVtLm91dC5wcmludGxuKGVudHJ5LmdldE5hbWUoKSk7DQotfQ0KLQ0KLQ0KLVN0cmluZyBhID0gIjIyMyI7DQotU3RyaW5nIGIgPSAiMTIzIjsNCi1hLmNvbXBhcmVUbyhiKTsNCi0NCi0NCi1vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5WZXJzaW9uIHYxID0gDQotCW5ldyBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5WZXJzaW9uKDEsMiwzLCJidWlsZCAxMjdKIik7DQotb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVmVyc2lvbiB2MiA9IA0KLQluZXcgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVmVyc2lvbigxLDIsMywiYnVpbGQgMTI3SiIpOw0KLXYxLmNvbXBhcmUodjIpOw0KLQ0KLQ0KLWphdmEuaW8uRmlsZSBmID0gbmV3IGphdmEuaW8uRmlsZSgiZDpcXGRvd25sb2Fkc1xcZWNsaXBzZSAyLjBcXHhcXCIpOw0KLWYuaXNEaXJlY3RvcnkoKTsNCi0NCi0NCi1TdHJpbmcgcyA9ICJoZWxsbyI7DQotT2JqZWN0IGEgPSBqYXZhLmxhbmcucmVmbGVjdC5BcnJheS5uZXdJbnN0YW5jZShzLmdldENsYXNzKCksMCk7DQotU3lzdGVtLm91dC5wcmludGxuKGEuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KLQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9mcmVlZm9ybS9GcmVlRm9ybVNpdGVDb250ZW50UHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9mcmVlZm9ybS9GcmVlRm9ybVNpdGVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA2ZTMzYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvZnJlZWZvcm0vRnJlZUZvcm1TaXRlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMuZnJlZWZvcm07DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVDb250ZW50UHJvdmlkZXI7DQotDQotcHVibGljIGNsYXNzIEZyZWVGb3JtU2l0ZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIFNpdGVDb250ZW50UHJvdmlkZXIgew0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgZm9yIFNpdGVDb250ZW50UHJvdmlkZXIuDQotCSAqLw0KLQlwdWJsaWMgRnJlZUZvcm1TaXRlQ29udGVudFByb3ZpZGVyKFVSTCB1cmwpIHsNCi0JCXN1cGVyKHVybCk7DQotCX0NCi0JDQotCS8qDQotCSAqIEBzZWUgSVNpdGVDb250ZW50UHJvdmlkZXIjZ2V0QXJjaGl2ZVJlZmVyZW5jZShTdHJpbmcpDQotCSAqLw0KLQlwdWJsaWMgVVJMIGdldEFyY2hpdmVSZWZlcmVuY2UoU3RyaW5nIGlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQl0cnkgew0KLQkJCXJldHVybiBuZXcgVVJMKGdldFVSTCgpLGlkKTsNCi0JCX0gY2F0Y2goTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJVbmFibGUgdG8gcmV0dXJuIGFyY2hpdmUgVVJMIixlKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBDb3JlRXhjZXB0aW9uIG5ld0NvcmVFeGNlcHRpb24oU3RyaW5nIHMsIFRocm93YWJsZSBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCJvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMiLDAscyxlKSk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2ZyZWVmb3JtL0ZyZWVGb3JtU2l0ZUZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9mcmVlZm9ybS9GcmVlRm9ybVNpdGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNDYwM2MuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2ZyZWVmb3JtL0ZyZWVGb3JtU2l0ZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5mcmVlZm9ybTsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5CYXNlU2l0ZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5JbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLlVSTEVudHJ5TW9kZWw7DQotDQotcHVibGljIGNsYXNzIEZyZWVGb3JtU2l0ZUZhY3RvcnkgZXh0ZW5kcyBCYXNlU2l0ZUZhY3Rvcnkgew0KLQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlRmFjdG9yeSNjcmVhdGVTaXRlKFVSTCkNCi0JICovDQotCXB1YmxpYyBJU2l0ZSBjcmVhdGVTaXRlKFVSTCB1cmwpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIHsNCi0NCi0JCS8vIENyZWF0ZSBzaXRlDQotCQlTaXRlIHNpdGUgPSBudWxsOw0KLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlpcyA9IHVybC5vcGVuU3RyZWFtKCk7DQotCQkJc2l0ZSA9IChTaXRlKSBwYXJzZVNpdGUoaXMpOw0KLQ0KLQkJCVVSTEVudHJ5TW9kZWwgcmVhbFNpdGVSZWYgPSBzaXRlLmdldERlc2NyaXB0aW9uTW9kZWwoKTsNCi0JCQlpZiAocmVhbFNpdGVSZWYgPT0gbnVsbCkNCi0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oDQotCQkJCQkiVW5hYmxlIHRvIG9idGFpbiB1cGRhdGUgc2l0ZSByZWZlcmVuY2UiLA0KLQkJCQkJbnVsbCk7DQotCQkJU3RyaW5nIHNpdGVVUkxTdHJpbmcgPSByZWFsU2l0ZVJlZi5nZXRVUkxTdHJpbmcoKTsNCi0JCQlpZiAoc2l0ZVVSTFN0cmluZyA9PSBudWxsKQ0KLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigNCi0JCQkJCSJVbmFibGUgdG8gb2J0YWluIHVwZGF0ZSBzaXRlIHJlZmVyZW5jZSIsDQotCQkJCQludWxsKTsNCi0JCQlVUkwgc2l0ZVVSTCA9IG5ldyBVUkwoc2l0ZVVSTFN0cmluZyk7DQotCQkJRnJlZUZvcm1TaXRlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9DQotCQkJCW5ldyBGcmVlRm9ybVNpdGVDb250ZW50UHJvdmlkZXIoc2l0ZVVSTCk7DQotCQkJc2l0ZS5zZXRTaXRlQ29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7DQotCQkJc2l0ZS5yZXNvbHZlKHNpdGVVUkwsIG51bGwpOyAvLyByZXNvbHZlIGFueSBVUkxzIHJlbGF0aXZlIHRvIHRoZSBzaXRlDQotDQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7DQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oIlVuYWJsZSB0byBjcmVhdGUgVVJMIixlKTsNCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpew0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKCJVbmFibGUgdG8gYWNjZXNzIFVSTCIsZSk7DQotCQl9IGZpbmFsbHkgew0KLQkJCWlmIChpcyAhPSBudWxsKQ0KLQkJCQl0cnkgew0KLQkJCQkJaXMuY2xvc2UoKTsNCi0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCQl9DQotCQl9DQotDQotCQlyZXR1cm4gc2l0ZTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIFNpdGVNb2RlbEZhY3RvcnkjY2FuUGFyc2VTaXRlVHlwZShTdHJpbmcpDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBjYW5QYXJzZVNpdGVUeXBlKFN0cmluZyB0eXBlKSB7DQotCQlyZXR1cm4gdHlwZSAhPSBudWxsDQotCQkJJiYgdHlwZS5lcXVhbHMoIm9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5zaXRlLmZyZWVmb3JtIik7DQotCX0NCi0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvLmNsYXNzcGF0aCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMGM3YTUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9DREMtMS4wJUZvdW5kYXRpb24tMS4wIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyLy5jdnNpZ25vcmUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MjEzNjQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUzNDZjMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNXZWQgQXByIDI2IDE0OjM0OjAzIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvYWJvdXQuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9idWlsZC5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZmY2FhNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi1zb3VyY2UuLiA9IHNyYy8KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyOWIwODAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIFVwZGF0ZSBTY2hlZHVsZXIgcGx1Z2luLnhtbCByZXNvdXJjZXMKLSMKLXBsdWdpbk5hbWUgPSBBdXRvbWF0aWMgVXBkYXRlcyBTY2hlZHVsZXIKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1hdXRvbWF0aWNVcGRhdGVzUHJlZlBhZ2UgPSBBdXRvbWF0aWMgVXBkYXRlcwotcHJlZmVyZW5jZXMgPSBVcGRhdGVzIFNjaGVkdWxlciBQcmVmZXJlbmNlcwotcHJlZmVyZW5jZUtleXdvcmRzLmdlbmVyYWw9YXV0b21hdGljIHVwZGF0ZSBzY2hlZHVsZSBkb3dubG9hZApkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZWU3MzMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgCTxleHRlbnNpb24gaWQ9InByZWZlcmVuY2VzIiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIiBuYW1lPSIlcHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXIucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUluaXRpYWxpemVyIi8+Ci0JPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuc3RhcnR1cCI+Ci0gICAgICA8c3RhcnR1cCBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlci5TY2hlZHVsZXJTdGFydHVwIj4KLSAgICAgIDwvc3RhcnR1cD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnN0YXJ0dXAiPgotICAgICAgPHN0YXJ0dXAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXIuU2NoZWR1bGVkUGx1Z2luVW5pbnN0YWxsIj4KLSAgICAgIDwvc3RhcnR1cD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJWF1dG9tYXRpY1VwZGF0ZXNQcmVmUGFnZSIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuTWFpblByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXIucHJlZmVyZW5jZXMuQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIuQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlIj4KLSAgICAgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyLmdlbmVyYWwiLz4KLSAgICAgIDwvcGFnZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICAgICA8ZXh0ZW5zaW9uCi0gICAJCXBvaW50PSJvcmcuZWNsaXBzZS51aS5rZXl3b3JkcyI+Ci0gICAgICA8a2V5d29yZAotICAgICAgICAgICAgbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMuZ2VuZXJhbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyLmdlbmVyYWwiLz4KLSAgICAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9BdXRvbWF0aWNVcGRhdGVKb2IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL0F1dG9tYXRpY1VwZGF0ZUpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFmZDlhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL0F1dG9tYXRpY1VwZGF0ZUpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLlVwZGF0ZVNlYXJjaFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLlVwZGF0ZUpvYjsKLQotY2xhc3MgQXV0b21hdGljVXBkYXRlSm9iIGV4dGVuZHMgVXBkYXRlSm9iIHsKLQotCXB1YmxpYyBBdXRvbWF0aWNVcGRhdGVKb2IoU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNBdXRvbWF0aWMsIGJvb2xlYW4gZG93bmxvYWQpIHsKLQkJc3VwZXIobmFtZSwgaXNBdXRvbWF0aWMsIGRvd25sb2FkKTsKLQl9Ci0KLQlwdWJsaWMgQXV0b21hdGljVXBkYXRlSm9iKFN0cmluZyBuYW1lLCBVcGRhdGVTZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3QpIHsKLQkJc3VwZXIobmFtZSwgc2VhcmNoUmVxdWVzdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKLQkJcmV0dXJuIFNjaGVkdWxlclN0YXJ0dXAuYXV0b21hdGljSm9iRmFtaWx5ID09IGZhbWlseTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvU2NoZWR1bGVkUGx1Z2luVW5pbnN0YWxsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9TY2hlZHVsZWRQbHVnaW5Vbmluc3RhbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE5MmY2OC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9TY2hlZHVsZWRQbHVnaW5Vbmluc3RhbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RhcnR1cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5Db25maWd1cmF0b3JVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy5PcGVyYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuT3BlcmF0aW9uc01hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlZHVsZWRQbHVnaW5Vbmluc3RhbGwgaW1wbGVtZW50cyBJU3RhcnR1cCB7Ci0KLQlwdWJsaWMgdm9pZCBlYXJseVN0YXJ0dXAoKSB7Ci0JCVVSTCBwbGF0Zm9ybVhNTCA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKTsKLQkJCi0JCUZpbGUgZiA9IG5ldyBGaWxlKHBsYXRmb3JtWE1MLmdldEZpbGUoKSk7Ci0KLQkJZiA9IG5ldyBGaWxlKGYuZ2V0UGFyZW50RmlsZSgpLCAidG9CZVVuaW5zdGFsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCWlmICghZi5leGlzdHMoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCUZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGYpOwotCQkJUHJvcGVydGllcyB0b0JlVW5pbnN0YWxsZWQgPSBuZXcgUHJvcGVydGllcygpOwotCQkJdG9CZVVuaW5zdGFsbGVkLmxvYWQoZmlzKTsKLQkJCWZpcy5jbG9zZSgpOwotCi0JCQlJRmVhdHVyZVtdIGZlYXR1cmVzID0gbmV3IElGZWF0dXJlW3RvQmVVbmluc3RhbGxlZC5zaXplKCldOwotCQkJSUNvbmZpZ3VyZWRTaXRlW10gY29uZmlndXJlZFNpdGVzID0gbmV3IElDb25maWd1cmVkU2l0ZVt0b0JlVW5pbnN0YWxsZWQuc2l6ZSgpXTsKLQotCQkJSUNvbmZpZ3VyZWRTaXRlW10gc2l0ZXMgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCi0JCQlFbnVtZXJhdGlvbiBmZWF0dXJlc1RvQmVEZWxldGVkID0gdG9CZVVuaW5zdGFsbGVkLmVsZW1lbnRzKCk7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZShmZWF0dXJlc1RvQmVEZWxldGVkLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJU3RyaW5nIHRlbXAgPSAoU3RyaW5nKWZlYXR1cmVzVG9CZURlbGV0ZWQubmV4dEVsZW1lbnQoKTsKLQkJCQlTdHJpbmdUb2tlbml6ZXIgc3RrID0gbmV3IFN0cmluZ1Rva2VuaXplciggdGVtcCwgIjsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyB0YXJnZXRTaXRlID0gc3RrLm5leHRUb2tlbigpOwotCQkJCVN0cmluZyBmZWF0dXJlTmFtZSA9IHN0ay5uZXh0VG9rZW4oKTsKLQkJCQlmb3IoaW50IGogPSAwOyBqIDwgc2l0ZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKHNpdGVzW2pdLmdldFNpdGUoKS5nZXRVUkwoKS50b1N0cmluZygpLmVxdWFscyh0YXJnZXRTaXRlKSkgewotCQkJCQkJY29uZmlndXJlZFNpdGVzW2ldID0gc2l0ZXNbal07Ci0JCQkJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHNpdGVGZWF0dXJlcyA9IGNvbmZpZ3VyZWRTaXRlc1tpXS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJCQkJZm9yKGludCBrID0gMDsgayA8IHNpdGVGZWF0dXJlcy5sZW5ndGg7IGsrKykgewotCQkJCQkJCWlmIChzaXRlRmVhdHVyZXNba10uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkuZXF1YWxzKGZlYXR1cmVOYW1lKSkgewotCQkJCQkJCQlmZWF0dXJlc1tpXSA9IHNpdGVGZWF0dXJlc1trXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCQkJCQkKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX0KLQkJCQl9Ci0JCQkJaSsrOwotCQkJfQotCQkJCi0KLQkJCUlPcGVyYXRpb24gdW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24gPQotCQkJCSgoT3BlcmF0aW9uRmFjdG9yeSlPcGVyYXRpb25zTWFuYWdlci5nZXRPcGVyYXRpb25GYWN0b3J5KCkpLmNyZWF0ZVVuaW5zdGFsbEZlYXR1cmVzT3BlcmF0aW9uKCBjb25maWd1cmVkU2l0ZXMsIGZlYXR1cmVzKTsKLQotCQkJdW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24uZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJCQotCQkJZi5kZWxldGUoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL1NjaGVkdWxlclN0YXJ0dXAuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL1NjaGVkdWxlclN0YXJ0dXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk0MDFiNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9TY2hlZHVsZXJTdGFydHVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RhcnR1cDsKLQotLyoqCi0gKiBUaGlzIHBsdWctaW4gaXMgbG9hZGVkIG9uIHN0YXJ0dXAgdG8gZm9yayBhIGpvYiB0aGF0IHNlYXJjaGVzIGZvciBuZXcKLSAqIHBsdWctaW5zLgotICovCi1wdWJsaWMgY2xhc3MgU2NoZWR1bGVyU3RhcnR1cCBpbXBsZW1lbnRzIElTdGFydHVwIHsKLQkvLyBQcmVmZXJlbmNlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfRU5BQkxFRCA9ICJlbmFibGVkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9TQ0hFRFVMRSA9ICJzY2hlZHVsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX09OX1NUQVJUVVAgPSAib24tc3RhcnR1cCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX09OX1NDSEVEVUxFID0gIm9uLXNjaGVkdWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9ET1dOTE9BRCA9ICJkb3dubG9hZCI7IC8vIHZhbHVlIGlzIHRydWUgb3IgZmFsc2UsIGRlZmF1bHQgaXNmYWxzZSAvLyROT04tTkxTLTEkCi0KLQkvLyB2YWx1ZXMgYXJlIHRvIGJlIHBpY2tlZCB1cCBmcm9tIHRoZSBhcnJ5YXMgREFZUyBhbmQgSE9VUlMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0RBWSA9ICJkYXkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0hPVVIgPSAiaG91ciI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIEtlZXBzIHRyYWNrIG9mIHRoZSBydW5uaW5nIGpvYgotCXByaXZhdGUgSm9iIGpvYjsKLQotCXN0YXRpYyBmaW5hbCBPYmplY3QgYXV0b21hdGljSm9iRmFtaWx5ID0gbmV3IE9iamVjdCgpOwotCi0JLy8gTGlzdGVuZXIgZm9yIGpvYiBjaGFuZ2VzCi0JcHJpdmF0ZSBJSm9iQ2hhbmdlTGlzdGVuZXIgam9iTGlzdGVuZXI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERBWVMgPSB7Ci0JCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwX2RheSwKLQkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfTW9uZGF5LAotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF9UdWVzZGF5LAotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF9XZWRuZXNkYXksCi0JCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwX1RodXJzZGF5LAotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF9GcmlkYXksCi0JCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwX1NhdHVyZGF5LAotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF9TdW5kYXkgfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSE9VUlMgPSB7Ci0JCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzFBTSwKLQkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfMkFNLAotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF8zQU0sCi0JCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzRBTSwKLQkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfNUFNLAotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF82QU0sCi0JCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzdBTSwKLQkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfOEFNLAotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF85QU0sCi0JCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzEwQU0sCi0JCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzExQU0sCi0JCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzEyUE0sCi0JCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzFQTSwKLQkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfMlBNLAotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF8zUE0sCi0JCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzRQTSwKLQkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfNVBNLAotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF82UE0sCi0JCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzdQTSwKLQkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfOFBNLAotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF85UE0sCi0JCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzEwUE0sCi0JCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzExUE0sCi0JCQlVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzEyQU0sIH07Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFNjaGVkdWxlclN0YXJ0dXAoKSB7Ci0JCVVwZGF0ZVNjaGVkdWxlclBsdWdpbi5zZXRTY2hlZHVsZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZWFybHlTdGFydHVwKCkgewotCQlzY2hlZHVsZVVwZGF0ZUpvYigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNjaGVkdWxlVXBkYXRlSm9iKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmID0gVXBkYXRlU2NoZWR1bGVyUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkvLyBTZWUgaWYgYXV0b21hdGljIHNlYXJjaCBpcyBlbmFibGVkIGF0IGFsbAotCQlpZiAocHJlZi5nZXRCb29sZWFuKFBfRU5BQkxFRCkgPT0gZmFsc2UpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHNjaGVkdWxlID0gcHJlZi5nZXRTdHJpbmcoUF9TQ0hFRFVMRSk7Ci0JCWxvbmcgZGVsYXkgPSAtMUw7Ci0JCWlmIChzY2hlZHVsZS5lcXVhbHMoVkFMVUVfT05fU1RBUlRVUCkpCi0JCQkvLyBoYXZlIHdlIGFscmVhZHkgc3RhcnRlZCBhIGpvYiA/Ci0JCQlpZiAoam9iID09IG51bGwpCi0JCQkJZGVsYXkgPSAwTDsKLQkJCWVsc2UKLQkJCQlkZWxheSA9IC0xTDsKLQkJZWxzZQotCQkJZGVsYXkgPSBjb21wdXRlRGVsYXkocHJlZik7Ci0JCWlmIChkZWxheSA9PSAtMUwpCi0JCQlyZXR1cm47Ci0JCXN0YXJ0U2VhcmNoKGRlbGF5KTsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXREYXkoUHJlZmVyZW5jZXMgcHJlZikgewotCQlTdHJpbmcgZGF5ID0gcHJlZi5nZXRTdHJpbmcoUF9EQVkpOwotCQlmb3IgKGludCBkID0gMDsgZCA8IERBWVMubGVuZ3RoOyBkKyspCi0JCQlpZiAoREFZU1tkXS5lcXVhbHMoZGF5KSkKLQkJCQlzd2l0Y2ggKGQpIHsKLQkJCQljYXNlIDA6Ci0JCQkJCXJldHVybiAtMTsKLQkJCQljYXNlIDE6Ci0JCQkJCXJldHVybiBDYWxlbmRhci5NT05EQVk7Ci0JCQkJY2FzZSAyOgotCQkJCQlyZXR1cm4gQ2FsZW5kYXIuVFVFU0RBWTsKLQkJCQljYXNlIDM6Ci0JCQkJCXJldHVybiBDYWxlbmRhci5XRURORVNEQVk7Ci0JCQkJY2FzZSA0OgotCQkJCQlyZXR1cm4gQ2FsZW5kYXIuVEhVUlNEQVk7Ci0JCQkJY2FzZSA1OgotCQkJCQlyZXR1cm4gQ2FsZW5kYXIuRlJJREFZOwotCQkJCWNhc2UgNjoKLQkJCQkJcmV0dXJuIENhbGVuZGFyLlNBVFVSREFZOwotCQkJCWNhc2UgNzoKLQkJCQkJcmV0dXJuIENhbGVuZGFyLlNVTkRBWTsKLQkJCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRIb3VyKFByZWZlcmVuY2VzIHByZWYpIHsKLQkJU3RyaW5nIGhvdXIgPSBwcmVmLmdldFN0cmluZyhQX0hPVVIpOwotCQlmb3IgKGludCBoID0gMDsgaCA8IEhPVVJTLmxlbmd0aDsgaCsrKQotCQkJaWYgKEhPVVJTW2hdLmVxdWFscyhob3VyKSkKLQkJCQlyZXR1cm4gaCArIDE7Ci0JCXJldHVybiAxOwotCX0KLQotCS8qCi0JICogQ29tcHV0ZXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZnJvbSB0aGlzIG1vbWVudCB0byB0aGUgbmV4dAotCSAqIHNjaGVkdWxlZCBzZWFyY2guIElmIHRoYXQgbW9tZW50IGhhcyBhbHJlYWR5IHBhc3NlZCwgcmV0dXJucyAwTCAoc3RhcnQKLQkgKiBpbW1lZGlhdGVseSkuCi0JICovCi0JcHJpdmF0ZSBsb25nIGNvbXB1dGVEZWxheShQcmVmZXJlbmNlcyBwcmVmKSB7Ci0KLQkJaW50IHRhcmdldF9kID0gZ2V0RGF5KHByZWYpOwotCQlpbnQgdGFyZ2V0X2ggPSBnZXRIb3VyKHByZWYpOwotCi0JCUNhbGVuZGFyIGNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQkJLy8gbWF5IG5lZWQgdG8gdXNlIHRoZSBCb290TG9hZGVyIGxvY2FsZQotCQlpbnQgY3VycmVudF9kID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkRBWV9PRl9XRUVLKTsKLQkJLy8gc3RhcnRzIHdpdGggU1VOREFZCi0JCWludCBjdXJyZW50X2ggPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpOwotCQlpbnQgY3VycmVudF9tID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1JTlVURSk7Ci0JCWludCBjdXJyZW50X3MgPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuU0VDT05EKTsKLQkJaW50IGN1cnJlbnRfbXMgPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQpOwotCi0JCWxvbmcgZGVsYXkgPSAwTDsgLy8gbWlsbGlzZWNvbmRzCi0KLQkJaWYgKHRhcmdldF9kID09IC0xKSB7Ci0JCQkvLyBDb21wdXRlIHRoZSBkZWxheSBmb3IgImV2ZXJ5IGRheSBhdCB4IG8nY2xvY2siCi0JCQkvLyBJcyBpdCBub3cgPwotCQkJaWYgKHRhcmdldF9oID09IGN1cnJlbnRfaCAmJiBjdXJyZW50X20gPT0gMCAmJiBjdXJyZW50X3MgPT0gMCkKLQkJCQlyZXR1cm4gZGVsYXk7Ci0KLQkJCWludCBkZWx0YV9oID0gdGFyZ2V0X2ggLSBjdXJyZW50X2g7Ci0JCQlpZiAodGFyZ2V0X2ggPD0gY3VycmVudF9oKQotCQkJCWRlbHRhX2ggKz0gMjQ7Ci0JCQlkZWxheSA9ICgoZGVsdGFfaCAqIDYwIC0gY3VycmVudF9tKSAqIDYwIC0gY3VycmVudF9zKSAqIDEwMDAKLQkJCQkJLSBjdXJyZW50X21zOwotCQkJcmV0dXJuIGRlbGF5OwotCQl9IGVsc2UgewotCQkJLy8gQ29tcHV0ZSB0aGUgZGVsYXkgZm9yICJldmVyeSBYZGF5IGF0IHggbydjbG9jayIKLQkJCS8vIElzIGl0IG5vdyA/Ci0JCQlpZiAodGFyZ2V0X2QgPT0gY3VycmVudF9kICYmIHRhcmdldF9oID09IGN1cnJlbnRfaAotCQkJCQkmJiBjdXJyZW50X20gPT0gMCAmJiBjdXJyZW50X3MgPT0gMCkKLQkJCQlyZXR1cm4gZGVsYXk7Ci0KLQkJCWludCBkZWx0YV9kID0gdGFyZ2V0X2QgLSBjdXJyZW50X2Q7Ci0JCQlpZiAodGFyZ2V0X2QgPCBjdXJyZW50X2QKLQkJCQkJfHwgdGFyZ2V0X2QgPT0gY3VycmVudF9kCi0JCQkJCSYmICh0YXJnZXRfaCA8IGN1cnJlbnRfaCB8fCB0YXJnZXRfaCA9PSBjdXJyZW50X2gKLQkJCQkJCQkmJiBjdXJyZW50X20gPiAwKSkKLQkJCQlkZWx0YV9kICs9IDc7Ci0KLQkJCWRlbGF5ID0gKCgoZGVsdGFfZCAqIDI0ICsgdGFyZ2V0X2ggLSBjdXJyZW50X2gpICogNjAgLSBjdXJyZW50X20pICogNjAgLSBjdXJyZW50X3MpCi0JCQkJCSogMTAwMCAtIGN1cnJlbnRfbXM7Ci0KLQkJCXJldHVybiBkZWxheTsKLQkJfQotCQkvLyByZXR1cm4gLTFMOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydFNlYXJjaChsb25nIGRlbGF5KSB7Ci0JCWlmIChqb2IgIT0gbnVsbCkgewotCQkJLy8gY2FuY2VsIG9sZCBqb2IuCi0JCQkvLyBXZSBuZWVkIHRvIGRlcmVnaXN0ZXIgdGhlIGxpc3RlbmVyIGZpcnN0LHNvIHdlIHdvbid0Ci0JCQkvLyBhdXRvbWF0aWNhbGx5IHN0YXJ0IGFub3RoZXIgam9iCi0JCQlpZiAoam9iTGlzdGVuZXIgIT0gbnVsbCkKLQkJCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLnJlbW92ZUpvYkNoYW5nZUxpc3RlbmVyKGpvYkxpc3RlbmVyKTsKLQkJCUpvYi5nZXRKb2JNYW5hZ2VyKCkuY2FuY2VsKGF1dG9tYXRpY0pvYkZhbWlseSk7Ci0JCX0KLQkJaWYgKGpvYkxpc3RlbmVyID09IG51bGwpIHsKLQkJCS8vIHVzaW5nIHJlZmxlY3Rpb24gdG8gYXZvaWQgcHJlbWF0dXJlIGNsYXNzIGxvYWRpbmcKLQkJCWpvYkxpc3RlbmVyID0gY3JlYXRlSm9iQ2hhbmdlQWRhcHRlcigpOwotCQkJaWYgKGpvYkxpc3RlbmVyID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCUpvYi5nZXRKb2JNYW5hZ2VyKCkuYWRkSm9iQ2hhbmdlTGlzdGVuZXIoam9iTGlzdGVuZXIpOwotCQlTdHJpbmcgam9iTmFtZSA9IFVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNKb2JfQXV0b21hdGljVXBkYXRlU2VhcmNoOyAvLyk7Ci0JCWJvb2xlYW4gZG93bmxvYWQgPSBVcGRhdGVTY2hlZHVsZXJQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbigKLQkJCQkJCVVwZGF0ZVNjaGVkdWxlclBsdWdpbi5QX0RPV05MT0FEKTsKLQkJam9iID0gY3JlYXRlVXBkYXRlSm9iKGpvYk5hbWUsIGRvd25sb2FkKTsKLQkJaWYgKGpvYiAhPSBudWxsKQotCQkJam9iLnNjaGVkdWxlKGRlbGF5KTsKLQotCX0KLQotCS8qCi0JICogTG9hZHMgdGhlIHVwZGF0ZSBqb2IgdXNpbmcgcmVmbGVjdGlvbiB0byBhdm9pZCBwcmVtYXR1cmUgc3RhcnR1cCBvZiB0aGUKLQkgKiBVcGRhdGUgVUkgcGx1Zy1pbi4KLQkgKi8KLQotCXByaXZhdGUgSm9iIGNyZWF0ZVVwZGF0ZUpvYihTdHJpbmcgbmFtZSwgYm9vbGVhbiBkb3dubG9hZCkgewotCQl0cnkgewotCQkJQ2xhc3MgdGhlQ2xhc3MgPSBDbGFzcwotCQkJCQkuZm9yTmFtZSgib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlci5BdXRvbWF0aWNVcGRhdGVKb2IiKTsgLy8kTk9OLU5MUy0xJAotCQkJQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSB0aGVDbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7Ci0JCQkJCVN0cmluZy5jbGFzcywgQm9vbGVhbi5UWVBFLCBCb29sZWFuLlRZUEUgfSk7Ci0JCQlyZXR1cm4gKEpvYikgY29uc3RydWN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHsgbmFtZSwKLQkJCQkJQm9vbGVhbi5UUlVFLCBuZXcgQm9vbGVhbihkb3dubG9hZCkgfSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVTY2hlZHVsZXJQbHVnaW4ubG9nRXhjZXB0aW9uKGUsIGZhbHNlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBMb2FkcyB0aGUgam9iIGxpc3RlbmVyIHVzaW5nIHJlZmxlY3Rpb24gdG8gYXZvaWQgcHJlbWF0dXJlIHN0YXJ0dXAgb2YgdGhlCi0JICogVXBkYXRlIFVJIHBsdWctaW4uCi0JICovCi0JcHJpdmF0ZSBJSm9iQ2hhbmdlTGlzdGVuZXIgY3JlYXRlSm9iQ2hhbmdlQWRhcHRlcigpIHsKLQkJdHJ5IHsKLQkJCUNsYXNzIHRoZUNsYXNzID0gQ2xhc3MKLQkJCQkJLmZvck5hbWUoIm9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXIuVXBkYXRlSm9iQ2hhbmdlQWRhcHRlciIpOyAvLyROT04tTkxTLTEkCi0JCQlDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IHRoZUNsYXNzCi0JCQkJCS5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7IFNjaGVkdWxlclN0YXJ0dXAuY2xhc3MgfSk7Ci0JCQlyZXR1cm4gKElKb2JDaGFuZ2VMaXN0ZW5lcikgY29uc3RydWN0b3IKLQkJCQkJLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7IHRoaXMgfSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVTY2hlZHVsZXJQbHVnaW4ubG9nRXhjZXB0aW9uKGUsIGZhbHNlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JSm9iIGdldEpvYigpIHsKLQkJcmV0dXJuIGpvYjsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9VcGRhdGVKb2JDaGFuZ2VBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9VcGRhdGVKb2JDaGFuZ2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NDczYzQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvVXBkYXRlSm9iQ2hhbmdlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkcy5JbnN0YWxsV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLkluc3RhbGxXaXphcmQyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLlJlc2l6YWJsZUluc3RhbGxXaXphcmREaWFsb2c7Ci0KLWNsYXNzIFVwZGF0ZUpvYkNoYW5nZUFkYXB0ZXIgZXh0ZW5kcyBKb2JDaGFuZ2VBZGFwdGVyIHsKLQlwcml2YXRlIFNjaGVkdWxlclN0YXJ0dXAgc3RhcnR1cDsKLQotCXB1YmxpYyBVcGRhdGVKb2JDaGFuZ2VBZGFwdGVyKFNjaGVkdWxlclN0YXJ0dXAgc3RhcnR1cCkgewotCQl0aGlzLnN0YXJ0dXAgPSBzdGFydHVwOwotCX0KLQotCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRKb2IoKSA9PSBzdGFydHVwLmdldEpvYigpKSB7Ci0KLQkJCS8vIHByb21wdCB0aGUgdXNlcgotCQkJaWYgKCgoQXV0b21hdGljVXBkYXRlSm9iKSBzdGFydHVwLmdldEpvYigpKS5nZXRVcGRhdGVzKCkubGVuZ3RoID4gMAotCQkJCQkmJiAhSW5zdGFsbFdpemFyZC5pc1J1bm5pbmcoKSkgewotCQkJCWlmIChVcGRhdGVTY2hlZHVsZXJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkKLQkJCQkJCS5nZXRCb29sZWFuKFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5QX0RPV05MT0FEKSkgewotCQkJCQlVcGRhdGVVSS5nZXRTdGFuZGFyZERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWFzeW5jTm90aWZ5RG93bmxvYWRVc2VyKCk7Ci0JCQkJCQkJc3RhcnR1cC5zY2hlZHVsZVVwZGF0ZUpvYigpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9IGVsc2UgewotCQkJCQlVcGRhdGVVSS5nZXRTdGFuZGFyZERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWFzeW5jTm90aWZ5VXNlcigpOwotCQkJCQkJCXN0YXJ0dXAuc2NoZWR1bGVVcGRhdGVKb2IoKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFzeW5jTm90aWZ5VXNlcigpIHsKLQkJLy8gYXNrIHRoZSB1c2VyIHRvIGluc3RhbGwgdXBkYXRlcwotCQlVcGRhdGVVSS5nZXRTdGFuZGFyZERpc3BsYXkoKS5iZWVwKCk7Ci0JCWlmIChNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQXV0b21hdGljVXBkYXRlc0pvYl9FY2xpcHNlVXBkYXRlczEsCi0JCQkJVXBkYXRlVUlNZXNzYWdlcy5BdXRvbWF0aWNVcGRhdGVzSm9iX1VwZGF0ZXNBdmFpbGFibGUpKSB7Ci0JCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShVcGRhdGVVSS5nZXRTdGFuZGFyZERpc3BsYXkoKSwKLQkJCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCW9wZW5JbnN0YWxsV2l6YXJkMigpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJfQotCQkvLyBub3RpZnkgdGhlIG1hbmFnZXIgdGhhdCB0aGUgam9iIGlzIGRvbmUKLQkJLy8gam9iLmRvbmUoU3RhdHVzLk9LX1NUQVRVUyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFzeW5jTm90aWZ5RG93bmxvYWRVc2VyKCkgewotCQkvLyBhc2sgdGhlIHVzZXIgdG8gaW5zdGFsbCB1cGRhdGVzCi0JCVVwZGF0ZVVJLmdldFN0YW5kYXJkRGlzcGxheSgpLmJlZXAoKTsKLQkJaWYgKE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKFVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJVXBkYXRlVUlNZXNzYWdlcy5BdXRvbWF0aWNVcGRhdGVzSm9iX0VjbGlwc2VVcGRhdGVzMiwKLQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNKb2JfVXBkYXRlc0Rvd25sb2FkZWQpKSB7Ci0JCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShVcGRhdGVVSS5nZXRTdGFuZGFyZERpc3BsYXkoKSwKLQkJCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCW9wZW5JbnN0YWxsV2l6YXJkMigpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJfSBlbHNlIHsKLQkJCS8vIERvbid0IGRpc2NhcmQgZG93bmxvYWRlZCBkYXRhLCBhcyBuZXh0IHRpbWUgd2UgY29tcGFyZQotCQkJLy8gdGltZXN0YW1wcy4KLQotCQkJLy8gZGlzY2FyZCBhbGwgdGhlIGRvd25sb2FkZWQgZGF0YSBmcm9tIGNhY2hlIChtYXkgaW5jbHVkZSBvbGQKLQkJCS8vIGRhdGEgYXMgd2VsbCkKLQkJCS8vIFV0aWxpdGllcy5mbHVzaExvY2FsRmlsZSgpOwotCQl9Ci0JCS8vIG5vdGlmeSB0aGUgbWFuYWdlciB0aGF0IHRoZSBqb2IgaXMgZG9uZQotCQkvLyBqb2IuZG9uZShTdGF0dXMuT0tfU1RBVFVTKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3Blbkluc3RhbGxXaXphcmQyKCkgewotCQlpZiAoSW5zdGFsbFdpemFyZC5pc1J1bm5pbmcoKSkKLQkJCS8vIGpvYiBlbmRzIGFuZCBhIG5ldyBvbmUgaXMgcmVzY2hlZHVsZWQKLQkJCXJldHVybjsKLQkJQXV0b21hdGljVXBkYXRlSm9iIHVqb2IgPSAoQXV0b21hdGljVXBkYXRlSm9iKSBzdGFydHVwLmdldEpvYigpOwotCQlJbnN0YWxsV2l6YXJkMiB3aXphcmQgPSBuZXcgSW5zdGFsbFdpemFyZDIodWpvYi5nZXRTZWFyY2hSZXF1ZXN0KCksCi0JCQkJdWpvYi5nZXRVcGRhdGVzKCksIHRydWUpOwotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFJlc2l6YWJsZUluc3RhbGxXaXphcmREaWFsb2coVXBkYXRlVUkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwgd2l6YXJkLAotCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQXV0b21hdGljVXBkYXRlc0pvYl9VcGRhdGVzKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL1VwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNmZkZTguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIFVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyLlVwZGF0ZVNjaGVkdWxlclJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF9kYXk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF9Nb25kYXk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF9UdWVzZGF5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfV2VkbmVzZGF5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfVGh1cnNkYXk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF9GcmlkYXk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF9TYXR1cmRheTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwX1N1bmRheTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzFBTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzJBTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzNBTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzRBTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzVBTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzZBTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzdBTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzhBTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzlBTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzEwQU07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF8xMUFNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfMTJQTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzFQTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzJQTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzNQTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzRQTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzVQTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzZQTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzdQTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzhQTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzlQTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzEwUE07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF8xMVBNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfMTJBTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNVcGRhdGVzSm9iX0F1dG9tYXRpY1VwZGF0ZVNlYXJjaDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfZmluZFVwZGF0ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX1VwZGF0ZVNjaGVkdWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9maW5kT25TdGFydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfZmluZE9uU2NoZWR1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2Rvd25sb2FkT3B0aW9uczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2Vfc2VhcmNoQW5kTm90aWZ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9kb3dubG9hZEFuZE5vdGlmeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfYXQ7Ci0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9VcGRhdGVTY2hlZHVsZXJQbHVnaW4uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL1VwZGF0ZVNjaGVkdWxlclBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDgwZmJjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL1VwZGF0ZVNjaGVkdWxlclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogVGhpcyBwbHVnLWluIGlzIGxvYWRlZCBvbiBzdGFydHVwIHRvIGZvcmsgYSBqb2IgdGhhdAotICogc2VhcmNoZXMgZm9yIG5ldyBwbHVnLWlucy4KLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZVNjaGVkdWxlclBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW57Ci0JLy8gUHJlZmVyZW5jZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0VOQUJMRUQgPSAiZW5hYmxlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1NDSEVEVUxFID0gInNjaGVkdWxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX09OX1NUQVJUVVAgPSAib24tc3RhcnR1cCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9PTl9TQ0hFRFVMRSA9ICJvbi1zY2hlZHVsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0RPV05MT0FEID0gImRvd25sb2FkIjsgLy8gdmFsdWUgaXMgdHJ1ZSBvciBmYWxzZSwgZGVmYXVsdCBpcyBmYWxzZSAvLyROT04tTkxTLTEkCi0KLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgVXBkYXRlU2NoZWR1bGVyUGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIFNjaGVkdWxlclN0YXJ0dXAgc2NoZWR1bGVyOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBVcGRhdGVTY2hlZHVsZXJQbHVnaW4oKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCWlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJdHJ5IHsKLQkJCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlci5VcGRhdGVTY2hlZHVsZXJSZXNvdXJjZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCQl9Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBVcGRhdGVTY2hlZHVsZXJQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBlKSB7Ci0JCWxvZ0V4Y2VwdGlvbihlLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBlLCBib29sZWFuIHNob3dFcnJvckRpYWxvZykgewotCQlpZiAoZSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLQkJCWUgPSAoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIGUpLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlpZiAoZSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCXN0YXR1cyA9ICgoQ29yZUV4Y2VwdGlvbikgZSkuZ2V0U3RhdHVzKCk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkKLQkJCQltZXNzYWdlID0gZS50b1N0cmluZygpOwotCQkJc3RhdHVzID0KLQkJCQluZXcgU3RhdHVzKAotCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQlnZXRQbHVnaW5JZCgpLAotCQkJCQlJU3RhdHVzLk9LLAotCQkJCQltZXNzYWdlLAotCQkJCQllKTsKLQkJfQotCQlsb2coc3RhdHVzLCBzaG93RXJyb3JEaWFsb2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMsIGJvb2xlYW4gc2hvd0Vycm9yRGlhbG9nKSB7Ci0JCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLklORk8pIHsKLQkJCWlmIChzaG93RXJyb3JEaWFsb2cpCi0JCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKAotCQkJCQlnZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJCQludWxsLAotCQkJCQludWxsLAotCQkJCQlzdGF0dXMpOwotLy8JCQkgU2hvdWxkIGxvZyBvbiB0aGUgdXBkYXRlIHBsdWdpbidzIGxvZwotLy8JCQlQbGF0Zm9ybS5nZXRQbHVnaW4oIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIpLmdldExvZygpLmxvZyhzdGF0dXMpOyAvLyROT04tTkxTLTEkCi0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyIik7ICAvLyROT04tTkxTLTEkCi0JCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzKTsKLQkJfSBlbHNlIHsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKAotCQkJCWdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJbnVsbCwKLQkJCQlzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFBhZ2UgZ2V0QWN0aXZlUGFnZSgpIHsKLQkJVXBkYXRlU2NoZWR1bGVyUGx1Z2luIHBsdWdpbiA9IGdldERlZmF1bHQoKTsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPQotCQkJcGx1Z2luLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpCi0JCQlyZXR1cm4gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTaGVsbCBnZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJcmV0dXJuIHdpbmRvdyAhPSBudWxsID8gd2luZG93LmdldFNoZWxsKCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFdpbmRvdyBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTY2hlZHVsZXJTdGFydHVwIGdldFNjaGVkdWxlcigpIHsKLQkJLy8gSWYgdGhlIHNjaGVkdWxlciB3YXMgZGlzYWJsZWQsIGl0IGRvZXMgbm90IGdldCBpbml0aWFsaXplZAotCQlpZiAoc2NoZWR1bGVyID09IG51bGwpCi0JCQlzY2hlZHVsZXIgPSBuZXcgU2NoZWR1bGVyU3RhcnR1cCgpOwotCQlyZXR1cm4gc2NoZWR1bGVyOwotCX0KLQkKLQlzdGF0aWMgdm9pZCBzZXRTY2hlZHVsZXIoU2NoZWR1bGVyU3RhcnR1cCBzY2hlZHVsZXIpIHsKLQkJVXBkYXRlU2NoZWR1bGVyUGx1Z2luLnNjaGVkdWxlciA9IHNjaGVkdWxlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9VcGRhdGVTY2hlZHVsZXJSZXNvdXJjZXMucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL1VwZGF0ZVNjaGVkdWxlclJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTRhODExLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL1VwZGF0ZVNjaGVkdWxlclJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI01lc3NhZ2VzIGZvciBVcGRhdGUgU2NoZWR1bGVyIHBsdWctaW4KLQotU2NoZWR1bGVyU3RhcnR1cF9kYXk9RXZlcnkgZGF5Ci1TY2hlZHVsZXJTdGFydHVwX01vbmRheT1FdmVyeSBNb25kYXkKLVNjaGVkdWxlclN0YXJ0dXBfVHVlc2RheT1FdmVyeSBUdWVzZGF5Ci1TY2hlZHVsZXJTdGFydHVwX1dlZG5lc2RheT1FdmVyeSBXZWRuZXNkYXkKLVNjaGVkdWxlclN0YXJ0dXBfVGh1cnNkYXk9RXZlcnkgVGh1cnNkYXkKLVNjaGVkdWxlclN0YXJ0dXBfRnJpZGF5PUV2ZXJ5IEZyaWRheQotU2NoZWR1bGVyU3RhcnR1cF9TYXR1cmRheT1FdmVyeSBTYXR1cmRheQotU2NoZWR1bGVyU3RhcnR1cF9TdW5kYXk9RXZlcnkgU3VuZGF5Ci1TY2hlZHVsZXJTdGFydHVwXzFBTT0xOjAwIEFNCi1TY2hlZHVsZXJTdGFydHVwXzJBTT0yOjAwIEFNCi1TY2hlZHVsZXJTdGFydHVwXzNBTT0zOjAwIEFNCi1TY2hlZHVsZXJTdGFydHVwXzRBTT00OjAwIEFNCi1TY2hlZHVsZXJTdGFydHVwXzVBTT01OjAwIEFNCi1TY2hlZHVsZXJTdGFydHVwXzZBTT02OjAwIEFNCi1TY2hlZHVsZXJTdGFydHVwXzdBTT03OjAwIEFNCi1TY2hlZHVsZXJTdGFydHVwXzhBTT04OjAwIEFNCi1TY2hlZHVsZXJTdGFydHVwXzlBTT05OjAwIEFNCi1TY2hlZHVsZXJTdGFydHVwXzEwQU09MTA6MDAgQU0KLVNjaGVkdWxlclN0YXJ0dXBfMTFBTT0xMTowMCBBTQotU2NoZWR1bGVyU3RhcnR1cF8xMlBNPTEyOjAwIFBNCi1TY2hlZHVsZXJTdGFydHVwXzFQTT0xOjAwIFBNCi1TY2hlZHVsZXJTdGFydHVwXzJQTT0yOjAwIFBNCi1TY2hlZHVsZXJTdGFydHVwXzNQTT0zOjAwIFBNCi1TY2hlZHVsZXJTdGFydHVwXzRQTT00OjAwIFBNCi1TY2hlZHVsZXJTdGFydHVwXzVQTT01OjAwIFBNCi1TY2hlZHVsZXJTdGFydHVwXzZQTT02OjAwIFBNCi1TY2hlZHVsZXJTdGFydHVwXzdQTT03OjAwIFBNCi1TY2hlZHVsZXJTdGFydHVwXzhQTT04OjAwIFBNCi1TY2hlZHVsZXJTdGFydHVwXzlQTT05OjAwIFBNCi1TY2hlZHVsZXJTdGFydHVwXzEwUE09MTA6MDAgUE0KLVNjaGVkdWxlclN0YXJ0dXBfMTFQTT0xMTowMCBQTQotU2NoZWR1bGVyU3RhcnR1cF8xMkFNPTEyOjAwIEFNCi1BdXRvbWF0aWNVcGRhdGVzSm9iX0F1dG9tYXRpY1VwZGF0ZVNlYXJjaD1BdXRvbWF0aWMgVXBkYXRlIFNlYXJjaAotQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2ZpbmRVcGRhdGVzPUF1dG9tYXRpY2FsbHkgJmZpbmQgbmV3IHVwZGF0ZXMgYW5kIG5vdGlmeSBtZQotQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX1VwZGF0ZVNjaGVkdWxlPVVwZGF0ZSAmU2NoZWR1bGUKLUF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9maW5kT25TdGFydD1Mb29rIGZvciB1cGRhdGVzIGVhY2ggdGltZSAmcGxhdGZvcm0gaXMgc3RhcnRlZAotQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2ZpbmRPblNjaGVkdWxlPSZMb29rIGZvciB1cGRhdGVzIG9uIHRoZSBmb2xsb3dpbmcgc2NoZWR1bGU6Ci1BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfZG93bmxvYWRPcHRpb25zPURvd25sb2FkICZPcHRpb25zCi1BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2Vfc2VhcmNoQW5kTm90aWZ5PVNlYXJjaCBmb3IgdXBkYXRlcyBhbmQgJm5vdGlmeSBtZSB3aGVuIHRoZXkgYXJlIGF2YWlsYWJsZQotQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2Rvd25sb2FkQW5kTm90aWZ5PURvd25sb2FkIG5ldyAmdXBkYXRlcyBhdXRvbWF0aWNhbGx5IGFuZCBub3RpZnkgbWUgd2hlbiByZWFkeSB0byBpbnN0YWxsIHRoZW0KLUF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9hdD1hdApkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvcHJlZmVyZW5jZXMvQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9wcmVmZXJlbmNlcy9BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcwY2NlZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9wcmVmZXJlbmNlcy9BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlci5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXIuVXBkYXRlU2NoZWR1bGVyUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlCi0JZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZQotCWltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgQnV0dG9uIGVuYWJsZWRDaGVjazsKLQlwcml2YXRlIEJ1dHRvbiBvblN0YXJ0dXBSYWRpbzsKLQlwcml2YXRlIEJ1dHRvbiBvblNjaGVkdWxlUmFkaW87Ci0JcHJpdmF0ZSBDb21ibyBkYXlDb21ibzsKLQlwcml2YXRlIExhYmVsIGF0TGFiZWw7Ci0JcHJpdmF0ZSBDb21ibyBob3VyQ29tYm87Ci0JcHJpdmF0ZSBCdXR0b24gc2VhcmNoT25seVJhZGlvOwotCXByaXZhdGUgQnV0dG9uIHNlYXJjaEFuZERvd25sb2FkUmFkaW87Ci0JcHJpdmF0ZSBHcm91cCB1cGRhdGVTY2hlZHVsZUdyb3VwOwotCXByaXZhdGUgR3JvdXAgZG93bmxvYWRHcm91cDsKLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJZW5hYmxlZENoZWNrID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5DSEVDSyk7Ci0JCWVuYWJsZWRDaGVjay5zZXRUZXh0KFVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9maW5kVXBkYXRlcyk7IAotCi0JCWNyZWF0ZVNwYWNlcihjb250YWluZXIsIDEpOwotCi0JCXVwZGF0ZVNjaGVkdWxlR3JvdXAgPSBuZXcgR3JvdXAoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCXVwZGF0ZVNjaGVkdWxlR3JvdXAuc2V0VGV4dChVcGRhdGVTY2hlZHVsZXJNZXNzYWdlcy5BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfVXBkYXRlU2NoZWR1bGUpOyAKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQl1cGRhdGVTY2hlZHVsZUdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQl1cGRhdGVTY2hlZHVsZUdyb3VwLnNldExheW91dERhdGEoZ2QpOwotCi0JCW9uU3RhcnR1cFJhZGlvID0gbmV3IEJ1dHRvbih1cGRhdGVTY2hlZHVsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlvblN0YXJ0dXBSYWRpby5zZXRUZXh0KAotCQkJVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2ZpbmRPblN0YXJ0KTsgCi0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJb25TdGFydHVwUmFkaW8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCW9uU3RhcnR1cFJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXBhZ2VDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCW9uU2NoZWR1bGVSYWRpbyA9IG5ldyBCdXR0b24odXBkYXRlU2NoZWR1bGVHcm91cCwgU1dULlJBRElPKTsKLQkJb25TY2hlZHVsZVJhZGlvLnNldFRleHQoVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2ZpbmRPblNjaGVkdWxlKTsgCi0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJb25TY2hlZHVsZVJhZGlvLnNldExheW91dERhdGEoZ2QpOwotCQlvblNjaGVkdWxlUmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcGFnZUNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZGF5Q29tYm8gPSBuZXcgQ29tYm8odXBkYXRlU2NoZWR1bGVHcm91cCwgU1dULlJFQURfT05MWSk7Ci0JCWRheUNvbWJvLnNldEl0ZW1zKFNjaGVkdWxlclN0YXJ0dXAuREFZUyk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLndpZHRoSGludCA9IDIwMDsKLQkJZ2QuaG9yaXpvbnRhbEluZGVudCA9IDMwOwotCQlkYXlDb21iby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCWF0TGFiZWwgPSBuZXcgTGFiZWwodXBkYXRlU2NoZWR1bGVHcm91cCwgU1dULk5VTEwpOwotCQlhdExhYmVsLnNldFRleHQoVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2F0KTsgCi0JCQotCQlob3VyQ29tYm8gPSBuZXcgQ29tYm8odXBkYXRlU2NoZWR1bGVHcm91cCwgU1dULlJFQURfT05MWSk7Ci0JCWhvdXJDb21iby5zZXRJdGVtcyhTY2hlZHVsZXJTdGFydHVwLkhPVVJTKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJLy9nZC53aWR0aEhpbnQgPSAxMDA7Ci0JCWhvdXJDb21iby5zZXRMYXlvdXREYXRhKGdkKTsKLQkKLQkJY3JlYXRlU3BhY2VyKGNvbnRhaW5lciwgMSk7Ci0JCQotCQlkb3dubG9hZEdyb3VwID0gbmV3IEdyb3VwKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlkb3dubG9hZEdyb3VwLnNldFRleHQoVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2Rvd25sb2FkT3B0aW9ucyk7IAotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWRvd25sb2FkR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRvd25sb2FkR3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJc2VhcmNoT25seVJhZGlvID0gbmV3IEJ1dHRvbihkb3dubG9hZEdyb3VwLCBTV1QuUkFESU8pOwotCQlzZWFyY2hPbmx5UmFkaW8uc2V0VGV4dCgKLQkJCVVwZGF0ZVNjaGVkdWxlck1lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9zZWFyY2hBbmROb3RpZnkpOyAKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlzZWFyY2hPbmx5UmFkaW8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNlYXJjaE9ubHlSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwYWdlQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQotCQlzZWFyY2hBbmREb3dubG9hZFJhZGlvID0gbmV3IEJ1dHRvbihkb3dubG9hZEdyb3VwLCBTV1QuUkFESU8pOwotCQlzZWFyY2hBbmREb3dubG9hZFJhZGlvLnNldFRleHQoVXBkYXRlU2NoZWR1bGVyTWVzc2FnZXMuQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2Rvd25sb2FkQW5kTm90aWZ5KTsgCi0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJc2VhcmNoQW5kRG93bmxvYWRSYWRpby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VhcmNoQW5kRG93bmxvYWRSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwYWdlQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQkJCQotCQlpbml0aWFsaXplKCk7Ci0KLQkJZW5hYmxlZENoZWNrLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXBhZ2VDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29udGFpbmVyKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTcGFjZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IGNvbHVtblNwYW4pIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uU3BhbjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWYgPSBVcGRhdGVTY2hlZHVsZXJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWVuYWJsZWRDaGVjay5zZXRTZWxlY3Rpb24ocHJlZi5nZXRCb29sZWFuKFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5QX0VOQUJMRUQpKTsKLQkJc2V0U2NoZWR1bGUocHJlZi5nZXRTdHJpbmcoVXBkYXRlU2NoZWR1bGVyUGx1Z2luLlBfU0NIRURVTEUpKTsKLQotCQlkYXlDb21iby5zZXRUZXh0KFNjaGVkdWxlclN0YXJ0dXAuREFZU1tnZXREYXkocHJlZiwgZmFsc2UpXSk7Ci0JCWhvdXJDb21iby5zZXRUZXh0KFNjaGVkdWxlclN0YXJ0dXAuSE9VUlNbZ2V0SG91cihwcmVmLCBmYWxzZSldKTsKLQkJCi0JCXNlYXJjaE9ubHlSYWRpby5zZXRTZWxlY3Rpb24oIXByZWYuZ2V0Qm9vbGVhbihVcGRhdGVTY2hlZHVsZXJQbHVnaW4uUF9ET1dOTE9BRCkpOwotCQlzZWFyY2hBbmREb3dubG9hZFJhZGlvLnNldFNlbGVjdGlvbihwcmVmLmdldEJvb2xlYW4oVXBkYXRlU2NoZWR1bGVyUGx1Z2luLlBfRE9XTkxPQUQpKTsKLQotCQlwYWdlQ2hhbmdlZCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTY2hlZHVsZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlLmVxdWFscyhVcGRhdGVTY2hlZHVsZXJQbHVnaW4uVkFMVUVfT05fU1RBUlRVUCkpCi0JCQlvblN0YXJ0dXBSYWRpby5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWVsc2UKLQkJCW9uU2NoZWR1bGVSYWRpby5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhZ2VDaGFuZ2VkKCkgewotCQlib29sZWFuIG1hc3RlciA9IGVuYWJsZWRDaGVjay5nZXRTZWxlY3Rpb24oKTsKLQkJdXBkYXRlU2NoZWR1bGVHcm91cC5zZXRFbmFibGVkKG1hc3Rlcik7Ci0JCW9uU3RhcnR1cFJhZGlvLnNldEVuYWJsZWQobWFzdGVyKTsKLQkJb25TY2hlZHVsZVJhZGlvLnNldEVuYWJsZWQobWFzdGVyKTsKLQkJZGF5Q29tYm8uc2V0RW5hYmxlZChtYXN0ZXIgJiYgb25TY2hlZHVsZVJhZGlvLmdldFNlbGVjdGlvbigpKTsKLQkJYXRMYWJlbC5zZXRFbmFibGVkKG1hc3RlciAmJiBvblNjaGVkdWxlUmFkaW8uZ2V0U2VsZWN0aW9uKCkpOwotCQlob3VyQ29tYm8uc2V0RW5hYmxlZChtYXN0ZXIgJiYgb25TY2hlZHVsZVJhZGlvLmdldFNlbGVjdGlvbigpKTsKLQkJZG93bmxvYWRHcm91cC5zZXRFbmFibGVkKG1hc3Rlcik7Ci0JCXNlYXJjaE9ubHlSYWRpby5zZXRFbmFibGVkKG1hc3Rlcik7Ci0JCXNlYXJjaEFuZERvd25sb2FkUmFkaW8uc2V0RW5hYmxlZChtYXN0ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCVByZWZlcmVuY2VzIHByZWYgPSBVcGRhdGVTY2hlZHVsZXJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWVuYWJsZWRDaGVjay5zZXRTZWxlY3Rpb24ocHJlZi5nZXREZWZhdWx0Qm9vbGVhbihVcGRhdGVTY2hlZHVsZXJQbHVnaW4uUF9FTkFCTEVEKSk7CQkKLQkJCi0JCXNldFNjaGVkdWxlKHByZWYuZ2V0RGVmYXVsdFN0cmluZyhVcGRhdGVTY2hlZHVsZXJQbHVnaW4uUF9TQ0hFRFVMRSkpOwotCQlvblNjaGVkdWxlUmFkaW8uc2V0U2VsZWN0aW9uKHByZWYuZ2V0RGVmYXVsdEJvb2xlYW4oVXBkYXRlU2NoZWR1bGVyUGx1Z2luLlBfU0NIRURVTEUpKTsKLQkJCi0JCWRheUNvbWJvLnNldFRleHQoU2NoZWR1bGVyU3RhcnR1cC5EQVlTW2dldERheShwcmVmLCB0cnVlKV0pOwotCQlob3VyQ29tYm8uc2V0VGV4dChTY2hlZHVsZXJTdGFydHVwLkhPVVJTW2dldEhvdXIocHJlZiwgdHJ1ZSldKTsKLQkJCi0JCXNlYXJjaE9ubHlSYWRpby5zZXRTZWxlY3Rpb24oIXByZWYuZ2V0RGVmYXVsdEJvb2xlYW4oVXBkYXRlU2NoZWR1bGVyUGx1Z2luLlBfRE9XTkxPQUQpKTsKLQkJc2VhcmNoQW5kRG93bmxvYWRSYWRpby5zZXRTZWxlY3Rpb24ocHJlZi5nZXREZWZhdWx0Qm9vbGVhbihVcGRhdGVTY2hlZHVsZXJQbHVnaW4uUF9ET1dOTE9BRCkpOwotCQlwYWdlQ2hhbmdlZCgpOwotCX0KLQotCS8qKiAKLQkgKiBNZXRob2QgZGVjbGFyZWQgb24gSVByZWZlcmVuY2VQYWdlLgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmID0gVXBkYXRlU2NoZWR1bGVyUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlwcmVmLnNldFZhbHVlKFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5QX0VOQUJMRUQsIGVuYWJsZWRDaGVjay5nZXRTZWxlY3Rpb24oKSk7Ci0JCWlmIChvblN0YXJ0dXBSYWRpby5nZXRTZWxlY3Rpb24oKSkKLQkJCXByZWYuc2V0VmFsdWUoVXBkYXRlU2NoZWR1bGVyUGx1Z2luLlBfU0NIRURVTEUsIFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5WQUxVRV9PTl9TVEFSVFVQKTsKLQkJZWxzZSAKLQkJCXByZWYuc2V0VmFsdWUoVXBkYXRlU2NoZWR1bGVyUGx1Z2luLlBfU0NIRURVTEUsIFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5WQUxVRV9PTl9TQ0hFRFVMRSk7Ci0JCQkKLQkJcHJlZi5zZXRWYWx1ZShTY2hlZHVsZXJTdGFydHVwLlBfREFZLCBkYXlDb21iby5nZXRUZXh0KCkpOwotCQlwcmVmLnNldFZhbHVlKFNjaGVkdWxlclN0YXJ0dXAuUF9IT1VSLCBob3VyQ29tYm8uZ2V0VGV4dCgpKTsKLQkJCi0JCXByZWYuc2V0VmFsdWUoVXBkYXRlU2NoZWR1bGVyUGx1Z2luLlBfRE9XTkxPQUQsIHNlYXJjaEFuZERvd25sb2FkUmFkaW8uZ2V0U2VsZWN0aW9uKCkpOwotCQkKLQkJVXBkYXRlU2NoZWR1bGVyUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCi0JCVVwZGF0ZVNjaGVkdWxlclBsdWdpbi5nZXRTY2hlZHVsZXIoKS5zY2hlZHVsZVVwZGF0ZUpvYigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgZ2V0RGF5KFByZWZlcmVuY2VzIHByZWYsIGJvb2xlYW4gdXNlRGVmYXVsdCkgewotCQlTdHJpbmcgZGF5ID0gdXNlRGVmYXVsdD8gcHJlZi5nZXREZWZhdWx0U3RyaW5nKFNjaGVkdWxlclN0YXJ0dXAuUF9EQVkpOiBwcmVmLmdldFN0cmluZyhTY2hlZHVsZXJTdGFydHVwLlBfREFZKTsKLQkJZm9yIChpbnQgaT0wOyBpPFNjaGVkdWxlclN0YXJ0dXAuREFZUy5sZW5ndGg7IGkrKykKLQkJCWlmIChTY2hlZHVsZXJTdGFydHVwLkRBWVNbaV0uZXF1YWxzKGRheSkpCi0JCQkJcmV0dXJuIGk7Ci0JCXJldHVybiAwOwotCX0KLQkKLQlwcml2YXRlIGludCBnZXRIb3VyKFByZWZlcmVuY2VzIHByZWYsIGJvb2xlYW4gdXNlRGVmYXVsdCkgewotCQlTdHJpbmcgaG91ciA9IHVzZURlZmF1bHQ/IHByZWYuZ2V0RGVmYXVsdFN0cmluZyhTY2hlZHVsZXJTdGFydHVwLlBfSE9VUik6IHByZWYuZ2V0U3RyaW5nKFNjaGVkdWxlclN0YXJ0dXAuUF9IT1VSKTsKLQkJZm9yIChpbnQgaT0wOyBpPFNjaGVkdWxlclN0YXJ0dXAuSE9VUlMubGVuZ3RoOyBpKyspCi0JCQlpZiAoU2NoZWR1bGVyU3RhcnR1cC5IT1VSU1tpXS5lcXVhbHMoaG91cikpCi0JCQkJcmV0dXJuIGk7Ci0JCXJldHVybiAwOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYzc3NTAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlci5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXIuVXBkYXRlU2NoZWR1bGVyUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLQotLyoqCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJUHJlZmVyZW5jZXMgbm9kZSA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKCJvcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZS5wdXRCb29sZWFuKFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5QX0VOQUJMRUQsIGZhbHNlKTsKLQkJbm9kZS5wdXQoVXBkYXRlU2NoZWR1bGVyUGx1Z2luLlBfU0NIRURVTEUsIFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5WQUxVRV9PTl9TVEFSVFVQKTsKLQkJbm9kZS5wdXRCb29sZWFuKFVwZGF0ZVNjaGVkdWxlclBsdWdpbi5QX0RPV05MT0FELCBmYWxzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvLmNsYXNzcGF0aCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODQ4MjQ5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS8uY3ZzaWdub3JlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNDI2MjQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLmJvb3Q8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlczwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5PC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuaGVscC5hcHBzZXJ2ZXI8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS50b21jYXQ8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yPC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmU8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eDwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5qdW5pdDwvcHJvamVjdD4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMDAzOTguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLSNXZWQgRmViIDI1IDEwOjA2OjQxIEVTVCAyMDA5Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5jb21wYXJpbmdJZGVudGljYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZWFkQ29kZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0hhc2hDb2RlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU3luY2hyb25pemVkT25Jbmhlcml0ZWRNZXRob2Q9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIwYzhjZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlbmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmU7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDMuMy4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogdXBkYXRldGVzdHMuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlVGVzdHNQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlci1uYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMsCi0gb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmFwaSwKLSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYnJhbmRpbmcsCi0gb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvbmZpZ3VyYXRpb25zLAotIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLmJvb3QsCi0gb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmltcGxlbWVudGF0aW9uLAotIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5taXJyb3IsCi0gb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLm1vZGVsLAotIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5uYXRpdmVUZXN0cywKLSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubmVzdGVkZmVhdHVyZXMsCi0gb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnBhcnNlciwKLSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucGVyZm1zLAotIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWNvbmNpbGlhdGlvbiwKLSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVndWxhckluc3RhbGwsCi0gb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJSZW1vdmUsCi0gb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnNpdGV2YWxpZGF0aW9uLAotIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5zdGFuZGFsb25lLAotIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy50eXBlcywKLSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMudWl2YWx1ZXMKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmp1bml0LAotIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLAotIG9yZy5lY2xpcHNlLmhlbHAuYXBwc2VydmVyLAotIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IsCi0gb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAucmVnaXN0cnkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLmpldHR5LAotIG9yZy5vc2dpLnNlcnZpY2UuaHR0cDt2ZXJzaW9uPSIxLjIuMCIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9hYm91dC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYzg4OTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTMiIGltYWdlPSJmZWF0dXJlMS5naWYiIGxhYmVsPSJUaGlyZCBGZWF0dXJlIiBwcm92aWRlci1uYW1lPSJTbWFydCBDb21wYW55IiB2ZXJzaW9uPSIxLjAuMCIgPgotICA8ZGVzY3JpcHRpb24+RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotICA8Y29weXJpZ2h0PmNvcHlyaWdodDwvY29weXJpZ2h0PgotICA8bGljZW5zZT5saWNlbnNlPC9saWNlbnNlPgotICA8dXJsPgotICAgIDx1cGRhdGUgbGFiZWw9IlVSTCB0byB1cGRhdGUgdGhlIGZlYXR1cmUiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wYXRoL2ZlYXR1cmUxLyIvPgotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAxIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMiIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+Ci0gIDwvdXJsPgotICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjE1MDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xIiBpbnN0YWxsLXNpemU9IjEwMDAiIGZyYWdtZW50PSJmYWxzZSIgbmw9ImVuIiBvcz0iV0lOMzIsTElOVVgsSFBVWCxNQUNPU1gsQUlYLFNPTEFSSVMsUU5YLFVOS05PV04iIHZlcnNpb249IjMuNS42IiB3cz0iV0lOMzIsTU9USUYsR1RLLENBUkJPTixQSE9UT04sQ09DT0EsVU5LTk9XTiIvPgotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9wbHVnaW5zL1BkZV9jb3JlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvcGx1Z2lucy9QZGVfY29yZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMDcyMTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9wbHVnaW5zL1BkZV9jb3JlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvcGx1Z2lucy9oZWxwLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvcGx1Z2lucy9oZWxwLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU4NGY2Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvaGVscC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvanVuaXRfMy43LmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvcGx1Z2lucy9qdW5pdF8zLjcuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzU4N2IyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvcGx1Z2lucy9qdW5pdF8zLjcuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YwNWQ4Mi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cGx1Z2luIG5hbWU9IkpVbml0IFRlc3QgRnJhbWV3b3JrIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMSIgdmVyc2lvbj0iMy41LjYiIHZlbmRvci1uYW1lPSJqdW5pdC5vcmciPg0KLSAgPHJ1bnRpbWU+DQotICAgIDxsaWJyYXJ5IG5hbWU9Imp1bml0LmphciI+DQotICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+DQotICAgIDwvbGlicmFyeT4NCi0gIDwvcnVudGltZT4NCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRkNjA5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJmMTQ4NS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTMiIGltYWdlPSJmZWF0dXJlMS5naWYiIGxhYmVsPSJUaGlyZCBGZWF0dXJlIiBwcm92aWRlci1uYW1lPSJTbWFydCBDb21wYW55IiB2ZXJzaW9uPSIxLjAuMCIgPgotICA8ZGVzY3JpcHRpb24+RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotICA8Y29weXJpZ2h0PmNvcHlyaWdodDwvY29weXJpZ2h0PgotICA8bGljZW5zZT5saWNlbnNlPC9saWNlbnNlPgotICA8dXJsPgotICAgIDx1cGRhdGUgbGFiZWw9IlVSTCB0byB1cGRhdGUgdGhlIGZlYXR1cmUiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wYXRoL2ZlYXR1cmUxLyIvPgotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAxIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMiIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+Ci0gIDwvdXJsPgotICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjE1MDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMSIgaW5zdGFsbC1zaXplPSIxMDAwIiBmcmFnbWVudD0iZmFsc2UiIG5sPSJlbixmciIgb3M9IldJTjMyLExJTlVYLEhQVVgsTUFDT1NYLEFJWCxTT0xBUklTLFFOWCxVTktOT1dOIiB2ZXJzaW9uPSIxLjEuMSIgd3M9IldJTjMyLE1PVElGLEdUSyxDQVJCT04sUEhPVE9OLENPQ09BLFVOS05PV04iLz4KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL2ZlYXR1cmVzL2hlbHBGZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL2ZlYXR1cmVzL2hlbHBGZWF0dXJlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVlOGU4Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9mZWF0dXJlcy9oZWxwRmVhdHVyZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuZmVhdHVyZV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuZmVhdHVyZV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMjNjYWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9pbmZvL2ltZy90b3BfdGl0bHNtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkxN2JiNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9pbmZvL2ltZy90b3BfdGl0bHNtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL2luZm8vaW1nL3dlbF9tbC5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9pbmZvL2ltZy93ZWxfbWwuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWUzM2RmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL2luZm8vaW1nL3dlbF9tbC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9pbmZvL3NpdGVJbmZvLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9pbmZvL3NpdGVJbmZvLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNjVhYTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvaW5mby9zaXRlSW5mby5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPC9oZWFkPg0KLSAgPGJvZHk+DQotPGltZyBzcmM9ImltZy90b3BfdGl0bHNtLmdpZiIgYWx0PSIiIHdpZHRoPSI0NjAiIGhlaWdodD0iNTAiPg0KLTxicj4NCi08YnI+DQotICAgICBJdCBzdGFydGVkIHdpdGggU21hbGx0YWxrPGJyPg0KLSAgICBPVEkgaGFzIGJlZW4gYnVpbGRpbmcgdG9vbHMgZm9yIHBsYXRmb3JtLWluZGVwZW5kZW50IE9PIGRldmVsb3BtZW50IHNpbmNlDQotICAxOTg4LiBPdXIgRU5WWSZyZWc7IHRlY2hub2xvZ3kgZmlyc3QgYnJvdWdodCBjb2xsYWJvcmF0aXZlIHNvZnR3YXJlIGRldmVsb3BtZW50LA0KLSAgdmVyc2lvbiBtYW5hZ2VtZW50IGFuZCBzaGFyZWQgcmVwb3NpdG9yaWVzIHRvIFNtYWxsdGFsay4gSUJNIGlzIG9uZSBvZg0KLW1hbnkgICBjb21wYW5pZXMgdG8gbGljZW5zZSBFTlZZLCB3aGljaCBjb250aW51ZXMgdG8gYmUgdGhlIGZvdW5kYXRpb24gb2YNCi1WaXN1YWxBZ2UmcmVnOyAgIFNtYWxsdGFsay48YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotICAgICAgTmV4dCBjYW1lIEphdmEmIzg0ODI7PGJyPg0KLSAgICBCZWNhdXNlIG9mIG91ciBleHBlcnRpc2UgaW4gT08gdGVjaG5vbG9neSwgSUJNIHR1cm5lZCB0byBPVEkgZm9yIGEgbmV4dC1nZW5lcmF0aW9uDQotICBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBmb3IgSmF2YS4gVGhlIHJlc3VsdCBpcyBWaXN1YWxBZ2UgZm9yIEphdmEsIHdoaWNoDQotICBjb250aW51ZXMgdG8gd2luIGF3YXJkcyBmb3IgaXRzIGlubm92YXRpdmUgSURFIGFuZCB0ZWFtIHN1cHBvcnQuIEluZm9Xb3JsZA0KLSAgaGFzIGNob3NlbiBWaXN1YWxBZ2UgZm9yIEphdmEgYXMgZGV2ZWxvcG1lbnQgdG9vbCBvZiB0aGUgeWVhciAtIHllYXIgYWZ0ZXINCi0gIHllYXIgYWZ0ZXIgeWVhciE8YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotICAgICAgVGhlbiBwZXJ2YXNpdmUgY29tcHV0aW5nPGJyPg0KLSAgICBPVEkgY29udGludWVzIGl0cyBkZXZlbG9wbWVudCBvZiBJQk0ncyBWaXN1YWxBZ2UgTWljcm8gRWRpdGlvbiwgYSBzdGF0ZS1vZi10aGUtYXJ0DQotICBwbGF0Zm9ybSBmb3IgY29sbGFib3JhdGl2ZSBkZXZlbG9wbWVudCBvZiBlbWJlZGRlZCBhcHBsaWNhdGlvbnMgYW5kIHN5c3RlbXMNCi0gIHRoYXQgYXJlIHZlcnkgbGVhbi4gQXMgdGhlIHN0ZWFkeSBzdHJlYW0gb2YgcHJlc3MgcmVsZWFzZXMgYXR0ZXN0cywgVmlzdWFsQWdlDQotICBNaWNybyBFZGl0aW9uIGlzIGFscmVhZHkgbGljZW5zZWQgdG8gdGhlIGxlYWRpbmcgbWljcm9jaGlwIG1hbnVmYWN0dXJlcnMsDQotICBtaWNyb2tlcm5lbCBkZXZlbG9wZXJzLCBhbmQgcHJvZHVjZXJzIG9mIGhhbmRoZWxkIGFuZCBjb25zdW1lciBkZXZpY2VzLjxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBOb3cgaXQncyBFY2xpcHNlPGJyPg0KLSAgICBPVEkgaGFzIGJ1aWx0IHRoZSBuZXh0IGdlbmVyYXRpb24gSUJNIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50IHRvb2xzIHBsYXRmb3JtLg0KLSAgRWNsaXBzZSBpcyBhIGtpbmQgb2YgdW5pdmVyc2FsIHRvb2wgcGxhdGZvcm0gLSBhbiBvcGVuIGV4dGVuc2libGUgSURFIGZvcg0KLSAgYW55dGhpbmcgYW5kIG5vdGhpbmcgaW4gcGFydGljdWxhci4gVGhlIHJlYWwgdmFsdWUgY29tZXMgZnJvbSB0b29sIHBsdWctaW5zDQotICB0aGF0ICJ0ZWFjaCIgRWNsaXBzZSBob3cgdG8gd29yayB3aXRoIHRoaW5ncyAtIGphdmEgZmlsZXMsIHdlYiBjb250ZW50LA0KLWdyYXBoaWNzLCAgdmlkZW8gLSBhbG1vc3QgYW55dGhpbmcgeW91IGNhbiBpbWFnaW5lLiBFY2xpcHNlIGFsbG93cyB5b3UgdG8NCi1pbmRlcGVuZGVudGx5ICBkZXZlbG9wIHRvb2xzIHRoYXQgaW50ZWdyYXRlIHdpdGggb3RoZXIgcGVvcGxlJ3MgdG9vbHMgc28NCi1zZWFtbGVzc2x5IHlvdSB3b24ndCBrbm93IHdoZXJlIG9uZSB0b29sIGVuZHMgYW5kIGFub3RoZXIgc3RhcnRzLiBUaGUgSUJNDQotc3VwcG9ydGVkIHZlcnNpb24gb2YgdGhpcyB0ZWNobm9sb2d5LCBXZWJTcGhlcmUgU3R1ZGlvIFdvcmtiZW5jaCwgd2lsbCBiZQ0KLXRoZSBjb3JlIG9mIHRoZSBuZXh0ICBnZW5lcmF0aW9uIG9mIElCTSBhbmQgSUJNIEJ1c2luZXNzIFBhcnRuZXIgZS1idXNpbmVzcw0KLXRvb2xzIG9wdGltaXplZCBmb3IgIHRoZSBXZWJTcGhlcmUgc29mdHdhcmUgcGxhdGZvcm0uPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIFNvIHdoYXQncyBuZXh0Pzxicj4NCi0gICAgT1RJIGNvbnRpbnVlcyB0byBkZWxpdmVyIG9iamVjdC1vcmllbnRlZCB0ZWNobm9sb2d5IHRoYXQgc2NhbGVzIGFjcm9zcw0KLSBwbGF0Zm9ybXMsICBhY3Jvc3MgdGVhbXMgYW5kIGFjcm9zcyBwcm9qZWN0IHNpemUuIEZyb20gYSBtYWluZnJhbWUgdG8gYQ0KLXdhdGNoICAtIHdlJ3JlICBjbG9zaW5nIGluIG9uIHRoYXQgdmlzaW9uLjxicj4NCi08YnI+DQotPGltZyBzcmM9ImltZy93ZWxfbWwuanBnIiB3aWR0aD0iNDYwIiBoZWlnaHQ9IjQ2MCIgYWx0PSIiPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9QZGVfY29yZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9wbHVnaW5zL1BkZV9jb3JlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwNzIxNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9wbHVnaW5zL1BkZV9jb3JlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3BsdWdpbnMvaGVscC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9wbHVnaW5zL2hlbHAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTg0ZjY2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3BsdWdpbnMvaGVscC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9wbHVnaW5zL2p1bml0XzMuNy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9wbHVnaW5zL2p1bml0XzMuNy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NTg3YjIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9qdW5pdF8zLjcuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjA1ZDgyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cGx1Z2luIG5hbWU9IkpVbml0IFRlc3QgRnJhbWV3b3JrIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMSIgdmVyc2lvbj0iMy41LjYiIHZlbmRvci1uYW1lPSJqdW5pdC5vcmciPg0KLSAgPHJ1bnRpbWU+DQotICAgIDxsaWJyYXJ5IG5hbWU9Imp1bml0LmphciI+DQotICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+DQotICAgIDwvbGlicmFyeT4NCi0gIDwvcnVudGltZT4NCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNGQ2MDkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYyMTFhOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHNpdGUgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSI+DQotPGRlc2NyaXB0aW9uIHVybD0iaW5mby9zaXRlSW5mby5odG1sIi8+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2hlbHBGZWF0dXJlLmphciIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUucGFja2FnZWQiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9VTUwiLz4NCi0gIDwvZmVhdHVyZT4NCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5wYWNrYWdlZCI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL0oyRUUiLz4NCi0gIDwvZmVhdHVyZT4NCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZTMvIiBvcz0iTElOVVgiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZSIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuZWNsaXBzZS5oZWxwXzEuMC4wLmphciIgdXJsPSJwbHVnaW5zL2hlbHAuamFyIi8+DQotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLnBkZS5jb3JlXzEuMC4wLmphciIgdXJsPSJwbHVnaW5zL1BkZV9jb3JlLmphciIvPg0KLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuanVuaXRfMy41LjAuamFyIiB1cmw9InBsdWdpbnMvanVuaXRfMy43LmphciIvPg0KLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS5qYXIiIHVybD0icGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMSIvPiAgDQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJJQk0gV1NBRCBUb29scyIgbmFtZT0iZWNsaXBzZSIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSjJFRSB0b29scyIgbmFtZT0iZWNsaXBzZS9KMkVFIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJFSkIgVG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRS9FSkIiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IlVNTCB0b29scyIgbmFtZT0iZWNsaXBzZS9VTUwiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9Ik1lc3NhZ2luZyBUb29scyIgbmFtZT0iQjJCIi8+ICANCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRlRQTGlrZVNpdGUvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GVFBMaWtlU2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE2MmUyZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GVFBMaWtlU2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS5mdHAiPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZSIvPg0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUxL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMS9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM5OGY0Mi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUxL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTMiIGltYWdlPSJmZWF0dXJlMS5naWYiIGxhYmVsPSJUaGlyZCBGZWF0dXJlIiBwcm92aWRlci1uYW1lPSJTbWFydCBDb21wYW55IiB2ZXJzaW9uPSIxLjAuMCI+DQotICA8ZGVzY3JpcHRpb24+RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPg0KLSAgPGNvcHlyaWdodD5jb3B5cmlnaHQ8L2NvcHlyaWdodD4NCi0gIDxsaWNlbnNlPmxpY2Vuc2U8L2xpY2Vuc2U+DQotICA8dXJsPg0KLSAgICA8dXBkYXRlIGxhYmVsPSJVUkwgdG8gdXBkYXRlIHRoZSBmZWF0dXJlIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGF0aC9mZWF0dXJlMS8iLz4NCi0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDEiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPg0KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMiIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+DQotICA8L3VybD4NCi0gIDxwbHVnaW4gZG93bmxvYWQtc2l6ZT0iMTUwMCIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xIiBpbnN0YWxsLXNpemU9IjEwMDAiIGZyYWdtZW50PSJmYWxzZSIgb3M9IldJTjMyLExJTlVYIiB2ZXJzaW9uPSIxLjEuMSIgd3M9IldJTjMyLE1PVElGLEdUSyIvPg0KLTwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUxL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg2ZDExOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUxL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxzaXRlIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlMyIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUuZmVhdHVyZTEiLz4NCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMi9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTIvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZXMyLmphcmZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MGFiNGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMi9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTIvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUyL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjVmZTBlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTIvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHNpdGUgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSI+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmVzMi5qYXJmaWxlIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5wYWNrYWdlZCIvPg0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUzL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmVzMi5qYXJmaWxlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMy9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwYWI0Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUzL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmVzMi5qYXJmaWxlCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMy9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTMvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZjM3MmQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMy9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4NCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZXMyLmphcmZpbGUiIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnVua25vd250eXBlLmphciIvPg0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvZmVhdHVyZXMgc3BhY2UvaGVscEZlYXR1cmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2ZlYXR1cmVzIHNwYWNlL2hlbHBGZWF0dXJlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZhZmVmNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvZmVhdHVyZXMgc3BhY2UvaGVscEZlYXR1cmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2ZlYXR1cmVzIHNwYWNlL3NwYWNlIGZlYXR1cmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2ZlYXR1cmVzIHNwYWNlL3NwYWNlIGZlYXR1cmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmMxYTZlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9mZWF0dXJlcyBzcGFjZS9zcGFjZSBmZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9pbmZvL2ltZy90b3BfdGl0bHNtLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9pbmZvL2ltZy90b3BfdGl0bHNtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkxN2JiNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvaW5mby9pbWcvd2VsX21sLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9pbmZvL2ltZy93ZWxfbWwuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWUzM2RmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9pbmZvL2ltZy93ZWxfbWwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2luZm8vc2l0ZUluZm8uaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9pbmZvL3NpdGVJbmZvLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNjVhYTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2luZm8vc2l0ZUluZm8uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTwvaGVhZD4NCi0gIDxib2R5Pg0KLTxpbWcgc3JjPSJpbWcvdG9wX3RpdGxzbS5naWYiIGFsdD0iIiB3aWR0aD0iNDYwIiBoZWlnaHQ9IjUwIj4NCi08YnI+DQotPGJyPg0KLSAgICAgSXQgc3RhcnRlZCB3aXRoIFNtYWxsdGFsazxicj4NCi0gICAgT1RJIGhhcyBiZWVuIGJ1aWxkaW5nIHRvb2xzIGZvciBwbGF0Zm9ybS1pbmRlcGVuZGVudCBPTyBkZXZlbG9wbWVudCBzaW5jZQ0KLSAgMTk4OC4gT3VyIEVOVlkmcmVnOyB0ZWNobm9sb2d5IGZpcnN0IGJyb3VnaHQgY29sbGFib3JhdGl2ZSBzb2Z0d2FyZSBkZXZlbG9wbWVudCwNCi0gIHZlcnNpb24gbWFuYWdlbWVudCBhbmQgc2hhcmVkIHJlcG9zaXRvcmllcyB0byBTbWFsbHRhbGsuIElCTSBpcyBvbmUgb2YNCi1tYW55ICAgY29tcGFuaWVzIHRvIGxpY2Vuc2UgRU5WWSwgd2hpY2ggY29udGludWVzIHRvIGJlIHRoZSBmb3VuZGF0aW9uIG9mDQotVmlzdWFsQWdlJnJlZzsgICBTbWFsbHRhbGsuPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIE5leHQgY2FtZSBKYXZhJiM4NDgyOzxicj4NCi0gICAgQmVjYXVzZSBvZiBvdXIgZXhwZXJ0aXNlIGluIE9PIHRlY2hub2xvZ3ksIElCTSB0dXJuZWQgdG8gT1RJIGZvciBhIG5leHQtZ2VuZXJhdGlvbg0KLSAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgZm9yIEphdmEuIFRoZSByZXN1bHQgaXMgVmlzdWFsQWdlIGZvciBKYXZhLCB3aGljaA0KLSAgY29udGludWVzIHRvIHdpbiBhd2FyZHMgZm9yIGl0cyBpbm5vdmF0aXZlIElERSBhbmQgdGVhbSBzdXBwb3J0LiBJbmZvV29ybGQNCi0gIGhhcyBjaG9zZW4gVmlzdWFsQWdlIGZvciBKYXZhIGFzIGRldmVsb3BtZW50IHRvb2wgb2YgdGhlIHllYXIgLSB5ZWFyIGFmdGVyDQotICB5ZWFyIGFmdGVyIHllYXIhPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIFRoZW4gcGVydmFzaXZlIGNvbXB1dGluZzxicj4NCi0gICAgT1RJIGNvbnRpbnVlcyBpdHMgZGV2ZWxvcG1lbnQgb2YgSUJNJ3MgVmlzdWFsQWdlIE1pY3JvIEVkaXRpb24sIGEgc3RhdGUtb2YtdGhlLWFydA0KLSAgcGxhdGZvcm0gZm9yIGNvbGxhYm9yYXRpdmUgZGV2ZWxvcG1lbnQgb2YgZW1iZWRkZWQgYXBwbGljYXRpb25zIGFuZCBzeXN0ZW1zDQotICB0aGF0IGFyZSB2ZXJ5IGxlYW4uIEFzIHRoZSBzdGVhZHkgc3RyZWFtIG9mIHByZXNzIHJlbGVhc2VzIGF0dGVzdHMsIFZpc3VhbEFnZQ0KLSAgTWljcm8gRWRpdGlvbiBpcyBhbHJlYWR5IGxpY2Vuc2VkIHRvIHRoZSBsZWFkaW5nIG1pY3JvY2hpcCBtYW51ZmFjdHVyZXJzLA0KLSAgbWljcm9rZXJuZWwgZGV2ZWxvcGVycywgYW5kIHByb2R1Y2VycyBvZiBoYW5kaGVsZCBhbmQgY29uc3VtZXIgZGV2aWNlcy48YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotICAgICAgTm93IGl0J3MgRWNsaXBzZTxicj4NCi0gICAgT1RJIGhhcyBidWlsdCB0aGUgbmV4dCBnZW5lcmF0aW9uIElCTSBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCB0b29scyBwbGF0Zm9ybS4NCi0gIEVjbGlwc2UgaXMgYSBraW5kIG9mIHVuaXZlcnNhbCB0b29sIHBsYXRmb3JtIC0gYW4gb3BlbiBleHRlbnNpYmxlIElERSBmb3INCi0gIGFueXRoaW5nIGFuZCBub3RoaW5nIGluIHBhcnRpY3VsYXIuIFRoZSByZWFsIHZhbHVlIGNvbWVzIGZyb20gdG9vbCBwbHVnLWlucw0KLSAgdGhhdCAidGVhY2giIEVjbGlwc2UgaG93IHRvIHdvcmsgd2l0aCB0aGluZ3MgLSBqYXZhIGZpbGVzLCB3ZWIgY29udGVudCwNCi1ncmFwaGljcywgIHZpZGVvIC0gYWxtb3N0IGFueXRoaW5nIHlvdSBjYW4gaW1hZ2luZS4gRWNsaXBzZSBhbGxvd3MgeW91IHRvDQotaW5kZXBlbmRlbnRseSAgZGV2ZWxvcCB0b29scyB0aGF0IGludGVncmF0ZSB3aXRoIG90aGVyIHBlb3BsZSdzIHRvb2xzIHNvDQotc2VhbWxlc3NseSB5b3Ugd29uJ3Qga25vdyB3aGVyZSBvbmUgdG9vbCBlbmRzIGFuZCBhbm90aGVyIHN0YXJ0cy4gVGhlIElCTQ0KLXN1cHBvcnRlZCB2ZXJzaW9uIG9mIHRoaXMgdGVjaG5vbG9neSwgV2ViU3BoZXJlIFN0dWRpbyBXb3JrYmVuY2gsIHdpbGwgYmUNCi10aGUgY29yZSBvZiB0aGUgbmV4dCAgZ2VuZXJhdGlvbiBvZiBJQk0gYW5kIElCTSBCdXNpbmVzcyBQYXJ0bmVyIGUtYnVzaW5lc3MNCi10b29scyBvcHRpbWl6ZWQgZm9yICB0aGUgV2ViU3BoZXJlIHNvZnR3YXJlIHBsYXRmb3JtLjxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBTbyB3aGF0J3MgbmV4dD88YnI+DQotICAgIE9USSBjb250aW51ZXMgdG8gZGVsaXZlciBvYmplY3Qtb3JpZW50ZWQgdGVjaG5vbG9neSB0aGF0IHNjYWxlcyBhY3Jvc3MNCi0gcGxhdGZvcm1zLCAgYWNyb3NzIHRlYW1zIGFuZCBhY3Jvc3MgcHJvamVjdCBzaXplLiBGcm9tIGEgbWFpbmZyYW1lIHRvIGENCi13YXRjaCAgLSB3ZSdyZSAgY2xvc2luZyBpbiBvbiB0aGF0IHZpc2lvbi48YnI+DQotPGJyPg0KLTxpbWcgc3JjPSJpbWcvd2VsX21sLmpwZyIgd2lkdGg9IjQ2MCIgaGVpZ2h0PSI0NjAiIGFsdD0iIj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9pbnN0YWxsL2ZlYXR1cmVzIHNwYWNlL2ZlYXR1cmUzL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2luc3RhbGwvZmVhdHVyZXMgc3BhY2UvZmVhdHVyZTMvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYjg5ZmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2luc3RhbGwvZmVhdHVyZXMgc3BhY2UvZmVhdHVyZTMvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUzIiBpbWFnZT0iZmVhdHVyZTEuZ2lmIiBsYWJlbD0iVGhpcmQgRmVhdHVyZSIgcHJvdmlkZXItbmFtZT0iU21hcnQgQ29tcGFueSIgdmVyc2lvbj0iMS4wLjAiID4KLSAgPGRlc2NyaXB0aW9uPkRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KLSAgPGNvcHlyaWdodD5jb3B5cmlnaHQ8L2NvcHlyaWdodD4KLSAgPGxpY2Vuc2U+bGljZW5zZTwvbGljZW5zZT4KLSAgPHVybD4KLSAgICA8dXBkYXRlIGxhYmVsPSJVUkwgdG8gdXBkYXRlIHRoZSBmZWF0dXJlIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGF0aC9mZWF0dXJlMS8iLz4KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+Ci0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDIiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPgotICA8L3VybD4KLSAgPHBsdWdpbiBkb3dubG9hZC1zaXplPSIxNTAwIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjEiIGluc3RhbGwtc2l6ZT0iMTAwMCIgZnJhZ21lbnQ9ImZhbHNlIiBubD0iZW4sZnIiIG9zPSJXSU4zMixMSU5VWCxIUFVYLE1BQ09TWCIgdmVyc2lvbj0iMS4xLjEiIHdzPSJXSU4zMixNT1RJRixHVEssQ0FSQk9OLENPQ09BIi8+Ci08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9QZGVfY29yZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9QZGVfY29yZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMDcyMTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvUGRlX2NvcmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvaGVscC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9oZWxwLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU4NGY2Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9oZWxwLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL2p1bml0XzMuNy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9qdW5pdF8zLjcuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzU4N2IyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL2p1bml0XzMuNy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2Uvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAxODQ2Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHBsdWdpbiBuYW1lPSJKVW5pdCBUZXN0IEZyYW1ld29yayIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjEiIHZlcnNpb249IjMuNS42IiB2ZW5kb3ItbmFtZT0ianVuaXQub3JnIj4KLSAgPHJ1bnRpbWU+Ci0gICAgPGxpYnJhcnkgbmFtZT0ianVuaXQuamFyIj4KLSAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgIDwvbGlicmFyeT4KLSAgPC9ydW50aW1lPgotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2Uvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNGQ2MDkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2Uvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ5MjhmYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2Uvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxzaXRlIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiPg0KLTxkZXNjcmlwdGlvbiB1cmw9ImluZm8vc2l0ZUluZm8uaHRtbCIvPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcyBzcGFjZS9oZWxwRmVhdHVyZS5qYXIiIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnBhY2thZ2VkIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvVU1MIi8+DQotICA8L2ZlYXR1cmU+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzIHNwYWNlL3NwYWNlIGZlYXR1cmUuamFyIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5wYWNrYWdlZCI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL0oyRUUiLz4NCi0gIDwvZmVhdHVyZT4NCi0gIDxmZWF0dXJlIHVybD0iaW5zdGFsbC9mZWF0dXJlcyBzcGFjZS9mZWF0dXJlMy8iPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZSIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuZWNsaXBzZS5oZWxwXzEuMC4wLmphciIgdXJsPSJwbHVnaW5zIHNwYWNlL2hlbHAuamFyIi8+DQotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLnBkZS5jb3JlXzEuMC4wLmphciIgdXJsPSJwbHVnaW5zIHNwYWNlL1BkZV9jb3JlLmphciIvPg0KLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuanVuaXRfMy41LjAuamFyIiB1cmw9InBsdWdpbnMgc3BhY2UvanVuaXRfMy43LmphciIvPg0KLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS5qYXIiIHVybD0icGx1Z2lucyBzcGFjZS9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMSIvPiAgDQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJJQk0gV1NBRCBUb29scyIgbmFtZT0iZWNsaXBzZSIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSjJFRSB0b29scyIgbmFtZT0iZWNsaXBzZS9KMkVFIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJFSkIgVG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRS9FSkIiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IlVNTCB0b29scyIgbmFtZT0iZWNsaXBzZS9VTUwiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9Ik1lc3NhZ2luZyBUb29scyIgbmFtZT0iQjJCIi8+ICANCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVR5cGVFeGFtcGxlcy9zaXRlMS9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVUeXBlRXhhbXBsZXMvc2l0ZTEvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZXMyLmphcmZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MGFiNGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVR5cGVFeGFtcGxlcy9zaXRlMS9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVUeXBlRXhhbXBsZXMvc2l0ZTEvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVHlwZUV4YW1wbGVzL3NpdGUxL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjcxNjVhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVUeXBlRXhhbXBsZXMvc2l0ZTEvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHNpdGUgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuaHR0cCI+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmVzMi5qYXJmaWxlIi8+DQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL2ZlYXR1cmVzL2hlbHBGZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL2ZlYXR1cmVzL2hlbHBGZWF0dXJlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgwOTcxMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2FydGlmYWN0cy9mZWF0dXJlcy9oZWxwRmVhdHVyZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2FydGlmYWN0cy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuZmVhdHVyZV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2FydGlmYWN0cy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuZmVhdHVyZV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OTJjMWQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvcGx1Z2lucy9QZGVfY29yZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2FydGlmYWN0cy9wbHVnaW5zL1BkZV9jb3JlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwNzIxNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2FydGlmYWN0cy9wbHVnaW5zL1BkZV9jb3JlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL3BsdWdpbnMvaGVscC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2FydGlmYWN0cy9wbHVnaW5zL2hlbHAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTg0ZjY2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL3BsdWdpbnMvaGVscC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2FydGlmYWN0cy9wbHVnaW5zL2p1bml0XzMuNy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2FydGlmYWN0cy9wbHVnaW5zL2p1bml0XzMuNy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NTg3YjIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvcGx1Z2lucy9qdW5pdF8zLjcuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9pbmZvL2ltZy90b3BfdGl0bHNtLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MTdiYjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9pbmZvL2ltZy90b3BfdGl0bHNtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvaW5mby9pbWcvd2VsX21sLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvaW5mby9pbWcvd2VsX21sLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFlMzNkZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2luZm8vaW1nL3dlbF9tbC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2luZm8vc2l0ZUluZm8uaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvaW5mby9zaXRlSW5mby5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDY1YWEzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvaW5mby9zaXRlSW5mby5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPC9oZWFkPg0KLSAgPGJvZHk+DQotPGltZyBzcmM9ImltZy90b3BfdGl0bHNtLmdpZiIgYWx0PSIiIHdpZHRoPSI0NjAiIGhlaWdodD0iNTAiPg0KLTxicj4NCi08YnI+DQotICAgICBJdCBzdGFydGVkIHdpdGggU21hbGx0YWxrPGJyPg0KLSAgICBPVEkgaGFzIGJlZW4gYnVpbGRpbmcgdG9vbHMgZm9yIHBsYXRmb3JtLWluZGVwZW5kZW50IE9PIGRldmVsb3BtZW50IHNpbmNlDQotICAxOTg4LiBPdXIgRU5WWSZyZWc7IHRlY2hub2xvZ3kgZmlyc3QgYnJvdWdodCBjb2xsYWJvcmF0aXZlIHNvZnR3YXJlIGRldmVsb3BtZW50LA0KLSAgdmVyc2lvbiBtYW5hZ2VtZW50IGFuZCBzaGFyZWQgcmVwb3NpdG9yaWVzIHRvIFNtYWxsdGFsay4gSUJNIGlzIG9uZSBvZg0KLW1hbnkgICBjb21wYW5pZXMgdG8gbGljZW5zZSBFTlZZLCB3aGljaCBjb250aW51ZXMgdG8gYmUgdGhlIGZvdW5kYXRpb24gb2YNCi1WaXN1YWxBZ2UmcmVnOyAgIFNtYWxsdGFsay48YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotICAgICAgTmV4dCBjYW1lIEphdmEmIzg0ODI7PGJyPg0KLSAgICBCZWNhdXNlIG9mIG91ciBleHBlcnRpc2UgaW4gT08gdGVjaG5vbG9neSwgSUJNIHR1cm5lZCB0byBPVEkgZm9yIGEgbmV4dC1nZW5lcmF0aW9uDQotICBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBmb3IgSmF2YS4gVGhlIHJlc3VsdCBpcyBWaXN1YWxBZ2UgZm9yIEphdmEsIHdoaWNoDQotICBjb250aW51ZXMgdG8gd2luIGF3YXJkcyBmb3IgaXRzIGlubm92YXRpdmUgSURFIGFuZCB0ZWFtIHN1cHBvcnQuIEluZm9Xb3JsZA0KLSAgaGFzIGNob3NlbiBWaXN1YWxBZ2UgZm9yIEphdmEgYXMgZGV2ZWxvcG1lbnQgdG9vbCBvZiB0aGUgeWVhciAtIHllYXIgYWZ0ZXINCi0gIHllYXIgYWZ0ZXIgeWVhciE8YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotICAgICAgVGhlbiBwZXJ2YXNpdmUgY29tcHV0aW5nPGJyPg0KLSAgICBPVEkgY29udGludWVzIGl0cyBkZXZlbG9wbWVudCBvZiBJQk0ncyBWaXN1YWxBZ2UgTWljcm8gRWRpdGlvbiwgYSBzdGF0ZS1vZi10aGUtYXJ0DQotICBwbGF0Zm9ybSBmb3IgY29sbGFib3JhdGl2ZSBkZXZlbG9wbWVudCBvZiBlbWJlZGRlZCBhcHBsaWNhdGlvbnMgYW5kIHN5c3RlbXMNCi0gIHRoYXQgYXJlIHZlcnkgbGVhbi4gQXMgdGhlIHN0ZWFkeSBzdHJlYW0gb2YgcHJlc3MgcmVsZWFzZXMgYXR0ZXN0cywgVmlzdWFsQWdlDQotICBNaWNybyBFZGl0aW9uIGlzIGFscmVhZHkgbGljZW5zZWQgdG8gdGhlIGxlYWRpbmcgbWljcm9jaGlwIG1hbnVmYWN0dXJlcnMsDQotICBtaWNyb2tlcm5lbCBkZXZlbG9wZXJzLCBhbmQgcHJvZHVjZXJzIG9mIGhhbmRoZWxkIGFuZCBjb25zdW1lciBkZXZpY2VzLjxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBOb3cgaXQncyBFY2xpcHNlPGJyPg0KLSAgICBPVEkgaGFzIGJ1aWx0IHRoZSBuZXh0IGdlbmVyYXRpb24gSUJNIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50IHRvb2xzIHBsYXRmb3JtLg0KLSAgRWNsaXBzZSBpcyBhIGtpbmQgb2YgdW5pdmVyc2FsIHRvb2wgcGxhdGZvcm0gLSBhbiBvcGVuIGV4dGVuc2libGUgSURFIGZvcg0KLSAgYW55dGhpbmcgYW5kIG5vdGhpbmcgaW4gcGFydGljdWxhci4gVGhlIHJlYWwgdmFsdWUgY29tZXMgZnJvbSB0b29sIHBsdWctaW5zDQotICB0aGF0ICJ0ZWFjaCIgRWNsaXBzZSBob3cgdG8gd29yayB3aXRoIHRoaW5ncyAtIGphdmEgZmlsZXMsIHdlYiBjb250ZW50LA0KLWdyYXBoaWNzLCAgdmlkZW8gLSBhbG1vc3QgYW55dGhpbmcgeW91IGNhbiBpbWFnaW5lLiBFY2xpcHNlIGFsbG93cyB5b3UgdG8NCi1pbmRlcGVuZGVudGx5ICBkZXZlbG9wIHRvb2xzIHRoYXQgaW50ZWdyYXRlIHdpdGggb3RoZXIgcGVvcGxlJ3MgdG9vbHMgc28NCi1zZWFtbGVzc2x5IHlvdSB3b24ndCBrbm93IHdoZXJlIG9uZSB0b29sIGVuZHMgYW5kIGFub3RoZXIgc3RhcnRzLiBUaGUgSUJNDQotc3VwcG9ydGVkIHZlcnNpb24gb2YgdGhpcyB0ZWNobm9sb2d5LCBXZWJTcGhlcmUgU3R1ZGlvIFdvcmtiZW5jaCwgd2lsbCBiZQ0KLXRoZSBjb3JlIG9mIHRoZSBuZXh0ICBnZW5lcmF0aW9uIG9mIElCTSBhbmQgSUJNIEJ1c2luZXNzIFBhcnRuZXIgZS1idXNpbmVzcw0KLXRvb2xzIG9wdGltaXplZCBmb3IgIHRoZSBXZWJTcGhlcmUgc29mdHdhcmUgcGxhdGZvcm0uPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIFNvIHdoYXQncyBuZXh0Pzxicj4NCi0gICAgT1RJIGNvbnRpbnVlcyB0byBkZWxpdmVyIG9iamVjdC1vcmllbnRlZCB0ZWNobm9sb2d5IHRoYXQgc2NhbGVzIGFjcm9zcw0KLSBwbGF0Zm9ybXMsICBhY3Jvc3MgdGVhbXMgYW5kIGFjcm9zcyBwcm9qZWN0IHNpemUuIEZyb20gYSBtYWluZnJhbWUgdG8gYQ0KLXdhdGNoICAtIHdlJ3JlICBjbG9zaW5nIGluIG9uIHRoYXQgdmlzaW9uLjxicj4NCi08YnI+DQotPGltZyBzcmM9ImltZy93ZWxfbWwuanBnIiB3aWR0aD0iNDYwIiBoZWlnaHQ9IjQ2MCIgYWx0PSIiPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZWE2ODQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZSB1cmwgPSAiYXJ0aWZhY3RzLyI+Ci08ZGVzY3JpcHRpb24gdXJsPSJpbmZvL3NpdGVJbmZvLmh0bWwiLz4KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9oZWxwRmVhdHVyZS5qYXIiIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnBhY2thZ2VkIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9VTUwiLz4KLSAgPC9mZWF0dXJlPgotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5mZWF0dXJlXzEuMC4wLmphciIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUucGFja2FnZWQiPgotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL0oyRUUiLz4KLSAgPC9mZWF0dXJlPgotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLmhlbHBfMS4wLjAuamFyIiB1cmw9InBsdWdpbnMvaGVscC5qYXIiLz4KLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZV8xLjAuMC5qYXIiIHVybD0icGx1Z2lucy9QZGVfY29yZS5qYXIiLz4KLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuanVuaXRfMy41LjAuamFyIiB1cmw9InBsdWdpbnMvanVuaXRfMy43LmphciIvPgotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJJQk0gV1NBRCBUb29scyIgbmFtZT0iZWNsaXBzZSIvPgotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJKMkVFIHRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUiLz4KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRUpCIFRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUvRUpCIi8+Ci0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IlVNTCB0b29scyIgbmFtZT0iZWNsaXBzZS9VTUwiLz4KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iTWVzc2FnaW5nIFRvb2xzIiBuYW1lPSJCMkIiLz4gIAotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUxL2ZpbGUxLnppcCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUxL2ZpbGUxLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE3MGI3ZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMS9maWxlMS56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMS9pbnN0YWxsL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTEvaW5zdGFsbC9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0NTRlYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMS9pbnN0YWxsL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMyIgaW1hZ2U9ImZlYXR1cmUxLmdpZiIgbGFiZWw9IlRoaXJkIEZlYXR1cmUiIHByb3ZpZGVyLW5hbWU9IlNtYXJ0IENvbXBhbnkiIHZlcnNpb249IjEuMC4wIj4NCi0JPGluc3RhbGwtaGFuZGxlciBoYW5kbGVyPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5EZWZhdWx0SW5zdGFsbEhhbmRsZXIiLz4NCi0gIAk8ZGF0YSBkb3dubG9hZC1zaXplPSIxNTAwIiBpZD0iZmlsZS56aXAiIGluc3RhbGwtc2l6ZT0iMTAwMCIvPg0KLTwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMS9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUxL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDFmMjFkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUxL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxzaXRlIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiPg0KLTxkZXNjcmlwdGlvbiB1cmw9ImluZm8vc2l0ZUluZm8uaHRtbCIvPg0KLSAgPGZlYXR1cmUgdXJsPSJpbnN0YWxsL2ZlYXR1cmVzL2ZlYXR1cmUzIj4NCi0gIDwvZmVhdHVyZT4NCi0gIDxhcmNoaXZlIHBhdGg9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUzXzEuMC4wL2ZpbGUuemlwIiB1cmw9ImZpbGUxLnppcCIvPg0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMi9mZWF0dXJlcy9mZWF0dXJlczMuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTIvZmVhdHVyZXMvZmVhdHVyZXMzLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRjNmVjYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMi9mZWF0dXJlcy9mZWF0dXJlczMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTIvbm9uIGRhdGEvYW5vdGhlciBmaWxlLnppcCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUyL25vbiBkYXRhL2Fub3RoZXIgZmlsZS56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNzBiN2UuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTIvbm9uIGRhdGEvYW5vdGhlciBmaWxlLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUyL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTIvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MDk0M2MuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTIvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHNpdGUgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSI+DQotPGRlc2NyaXB0aW9uIHVybD0iaW5mby9zaXRlSW5mby5odG1sIi8+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmVzMy5qYXIiIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnBhY2thZ2VkIj4NCi0gIDwvZmVhdHVyZT4NCi0gIDxhcmNoaXZlIHBhdGg9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUzXzEuMC4wL2ZpbGUuemlwIiB1cmw9Im5vbiBkYXRhL2Fub3RoZXIgZmlsZS56aXAiLz4NCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZmVhdHVyZXMvZmVhdHVyZXMyLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2ZlYXR1cmVzL2ZlYXR1cmVzMi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZDAwNGQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZmVhdHVyZXMvZmVhdHVyZXMyLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9mZWF0dXJlcy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzBhNzBkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9mZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMV8xLjAuNC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9mZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMV8xLjAuNC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYzcxNTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZmVhdHVyZXMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2ZlYXR1cmVzL29yZy5lY2xpcHNlX3Rlc3RfZmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOGRkYzQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZmVhdHVyZXMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNTIwNjkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT51cGRhdGUtc2l0ZTE8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuVXBkYXRlU2l0ZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5VcGRhdGVTaXRlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS8uc2l0ZWJ1aWxkL2J1aWxkLmxvZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxLy5zaXRlYnVpbGQvYnVpbGQubG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmNlMTk0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxLy5zaXRlYnVpbGQvYnVpbGQubG9nCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIHN0YXJ0ZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgZmluaXNoZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcGx1Z2luMy5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogamF2YWMNCi1NZXNzYWdlIGxvZ2dlZDogQ29tcGlsZSBmYWlsZWQ7IHNlZSB0aGUgY29tcGlsZXIgZXJyb3Igb3V0cHV0IGZvciBkZXRhaWxzLg0KLVRhc2sgZmluaXNoZWQ6IGphdmFjDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IHBsdWdpbjMuamFyDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQuamFycw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHppcA0KLVRhc2sgZmluaXNoZWQ6IHppcA0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQuamFycw0KLVRhc2sgc3RhcnRlZDogYXZhaWxhYmxlDQotVGFzayBmaW5pc2hlZDogYXZhaWxhYmxlDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBwbHVnaW40Lmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBqYXZhYw0KLU1lc3NhZ2UgbG9nZ2VkOiBDb21waWxlIGZhaWxlZDsgc2VlIHRoZSBjb21waWxlciBlcnJvciBvdXRwdXQgZm9yIGRldGFpbHMuDQotVGFzayBmaW5pc2hlZDogamF2YWMNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogcGx1Z2luNC5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC5qYXJzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogemlwDQotVGFzayBmaW5pc2hlZDogemlwDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBST09URklMRVMqXypfKg0KLVRhcmdldCBmaW5pc2hlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1NZXNzYWdlIGxvZ2dlZDogUHJvamVjdCAke3VwZGF0ZS5mZWF0dXJlM18xLjAuMH0gZG9lcyBub3QgZXhpc3QgYW5kIGNhbm5vdCBiZSByZWZyZXNoZWQuDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLUJ1aWxkIGZpbmlzaGVkLg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxLy5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxLy5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU3MDBiOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS8uc2l0ZWJ1aWxkL3NpdGVidWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGUtYnVpbGQKLSAgICAgIGZlYXR1cmUtbG9jYXRpb249ImZlYXR1cmVzIgotICAgICAgcGx1Z2luLWxvY2F0aW9uPSJwbHVnaW5zIgotICAgICAgYXV0b2J1aWxkPSJmYWxzZSIKLSAgICAgIHNjcnViLW91dHB1dD0iZmFsc2UiCi0gICAgICB1c2UtY29uc29sZT0idHJ1ZSI+Ci0gICA8ZmVhdHVyZSBpZD0idXBkYXRlLmZlYXR1cmUxIiB2ZXJzaW9uPSIxLjAuMCIvPgotICAgPGZlYXR1cmUgaWQ9InVwZGF0ZS5mZWF0dXJlMiIgdmVyc2lvbj0iMS4wLjAiLz4KLSAgIDxmZWF0dXJlIGlkPSJ1cGRhdGUuZmVhdHVyZTMiIHZlcnNpb249IjEuMC4wIi8+Ci08L3NpdGUtYnVpbGQ+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxMmIwYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMl8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZjE3NTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlM18xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTNfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjgyYTYyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlM18xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmJjN2YzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvcGx1Z2lucy9jb20ucGx1Z2luMl8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9wbHVnaW5zL2NvbS5wbHVnaW4yXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ0MjU4My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9wbHVnaW5zL2NvbS5wbHVnaW4yXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3BsdWdpbnMvY29tLnBsdWdpbjNfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvcGx1Z2lucy9jb20ucGx1Z2luM18xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhOTRlNTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvcGx1Z2lucy9jb20ucGx1Z2luM18xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9wbHVnaW5zL2NvbS5wbHVnaW40XzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3BsdWdpbnMvY29tLnBsdWdpbjRfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGNjYTI4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3BsdWdpbnMvY29tLnBsdWdpbjRfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYzZjdiYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphciIgaWQ9InVwZGF0ZS5mZWF0dXJlMSIgdmVyc2lvbj0iMS4wLjAiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9IlNpdGUxLUNhdGVnb3J5MSIvPgotICAgPC9mZWF0dXJlPgotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJfMS4wLjAuamFyIiBpZD0idXBkYXRlLmZlYXR1cmUyIiB2ZXJzaW9uPSIxLjAuMCI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iU2l0ZTEtQ2F0ZWdvcnkyIi8+Ci0gICA8L2ZlYXR1cmU+Ci0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlM18xLjAuMC5qYXIiIGlkPSJ1cGRhdGUuZmVhdHVyZTMiIHZlcnNpb249IjEuMC4wIj4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJTaXRlMS1DYXRlZ29yeTMiLz4KLSAgIDwvZmVhdHVyZT4KLSAgIDxjYXRlZ29yeS1kZWYgbmFtZT0iU2l0ZTEtQ2F0ZWdvcnkxIiBsYWJlbD0iU2l0ZTEtQ2F0ZWdvcnkxLUxhYmVsIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIGVjZXRlcmEuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9jYXRlZ29yeS1kZWY+Ci0gICA8Y2F0ZWdvcnktZGVmIG5hbWU9IlNpdGUxLUNhdGVnb3J5MiIgbGFiZWw9IlNpdGUxLUNhdGVnb3J5Mi1MYWJlbCI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBlY2V0ZXJhLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvY2F0ZWdvcnktZGVmPgotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJTaXRlMS1DYXRlZ29yeTMiIGxhYmVsPSJTaXRlMS1DYXRlZ29yeTMtTGFiZWwiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgZWNldGVyYS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2NhdGVnb3J5LWRlZj4KLTwvc2l0ZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YjY4N2UuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT51cGRhdGUtc2l0ZTI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuVXBkYXRlU2l0ZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5VcGRhdGVTaXRlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi8uc2l0ZWJ1aWxkL2J1aWxkLmxvZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyLy5zaXRlYnVpbGQvYnVpbGQubG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTc3ODUwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyLy5zaXRlYnVpbGQvYnVpbGQubG9nCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIHN0YXJ0ZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgZmluaXNoZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcGx1Z2luMi5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogamF2YWMNCi1NZXNzYWdlIGxvZ2dlZDogQ29tcGlsZSBmYWlsZWQ7IHNlZSB0aGUgY29tcGlsZXIgZXJyb3Igb3V0cHV0IGZvciBkZXRhaWxzLg0KLVRhc2sgZmluaXNoZWQ6IGphdmFjDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IHBsdWdpbjIuamFyDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQuamFycw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHppcA0KLVRhc2sgZmluaXNoZWQ6IHppcA0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBjaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXJnZXQgZmluaXNoZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotTWVzc2FnZSBsb2dnZWQ6IFByb2plY3QgJHt1cGRhdGUuZmVhdHVyZTJfMS4wLjB9IGRvZXMgbm90IGV4aXN0IGFuZCBjYW5ub3QgYmUgcmVmcmVzaGVkLg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1CdWlsZCBmaW5pc2hlZC4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi8uc2l0ZWJ1aWxkL3NpdGVidWlsZC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi8uc2l0ZWJ1aWxkL3NpdGVidWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNTg4MjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvLnNpdGVidWlsZC9zaXRlYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlLWJ1aWxkCi0gICAgICBmZWF0dXJlLWxvY2F0aW9uPSJmZWF0dXJlcyIKLSAgICAgIHBsdWdpbi1sb2NhdGlvbj0icGx1Z2lucyIKLSAgICAgIGF1dG9idWlsZD0iZmFsc2UiCi0gICAgICBzY3J1Yi1vdXRwdXQ9ImZhbHNlIgotICAgICAgdXNlLWNvbnNvbGU9InRydWUiPgotICAgPGZlYXR1cmUgaWQ9InVwZGF0ZS5mZWF0dXJlMSIgdmVyc2lvbj0iMS4wLjEiLz4KLSAgIDxmZWF0dXJlIGlkPSJ1cGRhdGUuZmVhdHVyZTIiIHZlcnNpb249IjEuMC4xIi8+Ci08L3NpdGUtYnVpbGQ+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE3NWI0YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMl8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNjYwYjkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyL3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvcGx1Z2lucy9jb20ucGx1Z2luMV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MTVmMjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvcGx1Z2lucy9jb20ucGx1Z2luMV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9wbHVnaW5zL2NvbS5wbHVnaW4yXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyL3BsdWdpbnMvY29tLnBsdWdpbjJfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWM1ZjRjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyL3BsdWdpbnMvY29tLnBsdWdpbjJfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFkNGI3MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlPgotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjEuamFyIiBpZD0idXBkYXRlLmZlYXR1cmUxIiB2ZXJzaW9uPSIxLjAuMSIvPgotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJfMS4wLjEuamFyIiBpZD0idXBkYXRlLmZlYXR1cmUyIiB2ZXJzaW9uPSIxLjAuMSIvPgotPC9zaXRlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRkYjZiNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPnVwZGF0ZS1zaXRlMzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5VcGRhdGVTaXRlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlVwZGF0ZVNpdGVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzLy5zaXRlYnVpbGQvYnVpbGQubG9nIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvLnNpdGVidWlsZC9idWlsZC5sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMmVlMDEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvLnNpdGVidWlsZC9idWlsZC5sb2cKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQuamFycw0KLVRhc2sgc3RhcnRlZDogYXZhaWxhYmxlDQotVGFzayBmaW5pc2hlZDogYXZhaWxhYmxlDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBwbHVnaW4yYS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogamF2YWMNCi1NZXNzYWdlIGxvZ2dlZDogQ29tcGlsZSBmYWlsZWQ7IHNlZSB0aGUgY29tcGlsZXIgZXJyb3Igb3V0cHV0IGZvciBkZXRhaWxzLg0KLVRhc2sgZmluaXNoZWQ6IGphdmFjDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IHBsdWdpbjJhLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiB6aXANCi1UYXNrIGZpbmlzaGVkOiB6aXANCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIHN0YXJ0ZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgZmluaXNoZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcGx1Z2luMi5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogamF2YWMNCi1NZXNzYWdlIGxvZ2dlZDogQ29tcGlsZSBmYWlsZWQ7IHNlZSB0aGUgY29tcGlsZXIgZXJyb3Igb3V0cHV0IGZvciBkZXRhaWxzLg0KLVRhc2sgZmluaXNoZWQ6IGphdmFjDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IHBsdWdpbjIuamFyDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQuamFycw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHppcA0KLVRhc2sgZmluaXNoZWQ6IHppcA0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBjaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXJnZXQgZmluaXNoZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotTWVzc2FnZSBsb2dnZWQ6IFByb2plY3QgJHt1cGRhdGUuZmVhdHVyZTJiXzIuMC4wfSBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIHJlZnJlc2hlZC4NCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotQnVpbGQgZmluaXNoZWQuDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvLnNpdGVidWlsZC9zaXRlYnVpbGQueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvLnNpdGVidWlsZC9zaXRlYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzUxMGIwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzLy5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZS1idWlsZAotICAgICAgZmVhdHVyZS1sb2NhdGlvbj0iZmVhdHVyZXMiCi0gICAgICBwbHVnaW4tbG9jYXRpb249InBsdWdpbnMiCi0gICAgICBhdXRvYnVpbGQ9ImZhbHNlIgotICAgICAgc2NydWItb3V0cHV0PSJmYWxzZSIKLSAgICAgIHVzZS1jb25zb2xlPSJ0cnVlIj4KLSAgIDxmZWF0dXJlIGlkPSJ1cGRhdGUuZmVhdHVyZTFiIiB2ZXJzaW9uPSIyLjAuMCIvPgotICAgPGZlYXR1cmUgaWQ9InVwZGF0ZS5mZWF0dXJlMmIiIHZlcnNpb249IjIuMC4wIi8+Ci08L3NpdGUtYnVpbGQ+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWJfMi4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjlhODc2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWJfMi4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyYl8yLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJiXzIuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdiYjcwZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJiXzIuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMmQ0MWQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9wbHVnaW5zL2NvbS5wbHVnaW4xYV8xLjAuMS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9wbHVnaW5zL2NvbS5wbHVnaW4xYV8xLjAuMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MTgzYzcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMWFfMS4wLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMl8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9wbHVnaW5zL2NvbS5wbHVnaW4yXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMxYjI4ZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9wbHVnaW5zL2NvbS5wbHVnaW4yXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL3BsdWdpbnMvY29tLnBsdWdpbjJhXzEuMC4xLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL3BsdWdpbnMvY29tLnBsdWdpbjJhXzEuMC4xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU3YmE1ZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9wbHVnaW5zL2NvbS5wbHVnaW4yYV8xLjAuMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjg1MDZiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlPgotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphciIgaWQ9InVwZGF0ZS5mZWF0dXJlMWIiIHZlcnNpb249IjIuMC4wIj4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJTaXRlMy1DYXRlZ29yeTEiLz4KLSAgIDwvZmVhdHVyZT4KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyYl8yLjAuMC5qYXIiIGlkPSJ1cGRhdGUuZmVhdHVyZTJiIiB2ZXJzaW9uPSIyLjAuMCI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iU2l0ZTMtQ2F0ZWdvcnkyIi8+Ci0gICA8L2ZlYXR1cmU+Ci0gICA8Y2F0ZWdvcnktZGVmIG5hbWU9IlNpdGUzLUNhdGVnb3J5MSIgbGFiZWw9IlNpdGUzLUNhdGVnb3J5MS1MYWJlbCI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBlY2V0ZXJhLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvY2F0ZWdvcnktZGVmPgotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJTaXRlMy1DYXRlZ29yeTIiIGxhYmVsPSJTaXRlMy1DYXRlZ29yeTItTGFiZWwiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgZWNldGVyYS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2NhdGVnb3J5LWRlZj4KLTwvc2l0ZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0Ly5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMDdhYWYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT51cGRhdGUtc2l0ZTQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuVXBkYXRlU2l0ZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5VcGRhdGVTaXRlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC8uc2l0ZWJ1aWxkL2J1aWxkLmxvZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0Ly5zaXRlYnVpbGQvYnVpbGQubG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2ZlOGUzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0Ly5zaXRlYnVpbGQvYnVpbGQubG9nCisrKyAvZGV2L251bGwKQEAgLTEsNzkxICswLDAgQEAKLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIHN0YXJ0ZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgZmluaXNoZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcGx1Z2luMS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogamF2YWMNCi1NZXNzYWdlIGxvZ2dlZDogQ29tcGlsZSBmYWlsZWQ7IHNlZSB0aGUgY29tcGlsZXIgZXJyb3Igb3V0cHV0IGZvciBkZXRhaWxzLg0KLVRhc2sgZmluaXNoZWQ6IGphdmFjDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IHBsdWdpbjEuamFyDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQuamFycw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHppcA0KLVRhc2sgZmluaXNoZWQ6IHppcA0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBjaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXJnZXQgZmluaXNoZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC5qYXJzDQotVGFzayBzdGFydGVkOiBhdmFpbGFibGUNCi1UYXNrIGZpbmlzaGVkOiBhdmFpbGFibGUNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHBsdWdpbjEuamFyDQotVGFyZ2V0IGZpbmlzaGVkOiBwbHVnaW4xLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiB6aXANCi1UYXNrIGZpbmlzaGVkOiB6aXANCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBjaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFyZ2V0IGZpbmlzaGVkOiBST09URklMRVMqXypfKg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQuamFycw0KLVRhc2sgc3RhcnRlZDogYXZhaWxhYmxlDQotVGFzayBmaW5pc2hlZDogYXZhaWxhYmxlDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBwbHVnaW4xLmphcg0KLVRhcmdldCBmaW5pc2hlZDogcGx1Z2luMS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC5qYXJzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogemlwDQotVGFzayBmaW5pc2hlZDogemlwDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC5qYXJzDQotVGFzayBzdGFydGVkOiBhdmFpbGFibGUNCi1UYXNrIGZpbmlzaGVkOiBhdmFpbGFibGUNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHBsdWdpbjFhLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBqYXZhYw0KLU1lc3NhZ2UgbG9nZ2VkOiBDb21waWxlIGZhaWxlZDsgc2VlIHRoZSBjb21waWxlciBlcnJvciBvdXRwdXQgZm9yIGRldGFpbHMuDQotVGFzayBmaW5pc2hlZDogamF2YWMNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogcGx1Z2luMWEuamFyDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQuamFycw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHppcA0KLVRhc2sgZmluaXNoZWQ6IHppcA0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBjaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXJnZXQgZmluaXNoZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBST09URklMRVMqXypfKg0KLVRhcmdldCBmaW5pc2hlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1NZXNzYWdlIGxvZ2dlZDogUHJvamVjdCAke3VwZGF0ZS5mZWF0dXJlMWNfMy4wLjB9IGRvZXMgbm90IGV4aXN0IGFuZCBjYW5ub3QgYmUgcmVmcmVzaGVkLg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1NZXNzYWdlIGxvZ2dlZDogUHJvamVjdCAke3VwZGF0ZS5mZWF0dXJlMV8xLjAuMH0gZG9lcyBub3QgZXhpc3QgYW5kIGNhbm5vdCBiZSByZWZyZXNoZWQuDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotTWVzc2FnZSBsb2dnZWQ6IFByb2plY3QgJHt1cGRhdGUuZmVhdHVyZTFfMS4wLjB9IGRvZXMgbm90IGV4aXN0IGFuZCBjYW5ub3QgYmUgcmVmcmVzaGVkLg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLU1lc3NhZ2UgbG9nZ2VkOiBQcm9qZWN0ICR7dXBkYXRlLmZlYXR1cmUxYl8yLjAuMH0gZG9lcyBub3QgZXhpc3QgYW5kIGNhbm5vdCBiZSByZWZyZXNoZWQuDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotQnVpbGQgZmluaXNoZWQuDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvLnNpdGVidWlsZC9zaXRlYnVpbGQueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvLnNpdGVidWlsZC9zaXRlYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2NiMDE3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0Ly5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlLWJ1aWxkCi0gICAgICBmZWF0dXJlLWxvY2F0aW9uPSJmZWF0dXJlcyIKLSAgICAgIHBsdWdpbi1sb2NhdGlvbj0icGx1Z2lucyIKLSAgICAgIGF1dG9idWlsZD0iZmFsc2UiCi0gICAgICBzY3J1Yi1vdXRwdXQ9ImZhbHNlIgotICAgICAgdXNlLWNvbnNvbGU9InRydWUiPgotICAgPGZlYXR1cmUgaWQ9InVwZGF0ZS5mZWF0dXJlMWMiIHZlcnNpb249IjMuMC4wIi8+Ci08L3NpdGUtYnVpbGQ+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhkMmYyOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4xLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYjBiNmYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWJfMi4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxYl8yLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYjZiY2IuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxYl8yLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFjXzMuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWNfMy4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzUzMzA1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWNfMy4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvcGx1Z2lucy9jb20ucGx1Z2luMV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UwNzYwZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L3BsdWdpbnMvY29tLnBsdWdpbjFhXzEuMC4xLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L3BsdWdpbnMvY29tLnBsdWdpbjFhXzEuMC4xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0ZWIwNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9wbHVnaW5zL2NvbS5wbHVnaW4xYV8xLjAuMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzczY2JlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlPgotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFjXzMuMC4wLmphciIgaWQ9InVwZGF0ZS5mZWF0dXJlMWMiIHZlcnNpb249IjMuMC4wIj4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJTaXRlNC1DYXRlZ29yeTEiLz4KLSAgIDwvZmVhdHVyZT4KLSAgIDxjYXRlZ29yeS1kZWYgbmFtZT0iU2l0ZTQtQ2F0ZWdvcnkxIiBsYWJlbD0iU2l0ZTQtQ2F0ZWdvcnkxLUxhYmVsIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIGVjZXRlcmEuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9jYXRlZ29yeS1kZWY+Ci08L3NpdGU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTkzMzAyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+dXBkYXRlLXNpdGU1PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlVwZGF0ZVNpdGVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuVXBkYXRlU2l0ZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvLnNpdGVidWlsZC9idWlsZC5sb2cgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS8uc2l0ZWJ1aWxkL2J1aWxkLmxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI0NGZhYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS8uc2l0ZWJ1aWxkL2J1aWxkLmxvZworKysgL2Rldi9udWxsCkBAIC0xLDc5MSArMCwwIEBACi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC5qYXJzDQotVGFzayBzdGFydGVkOiBhdmFpbGFibGUNCi1UYXNrIGZpbmlzaGVkOiBhdmFpbGFibGUNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHBsdWdpbjIuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphdmFjDQotTWVzc2FnZSBsb2dnZWQ6IENvbXBpbGUgZmFpbGVkOyBzZWUgdGhlIGNvbXBpbGVyIGVycm9yIG91dHB1dCBmb3IgZGV0YWlscy4NCi1UYXNrIGZpbmlzaGVkOiBqYXZhYw0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBwbHVnaW4yLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiB6aXANCi1UYXNrIGZpbmlzaGVkOiB6aXANCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBjaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFyZ2V0IGZpbmlzaGVkOiBST09URklMRVMqXypfKg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQuamFycw0KLVRhc2sgc3RhcnRlZDogYXZhaWxhYmxlDQotVGFzayBmaW5pc2hlZDogYXZhaWxhYmxlDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBwbHVnaW4yLmphcg0KLVRhcmdldCBmaW5pc2hlZDogcGx1Z2luMi5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC5qYXJzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogemlwDQotVGFzayBmaW5pc2hlZDogemlwDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBST09URklMRVMqXypfKg0KLVRhcmdldCBmaW5pc2hlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIHN0YXJ0ZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgZmluaXNoZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcGx1Z2luMmEuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphdmFjDQotTWVzc2FnZSBsb2dnZWQ6IENvbXBpbGUgZmFpbGVkOyBzZWUgdGhlIGNvbXBpbGVyIGVycm9yIG91dHB1dCBmb3IgZGV0YWlscy4NCi1UYXNrIGZpbmlzaGVkOiBqYXZhYw0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBwbHVnaW4yYS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC5qYXJzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogemlwDQotVGFzayBmaW5pc2hlZDogemlwDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC5qYXJzDQotVGFzayBzdGFydGVkOiBhdmFpbGFibGUNCi1UYXNrIGZpbmlzaGVkOiBhdmFpbGFibGUNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHBsdWdpbjIuamFyDQotVGFyZ2V0IGZpbmlzaGVkOiBwbHVnaW4yLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiB6aXANCi1UYXNrIGZpbmlzaGVkOiB6aXANCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBjaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFyZ2V0IGZpbmlzaGVkOiBST09URklMRVMqXypfKg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBjaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXJnZXQgZmluaXNoZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotTWVzc2FnZSBsb2dnZWQ6IFByb2plY3QgJHt1cGRhdGUuZmVhdHVyZTJjXzMuMC4wfSBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIHJlZnJlc2hlZC4NCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotTWVzc2FnZSBsb2dnZWQ6IFByb2plY3QgJHt1cGRhdGUuZmVhdHVyZTJfMS4wLjB9IGRvZXMgbm90IGV4aXN0IGFuZCBjYW5ub3QgYmUgcmVmcmVzaGVkLg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLU1lc3NhZ2UgbG9nZ2VkOiBQcm9qZWN0ICR7dXBkYXRlLmZlYXR1cmUyXzEuMC4wfSBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIHJlZnJlc2hlZC4NCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1NZXNzYWdlIGxvZ2dlZDogUHJvamVjdCAke3VwZGF0ZS5mZWF0dXJlMmJfMi4wLjB9IGRvZXMgbm90IGV4aXN0IGFuZCBjYW5ub3QgYmUgcmVmcmVzaGVkLg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLUJ1aWxkIGZpbmlzaGVkLg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1Ly5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1Ly5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkyNDNkMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS8uc2l0ZWJ1aWxkL3NpdGVidWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGUtYnVpbGQKLSAgICAgIGZlYXR1cmUtbG9jYXRpb249ImZlYXR1cmVzIgotICAgICAgcGx1Z2luLWxvY2F0aW9uPSJwbHVnaW5zIgotICAgICAgYXV0b2J1aWxkPSJmYWxzZSIKLSAgICAgIHNjcnViLW91dHB1dD0iZmFsc2UiCi0gICAgICB1c2UtY29uc29sZT0idHJ1ZSI+Ci0gICA8ZmVhdHVyZSBpZD0idXBkYXRlLmZlYXR1cmUxYyIgdmVyc2lvbj0iMy4wLjAiLz4KLSAgIDxmZWF0dXJlIGlkPSJ1cGRhdGUuZmVhdHVyZTJjIiB2ZXJzaW9uPSIzLjAuMCIvPgotPC9zaXRlLWJ1aWxkPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MmQ5ZTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWIwYjZmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWJfMi4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWIwNzY0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWJfMi4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxY18zLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFjXzMuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQyNmY4Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFjXzMuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMl8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDcwY2NkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMl8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJiXzIuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMmJfMi4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDhhYzA1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMmJfMi4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyY18zLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJjXzMuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMzdkZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJjXzMuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvcGx1Z2lucy9jb20ucGx1Z2luMV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NDM3NDkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvcGx1Z2lucy9jb20ucGx1Z2luMV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9wbHVnaW5zL2NvbS5wbHVnaW4xYV8xLjAuMS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9wbHVnaW5zL2NvbS5wbHVnaW4xYV8xLjAuMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMmNjM2YuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvcGx1Z2lucy9jb20ucGx1Z2luMWFfMS4wLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvcGx1Z2lucy9jb20ucGx1Z2luMl8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9wbHVnaW5zL2NvbS5wbHVnaW4yXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJjOGE4OC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9wbHVnaW5zL2NvbS5wbHVnaW4yXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L3BsdWdpbnMvY29tLnBsdWdpbjJhXzEuMC4xLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L3BsdWdpbnMvY29tLnBsdWdpbjJhXzEuMC4xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjZDBmYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9wbHVnaW5zL2NvbS5wbHVnaW4yYV8xLjAuMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTI2ZGIxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlPgotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFjXzMuMC4wLmphciIgaWQ9InVwZGF0ZS5mZWF0dXJlMWMiIHZlcnNpb249IjMuMC4wIj4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJTaXRlNS1DYXRlZ29yeTEiLz4KLSAgIDwvZmVhdHVyZT4KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyY18zLjAuMC5qYXIiIGlkPSJ1cGRhdGUuZmVhdHVyZTJjIiB2ZXJzaW9uPSIzLjAuMCI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iU2l0ZTUtQ2F0ZWdvcnkyIi8+Ci0gICA8L2ZlYXR1cmU+Ci0gICA8Y2F0ZWdvcnktZGVmIG5hbWU9IlNpdGU1LUNhdGVnb3J5MSIgbGFiZWw9IlNpdGU1LUNhdGVnb3J5MS1MYWJlbCI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBlY2V0ZXJhLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvY2F0ZWdvcnktZGVmPgotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJTaXRlNS1DYXRlZ29yeTIiIGxhYmVsPSJTaXRlNS1DYXRlZ29yeTItTGFiZWwiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgZWNldGVyYS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2NhdGVnb3J5LWRlZj4KLTwvc2l0ZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9mZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5jaGlsZHJlbmZlYXR1cmVfMi4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L2ZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmNoaWxkcmVuZmVhdHVyZV8yLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NTgwMzQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L2ZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmNoaWxkcmVuZmVhdHVyZV8yLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvZmVhdHVyZXMvcm9vdGZlYXR1cmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L2ZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAxMTA1MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvZmVhdHVyZXMvcm9vdGZlYXR1cmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ5ZjViYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNGIwNGEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4xLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjIwOGZlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjNjYjFhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlPgotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphciIvPgotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvZmVhdHVyZXMvY2hpbGRyZW5mZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvZmVhdHVyZXMvY2hpbGRyZW5mZWF0dXJlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UwNTdlNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL2ZlYXR1cmVzL2NoaWxkcmVuZmVhdHVyZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL2ZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvZmVhdHVyZXMvcm9vdGZlYXR1cmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGEwYTNjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvZmVhdHVyZXMvcm9vdGZlYXR1cmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDlmNWJjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0YjA0YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMjA4ZmUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NTJkYTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlPgotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphciIvPgotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2NoaWxkcmVuZmVhdHVyZS5qYXIiLz4gIAotICAKLSAgPGFyY2hpdmUgcGF0aD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuY2hpbGRyZW5mZWF0dXJlXzIuMS4wLmphciIgdXJsPSJmZWF0dXJlcy9jaGlsZHJlbmZlYXR1cmUuamFyIi8+ICAKLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL2ZlYXR1cmVzL2NoaWxkcmVuZmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL2ZlYXR1cmVzL2NoaWxkcmVuZmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZWU0YmEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9mZWF0dXJlcy9jaGlsZHJlbmZlYXR1cmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9mZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL2ZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk5YmRkYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL2ZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ5ZjViYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNGIwNGEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjIwOGZlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjY5NmJhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIiLz4KLSAgCi0gIDxhcmNoaXZlIHBhdGg9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmNoaWxkcmVuZmVhdHVyZV8yLjEuMC5qYXIiIHVybD0iZmVhdHVyZXMvY2hpbGRyZW5mZWF0dXJlLmphciIvPiAgCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTEueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2Q3MDgwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL2ZlYXR1cmUxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtIgotICAgdmVyc2lvbj0iMi4xLjAiCi0gICBsYWJlbD0iRWNsaXBzZSBQbGF0Zm9ybSIKLSAgIHByb3ZpZGVyLW5hbWU9Ind3dy5lY2xpcHNlLm9yZyIKLSAgIGltYWdlPSJzcGxhc2gvc3BsYXNoX2Z1bGwuYm1wIgotICAgPgotCi0JPGxpY2Vuc2U+Ci0gICAgCSBsaWNlbnNlCi0JPC9saWNlbnNlPgotCi0gICA8Y29weXJpZ2h0IHVybD0ibm90aWNlLmh0bWwiLz4KLSAgIHgKLQkKLSAgIDxsaWNlbnNlIHVybD0iYWJvdXQuaHRtbCI+Ci0gICB4Ci0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIHVybD0iZmlsZTovRDovIiBsYWJlbD0iRWNsaXBzZSBVcGRhdGUgU2l0ZSIvPgotICAgPC91cmw+Ci0KLTwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlMWJpcy54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlMWJpcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NTVmOTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTFiaXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0iCi0gICB2ZXJzaW9uPSIyLjEuMCIKLSAgIGxhYmVsPSJFY2xpcHNlIFBsYXRmb3JtIgotICAgcHJvdmlkZXItbmFtZT0id3d3LmVjbGlwc2Uub3JnIgotICAgaW1hZ2U9InNwbGFzaC9zcGxhc2hfZnVsbC5ibXAiCi0gICA+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgIEVjbGlwc2UgcGxhdGZvcm0gZmVhdHVyZS4KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQgdXJsPSJub3RpY2UuaHRtbCIvPgotICAgPGJsYWggLz4KLQkKLSAgIDxsaWNlbnNlIHVybD0iYWJvdXQuaHRtbCI+Ci0KLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgdXJsPSJmaWxlOi9EOi8iIGxhYmVsPSJFY2xpcHNlIFVwZGF0ZSBTaXRlIi8+Ci0gICA8L3VybD4KLQotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL2ZlYXR1cmUyLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL2ZlYXR1cmUyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMyZGY5Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIKLSAgIHZlcnNpb249IjIuMS4wIgotICAgbGFiZWw9IkVjbGlwc2UgUGxhdGZvcm0iCi0gICBwcm92aWRlci1uYW1lPSJ3d3cuZWNsaXBzZS5vcmciCi0gICBpbWFnZT0ic3BsYXNoL3NwbGFzaF9mdWxsLmJtcCIKLSAgIGJsYWg9ImJsYWgiCi0gICA+Ci0KLSAgIDxkZXNjcmlwdGlvbiBibGFoPSJibGFoIj4KLSAgIEVjbGlwc2UgcGxhdGZvcm0gZmVhdHVyZS4KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQgdXJsPSJub3RpY2UuaHRtbCIgYmxhaD0iYmxhaCIvPgotCQotICAgPGxpY2Vuc2UgdXJsPSJhYm91dC5odG1sIiBibGFoPSJibGFoIj4KLSAgIDwvbGljZW5zZT4KLQotICAgPHVybCBibGFoPSJibGFoIj4KLSAgICAgIDx1cGRhdGUgdXJsPSJmaWxlOi9EOi8iIGxhYmVsPSJFY2xpcHNlIFVwZGF0ZSBTaXRlIiBibGFoPSJibGFoIi8+Ci0gICA8L3VybD4KLQotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL2ZlYXR1cmUzLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL2ZlYXR1cmUzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E2NjBiZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlMy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIKLSAgIHZlcnNpb249IjIuMS4wIgotICAgbGFiZWw9IkVjbGlwc2UgUGxhdGZvcm0iCi0gICBwcm92aWRlci1uYW1lPSJ3d3cuZWNsaXBzZS5vcmciCi0gICBpbWFnZT0ic3BsYXNoL3NwbGFzaF9mdWxsLmJtcCIKLSAgID4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgRWNsaXBzZSBwbGF0Zm9ybSBmZWF0dXJlLgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodCB1cmw9IiRvcyQvJHdzJC9ub3RpY2UuaHRtbCIvPgotICAgeAotCQotICAgPGxpY2Vuc2UgdXJsPSJhYm91dC5odG1sIj4KLSAgIHgKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgdXJsPSJmaWxlOi9EOi8iIGxhYmVsPSJFY2xpcHNlIFVwZGF0ZSBTaXRlIi8+Ci0gICA8L3VybD4KLQotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL2ZlYXR1cmU0LnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL2ZlYXR1cmU0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcxODdjOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlNC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIKLSAgIHZlcnNpb249IjIuMS4wIgotICAgbGFiZWw9IkVjbGlwc2UgUGxhdGZvcm0iCi0gICBwcm92aWRlci1uYW1lPSJ3d3cuZWNsaXBzZS5vcmciCi0gICBpbWFnZT0ic3BsYXNoL3NwbGFzaF9mdWxsLmJtcCIKLSAgID4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgRWNsaXBzZSBwbGF0Zm9ybSBmZWF0dXJlLgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodCB1cmw9IiRvcyQvJHdzJC9ub3RpY2UuaHRtbCIvPgotICAgeAotCQotICAgPGxpY2Vuc2UgdXJsPSJhYm91dC5odG1sIj4KLSAgIHgKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgdXJsPSJmaWxlOi9EOi8iIGxhYmVsPSJFY2xpcHNlIFVwZGF0ZSBTaXRlIi8+Ci0gICAgICA8ZGlzY292ZXJ5IHVybD0iZmlsZTovYzovIiBsYWJlbCA9ICJEaXNjb3ZlcnkiIHR5cGU9IndlYiIvPgotICAgPC91cmw+Ci0KLTwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9yZWRkb3QueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvcmVkZG90LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNmMTcwMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9yZWRkb3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+DQotPHNpdGUgdXJsPSJpbmZvL3NpdGVJbmZvLmh0bWwiPg0KLTxmZWF0dXJlIHVybD0iZmVhdHVyZXMvcmVkZG90XzEuMC4wLmphciI+IA0KLTxjYXRlZ29yeSBuYW1lPSJyZWRkb3QiLz4NCi08L2ZlYXR1cmU+DQotPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9yZWRkb3RfMi4xLjAuamFyIj4NCi08Y2F0ZWdvcnkgbmFtZT0icmVkZG90Ii8+DQotPC9mZWF0dXJlPg0KLTxhcmNoaXZlIHBhdGg9ImNvbS5yZWRkb3QucmVkb3RfMS4wLjAiIHVybD0icGx1Z2lucy9jb20ucmVkZG90LnJlZGRvdF8xLjAuMC5qYXIiLz4NCi08YXJjaGl2ZSBwYXRoPSJjb20ucmVkZG90LnJlZG90XzIuMS4wIiB1cmw9InBsdWdpbnMvY29tLnJlZGRvdC5yZWRkb3RfMi4xLjAuamFyIi8+DQotPGNhdGVnb3J5LWRlZiBsYWJlbD0iUmVkIERvdCBWZXJzaW9ucyIgbmFtZT0icmVkZG90Ij4NCi08ZGVzY3JpcHRpb24gdXJsPSJSZWREb3RWZXJzaW9ucy5odG1sIj4NCi1UaGlzIGNhdGVnb3J5IGNvbnRhaW5zIGFsbCBvZiB0aGUgJmx0O2N1cnJlbnRseSZndDsgYXZhaWxhYmxlIHZlcnNpb25zIG9mIFJlZCBEb3QgZmVhdHVyZS4NCi08IVtDREFUQVs8Z3JlZXRpbmc+SGVsbG8sIHdvcmxkITwvZ3JlZXRpbmc+XV0+DQotPC9kZXNjcmlwdGlvbj4NCi08L2NhdGVnb3J5LWRlZj4NCi08L3NpdGU+DQotDQotDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvcmVkZG90MS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9yZWRkb3QxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0NDkwZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9yZWRkb3QxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/Pg0KLTxzaXRlIHVybD0iaW5mby9zaXRlSW5mby5odG1sIj4NCi08ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3JlZGRvdF8xLjAuMC5qYXIiPiANCi08Y2F0ZWdvcnkgbmFtZT0icmVkZG90Ii8+DQotPC9mZWF0dXJlPg0KLTxmZWF0dXJlIHVybD0iZmVhdHVyZXMvcmVkZG90XzIuMS4wLmphciI+DQotPGNhdGVnb3J5IG5hbWU9InJlZGRvdCIvPg0KLTwvZmVhdHVyZT4NCi08YXJjaGl2ZSBwYXRoPSJjb20ucmVkZG90LnJlZG90XzEuMC4wIiB1cmw9InBsdWdpbnMvY29tLnJlZGRvdC5yZWRkb3RfMS4wLjAuamFyIi8+DQotPGFyY2hpdmUgcGF0aD0iY29tLnJlZGRvdC5yZWRvdF8yLjEuMCIgdXJsPSJwbHVnaW5zL2NvbS5yZWRkb3QucmVkZG90XzIuMS4wLmphciIvPg0KLTxjYXRlZ29yeS1kZWYgbGFiZWw9IlJlZCBEb3QgVmVyc2lvbnMiIG5hbWU9InJlZGRvdCI+DQotPGRlc2NyaXB0aW9uIHVybD0iUmVkRG90VmVyc2lvbnMuaHRtbCI+DQotVGhpcyBjYXRlZ29yeSBjb250YWlucyBhbGwgb2YgdGhlICZsdDtjdXJyZW50bHkmZ3Q7IGF2YWlsYWJsZSB2ZXJzaW9ucyBvZiBSZWQgRG90IGZlYXR1cmUuDQotPC9kZXNjcmlwdGlvbj4NCi08L2NhdGVnb3J5LWRlZj4NCi08L3NpdGU+DQotDQotDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwZDgzMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHNpdGUgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzIiBuYW1lPSJUZXN0cyIgdmVyc2lvbj0iMC4wLjEiIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiPg0KLSAgPGhhbmRsZXI+DQotICAJPGJvbyBjbGFzcyA9InVua25vd24iLz4NCi0gIDwvaGFuZGxlcj4NCi0gIA0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAuamFyIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MSIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgDQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmVzMi5qYXIiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxL3N1YmNhdDEiLz4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MiIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgDQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphciI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MiIvPg0KLSAgICA8YmxhaC8+DQotICA8L2ZlYXR1cmU+DQotICANCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlLmphciIvPg0KLSAgDQotICA8ZmVhdHVyZSB1cmw9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphciI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4NCi0gIDwvZmVhdHVyZT4NCi0gIA0KLSAgPGZlYXR1cmUgdXJsPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8xLjAuMC9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8yLjIuMi5qYXIiPg0KLSAgPC9mZWF0dXJlPg0KLSAgDQotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL2hlbGxvIiA+DQotICAJPGRlZmF1bHQvPg0KLSAgPC9hcmNoaXZlPg0KLQ0KLSAgPGNhdGVnb3J5LWRlZiBuYW1lPSJjYXRlZ29yeTIiIGxhYmVsPSIlc2VjdXJpdHkiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkxL3N1YmNhdDEiIGxhYmVsPSJTcGVjaWFsIEZpeCIvPg0KLSAgPGNhdGVnb3J5LWRlZiBuYW1lPSJjYXRlZ29yeTEiIGxhYmVsPSIlZHJpdmVycyIvPiAgDQotDQotDQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUxMC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlMTAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDI2ODBkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUxMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGUgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzIiBuYW1lPSJUZXN0cyIgdmVyc2lvbj0iMC4wLjEiIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiIGJsYWg9ImJsYWgiPgotICAKLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAuamFyIiBibGFoPSJibGFoIiBpZD0ib3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlIiB2ZXJzaW9uPSIxLjAuMCIvPgotICAKLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlczIuamFyIiBpZD0idW5rbndvbi5pZCIgdmVyc2lvbj0iYmFkIHZlcnNpb24iLz4KLSAgCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyIiBpZD0ib25seS5pZCIvPgotICAgIAotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlX3Rlc3RfZmVhdHVyZS5qYXIiIHZlcnNpb249IjEuMC4wIi8+Ci0gIAotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUyLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3NTUwZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgPGZlYXR1cmUgaWQ9ImNvbS5pYm0uamR0IiB1cmw9Imh0dHA6Ly93d3cubm90LWVjbGlwc2Uub3JnL2ZlYXR1cmUzIiB2ZXJzaW9uPSIxLjAuMCIvPgotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUzLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJiYjY4Mi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlMy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgPGZlYXR1cmUgaWQ9ImNvbS5pYm0uamR0IiB1cmw9ImZlYXR1cmUzL2ZlYXR1cmUuamFyIiB2ZXJzaW9uPSIxLjAuMCI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJ1bmtub3duIi8+Ci0gIDwvZmVhdHVyZT4KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlNC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlNC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYjdkMTYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08c2l0ZT4KLSAgIDxkZXNjcmlwdGlvbiB1cmw9ImluZm8vc2l0ZUluZm8uaHRtbCIvPgotCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IlJlZCBEb3QgVmVyc2lvbnMiIG5hbWU9InJlZGRvdCI+Ci0gICAgICA8ZGVzY3JpcHRpb24gdXJsPSJSZWREb3RWZXJzaW9ucy5odG1sIj4KLSAgICAgICAgIFRoaXMgY2F0ZWdvcnkgY29udGFpbnMgYWxsIG9mIHRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIHZlcnNpb25zIG9mIFJlZCBEb3QgZmVhdHVyZS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2NhdGVnb3J5LWRlZj4KLSAgIAotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9jb20ucmVkZG90LnJlZGRvdF8xLjAuMC5qYXIiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9InJlZGRvdCIvPgotICAgPC9mZWF0dXJlPgotCi0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2NvbS5yZWRkb3QucmVkZG90XzIuMS4wLmphciI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0icmVkZG90Ii8+Ci0gICA8L2ZlYXR1cmU+Ci0KLSAKLTwvc2l0ZT4gICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlNy54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlNy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTBkNzAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cyIgbmFtZT0iVGVzdHMiIHZlcnNpb249IjAuMC4xIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4KLSAgPGhhbmRsZXI+Ci0gIAk8Ym9vIGNsYXNzID0idW5rbm93biIvPgotICA8L2hhbmRsZXI+Ci0gIAotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC5qYXIiPgotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4KLSAgPC9mZWF0dXJlPgotICAKLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlczIuamFyIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxL3N1YmNhdDEiLz4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkyIi8+Ci0gIDwvZmVhdHVyZT4KLSAgCi0gIDxibGFoLz4KLSAgCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIi8+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MiIvPgotICAgIDxibGFoLz4KLSAgPC9mZWF0dXJlPgotICAKLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUuamFyIi8+Ci0gIAotICA8ZmVhdHVyZSB1cmw9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphciI+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MSIvPgotICA8L2ZlYXR1cmU+Ci0gIAotICA8ZmVhdHVyZSB1cmw9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphciI+Ci0gIDwvZmVhdHVyZT4KLSAgCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvaGVsbG8iID4KLSAgCTxkZWZhdWx0Lz4KLSAgPC9hcmNoaXZlPgotCi0gIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkyIiBsYWJlbD0iJXNlY3VyaXR5Ii8+Ci0gIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkxL3N1YmNhdDEiIGxhYmVsPSJTcGVjaWFsIEZpeCIvPgotICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImNhdGVnb3J5MSIgbGFiZWw9IiVkcml2ZXJzIi8+ICAKLQotCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTgueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmNiYWExLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGU4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMiIG5hbWU9IlRlc3RzIiB2ZXJzaW9uPSIwLjAuMSIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSI+Ci0gIDxoYW5kbGVyPgotICAJPGJvbyBjbGFzcyA9InVua25vd24iLz4KLSAgPC9oYW5kbGVyPgotICAKLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAuamFyIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIi8+Ci0gIDwvZmVhdHVyZT4KLSAgCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZXMyLmphciI+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MS9zdWJjYXQxIi8+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MiIvPgotICA8L2ZlYXR1cmU+Ci0gIHhjeGdmc2RmZ3Nkc2QKLSAgCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIi8+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MiIvPgotICAgIDxibGFoLz4KLSAgPC9mZWF0dXJlPgotICAKLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUuamFyIi8+Ci0gIAotICA8ZmVhdHVyZSB1cmw9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphciI+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MSIvPgotICA8L2ZlYXR1cmU+Ci0gIAotICA8ZmVhdHVyZSB1cmw9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphciI+Ci0gIDwvZmVhdHVyZT4KLSAgCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvaGVsbG8iID4KLSAgCTxkZWZhdWx0Lz4KLSAgPC9hcmNoaXZlPgotCi0gIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkyIiBsYWJlbD0iJXNlY3VyaXR5Ii8+Ci0gIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkxL3N1YmNhdDEiIGxhYmVsPSJTcGVjaWFsIEZpeCIvPgotICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImNhdGVnb3J5MSIgbGFiZWw9IiVkcml2ZXJzIi8+ICAKLQotCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTkueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzhjNWE0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGU5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMiIG5hbWU9IlRlc3RzIiB2ZXJzaW9uPSIwLjAuMSIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSIgYmxhaD0iYmxhaCI+Ci0gIDxoYW5kbGVyIGJsYWg9ImJsYWgiPgotICAJPGJvbyBjbGFzcyA9InVua25vd24iIGJsYWg9ImJsYWgiLz4KLSAgPC9oYW5kbGVyPgotICAKLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAuamFyIiBibGFoPSJibGFoIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIiBibGFoPSJibGFoIiAvPgotICA8L2ZlYXR1cmU+Ci0gIAotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmVzMi5qYXIiPgotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEvc3ViY2F0MSIvPgotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTIiLz4KLSAgPC9mZWF0dXJlPgotICAKLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMV8xLjAuNC5qYXIiPgotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkyIi8+Ci0gICAgPGJsYWgvPgotICA8L2ZlYXR1cmU+Ci0gIAotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlX3Rlc3RfZmVhdHVyZS5qYXIiLz4KLSAgCi0gIDxmZWF0dXJlIHVybD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMS4wLjAvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMi4yLjIuamFyIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIi8+Ci0gIDwvZmVhdHVyZT4KLSAgCi0gIDxmZWF0dXJlIHVybD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMS4wLjAvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMi4yLjIuamFyIj4KLSAgPC9mZWF0dXJlPgotICAKLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9oZWxsbyIgYmxhaD0iYmxhaCI+Ci0gIAk8ZGVmYXVsdCBibGFoPSJibGFoIi8+Ci0gIDwvYXJjaGl2ZT4KLQotICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImNhdGVnb3J5MiIgbGFiZWw9IiVzZWN1cml0eSIgYmxhaD0iYmxhaCIvPgotICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImNhdGVnb3J5MS9zdWJjYXQxIiBsYWJlbD0iU3BlY2lhbCBGaXgiIGJsYWg9ImJsYWgiLz4KLSAgPGNhdGVnb3J5LWRlZiBuYW1lPSJjYXRlZ29yeTEiIGxhYmVsPSIlZHJpdmVycyIvPiAgCi0KLQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGVmdHAueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZWZ0cC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ODNlYzAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZWZ0cC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZSB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS5mdHAiPgotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmVzMi5qYXJmaWxlIi8+Ci08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvLmNsYXNzcGF0aCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YWNiMzkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS51aSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWJjNTA1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+RmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXJfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTViNzIyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXJfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvYmluL0hhbmRsZXJXaXRoVUkkMS5jbGFzcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyL2Jpbi9IYW5kbGVyV2l0aFVJJDEuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MjkxYjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvYmluL0hhbmRsZXJXaXRoVUkkMS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyL2Jpbi9IYW5kbGVyV2l0aFVJLmNsYXNzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvYmluL0hhbmRsZXJXaXRoVUkuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOGU4ODEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvYmluL0hhbmRsZXJXaXRoVUkuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci9idWlsZC5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiN2NjNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLmhhbmRsZXIuamFyID0gc3JjLyxcCi0gICAgICAgICAgICAgICAgICAgICBiaW4vCi1vdXRwdXQuaGFuZGxlci5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBoYW5kbGVyLmphcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI5MGVhNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9IkZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIiCi0gICAgICBsYWJlbD0iRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlciIKLSAgICAgIHZlcnNpb249IjEuMC4wIj4KLQotICAgPGluc3RhbGwtaGFuZGxlciBsaWJyYXJ5PSJoYW5kbGVyLmphciIgaGFuZGxlcj0iSGFuZGxlcldpdGhVSSIgLz4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iW0VudGVyIEZlYXR1cmUgVVJMIGhlcmUuXSI+Ci0gICAgICBbRW50ZXIgRmVhdHVyZSBEZXNjcmlwdGlvbiBoZXJlLl0KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQgdXJsPSJbRW50ZXIgQ29weXJpZ2h0IFVSTCBoZXJlLl0iPgotICAgICAgW0VudGVyIENvcHlyaWdodCBEZXNjcmlwdGlvbiBoZXJlLl0KLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IltFbnRlciBMaWNlbnNlIFVSTCBoZXJlLl0iPgotICAgICAgW0VudGVyIExpY2Vuc2UgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmx1Y2VuZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjMuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvRmVhdHVyZVdpdGhJbnN0YWxsSGFuZGxlci9oYW5kbGVyLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyL2hhbmRsZXIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2JjMjQ0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyL2hhbmRsZXIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvc3JjL0hhbmRsZXJXaXRoVUkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9GZWF0dXJlV2l0aEluc3RhbGxIYW5kbGVyL3NyYy9IYW5kbGVyV2l0aFVJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZGZiYzAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL0ZlYXR1cmVXaXRoSW5zdGFsbEhhbmRsZXIvc3JjL0hhbmRsZXJXaXRoVUkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotLyoKLSAqIENyZWF0ZWQgb24gT2N0IDEsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi0KLS8qKgotICogQGF1dGhvciBiaXJzYW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBIYW5kbGVyV2l0aFVJIGltcGxlbWVudHMgSUluc3RhbGxIYW5kbGVyIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbnN0YWxsSGFuZGxlciNjb21wbGV0ZUNvbmZpZ3VyZSgpCi0JICovCi0JcHVibGljIHZvaWQgY29tcGxldGVDb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJU3lzdGVtLm91dC5wcmludGxuKCJjb21wbGV0ZUNvbmZpZ3VyZSgpIik7Ci0KLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyI2NvbXBsZXRlSW5zdGFsbChvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZUNvbnRlbnRDb25zdW1lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wbGV0ZUluc3RhbGwoSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgY29uc3VtZXIpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJU3lzdGVtLm91dC5wcmludGxuKCJjb21wbGV0ZUluc3RhbGwoKSIpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5zdGFsbEhhbmRsZXIjY29tcGxldGVVbmNvbmZpZ3VyZSgpCi0JICovCi0JcHVibGljIHZvaWQgY29tcGxldGVVbmNvbmZpZ3VyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlTeXN0ZW0ub3V0LnByaW50bG4oImNvbXBsZXRlSW5zdGFsbCgpIik7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbnN0YWxsSGFuZGxlciNjb21wbGV0ZVVuaW5zdGFsbCgpCi0JICovCi0JcHVibGljIHZvaWQgY29tcGxldGVVbmluc3RhbGwoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJU3lzdGVtLm91dC5wcmludGxuKCJjb21wbGV0ZVVuaW5zdGFsbCgpIik7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbnN0YWxsSGFuZGxlciNjb25maWd1cmVDb21wbGV0ZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wbGV0ZWQoYm9vbGVhbiBzdWNjZXNzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJU3lzdGVtLm91dC5wcmludGxuKCJjb25maWd1cmVDb21wbGV0ZWQoKSIpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5zdGFsbEhhbmRsZXIjY29uZmlndXJlSW5pdGlhdGVkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmVJbml0aWF0ZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJU3lzdGVtLm91dC5wcmludGxuKCJjb25maWd1cmVJbml0aWF0ZWQoKSIpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5zdGFsbEhhbmRsZXIjaW5pdGlhbGl6ZShpbnQsIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlLCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5zdGFsbEhhbmRsZXJFbnRyeSwgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSW5zdGFsbE1vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShpbnQgdHlwZSwgSUZlYXR1cmUgZmVhdHVyZSwKLQkJCUlJbnN0YWxsSGFuZGxlckVudHJ5IGVudHJ5LCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiaW5pdGlhbGl6ZSgpIik7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyggbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksICJJbnN0YWxsSGFuZGxlciIsICJUaGlzIGlzIGEgZHVtbXkgbWVzc2FnZSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyI2luc3RhbGxDb21wbGV0ZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsQ29tcGxldGVkKGJvb2xlYW4gc3VjY2VzcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiaW5zdGFsbENvbXBsZXRlZCgpIik7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbnN0YWxsSGFuZGxlciNpbnN0YWxsSW5pdGlhdGVkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsSW5pdGlhdGVkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiaW5zdGFsbEluaXRpYXRlZCgpIik7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbnN0YWxsSGFuZGxlciNub25QbHVnaW5EYXRhRG93bmxvYWRlZChvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JTm9uUGx1Z2luRW50cnlbXSwgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVZlcmlmaWNhdGlvbkxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vblBsdWdpbkRhdGFEb3dubG9hZGVkKElOb25QbHVnaW5FbnRyeVtdIG5vblBsdWdpbkRhdGEsCi0JCQlJVmVyaWZpY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5vblBsdWdpbkRhdGFEb3dubG9hZGVkKCkiKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyI3BsdWdpbnNEb3dubG9hZGVkKG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklQbHVnaW5FbnRyeVtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHBsdWdpbnNEb3dubG9hZGVkKElQbHVnaW5FbnRyeVtdIHBsdWdpbnMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlTeXN0ZW0ub3V0LnByaW50bG4oInBsdWdpbnNEb3dubG9hZGVkKCkiKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyI3VuY29uZmlndXJlQ29tcGxldGVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgdW5jb25maWd1cmVDb21wbGV0ZWQoYm9vbGVhbiBzdWNjZXNzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmNvbmZpZ3VyZUNvbXBsZXRlZCgpIik7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbnN0YWxsSGFuZGxlciN1bmNvbmZpZ3VyZUluaXRpYXRlZCgpCi0JICovCi0JcHVibGljIHZvaWQgdW5jb25maWd1cmVJbml0aWF0ZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmNvbmZpZ3VyZUluaXRpYXRlZCgpIik7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbnN0YWxsSGFuZGxlciN1bmluc3RhbGxDb21wbGV0ZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGxDb21wbGV0ZWQoYm9vbGVhbiBzdWNjZXNzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmluc3RhbGxDb21wbGV0ZWQoKSIpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5zdGFsbEhhbmRsZXIjdW5pbnN0YWxsSW5pdGlhdGVkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGxJbml0aWF0ZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmluc3RhbGxJbml0aWF0ZWQoKSIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZG9jXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5kb2NfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDk5YmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5kb2NfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmRvY18yLjAuMC9jcGwtdjEwLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmRvY18yLjAuMC9jcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NDE2YzEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5kb2NfMi4wLjAvY3BsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkhUTUwgVGlkeSwgc2VlIHd3dy53My5vcmciIC8+Ci08dGl0bGU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgotY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiIC8+Ci08L2hlYWQ+Ci08Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiB2bGluaz0iIzgwMDAwMCI+Ci08cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlciI+Q29tbW9uIFB1YmxpYwotTGljZW5zZSAtIHYgMS4wPC9wPgotCi08cD5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMKLUNPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IKLURJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GCi1USElTIEFHUkVFTUVOVC48L3A+Ci0KLTxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+MS4gREVGSU5JVElPTlM8L3A+Ci0KLTxwPiJDb250cmlidXRpb24iIG1lYW5zOjwvcD4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwKLUNvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyCi10aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPSJMRUZUIiAvPgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMKLXRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdAotcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYQotQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IKLWl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMKLWRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZQotbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtCi11bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uPC9kaXY+Ci0KLTxwPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUKLVByb2dyYW0uPC9wPgotCi08cD4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEKLUNvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mCi1pdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGgKLXRoaXMgQWdyZWVtZW50LjwvcD4KLQotPHA+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzCi1BZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvcD4KLQotPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj4yLiBHUkFOVCBPRiBSSUdIVFM8L3A+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMKLUFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhCi1ub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bwotcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5Ci1wZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kCi1vYmplY3QgY29kZSBmb3JtLjwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzCi1BZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYQotbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIKLUxpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kCi1vdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluCi1zb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseQotdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUKLXRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YKLXRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUKLUxpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyCi1jb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci48L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQKLWFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucwotc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55Ci1saWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkCi1vbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEKLWNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLAotZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55Ci1vdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYKLWEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlCi10aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+ZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQKLXRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMKLUNvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC48L2Rpdj4KLQotPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj4zLiBSRVFVSVJFTUVOVFM8L3A+Ci0KLTxwPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdAotY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9wPgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5hKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5iKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YKLWFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kCi1pbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZAotbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mCi1tZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOzwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mCi1hbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsCi1pbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzCi1sb3N0IHByb2ZpdHM7PC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2gKLWRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUKLWFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+aXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUKLVByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzCi1ob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bQotY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9kaXY+Ci0KLTxwPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L3A+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIKLXRoaXMgQWdyZWVtZW50OyBhbmQ8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUKLWluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLjwvZGl2PgotCi08cD5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzCi1jb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLjwvcD4KLQotPHA+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMKLUNvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQKLVJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi48L3A+Ci0KLTxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3A+Ci0KLTxwPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbgotcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQKLXRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUKLWNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIKLXdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuCi1UaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpCi1oZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yCi0oIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cwotKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZAotQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2gKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcwotc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbAotb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0byBxdWFsaWZ5LAotYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQKLW5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkKLXN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvcD4KLQotPHA+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhCi1jb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzCi1wZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLAotdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheQotYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlCi1kYW1hZ2VzLjwvcD4KLQotPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj41LiBOTyBXQVJSQU5UWTwvcD4KLQotPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTCi1QUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRgotQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sCi1BTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudAotaXMgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nCi1hbmQgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGgKLWl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBidXQgbm90Ci1saW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aAotYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsCi1hbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuPC9wPgotCi08cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9wPgotCi08cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUgotUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCi1ESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLURBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQKLUFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi1MSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgotQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFCi1FWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9wPgotCi08cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjcuIEdFTkVSQUw8L3A+Ci0KLTxwPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlCi11bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQKLXdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbAotYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uCi12YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9wPgotCi08cD5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3IKLXdpdGggcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYQotY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiBJbgotYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55Ci1lbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUKLVByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MKLXBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKQotc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC48L3A+Ci0KLTxwPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmCi1pdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YKLXRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsCi1SZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzCi10byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkKLXByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudAotYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbAotY29udGludWUgYW5kIHN1cnZpdmUuPC9wPgotCi08cD5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcwotQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZQotQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zCi0oaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZQotb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcwotQWdyZWVtZW50LiBJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIElCTSBtYXkgYXNzaWduIHRoZQotcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUKLXNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYQotZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcKLUNvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldwotdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcKLXZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikKLWFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZQotUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlCi1yZXNlcnZlZC48L3A+Ci0KLTxwPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yawotYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLgotTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2gKLXBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nCi1saXRpZ2F0aW9uLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5kb2NfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZG9jXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZTNlMDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5kb2NfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZG9jXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZG9jXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRkMjIyNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmRvY18yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAvKioKLSMgICogPGNvcHlyaWdodD4KLSMgICoKLSMgICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAgKiAKLSMgICogQ29udHJpYnV0b3JzOiAKLSMgICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICoKLSMgICogPC9jb3B5cmlnaHQ+Ci0jICAqCi0jICAqICRJZDogZmVhdHVyZS5wcm9wZXJ0aWVzLHYgMS4xIDIwMDQvMTAvMTggMTU6NTA6NDIgZGJpcnNhbiBFeHAgJAotIyAgKi8KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIFRoaXMgZmlsZSBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBNb2RlbGluZyBGcmFtZXdvcmsgKEVNRikgRG9jdW1lbnRhdGlvbgotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZS5vcmcgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUVjbGlwc2UgTW9kZWxpbmcgRnJhbWV3b3JrLiAoZG9jdW1lbnRhdGlvbikKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRS5PUkcgU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLTE0dGggQXVndXN0LCAyMDAzXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotRUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmdcblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJDUEwiKS4gQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi1Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHNcblwKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3JcblwKLW1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZVxuXAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzXG5cCi1hcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluXG5cCi1kaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIFN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmRvY18yLjAuMC9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZG9jXzIuMC4wL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTM2M2U3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZG9jXzIuMC4wL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IGZlYXR1cmUueG1sLHYgMS4xIDIwMDQvMDMvMDYgMTc6MzE6MzEgbWFyY2Vsb3AgRXhwICQKLSAqLwotLS0+Ci0KLTxmZWF0dXJlCi0JaWQ9Im9yZy5lY2xpcHNlLmVtZi5kb2MiCi0gICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICB2ZXJzaW9uPSIyLjAuMCIKLSAgICBpbWFnZT0gImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciCi0gICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLQk8ZGVzY3JpcHRpb24+Ci0gICAgCSVkZXNjcmlwdGlvbgotCTwvZGVzY3JpcHRpb24+Ci0KLSAgICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLQkJJWxpY2Vuc2UKLQk8L2xpY2Vuc2U+Ci0KLQk8dXJsPgotCQk8dXBkYXRlIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzIiBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIi8+Ci0JPC91cmw+Ci0KLQk8cGx1Z2luCi0JCWlkPSJvcmcuZWNsaXBzZS5lbWYuZG9jIgotICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICBpbnN0YWxsLXNpemU9IjAiICAgCQkKLQkJdmVyc2lvbj0iMi4wLjAiLz4KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZG9jXzIuMC4wL2xpY2Vuc2UuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZG9jXzIuMC4wL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdhNWUxOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmRvY18yLjAuMC9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iSFRNTCBUaWR5LCBzZWUgd3d3LnczLm9yZyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIKLWNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPSJibHVlIiB2bGluaz0icHVycGxlIj4KLTxoMj5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci0KLTxwPjE0dGggQXVndXN0LCAyMDAzPC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPkVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04KLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkKLSJDT05URU5UIikuIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5ECi1DT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YKLUxJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWQotVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTCi1HT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWQotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAotQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMKLUFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZCi1OT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgotCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkKLUVjbGlwc2Uub3JnIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLXRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJDUEwiKS4gQSBjb3B5IG9mIHRoZSBDUEwgaXMKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YQotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0Ci1jb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZwotQ1ZTIHJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUKLWF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L3A+Ci0KLTxwPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluCi1mcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEKLWJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkCi1tYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzCi1hbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQKLXdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkCi0iZmVhdHVyZXMiLjwvcD4KLQotPHA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuCi1GaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kCi12ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9wPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkCi1iZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4KLUFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEKLURvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nCi1sb2NhdGlvbnM6PC9wPgotCi08dWw+Ci08bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQotPGxpPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbgotUGx1Zy1pbnM8L2xpPgotCi08bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlCi0oIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUKLUZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlCi1zaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZwotdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4KLUZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kCi1GZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IKLXJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YKLXRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkKLVJFRkVSIFRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORAotQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVAotQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YQotaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCi08bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhCi1ocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+Ci1odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4KLQotPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhCi1ocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+Ci1odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQotPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YQotaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORAotQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlCi1MaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0Ci1FY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdAotcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2gKLXlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLAotYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24KLXNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUKLWNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZgotdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotPC9ib2R5PgotPC9odG1sPgotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5kb2NfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5kb2NfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDk5YmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZG9jXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZG9jXzIuMC4wL2NwbC12MTAuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmRvY18yLjAuMC9jcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YWEyMDguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZG9jXzIuMC4wL2NwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9USVRMRT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBWTElOSz0iIzgwMDAwMCI+Ci0KLQotPFAgQUxJR049IkNFTlRFUiI+PEI+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L0I+Ci08UD48Qj48L0I+PEZPTlQgU0laRT0iMyI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMyI+PC9GT05UPjxGT05UIFNJWkU9IjIiPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBDT01NT04gUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4xLiAgREVGSU5JVElPTlM8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxCUiBDTEVBUj0iTEVGVCI+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCSAJY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKQkJYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj53aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5BIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6ICAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Mi4gIEdSQU5UIE9GIFJJR0hUUzwvQj48L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YSkJPC9GT05UPjxGT05UIFNJWkU9IjIiPlN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5iKSAJU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+UmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwODAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuICBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiAgTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gICA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmMpCVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiAgRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5kKQlFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LiA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjMuICBSRVFVSVJFTUVOVFM8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmIpCWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJZWZmZWN0aXZlbHkgZGlzY2xhaW1zPC9GT05UPjxGT05UIFNJWkU9IjIiPiBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkgCWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWlpKTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4Jc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPml2KQlzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmIpCWEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj40LiAgQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiAgV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiAgIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiAgVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuICBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuICBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguICBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiAgSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+NS4gIE5PIFdBUlJBTlRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnRoZSBQcm9ncmFtPC9GT05UPjxGT05UIFNJWkU9IjIiPiBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9uczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjYuICBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj43LiAgR0VORVJBTDwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhIENvbnRyaWJ1dG9yIHdpdGggcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQgYnkgdGhhdCBDb250cmlidXRvciB0byBzdWNoIFJlY2lwaWVudCB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgSW4gYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuICBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuICBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuICAgSUJNIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj52ZXJzaW9uLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uPC9GT05UPjxGT05UIFNJWkU9IjIiPiAgQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuICBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLQotPC9CT0RZPgotCi08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZG9jXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5kb2NfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0ZDYzOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5kb2NfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmRvY18yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5kb2NfMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGE3ZDFkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmRvY18yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAvKioKLSMgICogPGNvcHlyaWdodD4KLSMgICoKLSMgICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAgKiAKLSMgICogQ29udHJpYnV0b3JzOiAKLSMgICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICoKLSMgICogPC9jb3B5cmlnaHQ+Ci0jICAqCi0jICAqICRJZDogZmVhdHVyZS5wcm9wZXJ0aWVzLHYgMS4xIDIwMDQvMTAvMTggMTU6NTA6NDIgZGJpcnNhbiBFeHAgJCAKLSMgICovCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBUaGlzIGZpbGUgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUVNRiBTZXJ2aWNlIERhdGEgT2JqZWN0cyAoU0RPKSBEb2N1bWVudGF0aW9uCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlLm9yZyB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RU1GIFNlcnZpY2UgRGF0YSBPYmplY3RzIChTRE8pIERvY3VtZW50YXRpb24KLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRS5PUkcgU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLTE0dGggQXVndXN0LCAyMDAzXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotRUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmdcblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJDUEwiKS4gQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi1Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHNcblwKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3JcblwKLW1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZVxuXAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzXG5cCi1hcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluXG5cCi1kaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIFN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5kb2NfMi4wLjAvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5kb2NfMi4wLjAvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZmI0NGEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZG9jXzIuMC4wL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IGZlYXR1cmUueG1sLHYgMS4yIDIwMDQvMDMvMjYgMTU6MzI6MTMgbWFyY2Vsb3AgRXhwICQKLSAqLwotLS0+Ci0KLTxmZWF0dXJlCi0JaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZG9jIgotICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgdmVyc2lvbj0iMi4wLjAiCi0gICAgaW1hZ2U9ICJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIgotICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0JPGRlc2NyaXB0aW9uPgotICAgIAklZGVzY3JpcHRpb24KLQk8L2Rlc2NyaXB0aW9uPgotCi0gICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0JCSVsaWNlbnNlCi0JPC9saWNlbnNlPgotCi0JPHVybD4KLQkJPHVwZGF0ZSB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcyIgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIvPgotCTwvdXJsPgotCi0JPHBsdWdpbgotCQlpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5kb2MiCi0gICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgIGluc3RhbGwtc2l6ZT0iMCIgICAJCQotCQl2ZXJzaW9uPSIyLjAuMCIvPgotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZG9jXzIuMC4wL2xpY2Vuc2UuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmRvY18yLjAuMC9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmOGMzODAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZG9jXzIuMC4wL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD4xNHRoIEF1Z3VzdCwgMjAwMzwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0KLTxwPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mICB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiAgIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMKLSAgIG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LjwvcD4KLSAgCi08cD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L3A+Ci0gIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7LgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IEVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNvdXJjZV8yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNvdXJjZV8yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0OTliYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zb3VyY2VfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zb3VyY2VfMi4wLjAvY3BsLXYxMC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uc291cmNlXzIuMC4wL2NwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhYTIwOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zb3VyY2VfMi4wLjAvY3BsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L1RJVExFPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFZMSU5LPSIjODAwMDAwIj4KLQotCi08UCBBTElHTj0iQ0VOVEVSIj48Qj5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvQj4KLTxQPjxCPjwvQj48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIENPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiAgQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjEuICBERUZJTklUSU9OUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0aW9uIiBtZWFuczo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPEJSIENMRUFSPSJMRUZUIj4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJIAljaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpCQlhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogIChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4yLiAgR1JBTlQgT0YgUklHSFRTPC9CPjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5hKQk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+U3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50czwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmIpIAlTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDA4MDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiAgVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uICBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAgIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YykJUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiAgRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiAgQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuICBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmQpCUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PEI+My4gIFJFUVVJUkVNRU5UUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQllZmZlY3RpdmVseSBkaXNjbGFpbXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKSAJZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paWkpPC9GT05UPjxGT05UIFNJWkU9IjIiPglzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aXYpCXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjQuICBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuICBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuICAgVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuICBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuICBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiAgVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj41LiAgTk8gV0FSUkFOVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGhlIFByb2dyYW08L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPnByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zPC9GT05UPjxGT05UIFNJWkU9IjIiPi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+Ni4gIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgPC9GT05UPjxGT05UIFNJWkU9IjIiPihJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksPC9GT05UPjxGT05UIFNJWkU9IjIiPiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjcuICBHRU5FUkFMPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3Igd2l0aCByZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICBJbiBhZGRpdGlvbiwgaWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCAgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIElCTSBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gICBJQk0gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnZlcnNpb24uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5ieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlPC9GT05UPjxGT05UIFNJWkU9IjIiPi48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+ICBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotCi08L0JPRFk+Ci0KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zb3VyY2VfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNvdXJjZV8yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTRkNjM5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNvdXJjZV8yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uc291cmNlXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNvdXJjZV8yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYmIxY2IuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uc291cmNlXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIC8qKgotIyAgKiA8Y29weXJpZ2h0PgotIyAgKgotIyAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0jICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0jICAqIAotIyAgKiBDb250cmlidXRvcnM6IAotIyAgKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgKgotIyAgKiA8L2NvcHlyaWdodD4KLSMgICoKLSMgICogJElkOiBmZWF0dXJlLnByb3BlcnRpZXMsdiAxLjEgMjAwNC8xMC8xOCAxNTo1MDo0MiBkYmlyc2FuIEV4cCAkIAotIyAgKi8KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIFRoaXMgZmlsZSBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RU1GIFNlcnZpY2UgRGF0YSBPYmplY3RzIChTRE8pIFNvdXJjZQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZS5vcmcgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUVNRiBTZXJ2aWNlIERhdGEgT2JqZWN0cyAoU0RPKSBTb3VyY2UKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRS5PUkcgU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLTE0dGggQXVndXN0LCAyMDAzXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotRUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmdcblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJDUEwiKS4gQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi1Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHNcblwKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3JcblwKLW1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZVxuXAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzXG5cCi1hcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluXG5cCi1kaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIFN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zb3VyY2VfMi4wLjAvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zb3VyY2VfMi4wLjAvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNWQ4N2QuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uc291cmNlXzIuMC4wL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlIHByaW1hcnk9ImZhbHNlIiAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIiBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zb3VyY2UiICB2ZXJzaW9uPSIyLjAuMCI+Ci0JPGRlc2NyaXB0aW9uID4KLQkJJWRlc2NyaXB0aW9uCi0JPC9kZXNjcmlwdGlvbj4KLQk8Y29weXJpZ2h0IHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPgotCQlDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotCTwvY29weXJpZ2h0PgotCTxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotCQklbGljZW5zZQotCTwvbGljZW5zZT4KLQk8dXJsPgotCQk8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLyIvPgotCQk8ZGlzY292ZXJ5IGxhYmVsPSIlc2Vjb25kYXJ5VXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL2VtZi91cGRhdGVzLyIvPgotCTwvdXJsPgotCTxwbHVnaW4gICAgZnJhZ21lbnQ9ImZhbHNlIiAgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zb3VyY2UiIHZlcnNpb249IjIuMC4wIi8+Ci08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zb3VyY2VfMi4wLjAvbGljZW5zZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uc291cmNlXzIuMC4wL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY4YzM4MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zb3VyY2VfMi4wLjAvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPjE0dGggQXVndXN0LCAyMDAzPC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPkVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuICAgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcwotICAgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90OyBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuPC9wPgotICAKLTxwPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvcD4KLSAgCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG9fMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkb18yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0OTliYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkb18yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvXzIuMC4wL2NwbC12MTAuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvXzIuMC4wL2NwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhYTIwOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkb18yLjAuMC9jcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvVElUTEU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgVkxJTks9IiM4MDAwMDAiPgotCi0KLTxQIEFMSUdOPSJDRU5URVIiPjxCPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9CPgotPFA+PEI+PC9CPjxGT05UIFNJWkU9IjMiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjMiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ09NTU9OIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuICBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+MS4gIERFRklOSVRJT05TPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRpb24iIG1lYW5zOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8QlIgQ0xFQVI9IkxFRlQiPgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQkgCWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkJCWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+QSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAgKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjIuICBHUkFOVCBPRiBSSUdIVFM8L0I+PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmEpCTwvRk9OVD48Rk9OVCBTSVpFPSIyIj5TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YikgCVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgPC9GT05UPjxGT05UIFNJWkU9IjIiPlJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDgwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uICBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuICAgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5jKQlSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuICBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+ZCkJRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4gPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48Qj4zLiAgUkVRVUlSRU1FTlRTPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCWVmZmVjdGl2ZWx5IGRpc2NsYWltczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpIAllZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpaSk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+CXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pdikJc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+NC4gIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gICBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiAgSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiAgVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiAgVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuICBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjUuICBOTyBXQVJSQU5UWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aGUgUHJvZ3JhbTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50PC9GT05UPjxGT05UIFNJWkU9IjIiPiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj42LiAgRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+KElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Ny4gIEdFTkVSQUw8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYSBDb250cmlidXRvciB3aXRoIHJlc3BlY3QgdG8gYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gIEluIGFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiAgSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiAgSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkICBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiAgIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dmVyc2lvbi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPmJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2U8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiAgRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci0KLTwvQk9EWT4KLQotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkb18yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTRkNjM5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkb18yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkb18yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MmYzYjkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG9fMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgLyoqCi0jICAqIDxjb3B5cmlnaHQ+Ci0jICAqCi0jICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgICogCi0jICAqIENvbnRyaWJ1dG9yczogCi0jICAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAqCi0jICAqIDwvY29weXJpZ2h0PgotIyAgKgotIyAgKiAkaWQkCi0jICAqLwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgVGhpcyBmaWxlIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1FTUYgU2VydmljZSBEYXRhIE9iamVjdHMgKFNETykKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPUVjbGlwc2Uub3JnIHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1FTUYgU2VydmljZSBEYXRhIE9iamVjdHMgKFNETykuCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UuT1JHIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi0xNHRoIEF1Z3VzdCwgMjAwM1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLUVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiQ1BMIikuIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotQ29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzXG5cCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yXG5cCi1tb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGVcblwKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50c1xuXAotYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpblxuXAotZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBTdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jICJzZWNvbmRhcnlVcGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHNlY29uZGFyeSB1cGRhdGUgc2l0ZSAob24gZG93bmxvYWQuZWNsaXBzZS5vcmcpCi1zZWNvbmRhcnlVcGRhdGVTaXRlTmFtZT1FTUYvU0RPL1hTRCBTZWNvbmRhcnkgVXBkYXRlIFNpdGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvXzIuMC4wL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG9fMi4wLjAvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNDY2MmIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG9fMi4wLjAvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMC4wIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0IHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPgotICAgICAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi1BbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLyIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iJXNlY29uZGFyeVVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9lbWYvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiIHZlcnNpb249IjMuMC4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIgdmVyc2lvbj0iMi4wLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbmouc2RvIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmVkaXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZWRpdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvXzIuMC4wL2xpY2Vuc2UuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvXzIuMC4wL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY4YzM4MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkb18yLjAuMC9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+MTR0aCBBdWd1c3QsIDIwMDM8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+RUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08cD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiAgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gICBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzCi0gICBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7IGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy48L3A+Ci0gIAotPHA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9wPgotICAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90Oy4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNka18yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc2RrXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQ5OWJjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc2RrXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zZGtfMi4wLjAvY3BsLXYxMC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zZGtfMi4wLjAvY3BsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTQxNmMxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc2RrXzIuMC4wL2NwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJIVE1MIFRpZHksIHNlZSB3d3cudzMub3JnIiAvPgotPHRpdGxlPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIKLWNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIiAvPgotPC9oZWFkPgotPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiIgdmxpbms9IiM4MDAwMDAiPgotPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiBjZW50ZXIiPkNvbW1vbiBQdWJsaWMKLUxpY2Vuc2UgLSB2IDEuMDwvcD4KLQotPHA+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTCi1DT01NT04gUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SCi1ESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRgotVEhJUyBBR1JFRU1FTlQuPC9wPgotCi08cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjEuIERFRklOSVRJT05TPC9wPgotCi08cD4iQ29udHJpYnV0aW9uIiBtZWFuczo8L3A+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsCi1Db250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlcgotdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj0iTEVGVCIgLz4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+aSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zCi10byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQKLXBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEKLUNvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yCi1pdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zCi1kbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUKLW1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbQotdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLjwvZGl2PgotCi08cD4iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlCi1Qcm9ncmFtLjwvcD4KLQotPHA+IkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhCi1Db250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZgotaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uPC9wPgotCi08cD4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoCi10aGlzIEFncmVlbWVudC48L3A+Ci0KLTxwPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcwotQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3A+Ci0KLTxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+Mi4gR1JBTlQgT0YgUklHSFRTPC9wPgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5hKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzCi1BZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYQotbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8KLXJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseQotcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZAotb2JqZWN0IGNvZGUgZm9ybS48L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcwotQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEKLW5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyCi1MaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZAotb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbgotc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkKLXRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlCi10aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mCi10aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlCi1MaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlcgotY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuPC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0Ci1hbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMKLXNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueQotbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZAotb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhCi1jb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwKLWVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueQotb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsIGlmCi1hIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0bwotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZQotdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0Ci10byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzCi1Db250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuPC9kaXY+Ci0KLTxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+My4gUkVRVUlSRU1FTlRTPC9wPgotCi08cD5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QKLWNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvcD4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5pKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mCi1hbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZAotaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQKLW5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZgotbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTs8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+aWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZgotYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LAotaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcwotbG9zdCBwcm9maXRzOzwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5paWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoCi1kaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lCi1hbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPml2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlCi1Qcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcwotaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0KLWN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjwvZGl2PgotCi08cD5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9wPgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5hKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyCi10aGlzIEFncmVlbWVudDsgYW5kPC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlCi1pbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS48L2Rpdj4KLQotPHA+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcwotY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzCi1Db250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50Ci1SZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uPC9wPgotCi08cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9wPgotCi08cD5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4KLXJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kCi10aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlCi1jb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyCi13aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLgotVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKQotaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvcgotKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMKLShjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQKLUNvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMKLXNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwKLW9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIgdG8gcXVhbGlmeSwKLWFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50Ci1uZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55Ci1zdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3A+Ci0KLTxwPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYQotY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcwotcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwKLXRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsCi1Db250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkKLWFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZQotZGFtYWdlcy48L3A+Ci0KLTxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+NS4gTk8gV0FSUkFOVFk8L3A+Ci0KLTxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUwotUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YKLUFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLAotQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQKLWlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZwotYW5kIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoCi1pdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdAotbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGgKLWFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LAotYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLjwvcD4KLQotPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvcD4KLQotPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIKLVJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQotRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi1EQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VECi1BTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KLUFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRQotRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvcD4KLQotPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj43LiBHRU5FUkFMPC9wPgotCi08cD5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZQotdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kCi13aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwKLWJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbgotdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvcD4KLQotPHA+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhIENvbnRyaWJ1dG9yCi13aXRoIHJlc3BlY3QgdG8gYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEKLWNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLWdyYW50ZWQgYnkgdGhhdCBDb250cmlidXRvciB0byBzdWNoIFJlY2lwaWVudCB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gSW4KLWFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueQotZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlCi1Qcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzCi1wYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikKLXNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuPC9wPgotCi08cD5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZgotaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mCi10aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbAotUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcwotdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5Ci1wcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLWFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwKLWNvbnRpbnVlIGFuZCBzdXJ2aXZlLjwvcD4KLQotPHA+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMKLUFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUKLUFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucwotKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUKLW90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMKLUFncmVlbWVudC4gSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBJQk0gbWF5IGFzc2lnbiB0aGUKLXJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlCi1zZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEKLWRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nCi1Db250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcKLXZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0bwotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3Ci12ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpCi1hYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUKLVByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZQotcmVzZXJ2ZWQuPC9wPgotCi08cD5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsKLWFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4KLU5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoCi1wYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZwotbGl0aWdhdGlvbi48L3A+Ci08L2JvZHk+Ci08L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc2RrXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNka18yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGUzZTAyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc2RrXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNka18yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNka18yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NDc3NWMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zZGtfMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgLyoqCi0jICAqIDxjb3B5cmlnaHQ+Ci0jICAqCi0jICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgICogCi0jICAqIENvbnRyaWJ1dG9yczogCi0jICAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAqCi0jICAqIDwvY29weXJpZ2h0PgotIyAgKgotIyAgKiAkSWQ6IGZlYXR1cmUucHJvcGVydGllcyx2IDEuMSAyMDA0LzEwLzE4IDE1OjUwOjQyIGRiaXJzYW4gRXhwICQKLSMgICovCi0KLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1FTUYgU0RLCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlLm9yZyB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249QmluYXJpZXMgYW5kIEFQSSBkb2N1bWVudGF0aW9uIGFuZCBzb3VyY2UgemlwcyBmb3IgRU1GLgotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFLk9SRyBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotMTR0aCBBdWd1c3QsIDIwMDNcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZ1xuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkNQTCIpLiBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLUNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50c1xuXAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvclxuXAotbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlXG5cCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHNcblwKLWFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW5cblwKLWRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gU3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IEVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc2RrXzIuMC4wL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zZGtfMi4wLjAvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MThkZTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zZGtfMi4wLjAvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogZmVhdHVyZS54bWwsdiAxLjIgMjAwNC8wMy8yNSAxNDowNjozNCBtYXJjZWxvcCBFeHAgJAotICovCi0tLT4KLQotPGZlYXR1cmUKLSAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLnNkayIKLSAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgIHZlcnNpb249IjIuMC4wIgotICAgIGltYWdlPSAiZWNsaXBzZV91cGRhdGVfMTIwLmpwZyIKLSAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotCTxkZXNjcmlwdGlvbj4KLSAgICAgICAgJWRlc2NyaXB0aW9uCi0gICAgPC9kZXNjcmlwdGlvbj4KLSAgIAotCTxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgICAlbGljZW5zZQotICAgIDwvbGljZW5zZT4KLQotICAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzIiBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIi8+Ci0gICAgPC91cmw+Ci0KLSAgICA8aW5jbHVkZXMKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZiIKLSAgICAgICAgdmVyc2lvbj0iMi4wLjAiCi0gICAgICAgIG1hdGNoPSJjb21wYXRpYmxlIi8+IAotICAgICAgICAKLSAgICA8aW5jbHVkZXMKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5zb3VyY2UiCi0gICAgICAgIHZlcnNpb249IjIuMC4wIgotICAgICAgICBtYXRjaD0iY29tcGF0aWJsZSIvPiAKLQotICAgIDxpbmNsdWRlcwotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmRvYyIKLSAgICAgICAgdmVyc2lvbj0iMi4wLjAiCi0gICAgICAgIG1hdGNoPSJjb21wYXRpYmxlIi8+ICAgCi0KLSAgICA8aW5jbHVkZXMKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnhzZCIKLSAgICAgICAgdmVyc2lvbj0iMi4wLjAiCi0gICAgICAgIG1hdGNoPSJjb21wYXRpYmxlIi8+IAotCi0gICAgPGluY2x1ZGVzCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS54c2Quc291cmNlIgotICAgICAgICB2ZXJzaW9uPSIyLjAuMCIKLSAgICAgICAgbWF0Y2g9ImNvbXBhdGlibGUiLz4gCi0KLSAgICA8aW5jbHVkZXMKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnhzZC5kb2MiCi0gICAgICAgIHZlcnNpb249IjIuMC4wIgotICAgICAgICBtYXRjaD0iY29tcGF0aWJsZSIvPiAKLQotICAgIDxpbmNsdWRlcwotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkbyIKLSAgICAgICAgdmVyc2lvbj0iMi4wLjAiCi0gICAgICAgIG1hdGNoPSJjb21wYXRpYmxlIi8+IAotCi0gICAgPGluY2x1ZGVzCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnNvdXJjZSIKLSAgICAgICAgdmVyc2lvbj0iMi4wLjAiCi0gICAgICAgIG1hdGNoPSJjb21wYXRpYmxlIi8+IAotCi0gICAgPGluY2x1ZGVzCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmRvYyIKLSAgICAgICAgdmVyc2lvbj0iMi4wLjAiCi0gICAgICAgIG1hdGNoPSJjb21wYXRpYmxlIi8+IAotICAgICAgIAotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc2RrXzIuMC4wL2xpY2Vuc2UuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc2RrXzIuMC4wL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdhNWUxOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNka18yLjAuMC9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iSFRNTCBUaWR5LCBzZWUgd3d3LnczLm9yZyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIKLWNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPSJibHVlIiB2bGluaz0icHVycGxlIj4KLTxoMj5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci0KLTxwPjE0dGggQXVndXN0LCAyMDAzPC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPkVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04KLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkKLSJDT05URU5UIikuIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5ECi1DT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YKLUxJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWQotVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTCi1HT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWQotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAotQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMKLUFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZCi1OT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgotCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkKLUVjbGlwc2Uub3JnIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLXRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJDUEwiKS4gQSBjb3B5IG9mIHRoZSBDUEwgaXMKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YQotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0Ci1jb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZwotQ1ZTIHJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUKLWF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L3A+Ci0KLTxwPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluCi1mcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEKLWJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkCi1tYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzCi1hbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQKLXdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkCi0iZmVhdHVyZXMiLjwvcD4KLQotPHA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuCi1GaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kCi12ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9wPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkCi1iZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4KLUFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEKLURvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nCi1sb2NhdGlvbnM6PC9wPgotCi08dWw+Ci08bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQotPGxpPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbgotUGx1Zy1pbnM8L2xpPgotCi08bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlCi0oIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUKLUZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlCi1zaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZwotdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4KLUZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kCi1GZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IKLXJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YKLXRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkKLVJFRkVSIFRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORAotQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVAotQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YQotaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCi08bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhCi1ocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+Ci1odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4KLQotPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhCi1ocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+Ci1odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQotPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YQotaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORAotQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlCi1MaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0Ci1FY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdAotcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2gKLXlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLAotYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24KLXNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUKLWNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZgotdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotPC9ib2R5PgotPC9odG1sPgotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNvdXJjZV8yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc291cmNlXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQ5OWJjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc291cmNlXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zb3VyY2VfMi4wLjAvY3BsLXYxMC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zb3VyY2VfMi4wLjAvY3BsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTQxNmMxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc291cmNlXzIuMC4wL2NwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJIVE1MIFRpZHksIHNlZSB3d3cudzMub3JnIiAvPgotPHRpdGxlPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIKLWNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIiAvPgotPC9oZWFkPgotPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiIgdmxpbms9IiM4MDAwMDAiPgotPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiBjZW50ZXIiPkNvbW1vbiBQdWJsaWMKLUxpY2Vuc2UgLSB2IDEuMDwvcD4KLQotPHA+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTCi1DT01NT04gUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SCi1ESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRgotVEhJUyBBR1JFRU1FTlQuPC9wPgotCi08cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjEuIERFRklOSVRJT05TPC9wPgotCi08cD4iQ29udHJpYnV0aW9uIiBtZWFuczo8L3A+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsCi1Db250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlcgotdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj0iTEVGVCIgLz4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+aSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zCi10byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQKLXBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEKLUNvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yCi1pdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zCi1kbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUKLW1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbQotdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLjwvZGl2PgotCi08cD4iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlCi1Qcm9ncmFtLjwvcD4KLQotPHA+IkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhCi1Db250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZgotaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uPC9wPgotCi08cD4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoCi10aGlzIEFncmVlbWVudC48L3A+Ci0KLTxwPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcwotQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3A+Ci0KLTxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+Mi4gR1JBTlQgT0YgUklHSFRTPC9wPgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5hKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzCi1BZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYQotbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8KLXJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseQotcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZAotb2JqZWN0IGNvZGUgZm9ybS48L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcwotQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEKLW5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyCi1MaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZAotb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbgotc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkKLXRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlCi10aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mCi10aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlCi1MaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlcgotY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuPC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0Ci1hbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMKLXNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueQotbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZAotb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhCi1jb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwKLWVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueQotb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsIGlmCi1hIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0bwotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZQotdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0Ci10byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzCi1Db250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuPC9kaXY+Ci0KLTxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+My4gUkVRVUlSRU1FTlRTPC9wPgotCi08cD5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QKLWNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvcD4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5pKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mCi1hbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZAotaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQKLW5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZgotbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTs8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+aWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZgotYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LAotaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcwotbG9zdCBwcm9maXRzOzwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5paWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoCi1kaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lCi1hbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPml2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlCi1Qcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcwotaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0KLWN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjwvZGl2PgotCi08cD5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9wPgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5hKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyCi10aGlzIEFncmVlbWVudDsgYW5kPC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlCi1pbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS48L2Rpdj4KLQotPHA+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcwotY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzCi1Db250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50Ci1SZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uPC9wPgotCi08cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9wPgotCi08cD5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4KLXJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kCi10aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlCi1jb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyCi13aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLgotVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKQotaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvcgotKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMKLShjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQKLUNvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMKLXNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwKLW9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIgdG8gcXVhbGlmeSwKLWFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50Ci1uZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55Ci1zdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3A+Ci0KLTxwPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYQotY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcwotcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwKLXRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsCi1Db250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkKLWFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZQotZGFtYWdlcy48L3A+Ci0KLTxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+NS4gTk8gV0FSUkFOVFk8L3A+Ci0KLTxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUwotUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YKLUFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLAotQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQKLWlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZwotYW5kIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoCi1pdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdAotbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGgKLWFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LAotYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLjwvcD4KLQotPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvcD4KLQotPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIKLVJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQotRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi1EQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VECi1BTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KLUFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRQotRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvcD4KLQotPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj43LiBHRU5FUkFMPC9wPgotCi08cD5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZQotdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kCi13aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwKLWJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbgotdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvcD4KLQotPHA+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhIENvbnRyaWJ1dG9yCi13aXRoIHJlc3BlY3QgdG8gYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEKLWNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLWdyYW50ZWQgYnkgdGhhdCBDb250cmlidXRvciB0byBzdWNoIFJlY2lwaWVudCB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gSW4KLWFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueQotZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlCi1Qcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzCi1wYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikKLXNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuPC9wPgotCi08cD5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZgotaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mCi10aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbAotUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcwotdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5Ci1wcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLWFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwKLWNvbnRpbnVlIGFuZCBzdXJ2aXZlLjwvcD4KLQotPHA+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMKLUFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUKLUFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucwotKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUKLW90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMKLUFncmVlbWVudC4gSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBJQk0gbWF5IGFzc2lnbiB0aGUKLXJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlCi1zZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEKLWRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nCi1Db250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcKLXZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0bwotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3Ci12ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpCi1hYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUKLVByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZQotcmVzZXJ2ZWQuPC9wPgotCi08cD5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsKLWFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4KLU5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoCi1wYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZwotbGl0aWdhdGlvbi48L3A+Ci08L2JvZHk+Ci08L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc291cmNlXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNvdXJjZV8yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGUzZTAyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc291cmNlXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNvdXJjZV8yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNvdXJjZV8yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZjA3ZWQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zb3VyY2VfMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgLyoqCi0jICAqIDxjb3B5cmlnaHQ+Ci0jICAqCi0jICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgICogCi0jICAqIENvbnRyaWJ1dG9yczogCi0jICAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAqCi0jICAqIDwvY29weXJpZ2h0PgotIyAgKgotIyAgKiAkSWQ6IGZlYXR1cmUucHJvcGVydGllcyx2IDEuMSAyMDA0LzEwLzE4IDE1OjUwOjQyIGRiaXJzYW4gRXhwICQKLSMgICovCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBUaGlzIGZpbGUgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUVjbGlwc2UgTW9kZWxpbmcgRnJhbWV3b3JrIChFTUYpIFNvdXJjZQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZS5vcmcgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUVjbGlwc2UgTW9kZWxpbmcgRnJhbWV3b3JrLiAoc291cmNlIGNvZGUpCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UuT1JHIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi0xNHRoIEF1Z3VzdCwgMjAwM1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLUVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiQ1BMIikuIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotQ29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzXG5cCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yXG5cCi1tb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGVcblwKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50c1xuXAotYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpblxuXAotZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBTdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5zb3VyY2VfMi4wLjAvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNvdXJjZV8yLjAuMC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIwMDIxNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNvdXJjZV8yLjAuMC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZSBwcmltYXJ5PSJmYWxzZSIgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyIgaWQ9Im9yZy5lY2xpcHNlLmVtZi5zb3VyY2UiICB2ZXJzaW9uPSIyLjAuMCI+Ci0JPGRlc2NyaXB0aW9uID4KLQkJJWRlc2NyaXB0aW9uCi0JPC9kZXNjcmlwdGlvbj4KLQk8Y29weXJpZ2h0IHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPgotCQlDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotCTwvY29weXJpZ2h0PgotCTxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotCQklbGljZW5zZQotCTwvbGljZW5zZT4KLQk8dXJsPgotCQk8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLyIvPgotCQk8ZGlzY292ZXJ5IGxhYmVsPSIlc2Vjb25kYXJ5VXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL2VtZi91cGRhdGVzLyIvPgotCTwvdXJsPgotCTxwbHVnaW4gICAgZnJhZ21lbnQ9ImZhbHNlIiAgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UuZW1mLnNvdXJjZSIgdmVyc2lvbj0iMi4wLjAiLz4KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc291cmNlXzIuMC4wL2xpY2Vuc2UuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc291cmNlXzIuMC4wL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdhNWUxOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnNvdXJjZV8yLjAuMC9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iSFRNTCBUaWR5LCBzZWUgd3d3LnczLm9yZyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIKLWNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPSJibHVlIiB2bGluaz0icHVycGxlIj4KLTxoMj5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci0KLTxwPjE0dGggQXVndXN0LCAyMDAzPC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPkVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04KLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkKLSJDT05URU5UIikuIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5ECi1DT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YKLUxJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWQotVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTCi1HT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWQotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAotQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMKLUFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZCi1OT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLQotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgotCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkKLUVjbGlwc2Uub3JnIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLXRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJDUEwiKS4gQSBjb3B5IG9mIHRoZSBDUEwgaXMKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YQotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0Ci1jb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZwotQ1ZTIHJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUKLWF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L3A+Ci0KLTxwPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluCi1mcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEKLWJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkCi1tYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzCi1hbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQKLXdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkCi0iZmVhdHVyZXMiLjwvcD4KLQotPHA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuCi1GaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kCi12ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9wPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkCi1iZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4KLUFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEKLURvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nCi1sb2NhdGlvbnM6PC9wPgotCi08dWw+Ci08bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQotPGxpPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbgotUGx1Zy1pbnM8L2xpPgotCi08bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlCi0oIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUKLUZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlCi1zaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZwotdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4KLUZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kCi1GZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IKLXJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YKLXRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkKLVJFRkVSIFRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORAotQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVAotQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YQotaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCi08bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhCi1ocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+Ci1odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4KLQotPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhCi1ocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+Ci1odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQotPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YQotaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORAotQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlCi1MaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0Ci1FY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdAotcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2gKLXlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLAotYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24KLXNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUKLWNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZgotdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotPC9ib2R5PgotPC9odG1sPgotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZl8yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0OTliYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZl8yLjAuMC9jcGwtdjEwLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mXzIuMC4wL2NwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU0MTZjMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mXzIuMC4wL2NwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJIVE1MIFRpZHksIHNlZSB3d3cudzMub3JnIiAvPgotPHRpdGxlPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIKLWNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIiAvPgotPC9oZWFkPgotPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiIgdmxpbms9IiM4MDAwMDAiPgotPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiBjZW50ZXIiPkNvbW1vbiBQdWJsaWMKLUxpY2Vuc2UgLSB2IDEuMDwvcD4KLQotPHA+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTCi1DT01NT04gUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SCi1ESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRgotVEhJUyBBR1JFRU1FTlQuPC9wPgotCi08cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjEuIERFRklOSVRJT05TPC9wPgotCi08cD4iQ29udHJpYnV0aW9uIiBtZWFuczo8L3A+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsCi1Db250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlcgotdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj0iTEVGVCIgLz4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+aSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zCi10byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQKLXBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEKLUNvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yCi1pdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zCi1kbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUKLW1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbQotdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLjwvZGl2PgotCi08cD4iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlCi1Qcm9ncmFtLjwvcD4KLQotPHA+IkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhCi1Db250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZgotaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uPC9wPgotCi08cD4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoCi10aGlzIEFncmVlbWVudC48L3A+Ci0KLTxwPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcwotQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3A+Ci0KLTxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+Mi4gR1JBTlQgT0YgUklHSFRTPC9wPgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5hKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzCi1BZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYQotbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8KLXJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseQotcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZAotb2JqZWN0IGNvZGUgZm9ybS48L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcwotQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEKLW5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyCi1MaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZAotb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbgotc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkKLXRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlCi10aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mCi10aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlCi1MaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlcgotY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuPC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0Ci1hbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMKLXNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueQotbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZAotb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhCi1jb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwKLWVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueQotb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsIGlmCi1hIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0bwotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZQotdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0Ci10byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzCi1Db250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuPC9kaXY+Ci0KLTxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+My4gUkVRVUlSRU1FTlRTPC9wPgotCi08cD5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QKLWNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvcD4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+YikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5pKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mCi1hbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZAotaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQKLW5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZgotbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTs8L2Rpdj4KLQotPGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+aWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZgotYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LAotaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcwotbG9zdCBwcm9maXRzOzwvZGl2PgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5paWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoCi1kaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lCi1hbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPml2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlCi1Qcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcwotaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0KLWN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjwvZGl2PgotCi08cD5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9wPgotCi08ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogMmVtIj5hKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyCi10aGlzIEFncmVlbWVudDsgYW5kPC9kaXY+Ci0KLTxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiAyZW0iPmIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlCi1pbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS48L2Rpdj4KLQotPHA+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcwotY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS48L3A+Ci0KLTxwPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzCi1Db250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50Ci1SZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uPC9wPgotCi08cCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9wPgotCi08cD5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4KLXJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kCi10aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlCi1jb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyCi13aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLgotVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKQotaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvcgotKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMKLShjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQKLUNvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMKLXNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwKLW9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIgdG8gcXVhbGlmeSwKLWFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50Ci1uZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55Ci1zdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3A+Ci0KLTxwPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYQotY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcwotcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwKLXRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsCi1Db250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkKLWFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZQotZGFtYWdlcy48L3A+Ci0KLTxwIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+NS4gTk8gV0FSUkFOVFk8L3A+Ci0KLTxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUwotUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YKLUFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLAotQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQKLWlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZwotYW5kIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoCi1pdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdAotbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGgKLWFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LAotYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLjwvcD4KLQotPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvcD4KLQotPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIKLVJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQotRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi1EQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VECi1BTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KLUFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRQotRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvcD4KLQotPHAgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj43LiBHRU5FUkFMPC9wPgotCi08cD5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZQotdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kCi13aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwKLWJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbgotdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvcD4KLQotPHA+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhIENvbnRyaWJ1dG9yCi13aXRoIHJlc3BlY3QgdG8gYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEKLWNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLWdyYW50ZWQgYnkgdGhhdCBDb250cmlidXRvciB0byBzdWNoIFJlY2lwaWVudCB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gSW4KLWFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueQotZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlCi1Qcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzCi1wYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikKLXNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuPC9wPgotCi08cD5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZgotaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mCi10aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbAotUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcwotdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5Ci1wcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLWFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwKLWNvbnRpbnVlIGFuZCBzdXJ2aXZlLjwvcD4KLQotPHA+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMKLUFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUKLUFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucwotKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUKLW90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMKLUFncmVlbWVudC4gSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBJQk0gbWF5IGFzc2lnbiB0aGUKLXJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlCi1zZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEKLWRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nCi1Db250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcKLXZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0bwotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3Ci12ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpCi1hYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUKLVByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZQotcmVzZXJ2ZWQuPC9wPgotCi08cD5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsKLWFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4KLU5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoCi1wYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZwotbGl0aWdhdGlvbi48L3A+Ci08L2JvZHk+Ci08L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWZfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWZfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhlM2UwMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mXzIuMC4wL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWZfMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yzk0N2E0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWZfMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgLyoqCi0jICAqIDxjb3B5cmlnaHQ+Ci0jICAqCi0jICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgICogCi0jICAqIENvbnRyaWJ1dG9yczogCi0jICAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAqCi0jICAqIDwvY29weXJpZ2h0PgotIyAgKgotIyAgKiAkSWQ6IGZlYXR1cmUucHJvcGVydGllcyx2IDEuMSAyMDA0LzEwLzE4IDE1OjUwOjQyIGRiaXJzYW4gRXhwICQKLSMgICovCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBUaGlzIGZpbGUgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUVjbGlwc2UgTW9kZWxpbmcgRnJhbWV3b3JrIChFTUYpCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlLm9yZyB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RWNsaXBzZSBNb2RlbGluZyBGcmFtZXdvcmsuIChCaW5hcnkgcnVudGltZSkKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRS5PUkcgU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLTE0dGggQXVndXN0LCAyMDAzXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotRUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmdcblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJDUEwiKS4gQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi1Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHNcblwKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3JcblwKLW1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZVxuXAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzXG5cCi1hcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluXG5cCi1kaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIFN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgInNlY29uZGFyeVVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgc2Vjb25kYXJ5IHVwZGF0ZSBzaXRlIChvbiBkb3dubG9hZC5lY2xpcHNlLm9yZykKLXNlY29uZGFyeVVwZGF0ZVNpdGVOYW1lPUVNRi9TRE8vWFNEIFNlY29uZGFyeSBVcGRhdGUgU2l0ZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZl8yLjAuMC9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWZfMi4wLjAvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNTlmMzcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZl8yLjAuMC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4wLjAiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+Ci0gICAgICBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSIlc2Vjb25kYXJ5VXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3Rvb2xzL2VtZi91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIgdmVyc2lvbj0iMy4wLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29kZWdlbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLmVjb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5lY29yZS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmVkaXRvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmNoYW5nZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmNoYW5nZS5lZGl0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWRpdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZy51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyZWNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLmVjb3JlMmVjb3JlLmVkaXRvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mXzIuMC4wL2xpY2Vuc2UuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWZfMi4wLjAvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2E1ZTE4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWZfMi4wLjAvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkhUTUwgVGlkeSwgc2VlIHd3dy53My5vcmciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiCi1jb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSIgLz4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz0iYmx1ZSIgdmxpbms9InB1cnBsZSI+Ci08aDI+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotCi08cD4xNHRoIEF1Z3VzdCwgMjAwMzwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZCi0iQ09OVEVOVCIpLiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORAotQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GCi1MSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkKLVVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUwotR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKLUJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTCi1BR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWQotTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0KLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KLQotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5Ci1FY2xpcHNlLm9yZyBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi10aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiQ1BMIikuIEEgY29weSBvZiB0aGUgQ1BMIGlzCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdAotY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcKLUNWUyByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlCi1hdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9wPgotCi08cD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbgotZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhCi1idW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZAotbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcwotYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkCi13aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcwotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZAotImZlYXR1cmVzIi48L3A+Ci0KLTxwPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLgotRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZAotdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvcD4KLQotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZAotYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuCi1BYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhCi1Eb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZwotbG9jYXRpb25zOjwvcD4KLQotPHVsPgotPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0KLTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0KLTxsaT5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4KLVBsdWctaW5zPC9saT4KLQotPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZQotKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlCi1GZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZQotc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcKLXRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uCi1GZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZgotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZAotRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yCi1yZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mCi10aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZCi1SRUZFUiBUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQKLUNPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQKLUFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci08bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEKLWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQotPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YQotaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPgotaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+Ci0KLTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YQotaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPgotaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0KLTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEKLWhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQKLUNPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZQotTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdAotRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQKLXBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoCi15b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwKLWFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uCi1zb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlCi1jb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLXBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYKLXRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC1mZWF0dXJlLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC1mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzJiODIyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQtZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC1mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC1mZWF0dXJlL2NwbC12MTAuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQtZmVhdHVyZS9jcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YWEyMDguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC1mZWF0dXJlL2NwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9USVRMRT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBWTElOSz0iIzgwMDAwMCI+Ci0KLQotPFAgQUxJR049IkNFTlRFUiI+PEI+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L0I+Ci08UD48Qj48L0I+PEZPTlQgU0laRT0iMyI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMyI+PC9GT05UPjxGT05UIFNJWkU9IjIiPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBDT01NT04gUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4xLiAgREVGSU5JVElPTlM8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxCUiBDTEVBUj0iTEVGVCI+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCSAJY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKQkJYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj53aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5BIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6ICAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Mi4gIEdSQU5UIE9GIFJJR0hUUzwvQj48L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YSkJPC9GT05UPjxGT05UIFNJWkU9IjIiPlN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5iKSAJU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+UmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwODAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuICBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiAgTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gICA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmMpCVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiAgRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5kKQlFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LiA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjMuICBSRVFVSVJFTUVOVFM8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmIpCWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJZWZmZWN0aXZlbHkgZGlzY2xhaW1zPC9GT05UPjxGT05UIFNJWkU9IjIiPiBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkgCWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWlpKTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4Jc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPml2KQlzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmIpCWEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj40LiAgQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiAgV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiAgIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiAgVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuICBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuICBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguICBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiAgSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+NS4gIE5PIFdBUlJBTlRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnRoZSBQcm9ncmFtPC9GT05UPjxGT05UIFNJWkU9IjIiPiBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9uczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjYuICBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj43LiAgR0VORVJBTDwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhIENvbnRyaWJ1dG9yIHdpdGggcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQgYnkgdGhhdCBDb250cmlidXRvciB0byBzdWNoIFJlY2lwaWVudCB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgSW4gYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuICBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuICBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuICAgSUJNIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj52ZXJzaW9uLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uPC9GT05UPjxGT05UIFNJWkU9IjIiPiAgQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuICBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLQotPC9CT0RZPgotCi08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC1mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhlM2UwMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQtZmVhdHVyZS9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQtZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IwYjUzMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LWZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuamR0IgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMS4wIgotICAgICAgaW1hZ2U9ICJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMCIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjAiLz4KLSAgIDwvdXJsPgotCi0gIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIgdmVyc2lvbj0iMy4xLjAiIG1hdGNoPSJjb21wYXRpYmxlIiAvPgotICA8L3JlcXVpcmVzPgotICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiPgotICAgPC9wbHVnaW4+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hbnQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiPgotICAgPC9wbHVnaW4+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCI+Ci0gICA8L3BsdWdpbj4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCI+Ci0gICA8L3BsdWdpbj4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIj4KLSAgIDwvcGx1Z2luPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIj4KLSAgIDwvcGx1Z2luPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LmRlYnVnIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIj4KLSAgIDwvcGx1Z2luPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0Lmp1bml0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIj4KLSAgIDwvcGx1Z2luPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LnJ1bnRpbWUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiPgotICAgPC9wbHVnaW4+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIj4KLSAgIDwvcGx1Z2luPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIj4KLSAgIDwvcGx1Z2luPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmp1bml0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuOC4xIj4KLSAgIDwvcGx1Z2luPgotCi0gICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qZHQuZG9jLnVzZXIiIHZlcnNpb249IjMuMS4wIi8+Ci0KLSAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcubWFjb3N4IiB2ZXJzaW9uPSIzLjEuMCIgIG9zPSJtYWNvc3giIHdzPSJjYXJib24iLz4gIAotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC1mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQtZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZDg1MDAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC1mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD4xNTxzdXA+dGg8L3N1cD4gSnVuZSwgMjAwNDwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0KLTxwPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mICB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiAgIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMKLSAgIG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LjwvcD4KLSAgCi08cD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L3A+Ci0gIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7LgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IEVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC5zb3VyY2UtZmVhdHVyZS8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQuc291cmNlLWZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YWYxODQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC5zb3VyY2UtZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5zb3VyY2UtZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQuc291cmNlLWZlYXR1cmUvY3BsLXYxMC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC5zb3VyY2UtZmVhdHVyZS9jcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1OGQ5OWMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC5zb3VyY2UtZmVhdHVyZS9jcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvVElUTEU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgVkxJTks9IiM4MDAwMDAiPgotCi0KLTxQIEFMSUdOPSJDRU5URVIiPjxCPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9CPgotPFA+PEI+PC9CPjxGT05UIFNJWkU9IjMiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjMiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ09NTU9OIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuICBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+MS4gIERFRklOSVRJT05TPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRpb24iIG1lYW5zOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8QlIgQ0xFQVI9IkxFRlQiPgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQkgCWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkJCWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+QSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAgKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjIuICBHUkFOVCBPRiBSSUdIVFM8L0I+PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmEpCTwvRk9OVD48Rk9OVCBTSVpFPSIyIj5TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YikgCVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgPC9GT05UPjxGT05UIFNJWkU9IjIiPlJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDgwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uICBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuICAgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5jKQlSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuICBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+ZCkJRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4gPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48Qj4zLiAgUkVRVUlSRU1FTlRTPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCWVmZmVjdGl2ZWx5IGRpc2NsYWltczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpIAllZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpaSk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+CXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pdikJc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+NC4gIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gICBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiAgSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiAgVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiAgVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuICBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjUuICBOTyBXQVJSQU5UWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aGUgUHJvZ3JhbTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50PC9GT05UPjxGT05UIFNJWkU9IjIiPiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj42LiAgRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+KElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Ny4gIEdFTkVSQUw8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYSBDb250cmlidXRvciB3aXRoIHJlc3BlY3QgdG8gYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gIEluIGFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiAgSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiAgSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkICBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiAgIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dmVyc2lvbi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPmJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2U8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiAgRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci0KLTwvQk9EWT4KLQotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC5zb3VyY2UtZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC5zb3VyY2UtZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGUzZTAyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQuc291cmNlLWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQuc291cmNlLWZlYXR1cmUvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZS1mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzZhYzg2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQuc291cmNlLWZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUgcHJpbWFyeT0iZmFsc2UiICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIiAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIiAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciIGlkPSJvcmcuZWNsaXBzZS5qZHQuc291cmNlIiAgdmVyc2lvbj0iMy4xLjAiPgotCTxkZXNjcmlwdGlvbiA+Ci0JCSVkZXNjcmlwdGlvbgotCTwvZGVzY3JpcHRpb24+Ci0JPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0JCSVsaWNlbnNlCi0JPC9saWNlbnNlPgotCTx1cmw+Ci0JCTx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4wIi8+Ci0JCTxkaXNjb3ZlcnkgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4wIi8+Ci0JPC91cmw+Ci0JPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5qZHQuZG9jLmlzdiIgdmVyc2lvbj0iMy4xLjAiLz4KLQk8cGx1Z2luICAgIGZyYWdtZW50PSJmYWxzZSIgIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLmpkdC5zb3VyY2UiIHZlcnNpb249IjMuMS4wIi8+Ci0JPHBsdWdpbiB3cz0iY2FyYm9uIiAgb3M9Im1hY29zeCIgZnJhZ21lbnQ9InRydWUiIGFyY2g9InBwYyIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UuamR0LnNvdXJjZS5tYWNvc3guY2FyYm9uLnBwYyIgdmVyc2lvbj0iMy4xLjAiLz4KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQuc291cmNlLWZlYXR1cmUvbGljZW5zZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC5zb3VyY2UtZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZDg1MDAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC5zb3VyY2UtZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+MTU8c3VwPnRoPC9zdXA+IEp1bmUsIDIwMDQ8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+RUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08cD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiAgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gICBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzCi0gICBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7IGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy48L3A+Ci0gIAotPHA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9wPgotICAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90Oy4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUtZmVhdHVyZS8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUtZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIzYTI0ZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLWZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUtZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUtZmVhdHVyZS9jcGwtdjEwLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLWZlYXR1cmUvY3BsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmFhMjA4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUtZmVhdHVyZS9jcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvVElUTEU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgVkxJTks9IiM4MDAwMDAiPgotCi0KLTxQIEFMSUdOPSJDRU5URVIiPjxCPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9CPgotPFA+PEI+PC9CPjxGT05UIFNJWkU9IjMiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjMiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ09NTU9OIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuICBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+MS4gIERFRklOSVRJT05TPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRpb24iIG1lYW5zOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8QlIgQ0xFQVI9IkxFRlQiPgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQkgCWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkJCWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+QSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAgKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjIuICBHUkFOVCBPRiBSSUdIVFM8L0I+PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmEpCTwvRk9OVD48Rk9OVCBTSVpFPSIyIj5TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YikgCVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgPC9GT05UPjxGT05UIFNJWkU9IjIiPlJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDgwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uICBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuICAgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5jKQlSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuICBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+ZCkJRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4gPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48Qj4zLiAgUkVRVUlSRU1FTlRTPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCWVmZmVjdGl2ZWx5IGRpc2NsYWltczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpIAllZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpaSk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+CXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pdikJc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+NC4gIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gICBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiAgSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiAgVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiAgVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuICBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjUuICBOTyBXQVJSQU5UWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aGUgUHJvZ3JhbTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50PC9GT05UPjxGT05UIFNJWkU9IjIiPiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj42LiAgRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+KElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Ny4gIEdFTkVSQUw8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYSBDb250cmlidXRvciB3aXRoIHJlc3BlY3QgdG8gYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gIEluIGFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiAgSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiAgSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkICBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiAgIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dmVyc2lvbi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPmJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2U8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiAgRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci0KLTwvQk9EWT4KLQotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUtZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS1mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZTNlMDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS1mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLWZlYXR1cmUvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLWZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMjIyNjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS1mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UucGRlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMS4wIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMCIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjAiLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0IiB2ZXJzaW9uPSIzLjAuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIgdmVyc2lvbj0iMy4wLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGRlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wZGUuYnVpbGQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBkZS5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wZGUuanVuaXQucnVudGltZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgotICAgICAgICAgCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGRlLnJ1bnRpbWUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBkZS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGRlLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUtZmVhdHVyZS9saWNlbnNlLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLWZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2Q4NTAwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUtZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+MTU8c3VwPnRoPC9zdXA+IEp1bmUsIDIwMDQ8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+RUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08cD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiAgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gICBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzCi0gICBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7IGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy48L3A+Ci0gIAotPHA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9wPgotICAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90Oy4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlLWZlYXR1cmUvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZS1mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGJjZTdiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlLWZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuc291cmNlLWZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZS1mZWF0dXJlL2NwbC12MTAuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlLWZlYXR1cmUvY3BsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmFhMjA4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlLWZlYXR1cmUvY3BsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L1RJVExFPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFZMSU5LPSIjODAwMDAwIj4KLQotCi08UCBBTElHTj0iQ0VOVEVSIj48Qj5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvQj4KLTxQPjxCPjwvQj48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIENPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiAgQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjEuICBERUZJTklUSU9OUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0aW9uIiBtZWFuczo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPEJSIENMRUFSPSJMRUZUIj4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJIAljaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpCQlhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogIChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4yLiAgR1JBTlQgT0YgUklHSFRTPC9CPjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5hKQk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+U3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50czwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmIpIAlTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDA4MDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiAgVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uICBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAgIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YykJUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiAgRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiAgQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuICBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmQpCUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PEI+My4gIFJFUVVJUkVNRU5UUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQllZmZlY3RpdmVseSBkaXNjbGFpbXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKSAJZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paWkpPC9GT05UPjxGT05UIFNJWkU9IjIiPglzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aXYpCXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjQuICBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuICBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuICAgVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuICBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuICBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiAgVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj41LiAgTk8gV0FSUkFOVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGhlIFByb2dyYW08L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPnByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zPC9GT05UPjxGT05UIFNJWkU9IjIiPi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+Ni4gIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgPC9GT05UPjxGT05UIFNJWkU9IjIiPihJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksPC9GT05UPjxGT05UIFNJWkU9IjIiPiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjcuICBHRU5FUkFMPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3Igd2l0aCByZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICBJbiBhZGRpdGlvbiwgaWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCAgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIElCTSBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gICBJQk0gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnZlcnNpb24uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5ieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlPC9GT05UPjxGT05UIFNJWkU9IjIiPi48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+ICBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotCi08L0JPRFk+Ci0KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZS1mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZS1mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZTNlMDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5zb3VyY2UtZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5zb3VyY2UtZmVhdHVyZS9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlLWZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYmJiYzcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5zb3VyY2UtZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZSBwcmltYXJ5PSJmYWxzZSIgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyIgaWQ9Im9yZy5lY2xpcHNlLnBkZS5zb3VyY2UiICB2ZXJzaW9uPSIzLjEuMCI+Ci0JPGRlc2NyaXB0aW9uID4KLQkJJWRlc2NyaXB0aW9uCi0JPC9kZXNjcmlwdGlvbj4KLQk8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLQkJJWxpY2Vuc2UKLQk8L2xpY2Vuc2U+Ci0JPHVybD4KLQkJPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjAiLz4KLQkJPGRpc2NvdmVyeSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjAiLz4KLQk8L3VybD4KLQk8cGx1Z2luICAgIGZyYWdtZW50PSJmYWxzZSIgIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBkZS5zb3VyY2UiIHZlcnNpb249IjMuMS4wIi8+Ci08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZS1mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlLWZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2Q4NTAwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlLWZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPjE1PHN1cD50aDwvc3VwPiBKdW5lLCAyMDA0PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPkVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuICAgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcwotICAgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90OyBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuPC9wPgotICAKLTxwPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvcD4KLSAgCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0tZmVhdHVyZS8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS1mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjUzYzcwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS1mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UucGxhdGZvcm0tZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS1mZWF0dXJlL2NwbC12MTAuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS1mZWF0dXJlL2NwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhYTIwOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0tZmVhdHVyZS9jcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvVElUTEU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgVkxJTks9IiM4MDAwMDAiPgotCi0KLTxQIEFMSUdOPSJDRU5URVIiPjxCPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9CPgotPFA+PEI+PC9CPjxGT05UIFNJWkU9IjMiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjMiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ09NTU9OIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuICBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+MS4gIERFRklOSVRJT05TPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRpb24iIG1lYW5zOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8QlIgQ0xFQVI9IkxFRlQiPgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQkgCWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkJCWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+QSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAgKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjIuICBHUkFOVCBPRiBSSUdIVFM8L0I+PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmEpCTwvRk9OVD48Rk9OVCBTSVpFPSIyIj5TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YikgCVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgPC9GT05UPjxGT05UIFNJWkU9IjIiPlJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDgwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uICBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuICAgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5jKQlSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuICBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+ZCkJRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4gPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48Qj4zLiAgUkVRVUlSRU1FTlRTPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCWVmZmVjdGl2ZWx5IGRpc2NsYWltczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpIAllZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpaSk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+CXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pdikJc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+NC4gIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gICBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiAgSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiAgVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiAgVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuICBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjUuICBOTyBXQVJSQU5UWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aGUgUHJvZ3JhbTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50PC9GT05UPjxGT05UIFNJWkU9IjIiPiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj42LiAgRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+KElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Ny4gIEdFTkVSQUw8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYSBDb250cmlidXRvciB3aXRoIHJlc3BlY3QgdG8gYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gIEluIGFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiAgSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiAgSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkICBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiAgIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dmVyc2lvbi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPmJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2U8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiAgRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci0KLTwvQk9EWT4KLQotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS1mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0tZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGUzZTAyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS1mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0tZmVhdHVyZS9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS1mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzJmNWNiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS1mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzg3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotSW4gdGhlIGZvbGxvd2luZyBtYXJrdXAsIGlnbm9yZSB0aGUgInByaW1hcnkiIGFuZCAiYXBwbGljYXRpb24iIGF0dHJpYnV0ZXMuCi1TZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY4MzUxIGZvciBtb3JlIGRldGFpbHMuCi0tLT4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0iCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4xLjAiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSIiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyIKLSAgICAgIHByaW1hcnk9InRydWUiCi0gICAgICBhcHBsaWNhdGlvbj0ib3JnLmVjbGlwc2UudWkuaWRlLndvcmtiZW5jaCI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjAiLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4wIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYW50IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuNi4yIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmx1Y2VuZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjMuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYW50LmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuYm9vdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjAuMCIvPgotICAgICAgICAgCi0gICA8cGx1Z2luCi0gICAJCSBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycyIKLSAgIAkJIGRvd25sb2FkLXNpemU9IjAiCi0gICAJCSBpbnN0YWxsLXNpemU9IjAiCi0gICAJCSB2ZXJzaW9uPSIzLjEuMCIvPgotICAgCi0gICA8cGx1Z2luCi0gICAJCSBpZD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucyIKLSAgIAkJIGRvd25sb2FkLXNpemU9IjAiCi0gICAJCSBpbnN0YWxsLXNpemU9IjAiCi0gICAJCSB2ZXJzaW9uPSIzLjEuMCIvPgotICAgCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zZ2kiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zZ2kudXRpbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4wLjAiLz4KLSAgICAgICAgIAotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLndlYmFwcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscC5iYXNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLmFwcHNlcnZlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscC5pZGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc2VhcmNoIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMuc3NoIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2gyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudG9tY2F0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjQuMS4zMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGV4dCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamZhY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLQkKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5jb25zb2xlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgotICAgICAgICAgICAgCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaW50cm8iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMC4wIi8+Ci0gICAgICAgICAgICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2giCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCIvPgotICAgICAgICAgCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZm9ybXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4wLjAiLz4KLSAgICAgICAgIAotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4wLjAiLz4KLSAgICAgICAgCi0gIDwhLS0gUHJlLTMuMCBiaW5hcnkgY29tcGF0aWJpbGl0eSAtLT4KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2guY29tcGF0aWJpbGl0eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgPCEtLUFpeCBwbGF0Zm9ybSBpbmNsdXNpb24gLS0+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5tb3RpZiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIzLjEuMCIgZnJhZ21lbnQ9InRydWUiIG9zPSJhaXgiIHdzPSJtb3RpZiIvPgotICAKLSAgPCEtLSBIUFVYIFBsYXRmb3JtIHNwZWNpZmljcyAtLT4KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3d0Lm1vdGlmIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjMuMS4wIiBmcmFnbWVudD0idHJ1ZSIgb3M9ImhwdXgiIHdzPSJtb3RpZiIvPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5ocHV4IiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjMuMC4wIiBmcmFnbWVudD0idHJ1ZSIgb3M9ImhwdXgiLz4KLQotICA8IS0tIExJTlVYIEdUSy0tPiAgCi0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5ndGsiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgdmVyc2lvbj0iMy4xLjAiICBmcmFnbWVudD0idHJ1ZSIgb3M9ImxpbnV4IiB3cz0iZ3RrIiBhcmNoPSJ4ODYiIC8+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5ndGsiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgdmVyc2lvbj0iMy4xLjAiICBmcmFnbWVudD0idHJ1ZSIgb3M9ImxpbnV4IiB3cz0iZ3RrIiBhcmNoPSJwcGMiIC8+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmxpbnV4IiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjMuMC4wIiBmcmFnbWVudD0idHJ1ZSIgb3M9ImxpbnV4Ii8+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4IiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjMuMC4wIiBmcmFnbWVudD0idHJ1ZSIgb3M9ImxpbnV4IiAvPgotCi0gIDwhLS0gTElOVVggR1RLIEFNRDY0LS0+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5ndGs2NCIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIzLjEuMCIgIGZyYWdtZW50PSJ0cnVlIiBvcz0ibGludXgiIHdzPSJndGsiIGFyY2g9ImFtZDY0IiAvPgotCi0gIDwhLS0gTElOVVggTW90aWYtLT4gICAgCi0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5tb3RpZiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIzLjEuMCIgZnJhZ21lbnQ9InRydWUiIG9zPSJsaW51eCIgd3M9Im1vdGlmIi8+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmxpbnV4IiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjMuMC4wIiBmcmFnbWVudD0idHJ1ZSIgb3M9ImxpbnV4Ii8+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4IiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjMuMC4wIiBmcmFnbWVudD0idHJ1ZSIgb3M9ImxpbnV4IiAvPgotCi0gIDwhLS0gTWFjT1MgWCBDYXJib24gLS0+ICAKLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3d0LmNhcmJvbiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIzLjEuMCIgIGZyYWdtZW50PSJ0cnVlIiBvcz0ibWFjb3N4IiB3cz0iY2FyYm9uIi8+IAotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYWNvc3giIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgdmVyc2lvbj0iMy4wLjAiIGZyYWdtZW50PSJ0cnVlIiBvcz0ibWFjb3N4IiB3cz0iY2FyYm9uIi8+Ci0gIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnVpLmNhcmJvbiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIzLjEuMCIgZnJhZ21lbnQ9InRydWUiIG9zPSJtYWNvc3giIHdzPSJjYXJib24iLz4KLSAgCi0gIDwhLS0gUU5YIFBob3RvbiAtLT4KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3d0LnBob3RvbiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIzLjEuMCIgZnJhZ21lbnQ9InRydWUiIG9zPSJxbngiIHdzPSJwaG90b24iLz4KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucW54IiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIHZlcnNpb249IjMuMC4wIiBmcmFnbWVudD0idHJ1ZSIgb3M9InFueCIgd3M9InBob3RvbiIvPgotICAKLSAgPCEtLSBTb2xhcmlzIE1vdGlmIC0tPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QubW90aWYiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgdmVyc2lvbj0iMy4xLjAiIGZyYWdtZW50PSJ0cnVlIiBvcz0ic29sYXJpcyIgd3M9Im1vdGlmIi8+Ci0gIAotICA8IS0tIFdpbjMyIC0tPgotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3Qud2luMzIiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgdmVyc2lvbj0iMy4xLjAiIGZyYWdtZW50PSJ0cnVlIiB3cz0id2luMzIiLz4KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMud2luMzIiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgdmVyc2lvbj0iMy4wLjAiIGZyYWdtZW50PSJ0cnVlIiBvcz0id2luMzIiLz4KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudWkud2luMzIiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgdmVyc2lvbj0iMy4xLjAiIGZyYWdtZW50PSJ0cnVlIiB3cz0id2luMzIiLz4KLSAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgdmVyc2lvbj0iMy4wLjAiIGZyYWdtZW50PSJ0cnVlIiBvcz0id2luMzIiLz4KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS1mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS1mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkODUwMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0tZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+MTU8c3VwPnRoPC9zdXA+IEp1bmUsIDIwMDQ8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+RUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08cD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiAgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gICBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzCi0gICBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7IGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy48L3A+Ci0gIAotPHA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9wPgotICAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90Oy4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UtZmVhdHVyZS8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UtZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjYTQwYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLWZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UtZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UtZmVhdHVyZS9jcGwtdjEwLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLWZlYXR1cmUvY3BsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmFhMjA4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UtZmVhdHVyZS9jcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLTxUSVRMRT5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvVElUTEU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvSEVBRD4KLQotPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgVkxJTks9IiM4MDAwMDAiPgotCi0KLTxQIEFMSUdOPSJDRU5URVIiPjxCPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9CPgotPFA+PEI+PC9CPjxGT05UIFNJWkU9IjMiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjMiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ09NTU9OIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuICBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+MS4gIERFRklOSVRJT05TPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRpb24iIG1lYW5zOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8QlIgQ0xFQVI9IkxFRlQiPgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQkgCWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkJCWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+QSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAgKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPiJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjIuICBHUkFOVCBPRiBSSUdIVFM8L0I+PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmEpCTwvRk9OVD48Rk9OVCBTSVpFPSIyIj5TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YikgCVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgPC9GT05UPjxGT05UIFNJWkU9IjIiPlJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDgwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uICBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiAgVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuICAgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5jKQlSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuICBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+ZCkJRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4gPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48Qj4zLiAgUkVRVUlSRU1FTlRTPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCWVmZmVjdGl2ZWx5IGRpc2NsYWltczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpIAllZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpaSk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+CXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pdikJc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkJaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5iKQlhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjxTVFJJS0U+PC9TVFJJS0U+PC9GT05UPjxGT05UIFNJWkU9IjIiPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+NC4gIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gICBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiAgSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiAgVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiAgVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuICBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjUuICBOTyBXQVJSQU5UWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aGUgUHJvZ3JhbTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50PC9GT05UPjxGT05UIFNJWkU9IjIiPiwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj42LiAgRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+KElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSw8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Ny4gIEdFTkVSQUw8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYSBDb250cmlidXRvciB3aXRoIHJlc3BlY3QgdG8gYSBwYXRlbnQgYXBwbGljYWJsZSB0byBzb2Z0d2FyZSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCksIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgdG8gc3VjaCBSZWNpcGllbnQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gIEluIGFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiAgSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiAgSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkICBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gPC9GT05UPjxGT05UIFNJWkU9IjIiPnRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gSUJNIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiAgIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dmVyc2lvbi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPmJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2U8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiAgRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci0KLTwvQk9EWT4KLQotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UtZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS1mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZTNlMDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS1mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLWZlYXR1cmUvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLWZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZGVlNDAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS1mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlIHByaW1hcnk9ImZhbHNlIiAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlIiAgdmVyc2lvbj0iMy4xLjAiPgotCTxkZXNjcmlwdGlvbiA+Ci0JCSVkZXNjcmlwdGlvbgotCTwvZGVzY3JpcHRpb24+Ci0JPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0JCSVsaWNlbnNlCi0JPC9saWNlbnNlPgotCTx1cmw+Ci0JCTx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4wIi8+Ci0JCTxkaXNjb3ZlcnkgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4wIi8+Ci0JPC91cmw+Ci0JPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MuaXN2IiB2ZXJzaW9uPSIzLjEuMCIvPgotCTxwbHVnaW4gICAgZnJhZ21lbnQ9ImZhbHNlIiAgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlIiB2ZXJzaW9uPSIzLjEuMCIvPgotCTxwbHVnaW4gd3M9Imd0ayIgIG9zPSJsaW51eCIgZnJhZ21lbnQ9InRydWUiIGFyY2g9ImlhNjQiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS5saW51eC5ndGsuaWE2NCIgdmVyc2lvbj0iMy4xLjAiLz4KLQk8cGx1Z2luIHdzPSJjYXJib24iICBvcz0ibWFjb3N4IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0icHBjIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UubWFjb3N4LmNhcmJvbi5wcGMiIHZlcnNpb249IjMuMS4wIi8+Ci0JPHBsdWdpbiB3cz0icGhvdG9uIiAgb3M9InFueCIgZnJhZ21lbnQ9InRydWUiIGFyY2g9Ing4NiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLnFueC5waG90b24ueDg2IiB2ZXJzaW9uPSIzLjEuMCIvPgotCTxwbHVnaW4gd3M9Imd0ayIgIG9zPSJsaW51eCIgZnJhZ21lbnQ9InRydWUiIGFyY2g9InBwYyIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLmxpbnV4Lmd0ay5wcGMiIHZlcnNpb249IjMuMS4wIi8+Ci0JPHBsdWdpbiB3cz0ibW90aWYiICBvcz0iaHB1eCIgZnJhZ21lbnQ9InRydWUiIGFyY2g9IlBBX1JJU0MiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS5ocHV4Lm1vdGlmLlBBX1JJU0MiIHZlcnNpb249IjMuMS4wIi8+Ci0JPHBsdWdpbiB3cz0ibW90aWYiICBvcz0iYWl4IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0icHBjIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UuYWl4Lm1vdGlmLnBwYyIgdmVyc2lvbj0iMy4xLjAiLz4KLQk8cGx1Z2luIHdzPSJndGsiICBvcz0ibGludXgiIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJ4ODYiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS5saW51eC5ndGsueDg2IiB2ZXJzaW9uPSIzLjEuMCIvPgotCTxwbHVnaW4gd3M9IndpbjMyIiAgb3M9IndpbjMyIiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0ieDg2IiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2Uud2luMzIud2luMzIueDg2IiB2ZXJzaW9uPSIzLjEuMCIvPgotCTxwbHVnaW4gd3M9Im1vdGlmIiAgb3M9InNvbGFyaXMiIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJzcGFyYyIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLnNvbGFyaXMubW90aWYuc3BhcmMiIHZlcnNpb249IjMuMS4wIi8+Ci0JPHBsdWdpbiB3cz0iZ3RrIiAgb3M9ImxpbnV4IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0iYW1kNjQiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS5saW51eC5ndGsuYW1kNjQiIHZlcnNpb249IjMuMS4wIi8+Ci0JPHBsdWdpbiB3cz0ibW90aWYiICBvcz0ibGludXgiIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJ4ODYiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS5saW51eC5tb3RpZi54ODYiIHZlcnNpb249IjMuMS4wIi8+Ci08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLWZlYXR1cmUvbGljZW5zZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS1mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkODUwMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLWZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPjE1PHN1cD50aDwvc3VwPiBKdW5lLCAyMDA0PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPkVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuICAgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcwotICAgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90OyBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuPC9wPgotICAKLTxwPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvcD4KLSAgCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLWZlYXR1cmUvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLWZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZjdkNzkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay1mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc2RrLWZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLWZlYXR1cmUvY3BsLXYxMC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay1mZWF0dXJlL2NwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhYTIwOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLWZlYXR1cmUvY3BsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L1RJVExFPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFZMSU5LPSIjODAwMDAwIj4KLQotCi08UCBBTElHTj0iQ0VOVEVSIj48Qj5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvQj4KLTxQPjxCPjwvQj48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIENPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiAgQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjEuICBERUZJTklUSU9OUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0aW9uIiBtZWFuczo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPEJSIENMRUFSPSJMRUZUIj4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJIAljaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpCQlhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogIChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4yLiAgR1JBTlQgT0YgUklHSFRTPC9CPjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5hKQk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+U3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50czwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmIpIAlTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDA4MDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiAgVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uICBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAgIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YykJUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiAgRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiAgQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuICBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmQpCUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PEI+My4gIFJFUVVJUkVNRU5UUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQllZmZlY3RpdmVseSBkaXNjbGFpbXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKSAJZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paWkpPC9GT05UPjxGT05UIFNJWkU9IjIiPglzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aXYpCXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjQuICBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuICBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuICAgVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuICBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuICBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiAgVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj41LiAgTk8gV0FSUkFOVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGhlIFByb2dyYW08L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPnByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zPC9GT05UPjxGT05UIFNJWkU9IjIiPi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+Ni4gIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgPC9GT05UPjxGT05UIFNJWkU9IjIiPihJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksPC9GT05UPjxGT05UIFNJWkU9IjIiPiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjcuICBHRU5FUkFMPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3Igd2l0aCByZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICBJbiBhZGRpdGlvbiwgaWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCAgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIElCTSBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gICBJQk0gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnZlcnNpb24uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5ieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlPC9GT05UPjxGT05UIFNJWkU9IjIiPi48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+ICBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotCi08L0JPRFk+Ci0KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLWZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGstZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGUzZTAyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGstZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay1mZWF0dXJlL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNkay1mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjk5MDRjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGstZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLnNkayIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjEuMCIKLSAgICAgIGltYWdlPSAiZWNsaXBzZV91cGRhdGVfMTIwLmpwZyIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0gICAKLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjAiLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4wIi8+Ci0gICA8L3VybD4KLQotICA8aW5jbHVkZXMgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtIiB2ZXJzaW9uPSIzLjEuMCIgLz4gCi0gIDxpbmNsdWRlcyBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlIiB2ZXJzaW9uPSIzLjEuMCIgLz4gCi0gIDxpbmNsdWRlcyBpZD0ib3JnLmVjbGlwc2UuamR0IiB2ZXJzaW9uPSIzLjEuMCIgLz4KLSAgPGluY2x1ZGVzIGlkPSJvcmcuZWNsaXBzZS5qZHQuc291cmNlIiB2ZXJzaW9uPSIzLjEuMCIgLz4gCi0gIDxpbmNsdWRlcyBpZD0ib3JnLmVjbGlwc2UucGRlIiB2ZXJzaW9uPSIzLjEuMCIgLz4gCi0gIDxpbmNsdWRlcyBpZD0ib3JnLmVjbGlwc2UucGRlLnNvdXJjZSIgdmVyc2lvbj0iMy4xLjAiIC8+IAotICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zZGsiIHZlcnNpb249IjMuMS4wIi8+Ci0gIAotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGstZmVhdHVyZS9saWNlbnNlLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrLWZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2Q4NTAwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGstZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+MTU8c3VwPnRoPC9zdXA+IEp1bmUsIDIwMDQ8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+RUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08cD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiAgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gICBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzCi0gICBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7IGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy48L3A+Ci0gIAotPHA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9wPgotICAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90Oy4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2QuZG9jXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5kb2NfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDk5YmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5kb2NfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLmRvY18yLjAuMC9jcGwtdjEwLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLmRvY18yLjAuMC9jcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YWEyMDguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5kb2NfMi4wLjAvY3BsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L1RJVExFPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFZMSU5LPSIjODAwMDAwIj4KLQotCi08UCBBTElHTj0iQ0VOVEVSIj48Qj5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvQj4KLTxQPjxCPjwvQj48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIENPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiAgQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjEuICBERUZJTklUSU9OUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0aW9uIiBtZWFuczo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPEJSIENMRUFSPSJMRUZUIj4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJIAljaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpCQlhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogIChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4yLiAgR1JBTlQgT0YgUklHSFRTPC9CPjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5hKQk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+U3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50czwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmIpIAlTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDA4MDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiAgVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uICBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAgIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YykJUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiAgRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiAgQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuICBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmQpCUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PEI+My4gIFJFUVVJUkVNRU5UUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQllZmZlY3RpdmVseSBkaXNjbGFpbXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKSAJZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paWkpPC9GT05UPjxGT05UIFNJWkU9IjIiPglzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aXYpCXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjQuICBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuICBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuICAgVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuICBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuICBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiAgVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj41LiAgTk8gV0FSUkFOVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGhlIFByb2dyYW08L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPnByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zPC9GT05UPjxGT05UIFNJWkU9IjIiPi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+Ni4gIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgPC9GT05UPjxGT05UIFNJWkU9IjIiPihJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksPC9GT05UPjxGT05UIFNJWkU9IjIiPiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjcuICBHRU5FUkFMPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3Igd2l0aCByZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICBJbiBhZGRpdGlvbiwgaWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCAgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIElCTSBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gICBJQk0gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnZlcnNpb24uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5ieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlPC9GT05UPjxGT05UIFNJWkU9IjIiPi48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+ICBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotCi08L0JPRFk+Ci0KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLmRvY18yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5kb2NfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhlM2UwMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLmRvY18yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5kb2NfMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5kb2NfMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGMxZDU2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2QuZG9jXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIC8qKgotIyAgKiA8Y29weXJpZ2h0PgotIyAgKgotIyAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0jICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0jICAqIAotIyAgKiBDb250cmlidXRvcnM6IAotIyAgKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgKgotIyAgKiA8L2NvcHlyaWdodD4KLSMgICoKLSMgICogJElkOiBmZWF0dXJlLnByb3BlcnRpZXMsdiAxLjEgMjAwNC8xMC8xOCAxNTo1MDo0MiBkYmlyc2FuIEV4cCAkCi0jICAqLwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgVGhpcyBmaWxlIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1YTUwgU2NoZW1hIEluZm9zZXQgTW9kZWwgKFhTRCkgRG9jdW1lbnRhdGlvbgotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZS5vcmcgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUVjbGlwc2UgTW9kZWxpbmcgRnJhbWV3b3JrLiAoZG9jdW1lbnRhdGlvbikKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRS5PUkcgU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLTE0dGggQXVndXN0LCAyMDAzXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotRUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmdcblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJDUEwiKS4gQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi1Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHNcblwKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3JcblwKLW1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZVxuXAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzXG5cCi1hcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluXG5cCi1kaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIFN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLmRvY18yLjAuMC9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2QuZG9jXzIuMC4wL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTRmMzgwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2QuZG9jXzIuMC4wL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogZmVhdHVyZS54bWwsdiAxLjEgMjAwNC8wMy8wNiAxODowMDowOSBtYXJjZWxvcCBFeHAgJAotICovCi0tLT4KLQotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS54c2QuZG9jIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMC4wIgotICAgICAgaW1hZ2U9ICJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzIiBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnhzZC5kb2MiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4wLjAiPgotICAgPC9wbHVnaW4+Ci0gICAJCQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5kb2NfMi4wLjAvbGljZW5zZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5kb2NfMi4wLjAvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjhjMzgwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2QuZG9jXzIuMC4wL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD4xNHRoIEF1Z3VzdCwgMjAwMzwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0KLTxwPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mICB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiAgIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMKLSAgIG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LjwvcD4KLSAgCi08cD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L3A+Ci0gIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7LgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IEVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2Quc291cmNlXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5zb3VyY2VfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDk5YmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5zb3VyY2VfMi4wLjAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLnNvdXJjZV8yLjAuMC9jcGwtdjEwLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLnNvdXJjZV8yLjAuMC9jcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YWEyMDguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5zb3VyY2VfMi4wLjAvY3BsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L1RJVExFPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L0hFQUQ+Ci0KLTxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIFZMSU5LPSIjODAwMDAwIj4KLQotCi08UCBBTElHTj0iQ0VOVEVSIj48Qj5Db21tb24gUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvQj4KLTxQPjxCPjwvQj48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIzIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIENPTU1PTiBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiAgQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjEuICBERUZJTklUSU9OUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0aW9uIiBtZWFuczo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPEJSIENMRUFSPSJMRUZUIj4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJIAljaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWkpCQlhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogIChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4yLiAgR1JBTlQgT0YgUklHSFRTPC9CPjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5hKQk8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+U3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50czwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPiA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPmIpIAlTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDA4MDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiAgVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uICBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLiAgIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YykJUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiAgRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiAgQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuICBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmQpCUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuIDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PEI+My4gIFJFUVVJUkVNRU5UUzwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5pKQllZmZlY3RpdmVseSBkaXNjbGFpbXM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKSAJZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paWkpPC9GT05UPjxGT05UIFNJWkU9IjIiPglzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aXYpCXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiNGRjAwMDAiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvRk9OVD4KLQotPFVMPjxGT05UIFNJWkU9IjIiPmEpCWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+YikJYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uICA8L0ZPTlQ+PC9VTD4KLQotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48U1RSSUtFPjwvU1RSSUtFPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjQuICBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuICBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuICAgVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuICBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuICBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiAgVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48Qj41LiAgTk8gV0FSUkFOVFk8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzPC9GT05UPjxGT05UIFNJWkU9IjIiPiBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGhlIFByb2dyYW08L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4sIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgPC9GT05UPjxGT05UIFNJWkU9IjIiPnByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zPC9GT05UPjxGT05UIFNJWkU9IjIiPi4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+Ni4gIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgPC9GT05UPjxGT05UIFNJWkU9IjIiPihJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksPC9GT05UPjxGT05UIFNJWkU9IjIiPiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjcuICBHRU5FUkFMPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3Igd2l0aCByZXNwZWN0IHRvIGEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50IHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICBJbiBhZGRpdGlvbiwgaWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCAgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj50aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIElCTSBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gICBJQk0gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnZlcnNpb24uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5ieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlPC9GT05UPjxGT05UIFNJWkU9IjIiPi48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+ICBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotCi08L0JPRFk+Ci0KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLnNvdXJjZV8yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5zb3VyY2VfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhlM2UwMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLnNvdXJjZV8yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5zb3VyY2VfMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZC5zb3VyY2VfMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODA2YWYyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2Quc291cmNlXzIuMC4wL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIC8qKgotIyAgKiA8Y29weXJpZ2h0PgotIyAgKgotIyAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0jICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0jICAqIAotIyAgKiBDb250cmlidXRvcnM6IAotIyAgKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgKgotIyAgKiA8L2NvcHlyaWdodD4KLSMgICoKLSMgICogJElkOiBmZWF0dXJlLnByb3BlcnRpZXMsdiAxLjEgMjAwNC8xMC8xOCAxNTo1MDo0MiBkYmlyc2FuIEV4cCAkCi0jICAqLwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgVGhpcyBmaWxlIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1YTUwgU2NoZW1hIEluZm9zZXQgTW9kZWwgKFhTRCkgU291cmNlCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1FY2xpcHNlLm9yZyB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RWNsaXBzZSBNb2RlbGluZyBGcmFtZXdvcmsuIChzb3VyY2UgY29kZSkKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRS5PUkcgU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLTE0dGggQXVndXN0LCAyMDAzXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotRUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmdcblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJDUEwiKS4gQSBjb3B5IG9mIHRoZSBDUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi1Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHNcblwKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3JcblwKLW1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZVxuXAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzXG5cCi1hcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluXG5cCi1kaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIFN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBDUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLnNvdXJjZV8yLjAuMC9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2Quc291cmNlXzIuMC4wL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWYyYjc3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2Quc291cmNlXzIuMC4wL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogZmVhdHVyZS54bWwsdiAxLjEgMjAwNC8wMy8wNiAxODowMDoxMSBtYXJjZWxvcCBFeHAgJAotICovCi0tLT4KLQotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS54c2Quc291cmNlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMC4wIgotICAgICAgaW1hZ2U9ICJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzIiBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnhzZC5zb3VyY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4wLjAiPgotICAgPC9wbHVnaW4+Ci0gICAKLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2Quc291cmNlXzIuMC4wL2xpY2Vuc2UuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2Quc291cmNlXzIuMC4wL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY4YzM4MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLnNvdXJjZV8yLjAuMC9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+MTR0aCBBdWd1c3QsIDIwMDM8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+RUNMSVBTRS5PUkcgTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotCi08cD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiAgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gICBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzCi0gICBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7IGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy48L3A+Ci0gIAotPHA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9wPgotICAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZyBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90Oy4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgQ1BMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCBFY2xpcHNlLm9yZyB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZF8yLjAuMC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0OTliYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkXzIuMC4wL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZF8yLjAuMC9jcGwtdjEwLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkXzIuMC4wL2NwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhYTIwOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkXzIuMC4wL2NwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLTxIRUFEPgotPFRJVExFPkNvbW1vbiBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9USVRMRT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBWTElOSz0iIzgwMDAwMCI+Ci0KLQotPFAgQUxJR049IkNFTlRFUiI+PEI+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L0I+Ci08UD48Qj48L0I+PEZPTlQgU0laRT0iMyI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMyI+PC9GT05UPjxGT05UIFNJWkU9IjIiPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBDT01NT04gUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4xLiAgREVGSU5JVElPTlM8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxCUiBDTEVBUj0iTEVGVCI+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCSAJY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKQkJYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj53aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5BIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6ICAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Mi4gIEdSQU5UIE9GIFJJR0hUUzwvQj48L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YSkJPC9GT05UPjxGT05UIFNJWkU9IjIiPlN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5iKSAJU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+UmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwODAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuICBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiAgTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gICA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmMpCVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiAgRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5kKQlFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LiA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjMuICBSRVFVSVJFTUVOVFM8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmIpCWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJZWZmZWN0aXZlbHkgZGlzY2xhaW1zPC9GT05UPjxGT05UIFNJWkU9IjIiPiBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkgCWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWlpKTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4Jc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPml2KQlzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmIpCWEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj40LiAgQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiAgV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiAgIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiAgVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuICBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuICBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguICBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiAgSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+NS4gIE5PIFdBUlJBTlRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnRoZSBQcm9ncmFtPC9GT05UPjxGT05UIFNJWkU9IjIiPiBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9uczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjYuICBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj43LiAgR0VORVJBTDwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhIENvbnRyaWJ1dG9yIHdpdGggcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQgYnkgdGhhdCBDb250cmlidXRvciB0byBzdWNoIFJlY2lwaWVudCB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgSW4gYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuICBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuICBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuICAgSUJNIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj52ZXJzaW9uLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uPC9GT05UPjxGT05UIFNJWkU9IjIiPiAgQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuICBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLQotPC9CT0RZPgotCi08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZF8yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZF8yLjAuMC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGUzZTAyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2RfMi4wLjAvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2RfMi4wLjAvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZF8yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMGRlZDUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZF8yLjAuMC9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAvKioKLSMgICogPGNvcHlyaWdodD4KLSMgICoKLSMgICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAgKiAKLSMgICogQ29udHJpYnV0b3JzOiAKLSMgICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICoKLSMgICogPC9jb3B5cmlnaHQ+Ci0jICAqCi0jICAqICRJZDogZmVhdHVyZS5wcm9wZXJ0aWVzLHYgMS4xIDIwMDQvMTAvMTggMTU6NTA6NDIgZGJpcnNhbiBFeHAgJCAKLSMgICovCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBUaGlzIGZpbGUgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVhTRCBTY2hlbWEgSW5mb3NldCBNb2RlbAotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9RWNsaXBzZS5vcmcgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVhNTCBTY2hlbWEgSW5mb3NldCBNb2RlbAotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFLk9SRyBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotMTR0aCBBdWd1c3QsIDIwMDNcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1FQ0xJUFNFLk9SRyBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSBFY2xpcHNlLm9yZ1xuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ29tbW9uIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkNQTCIpLiBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLUNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50c1xuXAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvclxuXAotbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlXG5cCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHNcblwKLWFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW5cblwKLWRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gU3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IEVjbGlwc2Uub3JnIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyAic2Vjb25kYXJ5VXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSBzZWNvbmRhcnkgdXBkYXRlIHNpdGUgKG9uIGRvd25sb2FkLmVjbGlwc2Uub3JnKQotc2Vjb25kYXJ5VXBkYXRlU2l0ZU5hbWU9RU1GL1NETy9YU0QgU2Vjb25kYXJ5IFVwZGF0ZSBTaXRlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkXzIuMC4wL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9lY2xpcHNlL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnhzZF8yLjAuMC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U1MTM0Mi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkXzIuMC4wL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UueHNkIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMC4wIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0IHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPgotICAgICAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi1BbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLyIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iJXNlY29uZGFyeVVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy90b29scy9lbWYvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiIHZlcnNpb249IjMuMC4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIgdmVyc2lvbj0iMi4wLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UueHNkIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS54c2QuZWRpdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UueHNkLmVkaXRvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UueHNkLnRlc3QiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLnhzZDJlY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcueHNkMmVjb3JlLmVkaXRvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL2VjbGlwc2UvZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkXzIuMC4wL2xpY2Vuc2UuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2RfMi4wLjAvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjhjMzgwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BlcmYvZWNsaXBzZS9mZWF0dXJlcy9vcmcuZWNsaXBzZS54c2RfMi4wLjAvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPjE0dGggQXVndXN0LCAyMDAzPC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPkVDTElQU0UuT1JHIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IEVjbGlwc2Uub3JnIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuICAgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcwotICAgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90OyBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuPC9wPgotICAKLTxwPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gRmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvcD4KLSAgCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgRWNsaXBzZS5vcmcgaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIENQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgRWNsaXBzZS5vcmcgdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGVyZi9wbGF0Zm9ybS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL3BsYXRmb3JtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgzZTVjNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wZXJmL3BsYXRmb3JtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLUNyZWF0ZWQgb24gTW9uIEF1ZyAyMyAxNTowNTo0MyBFRFQgMjAwNC0tPgotPGNvbmZpZyBkYXRlPSIxMDkzMjg3OTQzMTM0IiB0cmFuc2llbnQ9ImZhbHNlIiB2ZXJzaW9uPSIzLjAiPgotPHNpdGUgZW5hYmxlZD0idHJ1ZSIgcG9saWN5PSJVU0VSLUVYQ0xVREUiIHVwZGF0ZWFibGU9InRydWUiIHVybD0icGxhdGZvcm06L2Jhc2UvIj4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJydXAucmFkLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFycnVwLnJhZC5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ1cGRhdGUuZGV2LnByb2R1Y3QiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFydXBkYXRlLmRldi5wcm9kdWN0XzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ1cGRhdGUuZGV2IiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnVwZGF0ZS5kZXZfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnVtbDIiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudW1sMl8xLjAuMS8iIHZlcnNpb249IjEuMC4xIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyeHRvb2xzLmNvbXBhcmVtZXJnZS5lamJkZGZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyeHRvb2xzLmNvbXBhcmVtZXJnZS5lamJkZC1mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uc2VydmVyYXR0YWNoLnY1IiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5zZXJ2ZXJhdHRhY2gudjVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcmRlYnVnLnhzbCIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJkZWJ1Zy54c2xfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnh0b29scy5wbGF0Zm9ybS5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnh0b29scy5wbGF0Zm9ybS5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJzdXBwb3J0LnJhZC5kb2MiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyc3VwcG9ydC5yYWQuZG9jXzEuMC4wLyIgdmVyc2lvbj0iMS4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJyMmEucmRqLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFycjJhLnJkai5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ1cGRhdGUudGVzdC5jdC5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnVwZGF0ZS50ZXN0LmN0LmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnh0b29scy5lRGF0YXZpei5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnh0b29scy5lRGF0YXZpei5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJyYWQud2VsY29tZS5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnJhZC53ZWxjb21lLmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcmRlYnVnLndzYS5sYXVuY2gubG9hZCIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJkZWJ1Zy53c2EubGF1bmNoLmxvYWRfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnJ1cC5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnJ1cC5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ4dG9vbHMudmlzdWFsaXphdGlvbi5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnh0b29scy52aXN1YWxpemF0aW9uLmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnJhZC5uYXYuZG9jLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFycmFkLm5hdi5kb2MuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UueS50ZXN0IiBwcmltYXJ5PSJ0cnVlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnkudGVzdF8zLjAuMS8iIHZlcnNpb249IjMuMC4xIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyZGVidWcuYWN0aXZlc2NyaXB0LndpbjMyIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcmRlYnVnLmFjdGl2ZXNjcmlwdC53aW4zMl82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyeHRvb2xzLnBsYXRmb3JtLndpbjMyLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyeHRvb2xzLnBsYXRmb3JtLndpbjMyLmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5wb3J0YWwudG9vbHMuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28ucG9ydGFsLnRvb2xzLmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5zZXJ2ZXJhdHRhY2giIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLnNlcnZlcmF0dGFjaF82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UueS50ZXN0LmV4YW1wbGVzIiBwcmltYXJ5PSJ0cnVlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnkudGVzdC5leGFtcGxlc18zLjAuMS8iIHZlcnNpb249IjMuMC4xIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei5jb21tb24udWkiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei5jb21tb24udWlfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnouZWpiIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnouZWpiXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS55LnByb2ZpbGluZyIgcHJpbWFyeT0idHJ1ZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS55LnByb2ZpbGluZ18zLjAuMS8iIHZlcnNpb249IjMuMC4xIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLmVqYmRlcGxveS5mZWF0dXJlLm5sMSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uZWpiZGVwbG95LmZlYXR1cmUubmwxXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ6LmVtZi5pbnRlZ3JhdGlvbiIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LmVtZi5pbnRlZ3JhdGlvbl82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyZGVidWcuamF2YXNjcmlwdCIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJkZWJ1Zy5qYXZhc2NyaXB0XzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJkZWJ1Zy5hc3QuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJkZWJ1Zy5hc3QuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2Uud3N2dC1mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLndzdnQtZmVhdHVyZV8xLjAuMC8iIHZlcnNpb249IjEuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLnNpYi5tZWRpYXRpb24uZGV2ZWxvcC5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5zaWIubWVkaWF0aW9uLmRldmVsb3AuZmVhdHVyZV8xLjAuMC8iIHZlcnNpb249IjEuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLndlYnNlcnZpY2Uud2FzLmNyZWF0aW9uLmVqYi5mZWF0dXJlLm5sMSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28ud2Vic2VydmljZS53YXMuY3JlYXRpb24uZWpiLmZlYXR1cmUubmwxXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28ud2ViZWRpdC5lZGl0b3IuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28ud2ViZWRpdC5lZGl0b3IuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei5kYXRhIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnouZGF0YV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLnNpYi5tZWRpYXRpb24uZGVwbG95LmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLnNpYi5tZWRpYXRpb24uZGVwbG95LmZlYXR1cmVfMS4wLjAvIiB2ZXJzaW9uPSIxLjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5lIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5lXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28ud2Vic2VydmljZS53YXMuY3JlYXRpb24uZWpiLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLndlYnNlcnZpY2Uud2FzLmNyZWF0aW9uLmVqYi5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uc2l0ZWVkaXQuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uc2l0ZWVkaXQuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLnByb2ZpbGluZy5zZXJ2ZXIuY29tcGF0aWJsZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28ucHJvZmlsaW5nLnNlcnZlci5jb21wYXRpYmxlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ6LndzIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnoud3NfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5lamIuc2FtcGxlcy1mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5lamIuc2FtcGxlcy1mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ6LmFjdGl2aXRpZXMuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LmFjdGl2aXRpZXMuZmVhdHVyZV8xLjAuMC8iIHZlcnNpb249IjEuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLmV4YW1wbGVzIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5leGFtcGxlc182LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyeC5zZGsiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyeC5zZGtfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcmRlYnVnLnBkdC53aW4zMiIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJkZWJ1Zy5wZHQud2luMzJfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcmRlYnVnLndzYSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJkZWJ1Zy53c2FfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5qdmUuZXhwcmVzcyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uanZlLmV4cHJlc3NfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcmRhdGEubGludXgiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyZGF0YS5saW51eF82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyc3NlLnhtbG1hcmt1cCIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJzc2UueG1sbWFya3VwXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ6LnZhbGlkYXRpb24iIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei52YWxpZGF0aW9uXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS55LmdsYSIgcHJpbWFyeT0idHJ1ZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS55LmdsYV8zLjAuMS8iIHZlcnNpb249IjMuMC4xIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei53cy5tb2RlbCIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LndzLm1vZGVsXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ4LmFzdCIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ4LmFzdF82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyd3MuYXN0LnN0LmV4dC5ubDEiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyd3MuYXN0LnN0LmV4dC5ubDFfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnouY29tbW9uLnV0aWxpdGllcyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LmNvbW1vbi51dGlsaXRpZXNfMS4wLjAvIiB2ZXJzaW9uPSIxLjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnouY29tbW9uIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnouY29tbW9uXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ6LnhtbC5tb2RlbCIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LnhtbC5tb2RlbF82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyZGVidWcucGR0IiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcmRlYnVnLnBkdF82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei5uYXZpZ2F0b3IiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei5uYXZpZ2F0b3JfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby53ZWJ0b29scy5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby53ZWJ0b29scy5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ6LmVtZi5pbnRlZ3JhdGlvbi5jb3JlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnouZW1mLmludGVncmF0aW9uLmNvcmVfMS4wLjAvIiB2ZXJzaW9uPSIxLjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5zdHJ1dHMuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uc3RydXRzLmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnNzZS5iYXNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnNzZS5iYXNlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJkZWJ1Zy5oZWxwLmRvYyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJkZWJ1Zy5oZWxwLmRvY182LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UueS5tb2RlbHMiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UueS5tb2RlbHNfMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnkubG9nZ2luZyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS55LmxvZ2dpbmdfMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcmRlYnVnLmphdmFzY3JpcHQubmwxLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyZGVidWcuamF2YXNjcmlwdC5ubDEuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyd3MuYXN0LnN0LmJhdGNoIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcndzLmFzdC5zdC5iYXRjaF82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyc3NlLnNuaXBwZXRzIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnNzZS5zbmlwcGV0c182LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyd3MucmFwaWRkZXBsb3kiIHBsdWdpbi1pZGVudGlmaWVyPSJvcmcuZWNsaXBzZS5iYXJ3cy5yYXBpZGRlcGxveS5jb3JlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcndzLnJhcGlkZGVwbG95XzEuMC4wLyIgdmVyc2lvbj0iMS4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJkYXRhIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcmRhdGFfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5zZWN1cml0eSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uc2VjdXJpdHlfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5wcm9iZWtpdCIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28ucHJvYmVraXRfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5qc2YuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uanNmLmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5hbmFseXNpcyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uYW5hbHlzaXNfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5hYy10ZWNoIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5hYy10ZWNoXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28ud2Vic2VydmljZS53YXMuY3JlYXRpb24uZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28ud2Vic2VydmljZS53YXMuY3JlYXRpb24uZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLmVqYiIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28uZWpiXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uZWpiZGVwbG95LmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLmVqYmRlcGxveS5mZWF0dXJlXzUuMS4xLyIgdmVyc2lvbj0iNS4xLjEiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ6LmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei5lXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uZnRwIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5mdHBfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnkuZXhhbXBsZXMiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UueS5leGFtcGxlc18zLjAuMS8iIHZlcnNpb249IjMuMC4xIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLmp2ZS5jb3JlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5qdmUuY29yZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UueS5jb3JlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnkuY29yZV8zLjAuMS8iIHZlcnNpb249IjMuMC4xIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei53cy5heGlzIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnoud3MuYXhpc182LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLmp2ZS5lIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5qdmUuZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLnJlc291cmNlcy5jb21tb24uZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28ucmVzb3VyY2VzLmNvbW1vbi5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ3cyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ3c182LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UueSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS55XzMuMC4xLyIgdmVyc2lvbj0iMy4wLjEiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJkZWJ1Zy5hc3QubmwxLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyZGVidWcuYXN0Lm5sMS5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ6IiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnpfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcmxwZXgiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFybHBleF8zLjAuMC8iIHZlcnNpb249IjMuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyeG1sIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnhtbF82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei53cy5jb25zdW1wdGlvbiIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LndzLmNvbnN1bXB0aW9uXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uZWdsLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLmVnbC5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ6LnNlcnZlci50b21jYXQiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei5zZXJ2ZXIudG9tY2F0XzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ3cy5yYXBpZGRlcGxveS5jbWRmcmFtZXdvcmsiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyd3MucmFwaWRkZXBsb3kuY21kZnJhbWV3b3JrXzEuMC4wLyIgdmVyc2lvbj0iMS4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28uZWpiLnNiZi5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5lamIuc2JmLmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5xZXYiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLnFldl82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLndzLmV4dC5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby53cy5leHQuZmVhdHVyZV81LjkuMC8iIHZlcnNpb249IjUuOS4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei54bWwiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei54bWxfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnVwZGF0ZS53ZWIuZGV2ZWxvcGVyIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnVwZGF0ZS53ZWIuZGV2ZWxvcGVyXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ3cy5hc3Quc3QuYmFzZS5ubDEiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyd3MuYXN0LnN0LmJhc2UubmwxXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ6LmpkdC5pbnRlZ3JhdGlvbiIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LmpkdC5pbnRlZ3JhdGlvbl82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UueS5zb3VyY2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UueS5zb3VyY2VfMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5nbGEiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLmdsYV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLndzLmVqYi5ubDEuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28ud3MuZWpiLm5sMS5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ3cy5hc3Quc3QuYmFzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ3cy5hc3Quc3QuYmFzZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyc3VwcG9ydC5yd2QuZG9jIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnN1cHBvcnQucndkLmRvY18xLjAuMC8iIHZlcnNpb249IjEuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFydXBkYXRlLnBkLnByb2YiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFydXBkYXRlLnBkLnByb2ZfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby53ZWJzZXJ2aWNlLndhcy5jcmVhdGlvbi5mZWF0dXJlLm5sMSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28ud2Vic2VydmljZS53YXMuY3JlYXRpb24uZmVhdHVyZS5ubDFfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLndzdnR2YWxpZGF0b3JmZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLndzdnR2YWxpZGF0b3JmZWF0dXJlXzEuMC4wLyIgdmVyc2lvbj0iMS4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ3cy5hc3Quc3QuYmF0Y2gubmwxIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcndzLmFzdC5zdC5iYXRjaC5ubDFfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcndzLmFzdC5kb2MuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ3cy5hc3QuZG9jLmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby53cy5lamIuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28ud3MuZWpiLmZlYXR1cmVfNS45LjAvIiB2ZXJzaW9uPSI1LjkuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcndzLnJhcGlkZGVwbG95Lm5sMSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ3cy5yYXBpZGRlcGxveS5ubDFfMS4wLjAvIiB2ZXJzaW9uPSIxLjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnouamNhIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnouamNhXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ6LnhtbC52YWxpZGF0ZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LnhtbC52YWxpZGF0ZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei5leHRlbnNpb24iIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei5leHRlbnNpb25fNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnouZW52LnVpIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnouZW52LnVpXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ6LmVudiIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ6LmVudl82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFydXBkYXRlLmpzY3JpYi5mcmFtZXdvcmsiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFydXBkYXRlLmpzY3JpYi5mcmFtZXdvcmtfMS4yLjAvIiB2ZXJzaW9uPSIxLjIuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcmRlYnVnLnBkdC5ubDEuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJkZWJ1Zy5wZHQubmwxLmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnJ3ZC5kb2MuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJyd2QuZG9jLmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnVwZGF0ZS5vcnBoYW5zIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnVwZGF0ZS5vcnBoYW5zXzEuMC4wLyIgdmVyc2lvbj0iMS4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28ucHJvZmlsaW5nIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5wcm9maWxpbmdfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnkucHJvYmVraXQiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UueS5wcm9iZWtpdF8zLjAuMS8iIHZlcnNpb249IjMuMC4xIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyc3NlLndlYm1hcmt1cCIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJzc2Uud2VibWFya3VwXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJkYXRhLndpbjMyIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcmRhdGEud2luMzJfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnouc2VydmVyIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnouc2VydmVyXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5qZW0iIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuamVtXzEuMC4wLyIgdmVyc2lvbj0iMS4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28ucHJvamVjdC5pbnRlcmNoYW5nZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28ucHJvamVjdC5pbnRlcmNoYW5nZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudmVfMS4wLjAvIiB2ZXJzaW9uPSIxLjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcmRlYnVnLndzYS5ubDEuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJkZWJ1Zy53c2EubmwxLmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby53ZWJzZXJ2aWNlLndhcy5kZXBsb3kuZmVhdHVyZS5ubDEiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLndlYnNlcnZpY2Uud2FzLmRlcGxveS5mZWF0dXJlLm5sMV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLndzLmV4dC5ubDEuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28ud3MuZXh0Lm5sMS5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJkZWJ1Zy5oZWxwYXMuZG9jIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcmRlYnVnLmhlbHBhcy5kb2NfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5lbWYudWkuaW50ZWdyYXRpb24iIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLmVtZi51aS5pbnRlZ3JhdGlvbl82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZm9vLndlYnNlcnZpY2Uud2FzLmRlcGxveS5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby53ZWJzZXJ2aWNlLndhcy5kZXBsb3kuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyei53ZWIiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyei53ZWJfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmZvby5wcm9maWxpbmcuc2VydmVyIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmZvby5wcm9maWxpbmcuc2VydmVyXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ3cy5hc3Quc3QuZXh0IiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcndzLmFzdC5zdC5leHRfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnJ1cC51cGRhdGV6b25lLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFycnVwLnVwZGF0ZXpvbmUuZmVhdHVyZV8xLjAuMC8iIHZlcnNpb249IjEuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyc2FtcGxlZ2FsbGVyeS1mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnNhbXBsZWdhbGxlcnktZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuamR0LnNvdXJjZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQuc291cmNlXzMuMC4xLyIgdmVyc2lvbj0iMy4wLjEiLz4KLTxmZWF0dXJlIGFwcGxpY2F0aW9uPSJvcmcuZWNsaXBzZS51aS5pZGUud29ya2JlbmNoIiBpZD0ib3JnLmVjbGlwc2UuYmFydXBkYXRlLnNkcC5mZWF0dXJlIiBwcmltYXJ5PSJ0cnVlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcnVwZGF0ZS5zZHAuZmVhdHVyZV82LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucGRlLnNvdXJjZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlXzMuMC4xLyIgdmVyc2lvbj0iMy4wLjEiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28ubHVtLnV0aWxzLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZm9vLmx1bS51dGlscy5mZWF0dXJlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJlc3VwcG9ydC5jbGllbnQubmwxIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcmVzdXBwb3J0LmNsaWVudC8iIHZlcnNpb249IjAuOS4xNCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnkubG9nZ2luZyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS55LmxvZ2dpbmdfMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZG9jIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uZG9jXzIuMC4wLyIgdmVyc2lvbj0iMi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5mb28ubG9nZ2luZyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28ubG9nZ2luZ182LjAuMC8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFydXBkYXRlLndlbGNvbWUuZmVhdHVyZS5ubDEiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFydXBkYXRlLndlbGNvbWUuZmVhdHVyZS5ubDEvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgYXBwbGljYXRpb249Im9yZy5lY2xpcHNlLnVpLmlkZS53b3JrYmVuY2giIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIgcHJpbWFyeT0idHJ1ZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybV8zLjAuMS8iIHZlcnNpb249IjMuMC4xIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyY29tbW9uLmRvYy5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJhcmNvbW1vbi5kb2MuZmVhdHVyZS8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuamR0IiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdF8zLjAuMS8iIHZlcnNpb249IjMuMC4xIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyc3VwcG9ydC5jb3JlLmRvYyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJzdXBwb3J0LmNvcmUuZG9jLyIgdmVyc2lvbj0iMS4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS54eXouY2xlYXJjYXNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnh5ei5jbGVhcmNhc2VfNi4wLjExLyIgdmVyc2lvbj0iNi4wLjExIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFydHV0b3JpYWxnYWxsZXJ5LWZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFydHV0b3JpYWxnYWxsZXJ5LWZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnVwZGF0ZS53ZWxjb21lLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFydXBkYXRlLndlbGNvbWUuZmVhdHVyZS8iIHZlcnNpb249IjYuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZW1mIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZl8yLjAuMS8iIHZlcnNpb249IjIuMC4xIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZV8zLjAuMS8iIHZlcnNpb249IjMuMC4xIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFydXBkYXRlLmNvbW1vbi5hY3Rpdml0aWVzLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFydXBkYXRlLmNvbW1vbi5hY3Rpdml0aWVzLmZlYXR1cmVfNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJhcnVwZGF0ZS5jZGkuaXRsbSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ1cGRhdGUuY2RpLml0bG1fNi4wLjAvIiB2ZXJzaW9uPSI2LjAuMCIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnBkZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGVfMy4wLjEvIiB2ZXJzaW9uPSIzLjAuMSIvPgotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVtZi5kb2MiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmRvY18yLjAuMS8iIHZlcnNpb249IjIuMC4xIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkbyIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvXzIuMC4xLyIgdmVyc2lvbj0iMi4wLjEiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJzdXBwb3J0LmNvcmUuZG9jLm5sMSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJzdXBwb3J0LmNvcmUuZG9jLm5sMS8iIHZlcnNpb249IjEuMC4wIi8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuYmFyeHRvb2xzLmNvbXBhcmVtZXJnZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5iYXJ4dG9vbHMuY29tcGFyZW1lcmdlXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iYXJ4dG9vbHMuY29tbW9uLnVpLnByb3BlcnRpZXMiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmFyeHRvb2xzLmNvbW1vbi51aS5wcm9wZXJ0aWVzXzYuMC4wLyIgdmVyc2lvbj0iNi4wLjAiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS54c2QiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkXzIuMC4xLyIgdmVyc2lvbj0iMi4wLjEiLz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5nZWYiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZ2VmXzMuMC4wLyIgdmVyc2lvbj0iMy4wLjAiLz4KLTwvc2l0ZT4KLTwvY29uZmlnPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMS5wbHVnaW4xXzEuMS4xLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTEucGx1Z2luMV8xLjEuMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjOTk1ZDUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMS5wbHVnaW4xXzEuMS4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTIucGx1Z2luMl8yLjIuMi5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyLnBsdWdpbjJfMi4yLjIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzk5NWQ1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTIucGx1Z2luMl8yLjIuMi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmR1bW15XzcuOS44LmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZHVtbXlfNy45LjguamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGYxOTNkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZHVtbXlfNy45LjguamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNzVhZGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTk1OGM3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMDVkODIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwbHVnaW4gbmFtZT0iSlVuaXQgVGVzdCBGcmFtZXdvcmsiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xIiB2ZXJzaW9uPSIzLjUuNiIgdmVuZG9yLW5hbWU9Imp1bml0Lm9yZyI+DQotICA8cnVudGltZT4NCi0gICAgPGxpYnJhcnkgbmFtZT0ianVuaXQuamFyIj4NCi0gICAgICA8ZXhwb3J0IG5hbWU9IioiLz4NCi0gICAgPC9saWJyYXJ5Pg0KLSAgPC9ydW50aW1lPg0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0ZDYwOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUxL2luc3RhbGwvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUxL2luc3RhbGwvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNDFhZjguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMS9pbnN0YWxsL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMyIgaW1hZ2U9ImZlYXR1cmUxLmdpZiIgbGFiZWw9IlRoaXJkIEZlYXR1cmUiIHByb3ZpZGVyLW5hbWU9IlNtYXJ0IENvbXBhbnkiIHZlcnNpb249IjEuMC4wIiA+Ci0gIDxkZXNjcmlwdGlvbj5EZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0gIDxjb3B5cmlnaHQ+Y29weXJpZ2h0PC9jb3B5cmlnaHQ+Ci0gIDxsaWNlbnNlPmxpY2Vuc2U8L2xpY2Vuc2U+Ci0gIDx1cmw+Ci0gICAgPHVwZGF0ZSBsYWJlbD0iVVJMIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyIvPgotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAxIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMiIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+Ci0gIDwvdXJsPgotICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjE1MDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMSIgaW5zdGFsbC1zaXplPSIxMDAwIiBmcmFnbWVudD0iZmFsc2UiIG5sPSJ1cyIgb3M9Ik9TX1dJTjMyIiB2ZXJzaW9uPSIxLjEuMSIgd3M9IldTX1dJTjMyIi8+Ci08L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUxL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAxODQ2Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUxL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwbHVnaW4gbmFtZT0iSlVuaXQgVGVzdCBGcmFtZXdvcmsiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xIiB2ZXJzaW9uPSIzLjUuNiIgdmVuZG9yLW5hbWU9Imp1bml0Lm9yZyI+Ci0gIDxydW50aW1lPgotICAgIDxsaWJyYXJ5IG5hbWU9Imp1bml0LmphciI+Ci0gICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICA8L2xpYnJhcnk+Ci0gIDwvcnVudGltZT4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNGQ2MDkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUyL2luc3RhbGwvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUyL2luc3RhbGwvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YTdkZTguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMi9pbnN0YWxsL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMyIgaW1hZ2U9ImZlYXR1cmUxLmdpZiIgbGFiZWw9IlRoaXJkIEZlYXR1cmUiIHByb3ZpZGVyLW5hbWU9IlNtYXJ0IENvbXBhbnkiIHZlcnNpb249IjEuMC4wIiA+Ci0gIDxkZXNjcmlwdGlvbj5EZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0gIDxjb3B5cmlnaHQ+Y29weXJpZ2h0PC9jb3B5cmlnaHQ+Ci0gIDxsaWNlbnNlPmxpY2Vuc2U8L2xpY2Vuc2U+Ci0gIDx1cmw+Ci0gICAgPHVwZGF0ZSBsYWJlbD0iVVJMIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyIvPgotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAxIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMiIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+Ci0gIDwvdXJsPgotICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjE1MDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSIgaW5zdGFsbC1zaXplPSIxMDAwIiBmcmFnbWVudD0iZmFsc2UiIG5sPSJ1cyIgb3M9Ik9TX1dJTjMyIiB2ZXJzaW9uPSIyLjEuMCIgd3M9IldTX1dJTjMyIi8+Ci08L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlXzIuMC4wL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmVfMi4wLjAvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAxODQ2Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmVfMi4wLjAvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwbHVnaW4gbmFtZT0iSlVuaXQgVGVzdCBGcmFtZXdvcmsiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xIiB2ZXJzaW9uPSIzLjUuNiIgdmVuZG9yLW5hbWU9Imp1bml0Lm9yZyI+Ci0gIDxydW50aW1lPgotICAgIDxsaWJyYXJ5IG5hbWU9Imp1bml0LmphciI+Ci0gICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICA8L2xpYnJhcnk+Ci0gIDwvcnVudGltZT4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZV8yLjAuMC9zcmMuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlXzIuMC4wL3NyYy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNGQ2MDkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlXzIuMC4wL3NyYy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmM2MGM3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4NCi08ZGVzY3JpcHRpb24gdXJsPSJpbmZvL3NpdGVJbmZvLmh0bWwiLz4NCi0gIDxmZWF0dXJlIHVybD0idGVzdEFQSS9mZWF0dXJlcy9mZWF0dXJlMyI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL1VNTCIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2ZlYXR1cmUyIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2ZlYXR1cmUxIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS5qYXIiIHVybD0icGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMSIvPiAgICANCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkoyRUUgdG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRUpCIFRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUvRUpCIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJVTUwgdG9vbHMiIG5hbWU9ImVjbGlwc2UvVU1MIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJNZXNzYWdpbmcgVG9vbHMiIG5hbWU9IkIyQiIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRWNsaXBzZSBUb29scyIgbmFtZT0iZWNsaXBzZSIvPg0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlMi9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGUyL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWQxYzExLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGUyL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxzaXRlIHVybD0iSW5mby5odG1sIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4NCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZTEiLz4NCi0gIDxhcmNoaXZlIHBhdGg9Im9yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xIiB1cmw9InBsdWdpbnMvcGx1Z2luMSIvPg0KLSAgPGFyY2hpdmUgcGF0aD0ib3JnLmVjbGlwc2UudXBkYXRlLmFyY2hpdmUyIiB1cmw9InBsdWdpbnMvcGx1Z2luMiIvPg0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2J1bmRsZUFuZFBsdWdpbk1hbmlmZXN0c18xLjAuMy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvYnVuZGxlQW5kUGx1Z2luTWFuaWZlc3RzXzEuMC4zL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2YwZjBmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvYnVuZGxlQW5kUGx1Z2luTWFuaWZlc3RzXzEuMC4zL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1HZW5lcmF0ZWQtZnJvbTogMTA3NzA2MjYwMzcwOAotQnVuZGxlLU5hbWU6IFRlc3QKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMwotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuYnVuZGxlQW5kUGx1Z2luTWFuaWZlc3RzQlVORExFUEFSU0VECi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotQnVuZGxlLUNsYXNzUGF0aDogcGx1Z2luLmphcgotTGVnYWN5OiB0cnVlCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5idW5kbGVBbmRQbHVnaW5NYW5pZmVzdHMuQWN0aXZhdG9yCi1SZXF1aXJlLUJ1bmRsZTogCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnVpCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2J1bmRsZUFuZFBsdWdpbk1hbmlmZXN0c18xLjAuMy9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9idW5kbGVBbmRQbHVnaW5NYW5pZmVzdHNfMS4wLjMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI1OWRkYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2J1bmRsZUFuZFBsdWdpbk1hbmlmZXN0c18xLjAuMy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHBsdWdpbiBuYW1lPSJKVW5pdCBUZXN0IEZyYW1ld29yayIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmJ1bmRsZUFuZFBsdWdpbk1hbmlmZXN0cyIgdmVyc2lvbj0iMS4wLjMiIHZlbmRvci1uYW1lPSJFY2xpcHNlLm9yZyI+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2J1bmRsZU1hbmlmZXN0XzEuMC4xL01FVEEtSU5GL01BTklGRVNULk1GIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9idW5kbGVNYW5pZmVzdF8xLjAuMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIyMmRjOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2J1bmRsZU1hbmlmZXN0XzEuMC4xL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1HZW5lcmF0ZWQtZnJvbTogMTA3NzA2MjYwMzcwOAotQnVuZGxlLU5hbWU6IFRlc3QKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuYnVuZGxlTWFuaWZlc3Q7IHNpbmdsZXRvbj10cnVlCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotQnVuZGxlLUNsYXNzUGF0aDogcGx1Z2luLmphcgotTGVnYWN5OiB0cnVlCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5idW5kbGVNYW5pZmVzdC5BY3RpdmF0b3IKLVJlcXVpcmUtQnVuZGxlOiAKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UudWkKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvZmVhdHVyZTFfcGx1Z2luMl81LjAuMC9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9mZWF0dXJlMV9wbHVnaW4yXzUuMC4wL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmODFjNDYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9mZWF0dXJlMV9wbHVnaW4yXzUuMC4wL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHBsdWdpbiBuYW1lPSJKVW5pdCBUZXN0IEZyYW1ld29yayIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjIiIHZlcnNpb249IjUuMC4wIiB2ZW5kb3ItbmFtZT0ianVuaXQub3JnIj4NCi0gIDxydW50aW1lPg0KLSAgICA8bGlicmFyeSBuYW1lPSJqdW5pdC5qYXIiPg0KLSAgICAgIDxleHBvcnQgbmFtZT0iKiIvPg0KLSAgICA8L2xpYnJhcnk+DQotICA8L3J1bnRpbWU+DQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9mZWF0dXJlMV9wbHVnaW4yXzUuMC4wL3NyYy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2ZlYXR1cmUxX3BsdWdpbjJfNS4wLjAvc3JjLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0ZDYwOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2ZlYXR1cmUxX3BsdWdpbjJfNS4wLjAvc3JjLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvZmVhdHVyZTFfcGx1Z2luMl81LjAuMS9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9mZWF0dXJlMV9wbHVnaW4yXzUuMC4xL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYjNjMjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9mZWF0dXJlMV9wbHVnaW4yXzUuMC4xL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHBsdWdpbiBuYW1lPSJKVW5pdCBUZXN0IEZyYW1ld29yayIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjIiIHZlcnNpb249IjUuMC4xIiB2ZW5kb3ItbmFtZT0ianVuaXQub3JnIj4NCi0gIDxydW50aW1lPg0KLSAgICA8bGlicmFyeSBuYW1lPSJqdW5pdC5qYXIiPg0KLSAgICAgIDxleHBvcnQgbmFtZT0iKiIvPg0KLSAgICA8L2xpYnJhcnk+DQotICA8L3J1bnRpbWU+DQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9mZWF0dXJlMV9wbHVnaW4yXzUuMC4xL3NyYy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2ZlYXR1cmUxX3BsdWdpbjJfNS4wLjEvc3JjLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0ZDYwOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2ZlYXR1cmUxX3BsdWdpbjJfNS4wLjEvc3JjLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvbm90QnVuZGxlTWFuaWZlc3RfMS4wLjIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL25vdEJ1bmRsZU1hbmlmZXN0XzEuMC4yL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzI0Mjk1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvbm90QnVuZGxlTWFuaWZlc3RfMS4wLjIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotR2VuZXJhdGVkLWZyb206IDEwNzcwNjI2MDM3MDgKLUJ1bmRsZS1OYW1lOiBOb3QgVmFsaWQgQnVuZGxlIE1hbmlmZXN0Ci1CdW5kbGUtVmVyc2lvbjogMS4wLjIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtQ2xhc3NQYXRoOiBwbHVnaW4uamFyCi1SZXF1aXJlLUJ1bmRsZTogCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnVpCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS90ZXN0QVBJL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdGVzdEFQSS9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3OGQ2MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS90ZXN0QVBJL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMyIgaW1hZ2U9ImZlYXR1cmUxLmdpZiIgbGFiZWw9IlRoaXJkIEZlYXR1cmUiIHByb3ZpZGVyLW5hbWU9IlNtYXJ0IENvbXBhbnkiIHZlcnNpb249IjEuMC4wIiA+Ci0gIDxkZXNjcmlwdGlvbj5EZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0gIDxjb3B5cmlnaHQ+Y29weXJpZ2h0PC9jb3B5cmlnaHQ+Ci0gIDxsaWNlbnNlPmxpY2Vuc2U8L2xpY2Vuc2U+Ci0gIDx1cmw+Ci0gICAgPHVwZGF0ZSBsYWJlbD0iVVJMIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyIvPgotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAxIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMiIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+Ci0gIDwvdXJsPgotICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjE1MDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMSIgaW5zdGFsbC1zaXplPSIxMDAwIiBmcmFnbWVudD0iZmFsc2UiIG5sPSJ1cyIgb3M9IldJTjMyLExJTlVYIiB2ZXJzaW9uPSIxLjEuMSIvPgotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3Rlc3RBUEkvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdGVzdEFQSS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMTg0NmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdGVzdEFQSS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cGx1Z2luIG5hbWU9IkpVbml0IFRlc3QgRnJhbWV3b3JrIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMSIgdmVyc2lvbj0iMy41LjYiIHZlbmRvci1uYW1lPSJqdW5pdC5vcmciPgotICA8cnVudGltZT4KLSAgICA8bGlicmFyeSBuYW1lPSJqdW5pdC5qYXIiPgotICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgPC9saWJyYXJ5PgotICA8L3J1bnRpbWU+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS90ZXN0QVBJL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3Rlc3RBUEkvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRkNjA5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3Rlc3RBUEkvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdGVzdEFQSS9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3Rlc3RBUEkvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMTVkNDMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdGVzdEFQSS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZSB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4KLTxkZXNjcmlwdGlvbiB1cmw9ImluZm8vc2l0ZUluZm8uaHRtbCIvPgotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmUzIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9VTUwiLz4KLSAgPC9mZWF0dXJlPgotICA8ZmVhdHVyZSB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZmVhdHVyZTIiPgotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL0oyRUUiLz4KLSAgPC9mZWF0dXJlPgotICA8ZmVhdHVyZSB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZmVhdHVyZTEiPgotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL0oyRUUiLz4KLSAgPC9mZWF0dXJlPgotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xLmphciIgdXJsPSJwbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xIi8+ICAgIAotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJKMkVFIHRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUiLz4KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRUpCIFRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUvRUpCIi8+Ci0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IlVNTCB0b29scyIgbmFtZT0iZWNsaXBzZS9VTUwiLz4KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iTWVzc2FnaW5nIFRvb2xzIiBuYW1lPSJCMkIiLz4KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRWNsaXBzZSBUb29scyIgbmFtZT0iZWNsaXBzZSIvPgotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTIvLmVjbGlwc2Vwcm9kdWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlMi8uZWNsaXBzZXByb2R1Y3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiODI5YWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlMi8uZWNsaXBzZXByb2R1Y3QKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWlkPWFub3RoZXIucHJvZHVjdC5pZA0KLW5hbWU9TmFtZSBvZiB0aGUgcHJvZHVjdA0KLXZlcj0xLjIuNApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTMvLmVjbGlwc2VleHRlbnNpb24gYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGUzLy5lY2xpcHNlZXh0ZW5zaW9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDcyZGY3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTMvLmVjbGlwc2VleHRlbnNpb24KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pZD1pZC5vZi5leHRlbmRlZC5wcm9kdWN0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNC9lY2xpcHNlLy5lY2xpcHNlZXh0ZW5zaW9uIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNC9lY2xpcHNlLy5lY2xpcHNlZXh0ZW5zaW9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2M4NGU5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTQvZWNsaXBzZS8uZWNsaXBzZWV4dGVuc2lvbgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWlkPWRpZmZlcmVudC5wcm9kdWN0LmlkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNS8uZWNsaXBzZVVNIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNS8uZWNsaXBzZVVNCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTZjNTIyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTUvLmVjbGlwc2VVTQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotaWQ9b3JnLmVjbGlwc2UucGxhdGZvcm0NCi1uYW1lPWEgUHJvZHVjdCANCi12ZXJzaW9uPTMuNS42ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNS9lY2xpcHNlLy5lY2xpcHNlZXh0ZW5zaW9uIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNS9lY2xpcHNlLy5lY2xpcHNlZXh0ZW5zaW9uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmY0MGEzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTUvZWNsaXBzZS8uZWNsaXBzZWV4dGVuc2lvbgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotaWQ9b3JnLmVjbGlwc2UucGxhdGZvcm0KLW5hbWU9RWNsaXBzZSBQbGF0Zm9ybQotdmVyc2lvbj0zLjEuMApkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNi8uZWNsaXBzZVVNIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNi8uZWNsaXBzZVVNCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTdmOWY4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTYvLmVjbGlwc2VVTQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWlkPW9yZy5lY2xpcHNlLnNkawpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTYvY2hpbGRyZW4vY2hpbGRyZW4vZWNsaXBzZS8uZWNsaXBzZWV4dGVuc2lvbiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTYvY2hpbGRyZW4vY2hpbGRyZW4vZWNsaXBzZS8uZWNsaXBzZWV4dGVuc2lvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk3ZjlmOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGU2L2NoaWxkcmVuL2NoaWxkcmVuL2VjbGlwc2UvLmVjbGlwc2VleHRlbnNpb24KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pZD1vcmcuZWNsaXBzZS5zZGsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2FwaXRlc3RzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvYXBpdGVzdHMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTExODAwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvYXBpdGVzdHMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZmVhdHVyZSBpZD0ib3JnLnRlc3QxLmlkZW50MSIgbGFiZWw9IkZlYXR1cmUgT25lIiBubD0iZW5fdXMsZnIsZGUiIG9zPSJPU19XSU4zMixPU19MSU5VWCIgcHJvdmlkZXItbmFtZT0iT2JqZWN0IFRlY2hub2xvZ3kgSW50ZXJuYXRpb25hbCIgdmVyc2lvbj0iMS4wLjAiIHdzPSJXU19XSU4zMixXU19NT1RJRixXU19HVEsiPg0KLSAgPGRlc2NyaXB0aW9uPlRlc3QgZmVhdHVyZSBmb3IgdGVzdElkZW50aWZpZXIgdGVzdDwvZGVzY3JpcHRpb24+DQotICA8Y29weXJpZ2h0PkNvcHlyaWdodCAoYykgdGhlIGNvbXBhbnk8L2NvcHlyaWdodD4NCi0gIDxsaWNlbnNlPkRvIHlvdSBhY2NlcHQgdGhlIGxpY2Vuc2UgPzwvbGljZW5zZT4NCi0gIDx1cmw+DQotICAgIDx1cGRhdGUgbGFiZWw9IlVSTCB0byB1cGRhdGUgdGVoIGZlYXR1cmUiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPg0KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+DQotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAyIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4NCi0gIDwvdXJsPg0KLSAgPHBsdWdpbiBkb3dubG9hZC1zaXplPSIxNTAwIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMSIgaW5zdGFsbC1zaXplPSIxMDAwIiBmcmFnbWVudD0iZmFsc2UiIG5sPSJ1cyIgb3M9Ik9TX1dJTjMyIiB2ZXJzaW9uPSIzLjUuNiIgd3M9IldTX1dJTjMyIi8+DQotICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjEyMDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yIiBpbnN0YWxsLXNpemU9Ijk3OCIgZnJhZ21lbnQ9ImZhbHNlIiB2ZXJzaW9uPSI1LjAuMCIvPg0KLTwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2FwaXRlc3RzL29yZy5lY2xpcHNlX3Rlc3RfZmVhdHVyZS9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvYXBpdGVzdHMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjA1Y2RhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvYXBpdGVzdHMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZmVhdHVyZSBpZD0ib3JnLnRlc3QxLmlkZW50MiIgbGFiZWw9IkZlYXR1cmUgT25lIiBubD0iZW5fdXMsZnIsZGUiIG9zPSJPU19XSU4zMixPU19MSU5VWCIgcHJvdmlkZXItbmFtZT0iT2JqZWN0IFRlY2hub2xvZ3kgSW50ZXJuYXRpb25hbCIgdmVyc2lvbj0iMS4wLjAiIHdzPSJXU19XSU4zMixXU19NT1RJRixXU19HVEsiPg0KLSAgPGRlc2NyaXB0aW9uPlRlc3QgZmVhdHVyZSBmb3IgdGVzdElkZW50aWZpZXIgdGVzdDwvZGVzY3JpcHRpb24+DQotICA8Y29weXJpZ2h0PkNvcHlyaWdodCAoYykgdGhlIGNvbXBhbnk8L2NvcHlyaWdodD4NCi0gIDxsaWNlbnNlPkRvIHlvdSBhY2NlcHQgdGhlIGxpY2Vuc2UgPzwvbGljZW5zZT4NCi0gIDx1cmw+DQotICAgIDx1cGRhdGUgbGFiZWw9IlVSTCB0byB1cGRhdGUgdGVoIGZlYXR1cmUiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPg0KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+DQotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAyIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4NCi0gIDwvdXJsPg0KLSAgPHBsdWdpbiBkb3dubG9hZC1zaXplPSIxNTAwIiB1cmw9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjEiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xIiBpbnN0YWxsLXNpemU9IjEwMDAiIGZyYWdtZW50PSJmYWxzZSIgbmw9InVzIiBvcz0iT1NfV0lOMzIiIHZlcnNpb249IjMuNS42IiB3cz0iV1NfV0lOMzIiLz4NCi0gIDxwbHVnaW4gZG93bmxvYWQtc2l6ZT0iMTIwMCIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjIiIGluc3RhbGwtc2l6ZT0iOTc4IiBmcmFnbWVudD0iZmFsc2UiIHZlcnNpb249IjUuMC4wIi8+DQotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvZmVhdHVyZV8xLjAuMC9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvZmVhdHVyZV8xLjAuMC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRlZTEzOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2ZlYXR1cmVfMS4wLjAvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMSIgaW1hZ2U9ImZlYXR1cmUxLmdpZiIgbGFiZWw9IkZlYXR1cmUgT25lIiBubD0iZW4sZnIsZGUiIG9zPSJPU19XSU4zMixPU19MSU5VWCIgcHJvdmlkZXItbmFtZT0iT2JqZWN0IFRlY2hub2xvZ3kgSW50ZXJuYXRpb25hbCIgdmVyc2lvbj0iMS4wLjQiIHdzPSJXU19XSU4zMixXU19NT1RJRixXU19HVEsiPg0KLSAgPGRlc2NyaXB0aW9uPkkgYmVsaWV2ZSB0aGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiBmZWF0dXJlIDEsIHdlbGwsIGZlYXR1cmUgMSBpcyBhbiBleGNlcHRpb25hbCBmZWF0dXJlIHRoYXQgeW91IHNob3VsZCBpbnN0YWxsIHJpZ2h0IE5PVyBvbiB5b3VyIG1hY2hpbmUuLi4gdHJ5IGl0LjwvZGVzY3JpcHRpb24+DQotICA8Y29weXJpZ2h0Pk9rLCBub3csIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgY29tcGxleCBDb3B5cmlnaHQgIG5vdCBwcmVwYXJlZCBieSBhIGxhd3llciBDb3B5cmlnaHQgKGMpIHRoZSBjb21wYW55PC9jb3B5cmlnaHQ+DQotICA8bGljZW5zZT4jMSBEbyB5b3UgYWNjZXB0IGl0ICMyIHlvdSBkbyBudG8gYWNjZXB0IGl0IC4uLkRvIHlvdSBhY2NwdCBpdCA/PC9saWNlbnNlPg0KLSAgPHVybD4NCi0gICAgPHVwZGF0ZSBsYWJlbD0iVVJMIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BhdGgvZmVhdHVyZTEvIi8+DQotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAxIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4NCi0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDIiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPg0KLSAgPC91cmw+DQotICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjE1MDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xIiBpbnN0YWxsLXNpemU9IjEwMDAiIGZyYWdtZW50PSJmYWxzZSIgbmw9InVzIiBvcz0iT1NfV0lOMzIiIHZlcnNpb249IjMuNS42IiB3cz0iV1NfV0lOMzIiLz4NCi0gIDxwbHVnaW4gZG93bmxvYWQtc2l6ZT0iMTIwMCIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjIiIGluc3RhbGwtc2l6ZT0iOTc4IiBmcmFnbWVudD0iZmFsc2UiIHZlcnNpb249IjUuMC4wIi8+DQotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvZmVhdHVyZV8xLjAuMC9mZWF0dXJlMS5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2ZlYXR1cmVfMS4wLjAvZmVhdHVyZTEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2UzMGEyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvZmVhdHVyZV8xLjAuMC9mZWF0dXJlMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL3NpdGUxL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEveG1scy9zaXRlMS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ4MjNjMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL3NpdGUxL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSB1cmw9ImluZm8iIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiPg0KLSAgPGZlYXR1cmUgaWQ9Im9yZy5pc3YuZmVhdHVyZTMiIHVybD0id3d3LmVjbGlwc2Uub3JnL2ZlYXR1cmUzIiB2ZXJzaW9uPSIzLjQuNSI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL1VNTCIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUyIiB1cmw9Ind3dy5lY2xpcHNlLm9yZy9mZWF0dXJlMiIgdmVyc2lvbj0iMy40LjYiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9KMkVFIi8+DQotICA8L2ZlYXR1cmU+DQotICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmF0dXJlMSIgdXJsPSJ3d3cuZWNsaXBzZS5vcmcvZmVhdHVyZTEiIHZlcnNpb249IjIuMy41Ij4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGFyY2hpdmUgcGF0aD0ib3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjEiIHVybD0id3d3LmVjbGlwc2Uub3JnL3BsdWlnbjEiLz4NCi0gIDxhcmNoaXZlIHBhdGg9Im9yZy5lY2xpcHNlLnVwZGF0ZS5hcmNoaXZlMiIgdXJsPSJ3d3cuZWNsaXBzZS5vcmcvcGx1Z2luMiIvPg0KLSAgPGFyY2hpdmUgcGF0aD0ib3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjMiIHVybD0id3d3LmVjbGlwc2Uub3JnL3BsdWdpbjMiLz4NCi0gIDxhcmNoaXZlIHBhdGg9Im9yZy5lY2xpcHNlLnVua25vd24ucGx1Z2luIiB1cmw9Ind3dy5lY2xpcHNlLm9yZy9wbHVnaW5zL3BsdWdpbjQiLz4NCi0gIDxhcmNoaXZlIHBhdGg9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLmZvbzEiIHVybD0id3d3LmVjbGlwc2Uub3JnL3BsdWdpbjEiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkoyRUUgdG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRUpCIFRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUvRUpCIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJVTUwgdG9vbHMiIG5hbWU9ImVjbGlwc2UvVU1MIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJNZXNzYWdpbmcgVG9vbHMiIG5hbWU9IkIyQiIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRWNsaXBzZSB0b29scyIgbmFtZT0iZWNsaXBzZSIvPg0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTU0MzY1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+DQotPHBsdWdpbj4NCi0NCi0gICAgIDxleHRlbnNpb24NCi0gICAgICAgICBpZD0iZmVhdHVyZTEiDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmVUeXBlcyI+DQotICAgICAgPGZlYXR1cmUtZmFjdG9yeQ0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5GZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnkiPg0KLSAgICAgIDwvZmVhdHVyZS1mYWN0b3J5Pg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBpZD0iZnRwIg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5zaXRlVHlwZXMiPg0KLSAgICAgIDxzaXRlLWZhY3RvcnkNCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmltcGxlbWVudGF0aW9uLlNpdGVGVFBGYWN0b3J5Ij4NCi0gICAgICA8L3NpdGUtZmFjdG9yeT4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5yZWdpc3RyeS5yZXNvdXJjZXMiPg0KLSAgICAgIDxyZXNvdXJjZQ0KLSAgICAgICAgICAgIGFsaWFzPSIvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUudXBkYXRldGVzdHMiDQotICAgICAgICAgICAgYmFzZS1uYW1lPSIvd2Vic2VydmVyIj4NCi0gICAgICA8L3Jlc291cmNlPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLQ0KLTwvcGx1Z2luPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL0FsbFRlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2ZiNDVkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGkuQWxsQVBJVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmJyYW5kaW5nLio7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29uZmlndXJhdGlvbnMuQWxsQ29uZmlndXJhdGlvbnNUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS5UZXN0RXJyb3JSZWNvdmVyeUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS5ib290LkFsbFBsYXRmb3JtQ29uZmlndXJhdGlvblRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5taXJyb3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubW9kZWwuQWxsTW9kZWxUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubmVzdGVkZmVhdHVyZXMuQWxsTmVzdGVkVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnBhcnNlci5BbGxQYXJzZXJUZXN0czsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5wZXJmbXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVjb25jaWxpYXRpb24uQWxsUmVjb25jaWxpYXRpb25UZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVndWxhckluc3RhbGwuQWxsUmVndWxhckluc3RhbGxUZXN0czsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWd1bGFyUmVtb3ZlLkFsbFJlZ3VsYXJSZW1vdmVUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuc2l0ZXZhbGlkYXRpb24uQWxsU2l0ZVZhbGlkYXRpb25UZXN0czsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5zdGFuZGFsb25lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnR5cGVzLkFsbFR5cGVzVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnVpdmFsdWVzLkFsbENvcmVVSVRlc3RzOwotCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCXB1YmxpYyBBbGxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuc2V0TmFtZSgiQWxsIFVwZGF0ZSBNYW5hZ2VyIFRlc3RzIik7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0RXJyb3JSZWNvdmVyeUxvZy5jbGFzcykpOwotCQlzdWl0ZS5hZGRUZXN0KEFsbE1pcnJvclRlc3RzLnN1aXRlKCkpOwkKLQkJc3VpdGUuYWRkVGVzdChBbGxTaXRlVmFsaWRhdGlvblRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEFsbFBsYXRmb3JtQ29uZmlndXJhdGlvblRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEFsbFJlZ3VsYXJJbnN0YWxsVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQWxsQVBJVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQWxsUGFyc2VyVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQWxsQ29yZVVJVGVzdHMuc3VpdGUoKSk7Ci0vLwkJc3VpdGUuYWRkVGVzdChBbGxDb25maWd1cmF0aW9uc1Rlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEFsbFR5cGVzVGVzdHMuc3VpdGUoKSk7Ci0vLwkJc3VpdGUuYWRkVGVzdChBbGxSZWd1bGFyUmVtb3ZlVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQWxsTmVzdGVkVGVzdHMuc3VpdGUoKSk7CQotCQlzdWl0ZS5hZGRUZXN0KEFsbFJlY29uY2lsaWF0aW9uVGVzdHMuc3VpdGUoKSk7CQkJCQkKLQkJc3VpdGUuYWRkVGVzdChBbGxNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEFsbEJyYW5kaW5nVGVzdHMuc3VpdGUoKSk7Ci0JCS8vc3VpdGUuYWRkVGVzdChBbGxTdGFuZGFsb25lVGVzdHMuc3VpdGUoKSk7Ci0JCS8vc3VpdGUuYWRkVGVzdChBbGxQZXJmb3JtYW5jZVRlc3RzLnN1aXRlKCkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvVXBkYXRlTWFuYWdlclRlc3RDYXNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9VcGRhdGVNYW5hZ2VyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNjYzJlZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9VcGRhdGVNYW5hZ2VyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVBsdWdpbkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOwotLyoqCi0gKiBBbGwgVXBkYXRlIE1hbmFnZXIgVGVzdCBjYXNlcyBtdXN0IHN1YmNsYXNzIHRoaXMgYmFzZSB0ZXN0IGNhc2UuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFJlc291cmNlQnVuZGxlIGJ1bmRsZTsKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBkYXRhUGF0aDsKLQotCXByb3RlY3RlZCBzdGF0aWMgVVJMIFNPVVJDRV9GSUxFX1NJVEU7Ci0JcHJvdGVjdGVkIHN0YXRpYyBVUkwgU09VUkNFX0ZJTEVfU0lURV9JTlNUQUxMRUQ7Ci0JcHJvdGVjdGVkIHN0YXRpYyBVUkwgU09VUkNFX0hUVFBfU0lURTsKLQlwcm90ZWN0ZWQgc3RhdGljIFVSTCBUQVJHRVRfRklMRV9TSVRFOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfUEFUSCA9ICJkYXRhLyI7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQkJdHJ5IHsKLQkJCWluaXQoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS50b1N0cmluZygpKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaW5pdCgpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCi0JCUlQbHVnaW5EZXNjcmlwdG9yIGRhdGFEZXNjID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKS5nZXRQbHVnaW5EZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZSIpOwotCQlVUkwgcmVzb2x2ZWRVUkwgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKFBsYXRmb3JtLnJlc29sdmUoZGF0YURlc2MuZ2V0SW5zdGFsbFVSTCgpKSk7Ci0JCVVSTCBkYXRhVVJMID0gbmV3IFVSTChyZXNvbHZlZFVSTCwgREFUQV9QQVRIKTsKLQkJZGF0YVBhdGggPSBkYXRhVVJMLmdldEZpbGUoKTsKLQkJU3RyaW5nIGhvbWVQYXRoID0gKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0KLQkJaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0JCQlDbGFzc0xvYWRlciBsID0gbmV3IFVSTENsYXNzTG9hZGVyKG5ldyBVUkxbXSB7IGRhdGFVUkwgfSwgbnVsbCk7Ci0JCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoInJlc291cmNlcyIsIExvY2FsZS5nZXREZWZhdWx0KCksIGwpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCVNPVVJDRV9GSUxFX1NJVEUgPSBuZXcgRmlsZShkYXRhUGF0aCkudG9VUkwoKTsKLQkJCVNPVVJDRV9GSUxFX1NJVEVfSU5TVEFMTEVEID0gbmV3IEZpbGUoZGF0YVBhdGggKyAidGVzdEFQSS8iKS50b1VSTCgpOwotCQkJU09VUkNFX0hUVFBfU0lURSA9IG5ldyBVUkwoImh0dHAiLCBnZXRIdHRwSG9zdCgpLCBnZXRIdHRwUG9ydCgpLCBidW5kbGUuZ2V0U3RyaW5nKCJIVFRQX1BBVEhfMSIpKTsKLQkJCVRBUkdFVF9GSUxFX1NJVEUgPSBuZXcgVVJMKCJmaWxlIiwgbnVsbCwgaG9tZVBhdGggKyAiL3RhcmdldC8iKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS50b1N0cmluZygpKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQkvL2NsZWFudXAgdGFyZ2V0IAotCQlGaWxlIHRhcmdldCA9IG5ldyBGaWxlKGhvbWVQYXRoICsgIi90YXJnZXQvIik7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXQpOwotCQkvLyBjbGVhbnVwIGluZm8gYWJvdXQganVzdCBpbnN0YWxsZWQgcGx1Z2lucwotCQlJbnN0YWxsUmVnaXN0cnkuY2xlYW51cCgpOwotCQkKLQkJLy8gc2V0dXAgY2FjaGUgc2l0ZSB0byBmYWxzZS4gCi0JCS8vIE5vdGU6IHRoZSBzdGFuZC1hbG9uZSB0ZXN0cyB3aWxsIHNldCBpdCBiYWNrIHRvIHRydWUKLQkJSW50ZXJuYWxTaXRlTWFuYWdlci5nbG9iYWxVc2VDYWNoZSA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBzZXRVcC4gU3ViY2xhc3NlcyBhcmUgcHJldmVudGVkIAotCSAqIGZyb20gb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCB0byBtYWludGFpbiBsb2dnaW5nIGNvbnNpc3RlbmN5LgotCSAqIHVtU2V0VXAoKSBzaG91bGQgYmUgb3ZlcnJpZGRlbiBpbnN0ZWFkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0gIiArIHRoaXMuZ2V0TmFtZSgpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMuZ2V0TmFtZSgpICsgIjogc2V0VXAuLi4iKTsKLQkJdW1TZXRVcCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVtU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gZG8gbm90aGluZy4KLQl9Ci0KLQkvKioKLQkgKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGVhckRvd24uICBTdWJjbGFzc2VzIGFyZSBwcmV2ZW50ZWQgCi0JICogZnJvbSBvdmVycmlkaW5nIHRoaXMgbWV0aG9kIHRvIG1haW50YWluIGxvZ2dpbmcgY29uc2lzdGVuY3kuCi0JICogdW1UZWFyRG93bigpIHNob3VsZCBiZSBvdmVycmlkZGVuIGluc3RlYWQuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMuZ2V0TmFtZSgpICsgIjogdGVhckRvd24uLi5cbiIpOwotCQl1bVRlYXJEb3duKCk7Ci0JfQotCi0JLyoqCi0JICogVGVhcnMgZG93biB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIGNsb3NlIGEgbmV0d29yayBjb25uZWN0aW9uLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdW1UZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBkbyBub3RoaW5nLgotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldEh0dHBIb3N0KCkgewotCQlyZXR1cm4gVXBkYXRlVGVzdHNQbHVnaW4uZ2V0V2ViQXBwU2VydmVySG9zdCgpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgaW50IGdldEh0dHBQb3J0KCkgewotCQlyZXR1cm4gVXBkYXRlVGVzdHNQbHVnaW4uZ2V0V2ViQXBwU2VydmVyUG9ydCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZShJRmVhdHVyZSBmZWF0dXJlLCBJQ29uZmlndXJlZFNpdGUgY29uZmlnU2l0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU2l0ZSBzaXRlID0gY29uZmlnU2l0ZS5nZXRTaXRlKCk7Ci0JCXJlbW92ZShmZWF0dXJlLCBzaXRlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoSUZlYXR1cmUgZmVhdHVyZSwgSVNpdGUgc2l0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2UoZmVhdHVyZSk7Ci0JCS8vIHJlbW92ZSB0aGUgcGx1Z2lucyBhbmQgZmVhdHVyZXMgZGlyCi0JCVN0cmluZyBzaXRlUGF0aCA9IHNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpOwotCQlGaWxlIGZpbGUgPSBudWxsOwotCi0JCVN0cmluZyBmZWF0dXJlTmFtZSA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKS50b1N0cmluZygpICsgIl8iICsgZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7Ci0JCWZpbGUgPSBuZXcgRmlsZShzaXRlUGF0aCwgImZlYXR1cmVzIiArIEZpbGUuc2VwYXJhdG9yICsgZmVhdHVyZU5hbWUpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipSZW1vdmluZyA6IiArIGZpbGUpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7Ci0KLQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBuYW1lID0gZW50cmllc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpLnRvU3RyaW5nKCkgKyAiXyIgKyBlbnRyaWVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSArIEZpbGUuc2VwYXJhdG9yOwotCQkJZmlsZSA9IG5ldyBGaWxlKHNpdGVQYXRoLCAicGx1Z2lucyIgKyBGaWxlLnNlcGFyYXRvciArIG5hbWUpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqUmVtb3ZpbmcgOiIgKyBmaWxlKTsKLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsKLQkJCUluc3RhbGxSZWdpc3RyeS51bnJlZ2lzdGVyUGx1Z2luKGVudHJpZXNbaV0pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvVXBkYXRlVGVzdHNQbHVnaW4uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL1VwZGF0ZVRlc3RzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NTcwZTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvVXBkYXRlVGVzdHNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzOwotaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5qZXR0eS5KZXR0eUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVDb3JlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmh0dHAuSHR0cFNlcnZpY2U7Ci1pbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOwotCi0vKioKLSAqIG1hbmFnZXMgdGhlIHN0YXJ0dXAgYW5kIHNodXRvd24gb2YgdGhlIAotICogd2ViIHNlcnZlcgotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlVGVzdHNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFwcFNlcnZlckhvc3QgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGludCBhcHBTZXJ2ZXJQb3J0ID0gMDsKLQlwcml2YXRlIHN0YXRpYyBVcGRhdGVUZXN0c1BsdWdpbiBwbHVnaW47Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpbml0aWFsaXplZD1mYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBTZXJ2aWNlVHJhY2tlciBodHRwU2VydmljZVRyYWNrZXI7Ci0KLQlwdWJsaWMgc3RhdGljIFVwZGF0ZVRlc3RzUGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCQkKLQkJaHR0cFNlcnZpY2VUcmFja2VyID0gbmV3IFNlcnZpY2VUcmFja2VyKGNvbnRleHQsIEh0dHBTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSwgbnVsbCk7Ci0JCWh0dHBTZXJ2aWNlVHJhY2tlci5vcGVuKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCQotCQlpZihodHRwU2VydmljZVRyYWNrZXIgIT0gbnVsbCkKLQkJCWh0dHBTZXJ2aWNlVHJhY2tlci5jbG9zZSgpOwotCQkKLQkJaHR0cFNlcnZpY2VUcmFja2VyID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBob3N0IGlkZW50aWZpZXIgZm9yIHRoZSB3ZWIgYXBwIHNlcnZlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdlYkFwcFNlcnZlckhvc3QoKSB7Ci0JCWlmICghaW5pdGlhbGl6ZWQpIGluaXRpYWxpemUoKTsKLQkJcmV0dXJuIGFwcFNlcnZlckhvc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcG9ydCBpZGVudGlmaWVyIGZvciB0aGUgd2ViIGFwcCBzZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRXZWJBcHBTZXJ2ZXJQb3J0KCkgewotCQlpZiAoIWluaXRpYWxpemVkKSBpbml0aWFsaXplKCk7CQkKLQkJcmV0dXJuIGFwcFNlcnZlclBvcnQ7Ci0JfQotCS8qKgotCSAqIE1ldGhvZCBpbml0aWFsaXplLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQl0cnkgewotCi0JCQkvLyBlbnN1cmUgdGhhdCB0aGUgaHR0cCBzdHVmZiBpcyBzdGFydGVkCi0JCQlEaWN0aW9uYXJ5IGQgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCQlkLnB1dCgiaHR0cC5wb3J0IiwgbmV3IEludGVnZXIoMCkpOyAvLyROT04tTkxTLTEkCi0JCQlKZXR0eUNvbmZpZ3VyYXRvci5zdGFydFNlcnZlcigidXBkYXRlVGVzdHMiLCBkKTsKLQkJCWVuc3VyZUJ1bmRsZVN0YXJ0ZWQoIm9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5yZWdpc3RyeSIpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCVNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlID0gCi0JCQkJaHR0cFNlcnZpY2VUcmFja2VyLmdldFNlcnZpY2VSZWZlcmVuY2UoKTsKLQkJCQotCQkJU3RyaW5nIHBvcnQgPSAoU3RyaW5nKSByZWZlcmVuY2UuZ2V0UHJvcGVydHkoImh0dHAucG9ydCIpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCWFwcFNlcnZlckhvc3QgPSAibG9jYWxob3N0IjsgLy8kTk9OLU5MUy0xJAotCQkJYXBwU2VydmVyUG9ydCA9IEludGVnZXIucGFyc2VJbnQocG9ydCk7Ci0KLQkJCXRleHQgPSAiVGhlIHdlYlNlcnZlciBkaWQgc3RhcnQgaXA6IiArIGFwcFNlcnZlckhvc3QgKyAiOiIgKyBhcHBTZXJ2ZXJQb3J0OwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGV4dCA9ICJUaGUgd2ViU2VydmVyIGRpZG4ndCBzdGFydCAiOwotCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsICJvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZSIsIElTdGF0dXMuT0ssICJXZWJTZXJ2ZXIgbm90IHN0YXJ0ZWQuIFVwZGF0ZSBUZXN0cyByZXN1bHRzIGFyZSBpbnZhbGlkIiwgbnVsbCk7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIiIsbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4odGV4dCk7Ci0JCQlpbml0aWFsaXplZCA9IHRydWU7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbnN1cmVCdW5kbGVTdGFydGVkKFN0cmluZyBzeW1ib2xpY05hbWUpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHN5bWJvbGljTmFtZSk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJaWYgKGJ1bmRsZS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5SRVNPTFZFRCB8fCBidW5kbGUuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuU1RBUlRJTkcpIHsKLQkJCQlidW5kbGUuc3RhcnQoKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL0FsbEFQSVRlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvQWxsQVBJVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2NmY5ZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvQWxsQVBJVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYXBpOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIEFQSSB0ZXN0cwotICovCi1wdWJsaWMgY2xhc3MgQWxsQVBJVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFsbEFQSVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBMaXN0IG9mIEFQSSB0ZXN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLnNldE5hbWUoIkFQSSBUZXN0cyIpOwotCi0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0U2l0ZUFQSS5jbGFzcykpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdExvY2FsU2l0ZUFQSS5jbGFzcykpOwkJCi0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0VXBkYXRlTWFuYWdlclV0aWxzQVBJLmNsYXNzKSk7CQkKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3REZWZhdWx0RXhlY3V0YWJsZUZlYXR1cmVBUEkuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3REZWZhdWx0UGFja2FnZUZlYXR1cmVBUEkuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RQbHVnaW5Db250YWluZXJBUEkuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RTaXRlTWFuYWdlckFQSS5jbGFzcykpOwkJCi0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0TmVzdGVkRmVhdHVyZUFQSS5jbGFzcykpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEZlYXR1cmVDb250ZW50UHJvdmlkZXJfRmlsZUZpbHRlckFQSS5jbGFzcykpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL0RlZmF1bHRGZWF0dXJlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvRGVmYXVsdEZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgwY2NlNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvRGVmYXVsdEZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXI7Ci0vKioKLSAqIEFic3RyYWN0IENsYXNzIHRoYXQgaW1wbGVtZW50cyBtb3N0IG9mIHRoZSBiZWhhdmlvciBvZiBhIGZlYXR1cmUKLSAqIEEgZmVhdHVyZSBBTFdBWVMgYmVsb25ncyB0byBhbiBJU2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEZlYXR1cmUgZXh0ZW5kcyBGZWF0dXJlIHsKLQotCi0JLyoqCi0JICogQ29weSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBEZWZhdWx0RmVhdHVyZShJRmVhdHVyZSBzb3VyY2VGZWF0dXJlLCBJU2l0ZSB0YXJnZXRTaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRoaXModGFyZ2V0U2l0ZSk7Ci0JCXRoaXMuc2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcihzb3VyY2VGZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRoaXMuc2V0SWRlbnRpZmllcihzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7Ci0JCXRoaXMuc2V0TGFiZWwoc291cmNlRmVhdHVyZS5nZXRMYWJlbCgpKTsKLQkJdGhpcy5zZXRVcGRhdGVTaXRlRW50cnkoc291cmNlRmVhdHVyZS5nZXRVcGRhdGVTaXRlRW50cnkoKSk7Ci0JCXRoaXMuc2V0RGlzY292ZXJ5U2l0ZUVudHJpZXMoc291cmNlRmVhdHVyZS5nZXREaXNjb3ZlcnlTaXRlRW50cmllcygpKTsKLQkJdGhpcy5zZXRQcm92aWRlcihzb3VyY2VGZWF0dXJlLmdldFByb3ZpZGVyKCkpOwotCQl0aGlzLnNldERlc2NyaXB0aW9uKHNvdXJjZUZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCXRoaXMuc2V0Q29weXJpZ2h0KHNvdXJjZUZlYXR1cmUuZ2V0Q29weXJpZ2h0KCkpOwotCQl0aGlzLnNldExpY2Vuc2Uoc291cmNlRmVhdHVyZS5nZXRMaWNlbnNlKCkpOwotCQl0aGlzLnNldFBsdWdpbkVudHJpZXMoc291cmNlRmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCkpOwotCQl0aGlzLnNldEltYWdlKHNvdXJjZUZlYXR1cmUuZ2V0SW1hZ2UoKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIERlZmF1bHRGZWF0dXJlKElTaXRlIHRhcmdldFNpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zZXRTaXRlKHRhcmdldFNpdGUpOwkJCi0JfQkKLQkKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBpZGVudGlmaWVyCi0JICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SWRlbnRpZmllcihWZXJzaW9uZWRJZGVudGlmaWVyIGlkZW50aWZpZXIpIHsKLQkJc2V0RmVhdHVyZUlkZW50aWZpZXIoaWRlbnRpZmllci5nZXRJZGVudGlmaWVyKCkpOwotCQlzZXRGZWF0dXJlVmVyc2lvbihpZGVudGlmaWVyLmdldFZlcnNpb24oKS50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkaXNjb3ZlcnlTaXRlRW50cmllcwotCSAqIEBwYXJhbSBkaXNjb3ZlcnlJbmZvcyBUaGUgZGlzY292ZXJ5SW5mb3MgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzY292ZXJ5U2l0ZUVudHJpZXMoSVVSTEVudHJ5W10gZGlzY292ZXJ5SW5mb3MpIHsKLQkJc2V0RGlzY292ZXJ5U2l0ZUVudHJ5TW9kZWxzKChVUkxFbnRyeU1vZGVsW10pIGRpc2NvdmVyeUluZm9zKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB1cGRhdGVTaXRlRW50cnkKLQkgKiBAcGFyYW0gdXBkYXRlSW5mbyBUaGUgdXBkYXRlSW5mbyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVTaXRlRW50cnkoSVVSTEVudHJ5IHVwZGF0ZUluZm8pIHsKLQkJc2V0VXBkYXRlU2l0ZUVudHJ5TW9kZWwoKFVSTEVudHJ5TW9kZWwpIHVwZGF0ZUluZm8pOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBkaXNjb3ZlcnlJbmZvCi0JICogQHBhcmFtIGRpc2NvdmVyeUluZm8gVGhlIGRpc2NvdmVyeUluZm8gdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkRGlzY292ZXJ5U2l0ZUVudHJ5KElVUkxFbnRyeSBkaXNjb3ZlcnlJbmZvKSB7Ci0JCWFkZERpc2NvdmVyeVNpdGVFbnRyeU1vZGVsKChVUkxFbnRyeU1vZGVsKSBkaXNjb3ZlcnlJbmZvKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oSVVSTEVudHJ5IGRlc2NyaXB0aW9uKSB7Ci0JCXNldERlc2NyaXB0aW9uTW9kZWwoKFVSTEVudHJ5TW9kZWwpIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb3B5cmlnaHQKLQkgKiBAcGFyYW0gY29weXJpZ2h0IFRoZSBjb3B5cmlnaHQgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weXJpZ2h0KElVUkxFbnRyeSBjb3B5cmlnaHQpIHsKLQkJc2V0Q29weXJpZ2h0TW9kZWwoKFVSTEVudHJ5TW9kZWwpIGNvcHlyaWdodCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGljZW5zZQotCSAqIEBwYXJhbSBsaWNlbnNlIFRoZSBsaWNlbnNlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpY2Vuc2UoSVVSTEVudHJ5IGxpY2Vuc2UpIHsKLQkJc2V0TGljZW5zZU1vZGVsKChVUkxFbnRyeU1vZGVsKSBsaWNlbnNlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbWFnZQotCSAqIEBwYXJhbSBpbWFnZSBUaGUgaW1hZ2UgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SW1hZ2UoVVJMIGltYWdlKSB7Ci0JCWlmIChpbWFnZT09bnVsbCkgcmV0dXJuOwotCQlzZXRJbWFnZVVSTFN0cmluZyhpbWFnZS50b0V4dGVybmFsRm9ybSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGFuIGltcG9ydAotCSAqIEBwYXJhbSBhbkltcG9ydCBUaGUgaW1wb3J0IHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEltcG9ydChJSW1wb3J0IGFuSW1wb3J0KSB7Ci0JCWlmIChhbkltcG9ydCAhPSBudWxsKSB7Ci0JCQlhZGRJbXBvcnRNb2RlbCgoSW1wb3J0TW9kZWwpIGFuSW1wb3J0KTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogU2V0cyB0aGUgcGx1Z2luRW50cmllcwotCSAqIEBwYXJhbSBwbHVnaW5FbnRyaWVzIFRoZSBwbHVnaW5FbnRyaWVzIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBsdWdpbkVudHJpZXMoSVBsdWdpbkVudHJ5W10gcGx1Z2luRW50cmllcykgewotCQlpZiAocGx1Z2luRW50cmllcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbkVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlhZGRQbHVnaW5FbnRyeShwbHVnaW5FbnRyaWVzW2ldKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogc2V0cyB0ZWggVVJMIGlzZiBub3QgYWxyZWFkeSBwcmVzZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VVJMKFVSTCB1cmwpIHRocm93cyBDb3JlRXhjZXB0aW9uewotCQkvL2lmIChnZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCk9PW51bGwpewotCQkJRmVhdHVyZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIodXJsKTsKLQkJCXRoaXMuc2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQkJY29udGVudFByb3ZpZGVyLnNldEZlYXR1cmUodGhpcyk7Ci0JCS8vfQotCX0KLQkKLQkKLQkvKgotCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNhZGRQbHVnaW5FbnRyeShJUGx1Z2luRW50cnkpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGx1Z2luRW50cnkoSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5KSB7Ci0JCWlmIChwbHVnaW5FbnRyeSAhPSBudWxsKSB7Ci0JCQlhZGRQbHVnaW5FbnRyeU1vZGVsKChQbHVnaW5FbnRyeU1vZGVsKSBwbHVnaW5FbnRyeSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmUjYWRkTm9uUGx1Z2luRW50cnkoSU5vblBsdWdpbkVudHJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE5vblBsdWdpbkVudHJ5KElOb25QbHVnaW5FbnRyeSBkYXRhRW50cnkpIHsKLQkJaWYgKGRhdGFFbnRyeSAhPSBudWxsKSB7Ci0JCQlhZGROb25QbHVnaW5FbnRyeU1vZGVsKChOb25QbHVnaW5FbnRyeU1vZGVsKSBkYXRhRW50cnkpOwotCQl9Ci0JfQkKLQotCX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvTXlVUkxFbnRyeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL015VVJMRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ1YTlmMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvTXlVUkxFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlVSTEVudHJ5OwotCi0vKioKLSAqIFdyYXBwZXIgYXJvdW5kIFVSTEVudHJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBNeVVSTEVudHJ5IGV4dGVuZHMgVVJMRW50cnkgewotCQotCXB1YmxpYyBNeVVSTEVudHJ5KFN0cmluZyBhbm5vdGF0aW9uLCBVUkwgdXJsKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJc3VwZXIoKTsKLQkJc2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKLQkJaWYgKHVybCE9bnVsbCkgewotCQkJc2V0VVJMU3RyaW5nKHVybC50b0V4dGVybmFsRm9ybSgpKTsKLQkJCXJlc29sdmUobnVsbCxudWxsKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3REZWZhdWx0RXhlY3V0YWJsZUZlYXR1cmVBUEkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0RGVmYXVsdEV4ZWN1dGFibGVGZWF0dXJlQVBJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OThhMDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3REZWZhdWx0RXhlY3V0YWJsZUZlYXR1cmVBUEkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmFwaTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVNYW5hZ2VyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBUZXN0RGVmYXVsdEV4ZWN1dGFibGVGZWF0dXJlQVBJIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIERlZmF1bHRGZWF0dXJlIHJlbW90ZUZlYXR1cmU9bnVsbDsKLQkKLQkvKioKLQkgKiBUZXN0IHRoZSB0ZXN0RmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBUZXN0RGVmYXVsdEV4ZWN1dGFibGVGZWF0dXJlQVBJKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQkKLQkvKioKLQkgKiB0aGUgZmVhdHVyZSB0byB0ZXN0Ci0JICovCi0JcHJpdmF0ZSBEZWZhdWx0RmVhdHVyZSBnZXRGZWF0dXJlKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChyZW1vdGVGZWF0dXJlID09IG51bGwpewotCi0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsIG51bGwpOwotCQlVUkwgdXJsID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLCJ0ZXN0QVBJLyIrU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgrImZlYXR1cmUzLyIsbnVsbCk7Ci0JCVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IG5ldyBTaXRlRmVhdHVyZVJlZmVyZW5jZSgpOwotCQlyZWYuc2V0U2l0ZShzaXRlKTsKLQkJcmVmLnNldFVSTCh1cmwpOwotCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCXJlbW90ZUZlYXR1cmUgPSBuZXcgRGVmYXVsdEZlYXR1cmUoZmVhdHVyZSxzaXRlKTsKLQotCQl9Ci0JCXJldHVybiByZW1vdGVGZWF0dXJlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGlmaWVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBpZDEgPSAieG1scy9hcGl0ZXN0cy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAvIjsKLQkJU3RyaW5nIGlkMiA9ICJ4bWxzL2FwaXRlc3RzL29yZy5lY2xpcHNlX3Rlc3RfZmVhdHVyZSI7Ci0JCVZlcnNpb25lZElkZW50aWZpZXIgaWRlbnQxID0gbmV3IFZlcnNpb25lZElkZW50aWZpZXIoIm9yZy50ZXN0MS5pZGVudDEiLCIxLjAuMCIpOwotCQlWZXJzaW9uZWRJZGVudGlmaWVyIGlkZW50MiA9IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKCJvcmcudGVzdDEuaWRlbnQyIiwiMS4wLjAiKTsJCQotCQkKLQotCQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSxudWxsKTsKLQkJCQotCQkJVVJMIHVybDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksaWQxLG51bGwpOwkJCQotCQkJcmVtb3RlRmVhdHVyZSA9IG5ldyBEZWZhdWx0RmVhdHVyZShzaXRlKTsKLQkJCXJlbW90ZUZlYXR1cmUuc2V0VVJMKHVybDEpOwotCQkJcmVtb3RlRmVhdHVyZS5zZXRJZGVudGlmaWVyKGlkZW50MSk7Ci0JCQlhc3NlcnRFcXVhbHMoaWRlbnQxLnRvU3RyaW5nKCkscmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JIAkKLQkJCSBVUkwgdXJsMiA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSxpZDIsbnVsbCk7CQkKLQkJCXJlbW90ZUZlYXR1cmUgPSBuZXcgRGVmYXVsdEZlYXR1cmUoc2l0ZSk7Ci0JCQlyZW1vdGVGZWF0dXJlLnNldFVSTCh1cmwyKTsKLQkJCXJlbW90ZUZlYXR1cmUuc2V0SWRlbnRpZmllcihpZGVudDIpOwotCQkJYXNzZXJ0RXF1YWxzKGlkZW50Mi50b1N0cmluZygpLHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQkKLQotCX0KLQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l0ZSgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb257Ci0JCVN0cmluZyBpZGVudDEgPSBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCsiZmVhdHVyZTMvIjsJCQotCi0JCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFLG51bGwpOwotCQkJCi0JCQlVUkwgaWQgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksaWRlbnQxLG51bGwpOwkJCQotCQkJcmVtb3RlRmVhdHVyZSA9IG5ldyBEZWZhdWx0RmVhdHVyZShzaXRlKTsKLQkJCXJlbW90ZUZlYXR1cmUuc2V0VVJMKGlkKTsKLQkJCWFzc2VydEVxdWFscyhzaXRlLHJlbW90ZUZlYXR1cmUuZ2V0U2l0ZSgpKTsKLQotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdExhYmVsKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGxhYmVsID0gImR1bW15IGxhYmVsIjsKLQkJRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZSgpOwotCQlmZWF0dXJlLnNldExhYmVsKGxhYmVsKTsKLQkJYXNzZXJ0RXF1YWxzKGxhYmVsLGZlYXR1cmUuZ2V0TGFiZWwoKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVVJMKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJVVJMIHVybCA9IG51bGw7Ci0JCVN0cmluZyBsYWJlbCA9ICJPVEkgU2l0ZSI7Ci0JCXRyeSB7Ci0JCQl1cmwgPSBuZXcgVVJMKCJodHRwOi8vd3d3Lm90aS5jb20vIik7Ci0JCQkKLQkJfSBjYXRjaCAoamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpe30gLy8gaW1wb3NzaWJsZSBlaCAhCi0JCURlZmF1bHRGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7Ci0JCWZlYXR1cmUuc2V0VXBkYXRlU2l0ZUVudHJ5KG5ldyBNeVVSTEVudHJ5KGxhYmVsLCB1cmwpKTsKLQkJYXNzZXJ0RXF1YWxzKHVybCxmZWF0dXJlLmdldFVwZGF0ZVNpdGVFbnRyeSgpLmdldFVSTCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGxhYmVsLGZlYXR1cmUuZ2V0VXBkYXRlU2l0ZUVudHJ5KCkuZ2V0QW5ub3RhdGlvbigpKTsKLQotCX0gCi0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3REaXNjb3ZlcnlVUkxzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJSVVSTEVudHJ5W10gdXJsSW5mbyA9IG5ldyBNeVVSTEVudHJ5WzJdOwotCQlVUkxbXSB1cmwgPSBuZXcgVVJMWzJdOwotCQlTdHJpbmdbXSBsYWJlbCA9IG5ldyBTdHJpbmdbMl07Ci0JCXRyeSB7Ci0JCQl1cmxbMF0gPSBuZXcgVVJMKCJodHRwOi8vd3d3Lm90aS5jb20vIik7Ci0JCQl1cmxbMV0gPSBuZXcgVVJMKCJodHRwOi8vZWNsaXBzZS5vcmcvIik7Ci0JCQlsYWJlbFswXSA9ICJPVEkgU2l0ZSI7Ci0JCQlsYWJlbFsxXSA9ICJFY2xpcHNlIFNpdGUiOwotCQl9IGNhdGNoIChqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7fSAvLyBpbXBvc3NpYmxlIGVoICEKLQkJRGVmYXVsdEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUoKTsKLQkJZm9yIChpbnQgaT0wO2k8MjtpKyspewotCQkJCXVybEluZm9baV0gPSBuZXcgTXlVUkxFbnRyeShsYWJlbFtpXSx1cmxbaV0pOwotCQl9Ci0JCWZlYXR1cmUuc2V0RGlzY292ZXJ5U2l0ZUVudHJpZXModXJsSW5mbyk7Ci0JCWZvciAoaW50IGk9MDsgaTxmZWF0dXJlLmdldERpc2NvdmVyeVNpdGVFbnRyaWVzKCkubGVuZ3RoO2krKyl7Ci0JCQlhc3NlcnRFcXVhbHModXJsSW5mb1tpXSxmZWF0dXJlLmdldERpc2NvdmVyeVNpdGVFbnRyaWVzKClbaV0pOwotCQl9Ci0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm92aWRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uLE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBwcm92aWRlciA9ICJub3Qgc28gZHVtbXkgcHJvdmlkZXIiOwotCQlJRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZSgpOwotCQkoKEZlYXR1cmUpZmVhdHVyZSkuc2V0UHJvdmlkZXIocHJvdmlkZXIpOwotCQlhc3NlcnRFcXVhbHMocHJvdmlkZXIsZmVhdHVyZS5nZXRQcm92aWRlcigpKTsKLQl9Ci0KLQotCi0JcHVibGljIHZvaWQgdGVzdERlc2NyaXB0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGRlc2MgPSAicHJldHR5IGxvbmcgZGVzY3JpcHRpb24gYXMgYSBzdHJpbmcgd2l0aCBcclxuIGFuZCBcdCBhbmQgXG4iOwotCQlJVVJMRW50cnkgaW5mbyA9IG5ldyBNeVVSTEVudHJ5KGRlc2MsbnVsbCk7Ci0JCURlZmF1bHRGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7Ci0JCWZlYXR1cmUuc2V0RGVzY3JpcHRpb24oaW5mbyk7Ci0JCWFzc2VydEVxdWFscyhkZXNjLGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKS5nZXRBbm5vdGF0aW9uKCkpOwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHRlc3REZXNjcmlwdGlvbjEoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJVVJMIHVybCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl1cmwgPSBuZXcgVVJMKCJodHRwOi8vd3d3Lm90aS5jb20iKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpey8qcHJldHR5IGltcG9zc2libGUqL30KLQkJSVVSTEVudHJ5IGluZm8gPSBuZXcgTXlVUkxFbnRyeShudWxsLHVybCk7Ci0JCURlZmF1bHRGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7Ci0JCWZlYXR1cmUuc2V0RGVzY3JpcHRpb24oaW5mbyk7Ci0JCWFzc2VydEVxdWFscyh1cmwsZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpLmdldFVSTCgpKTsKLQl9CQotCQotCi0JcHVibGljIHZvaWQgdGVzdERlc2NyaXB0aW9uMigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQkKLSAJIFVSTCB1cmwgPSBudWxsOwotCQl0cnkgewotCQkJdXJsID0gbmV3IFVSTCgiaHR0cDovL3d3dy5vdGkuY29tIik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXsvKnByZXR0eSBpbXBvc3NpYmxlKi99Ci0JCVN0cmluZyBkZXNjID0gInByZXR0eSBsb25nIGRlc2NyaXB0aW9uIGFzIGEgc3RyaW5nIHdpdGggXHJcbiBhbmQgXHQgYW5kIFxuIjsKLQkJSVVSTEVudHJ5IGluZm8gPSBuZXcgTXlVUkxFbnRyeShkZXNjLHVybCk7Ci0JCURlZmF1bHRGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7Ci0JCWZlYXR1cmUuc2V0RGVzY3JpcHRpb24oaW5mbyk7Ci0JCVN0cmluZyByZXN1bHQgPSBmZWF0dXJlLmdldERlc2NyaXB0aW9uKCkuZ2V0QW5ub3RhdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoZGVzYyxyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHModXJsLGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKS5nZXRVUkwoKSk7Ci0JfQkKLQotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3REZWZhdWx0UGFja2FnZUZlYXR1cmVBUEkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0RGVmYXVsdFBhY2thZ2VGZWF0dXJlQVBJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYjY2MGMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3REZWZhdWx0UGFja2FnZUZlYXR1cmVBUEkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmFwaTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVNYW5hZ2VyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBUZXN0RGVmYXVsdFBhY2thZ2VGZWF0dXJlQVBJIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQkKLQlwcml2YXRlCURlZmF1bHRGZWF0dXJlIHJlbW90ZUZlYXR1cmU9bnVsbDsKLQkKLQkvKioKLQkgKiBUZXN0IHRoZSB0ZXN0RmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBUZXN0RGVmYXVsdFBhY2thZ2VGZWF0dXJlQVBJKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQkKLQkvKioKLQkgKiB0aGUgZmVhdHVyZSB0byB0ZXN0Ci0JICovCi0JcHJpdmF0ZSBEZWZhdWx0RmVhdHVyZSBnZXRGZWF0dXJlKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChyZW1vdGVGZWF0dXJlID09IG51bGwpewotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFLCBudWxsKTsKLQkJVVJMIGlkID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMV8xLjAuMC5qYXIiLG51bGwpOwkKLQkJcmVtb3RlRmVhdHVyZSA9IG5ldyBEZWZhdWx0RmVhdHVyZShzaXRlKTsKLQkJcmVtb3RlRmVhdHVyZS5zZXRVUkwoaWQpOwotCQl9Ci0JCXJldHVybiByZW1vdGVGZWF0dXJlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGlmaWVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCQotCQlTdHJpbmcgaWQxID0gImZlYXR1cmVzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC5qYXIiOwotCQlTdHJpbmcgaWQyID0gImZlYXR1cmVzL29yZy5lY2xpcHNlX3Rlc3RfZmVhdHVyZS5qYXIiOwotCQlWZXJzaW9uZWRJZGVudGlmaWVyIGlkZW50MSA9IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKCJvcmcudGVzdDEuaWRlbnQxIiwiMS4wLjAiKTsKLQkJVmVyc2lvbmVkSWRlbnRpZmllciBpZGVudDIgPSBuZXcgVmVyc2lvbmVkSWRlbnRpZmllcigib3JnLnRlc3QxLmlkZW50MiIsIjEuMC4wIik7CQkKLQkJCi0KLQkJCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsIG51bGwpOwotCQkJCi0JCQlVUkwgdXJsMSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSxpZDEsbnVsbCk7CQkJCi0JCQlyZW1vdGVGZWF0dXJlID0gbmV3IERlZmF1bHRGZWF0dXJlKHNpdGUpOwotCQkJcmVtb3RlRmVhdHVyZS5zZXRVUkwodXJsMSk7Ci0JCQlyZW1vdGVGZWF0dXJlLnNldElkZW50aWZpZXIoaWRlbnQxKTsKLQkJCWFzc2VydEVxdWFscyhpZGVudDEudG9TdHJpbmcoKSxyZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJCi0JCQkgVVJMIHVybDIgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksaWQyLG51bGwpOwkJCi0JCQlyZW1vdGVGZWF0dXJlID0gbmV3IERlZmF1bHRGZWF0dXJlKHNpdGUpOwotCQkJcmVtb3RlRmVhdHVyZS5zZXRVUkwodXJsMik7Ci0JCQlyZW1vdGVGZWF0dXJlLnNldElkZW50aWZpZXIoaWRlbnQyKTsJCQkKLQkJCWFzc2VydEVxdWFscyhpZGVudDIudG9TdHJpbmcoKSxyZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXRlKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBpZGVudDEgPSAib3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLmphciI7CQkKLQotCQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSwgbnVsbCk7Ci0JCQkKLQkJCVVSTCBpZCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSxpZGVudDEsbnVsbCk7CQkKLQkJCXJlbW90ZUZlYXR1cmUgPSBuZXcgRGVmYXVsdEZlYXR1cmUoc2l0ZSk7Ci0JCQlyZW1vdGVGZWF0dXJlLnNldFVSTChpZCk7CQotCQkJYXNzZXJ0RXF1YWxzKHNpdGUscmVtb3RlRmVhdHVyZS5nZXRTaXRlKCkpOwotCi0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFiZWwoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGxhYmVsID0gImR1bW15IGxhYmVsIjsKLQkJRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZSgpOwotCQlmZWF0dXJlLnNldExhYmVsKGxhYmVsKTsKLQkJYXNzZXJ0RXF1YWxzKGxhYmVsLGZlYXR1cmUuZ2V0TGFiZWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVVSTCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlVUkwgdXJsID0gbnVsbDsKLQkJU3RyaW5nIGxhYmVsID0gIk9USSBTaXRlIjsKLQkJdHJ5IHsKLQkJCXVybCA9IG5ldyBVUkwoImh0dHA6Ly93d3cub3RpLmNvbS8iKTsKLQkJCQotCQl9IGNhdGNoIChqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7fSAvLyBpbXBvc3NpYmxlIGVoICEKLQkJRGVmYXVsdEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUoKTsKLQkJZmVhdHVyZS5zZXRVcGRhdGVTaXRlRW50cnkobmV3IE15VVJMRW50cnkobGFiZWwsIHVybCkpOwotCQlhc3NlcnRFcXVhbHModXJsLGZlYXR1cmUuZ2V0VXBkYXRlU2l0ZUVudHJ5KCkuZ2V0VVJMKCkpOwotCQlhc3NlcnRFcXVhbHMobGFiZWwsZmVhdHVyZS5nZXRVcGRhdGVTaXRlRW50cnkoKS5nZXRBbm5vdGF0aW9uKCkpOwotCi0JfSAKLQotCi0JCi0JcHVibGljIHZvaWQgdGVzdERpc2NvdmVyeVVSTHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJSVVSTEVudHJ5W10gdXJsSW5mbyA9IG5ldyBVUkxFbnRyeVsyXTsKLQkJVVJMW10gdXJsID0gbmV3IFVSTFsyXTsKLQkJU3RyaW5nW10gbGFiZWwgPSBuZXcgU3RyaW5nWzJdOwotCQl0cnkgewotCQkJdXJsWzBdID0gbmV3IFVSTCgiaHR0cDovL3d3dy5vdGkuY29tLyIpOwotCQkJdXJsWzFdID0gbmV3IFVSTCgiaHR0cDovL2VjbGlwc2Uub3JnLyIpOwotCQkJbGFiZWxbMF0gPSAiT1RJIFNpdGUiOwotCQkJbGFiZWxbMV0gPSAiRWNsaXBzZSBTaXRlIjsKLQkJfSBjYXRjaCAoamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpe30gLy8gaW1wb3NzaWJsZSBlaCAhCi0JCURlZmF1bHRGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7Ci0JCWZvciAoaW50IGk9MDtpPDI7aSsrKXsKLQkJCQl1cmxJbmZvW2ldID0gbmV3IE15VVJMRW50cnkobGFiZWxbaV0sdXJsW2ldKTsKLQkJfQotCQlmZWF0dXJlLnNldERpc2NvdmVyeVNpdGVFbnRyaWVzKHVybEluZm8pOwotCQlmb3IgKGludCBpPTA7IGk8ZmVhdHVyZS5nZXREaXNjb3ZlcnlTaXRlRW50cmllcygpLmxlbmd0aDtpKyspewotCQkJYXNzZXJ0RXF1YWxzKHVybEluZm9baV0sZmVhdHVyZS5nZXREaXNjb3ZlcnlTaXRlRW50cmllcygpW2ldKTsKLQkJfQotCi0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm92aWRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlTdHJpbmcgcHJvdmlkZXIgPSAibm90IHNvIGR1bW15IHByb3ZpZGVyIjsKLQkJRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZSgpOwotCQlmZWF0dXJlLnNldFByb3ZpZGVyKHByb3ZpZGVyKTsKLQkJYXNzZXJ0RXF1YWxzKHByb3ZpZGVyLGZlYXR1cmUuZ2V0UHJvdmlkZXIoKSk7Ci0JfQotCi0KLQotCXB1YmxpYyB2b2lkIHRlc3REZXNjcmlwdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlTdHJpbmcgZGVzYyA9ICJwcmV0dHkgbG9uZyBkZXNjcmlwdGlvbiBhcyBhIHN0cmluZyB3aXRoIFxyXG4gYW5kIFx0IGFuZCBcbiI7Ci0JCUlVUkxFbnRyeSBpbmZvID0gbmV3IE15VVJMRW50cnkoZGVzYyxudWxsKTsKLQkJRGVmYXVsdEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUoKTsKLQkJZmVhdHVyZS5zZXREZXNjcmlwdGlvbihpbmZvKTsKLQkJYXNzZXJ0RXF1YWxzKGRlc2MsZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpLmdldEFubm90YXRpb24oKSk7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgdGVzdERlc2NyaXB0aW9uMSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlVUkwgdXJsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXVybCA9IG5ldyBVUkwoImh0dHA6Ly93d3cub3RpLmNvbSIpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7LypwcmV0dHkgaW1wb3NzaWJsZSovfQotCQlJVVJMRW50cnkgaW5mbyA9IG5ldyBNeVVSTEVudHJ5KG51bGwsdXJsKTsKLQkJRGVmYXVsdEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUoKTsKLQkJZmVhdHVyZS5zZXREZXNjcmlwdGlvbihpbmZvKTsKLQkJYXNzZXJ0RXF1YWxzKHVybCxmZWF0dXJlLmdldERlc2NyaXB0aW9uKCkuZ2V0VVJMKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdERlc2NyaXB0aW9uMigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQkKLQkJVVJMIHVybCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl1cmwgPSBuZXcgVVJMKCJodHRwOi8vd3d3Lm90aS5jb20iKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpey8qcHJldHR5IGltcG9zc2libGUqL30KLQkJU3RyaW5nIGRlc2MgPSAicHJldHR5IGxvbmcgZGVzY3JpcHRpb24gYXMgYSBzdHJpbmcgd2l0aCBcclxuIGFuZCBcdCBhbmQgXG4iOwotCQlJVVJMRW50cnkgaW5mbyA9IG5ldyBNeVVSTEVudHJ5KGRlc2MsdXJsKTsKLQkJRGVmYXVsdEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUoKTsKLQkJZmVhdHVyZS5zZXREZXNjcmlwdGlvbihpbmZvKTsKLQkJYXNzZXJ0RXF1YWxzKGRlc2MsZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpLmdldEFubm90YXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh1cmwsZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpLmdldFVSTCgpKTsKLQl9Ci0KLQotCi19Ci0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0RmVhdHVyZUNvbnRlbnRQcm92aWRlcl9GaWxlRmlsdGVyQVBJLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdEZlYXR1cmVDb250ZW50UHJvdmlkZXJfRmlsZUZpbHRlckFQSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWIyMThjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0RmVhdHVyZUNvbnRlbnRQcm92aWRlcl9GaWxlRmlsdGVyQVBJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmFwaTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5GZWF0dXJlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLQotCi1wdWJsaWMgY2xhc3MgVGVzdEZlYXR1cmVDb250ZW50UHJvdmlkZXJfRmlsZUZpbHRlckFQSSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JCi0JCi0JLyoqCi0JICogVGVzdCB0aGUgdGVzdEZlYXR1cmVzKCkKLQkgKi8KLQlwdWJsaWMgVGVzdEZlYXR1cmVDb250ZW50UHJvdmlkZXJfRmlsZUZpbHRlckFQSShTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEZpbGVGaWx0ZXIoKXsKLQkJCi0JCVN0cmluZyBwMSA9ICIvcDEvcDIvYS4qIjsKLQkJU3RyaW5nIHAyID0gInAxL3AyL2IuKiI7Ci0JCVN0cmluZyBwMyA9ICIvcDEvcDIvYS50eHQiOwotCQlTdHJpbmcgcDQgPSAiL3AxL3AyLyoudHh0IjsKLQkJCi0JCVN0cmluZyBuYW1lMSA9ICIvcDEvcDIvYS50eHQiOwotCQlTdHJpbmcgbmFtZTIgPSAiL3AxL3AyL2IudHh0IjsKLQkJU3RyaW5nIG5hbWUzID0gIi9wMy9wMi9hLnR4dCI7Ci0JCVN0cmluZyBuYW1lNCA9ICJwMS9wMi9hLnR4dCI7Ci0JCVN0cmluZyBuYW1lNSA9ICIvcDEvcDIvYi50eHQiOwotCQlTdHJpbmcgbmFtZTYgPSAiL3AxL3AyL2MudHh0IjsKLQkJU3RyaW5nIG5hbWU3ID0gIi9wMS9wMi9wMy9hLnR4dCI7Ci0JCQotCQkKLQkJRmVhdHVyZUNvbnRlbnRQcm92aWRlciBjcCA9IG5ldyBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcihudWxsKTsKLQkJCi0JCUZlYXR1cmVDb250ZW50UHJvdmlkZXIuRmlsZUZpbHRlciBmaWx0ZXIxID0gY3AubmV3IEZpbGVGaWx0ZXIocDEpOwotCQlGZWF0dXJlQ29udGVudFByb3ZpZGVyLkZpbGVGaWx0ZXIgZmlsdGVyMiA9IGNwLm5ldyBGaWxlRmlsdGVyKHAyKTsKLQkJRmVhdHVyZUNvbnRlbnRQcm92aWRlci5GaWxlRmlsdGVyIGZpbHRlcjMgPSBjcC5uZXcgRmlsZUZpbHRlcihwMyk7Ci0JCUZlYXR1cmVDb250ZW50UHJvdmlkZXIuRmlsZUZpbHRlciBmaWx0ZXI0ID0gY3AubmV3IEZpbGVGaWx0ZXIocDQpOwotCi0JCWFzc2VydFRydWUoIjEuMSIsZmlsdGVyMS5hY2NlcHQobmFtZTEpKTsJCQotCQlhc3NlcnRUcnVlKCIxLjIiLCFmaWx0ZXIxLmFjY2VwdChuYW1lMikpOwkJCi0JCWFzc2VydFRydWUoIjEuMyIsIWZpbHRlcjEuYWNjZXB0KG5hbWUzKSk7CQotCQlhc3NlcnRUcnVlKCIxLjQiLCFmaWx0ZXIxLmFjY2VwdChuYW1lNCkpOwkJCi0JCWFzc2VydFRydWUoIjEuNSIsIWZpbHRlcjEuYWNjZXB0KG5hbWU1KSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiMS42IiwhZmlsdGVyMS5hY2NlcHQobmFtZTYpKTsJCQotCQlhc3NlcnRUcnVlKCIxLjciLCFmaWx0ZXIxLmFjY2VwdChuYW1lNykpOwotCQotCQlhc3NlcnRUcnVlKCIyLjEiLCFmaWx0ZXIyLmFjY2VwdChuYW1lMSkpOwkJCi0JCWFzc2VydFRydWUoIjIuMiIsIWZpbHRlcjIuYWNjZXB0KG5hbWUyKSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiMi4zIiwhZmlsdGVyMi5hY2NlcHQobmFtZTMpKTsJCi0JCWFzc2VydFRydWUoIjIuNCIsIWZpbHRlcjIuYWNjZXB0KG5hbWU0KSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiMi41IiwhZmlsdGVyMi5hY2NlcHQobmFtZTUpKTsJCQotCQlhc3NlcnRUcnVlKCIyLjYiLCFmaWx0ZXIyLmFjY2VwdChuYW1lNikpOwkJCi0JCWFzc2VydFRydWUoIjIuNyIsIWZpbHRlcjIuYWNjZXB0KG5hbWU3KSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMy4xIixmaWx0ZXIzLmFjY2VwdChuYW1lMSkpOwkJCi0JCWFzc2VydFRydWUoIjMuMiIsIWZpbHRlcjMuYWNjZXB0KG5hbWUyKSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiMy4zIiwhZmlsdGVyMy5hY2NlcHQobmFtZTMpKTsJCi0JCWFzc2VydFRydWUoIjMuNCIsIWZpbHRlcjMuYWNjZXB0KG5hbWU0KSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiMy41IiwhZmlsdGVyMy5hY2NlcHQobmFtZTUpKTsJCQotCQlhc3NlcnRUcnVlKCIzLjYiLCFmaWx0ZXIzLmFjY2VwdChuYW1lNikpOwkJCi0JCWFzc2VydFRydWUoIjMuNyIsIWZpbHRlcjMuYWNjZXB0KG5hbWU3KSk7Ci0JCQotCQlhc3NlcnRUcnVlKCI0LjEiLGZpbHRlcjQuYWNjZXB0KG5hbWUxKSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiNC4yIixmaWx0ZXI0LmFjY2VwdChuYW1lMikpOwkJCi0JCWFzc2VydFRydWUoIjQuMyIsIWZpbHRlcjQuYWNjZXB0KG5hbWUzKSk7CQotCQlhc3NlcnRUcnVlKCI0LjQiLCFmaWx0ZXI0LmFjY2VwdChuYW1lNCkpOwkJCi0JCWFzc2VydFRydWUoIjQuNSIsZmlsdGVyNC5hY2NlcHQobmFtZTUpKTsJCQotCQlhc3NlcnRUcnVlKCI0LjYiLGZpbHRlcjQuYWNjZXB0KG5hbWU2KSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiNC43IiwhZmlsdGVyNC5hY2NlcHQobmFtZTcpKTsJCQkJCQkJCQotCQkJCQkKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0TG9jYWxTaXRlQVBJLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdExvY2FsU2l0ZUFQSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTRhYTJlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0TG9jYWxTaXRlQVBJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5DYXRlZ29yeU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLlNpdGVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgVGVzdExvY2FsU2l0ZUFQSSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JCi0JLyoqCi0JICogVGVzdCB0aGUgZ2V0RmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBUZXN0TG9jYWxTaXRlQVBJKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RmlsZVBhcnNpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsInNpdGVUZXN0TG9jYWxTaXRlLyIpLCBudWxsKTsKLQkJSUFyY2hpdmVSZWZlcmVuY2VbXSBpbmZvID0gc2l0ZS5nZXRBcmNoaXZlcygpOwotCQkKLQkJaWYgKGluZm8ubGVuZ3RoPD0wKXsKLQkJCWZhaWwoIm5vIHBsdWdpbnMgaW4gc2l0ZTogIitzaXRlLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQl9Ci0JCSAKLQkJYm9vbGVhbiBmb3VuZDEgPSBmYWxzZTsKLQkJYm9vbGVhbiBmb3VuZDIgPSBmYWxzZTsKLQkJU3RyaW5nIG5hbWUxPSAicGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphciI7Ci0JCVN0cmluZyBuYW1lMiA9ICJwbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjEuamFyIjsKLQkJCi0JCWZvciAoaW50IGkgPTA7IGk8aW5mby5sZW5ndGg7IGkrKyl7Ci0JCQlpZiAoaW5mb1tpXS5nZXRQYXRoKCkuZXF1YWxzKG5hbWUxKSkgZm91bmQxID0gdHJ1ZTsKLQkJCWlmIChpbmZvW2ldLmdldFBhdGgoKS5lcXVhbHMobmFtZTIpKSBmb3VuZDIgPSB0cnVlOwotCQl9Ci0JCQotCQlpZiAoIWZvdW5kMSB8fCAhZm91bmQyKXsKLQkJCWZhaWwoIkNhbm5vdCBmaW5kIHBsdWdpbiA6IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjIgdmVyc2lvbiA1LjAuMCBhbmQgNS4wLjEgb24gdGhlIHNpdGUsIGJ5IHBhcnNpbmcgZmlsZSBzeXN0ZW0iKTsKLQkJfQotCQkKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QnVuZGxlTWFuaWZlc3RQYXJzaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFLCJzaXRlVGVzdExvY2FsU2l0ZS8iKSxudWxsKTsKLQkJSUFyY2hpdmVSZWZlcmVuY2VbXSBpbmZvID0gc2l0ZS5nZXRBcmNoaXZlcygpOwotCQkKLQkJaWYgKGluZm8ubGVuZ3RoPD0wKXsKLQkJCWZhaWwoIm5vIHBsdWdpbnMgaW4gc2l0ZTogIitzaXRlLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQl9Ci0JCSAKLQkJYm9vbGVhbiBmb3VuZDEgPSBmYWxzZTsKLQkJYm9vbGVhbiBmb3VuZDIgPSBmYWxzZTsKLQkJYm9vbGVhbiBmb3VuZDMgPSBmYWxzZTsKLQkJU3RyaW5nIG5hbWUxPSAicGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5idW5kbGVNYW5pZmVzdF8xLjAuMS5qYXIiOwotCQlTdHJpbmcgbmFtZTIgPSAicGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5idW5kbGVBbmRQbHVnaW5NYW5pZmVzdHNCVU5ETEVQQVJTRURfMS4wLjMuamFyIjsKLQkJU3RyaW5nIG5hbWUzID0gInBsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuYnVuZGxlQW5kUGx1Z2luTWFuaWZlc3RzXzEuMC4zLmphciI7Ci0JCQotCQlmb3IgKGludCBpID0wOyBpPGluZm8ubGVuZ3RoOyBpKyspewotCQkJaWYgKGluZm9baV0uZ2V0UGF0aCgpLmVxdWFscyhuYW1lMSkpIGZvdW5kMSA9IHRydWU7Ci0JCQlpZiAoaW5mb1tpXS5nZXRQYXRoKCkuZXF1YWxzKG5hbWUyKSkgZm91bmQyID0gdHJ1ZTsKLQkJCWlmIChpbmZvW2ldLmdldFBhdGgoKS5lcXVhbHMobmFtZTMpKSBmb3VuZDMgPSB0cnVlOwotCQl9Ci0JCQotCQlpZiAoIWZvdW5kMSB8fCAhZm91bmQyKXsKLQkJCWZhaWwoIkNhbm5vdCBmaW5kIHBsdWdpbiA6IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjIgdmVyc2lvbiA1LjAuMCBhbmQgNS4wLjEgb24gdGhlIHNpdGUsIGJ5IHBhcnNpbmcgZmlsZSBzeXN0ZW0iKTsKLQkJfQotCQlpZiAoZm91bmQzKXsKLQkJCWZhaWwoIlBsdWdpbiBtYW5pZmVzdCBwYXJzZWQgaW5zdGVhZCBvZiBidW5kbGUgbWFuaWZlc3QuIik7Ci0JCX0KLQkJCi0KLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdENhdGVnb3JpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFLCBudWxsKTsKLQkJCi0JCUlDYXRlZ29yeSBjYXRlZ29yeSA9IG5ldyBDYXRlZ29yeSgiY2F0ZWdvcnkiLCJMYWJlbCBvZiBjYXRlZ29yeSIpOwotCQkKLQkJKChTaXRlTW9kZWwpc2l0ZSkuYWRkQ2F0ZWdvcnlNb2RlbCgoQ2F0ZWdvcnlNb2RlbCljYXRlZ29yeSk7Ci0JCQotCQlJQ2F0ZWdvcnlbXSBjYXRlZ29yaWVzID0gc2l0ZS5nZXRDYXRlZ29yaWVzKCk7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNhdGVnb3JpZXMubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQlJQ2F0ZWdvcnkgZWxlbWVudCA9IGNhdGVnb3JpZXNbaW5kZXhdOwotCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscygiY2F0ZWdvcnkiKSkgZm91bmQgPSB0cnVlOwotCQl9Ci0JCWlmICghZm91bmQpIGZhaWwoImNhbm5vdCBmaW5kIGNhdGVnb3J5ICdjYXRlZ29yeScgaW4gc2l0ZSIpOwotCi0JCUlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsKLQkJcmVmLnNldFNpdGUoc2l0ZSk7Ci0JCXJlZi5hZGRDYXRlZ29yeShjYXRlZ29yeSk7CQkKLQkJY2F0ZWdvcmllcyA9IHJlZi5nZXRDYXRlZ29yaWVzKCk7Ci0JCWZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBjYXRlZ29yaWVzLmxlbmd0aDsgaW5kZXgrKykgewotCQkJSUNhdGVnb3J5IGVsZW1lbnQgPSBjYXRlZ29yaWVzW2luZGV4XTsKLQkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoImNhdGVnb3J5IikpIGZvdW5kID0gdHJ1ZTsKLQkJfQotCQlpZiAoIWZvdW5kKSBmYWlsKCJjYW5ub3QgZmluZCBjYXRlZ29yeSAnY2F0ZWdvcnknIGluIGZlYXR1cmUiKTsKLQkJCi0JCQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3ROZXN0ZWRGZWF0dXJlQVBJLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdE5lc3RlZEZlYXR1cmVBUEkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODllMzA2MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdE5lc3RlZEZlYXR1cmVBUEkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmFwaTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVNYW5hZ2VyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFRlc3ROZXN0ZWRGZWF0dXJlQVBJIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIFRlc3QgdGhlIHRlc3RGZWF0dXJlcygpCi0JICovCi0JcHVibGljIFRlc3ROZXN0ZWRGZWF0dXJlQVBJKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCS8qKgotCSAqIHRoZSBmZWF0dXJlIHRvIHRlc3QKLQkgKi8KLQlwcml2YXRlIElGZWF0dXJlIGdldFJvb3RGZWF0dXJlKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSwgIm5lc3RlZEZlYXR1cmVTaXRlVGVzdC9zaXRlLnhtbCIpLG51bGwpOwotCQlVUkwgdXJsID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArICJyb290ZmVhdHVyZS5qYXIiLCBudWxsKTsKLQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7Ci0JCXJlZi5zZXRTaXRlKHNpdGUpOwotCQlyZWYuc2V0VVJMKHVybCk7Ci0JCXJlZi5zZXRUeXBlKElTaXRlLkRFRkFVTFRfUEFDS0FHRURfRkVBVFVSRV9UWVBFKTsKLQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiB0aGUgZmVhdHVyZSB0byB0ZXN0Ci0JICovCi0JcHJpdmF0ZSBJRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsICJuZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvIiksIG51bGwpOwotCQlVUkwgdXJsID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArICJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5jaGlsZHJlbmZlYXR1cmVfMi4wLjAuamFyIiwgbnVsbCk7Ci0JCVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IG5ldyBTaXRlRmVhdHVyZVJlZmVyZW5jZSgpOwotCQlyZWYuc2V0U2l0ZShzaXRlKTsKLQkJcmVmLnNldFVSTCh1cmwpOwotCQlyZWYuc2V0VHlwZShJU2l0ZS5ERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRSk7Ci0JCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJSUZlYXR1cmUgcm9vdEZlYXR1cmUgPSBnZXRSb290RmVhdHVyZSgpOwotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZiA9IHJvb3RGZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJSUZlYXR1cmUgY2hpbGRGZWF0dXJlID0gZ2V0Q2hpbGRGZWF0dXJlKCk7Ci0JCWFzc2VydEVxdWFscygiQ2hpbGRyZW4gZmVhdHVyZSBhcmUgbm90IGVxdWFsIiwgY2hpbGRGZWF0dXJlLCByZWZbMF0uZ2V0RmVhdHVyZShudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogdGhlIGZlYXR1cmUgdG8gdGVzdAotCSAqLwotCXByaXZhdGUgSUZlYXR1cmUgZ2V0Um9vdEZlYXR1cmUyKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSwgIm5lc3RlZEZlYXR1cmVTaXRlVGVzdDIvc2l0ZS54bWwiKSxudWxsKTsKLQkJVVJMIHVybCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyAicm9vdGZlYXR1cmUuamFyIiwgbnVsbCk7Ci0JCVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IG5ldyBTaXRlRmVhdHVyZVJlZmVyZW5jZSgpOwotCQlyZWYuc2V0U2l0ZShzaXRlKTsKLQkJcmVmLnNldFVSTCh1cmwpOwotCQlyZWYuc2V0VHlwZShJU2l0ZS5ERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRSk7Ci0JCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogdGhlIGZlYXR1cmUgdG8gdGVzdAotCSAqLwotCXByaXZhdGUgSUZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlMigpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSwgIm5lc3RlZEZlYXR1cmVTaXRlVGVzdDIvc2l0ZS54bWwiKSxudWxsKTsKLQkJVVJMIHVybCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyAiY2hpbGRyZW5mZWF0dXJlLmphciIsIG51bGwpOwotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsKLQkJcmVmLnNldFNpdGUoc2l0ZSk7Ci0JCXJlZi5zZXRVUkwodXJsKTsKLQkJcmVmLnNldFR5cGUoSVNpdGUuREVGQVVMVF9QQUNLQUdFRF9GRUFUVVJFX1RZUEUpOwotCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlJRmVhdHVyZSByb290RmVhdHVyZSA9IGdldFJvb3RGZWF0dXJlMigpOwotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZiA9IHJvb3RGZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJSUZlYXR1cmUgY2hpbGRGZWF0dXJlID0gZ2V0Q2hpbGRGZWF0dXJlMigpOwotCQlhc3NlcnRFcXVhbHMoIkNoaWxkcmVuIGZlYXR1cmUgYXJlIG5vdCBlcXVhbCIsIGNoaWxkRmVhdHVyZSwgcmVmWzBdLmdldEZlYXR1cmUobnVsbCkpOwotCX0KLQotLy8JLyoqCi0vLwkgKiB0aGUgZmVhdHVyZSB0byB0ZXN0Ci0vLwkgKi8KLS8vCXByaXZhdGUgSUZlYXR1cmUgZ2V0Um9vdEZlYXR1cmUzKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0vLwkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFLCAibmVzdGVkRmVhdHVyZVNpdGVUZXN0My9zaXRlLnhtbCIpLCBudWxsKTsKLS8vCQlVUkwgdXJsID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArICJyb290ZmVhdHVyZS5qYXIiLCBudWxsKTsKLS8vCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsKLS8vCQlyZWYuc2V0U2l0ZShzaXRlKTsKLS8vCQlyZWYuc2V0VVJMKHVybCk7Ci0vLwkJcmVmLnNldFR5cGUoSVNpdGUuREVGQVVMVF9QQUNLQUdFRF9GRUFUVVJFX1RZUEUpOwotLy8JCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKLS8vCQlyZXR1cm4gZmVhdHVyZTsKLS8vCX0KLQotLy8JLyoqCi0vLwkgKiB0aGUgZmVhdHVyZSB0byB0ZXN0Ci0vLwkgKi8KLS8vCXByaXZhdGUgSUZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlMygpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotLy8KLS8vCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsICJuZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL3NpdGUueG1sIikpOwotLy8JCVVSTCB1cmwgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgImNoaWxkcmVuZmVhdHVyZS5qYXIiLCBudWxsKTsKLS8vCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsKLS8vCQlyZWYuc2V0U2l0ZShzaXRlKTsKLS8vCQlyZWYuc2V0VVJMKHVybCk7Ci0vLwkJcmVmLnNldFR5cGUoSVNpdGUuREVGQVVMVF9QQUNLQUdFRF9GRUFUVVJFX1RZUEUpOwotLy8JCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKLS8vCQlyZXR1cm4gZmVhdHVyZTsKLS8vCX0KLQotCS8qCi0JICogCi0JICovCi0JLyoJcHVibGljIHZvaWQgdGVzdE5lc3RlZDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkKLQkJCUlGZWF0dXJlIHJvb3RGZWF0dXJlID0gZ2V0Um9vdEZlYXR1cmUzKCk7Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZiA9IHJvb3RGZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCUlGZWF0dXJlIGNoaWxkRmVhdHVyZSA9IGdldENoaWxkRmVhdHVyZTMoKTsKLQkJCWFzc2VydEVxdWFscygKLQkJCQkiQ2hpbGRyZW4gZmVhdHVyZSBhcmUgbm90IGVxdWFsIiwKLQkJCQljaGlsZEZlYXR1cmUsCi0JCQkJcmVmWzBdLmdldEZlYXR1cmUoKSk7Ci0JCX0KLQkqLwotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdFBsdWdpbkNvbnRhaW5lckFQSS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RQbHVnaW5Db250YWluZXJBUEkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU1NTUyNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdFBsdWdpbkNvbnRhaW5lckFQSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UGx1Z2luQ29udGFpbmVyQVBJIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQotCXByaXZhdGUgU2l0ZSBzaXRlOwotCXByaXZhdGUgRGVmYXVsdEZlYXR1cmUgZmVhdHVyZTsKLQotCS8qKgotCSAqIHRoZSBTaXRlIHRvIHRlc3QKLQkgKi8KLQlwcml2YXRlIFNpdGUgZ2V0U2l0ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlpZiAoc2l0ZSA9PSBudWxsKSB7Ci0KLQkJCXNpdGUgPSAoU2l0ZSlTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSwidGVzdEFQSS8iKSwgbnVsbCk7Ci0KLQkJfQotCQlyZXR1cm4gc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiB0aGUgZmVhdHVyZSB0byB0ZXN0Ci0JICovCi0JcHJpdmF0ZSBEZWZhdWx0RmVhdHVyZSBnZXRGZWF0dXJlKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCUlTaXRlIHNpdGUgPSBnZXRTaXRlKCk7Ci0JCQlVUkwgaWQgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUxXzEuMC4wLmphciIsbnVsbCk7CQkJCQkJCi0JCQlmZWF0dXJlID0gbmV3IERlZmF1bHRGZWF0dXJlKHNpdGUpOwotCQkJZmVhdHVyZS5zZXRVUkwoaWQpOwkKLQkJfQotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpCi0JICovCi0JcHVibGljIFRlc3RQbHVnaW5Db250YWluZXJBUEkoU3RyaW5nIGFyZzApIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0RmVhdHVyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSA9IG5ldyBQbHVnaW5FbnRyeSgpOwotCQlwbHVnaW5FbnRyeS5zZXRWZXJzaW9uZWRJZGVudGlmaWVyKG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKCJpZCIsICI2IikpOwotCQlGZWF0dXJlIF9mZWF0dXJlID0gZ2V0RmVhdHVyZSgpOwotCQkoKERlZmF1bHRGZWF0dXJlKV9mZWF0dXJlKS5hZGRQbHVnaW5FbnRyeShwbHVnaW5FbnRyeSk7Ci0JCWFzc2VydEVxdWFscyhfZmVhdHVyZS5nZXRQbHVnaW5FbnRyeUNvdW50KCksIDEpOwotCQlhc3NlcnRFcXVhbHMoX2ZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpWzBdLCBwbHVnaW5FbnRyeSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdGFjdFNpdGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJUGx1Z2luRW50cnkgcGx1Z2luRW50cnkgPSBuZXcgUGx1Z2luRW50cnkoKTsKLQkJcGx1Z2luRW50cnkuc2V0VmVyc2lvbmVkSWRlbnRpZmllcihuZXcgVmVyc2lvbmVkSWRlbnRpZmllcigiaWQiLCAiNiIpKTsKLQkJU2l0ZSBfc2l0ZSA9IGdldFNpdGUoKTsKLQkJX3NpdGUuYWRkUGx1Z2luRW50cnkocGx1Z2luRW50cnkpOwotCQlhc3NlcnRFcXVhbHMoX3NpdGUuZ2V0UGx1Z2luRW50cnlDb3VudCgpLCAxKTsKLQkJYXNzZXJ0RXF1YWxzKF9zaXRlLmdldFBsdWdpbkVudHJpZXMoKVswXSwgcGx1Z2luRW50cnkpOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdFNpdGVBUEkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0U2l0ZUFQSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDE0MTc4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0U2l0ZUFQSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0U2l0ZUFQSSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JCi0JLyoqCi0JICogVGVzdCB0aGUgZ2V0RmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBUZXN0U2l0ZUFQSShTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVSTCgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoc2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCkpLG5ldyBGaWxlKFNPVVJDRV9GSUxFX1NJVEUuZ2V0RmlsZSgpKSk7Ci0JCQotCQlJU2l0ZSBzaXRlMiA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0hUVFBfU0lURSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhzaXRlMi5nZXRVUkwoKSxuZXcgVVJMKCJodHRwIiwgZ2V0SHR0cEhvc3QoKSxnZXRIdHRwUG9ydCgpLCBidW5kbGUuZ2V0U3RyaW5nKCJIVFRQX1BBVEhfMSIpKyJzaXRlLnhtbCIpKTsKLQotCX0KLQotfQotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdFNpdGVNYW5hZ2VyQVBJLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdFNpdGVNYW5hZ2VyQVBJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYzk2MTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RTaXRlTWFuYWdlckFQSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0U2l0ZU1hbmFnZXJBUEkgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCQotCS8qKgotCSAqIFRlc3QgdGhlIGdldEZlYXR1cmVzKCkKLQkgKi8KLQlwdWJsaWMgVGVzdFNpdGVNYW5hZ2VyQVBJKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJU2l0ZSBmaWxlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSxudWxsKTsKLQkJU3RyaW5nIHNpdGUgPSBmaWxlU2l0ZS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpOwkJCi0JCWFzc2VydEVxdWFscyhUQVJHRVRfRklMRV9TSVRFLnRvRXh0ZXJuYWxGb3JtKCksIHNpdGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5rbm93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlVUkwgdXJsID0gbmV3IFVSTCgiZnRwOi8vMjU1LjI1NS4yNTUuMjU1LyIpOwotCQl0cnkgewotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZSh1cmwsbnVsbCk7Ci0JCWlmIChzaXRlIT1udWxsKSAKLQkJCWZhaWwoIkNvbm5lY3RlZCB0byBmdHA6Ly8yNTUuMjU1LjI1NS4yNTUvLCBzaG91bGQgbm90IGhhcHBlbiIpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpewotCQkJLy8gZXhwZWN0ZWQKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpewotCQkJLy8gZXhwZWN0ZWQgYXMgdGhlIHZlcnNpb24gb2YgdGhlIFdlYkRhdiBIVFRQIENvbm5lY3Rpb24gcmV0dXJucyBzbwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMb2NhbFNpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCUlMb2NhbFNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQlJQ29uZmlndXJlZFNpdGVbXSBpbnN0U2l0ZXMgPSBzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCWFzc2VydFRydWUoaW5zdFNpdGVzLmxlbmd0aD4wKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2NhbCBTaXRlOiIraW5zdFNpdGVzWzBdLmdldFNpdGUoKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJCi0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEVfSU5TVEFMTEVELG51bGwpOwotCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpWzBdLmdldEZlYXR1cmUobnVsbCk7Ci0JCXJlbW92ZShyZW1vdGVGZWF0dXJlLGluc3RTaXRlc1swXS5nZXRTaXRlKCkpOwkJCi0JCWluc3RTaXRlc1swXS5nZXRTaXRlKCkuaW5zdGFsbChyZW1vdGVGZWF0dXJlLG51bGwsbnVsbCk7Ci0JCQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdLmdldFNpdGUoKS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlhc3NlcnRUcnVlKGZlYXR1cmVzLmxlbmd0aD4wKTsKLQotCQkvL2NsZWFudXAKLQkJYXNzZXJ0Tm90TnVsbChyZW1vdGVGZWF0dXJlKTsJCQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShpbnN0U2l0ZXNbMF0uZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKStGaWxlLnNlcGFyYXRvcitTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCtyZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsKLQkJZmlsZSA9IG5ldyBGaWxlKGluc3RTaXRlc1swXS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpK0ZpbGUuc2VwYXJhdG9yK1NpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCsib3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEiKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOwkJCi0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQotCi0JfQotCQotCi19Ci0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0VXBkYXRlTWFuYWdlclV0aWxzQVBJLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdFVwZGF0ZU1hbmFnZXJVdGlsc0FQSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDk3ZTQ4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0VXBkYXRlTWFuYWdlclV0aWxzQVBJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0VXBkYXRlTWFuYWdlclV0aWxzQVBJIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQkKLQkvKioKLQkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpCi0JICovCi0JcHVibGljIFRlc3RVcGRhdGVNYW5hZ2VyVXRpbHNBUEkoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RnZXRVUkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVVJMIHVybDEgPSBuZXcgVVJMKCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIik7Ci0JCVVSTCB1cmwyID0gbmV3IFVSTCgiZmlsZTovL2M6L2hlbGxvIik7Ci0JCVVSTCB1cmwzID0gbmV3IFVSTCgiZmlsZTovaG9tZS9lY2xpcHNlLyIpOwotCQlVUkwgdXJsNCA9IG5ldyBVUkwoImZ0cDovaG9zdDo4MDgwL3BhdGgvIik7Ci0JCVVSTCB1cmw1ID0gbmV3IFVSTCgiamFyOmZpbGU6L3RtcC8xMDAxMDAhLyIpOwotCQkKLQkJU3RyaW5nIGRlZmF1bHQxID0gImRlZmF1bHQxL2RlZmF1bHQiOwotCQlTdHJpbmcgZGVmYXVsdDIgPSAiL2RlZmF1bHQyLyI7Ci0JCQotCQlTdHJpbmcgc3RyMSA9ICJodHRwOi8vZGV2LmVjbGlwc2Uub3JnIjsKLQkJU3RyaW5nIHN0cjIgPSAicmVsYXRpdmUxL3BhdGgvIjsKLQkJU3RyaW5nIHN0cjMgPSAiL3JlbGF0aXZlMi9wYXRoIjsKLQkJCi0JCVN0cmluZyByZXN1bHQxPW51bGw7Ci0JCVN0cmluZyByZXN1bHQyPW51bGw7Ci0JCQotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJLy8gMS4wCi0JCXJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDEsc3RyMSxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7Ci0JCWFzc2VydEVxdWFscygiMS4wIixyZXN1bHQyLHJlc3VsdDEpOwotCQkKLQkJLy8gMS4xCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChudWxsLHN0cjEsbnVsbCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7Ci0JCWFzc2VydEVxdWFscygiMS4xIixyZXN1bHQyLHJlc3VsdDEpOwotCQkKLQkJLy8gMS4yCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwxLHN0cjEsbnVsbCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7Ci0JCWFzc2VydEVxdWFscygiMS4yIixyZXN1bHQyLHJlc3VsdDEpOwotCQkKLQkJLy8gMS4zCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwxLHN0cjIsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcmVsYXRpdmUxL3BhdGgvIjsKLQkJYXNzZXJ0RXF1YWxzKCIxLjMiLHJlc3VsdDIscmVzdWx0MSk7Ci0JCQotCQkvLyAxLjQKLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDEsc3RyMyxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9yZWxhdGl2ZTIvcGF0aCI7Ci0JCWFzc2VydEVxdWFscygiMS40IixyZXN1bHQyLHJlc3VsdDEpOwotCQkKLQkJLy8gMS41Ci0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwxLG51bGwsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZGVmYXVsdDEvZGVmYXVsdCI7Ci0JCWFzc2VydEVxdWFscygiMS41IixyZXN1bHQyLHJlc3VsdDEpOwotCQkKLQkJLy8gMS42Ci0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwxLG51bGwsZGVmYXVsdDIpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZGVmYXVsdDIvIjsKLQkJYXNzZXJ0RXF1YWxzKCIxLjYiLHJlc3VsdDIscmVzdWx0MSk7Ci0JCQotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJLy8gMi4wCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwyLHN0cjEsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOwotCQlhc3NlcnRFcXVhbHMoIjIuMCIscmVzdWx0MixyZXN1bHQxKTsKLQkJCi0JCS8vIDIuMQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwobnVsbCxzdHIxLG51bGwpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOwotCQlhc3NlcnRFcXVhbHMoIjIuMSIscmVzdWx0MixyZXN1bHQxKTsKLQkJCi0JCS8vIDIuMgotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMixzdHIxLG51bGwpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOwotCQlhc3NlcnRFcXVhbHMoIjIuMiIscmVzdWx0MixyZXN1bHQxKTsKLQkJCi0JCS8vIDIuMwotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMixzdHIyLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOwotCQkgcmVzdWx0MiA9ICJmaWxlOi8vYzovcmVsYXRpdmUxL3BhdGgvIjsKLQkJYXNzZXJ0RXF1YWxzKCIyLjMiLHJlc3VsdDIscmVzdWx0MSk7Ci0JCQotCQkvLyAyLjQKLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDIsc3RyMyxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiZmlsZTovL2M6L3JlbGF0aXZlMi9wYXRoIjsKLQkJYXNzZXJ0RXF1YWxzKCIyLjQiLHJlc3VsdDIscmVzdWx0MSk7Ci0JCQotCQkvLyAyLjUKLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDIsbnVsbCxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiZmlsZTovL2M6L2RlZmF1bHQxL2RlZmF1bHQiOwotCQlhc3NlcnRFcXVhbHMoIjIuNSIscmVzdWx0MixyZXN1bHQxKTsKLQkJCi0JCS8vIDIuNgotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMixudWxsLGRlZmF1bHQyKS50b0V4dGVybmFsRm9ybSgpOwotCQkgcmVzdWx0MiA9ICJmaWxlOi8vYzovZGVmYXVsdDIvIjsKLQkJYXNzZXJ0RXF1YWxzKCIyLjYiLHJlc3VsdDIscmVzdWx0MSk7Ci0JCQotCi0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkvLyAzLjAKLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDMsc3RyMSxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7Ci0JCWFzc2VydEVxdWFscygiMy4wIixyZXN1bHQyLHJlc3VsdDEpOwotCQkKLQkJLy8gMy4xCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChudWxsLHN0cjEsbnVsbCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7Ci0JCWFzc2VydEVxdWFscygiMy4xIixyZXN1bHQyLHJlc3VsdDEpOwotCQkKLQkJLy8gMy4yCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwzLHN0cjEsbnVsbCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7Ci0JCWFzc2VydEVxdWFscygiMy4yIixyZXN1bHQyLHJlc3VsdDEpOwotCQkKLQkJLy8gMy4zCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwzLHN0cjIsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImZpbGU6L2hvbWUvZWNsaXBzZS9yZWxhdGl2ZTEvcGF0aC8iOwotCQlhc3NlcnRFcXVhbHMoIjMuMyIscmVzdWx0MixyZXN1bHQxKTsKLQkJCi0JCS8vIDMuNAotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMyxzdHIzLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOwotCQkgcmVzdWx0MiA9ICJmaWxlOi9ob21lL2VjbGlwc2UvcmVsYXRpdmUyL3BhdGgiOwotCQlhc3NlcnRFcXVhbHMoIjMuNCIscmVzdWx0MixyZXN1bHQxKTsKLQkJCi0JCS8vIDMuNQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMyxudWxsLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOwotCQkgcmVzdWx0MiA9ICJmaWxlOi9ob21lL2VjbGlwc2UvZGVmYXVsdDEvZGVmYXVsdCI7Ci0JCWFzc2VydEVxdWFscygiMy41IixyZXN1bHQyLHJlc3VsdDEpOwotCQkKLQkJLy8gMy42Ci0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwzLG51bGwsZGVmYXVsdDIpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImZpbGU6L2hvbWUvZWNsaXBzZS9kZWZhdWx0Mi8iOwotCQlhc3NlcnRFcXVhbHMoIjMuNiIscmVzdWx0MixyZXN1bHQxKTsKLQkJCQkKLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCS8vIDQuMAotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsNCxzdHIxLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOwotCQkgcmVzdWx0MiA9ICJodHRwOi8vZGV2LmVjbGlwc2Uub3JnIjsKLQkJYXNzZXJ0RXF1YWxzKCI0LjAiLHJlc3VsdDIscmVzdWx0MSk7Ci0JCQotCQkvLyA0LjEKLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKG51bGwsc3RyMSxudWxsKS50b0V4dGVybmFsRm9ybSgpOwotCQkgcmVzdWx0MiA9ICJodHRwOi8vZGV2LmVjbGlwc2Uub3JnIjsKLQkJYXNzZXJ0RXF1YWxzKCI0LjEiLHJlc3VsdDIscmVzdWx0MSk7Ci0JCQotCQkvLyA0LjIKLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDQsc3RyMSxudWxsKS50b0V4dGVybmFsRm9ybSgpOwotCQkgcmVzdWx0MiA9ICJodHRwOi8vZGV2LmVjbGlwc2Uub3JnIjsKLQkJYXNzZXJ0RXF1YWxzKCI0LjIiLHJlc3VsdDIscmVzdWx0MSk7Ci0JCQotCQkvLyA0LjMKLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDQsc3RyMixkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiZnRwOi9ob3N0OjgwODAvcGF0aC9yZWxhdGl2ZTEvcGF0aC8iOwotCQlhc3NlcnRFcXVhbHMoIjQuMyIscmVzdWx0MixyZXN1bHQxKTsKLQkJCi0JCS8vIDQuNAotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsNCxzdHIzLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOwotCQkgcmVzdWx0MiA9ICJmdHA6L2hvc3Q6ODA4MC9wYXRoL3JlbGF0aXZlMi9wYXRoIjsKLQkJYXNzZXJ0RXF1YWxzKCI0LjQiLHJlc3VsdDIscmVzdWx0MSk7Ci0JCQotCQkvLyA0LjUKLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDQsbnVsbCxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiZnRwOi9ob3N0OjgwODAvcGF0aC9kZWZhdWx0MS9kZWZhdWx0IjsKLQkJYXNzZXJ0RXF1YWxzKCI0LjUiLHJlc3VsdDIscmVzdWx0MSk7Ci0JCQotCQkvLyA0LjYKLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDQsbnVsbCxkZWZhdWx0MikudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiZnRwOi9ob3N0OjgwODAvcGF0aC9kZWZhdWx0Mi8iOwotCQlhc3NlcnRFcXVhbHMoIjQuNiIscmVzdWx0MixyZXN1bHQxKTsKLQkJCi0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkvLyA1LjAKLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDUsc3RyMSxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7Ci0JCWFzc2VydEVxdWFscygiNS4wIixyZXN1bHQyLHJlc3VsdDEpOwotCQkKLQkJLy8gNS4xCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChudWxsLHN0cjEsbnVsbCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7Ci0JCWFzc2VydEVxdWFscygiNS4xIixyZXN1bHQyLHJlc3VsdDEpOwotCQkKLQkJLy8gNS4yCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmw1LHN0cjEsbnVsbCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7Ci0JCWFzc2VydEVxdWFscygiNS4yIixyZXN1bHQyLHJlc3VsdDEpOwotCQkKLQkJLy8gNS4zCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmw1LHN0cjIsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImphcjpmaWxlOi90bXAvMTAwMTAwIS9yZWxhdGl2ZTEvcGF0aC8iOwotCQlhc3NlcnRFcXVhbHMoIjUuMyIscmVzdWx0MixyZXN1bHQxKTsKLQkJCi0JCS8vIDUuNAotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsNSxzdHIzLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOwotCQkgcmVzdWx0MiA9ICJqYXI6ZmlsZTovdG1wLzEwMDEwMCEvcmVsYXRpdmUyL3BhdGgiOwotCQlhc3NlcnRFcXVhbHMoIjUuNCIscmVzdWx0MixyZXN1bHQxKTsKLQkJCi0JCS8vIDUuNQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsNSxudWxsLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOwotCQkgcmVzdWx0MiA9ICJqYXI6ZmlsZTovdG1wLzEwMDEwMCEvZGVmYXVsdDEvZGVmYXVsdCI7Ci0JCWFzc2VydEVxdWFscygiNS41IixyZXN1bHQyLHJlc3VsdDEpOwotCQkKLQkJLy8gNS42Ci0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmw1LG51bGwsZGVmYXVsdDIpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCSByZXN1bHQyID0gImphcjpmaWxlOi90bXAvMTAwMTAwIS9kZWZhdWx0Mi8iOwotCQlhc3NlcnRFcXVhbHMoIjUuNiIscmVzdWx0MixyZXN1bHQxKTsJCQkJCi0KLQl9Ci0JCi0JCi0KLX0KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYnJhbmRpbmcvQWxsQnJhbmRpbmdUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYnJhbmRpbmcvQWxsQnJhbmRpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGFhMWMyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2JyYW5kaW5nL0FsbEJyYW5kaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYnJhbmRpbmc7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgQVBJIHRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxCcmFuZGluZ1Rlc3RzIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBBbGxCcmFuZGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBMaXN0IG9mIEFQSSB0ZXN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLnNldE5hbWUoIkJyYW5kaW5nIFRlc3RzIik7Ci0KLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKEJ1bmRsZVByb3ZpZGVyVGVzdC5jbGFzcykpOwkKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFByb2R1Y3RUZXN0LmNsYXNzKSk7CQotCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9icmFuZGluZy9CdW5kbGVQcm92aWRlclRlc3QuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2JyYW5kaW5nL0J1bmRsZVByb3ZpZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjlhMjY0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2JyYW5kaW5nL0J1bmRsZVByb3ZpZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5icmFuZGluZzsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvci5icmFuZGluZy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLXB1YmxpYyBjbGFzcyBCdW5kbGVQcm92aWRlclRlc3QgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCi0JcHVibGljIEJ1bmRsZVByb3ZpZGVyVGVzdChTdHJpbmcgdGVzdGNhc2UpewotCQlzdXBlcih0ZXN0Y2FzZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1haW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCUlCdW5kbGVHcm91cFByb3ZpZGVyW10gYnVuZGxlR3JvdXBQcm92aWRlcnMgPSBQbGF0Zm9ybS5nZXRCdW5kbGVHcm91cFByb3ZpZGVycygpOwotCQlmb3IgKGludCBpPTA7IGk8YnVuZGxlR3JvdXBQcm92aWRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQnVuZGxlR3JvdXBQcm92aWRlcjoiK2J1bmRsZUdyb3VwUHJvdmlkZXJzW2ldLmdldE5hbWUoKSk7Ci0JCQlJQnVuZGxlR3JvdXBbXSBidW5kbGVHcm91cHMgPSBidW5kbGVHcm91cFByb3ZpZGVyc1tpXS5nZXRCdW5kbGVHcm91cHMoKTsKLQkJCWZvciAoaW50IGo9MDsgajxidW5kbGVHcm91cHMubGVuZ3RoOyBqKyspIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkJ1bmRsZUdyb3VwIG5hbWU6IitidW5kbGVHcm91cHNbal0uZ2V0TmFtZSgpICsiXG4iICsKLQkJCQkJCSJkZXNjcmlwdGlvbjoiICsgYnVuZGxlR3JvdXBzW2pdLmdldERlc2NyaXB0aW9uKCkgKyAiXG4iKwotCQkJCQkJImlkOiIgKyBidW5kbGVHcm91cHNbal0uZ2V0SWRlbnRpZmllcigpICsgIlxuIiArCi0JCQkJCQkicHJvdmlkZXI6IiArIGJ1bmRsZUdyb3Vwc1tqXS5nZXRQcm92aWRlck5hbWUoKSArICJcbiIgKwotCQkJCQkJInZlcnNpb246IiArIGJ1bmRsZUdyb3Vwc1tqXS5nZXRWZXJzaW9uKCkgKyAiXG4iICsKLQkJCQkJCSJsaWNlbnNlOiIgKyBidW5kbGVHcm91cHNbal0uZ2V0UHJvcGVydHkoSUJ1bmRsZUdyb3VwQ29uc3RhbnRzLkxJQ0VOU0VfSFJFRikgKyAiXG4iICsKLQkJCQkJCSJmZWF0dXJlSW1hZ2U6IiArIGJ1bmRsZUdyb3Vwc1tqXS5nZXRQcm9wZXJ0eShJQnVuZGxlR3JvdXBDb25zdGFudHMuRkVBVFVSRV9JTUFHRSkgKyAiXG4iICsKLQkJCQkJCSJ0aXBzIGFuZCB0cmlja3M6IiArIGJ1bmRsZUdyb3Vwc1tqXS5nZXRQcm9wZXJ0eShJQnVuZGxlR3JvdXBDb25zdGFudHMuVElQU19BTkRfVFJJQ0tTX0hSRUYpICsgIlxuIiArCi0JCQkJCQkid2VsY29tZVBhZ2U6IiArIGJ1bmRsZUdyb3Vwc1tqXS5nZXRQcm9wZXJ0eShJQnVuZGxlR3JvdXBDb25zdGFudHMuV0VMQ09NRV9QQUdFKSArICJcbiIgKwotCQkJCQkJIndlbGNvbWVQZXJzcGVjdGl2ZToiICsgYnVuZGxlR3JvdXBzW2pdLmdldFByb3BlcnR5KElCdW5kbGVHcm91cENvbnN0YW50cy5XRUxDT01FX1BFUlNQRUNUSVZFKSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJidW5kbGVzOiIpOwotCQkJCUJ1bmRsZVtdIGJ1bmRsZXMgPSBidW5kbGVHcm91cHNbal0uZ2V0QnVuZGxlcygpOwotCQkJCWZvciAoaW50IGI9MDsgYjxidW5kbGVzLmxlbmd0aDsgYisrKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oYnVuZGxlc1tiXS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9icmFuZGluZy9Qcm9kdWN0VGVzdC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYnJhbmRpbmcvUHJvZHVjdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YwZDM5Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9icmFuZGluZy9Qcm9kdWN0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5icmFuZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuYnJhbmRpbmcuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuKjsKLQotcHVibGljIGNsYXNzIFByb2R1Y3RUZXN0IGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQotCXB1YmxpYyBQcm9kdWN0VGVzdChTdHJpbmcgdGVzdGNhc2UpewotCQlzdXBlcih0ZXN0Y2FzZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1haW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCUlQcm9kdWN0IHByb2R1Y3QgPSBQbGF0Zm9ybS5nZXRQcm9kdWN0KCk7Ci0JCWlmIChwcm9kdWN0ID09IG51bGwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIHByb2R1Y3QgZGVmaW5lZCIpOwotCQllbHNlCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2R1Y3QgaXM6IFxuIiArCi0JCQkJCSJuYW1lPSIgKyBwcm9kdWN0LmdldE5hbWUoKSArICJcbiIgKwotCQkJCQkiYXBwbGljYXRpb249IiArIHByb2R1Y3QuZ2V0QXBwbGljYXRpb24oKSArICJcbiIgKwotCQkJCQkiZGVzY3JpcHRpb249IiArIHByb2R1Y3QuZ2V0RGVzY3JpcHRpb24oKSArICJcbiIgKwotCQkJCQkiaWQ9IisgcHJvZHVjdC5nZXRJZCgpICsgIlxuIiArCi0JCQkJCSJhYm91dF90ZXh0OiIrcHJvZHVjdC5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5BQk9VVF9URVhUKSArIlxuIiArCi0JCQkJCSJhYm91dF9pbWFnZToiK3Byb2R1Y3QuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuQUJPVVRfSU1BR0UpICsiXG4iICsKLQkJCQkJImFwcF9uYW1lOiIrcHJvZHVjdC5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5BUFBfTkFNRSkgKyJcbiIgKwotCQkJCQkid2luZG93X2ltYWdlOiIrcHJvZHVjdC5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5XSU5ET1dfSU1BR0UpICsiXG4iICsKLQkJCQkJIndpbmRvd19pbWFnZXM6Iitwcm9kdWN0LmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLldJTkRPV19JTUFHRVMpICk7Ci0JCQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29uZmlndXJhdGlvbnMvQWxsQ29uZmlndXJhdGlvbnNUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29uZmlndXJhdGlvbnMvQWxsQ29uZmlndXJhdGlvbnNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTI2MDBiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvbmZpZ3VyYXRpb25zL0FsbENvbmZpZ3VyYXRpb25zVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29uZmlndXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi0KLXB1YmxpYyBjbGFzcyBBbGxDb25maWd1cmF0aW9uc1Rlc3RzIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLXB1YmxpYyBBbGxDb25maWd1cmF0aW9uc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCXN1aXRlLnNldE5hbWUoIlJlZ3VsYXIgSW5zdGFsbCBUZXN0cyIpOwotCQotLy8Jc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RSZXZlcnQuY2xhc3MpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEJhY2t3YXJkLmNsYXNzKSk7Ci0JCQotCXJldHVybiBzdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvbmZpZ3VyYXRpb25zL1Rlc3RCYWNrd2FyZC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29uZmlndXJhdGlvbnMvVGVzdEJhY2t3YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNDIwYmUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29uZmlndXJhdGlvbnMvVGVzdEJhY2t3YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvbmZpZ3VyYXRpb25zOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFRlc3RCYWNrd2FyZCBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JCi0JLyoqCi0JICogVGVzdCB0aGUgZ2V0RmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBUZXN0QmFja3dhcmQoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVCYWNrd2FyZCgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vIGNsZWFudXAKLQkJTG9jYWxTaXRlIHNpdGVMb2NhbCA9ICgoTG9jYWxTaXRlKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKTsKLQkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZSgoc2l0ZUxvY2FsKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7Ci0JCUludGVybmFsU2l0ZU1hbmFnZXIubG9jYWxTaXRlPW51bGw7CQkKLQotCQlJTG9jYWxTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0hUVFBfU0lURSxudWxsKTsKLQkJSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZiA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXTsKLQkJCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBvbGRJbnN0YWxsQ29uZmlnID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQlJQ29uZmlndXJlZFNpdGUgb2xkQ29uZmlnU2l0ZSA9IG9sZEluc3RhbGxDb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07Ci0JCQotCQkoKENvbmZpZ3VyZWRTaXRlKW9sZENvbmZpZ1NpdGUpLnNldFVwZGF0YWJsZSh0cnVlKTsJCi0JCWFzc2VydE5vdE51bGwoIlJlZmVyZW5jZSBpcyBudWxsIixmZWF0dXJlUmVmKTsKLQkJcmVtb3ZlKGZlYXR1cmVSZWYuZ2V0RmVhdHVyZShudWxsKSxvbGRDb25maWdTaXRlKTsJCi0JCW9sZENvbmZpZ1NpdGUuaW5zdGFsbChmZWF0dXJlUmVmLmdldEZlYXR1cmUobnVsbCksbnVsbCxudWxsKTsKLQkJc2l0ZS5zYXZlKCk7Ci0JCi0JCQotCQkvLyBBY3Rpdml0eSAtPiBJbnN0YWxsQ29uZmlnCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjdXJyZW50ID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotLy8JCUlBY3Rpdml0eSBhY3Rpdml0eSA9IGN1cnJlbnQuZ2V0QWN0aXZpdGllcygpWzBdOwkKLS8vCQlhc3NlcnRUcnVlKGFjdGl2aXR5LmdldEluc3RhbGxDb25maWd1cmF0aW9uKCkuZXF1YWxzKGN1cnJlbnQpKTsKLQkJCi0JCS8vIENvbmZpZ1NpdGUtPkluc3RhbGxDb25maWcKLQkJSUNvbmZpZ3VyZWRTaXRlIG5ld0NvbmZpZ1NpdGUgPSBjdXJyZW50LmdldENvbmZpZ3VyZWRTaXRlcygpWzBdOwotCQlhc3NlcnRUcnVlKG5ld0NvbmZpZ1NpdGUuZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb24oKS5lcXVhbHMoY3VycmVudCkpOwotCQkKLQkJLy8gY2xlYW51cAotCQlsb2NhbEZpbGUgPSBuZXcgRmlsZSgoKExvY2FsU2l0ZSlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCkpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCQkKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29uZmlndXJhdGlvbnMvVGVzdFJldmVydC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29uZmlndXJhdGlvbnMvVGVzdFJldmVydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWE5ZGZlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvbmZpZ3VyYXRpb25zL1Rlc3RSZXZlcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvbmZpZ3VyYXRpb25zOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLkNvbmZpZ3VyZWRTaXRlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFRlc3RSZXZlcnQgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCQotCS8qKgotCSAqIFRlc3QgdGhlIGdldEZlYXR1cmVzKCkKLQkgKi8KLQlwdWJsaWMgVGVzdFJldmVydChTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZVJldmVydEluc3RhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQkvLyBjbGVhbnVwCi0JCUxvY2FsU2l0ZSBzaXRlTG9jYWwgPSAoKExvY2FsU2l0ZSlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSk7Ci0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoc2l0ZUxvY2FsLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkKLQkJSW50ZXJuYWxTaXRlTWFuYWdlci5sb2NhbFNpdGU9bnVsbDsJCQotCi0JCUlMb2NhbFNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfSFRUUF9TSVRFLG51bGwpOwotCQlJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpWzBdOwotCQlJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmMiA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVsxXTsKLQkJSUZlYXR1cmUgZmVhdHVyZSA9IGZlYXR1cmVSZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCi0JCS8vIG9sZCBjb25maWcsIG5vIGZlYXR1cmVzIGluc3RhbGxlZAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gb2xkID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQlDb25maWd1cmF0aW9uUG9saWN5IGV4Y2x1ZGVwb2xpY3kgPSBuZXcgQ29uZmlndXJhdGlvblBvbGljeSgpOwotCQlleGNsdWRlcG9saWN5LnNldFBvbGljeShJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlUG9saWN5LlVTRVJfRVhDTFVERSk7Ci0JCUlDb25maWd1cmVkU2l0ZSBvbGRDb25maWdTaXRlID0gb2xkLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdOwotCQlleGNsdWRlcG9saWN5LnNldENvbmZpZ3VyZWRTaXRlTW9kZWwoKENvbmZpZ3VyZWRTaXRlTW9kZWwpb2xkQ29uZmlnU2l0ZSk7CQkKLQkJKChDb25maWd1cmVkU2l0ZU1vZGVsKW9sZENvbmZpZ1NpdGUpLnNldENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbChleGNsdWRlcG9saWN5KTsKLQkJCi0JCS8vIGluc3RhbGwgb25lIGZlYXR1cmUKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIG5ld0NvbmZpZyA9IHNpdGUuY2xvbmVDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQlJQ29uZmlndXJlZFNpdGUgY29uZmlnU2l0ZSA9IG5ld0NvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsKLQkJaWYgKCFjb25maWdTaXRlLmdldFNpdGUoKS5lcXVhbHMob2xkQ29uZmlnU2l0ZS5nZXRTaXRlKCkpKSBmYWlsKCJDb25maWcgc2l0ZXMgYXJlIG5vdCBlcXVhbHMiKTsKLQkJc2l0ZS5hZGRDb25maWd1cmF0aW9uKG5ld0NvbmZpZyk7CQotCQkKLQkJKChDb25maWd1cmVkU2l0ZSljb25maWdTaXRlKS5zZXRVcGRhdGFibGUodHJ1ZSk7CQkJCi0JCUlGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGxlZEZlYXR1cmUgPSBjb25maWdTaXRlLmluc3RhbGwoZmVhdHVyZSxudWxsLG51bGwpOwotCQlzaXRlLnNhdmUoKTsKLQotCQkvLyB1bmNvbmZpZ3VyZSBpdAotCQljb25maWdTaXRlLnVuY29uZmlndXJlKGluc3RhbGxlZEZlYXR1cmUuZ2V0RmVhdHVyZShudWxsKSk7Ci0KLQkJLy8gaW5zdGFsbCBhbm90aGVyIGZlYXR1cmUKLQkJSUZlYXR1cmUgZmVhdHVyZTIgPSBmZWF0dXJlUmVmMi5nZXRGZWF0dXJlKG51bGwpOwotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnMiA9IHNpdGUuY2xvbmVDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQlJQ29uZmlndXJlZFNpdGUgYW5vdGhlckNvbmZpZ1NpdGUgPSBuZXdDb25maWcyLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdOwotCQlpZiAoIWFub3RoZXJDb25maWdTaXRlLmdldFNpdGUoKS5lcXVhbHMob2xkQ29uZmlnU2l0ZS5nZXRTaXRlKCkpKSBmYWlsKCJDb25maWcgc2l0ZXMgYXJlIG5vdCBlcXVhbHMiKTsJCQotCQlzaXRlLmFkZENvbmZpZ3VyYXRpb24obmV3Q29uZmlnMik7CQkKLQkJYW5vdGhlckNvbmZpZ1NpdGUuaW5zdGFsbChmZWF0dXJlMixudWxsLG51bGwpOwotCQlzaXRlLnNhdmUoKTsKLQotCQkvLyByZXZlcnQgdG8gb2xkIHN0YXRlIHdoZXJlIG5vIGZlYXR1cmUgd2hlcmUgY29uZmlndXJlZAotCQlzaXRlLnJldmVydFRvKG9sZCxudWxsLG51bGwpOwotCQlzaXRlLnNhdmUoKTsKLQkJCi0JCS8vIGNoZWNrCi0JCVN0cmluZyB0aW1lID0gIiIrc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENyZWF0aW9uRGF0ZSgpLmdldFRpbWUoKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgibmV3IGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgZXhpc3QiLCBmaWxlLmV4aXN0cygpKTsKLQkJCi0JCQotCQkvL2ZpbmQgY29uZmlndXJlZCBzaXRlCi0JCUlDb25maWd1cmVkU2l0ZSBuZXdDb25maWdTaXRlID0gbnVsbDsKLQkJSUNvbmZpZ3VyZWRTaXRlW10gc2l0ZXMgPSBzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChzaXRlc1tpXS5nZXRTaXRlKCkuZXF1YWxzKG9sZENvbmZpZ1NpdGUuZ2V0U2l0ZSgpKSl7Ci0JCQkJIG5ld0NvbmZpZ1NpdGUgPSBzaXRlc1tpXTsKLQkJCQkgYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5ld0NvbmZpZ1NpdGU9PW51bGwpIGZhaWwoIkNhbm5vdCBmaW5kIGNvbmZpZ3VyYXRpb24gc2l0ZSIpOwotCi0JCWludCBvbGROdW1iZXIgPSBvbGRDb25maWdTaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aDsKLQkJaW50IG5ld051bWJlciA9IG5ld0NvbmZpZ1NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCkubGVuZ3RoOwotCQkKLQkJLy8KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjb25maWdGZWF0dXJlcyA9IG5ld0NvbmZpZ1NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnRmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihjb25maWdGZWF0dXJlc1tpXSk7Ci0JCX0JCQotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgY29uZmlndXJlZCBmZWF0dXJlcyBvbGQ6IitvbGROdW1iZXIrIiBuZXc6IituZXdOdW1iZXIsb2xkTnVtYmVyPT1uZXdOdW1iZXIpOwotCQkKLQkJLy8gdGVzdCBvbmx5IDIgaW5zdGFsbCBjb25maWcgaW4gbG9jYWwgc2l0ZQotCQlpbnQgbmV3TnVtYmVyVW5jb25maWd1cmVkRmVhdHVyZXMgPSAoKENvbmZpZ3VyZWRTaXRlKW5ld0NvbmZpZ1NpdGUpLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKS5nZXRVbmNvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aDsKLQkJaW50IG9sZE51bWJlclVuY29uZmlndXJlZEZlYXR1cmVzID0gKChDb25maWd1cmVkU2l0ZSlvbGRDb25maWdTaXRlKS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCkuZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGg7CQkKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2YgdW5jb25maWd1cmVkIGZlYXR1cmVzIixvbGROdW1iZXJVbmNvbmZpZ3VyZWRGZWF0dXJlcysyLG5ld051bWJlclVuY29uZmlndXJlZEZlYXR1cmVzKTsKLQkJCi0JCS8vIGNsZWFudXAKLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUoc2l0ZUxvY2FsLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkKLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUoKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkJCQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7CQotCQl0aW1lID0gIiIrbmV3Q29uZmlnLmdldENyZWF0aW9uRGF0ZSgpLmdldFRpbWUoKTsKLQkJZmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwoKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCksIkRlZmF1bHRDb25maWciK3RpbWUrIi54bWwiKS5nZXRGaWxlKCkpOwkKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOwkKLQkJdGltZSA9ICIiK25ld0NvbmZpZzIuZ2V0Q3JlYXRpb25EYXRlKCkuZ2V0VGltZSgpOwotCQlmaWxlID0gbmV3IEZpbGUobmV3IFVSTCgoKExvY2FsU2l0ZSlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0TG9jYXRpb25VUkwoKSwiRGVmYXVsdENvbmZpZyIrdGltZSsiLnhtbCIpLmdldEZpbGUoKSk7CQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7CQotCX0KLQotfQotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb3JlL1Rlc3RFcnJvclJlY292ZXJ5TG9nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb3JlL1Rlc3RFcnJvclJlY292ZXJ5TG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNGJmZjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29yZS9UZXN0RXJyb3JSZWNvdmVyeUxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgVGhlIEVjbGlwc2UgRm91bmRhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuRXJyb3JSZWNvdmVyeUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgVGVzdEVycm9yUmVjb3ZlcnlMb2cgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCQotCXB1YmxpYyBUZXN0RXJyb3JSZWNvdmVyeUxvZyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldExvY2FsUmFuZG9tSWRlbnRpZmllcigpIHRocm93cyBFeGNlcHRpb24gewotCQlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJCVN0cmluZyBmbmFtZSA9IEVycm9yUmVjb3ZlcnlMb2cuZ2V0TG9jYWxSYW5kb21JZGVudGlmaWVyKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSArICIvZmVhdHVyZS54bWwiKTsKLQkJCUZpbGUgZiA9IG5ldyBGaWxlKGZuYW1lKTsKLQkJCWFzc2VydFRydWUoZi5jcmVhdGVOZXdGaWxlKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29yZS9ib290L0FsbFBsYXRmb3JtQ29uZmlndXJhdGlvblRlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb3JlL2Jvb3QvQWxsUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ1MGY1NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb3JlL2Jvb3QvQWxsUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS5ib290OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEFsbFBsYXRmb3JtQ29uZmlndXJhdGlvblRlc3RzCi0JZXh0ZW5kcyBQbGF0Zm9ybUNvbmZpZ3VyYXRpb25UZXN0Q2FzZSB7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQWxsUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIExpc3Qgb2YgQVBJIHRlc3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuc2V0TmFtZSgiUGxhdGZvcm1Db25maWd1cmF0aW9uIFRlc3RzIik7Ci0KLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RQbGF0Q2ZnQVBJLmNsYXNzKSk7Ci0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotfQotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb3JlL2Jvb3QvUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdENhc2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvcmUvYm9vdC9QbGF0Zm9ybUNvbmZpZ3VyYXRpb25UZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2FjYjNlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvcmUvYm9vdC9QbGF0Zm9ybUNvbmZpZ3VyYXRpb25UZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLmJvb3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBQbGF0Zm9ybUNvbmZpZ3VyYXRpb25UZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHRlbXBEaXI7Ci0JCi0JcHVibGljIFBsYXRmb3JtQ29uZmlndXJhdGlvblRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQl0cnkgewotCQkJaW5pdCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsKLQkJLy8gZ2V0IG5ldyB0ZW1wIGRpcmVjdG9yeSBmb3IgdGVzdGNhc2UKLQkJU3RyaW5nIHJvb3QgPSBnZXRUZW1wRGlyZWN0b3J5TmFtZSgpOwotCQlzZXR1cERpcmVjdG9yeShyb290KTsKLQkJdGVtcERpciA9IHJvb3Q7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgewotCQkvLyBjbGVhbnVwIHRlc3RjYXNlIHRlbXAgZGlyZWN0b3J5Ci0JCWlmICh0ZW1wRGlyICE9IG51bGwpCi0JCQljbGVhbnVwRGlyZWN0b3J5KHRlbXBEaXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRlbXBEaXJlY3RvcnlOYW1lKCkgewotCQlTdHJpbmcgdG1wID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOwotCQlpZiAoIXRtcC5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpCi0JCQl0bXAgKz0gRmlsZS5zZXBhcmF0b3I7Ci0JCXJldHVybiB0bXArImVjbGlwc2UiK0ZpbGUuc2VwYXJhdG9yKyhuZXcgRGF0ZSgpLmdldFRpbWUoKStGaWxlLnNlcGFyYXRvcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldHVwRGlyZWN0b3J5KFN0cmluZyBuYW1lKSB7Ci0JCUZpbGUgZGlyID0gbmV3IEZpbGUobmFtZSk7Ci0JCWRpci5ta2RpcnMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY2xlYW51cERpcmVjdG9yeShTdHJpbmcgbmFtZSkgewotCQlGaWxlIGRpciA9IG5ldyBGaWxlKG5hbWUpOwotCQlkZWxldGVEaXJlY3RvcnkoZGlyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZURpcmVjdG9yeShGaWxlIGRpcikgewotCQlGaWxlW10gbGlzdCA9IGRpci5saXN0RmlsZXMoKTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCQotCQlmb3IgKGludCBpPTA7IGk8bGlzdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGxpc3RbaV0uaXNEaXJlY3RvcnkoKSkgCi0JCQkJZGVsZXRlRGlyZWN0b3J5KGxpc3RbaV0pOwotCQkJaWYgKCFsaXN0W2ldLmRlbGV0ZSgpKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIGRlbGV0ZSAiK2xpc3RbaV0udG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvcmUvYm9vdC9UZXN0UGxhdENmZ0FQSS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29yZS9ib290L1Rlc3RQbGF0Q2ZnQVBJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllM2NhN2MuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29yZS9ib290L1Rlc3RQbGF0Q2ZnQVBJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLmJvb3Q7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uKjsKLQotcHVibGljIGNsYXNzIFRlc3RQbGF0Q2ZnQVBJIGV4dGVuZHMgUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdENhc2UgewotCQkJCi0JcHVibGljIFRlc3RQbGF0Q2ZnQVBJKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCS8vIGdldCBuZXcgY29uZmlnIG9iamVjdAotCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIGNmaWcgPSBudWxsOwotCQl0cnkgewotCQkJY2ZpZyA9IENvbmZpZ3VyYXRvclV0aWxzLmdldFBsYXRmb3JtQ29uZmlndXJhdGlvbihudWxsKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJQXNzZXJ0LmZhaWwoIjAuMC4wICIrZS50b1N0cmluZygpKTsKLQkJfQotCQlJU2l0ZUVudHJ5W10gZGZsdCA9IGNmaWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjAuMC4xIixkZmx0Lmxlbmd0aCwwKTsKLQkJCi0JCS8vIHBvbGljeSB0ZXN0cwotCQlJU2l0ZVBvbGljeSBwMSA9IGNmaWcuY3JlYXRlU2l0ZVBvbGljeShJU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUsIG51bGwpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxLjAuMCIscDEuZ2V0VHlwZSgpLElTaXRlUG9saWN5LlVTRVJfSU5DTFVERSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjEuMC4xIixwMS5nZXRMaXN0KCkubGVuZ3RoLDApOwotCQlwMS5zZXRMaXN0KG5ldyBTdHJpbmdbXSB7ImZpcnN0In0pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxLjAuMiIscDEuZ2V0TGlzdCgpLmxlbmd0aCwxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMS4wLjMiLHAxLmdldExpc3QoKVswXSwiZmlyc3QiKTsKLQkJCi0JCUlTaXRlUG9saWN5IHAyID0gY2ZpZy5jcmVhdGVTaXRlUG9saWN5KElTaXRlUG9saWN5LlVTRVJfRVhDTFVERSwgbmV3IFN0cmluZ1swXSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjEuMS4wIixwMi5nZXRUeXBlKCksSVNpdGVQb2xpY3kuVVNFUl9FWENMVURFKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMS4xLjEiLHAyLmdldExpc3QoKS5sZW5ndGgsMCk7Ci0JCXAyLnNldExpc3QobmV3IFN0cmluZ1tdIHsiZmlyc3QiLCAic2Vjb25kIn0pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxLjEuMiIscDIuZ2V0TGlzdCgpLmxlbmd0aCwyKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMS4xLjMiLHAyLmdldExpc3QoKVsxXSwic2Vjb25kIik7Ci0JCQotCQkvLyBjcmVhdGUgc29tZSB1cmxzCi0JCVVSTCB1MSA9IG51bGw7Ci0KLQkJVVJMIHU0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXUxID0gbmV3IFVSTCgiZmlsZTovZDovdGVtcF90ZXN0X2R1bW15Iik7Ci0JCQluZXcgVVJMKCJodHRwOi8vc29tZS5zZXJ2ZXIvdGVtcC8iKTsKLQkJCXU0ID0gbmV3IFVSTCgiaHR0cDovL2JhZC51cmwiKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCUFzc2VydC5mYWlsKCIyLjAuMCB1bmFibGUgdG8gY3JlYXRlIFVSTCAiK2UpOwotCQl9Ci0JCQkJCi0JCS8vIHNpdGUgY3JlYXRpb24gdGVzdHMKLQkJSVNpdGVFbnRyeSBzMSA9IGNmaWcuY3JlYXRlU2l0ZUVudHJ5KHUxLHAyKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4wLjAiLHMxLmdldFVSTCgpLHUxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4wLjEiLHMxLmdldFNpdGVQb2xpY3koKSxwMik7Ci0JCXMxLnNldFNpdGVQb2xpY3kocDEpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjAuMiIsczEuZ2V0U2l0ZVBvbGljeSgpLHAxKTsKLQkJCi0vLwkJSVNpdGVFbnRyeSBzMiA9IGNmaWcuY3JlYXRlU2l0ZUVudHJ5KHUyLHAxKTsKLS8vCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjEuMCIsczIuZ2V0VVJMKCksdTIpOwotLy8JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMS4xIixzMi5nZXRTaXRlUG9saWN5KCkscDEpOwotLy8JCXMyLnNldFNpdGVQb2xpY3kocDIpOwotLy8JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMS4yIixzMi5nZXRTaXRlUG9saWN5KCkscDIpOwotCQkKLQkJLy8gY29uZmlndXJlIHNpdGUgdGVzdHMKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4zLjAiLGNmaWcuZ2V0Q29uZmlndXJlZFNpdGVzKCkubGVuZ3RoLDApOwotCQljZmlnLmNvbmZpZ3VyZVNpdGUoczEpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjMuMSIsY2ZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKS5sZW5ndGgsMSk7Ci0vLwkJY2ZpZy5jb25maWd1cmVTaXRlKHMyKTsKLS8vCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjMuMiIsY2ZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKS5sZW5ndGgsMik7Ci0vLwkJCi0JCS8vIGxvb2t1cCBzaXRlIHRlc3RzCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuNC4wIixjZmlnLmZpbmRDb25maWd1cmVkU2l0ZSh1MSksczEpOwotLy8JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuNC4xIixjZmlnLmZpbmRDb25maWd1cmVkU2l0ZSh1MiksczIpOwotCQlBc3NlcnQuYXNzZXJ0TnVsbCgiMy40LjMiLGNmaWcuZmluZENvbmZpZ3VyZWRTaXRlKHU0KSk7Ci0JCQotCQkvLyB1bmNvbmZpZ3VyZSBzaXRlIHRlc3RzCi0JCWNmaWcudW5jb25maWd1cmVTaXRlKHMxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy41LjAiLGNmaWcuZ2V0Q29uZmlndXJlZFNpdGVzKCkubGVuZ3RoLDApOwotCQlBc3NlcnQuYXNzZXJ0TnVsbCgiMy41LjEiLGNmaWcuZmluZENvbmZpZ3VyZWRTaXRlKHUxKSk7CQkKLS8vCQljZmlnLnVuY29uZmlndXJlU2l0ZShzMik7Ci0vLwkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy41LjIiLGNmaWcuZ2V0Q29uZmlndXJlZFNpdGVzKCkubGVuZ3RoLDApOwotLy8JCUFzc2VydC5hc3NlcnROdWxsKCIzLjUuMyIsY2ZpZy5maW5kQ29uZmlndXJlZFNpdGUodTIpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTYXZlUmVzdG9yZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkJCQotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiMC4wIFVuYWJsZSB0byBvYnRhaW4gdGVtcCBkaXJlY3RvcnkiLHRlbXBEaXIpOwotCQkKLQkJLy8gZ2V0IG5ldyBjb25maWcgb2JqZWN0Ci0JCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gY2ZpZyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljZmlnID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0UGxhdGZvcm1Db25maWd1cmF0aW9uKG51bGwpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlBc3NlcnQuZmFpbCgiMC4wLjAgIitlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCUlTaXRlRW50cnlbXSBzaXRlcyA9IGNmaWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjAuMC4xIixzaXRlcy5sZW5ndGgsMCk7Ci0JCQkJCi0JCS8vIGNyZWF0ZSBwb2xpY2llcwotCQlJU2l0ZVBvbGljeSBwMSA9IGNmaWcuY3JlYXRlU2l0ZVBvbGljeShJU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUsIG51bGwpOwotCQlJU2l0ZVBvbGljeSBwMiA9IGNmaWcuY3JlYXRlU2l0ZVBvbGljeShJU2l0ZVBvbGljeS5VU0VSX0VYQ0xVREUsIG5ldyBTdHJpbmdbMF0pOwkJCi0JCUlTaXRlUG9saWN5IHAzID0gY2ZpZy5jcmVhdGVTaXRlUG9saWN5KElTaXRlUG9saWN5LlVTRVJfSU5DTFVERSwgbmV3IFN0cmluZ1tdIHsiZmlyc3QifSk7Ci0JCUlTaXRlUG9saWN5IHA0ID0gY2ZpZy5jcmVhdGVTaXRlUG9saWN5KElTaXRlUG9saWN5LlVTRVJfRVhDTFVERSwgbmV3IFN0cmluZ1tdIHsiZmlyc3QiLCAic2Vjb25kIn0pOwotCQkJCQkJCi0JCS8vIGNyZWF0ZSBzb21lIHVybHMKLQkJVVJMIHUxID0gbnVsbDsKLQkJVVJMIHUyID0gbnVsbDsKLQkJVVJMIHUzID0gbnVsbDsKLQkJVVJMIHU0ID0gbnVsbDsKLQotCQl0cnkgewotCQkJdTEgPSBuZXcgVVJMKCJmaWxlOmQ6L3RlbXAvIik7Ci0JCQl1MiA9IG5ldyBVUkwoImZpbGU6L2xvY2FsaG9zdC90ZW1wLyIpOwotCQkJdTMgPSBuZXcgVVJMKCJodHRwOi8vc29tZS5zZXJ2ZXIvdGVtcC8iKTsKLQkJCXU0ID0gbmV3IFVSTCgiaHR0cDovL2Fub3RoZXIuc2VydmVyL3RlbXAvIik7Ci0JCQluZXcgVVJMKCJodHRwOi8vb25lLm1vcmUuc2VydmVyL3RlbXAvIik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlBc3NlcnQuZmFpbCgiMS4wIHVuYWJsZSB0byBjcmVhdGUgVVJMICIrZSk7Ci0JCX0KLQkJCi0JCS8vIGNyZWF0ZSBhbmQgY29uZmlndXJlIHNpdGVzCi0JCUlTaXRlRW50cnkgczEgPSBjZmlnLmNyZWF0ZVNpdGVFbnRyeSh1MSxwMSk7Ci0JCWNmaWcuY29uZmlndXJlU2l0ZShzMSk7Ci0JCUlTaXRlRW50cnkgczIgPSBjZmlnLmNyZWF0ZVNpdGVFbnRyeSh1MixwMik7Ci0JCWNmaWcuY29uZmlndXJlU2l0ZShzMik7Ci0JCUlTaXRlRW50cnkgczMgPSBjZmlnLmNyZWF0ZVNpdGVFbnRyeSh1MyxwMyk7Ci0JCWNmaWcuY29uZmlndXJlU2l0ZShzMyk7Ci0JCUlTaXRlRW50cnkgczQgPSBjZmlnLmNyZWF0ZVNpdGVFbnRyeSh1NCxwNCk7Ci0JCWNmaWcuY29uZmlndXJlU2l0ZShzNCk7Ci0JCXNpdGVzID0gY2ZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMS4xIixzaXRlcy5sZW5ndGgsNCk7Ci0JCQotCQkvLyBkbyBzYXZlCi0JCXRyeSB7Ci0JCQljZmlnLnNhdmUoKTsKLQkJCUFzc2VydC5mYWlsKCIyLjAgd2FzIGV4cGVjdGluZyBJT0V4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJCi0JCVVSTCBjZmlnVVJMID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNmaWdVUkwgPSBuZXcgVVJMKCJmaWxlOiIrdGVtcERpcisgInBsYXRmb3JtLnhtbCIpOwotCQl9IGNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlBc3NlcnQuZmFpbCgiMi4xIHVuYWJsZSB0byBjcmVhdGUgVVJMICIrZSk7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQljZmlnLnNhdmUoY2ZpZ1VSTCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUFzc2VydC5mYWlsKCIyLjIgIitlKTsKLQkJfQotCQkKLQkJLy8gcmVsb2FkIGNvbmZpZ3VyYXRpb24JCi0JCXRyeSB7Ci0JCQlDb25maWd1cmF0b3JVdGlscy5nZXRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oY2ZpZ1VSTCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUFzc2VydC5mYWlsKCIyLjMgIitlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCUlTaXRlRW50cnlbXSBuZXdTaXRlcyA9IGNmaWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjIuNCIsbmV3U2l0ZXMubGVuZ3RoLDQpOwotCQkKLQkJLy8gY2hlY2sgd2hhdCB3ZSd2ZSBnb3QKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4wLjEiLHNpdGVzWzBdLmdldFVSTCgpLG5ld1NpdGVzWzBdLmdldFVSTCgpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4wLjIiLHNpdGVzWzBdLmdldFNpdGVQb2xpY3koKS5nZXRUeXBlKCksbmV3U2l0ZXNbMF0uZ2V0U2l0ZVBvbGljeSgpLmdldFR5cGUoKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMC4zIixzaXRlc1swXS5nZXRTaXRlUG9saWN5KCkuZ2V0TGlzdCgpLG5ld1NpdGVzWzBdLmdldFNpdGVQb2xpY3koKS5nZXRMaXN0KCkpOwotCQkKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4xLjEiLHNpdGVzWzFdLmdldFVSTCgpLG5ld1NpdGVzWzFdLmdldFVSTCgpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4xLjIiLHNpdGVzWzFdLmdldFNpdGVQb2xpY3koKS5nZXRUeXBlKCksbmV3U2l0ZXNbMV0uZ2V0U2l0ZVBvbGljeSgpLmdldFR5cGUoKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMS4zIixzaXRlc1sxXS5nZXRTaXRlUG9saWN5KCkuZ2V0TGlzdCgpLG5ld1NpdGVzWzFdLmdldFNpdGVQb2xpY3koKS5nZXRMaXN0KCkpOwotCQkKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4yLjEiLHNpdGVzWzJdLmdldFVSTCgpLG5ld1NpdGVzWzJdLmdldFVSTCgpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4yLjIiLHNpdGVzWzJdLmdldFNpdGVQb2xpY3koKS5nZXRUeXBlKCksbmV3U2l0ZXNbMl0uZ2V0U2l0ZVBvbGljeSgpLmdldFR5cGUoKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMi4zIixzaXRlc1syXS5nZXRTaXRlUG9saWN5KCkuZ2V0TGlzdCgpLG5ld1NpdGVzWzJdLmdldFNpdGVQb2xpY3koKS5nZXRMaXN0KCkpOwotCQkKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4zLjEiLHNpdGVzWzNdLmdldFVSTCgpLG5ld1NpdGVzWzNdLmdldFVSTCgpKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4zLjIiLHNpdGVzWzNdLmdldFNpdGVQb2xpY3koKS5nZXRUeXBlKCksbmV3U2l0ZXNbM10uZ2V0U2l0ZVBvbGljeSgpLmdldFR5cGUoKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMy4zIixzaXRlc1szXS5nZXRTaXRlUG9saWN5KCkuZ2V0TGlzdCgpLG5ld1NpdGVzWzNdLmdldFNpdGVQb2xpY3koKS5nZXRMaXN0KCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEN1cnJlbnRDb25maWd1cmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCi0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCIwLjAgVW5hYmxlIHRvIG9idGFpbiB0ZW1wIGRpcmVjdG9yeSIsdGVtcERpcik7Ci0JCQotCQkvLyBnZXQgbmV3IGNvbmZpZyBvYmplY3QKLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjZmlnID0gbnVsbDsKLQkJY2ZpZyA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKLQkJY2ZpZy5nZXRQbHVnaW5QYXRoKCk7Ci0JCWNmaWcuc2F2ZSgpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29yZS9ib290L1Rlc3RQbGF0Q2ZnRGVmYXVsdC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29yZS9ib290L1Rlc3RQbGF0Q2ZnRGVmYXVsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzVkMDMxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvcmUvYm9vdC9UZXN0UGxhdENmZ0RlZmF1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS5ib290OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0UGxhdENmZ0RlZmF1bHQKLQlleHRlbmRzIFBsYXRmb3JtQ29uZmlndXJhdGlvblRlc3RDYXNlIHsKLQkJCi0JcHVibGljIFRlc3RQbGF0Q2ZnRGVmYXVsdChTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEluaXRpYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjZmlnID0gbnVsbDsKLQkJY2ZpZyA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZUVudHJ5IHNlID0gY2ZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsKLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeSBzcCA9IGNmaWcuY3JlYXRlU2l0ZVBvbGljeShJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlUG9saWN5LlVTRVJfRVhDTFVERSwgbmV3IFN0cmluZ1tdIHsiMSIsICIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IiwiOSIsIjEwIiwiMTEiLCIxMiJ9KTsKLQkJc2Uuc2V0U2l0ZVBvbGljeShzcCk7Ci0JCWNmaWcuc2F2ZSgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImRvbmUgLi4uIik7Ci0JfQotfQotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9pbXBsZW1lbnRhdGlvbi9TaXRlRlRQLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9pbXBsZW1lbnRhdGlvbi9TaXRlRlRQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZGIwYTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvaW1wbGVtZW50YXRpb24vU2l0ZUZUUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuaW1wbGVtZW50YXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVVSTEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkluc3RhbGxBYm9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci0KLXB1YmxpYyBjbGFzcyBTaXRlRlRQIGltcGxlbWVudHMgSVNpdGUgewotCi0JcHJpdmF0ZSBVUkwgdXJsOwotCXB1YmxpYyBTaXRlRlRQKFVSTCB1cmwpewotCQl0aGlzLnVybCA9IHVybDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGUjZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyBJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRGZWF0dXJlUmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTaXRlI2luc3RhbGwoSUZlYXR1cmUsIEZlYXR1cmVWZXJpZmljYXRpb24gdmVyaWZpZXIsSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbChJRmVhdHVyZSBmZWF0dXJlLElWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZSNyZW1vdmUoSUZlYXR1cmUsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKElGZWF0dXJlIGZlYXR1cmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZSNhZGRTaXRlQ2hhbmdlZExpc3RlbmVyKElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTaXRlQ2hhbmdlZExpc3RlbmVyKElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZSNyZW1vdmVTaXRlQ2hhbmdlZExpc3RlbmVyKElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTaXRlQ2hhbmdlZExpc3RlbmVyKElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZSNnZXRVUkwoKQotCSAqLwotCXB1YmxpYyBVUkwgZ2V0VVJMKCkgewotCQlyZXR1cm4gdXJsOwotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZSNnZXRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmZ0cCI7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTaXRlI2dldENhdGVnb3JpZXMoKQotCSAqLwotCXB1YmxpYyBJQ2F0ZWdvcnlbXSBnZXRDYXRlZ29yaWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGUjZ2V0QXJjaGl2ZXMoKQotCSAqLwotCXB1YmxpYyBJQXJjaGl2ZVJlZmVyZW5jZVtdIGdldEFyY2hpdmVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0gCi0JLyoKLQkgKiBAc2VlIElTaXRlI2FkZENhdGVnb3J5KElDYXRlZ29yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDYXRlZ29yeShJQ2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGUjc2F2ZSgpCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNnZXRQbHVnaW5FbnRyaWVzKCkKLQkgKi8KLQlwdWJsaWMgSVBsdWdpbkVudHJ5W10gZ2V0UGx1Z2luRW50cmllcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjZ2V0UGx1Z2luRW50cnlDb3VudCgpCi0JICovCi0JcHVibGljIGludCBnZXRQbHVnaW5FbnRyeUNvdW50KCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGUjZ2V0RG93bmxvYWRTaXplRm9yKElGZWF0dXJlKQotCSAqLwotCXB1YmxpYyBsb25nIGdldERvd25sb2FkU2l6ZUZvcihJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZSNnZXRJbnN0YWxsU2l6ZUZvcihJRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRJbnN0YWxsU2l6ZUZvcihJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCi0JLyoKLQkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjc3RvcmUoSVBsdWdpbkVudHJ5LCBTdHJpbmcsIElucHV0U3RyZWFtKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3JlKElQbHVnaW5FbnRyeSBlbnRyeSwgU3RyaW5nIG5hbWUsIElucHV0U3RyZWFtIGluU3RyZWFtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElBZGFwdGFibGUjZ2V0QWRhcHRlcihDbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNyZW1vdmUoSVBsdWdpbkVudHJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZShJUGx1Z2luRW50cnkgZW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGUjc2V0U2l0ZUNvbnRlbnRDb25zdW1lcihJU2l0ZUNvbnRlbnRDb25zdW1lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaXRlQ29udGVudENvbnN1bWVyKElTaXRlQ29udGVudENvbnN1bWVyIGNvbnRlbnRDb25zdW1lcikgewotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZSNzZXRTaXRlQ29udGVudFByb3ZpZGVyKElTaXRlQ29udGVudFByb3ZpZGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpdGVDb250ZW50UHJvdmlkZXIoSVNpdGVDb250ZW50UHJvdmlkZXIgc2l0ZUNvbnRlbnRQcm92aWRlcikgewotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZSNnZXRTaXRlQ29udGVudFByb3ZpZGVyKCkKLQkgKi8KLQlwdWJsaWMgSVNpdGVDb250ZW50UHJvdmlkZXIgZ2V0U2l0ZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTaXRlI2dldERlZmF1bHRQYWNrYWdlZEZlYXR1cmVUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYWNrYWdlZEZlYXR1cmVUeXBlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGUjc3RvcmUoSUZlYXR1cmUsIFN0cmluZywgSW5wdXRTdHJlYW0sIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcmUoSUZlYXR1cmUgZmVhdHVyZSwgU3RyaW5nIG5hbWUsIElucHV0U3RyZWFtIGluU3RyZWFtLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQotCS8qCi0JICogQHNlZSBJUGx1Z2luQ29udGFpbmVyI3JlbW92ZShJUGx1Z2luRW50cnksIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKElQbHVnaW5FbnRyeSBlbnRyeSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTaXRlI2dldENhdGVnb3J5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUNhdGVnb3J5IGdldENhdGVnb3J5KFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTaXRlI2NyZWF0ZVNpdGVDb250ZW50Q29uc3VtZXIoSUZlYXR1cmUpCi0JICovCi0JcHVibGljIElTaXRlQ29udGVudENvbnN1bWVyIGNyZWF0ZVNpdGVDb250ZW50Q29uc3VtZXIoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGUjZ2V0RmVhdHVyZVJlZmVyZW5jZShJRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgSVNpdGVGZWF0dXJlUmVmZXJlbmNlIGdldEZlYXR1cmVSZWZlcmVuY2UoSUZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGUjZ2V0RGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyBJVVJMRW50cnkgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZSNnZXRQbHVnaW5FbnRyaWVzT25seVJlZmVyZW5jZWRCeShJRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgSVBsdWdpbkVudHJ5W10gZ2V0UGx1Z2luRW50cmllc09ubHlSZWZlcmVuY2VkQnkoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElTaXRlI2FkZFBsdWdpbkVudHJ5KElQbHVnaW5FbnRyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQbHVnaW5FbnRyeShJUGx1Z2luRW50cnkgcGx1Z2luRW50cnkpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlI2luc3RhbGwoSUZlYXR1cmUsIElGZWF0dXJlUmVmZXJlbmNlW10sIElWZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbChJRmVhdHVyZSBmZWF0dXJlLCBJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsZmVhdHVyZXMsIElWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUZlYXR1cmUgY3JlYXRlRmVhdHVyZShTdHJpbmcgdHlwZSwgVVJMIHVybCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlI2NyZWF0ZUZlYXR1cmUoamF2YS5sYW5nLlN0cmluZywgamF2YS5uZXQuVVJMLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmUgY3JlYXRlRmVhdHVyZShTdHJpbmcgdHlwZSwgVVJMIHVybCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZSNnZXRSYXdGZWF0dXJlUmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIElTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGdldFJhd0ZlYXR1cmVSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlI2dldE1pcnJvclNpdGVFbnRyaWVzKCkKLQkgKi8KLQlwdWJsaWMgSVVSTEVudHJ5W10gZ2V0TWlycm9yU2l0ZUVudHJpZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2ltcGxlbWVudGF0aW9uL1NpdGVGVFBGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9pbXBsZW1lbnRhdGlvbi9TaXRlRlRQRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzM0YTI0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2ltcGxlbWVudGF0aW9uL1NpdGVGVFBGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmltcGxlbWVudGF0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVSTEVuY29kZXI7Ci0KLXB1YmxpYyBjbGFzcyBTaXRlRlRQRmFjdG9yeSBleHRlbmRzIFNpdGVNb2RlbEZhY3RvcnkgaW1wbGVtZW50cyBJU2l0ZUZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRSA9ICJhL2IvYy8iOwotCi0JLyoKLQkgKiBAc2VlIElTaXRlRmFjdG9yeSNjcmVhdGVTaXRlKFVSTCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgSVNpdGUgY3JlYXRlU2l0ZShVUkwgdXJsKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIHsKLQkJSVNpdGUgc2l0ZSA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIHNpdGVTdHJlYW0gPSBudWxsOwotCi0JCXRyeSB7Ci0JCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZSh1cmwpOwotCQkJc2l0ZVN0cmVhbSA9IHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKTsKLQotCQkJU2l0ZU1vZGVsRmFjdG9yeSBmYWN0b3J5ID0gdGhpczsKLQkJCWZhY3RvcnkucGFyc2VTaXRlKHNpdGVTdHJlYW0pOwotCi0JCQlzaXRlID0gbmV3IFNpdGVGVFAobmV3IFVSTCgiaHR0cDovL2VjbGlwc2Uub3JnLyIgKyBGSUxFKSk7Ci0JCQkKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKCJVbmFibGUgdG8gY3JlYXRlIFVSTCIsIGUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGFjY2VzcyBVUkwiLElTaXRlLlNJVEVfQUNDRVNTX0VYQ0VQVElPTiwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChzaXRlU3RyZWFtICE9IG51bGwpCi0JCQkJCXNpdGVTdHJlYW0uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNpdGU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFNpdGVNb2RlbEZhY3RvcnkjY2FuUGFyc2VTaXRlVHlwZShTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUGFyc2VTaXRlVHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLmZ0cCIuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21pcnJvci9BbGxNaXJyb3JUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbWlycm9yL0FsbE1pcnJvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNWE2YTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbWlycm9yL0FsbE1pcnJvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubWlycm9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBBbGxNaXJyb3JUZXN0cyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEFsbE1pcnJvclRlc3RzKFN0cmluZyBuYW1lKXsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLnNldE5hbWUoIk1pcnJvciBUZXN0cyIpOwotCQkKLQkJLy8gdGhlIGZvbGxvd2luZyB3aWxsIHRha2UgYWxsIHRoZSB0ZXN0IG1ldGhvZHMgaW4gdGhlIGNsYXNzIHRoYXQgc3RhcnRzIHdpdGggInRlc3QiCi0JCQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFJlbW90ZUZlYXR1cmVWZXJzaW9uTWlycm9yLmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0UmVtb3RlRW1iZWRkZWRGZWF0dXJlTWlycm9yLmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0UmVtb3RlRG91YmxlRW1iZWRkZWRGZWF0dXJlTWlycm9yLmNsYXNzKSk7Ci0JCQotCQkvLyBvciB5b3UgY2FuIHNwZWNpZnkgdGhlIG1ldGhvZAotCQkvL3N1aXRlLmFkZFRlc3QobmV3IFRlc3RHZXRGZWF0dXJlKCJtZXRob2RUaGF0RG9lc05vdFN0YXJ0V2l0aHRlc3QiKSk7Ci0JCXJldHVybiBzdWl0ZTsJCi0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvTWlycm9yTWFuYWdlclRlc3RDYXNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvTWlycm9yTWFuYWdlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMGViYTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbWlycm9yL01pcnJvck1hbmFnZXJUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5taXJyb3I7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuQ29uZmlndXJhdG9yVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotcHVibGljIGNsYXNzIE1pcnJvck1hbmFnZXJUZXN0Q2FzZSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZXsKLQlwdWJsaWMgc3RhdGljIGludCBleGl0VmFsdWU9LTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmdCdWZmZXIgZXJyT3V0cHV0OwotCQotCXB1YmxpYyBNaXJyb3JNYW5hZ2VyVGVzdENhc2UoU3RyaW5nIGFyZzApewotCQlzdXBlcihhcmcwKTsKLQl9Ci0JCi0JLy9XYXRjaERvZyB0aHJlYWQgdG8ga2lsbCBtaXJyb3JpbmcgcHJvY2VzcyBpZiBpdCBoYW5ncyAob3IgdGFrZXMgdG9vIGxvbmcpCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUaW1lciBleHRlbmRzIFRocmVhZHsKLQkJcHJpdmF0ZSBQcm9jZXNzIHByb2M7Ci0JCQotCQlwdWJsaWMgVGltZXIoUHJvY2VzcyBwcm9jKXsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNldERhZW1vbih0cnVlKTsKLQkJCXRoaXMucHJvYyA9IHByb2M7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJdHJ5IHsKLQkJCQkvLyBOb3RlOiBub3JtYWwgdGVzdCBvbiAyLjJHaHogUDQgaXMgMi45cyAKLQkJCQkvLzouIGdpdmluZyAxMDB4IGxlZXdheSB0byBjb21wbGV0ZSBwcm9jZXNzIGJlZm9yZSBraWxsaW5nIGl0Ci0JCQkJc2xlZXAoMzAwMDAwKTsgCi0JCQkJcHJvYy5kZXN0cm95KCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLy8gc3RydWN0dXJlIHRvIGhvbGQgY2F0ZWdvcnkgZGVmaW5pdGlvbiBuYW1lcyBhbmQgZGVzY3JpcHRpb25zCi0JY2xhc3MgQ2F0ZWdvcnlEZWZpbml0aW9uIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBTdHJpbmcgZGVzYzsKLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXREZXNjKFN0cmluZyBkZXNjKSB7Ci0JCQl0aGlzLmRlc2MgPSBkZXNjOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVzYygpIHsKLQkJCXJldHVybiBkZXNjOwotCQl9Ci0JfQotCQotCS8vIHN0cnVjdHVyZSB0byBob2xkIGZlYXR1cmUgSURzIGFuZCB0aGVpciBjYXRlZ29yeSBuYW1lcwotCXB1YmxpYyBjbGFzcyBGZWF0dXJlQ2F0ZWdvcnl7Ci0JCXByaXZhdGUgU3RyaW5nIGZlYXR1cmVJZDsKLQkJcHJpdmF0ZSBBcnJheUxpc3QgY2F0ZWdvcnk7Ci0JCQotCQlwdWJsaWMgRmVhdHVyZUNhdGVnb3J5KCl7Ci0JCQljYXRlZ29yeSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0RmVhdHVyZUlEKFN0cmluZyBmaWQpewotCQkJZmVhdHVyZUlkID0gZmlkOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBhZGRDYXRlZ29yeShTdHJpbmcgY2F0KXsKLQkJCWNhdGVnb3J5LmFkZChjYXQpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVJRCgpewotCQkJcmV0dXJuIGZlYXR1cmVJZDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZ1tdIGdldENhdGVnb3JpZXMoKXsKLQkJCXJldHVybiAoU3RyaW5nW10pY2F0ZWdvcnkudG9BcnJheShuZXcgU3RyaW5nW2NhdGVnb3J5LnNpemUoKV0pOwotCQl9Ci0JfQotCQotCS8vIFN0cmVhbUNvbnN1bWVyIHRvIGRpc3BsYXkgb3V0cHV0IHRvIG91dHB1dCBmaWxlcyBvciBjb25zb2xlCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTdHJlYW1Db25zdW1lciBleHRlbmRzIFRocmVhZCB7Ci0JCXByaXZhdGUgQnVmZmVyZWRSZWFkZXIgYlJlYWRlcjsKLQotCQlwdWJsaWMgU3RyZWFtQ29uc3VtZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJCXN1cGVyKCk7Ci0JCQlzZXREYWVtb24odHJ1ZSk7Ci0JCQliUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbGluZTsKLQkJCQl3aGlsZSAobnVsbCAhPSAobGluZSA9IGJSZWFkZXIucmVhZExpbmUoKSkpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGxpbmUpOwotCQkJCQllcnJPdXRwdXQuYXBwZW5kKGxpbmUpOwotCQkJCQllcnJPdXRwdXQuYXBwZW5kKCJcbiIpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgYXJyYXkgY29uc2lzdGluZyBvZiBjb21tYW5kcyBhbmQgdGhlaXIgYXJndW1lbnRzIHRvCi0JICogYmUgcnVuLgotCSAqIEBwYXJhbSByZW1vdGVMb2MgLSBwYXRoIG9mIHJlbW90ZSBzaXRlIChzaXRlIGJlaW5nIG1pcnJvcmVkKQotCSAqIEBwYXJhbSB0b0xvY2FsU2l0ZVVybCAtIHBhdGggb2YgbG9jYWwgc2l0ZSAobmV3IG1pcnJvciBzaXRlKQotCSAqIEBwYXJhbSBmaWQgLSBmZWF0dXJlIGlkIG9mIGZlYXR1cmluZyBiZWluZyBtaXJyb3IgKG9wdGlvbmFsIC0gY2FuIGJlIG51bGwpCi0JICogQHBhcmFtIHZlciAtIHZlcnNpb24gb2YgZmVhdHVyZSB0byBiZSBtaXJyb3JlZCAob3B0aW9uYWwgLSBjYW4gYmUgbnVsbCkKLQkgKiBAcGFyYW0gbWlyVXJsIC0gZGlyZWN0b3J5IGxvY2F0aW9uIG9mIHBvbGljeS54bWwgKG9wdGlvbmFsIC0gY2FuIGJlIG51bGwpCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb21tYW5kKAotCQlTdHJpbmcgcmVtb3RlTG9jLAotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwsCi0JCVN0cmluZyBmaWQsCi0JCVN0cmluZyB2ZXIsCi0JCVN0cmluZyBtaXJVcmwpIHsKLQkJZmluYWwgU3RyaW5nIGNsYXNzcGF0aCA9IGdldExhdW5jaGVyKCk7Ci0JCWZpbmFsIFN0cmluZyBsYXVuY2hlciA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLk1haW4iOwotCQlmaW5hbCBTdHJpbmcgY29tbWFuZCA9ICJtaXJyb3IiOwotCQlmaW5hbCBTdHJpbmcgYXBwbGljYXRpb24gPSAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuc3RhbmRhbG9uZVVwZGF0ZSI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX0NQID0gIi1jcCI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX0FQUCA9ICItYXBwbGljYXRpb24iOwotCQlmaW5hbCBTdHJpbmcgRkxBR19DTUQgPSAiLWNvbW1hbmQiOwotCQlmaW5hbCBTdHJpbmcgRkxBR19GSUQgPSAiLWZlYXR1cmVJZCI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX0RBVEEgPSAiLWRhdGEiOwotCQlmaW5hbCBTdHJpbmcgRkxBR19WRVJTSU9OID0gIi12ZXJzaW9uIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfRlJPTSA9ICItZnJvbSI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX1RPID0gIi10byI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX1VSTCA9ICItbWlycm9yVVJMIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfU1BMQVNIID0gIi1ub3NwbGFzaCI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX0NPTlNPTEVMT0cgPSAiLWNvbnNvbGVsb2ciOwotCQlmaW5hbCBTdHJpbmcgZGF0YSA9Ci0JCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCVN0cmluZ1tdIGNtZCA9Ci0JCQluZXcgU3RyaW5nW10gewotCQkJCWdldEphdmFWTVBhdGgoKSwKLQkJCQlGTEFHX0NQLAotCQkJCWNsYXNzcGF0aCwKLQkJCQlsYXVuY2hlciwKLQkJCQlGTEFHX0FQUCwKLQkJCQlhcHBsaWNhdGlvbiwKLQkJCQlGTEFHX0NNRCwKLQkJCQljb21tYW5kLAotCQkJCUZMQUdfRlJPTSwKLQkJCQkocmVtb3RlTG9jICE9bnVsbCA/IHJlbW90ZUxvYyA6ICIiKSwKLQkJCQlGTEFHX1RPLAotCQkJCXRvTG9jYWxTaXRlVXJsLAotCQkJCShmaWQgIT0gbnVsbCA/IEZMQUdfRklEIDogIiIpLAotCQkJCShmaWQgIT0gbnVsbCA/IGZpZCA6ICIiKSwKLQkJCQkodmVyICE9IG51bGwgPyBGTEFHX1ZFUlNJT04gOiAiIiksCi0JCQkJKHZlciAhPSBudWxsID8gdmVyIDogIiIpLAotCQkJCShtaXJVcmwgIT0gbnVsbCA/IEZMQUdfVVJMIDogIiIpLAotCQkJCShtaXJVcmwgIT0gbnVsbCA/IG1pclVybCA6ICIiKSwKLQkJCQlGTEFHX1NQTEFTSCwKLQkJCQlGTEFHX0RBVEEsCi0JCQkJZGF0YSwKLQkJCQlGTEFHX0NPTlNPTEVMT0d9OwotCQlyZXR1cm4gY21kOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRMYXVuY2hlcigpIHsKLQkJQnVuZGxlIGxhdW5jaGVyID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyIik7Ci0JCS8vIHRvZG8KLQkJaWYgKGxhdW5jaGVyID09IG51bGwpCi0JCQlyZXR1cm4gIiI7Ci0JCVVSTCByb290RW50cnkgPSBsYXVuY2hlci5nZXRFbnRyeSgiLyIpOwotCQl0cnkgewotCQkJcm9vdEVudHJ5ID0gRmlsZUxvY2F0b3IucmVzb2x2ZShyb290RW50cnkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKCJmaWxlIi5lcXVhbHMocm9vdEVudHJ5LmdldFByb3RvY29sKCkpKQotCQkJcmV0dXJuIG5ldyBGaWxlKHJvb3RFbnRyeS5nZXRQYXRoKCkpLmdldEFic29sdXRlUGF0aCgpOwotCQlpZiAoImphciIuZXF1YWxzKHJvb3RFbnRyeS5nZXRQcm90b2NvbCgpKSkgewotCQkJU3RyaW5nIHBhdGggPSByb290RW50cnkuZ2V0UGF0aCgpOwkKLQkJCS8vIHN0cmlwIG9mZiB0aGUgZmlsZTogYW5kIHRoZSAhLwotCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDUsIHBhdGgubGVuZ3RoKCkgLSAyKTsKLQkJCXJldHVybiBuZXcgRmlsZShwYXRoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2hlY2tGZWF0dXJlSW5TaXRlWE1MRXhpc3RzKFN0cmluZyB1cmwsIFN0cmluZyBmaWQsIFN0cmluZyB2ZXIpewotCQlGaWxlIHNpdGUgPSBuZXcgRmlsZSh1cmwgKyAiL3NpdGUueG1sIik7Ci0JCWFzc2VydFRydWUoc2l0ZS5leGlzdHMoKSk7Ci0JCUJ1ZmZlcmVkUmVhZGVyIGJyZWFkZXI7Ci0JCUZpbGVSZWFkZXIgZnJlYWRlcjsKLQkJU3RyaW5nIHRleHQgPSBuZXcgU3RyaW5nKCk7Ci0JCVN0cmluZyBqYXJOYW1lID0gZmlkICsgIl8iICsgdmVyICsgIi5qYXIiOwotCQlTdHJpbmcgZmVhdHVyZSA9ICI8ZmVhdHVyZSB1cmw9XCIiICsKLQkJCSJmZWF0dXJlcy8iICsgamFyTmFtZSArIAotCQkJIlwiIGlkPVwiIiArIGZpZCArIAotCQkJIlwiIHZlcnNpb249XCIiICsgdmVyKyJcIj4iOwotCQl0cnkgewotCQkJZnJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKHNpdGUpOwotCQkJYnJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmcmVhZGVyKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHdvdWxkIGhhdmUgYmVlbiBjYXVnaHQgYnkgYXNzZXJ0IGFib3ZlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJdHJ5IHsKLQkJCXdoaWxlICgodGV4dCA9IGJyZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotCQkJCXRleHQgPSB0ZXh0LnRyaW0oKTsKLQkJCQlpZiAodGV4dC5lcXVhbHMoZmVhdHVyZSkpewotCQkJCQlicmVhZGVyLmNsb3NlKCk7Ci0JCQkJCWZyZWFkZXIuY2xvc2UoKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlicmVhZGVyLmNsb3NlKCk7Ci0JCQlmcmVhZGVyLmNsb3NlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjaGVja1NpdGVYTUwoU3RyaW5nIHVybCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbGUgbWlycm9yID0gbmV3IEZpbGUodXJsKTsKLQkJRmlsZSBzaXRlID0gbmV3IEZpbGUodXJsICsgIi9zaXRlLnhtbCIpOwotCQlhc3NlcnRUcnVlKG1pcnJvci5pc0RpcmVjdG9yeSgpKTsKLQkJYXNzZXJ0VHJ1ZShtaXJyb3IuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKHNpdGUuZXhpc3RzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNoZWNrUG9saWN5WE1MKFN0cmluZyB1cmwpIHRocm93cyBFeGNlcHRpb24gewotCQlGaWxlIG1pcnJvciA9IG5ldyBGaWxlKHVybCk7Ci0JCUZpbGUgc2l0ZSA9IG5ldyBGaWxlKHVybCArICIvcG9saWN5LnhtbCIpOwotCQlhc3NlcnRUcnVlKG1pcnJvci5pc0RpcmVjdG9yeSgpKTsKLQkJYXNzZXJ0VHJ1ZShtaXJyb3IuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKHNpdGUuZXhpc3RzKCkpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja1BvbGljeVVSTChTdHJpbmcgdXJsLCBTdHJpbmcgbWlycm9yVXJsKXsKLQkJRmlsZSBzaXRlID0gbmV3IEZpbGUodXJsICsgIi9wb2xpY3kueG1sIik7Ci0JCWFzc2VydFRydWUoc2l0ZS5leGlzdHMoKSk7Ci0JCUJ1ZmZlcmVkUmVhZGVyIGJyZWFkZXI7Ci0JCUZpbGVSZWFkZXIgZnJlYWRlcjsKLQkJU3RyaW5nIHRleHQgPSBuZXcgU3RyaW5nKCk7Ci0KLQkJdHJ5IHsKLQkJCWZyZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihzaXRlKTsKLQkJCWJyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZnJlYWRlcik7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB3b3VsZCBoYXZlIGJlZW4gY2F1Z2h0IGJ5IGFzc2VydCBhYm92ZQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXdoaWxlICgodGV4dCA9IGJyZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotCQkJCWlmICh0ZXh0LmluZGV4T2YobWlycm9yVXJsKSE9LTEpewotCQkJCQlicmVhZGVyLmNsb3NlKCk7Ci0JCQkJCWZyZWFkZXIuY2xvc2UoKTsJCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQkJYnJlYWRlci5jbG9zZSgpOwotCQkJZnJlYWRlci5jbG9zZSgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZG9lc0NhdGVnb3J5RGVmaW5pdGlvbkV4aXN0KFN0cmluZyB1cmwpIHsKLQkJRmlsZSBzaXRlID0gbmV3IEZpbGUodXJsICsgIi9zaXRlLnhtbCIpOwotCQlhc3NlcnRUcnVlKHNpdGUuZXhpc3RzKCkpOwotCQlCdWZmZXJlZFJlYWRlciBicmVhZGVyOwotCQlGaWxlUmVhZGVyIGZyZWFkZXI7Ci0JCVN0cmluZyB0ZXh0ID0gbmV3IFN0cmluZygpOwotCi0JCXRyeSB7Ci0JCQlmcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoc2l0ZSk7Ci0JCQlicmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZyZWFkZXIpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gd291bGQgaGF2ZSBiZWVuIGNhdWdodCBieSBhc3NlcnQgYWJvdmUKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQl3aGlsZSAoKHRleHQgPSBicmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCQlpZiAodGV4dC5pbmRleE9mKCJjYXRlZ29yeS1kZWYiKSE9LTEpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlicmVhZGVyLmNsb3NlKCk7Ci0JCQlmcmVhZGVyLmNsb3NlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVjbGlwc2VSb290KCkgewotCQlyZXR1cm4gQ29uZmlndXJhdG9yVXRpbHMuZ2V0SW5zdGFsbFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkucmVwbGFjZUZpcnN0KAotCQkJImZpbGU6IiwKLQkJCSIiKTsKLQl9Ci0JCi0JcHVibGljIEZlYXR1cmVDYXRlZ29yeVtdIGdldEZlYXR1cmVDYXRlZ29yaWVzKFN0cmluZyB1cmwpewotCQlGaWxlIHNpdGUgPSBuZXcgRmlsZSh1cmwgKyAiL3NpdGUueG1sIik7Ci0JCWFzc2VydFRydWUoc2l0ZS5leGlzdHMoKSk7Ci0JCUJ1ZmZlcmVkUmVhZGVyIGJyZWFkZXI7Ci0JCUZpbGVSZWFkZXIgZnJlYWRlcjsKLQkJU3RyaW5nIHRleHQgPSBuZXcgU3RyaW5nKCk7Ci0JCUFycmF5TGlzdCBmZWF0dXJlQ2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCXRyeSB7Ci0JCQlmcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoc2l0ZSk7Ci0JCQlicmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZyZWFkZXIpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gd291bGQgaGF2ZSBiZWVuIGNhdWdodCBieSBhc3NlcnQgYWJvdmUKLQkJCXJldHVybiBuZXcgRmVhdHVyZUNhdGVnb3J5WzBdOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCUZlYXR1cmVDYXRlZ29yeSBjdXJyVG9rID0gbmV3IEZlYXR1cmVDYXRlZ29yeSgpOwotCQkJYm9vbGVhbiBhZGQgPSBmYWxzZTsKLQkJCXdoaWxlKCh0ZXh0ID1icmVhZGVyLnJlYWRMaW5lKCkpIT1udWxsKXsKLQkJCQlTdHJpbmdUb2tlbml6ZXIgc3RyVG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcih0ZXh0KTsKLQkJCQl3aGlsZSAoc3RyVG9rLmhhc01vcmVUb2tlbnMoKSl7Ci0JCQkJCVN0cmluZyB0ZW1wID0gc3RyVG9rLm5leHRUb2tlbigpOwotCQkJCQlpZiAodGVtcC5lcXVhbHMoIjwvZmVhdHVyZT4iKSl7Ci0JCQkJCQlhZGQgPSB0cnVlOwotCQkJCQl9IGVsc2UgaWYgKHRlbXAuc3RhcnRzV2l0aCgiaWQiKSl7Ci0JCQkJCQljdXJyVG9rLnNldEZlYXR1cmVJRCh0ZW1wLnNwbGl0KCJcIiIpWzFdKTsKLQkJCQkJfSBlbHNlIGlmICh0ZW1wLnN0YXJ0c1dpdGgoIm5hbWUiKSl7Ci0JCQkJCQljdXJyVG9rLmFkZENhdGVnb3J5KHRlbXAuc3BsaXQoIlwiIilbMV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChhZGQpewotCQkJCQlmZWF0dXJlQ2F0ZWdvcmllcy5hZGQoY3VyclRvayk7Ci0JCQkJCWN1cnJUb2sgPSBuZXcgRmVhdHVyZUNhdGVnb3J5KCk7Ci0JCQkJCWFkZCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQotCQkJYnJlYWRlci5jbG9zZSgpOwotCQkJZnJlYWRlci5jbG9zZSgpOwotCQkJcmV0dXJuIChGZWF0dXJlQ2F0ZWdvcnlbXSlmZWF0dXJlQ2F0ZWdvcmllcy50b0FycmF5KG5ldyBGZWF0dXJlQ2F0ZWdvcnlbZmVhdHVyZUNhdGVnb3JpZXMuc2l6ZSgpXSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJCXJldHVybiBuZXcgRmVhdHVyZUNhdGVnb3J5WzBdOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVZNUGF0aCgpIHsKLQkJLy8gQ3JlYXRlIGNvbW1hbmQgc3RyaW5nIGZvciBsYXVuY2hpbmcgdGhlIHByb2Nlc3MKLQkJU3RyaW5nIHZtID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZtLm5hbWUiKTsKLQkJU3RyaW5nIGV4ZWN1dGFibGUgPSAiSjkiLmVxdWFscyh2bSkgPyAiajkiIDogImphdmEiOwotCQlpZiAob3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkNvbnN0YW50cy5PU19XSU4zMi5lcXVhbHMoUGxhdGZvcm0uZ2V0T1MoKSkpCi0JCQlleGVjdXRhYmxlICs9ICJ3LmV4ZSI7Ci0KLQkJU3RyaW5nIGphdmFJbnN0YWxsRGlyID0KLQkJCVN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikgKyBGaWxlLnNlcGFyYXRvciArICJiaW4iOwotCQlyZXR1cm4gamF2YUluc3RhbGxEaXIgKyBGaWxlLnNlcGFyYXRvciArIGV4ZWN1dGFibGU7Ci0JfQotCQotCXB1YmxpYyBDYXRlZ29yeURlZmluaXRpb25bXSBnZXRDYXRlZ29yeURlZmluaXRpb25zKFN0cmluZyB1cmwpIHsKLQkJRmlsZSBzaXRlID0gbmV3IEZpbGUodXJsICsgIi9zaXRlLnhtbCIpOwotCQlhc3NlcnRUcnVlKHNpdGUuZXhpc3RzKCkpOwotCQlCdWZmZXJlZFJlYWRlciBicmVhZGVyOwotCQlGaWxlUmVhZGVyIGZyZWFkZXI7Ci0JCVN0cmluZyB0ZXh0ID0gbmV3IFN0cmluZygpOwotCQlBcnJheUxpc3QgY2F0RGVmID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXRyeSB7Ci0JCQlmcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoc2l0ZSk7Ci0JCQlicmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZyZWFkZXIpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gd291bGQgaGF2ZSBiZWVuIGNhdWdodCBieSBhc3NlcnQgYWJvdmUKLQkJCXJldHVybiBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uWzBdOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWJvb2xlYW4gYWRkID0gZmFsc2U7Ci0JCQlib29sZWFuIGlzRGVzYyA9IGZhbHNlOwotCQkJQ2F0ZWdvcnlEZWZpbml0aW9uIHRlbXAgPSBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKCk7Ci0JCQl3aGlsZSAoKHRleHQgPSBicmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCQlpZiAodGV4dC50cmltKCkuc3RhcnRzV2l0aCgiPGNhdGVnb3J5LWRlZiIpCi0JCQkJCSYmIHRleHQuaW5kZXhPZigibmFtZSIpICE9IC0xKSB7Ci0JCQkJCXRlbXAuc2V0TmFtZSh0ZXh0LnNwbGl0KCJcIiIpWzFdKTsKLQkJCQkJYWRkID0gZmFsc2U7Ci0JCQkJfSBlbHNlIGlmICh0ZXh0LnRyaW0oKS5lcXVhbHMoIjxkZXNjcmlwdGlvbj4iKSkgewotCQkJCQlpc0Rlc2MgPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAodGV4dC50cmltKCkuZXF1YWxzKCI8L2Rlc2NyaXB0aW9uPiIpKSB7Ci0JCQkJCWlzRGVzYyA9IGZhbHNlOwotCQkJCX0gZWxzZSBpZiAoaXNEZXNjKSB7Ci0JCQkJCXRlbXAuc2V0RGVzYyh0ZXh0LnRyaW0oKSk7Ci0JCQkJfSBlbHNlIGlmICh0ZXh0LnRyaW0oKS5lcXVhbHMoIjwvY2F0ZWdvcnktZGVmPiIpKSB7Ci0JCQkJCWFkZCA9IHRydWU7Ci0JCQkJfQotCQkJCWlmIChhZGQpIHsKLQkJCQkJY2F0RGVmLmFkZCh0ZW1wKTsKLQkJCQkJYWRkID0gZmFsc2U7Ci0JCQkJCXRlbXAgPSBuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlicmVhZGVyLmNsb3NlKCk7Ci0JCQlmcmVhZGVyLmNsb3NlKCk7Ci0JCQlyZXR1cm4gKENhdGVnb3J5RGVmaW5pdGlvbltdKWNhdERlZi50b0FycmF5KG5ldyBDYXRlZ29yeURlZmluaXRpb25bY2F0RGVmLnNpemUoKV0pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCQlyZXR1cm4gbmV3IENhdGVnb3J5RGVmaW5pdGlvblswXTsKLQkJfQotCi0JfQotCQotCXB1YmxpYyBpbnQgcGVyZm9ybU1pcnJvcihTdHJpbmdbXSBjbWRfbWlycm9yKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGdldEVjbGlwc2VSb290KCkpOwotCQl0cnkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMYXVuY2hpbmc6Iik7Ci0JCQlmb3IoaW50IGk9MDsgaTxjbWRfbWlycm9yLmxlbmd0aDsgaSsrKXsKLQkJCQlTeXN0ZW0ub3V0LnByaW50KGNtZF9taXJyb3JbaV0rIiAiKTsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJUHJvY2VzcyBwcm9jID0KLQkJCQlSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNtZF9taXJyb3IsIChTdHJpbmdbXSkgbnVsbCwgZmlsZSk7Ci0KLQkJCVN0cmVhbUNvbnN1bWVyIG91dHB1dHMgPSBuZXcgU3RyZWFtQ29uc3VtZXIocHJvYy5nZXRJbnB1dFN0cmVhbSgpKTsKLQkJCW91dHB1dHMuc3RhcnQoKTsKLQkJCVN0cmVhbUNvbnN1bWVyIGVycm9ycyA9IG5ldyBTdHJlYW1Db25zdW1lcihwcm9jLmdldEVycm9yU3RyZWFtKCkpOwotCQkJZXJyb3JzLnN0YXJ0KCk7Ci0JCQlUaW1lciB0aW1lciA9IG5ldyBUaW1lcihwcm9jKTsKLQkJCXRpbWVyLnN0YXJ0KCk7Ci0KLQkJCXJldHVybiBwcm9jLndhaXRGb3IoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8vIGVuc3VyZSBleGl0IHdpdGhvdXQgcHJvYmxlbXMKLQlwdWJsaWMgdm9pZCB0ZXN0RXhpdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCBleGl0VmFsdWUpOwotCX0KLQkKLQkvLyBlbnN1cmUgb3V0cHV0IHN0cmluZyBidWZmZXIgZW5kcyB3aXRoICJNaXJyb3IgY29tbWFuZCBjb21wbGV0ZWQKLQkvLyBzdWNjZXNzZnVsbHkuIgotCS8vIG5vdGU6IG91dHB1dCBtYXkgaW5zdGVhZCBieSAiQ29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiIKLQlwdWJsaWMgdm9pZCB0ZXN0TWlycm9yU3VjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0KLQkJCW5ldyBTdHJpbmdUb2tlbml6ZXIoCi0JCQkJZXJyT3V0cHV0LnRvU3RyaW5nKCksCi0JCQkJIlxuIik7Ci0JCVN0cmluZyBsYXN0TGluZSA9IG5ldyBTdHJpbmcoKTsKLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpewotCQkJbGFzdExpbmUgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCX0KLQkJaWYgKGxhc3RMaW5lLmVxdWFscygiTWlycm9yIGNvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4iKSkKLQkJCXJldHVybjsKLQkJYXNzZXJ0RXF1YWxzKCJPdXRwdXQgd2FzOiAiICsgZXJyT3V0cHV0LnRvU3RyaW5nKCksICJDb21tYW5kIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIiwgbGFzdExpbmUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21pcnJvci9UZXN0UmVtb3RlRG91YmxlRW1iZWRkZWRGZWF0dXJlTWlycm9yLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvVGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDhjZjc1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21pcnJvci9UZXN0UmVtb3RlRG91YmxlRW1iZWRkZWRGZWF0dXJlTWlycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLm1pcnJvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZVRlc3RzUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgVGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvciBleHRlbmRzIE1pcnJvck1hbmFnZXJUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc01pcnJvcmVkOwotCi0JcHVibGljIFRlc3RSZW1vdGVEb3VibGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JCWVyck91dHB1dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaXNNaXJyb3JlZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHVtU2V0VXAoKSB7Ci0JCVN0cmluZyBmZWF0dXJlSWQgPSAidXBkYXRlLmZlYXR1cmUxYyI7Ci0JCVN0cmluZyB2ZXJzaW9uID0gIjMuMC4wIjsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVEb3VibGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQlTdHJpbmcgbWlycm9yVVJMID0gImh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvbXktbWlycm9yLXVybCI7Ci0JCS8vIGZpcnN0IG1pcnJvcgotCQlTdHJpbmcgZnJvbVJlbW90ZVNpdGVVcmwgPQotCQkJImZpbGU6IgotCQkJCSsgZGF0YVBhdGgKLQkJCQkrICJtaXJyb3JzL3VwZGF0ZS1zaXRlMSI7Ci0JCWlmICghaXNNaXJyb3JlZCkgewotCQkJZXhpdFZhbHVlID0KLQkJCQlwZXJmb3JtTWlycm9yKAotCQkJCQlnZXRDb21tYW5kKGZyb21SZW1vdGVTaXRlVXJsLHRvTG9jYWxTaXRlVXJsLCBudWxsLCBudWxsLCBtaXJyb3JVUkwpKTsKLQkJCi0JCS8vIGVuZCBvZiBmaXJzdCBtaXJyb3IKLQkJZnJvbVJlbW90ZVNpdGVVcmwgPQotCQkJImZpbGU6IgotCQkJKyBkYXRhUGF0aAotCQkJKyAibWlycm9ycy91cGRhdGUtc2l0ZTUiOwotCQkJZXhpdFZhbHVlID0KLQkJCQlwZXJmb3JtTWlycm9yKAotCQkJCQlnZXRDb21tYW5kKGZyb21SZW1vdGVTaXRlVXJsLHRvTG9jYWxTaXRlVXJsLCBmZWF0dXJlSWQsIHZlcnNpb24sIG1pcnJvclVSTCkpOwotCQkJaXNNaXJyb3JlZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQkvLyBtYWtlIHN1cmUgZWFjaCBmZWF0dXJlIGlzIHVuZGVyIGl0cyBjb3JyZWN0IGNhdGVnb3J5IG5hbWVzCi0JcHVibGljIHZvaWQgdGVzdEZlYXR1cmVDYXRlZ29yaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVEb3VibGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQlGZWF0dXJlQ2F0ZWdvcnlbXSBtaXJyb3JGZWF0dXJlcyA9IGdldEZlYXR1cmVDYXRlZ29yaWVzKHRvTG9jYWxTaXRlVXJsKTsKLQkJRmVhdHVyZUNhdGVnb3J5W10gcmVxdWlyZWQgPSBuZXcgRmVhdHVyZUNhdGVnb3J5WzFdOwotCQlyZXF1aXJlZFswXSA9IG5ldyBGZWF0dXJlQ2F0ZWdvcnkoKTsKLQkJcmVxdWlyZWRbMF0uc2V0RmVhdHVyZUlEKCJ1cGRhdGUuZmVhdHVyZTFjIik7Ci0JCXJlcXVpcmVkWzBdLmFkZENhdGVnb3J5KCJTaXRlNS1DYXRlZ29yeTEiKTsKLQkJYXNzZXJ0VHJ1ZShjaGVja0ZlYXR1cmVDYXRlZ29yaWVzQ29udGFpbmVkKHJlcXVpcmVkLCBtaXJyb3JGZWF0dXJlcykpOwotCX0KLQkKLQkvLyBlbnN1cmUgZXhpdCB3aXRob3V0IHByb2JsZW1zCi0JcHVibGljIHZvaWQgdGVzdEV4aXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZXN0RXhpdFZhbHVlKCk7Ci0JfQotCQotCS8vIGVuc3VyZSBjYXRlZ29yeSBkZWZpbml0aW9ucyBleGlzdAotCXB1YmxpYyB2b2lkIHRlc3RDYXRlZ29yeURlZmluaXRpb25zRXhpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVEb3VibGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQlhc3NlcnRUcnVlKGRvZXNDYXRlZ29yeURlZmluaXRpb25FeGlzdCh0b0xvY2FsU2l0ZVVybCkpOwotCX0KLQotCS8vIGVuc3VyZSBmZWF0dXJlIGV4aXN0cyBwZXIgc2l0ZS54bWwKLQlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZUluU2l0ZVhNTEV4aXN0cygpIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVEb3VibGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQlTdHJpbmcgZmVhdHVyZUlkID0gInVwZGF0ZS5mZWF0dXJlMWMiOwotCQlTdHJpbmcgdmVyc2lvbiA9ICIzLjAuMCI7Ci0JCWFzc2VydFRydWUoCi0JCQljaGVja0ZlYXR1cmVJblNpdGVYTUxFeGlzdHModG9Mb2NhbFNpdGVVcmwsIGZlYXR1cmVJZCwgdmVyc2lvbikpOwotCX0KLQotCS8vIGVuc3VyZSBzaXRlLnhtbCBpcyBnZW5lcmF0ZWQKLQlwdWJsaWMgdm9pZCB0ZXN0U2l0ZVhNTEV4aXN0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCWNoZWNrU2l0ZVhNTCh0b0xvY2FsU2l0ZVVybCk7Ci0JfQotCi0JLy8gZW5zdXJlIHBvbGljeS54bWwgaXMgZ2VuZXJhdGVkCi0JcHVibGljIHZvaWQgdGVzdFBvbGljeVhNTEV4aXN0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCWNoZWNrUG9saWN5WE1MKHRvTG9jYWxTaXRlVXJsKTsKLQl9Ci0KLQkvLyBlbnN1cmUgcG9saWN5LnhtbCByZWZlcmVuY2VzIHRoZSBjb3JyZWN0IG1pcnJvclVSTAotCXB1YmxpYyB2b2lkIHRlc3RQb2xpY3lVUkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVEb3VibGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQlTdHJpbmcgbWlycm9yVVJMID0gImh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvbXktbWlycm9yLXVybCI7Ci0JCWFzc2VydFRydWUoY2hlY2tQb2xpY3lVUkwodG9Mb2NhbFNpdGVVcmwsIG1pcnJvclVSTCkpOwotCX0KLQotCS8vIGVuc3VyZSBhbGwgamFycyBpbiBmZWF0dXJlcyBkaXJlY3RvcnkgbWlycm9yZWQKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsRmVhdHVyZUphcnNFeGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCVN0cmluZ1tdIGZlYXR1cmVKYXJzID0geyAidXBkYXRlLmZlYXR1cmUxYl8yLjAuMC5qYXIiIH07Ci0JCWFzc2VydFRydWUoY2hlY2tBbGxGZWF0dXJlSmFycyh0b0xvY2FsU2l0ZVVybCwgZmVhdHVyZUphcnMpKTsKLQl9Ci0KLQkvLyBlbnN1cmUgYWxsIGphcnMgaW4gcGx1Z2lucyBkaXJlY3RvcnkgbWlycm9yZWQKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsUGx1Z2luSmFyc0V4aXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRG91YmxlRW1iZWRkZWRGZWF0dXJlTWlycm9yIjsKLQkJU3RyaW5nW10gcGx1Z2luSmFycyA9Ci0JCQl7ICJjb20ucGx1Z2luMV8xLjAuMC5qYXIiLCAiY29tLnBsdWdpbjFhXzEuMC4xLmphciIgfTsKLQkJYXNzZXJ0VHJ1ZShjaGVja0FsbFBsdWdpbkphcnModG9Mb2NhbFNpdGVVcmwsIHBsdWdpbkphcnMpKTsKLQl9Ci0KLQkvLyBlbnN1cmUgb3V0cHV0IHN0cmluZyBidWZmZXIgZW5kcyB3aXRoICJNaXJyb3IgY29tbWFuZCBjb21wbGV0ZWQKLQkvLyBzdWNjZXNzZnVsbHkuIgotCS8vIG5vdGU6IG91dHB1dCBtYXkgaW5zdGVhZCBieSAiQ29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiIKLQlwdWJsaWMgdm9pZCB0ZXN0TWlycm9yU3VjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZXN0TWlycm9yU3VjY2VzcygpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjaGVja0FsbEZlYXR1cmVKYXJzKFN0cmluZyB1cmwsIFN0cmluZ1tdIGphck5hbWVzKSB7Ci0JCUZpbGUgZmVhdHVyZXNEaXIgPSBuZXcgRmlsZSh1cmwgKyAiL2ZlYXR1cmVzIik7Ci0JCWFzc2VydFRydWUoZmVhdHVyZXNEaXIuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKGZlYXR1cmVzRGlyLmlzRGlyZWN0b3J5KCkpOwotCQlTdHJpbmdbXSBsaXN0ID0gZmVhdHVyZXNEaXIubGlzdCgpOwotCi0JCUFycmF5TGlzdCBscyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlscy5hZGQobGlzdFtpXSk7Ci0JCX0KLQotCQlmb3IgKGludCBqID0gMDsgaiA8IGphck5hbWVzLmxlbmd0aDsgaisrKSB7Ci0JCQlhc3NlcnRUcnVlKGxzLmNvbnRhaW5zKGphck5hbWVzW2pdKSk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hlY2tBbGxQbHVnaW5KYXJzKFN0cmluZyB1cmwsIFN0cmluZ1tdIGphck5hbWVzKSB7Ci0JCUZpbGUgcGx1Z2luc0RpciA9IG5ldyBGaWxlKHVybCArICIvcGx1Z2lucyIpOwotCQlhc3NlcnRUcnVlKHBsdWdpbnNEaXIuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKHBsdWdpbnNEaXIuaXNEaXJlY3RvcnkoKSk7Ci0JCVN0cmluZ1tdIGxpc3QgPSBwbHVnaW5zRGlyLmxpc3QoKTsKLQotCQlBcnJheUxpc3QgbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotCQkJbHMuYWRkKGxpc3RbaV0pOwotCQl9Ci0KLQkJZm9yIChpbnQgaiA9IDA7IGogPCBqYXJOYW1lcy5sZW5ndGg7IGorKykgewotCQkJYXNzZXJ0VHJ1ZShscy5jb250YWlucyhqYXJOYW1lc1tqXSkpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoZWNrRmVhdHVyZUNhdGVnb3JpZXNDb250YWluZWQoRmVhdHVyZUNhdGVnb3J5W10gcmVxdWlyZWQsRmVhdHVyZUNhdGVnb3J5W10gbG9jYWxEZWZzKXsKLQkJYm9vbGVhbiBoYXNNYXRjaDsKLQkJZm9yIChpbnQgaSA9IDAgOyBpPHJlcXVpcmVkLmxlbmd0aDsgaSsrKXsKLQkJCWhhc01hdGNoID0gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gMDsgajxsb2NhbERlZnMubGVuZ3RoOyBqKyspewotCQkJCWlmIChsb2NhbERlZnNbal0uZ2V0RmVhdHVyZUlEKCkuZXF1YWxzKHJlcXVpcmVkW2ldLmdldEZlYXR1cmVJRCgpKSAmJgotCQkJCQljaGVja0NhdGVnb3JpZXNNYXRjaChsb2NhbERlZnNbal0uZ2V0Q2F0ZWdvcmllcygpLCByZXF1aXJlZFtpXS5nZXRDYXRlZ29yaWVzKCkpKXsKLQkJCQkJCWhhc01hdGNoID0gdHJ1ZTsKLQkJCQkJCWo9bG9jYWxEZWZzLmxlbmd0aDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWhhc01hdGNoKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2hlY2tDYXRlZ29yaWVzTWF0Y2goU3RyaW5nW10gbG9jYWxDYXQsIFN0cmluZ1tdIHJlbW90ZUNhdCl7Ci0JCWJvb2xlYW4gaGFzTWF0Y2g7Ci0JCWZvciAoaW50IGkgPSAwOyBpPGxvY2FsQ2F0Lmxlbmd0aDsgaSsrKXsKLQkJCWhhc01hdGNoID0gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gMDsgajxyZW1vdGVDYXQubGVuZ3RoOyBpKyspewotCQkJCWlmIChsb2NhbENhdFtpXS5lcXVhbHMocmVtb3RlQ2F0W2pdKSl7Ci0JCQkJCWhhc01hdGNoID0gdHJ1ZTsKLQkJCQkJaj1yZW1vdGVDYXQubGVuZ3RoOwotCQkJCX0KLQkJCX0KLQkJCWlmKCFoYXNNYXRjaCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvVGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbWlycm9yL1Rlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlZGQ2OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvVGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5taXJyb3I7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVUZXN0c1BsdWdpbjsKLQotcHVibGljIGNsYXNzIFRlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IgZXh0ZW5kcyBNaXJyb3JNYW5hZ2VyVGVzdENhc2UgewotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNNaXJyb3JlZDsKLQotCXB1YmxpYyBUZXN0UmVtb3RlRW1iZWRkZWRGZWF0dXJlTWlycm9yKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCQllcnJPdXRwdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlzTWlycm9yZWQgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bVNldFVwKCkgewotCQlTdHJpbmcgZmVhdHVyZUlkID0gInVwZGF0ZS5mZWF0dXJlMWMiOwotCQlTdHJpbmcgdmVyc2lvbiA9ICIzLjAuMCI7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRW1iZWRkZWRGZWF0dXJlTWlycm9yIjsKLQkJU3RyaW5nIG1pcnJvclVSTCA9ICJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL215LW1pcnJvci11cmwiOwotCQlTdHJpbmcgZnJvbVJlbW90ZVNpdGVVcmwgPQotCQkJCSJmaWxlOiIKLQkJCQkrIGRhdGFQYXRoCi0JCQkJKyAibWlycm9ycy91cGRhdGUtc2l0ZTQiOwotCQlpZiAoIWlzTWlycm9yZWQpIHsKLQkJCWV4aXRWYWx1ZSA9Ci0JCQkJcGVyZm9ybU1pcnJvcigKLQkJCQkJZ2V0Q29tbWFuZChmcm9tUmVtb3RlU2l0ZVVybCx0b0xvY2FsU2l0ZVVybCwgZmVhdHVyZUlkLCB2ZXJzaW9uLCBtaXJyb3JVUkwpKTsKLQkJCWlzTWlycm9yZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JLy8gZW5zdXJlIGV4aXQgd2l0aG91dCBwcm9ibGVtcwotCXB1YmxpYyB2b2lkIHRlc3RFeGl0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVzdEV4aXRWYWx1ZSgpOwotCX0KLQotCS8vIGVuc3VyZSBhbGwgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgZXhpc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q2F0ZWdvcnlEZWZpbml0aW9uc0V4aXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRW1iZWRkZWRGZWF0dXJlTWlycm9yIjsKLQkJYXNzZXJ0VHJ1ZShkb2VzQ2F0ZWdvcnlEZWZpbml0aW9uRXhpc3QodG9Mb2NhbFNpdGVVcmwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZUluU2l0ZVhNTEV4aXN0cygpIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQlTdHJpbmcgZmVhdHVyZUlkID0gInVwZGF0ZS5mZWF0dXJlMWMiOwotCQlTdHJpbmcgdmVyc2lvbiA9ICIzLjAuMCI7Ci0JCWFzc2VydFRydWUoCi0JCQljaGVja0ZlYXR1cmVJblNpdGVYTUxFeGlzdHModG9Mb2NhbFNpdGVVcmwsIGZlYXR1cmVJZCwgdmVyc2lvbikpOwotCX0KLQotCS8vIGVuc3VyZSBzaXRlLnhtbCBpcyBnZW5lcmF0ZWQKLQlwdWJsaWMgdm9pZCB0ZXN0U2l0ZVhNTEV4aXN0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCWNoZWNrU2l0ZVhNTCh0b0xvY2FsU2l0ZVVybCk7Ci0JfQotCi0JLy8gZW5zdXJlIHBvbGljeS54bWwgaXMgZ2VuZXJhdGVkCi0JcHVibGljIHZvaWQgdGVzdFBvbGljeVhNTEV4aXN0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCWNoZWNrUG9saWN5WE1MKHRvTG9jYWxTaXRlVXJsKTsKLQl9Ci0KLQkvLyBlbnN1cmUgcG9saWN5LnhtbCB1c2VzIHRoZSBjb3JyZWN0IG1pcnJvclVSTAotCXB1YmxpYyB2b2lkIHRlc3RQb2xpY3lVUkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQlTdHJpbmcgbWlycm9yVVJMID0gImh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvbXktbWlycm9yLXVybCI7Ci0JCWFzc2VydFRydWUoY2hlY2tQb2xpY3lVUkwodG9Mb2NhbFNpdGVVcmwsIG1pcnJvclVSTCkpOwotCX0KLQotCS8vIGVuc3VyZSBhbGwgamFycyBpbiBmZWF0dXJlcyBkaXJlY3RvcnkgbWlycm9yZWQKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsRmVhdHVyZUphcnNFeGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCVN0cmluZ1tdIGZlYXR1cmVKYXJzID0geyAidXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphciIsICJ1cGRhdGUuZmVhdHVyZTFfMS4wLjEuamFyIiwgInVwZGF0ZS5mZWF0dXJlMWJfMi4wLjAuamFyIiwgInVwZGF0ZS5mZWF0dXJlMWNfMy4wLjAuamFyIiB9OwotCQlhc3NlcnRUcnVlKGNoZWNrQWxsRmVhdHVyZUphcnModG9Mb2NhbFNpdGVVcmwsIGZlYXR1cmVKYXJzKSk7Ci0JfQotCi0JLy8gZW5zdXJlIGFsbCBqYXJzIGluIHBsdWdpbnMgZGlyZWN0b3J5IG1pcnJvcmVkCi0JcHVibGljIHZvaWQgdGVzdEFsbFBsdWdpbkphcnNFeGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCVN0cmluZ1tdIHBsdWdpbkphcnMgPQotCQkJeyAiY29tLnBsdWdpbjFfMS4wLjAuamFyIiwgImNvbS5wbHVnaW4xYV8xLjAuMS5qYXIiIH07Ci0JCWFzc2VydFRydWUoY2hlY2tBbGxQbHVnaW5KYXJzKHRvTG9jYWxTaXRlVXJsLCBwbHVnaW5KYXJzKSk7Ci0JfQotCi0JLy8gZW5zdXJlIG91dHB1dCBzdHJpbmcgYnVmZmVyIGVuZHMgd2l0aCAiTWlycm9yIGNvbW1hbmQgY29tcGxldGVkCi0JLy8gc3VjY2Vzc2Z1bGx5LiIKLQkvLyBub3RlOiBvdXRwdXQgbWF5IGluc3RlYWQgYnkgIkNvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4iCi0JcHVibGljIHZvaWQgdGVzdE1pcnJvclN1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVzdE1pcnJvclN1Y2Nlc3MoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja0FsbEZlYXR1cmVKYXJzKFN0cmluZyB1cmwsIFN0cmluZ1tdIGphck5hbWVzKSB7Ci0JCUZpbGUgZmVhdHVyZXNEaXIgPSBuZXcgRmlsZSh1cmwgKyAiL2ZlYXR1cmVzIik7Ci0JCWFzc2VydFRydWUoZmVhdHVyZXNEaXIuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKGZlYXR1cmVzRGlyLmlzRGlyZWN0b3J5KCkpOwotCQlTdHJpbmdbXSBsaXN0ID0gZmVhdHVyZXNEaXIubGlzdCgpOwotCi0JCUFycmF5TGlzdCBscyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlscy5hZGQobGlzdFtpXSk7Ci0JCX0KLQotCQlhc3NlcnRFcXVhbHMobGlzdC5sZW5ndGgsIGphck5hbWVzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgamFyTmFtZXMubGVuZ3RoOyBqKyspIHsKLQkJCWFzc2VydFRydWUobHMuY29udGFpbnMoamFyTmFtZXNbal0pKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja0FsbFBsdWdpbkphcnMoU3RyaW5nIHVybCwgU3RyaW5nW10gamFyTmFtZXMpIHsKLQkJRmlsZSBwbHVnaW5zRGlyID0gbmV3IEZpbGUodXJsICsgIi9wbHVnaW5zIik7Ci0JCWFzc2VydFRydWUocGx1Z2luc0Rpci5leGlzdHMoKSk7Ci0JCWFzc2VydFRydWUocGx1Z2luc0Rpci5pc0RpcmVjdG9yeSgpKTsKLQkJU3RyaW5nW10gbGlzdCA9IHBsdWdpbnNEaXIubGlzdCgpOwotCi0JCUFycmF5TGlzdCBscyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlscy5hZGQobGlzdFtpXSk7Ci0JCX0KLQotCQlhc3NlcnRFcXVhbHMobGlzdC5sZW5ndGgsIGphck5hbWVzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgamFyTmFtZXMubGVuZ3RoOyBqKyspIHsKLQkJCWFzc2VydFRydWUobHMuY29udGFpbnMoamFyTmFtZXNbal0pKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja0NhdGVnb3J5RGVmaW5pdGlvbnNDb250YWluZWQoQ2F0ZWdvcnlEZWZpbml0aW9uW10gbG9jYWxEZWZzLCBDYXRlZ29yeURlZmluaXRpb25bXSByZW1vdGVEZWZzKXsKLQkJYm9vbGVhbiBoYXNNYXRjaDsKLQkJZm9yIChpbnQgaSA9IDAgOyBpPGxvY2FsRGVmcy5sZW5ndGg7IGkrKyl7Ci0JCQloYXNNYXRjaCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDA7IGo8cmVtb3RlRGVmcy5sZW5ndGg7IGorKyl7Ci0JCQkJaWYgKGxvY2FsRGVmc1tpXS5nZXROYW1lKCkuZXF1YWxzKHJlbW90ZURlZnNbal0uZ2V0TmFtZSgpKQotCQkJCQkJJiYgbG9jYWxEZWZzW2ldLmdldERlc2MoKS5lcXVhbHMocmVtb3RlRGVmc1tqXS5nZXREZXNjKCkpKQotCQkJCQloYXNNYXRjaCA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAoIWhhc01hdGNoKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0KLQotCS8vIHN0YXJ0IHRlc3RpbmcgY2F0ZWdvcnkgZGVmaW5pdGlvbnMKLQlwdWJsaWMgdm9pZCB0ZXN0Q2F0ZWdvcnlEZWZpbml0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCVN0cmluZyBmcm9tUmVtb3RlU2l0ZVVybCA9Ci0JCSAgICAgICAgZGF0YVBhdGgKLQkJCQkrICJtaXJyb3JzL3VwZGF0ZS1zaXRlNCI7Ci0JCUNhdGVnb3J5RGVmaW5pdGlvbltdIGxvY2FsRGVmcyA9IGdldENhdGVnb3J5RGVmaW5pdGlvbnModG9Mb2NhbFNpdGVVcmwpOwotCQlDYXRlZ29yeURlZmluaXRpb25bXSByZW1vdGVEZWZzID0gZ2V0Q2F0ZWdvcnlEZWZpbml0aW9ucyhmcm9tUmVtb3RlU2l0ZVVybCk7Ci0JCWFzc2VydFRydWUoY2hlY2tDYXRlZ29yeURlZmluaXRpb25zQ29udGFpbmVkKGxvY2FsRGVmcywgcmVtb3RlRGVmcykpOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21pcnJvci9UZXN0UmVtb3RlRmVhdHVyZVZlcnNpb25NaXJyb3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21pcnJvci9UZXN0UmVtb3RlRmVhdHVyZVZlcnNpb25NaXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJjY2IwYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvVGVzdFJlbW90ZUZlYXR1cmVWZXJzaW9uTWlycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLm1pcnJvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVUZXN0c1BsdWdpbjsKLQotcHVibGljIGNsYXNzIFRlc3RSZW1vdGVGZWF0dXJlVmVyc2lvbk1pcnJvciBleHRlbmRzIE1pcnJvck1hbmFnZXJUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc01pcnJvcmVkOwotCQotCXB1YmxpYyBUZXN0UmVtb3RlRmVhdHVyZVZlcnNpb25NaXJyb3IoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JCWVyck91dHB1dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaXNNaXJyb3JlZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHVtU2V0VXAoKSB7Ci0JCVN0cmluZyBmZWF0dXJlSWQgPSAidXBkYXRlLmZlYXR1cmUxIjsKLQkJU3RyaW5nIHZlcnNpb24gPSAiMS4wLjAiOwotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUZlYXR1cmVWZXJzaW9uTWlycm9yIjsKLQkJU3RyaW5nIG1pcnJvclVSTCA9ICJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL215LW1pcnJvci11cmwiOwotCQlTdHJpbmcgZnJvbVJlbW90ZVNpdGVVcmwgPSAiZmlsZToiICsgZGF0YVBhdGggKyAibWlycm9ycy91cGRhdGUtc2l0ZTEiOwotCQlpZiAoIWlzTWlycm9yZWQpIHsKLQkJCWV4aXRWYWx1ZSA9Ci0JCQkJcGVyZm9ybU1pcnJvcigKLQkJCQkJZ2V0Q29tbWFuZChmcm9tUmVtb3RlU2l0ZVVybCx0b0xvY2FsU2l0ZVVybCwgZmVhdHVyZUlkLCB2ZXJzaW9uLCBtaXJyb3JVUkwpKTsKLQkJCWlzTWlycm9yZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JLy8gZW5zdXJlIGV4aXQgd2l0aG91dCBwcm9ibGVtcwotCXB1YmxpYyB2b2lkIHRlc3RFeGl0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVzdEV4aXRWYWx1ZSgpOwotCX0KLQotCS8vIGVuc3VyZSBhbGwgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgZXhpc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q2F0ZWdvcnlEZWZpbml0aW9uc0V4aXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRmVhdHVyZVZlcnNpb25NaXJyb3IiOwotCQlhc3NlcnRUcnVlKGRvZXNDYXRlZ29yeURlZmluaXRpb25FeGlzdCh0b0xvY2FsU2l0ZVVybCkpOwotCX0KLQotCS8vIGVuc3VyZSBmZWF0dXJlIGV4aXN0cyBwZXIgc2l0ZS54bWwKLQlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZUluU2l0ZVhNTEV4aXN0cygpewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUZlYXR1cmVWZXJzaW9uTWlycm9yIjsKLQkJU3RyaW5nIGZlYXR1cmVJZCA9ICJ1cGRhdGUuZmVhdHVyZTEiOwotCQlTdHJpbmcgdmVyc2lvbiA9ICIxLjAuMCI7Ci0JCWFzc2VydFRydWUoY2hlY2tGZWF0dXJlSW5TaXRlWE1MRXhpc3RzKHRvTG9jYWxTaXRlVXJsLCBmZWF0dXJlSWQsIHZlcnNpb24pKTsKLQl9Ci0JCi0JLy8gZW5zdXJlIHNpdGUueG1sIGlzIGdlbmVyYXRlZAotCXB1YmxpYyB2b2lkIHRlc3RTaXRlWE1MRXhpc3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRmVhdHVyZVZlcnNpb25NaXJyb3IiOwotCQljaGVja1NpdGVYTUwodG9Mb2NhbFNpdGVVcmwpOwotCX0KLQotCS8vIGVuc3VyZSBwb2xpY3kueG1sIGlzIGdlbmVyYXRlZAotCXB1YmxpYyB2b2lkIHRlc3RQb2xpY3lYTUxFeGlzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVGZWF0dXJlVmVyc2lvbk1pcnJvciI7Ci0JCWNoZWNrUG9saWN5WE1MKHRvTG9jYWxTaXRlVXJsKTsKLQl9Ci0JCi0JLy8gZW5zdXJlIHBvbGljeS54bWwgdXNlcyB0aGUgY29ycmVjdCBtaXJyb3JVUkwKLQlwdWJsaWMgdm9pZCB0ZXN0UG9saWN5VVJMKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVGZWF0dXJlVmVyc2lvbk1pcnJvciI7Ci0JCVN0cmluZyBtaXJyb3JVUkwgPSAiaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy9teS1taXJyb3ItdXJsIjsKLQkJYXNzZXJ0VHJ1ZShjaGVja1BvbGljeVVSTCh0b0xvY2FsU2l0ZVVybCwgbWlycm9yVVJMKSk7Ci0JfQotCi0JLy8gZW5zdXJlIGFsbCBqYXJzIGZvciBmZWF0dXJlcyBhbmQgcGx1Z2lucyBtaXJyb3JlZAotCXB1YmxpYyB2b2lkIHRlc3RBbGxKYXJzRXhpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVGZWF0dXJlVmVyc2lvbk1pcnJvciI7Ci0JCVN0cmluZyBmZWF0dXJlSWQgPSAidXBkYXRlLmZlYXR1cmUxIjsKLQkJU3RyaW5nIHZlcnNpb24gPSAiMS4wLjAiOwotCQlTdHJpbmcgamFyTmFtZSA9IGZlYXR1cmVJZCArICJfIiArIHZlcnNpb24gKyAiLmphciI7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRvTG9jYWxTaXRlVXJsICsgIi9mZWF0dXJlcy8iICsgamFyTmFtZSk7Ci0JCWFzc2VydFRydWUoZmlsZS5leGlzdHMoKSk7Ci0JfQotCi0JLy8gZW5zdXJlIG91dHB1dCBzdHJpbmcgYnVmZmVyIGVuZHMgd2l0aCAiTWlycm9yIGNvbW1hbmQgY29tcGxldGVkCi0JLy8gc3VjY2Vzc2Z1bGx5LiIKLQkvLyBub3RlOiBvdXRwdXQgbWF5IGluc3RlYWQgYnkgIkNvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4iCi0JcHVibGljIHZvaWQgdGVzdE1pcnJvclN1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVzdE1pcnJvclN1Y2Nlc3MoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL0FsbE1vZGVsVGVzdHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL0FsbE1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxMGVmNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9BbGxNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLm1vZGVsOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIEFQSSB0ZXN0cwotICovCi1wdWJsaWMgY2xhc3MgQWxsTW9kZWxUZXN0cyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQWxsTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogTGlzdCBvZiBBUEkgdGVzdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5zZXROYW1lKCJNb2RlbCBUZXN0cyIpOwotCi0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShGZWF0dXJlTWFpbi5jbGFzcykpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoU2l0ZU1haW4uY2xhc3MpKTsJCQotCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9TaXRlTWFpbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvU2l0ZU1haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM4YjM3Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9TaXRlTWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBTaXRlTWFpbiBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIFNpdGVNYWluKFN0cmluZyBuYW1lKXsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1haW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCVN0cmluZ1dyaXRlciBzdHJXcml0ZXI9bmV3IFN0cmluZ1dyaXRlcigpOwotCQlQcmludFdyaXRlciB3ID0gbmV3IFByaW50V3JpdGVyKHN0cldyaXRlcik7Ci0KLQkJcHJvY2Vzcygic2l0ZV9vbGRfZm9ybWF0LnhtbCIsdyk7Ci0JCXByb2Nlc3MoInNpdGUueG1sIix3KTsKLQkJdHJ5IHsKLQkJCXByb2Nlc3MoInNpdGVfd2l0aF90eXBlLnhtbCIsdyk7Ci0JCQlmYWlsKCJJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24gbm90IHRocm93biIpOwotCQl9IGNhdGNoIChJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKGUuZ2V0TmV3VHlwZSgpLCJzb21lLm90aGVyLnNpdGUudHlwZSIpOwotCQl9IGZpbmFsbHkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHN0cldyaXRlcik7Ci0JCQl3LmNsb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzKFN0cmluZyB4bWwsIFByaW50V3JpdGVyIHcpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJU2l0ZU1vZGVsRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFNpdGVNb2RlbEZhY3RvcnkoKTsKLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQlTaXRlTW9kZWwgc2l0ZSA9IG51bGw7Ci0JCQotCQl3LnByaW50bG4oIiIpOwotCQl3LnByaW50bG4oIlBhcnNpbmcgc2l0ZSBtYXAgLi4uIik7Ci0JCXRyeSB7Ci0JCQlpcyA9IFNpdGVNYWluLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oeG1sKTsJCQotCQkJc2l0ZSA9IGZhY3RvcnkucGFyc2VTaXRlKGlzKTsKLQkJfSAgZmluYWxseSB7Ci0JCQlpZiAoaXMgIT0gbnVsbCkgewotCQkJCXRyeSB7IGlzLmNsb3NlKCk7fSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7fQotCQkJfQotCQl9Ci0JCQotCQlpZiAoc2l0ZSA9PSBudWxsKSByZXR1cm47Ci0JCQotCQlTdHJpbmcgYmFzZSA9ICJodHRwOi8vYW5vdGhlci5zZXJ2ZXIvc2l0ZS54bWwiOwotCQl3LnByaW50bG4oIlJlc29sdmluZyBzaXRlIHVzaW5nICIrYmFzZSsiIC4uLiIpOwotCQlzaXRlLnJlc29sdmUobmV3IFVSTChiYXNlKSwgbnVsbCk7Ci0JCQotCQl3LnByaW50bG4oIldyaXRpbmcgc2l0ZSAuLi4iKTsKLQkJd3JpdGVTaXRlKHcsMCxzaXRlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVNpdGUoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBTaXRlTW9kZWwgc2l0ZSkgewotCQlpZiAoc2l0ZSA9PSBudWxsKSByZXR1cm47Ci0JCQotCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOwotCQl3LnByaW50bG4oaW4rIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIpOwotCQkKLQkJdy5wcmludGxuKGluKyI8c2l0ZSIpOwotCQl3LnByaW50bG4oaW4rIiAgICIrInR5cGU9XCIiK3NpdGUuZ2V0VHlwZSgpKyJcIiIpOwotCQl3LnByaW50bG4oaW4rIiAgICIrIj4iKTsKLQkJCi0JCXdyaXRlRGVzY3JpcHRpb24odywgbGV2ZWwrMSwgc2l0ZS5nZXREZXNjcmlwdGlvbk1vZGVsKCkpOwotCQl3cml0ZUZlYXR1cmVzKHcsIGxldmVsKzEsIHNpdGUpOwotCQl3cml0ZUFyY2hpdmVzKHcsIGxldmVsKzEsIHNpdGUpOwotCQl3cml0ZUNhdGVnb3J5RGVmcyh3LCBsZXZlbCsxLCBzaXRlKTsKLSAgICAgICAgIAotICAgICAgICB3LnByaW50bG4oaW4rIjwvZmVhdHVyZT4iKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZURlc2NyaXB0aW9uKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgVVJMRW50cnlNb2RlbCB1ZSkgewotCQlpZiAodWUgPT0gbnVsbCkgcmV0dXJuOwotCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOwotCQl3LnByaW50bG4oIiIpOwotCQl3LnByaW50bG4oaW4rIjxkZXNjcmlwdGlvbiB1cmw9XCIiK3VlLmdldFVSTFN0cmluZygpKyJcIiAtPiAiK3VlLmdldFVSTCgpKyI+Iik7Ci0JCXcucHJpbnRsbihpbit1ZS5nZXRBbm5vdGF0aW9uKCkpOwotCQl3LnByaW50bG4oaW4rIjwvZGVzY3JpcHRpb24+Iik7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVGZWF0dXJlcyhQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIFNpdGVNb2RlbCBzaXRlKSB7Ci0JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7Ci0JCWdldEluZGVudChsZXZlbCsxKTsKLQkJdy5wcmludGxuKCIiKTsKLQkJCi0JCVNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBmZWF0dXJlcyA9IHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOwotCQlmb3IgKGludCBpPTA7IGk8ZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCXcucHJpbnRsbihpbisiPGZlYXR1cmUiKTsKLQkJCXcucHJpbnRsbihpbisiICAgIisidHlwZT1cIiIrZmVhdHVyZXNbaV0uZ2V0VHlwZSgpKyJcIiIpOwotCQkJdy5wcmludGxuKGluKyIgICAiKyJ1cmw9XCIiK2ZlYXR1cmVzW2ldLmdldFVSTFN0cmluZygpKyJcIiAtPiAiK2ZlYXR1cmVzW2ldLmdldFVSTCgpKTsKLQkJCXcucHJpbnRsbihpbisiICAgIisiPiIpOwotCQkJd3JpdGVDYXRlZ29yaWVzKHcsIGxldmVsKzEsIGZlYXR1cmVzW2ldKTsKLQkJCXcucHJpbnRsbihpbisiPC9mZWF0dXJlPiIpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVBcmNoaXZlcyhQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIFNpdGVNb2RlbCBzaXRlKSB7Ci0JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7Ci0JCXcucHJpbnRsbigiIik7Ci0JCQotCQlBcmNoaXZlUmVmZXJlbmNlTW9kZWxbXSBhcmNoaXZlID0gc2l0ZS5nZXRBcmNoaXZlUmVmZXJlbmNlTW9kZWxzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxhcmNoaXZlLmxlbmd0aDsgaSsrKSB7Ci0JCQl3LnByaW50bG4oaW4rIjxhcmNoaXZlIik7Ci0JCQl3LnByaW50bG4oaW4rIiAgICIrInBhdGg9XCIiK2FyY2hpdmVbaV0uZ2V0UGF0aCgpKyJcIiIpOwotCQkJdy5wcmludGxuKGluKyIgICAiKyJ1cmw9XCIiK2FyY2hpdmVbaV0uZ2V0VVJMU3RyaW5nKCkrIlwiIC0+ICIrYXJjaGl2ZVtpXS5nZXRVUkwoKSk7Ci0JCQl3LnByaW50bG4oaW4rIiAgICIrIi8+Iik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZUNhdGVnb3J5RGVmcyhQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIFNpdGVNb2RlbCBzaXRlKSB7Ci0JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7Ci0JCWdldEluZGVudChsZXZlbCsxKTsKLQkJdy5wcmludGxuKCIiKTsKLQkJCi0JCUNhdGVnb3J5TW9kZWxbXSBjYXQgPSBzaXRlLmdldENhdGVnb3J5TW9kZWxzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxjYXQubGVuZ3RoOyBpKyspIHsKLQkJCXcucHJpbnRsbihpbisiPGNhdGVnb3J5LWRlZiIpOwotCQkJdy5wcmludGxuKGluKyIgICAiKyJuYW1lPVwiIitjYXRbaV0uZ2V0TmFtZSgpKyJcIiIpOwotCQkJdy5wcmludGxuKGluKyIgICAiKyJsYWJlbD1cIiIrY2F0W2ldLmdldExhYmVsKCkrIlwiIik7Ci0JCQl3LnByaW50bG4oaW4rIiAgICIrIj4iKTsKLQkJCXdyaXRlRGVzY3JpcHRpb24odywgbGV2ZWwrMSwgY2F0W2ldLmdldERlc2NyaXB0aW9uTW9kZWwoKSk7Ci0JCQl3LnByaW50bG4oaW4rIjwvY2F0ZWdvcnktZGVmPiIpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVDYXRlZ29yaWVzKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmZWF0dXJlKSB7Ci0JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7Ci0JCVN0cmluZ1tdIGNhdCA9IGZlYXR1cmUuZ2V0Q2F0ZWdvcnlOYW1lcygpOwotCQlmb3IgKGludCBpPTA7IGk8Y2F0Lmxlbmd0aDsgaSsrKSB7Ci0JCQl3LnByaW50bG4oaW4rIjxjYXRlZ29yeSBuYW1lPVwiIitjYXRbaV0rIlwiIik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEluZGVudChpbnQgbGV2ZWwpIHsKLQkJU3RyaW5nIGluZGVudCA9ICIiOwotCQlmb3IgKGludCBpPTA7IGk8bGV2ZWw7IGkrKykgCi0JCQlpbmRlbnQgKz0gIiAgICI7Ci0JCXJldHVybiBpbmRlbnQ7Ci0JfQotfQotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Njc0ODQ1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHNpdGU+Ci0KLSAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cudG9vbHMuY29tL3VwZGF0ZVNpdGUiPgotICAgICAgU2l0ZSBkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGZlYXR1cmUgdHlwZT0ibXkuZmVhdHVyZS50eXBlIiB1cmw9ImZlYXR1cmUxLmphciI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0idG9vbHMiLz4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJ1dGlsaXRpZXMiLz4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJ3aW5kb3dzLnRvb2xzIi8+Ci0gICA8L2ZlYXR1cmU+Ci0gICAKLSAgIDxmZWF0dXJlIHR5cGU9IiIgdXJsPSJmaWxlOi9mZWF0dXJlMi5qYXIiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9InV0aWxpdGllcyIvPgotICAgPC9mZWF0dXJlPgotICAgCi0gICAKLSAgIDxhcmNoaXZlIHBhdGg9ImZpcnN0L2FyY2hpdmUiIHVybD0iYXJjaGl2ZTEuamFyIi8+Ci0gICA8YXJjaGl2ZSBwYXRoPSJzZWNvbmQvYXJjaGl2ZSIgdXJsPSJhcmNoaXZlMi5qYXIiLz4KLSAgIAotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJ0b29scyIgbGFiZWw9IkRldmVsb3BtZW50IFRvb2xzIj4KLSAgICAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cudG9vbHMuY29tL3Rvb2xzIj4KLSAgICAgICAgIFRoaXMgaXMgZGVzY3JpcHRpb24gZm9yIHRvb2xzCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9jYXRlZ29yeS1kZWY+Ci0gICAKLSAgIDxjYXRlZ29yeS1kZWYgbmFtZT0idXRpbGl0aWVzIiBsYWJlbD0iVXRpbGl0aWVzIj4KLSAgICAgIDxkZXNjcmlwdGlvbiB1cmw9InRvb2xzLmh0bWwiLz4vCi0gICA8L2NhdGVnb3J5LWRlZj4KLSAgIAotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJ3aW5kb3dzLnRvb2xzIiBsYWJlbD0iV2luZG93cyBEZXZlbG9wbWVudCBUb29scyIvPgotCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvc2l0ZV9vbGRfZm9ybWF0LnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL3NpdGVfb2xkX2Zvcm1hdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYzljODEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvc2l0ZV9vbGRfZm9ybWF0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTxzaXRlIHVybD0id3d3LnRvb2xzLmNvbS91cGRhdGVTaXRlIj4KLQotICAgPGZlYXR1cmUgdHlwZT0ibXkuZmVhdHVyZS50eXBlIiB1cmw9ImZlYXR1cmUxLmphciI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0idG9vbHMiLz4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJ1dGlsaXRpZXMiLz4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJ3aW5kb3dzLnRvb2xzIi8+Ci0gICA8L2ZlYXR1cmU+Ci0gICAKLSAgIDxmZWF0dXJlIHR5cGU9IiIgdXJsPSJmZWF0dXJlMi5qYXIiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9InV0aWxpdGllcyIvPgotICAgPC9mZWF0dXJlPgotICAKLSAgIDxhcmNoaXZlIHBhdGg9ImZpcnN0L2FyY2hpdmUiIHVybD0iYXJjaGl2ZTEuamFyIi8+Ci0gICA8YXJjaGl2ZSBwYXRoPSJzZWNvbmQvYXJjaGl2ZSIgdXJsPSJhcmNoaXZlMi5qYXIiLz4KLSAgIAotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJ0b29scyIgbGFiZWw9IkRldmVsb3BtZW50IFRvb2xzIj4KLSAgICAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cudG9vbHMuY29tL3Rvb2xzIj4KLSAgICAgICAgIFRoaXMgaXMgZGVzY3JpcHRpb24gZm9yIHRvb2xzCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9jYXRlZ29yeS1kZWY+Ci0gICAKLSAgIDxjYXRlZ29yeS1kZWYgbmFtZT0idXRpbGl0aWVzIiBsYWJlbD0iVXRpbGl0aWVzIj4KLSAgICAgIDxkZXNjcmlwdGlvbiB1cmw9InV0aWxpdGllcy5odG1sIi8+Ci0gICA8L2NhdGVnb3J5LWRlZj4KLSAgIAotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJ3aW5kb3dzLnRvb2xzIiBsYWJlbD0iV2luZG93cyBEZXZlbG9wbWVudCBUb29scyIvPgotCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvc2l0ZV93aXRoX3R5cGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvc2l0ZV93aXRoX3R5cGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTliNGY3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL3NpdGVfd2l0aF90eXBlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHNpdGUgdXJsPSJodHRwOi8vd3d3LnRvb2xzLmNvbS91cGRhdGVTaXRlIiB0eXBlPSJzb21lLm90aGVyLnNpdGUudHlwZSI+Ci0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9uYXRpdmVUZXN0cy9UZXN0TG9jYWxTeXN0ZW1JbmZvLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9uYXRpdmVUZXN0cy9UZXN0TG9jYWxTeXN0ZW1JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MDYzNWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbmF0aXZlVGVzdHMvVGVzdExvY2FsU3lzdGVtSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5uYXRpdmVUZXN0czsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JVm9sdW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLkxvY2FsU3lzdGVtSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgVGVzdExvY2FsU3lzdGVtSW5mbyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBUZXN0IHRoZSBuYXRpdmVzCi0JICovCi0JcHVibGljIFRlc3RMb2NhbFN5c3RlbUluZm8oU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5hdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQotCQkvLyBtb3VudCBwb2ludAotICAgICAgIElWb2x1bWVbXSBhID0gTG9jYWxTeXN0ZW1JbmZvLmdldFZvbHVtZXMoKTsKLSAgICAgICAgaWYgKGE9PW51bGwpIHRocm93IG5ldyBFeGNlcHRpb24oImNhbm5vdCBmaW5kIG5hdGl2ZSBsaWJyYXJ5Iik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQgIithLmxlbmd0aCsiIG1vdW50IHBvaW50cy4iKTsKLQkJZm9yIChpbnQgaSA9MDsgaTxhLmxlbmd0aDtpKyspewotCQkJU3lzdGVtLm91dC5wcmludCgiIyIraSsiIC0gIithW2ldKTsKLQkJCQotCQkJRmlsZSByb290ID0gYVtpXS5nZXRGaWxlKCk7Ci0JCQlTdHJpbmcgbGFiZWwgPSBhW2ldLmdldExhYmVsKCk7Ci0JCQlpZiAobGFiZWw9PW51bGwpIGxhYmVsPSJOTyBMQUJFTCI7Ci0JCQlpbnQgdHlwZSA9IGFbaV0uZ2V0VHlwZSgpOwotCQkJbG9uZyBzaXplID0gTG9jYWxTeXN0ZW1JbmZvLmdldEZyZWVTcGFjZShyb290KTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIC0+OiIrbGFiZWwrIjoiK2dldFR5cGUodHlwZSkrIjoiK2dldFNpemUoc2l6ZSkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFR5cGUoaW50IHR5cGUpewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgTG9jYWxTeXN0ZW1JbmZvLlZPTFVNRV9GSVhFRCA6Ci0JCQkJcmV0dXJuICJWT0xVTUUgRklYRUQiOwotCQkJY2FzZSBMb2NhbFN5c3RlbUluZm8uVk9MVU1FX1JFTU9URSA6Ci0JCQkJcmV0dXJuICJWT0xVTUUgUkVNT1RFIjsKLQkJCWNhc2UgTG9jYWxTeXN0ZW1JbmZvLlZPTFVNRV9SRU1PVkFCTEUgOgotCQkJCXJldHVybiAiVk9MVU1FIFJFTU9WQUJMRSI7Ci0JCQljYXNlIExvY2FsU3lzdGVtSW5mby5WT0xVTUVfQ0RST00gOgotCQkJCXJldHVybiAiVk9MVU1FIENEUk9NIjsJCQkJCi0JCQljYXNlIExvY2FsU3lzdGVtSW5mby5WT0xVTUVfVU5LTk9XTiA6Ci0JCQkJcmV0dXJuICJWT0xVTUUgVU5LTk9XTiI7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gIldST05HIFZPTFVNRSBJTkZPIjsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRTaXplKGxvbmcgc2l6ZSl7Ci0JCWlmIChzaXplPT1Mb2NhbFN5c3RlbUluZm8uU0laRV9VTktOT1dOKSByZXR1cm4gIlVOS05PV04gU0laRSI7Ci0JCQotCQlsb25nIGtiID0gc2l6ZS8oMTAyNCoxMDI0KTsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoc2l6ZSsiICgiK2tiKyJNQikiKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9uZXN0ZWRmZWF0dXJlcy9BbGxOZXN0ZWRUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbmVzdGVkZmVhdHVyZXMvQWxsTmVzdGVkVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlNmZiNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9uZXN0ZWRmZWF0dXJlcy9BbGxOZXN0ZWRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5uZXN0ZWRmZWF0dXJlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgQWxsTmVzdGVkVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotcHVibGljIEFsbE5lc3RlZFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCXN1aXRlLnNldE5hbWUoIk5lc3RlZCBJbnN0YWxsIFRlc3RzIik7Ci0JCi0JLy8gdGhlIGZvbGxvd2luZyB3aWxsIHRha2UgYWxsIHRlaCB0ZXN0IG1ldGhvZHMgaW4gdGVoIGNsYXNzIHRoYXQgc3RhcnQgd2l0aCAndGVzdCcKLQotCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0SW5zdGFsbC5jbGFzcykpOwotCi0JLy8gb3IgeW91IGNhbiBzcGVjaWZ5IHRoZSBtZXRob2QKLQkvL3N1aXRlLmFkZFRlc3QobmV3IFRlc3RHZXRGZWF0dXJlKCJtZXRob2RUaGF0RG9lc05vdFN0YXJ0V2l0aHRlc3QiKSk7CQotCQotCXJldHVybiBzdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL25lc3RlZGZlYXR1cmVzL1Rlc3RJbnN0YWxsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9uZXN0ZWRmZWF0dXJlcy9UZXN0SW5zdGFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzhmYzdlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL25lc3RlZGZlYXR1cmVzL1Rlc3RJbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5uZXN0ZWRmZWF0dXJlczsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0SW5zdGFsbCBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVGVzdDEKLQkgKi8KLQlwdWJsaWMgVGVzdEluc3RhbGwoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGVTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQkvL2NsZWFudXAgdGFyZ2V0IAotCQlGaWxlIHRhcmdldCA9IG5ldyBGaWxlKFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7CQkKLQkJSW5zdGFsbFJlZ2lzdHJ5LmNsZWFudXAoKTsKLQkJCi0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9Ci0JCQlTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSwgIm5lc3RlZEZlYXR1cmVTaXRlVGVzdC9zaXRlLnhtbCIpLG51bGwpOwotCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpWzBdLmdldEZlYXR1cmUobnVsbCk7Ci0JCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSxudWxsKTsKLQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCwgbnVsbCk7Ci0KLQkJLy8gdmVyaWZ5IHJvb3QgRmVhdHVyZQotCQlTdHJpbmcgc2l0ZSA9IGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCk7Ci0JCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSByZW1vdGVGZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOwotCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOwotCQlhc3NlcnRUcnVlKAotCQkJInBsdWdpbiBmaWxlcyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IiArIHBsdWdpbkZpbGUsCi0JCQlwbHVnaW5GaWxlLmV4aXN0cygpKTsKLQkJRmlsZSBwbHVnaW5YTUxGaWxlID0KLQkJCW5ldyBGaWxlKAotCQkJCXNpdGUsCi0JCQkJU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSArIEZpbGUuc2VwYXJhdG9yICsgInBsdWdpbi54bWwiKTsKLQkJYXNzZXJ0VHJ1ZSgicGx1Z2luLnhtbCBmaWxlIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIHBsdWdpblhNTEZpbGUuZXhpc3RzKCkpOwotCi0JCUZpbGUgZmVhdHVyZUZpbGUgPQotCQkJbmV3IEZpbGUoCi0JCQkJc2l0ZSwKLQkJCQlTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSAotCQkJCQkrIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQlhc3NlcnRUcnVlKAotCQkJImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IiArIGZlYXR1cmVGaWxlLAotCQkJZmVhdHVyZUZpbGUuZXhpc3RzKCkpOwotCi0JCS8vIGNsZWFuIHBsdWdpbnMgJiBmZWF0dXJlCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJcGx1Z2luTmFtZSA9IGVudHJpZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCQlwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7Ci0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0ocGx1Z2luRmlsZSk7Ci0JCQlJbnN0YWxsUmVnaXN0cnkudW5yZWdpc3RlclBsdWdpbihlbnRyaWVzW2ldKTsKLQkJfQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmVhdHVyZUZpbGUpOwotCi0JCS8vIHZlcmlmeSBjaGlsZCBGZWF0dXJlCi0JCUlGZWF0dXJlIGNoaWxkRmVhdHVyZSA9Ci0JCQlyZW1vdGVGZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKVswXS5nZXRGZWF0dXJlKG51bGwpOwotCQllbnRyaWVzID0gY2hpbGRGZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOwotCQlwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQkJcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOwotCQlhc3NlcnRUcnVlKAotCQkJInBsdWdpbiBmaWxlcyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IiArIHBsdWdpbkZpbGUsCi0JCQlwbHVnaW5GaWxlLmV4aXN0cygpKTsKLQkJcGx1Z2luWE1MRmlsZSA9Ci0JCQluZXcgRmlsZSgKLQkJCQlzaXRlLAotCQkJCVNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUgKyBGaWxlLnNlcGFyYXRvciArICJwbHVnaW4ueG1sIik7Ci0JCWFzc2VydFRydWUoInBsdWdpbi54bWwgZmlsZSBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBwbHVnaW5YTUxGaWxlLmV4aXN0cygpKTsKLQotCQlmZWF0dXJlRmlsZSA9Ci0JCQluZXcgRmlsZSgKLQkJCQlzaXRlLAotCQkJCVNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICi0JCQkJCSsgY2hpbGRGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiIgKyBmZWF0dXJlRmlsZSwKLQkJCWZlYXR1cmVGaWxlLmV4aXN0cygpKTsKLQotCQkvLyBjbGVhbiBwbHVnaW5zCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCQlwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7Ci0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0ocGx1Z2luRmlsZSk7Ci0JCX0KLQotCQkvLyBjbGVhbiBmZWF0dXJlcwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmVhdHVyZUZpbGUpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUobG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKSkpOwotCQlJbnN0YWxsUmVnaXN0cnkuY2xlYW51cCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RIVFRQU2l0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUlTaXRlIHJlbW90ZVNpdGUgPQotCQkJU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9IVFRQX1NJVEUsICJuZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvIiksbnVsbCk7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXMgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBudWxsOwotCi0JCWlmIChmZWF0dXJlcyA9PSBudWxsIHx8IGZlYXR1cmVzLmxlbmd0aCA9PSAwKQotCQkJZmFpbCgiTm8gZmVhdHVyZXMgb24gdGhlIHNpdGUiKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmVhdHVyZXNbaV0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKS5lbmRzV2l0aCgicm9vdGZlYXR1cmUuamFyIikpIHsKLQkJCQlyZW1vdGVGZWF0dXJlID0gZmVhdHVyZXNbaV0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWFzc2VydE5vdE51bGwoIkNhbm5vdCBmaW5kIHJvb3RmZWF0dXJlLmphciBvbiBzaXRlIiwgcmVtb3RlRmVhdHVyZSk7Ci0JCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSxudWxsKTsKLQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCwgbnVsbCk7Ci0KLQkJLy8gcm9vdGZlYXR1cmUuamFyIHNob3VsZCBub3QgYmUgaW4gdGhlIGxvY2FsIHNpdGUKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBsb2NhbEZlYXR1cmVzID0gbG9jYWxTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCWlmIChsb2NhbEZlYXR1cmVzID09IG51bGwgfHwgbG9jYWxGZWF0dXJlcy5sZW5ndGggPT0gMCkKLQkJCWZhaWwoIk5vIGZlYXR1cmVzIG9uIHRoZSB0YXJnZXQgc2l0ZSIpOwotCi0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobG9jYWxGZWF0dXJlc1tpXS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpLmVuZHNXaXRoKCJyb290ZmVhdHVyZS5qYXIiKSkgewotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWFzc2VydFRydWUoCi0JCQkiRm91bmQgcm9vdGZlYXR1cmUuamFyIG9uIHRhcmdldCBzaXRlLiBUYXJnZXQgc2l0ZSBmZWF0dXJlIHJlZiBzaG91bGRub3QgY29udGFpbiBKQVIgZmlsZSIsCi0JCQkhZm91bmQpOwotCi0JCS8vIGNoZWNrIHJvb3QKLQkJU3RyaW5nIHNpdGUgPSBsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpOwotCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsKLQotCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOwotCQlhc3NlcnRUcnVlKAotCQkJInBsdWdpbiBmaWxlcyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IiArIHBsdWdpbkZpbGUsCi0JCQlwbHVnaW5GaWxlLmV4aXN0cygpKTsJCQotCQlGaWxlIHBsdWdpblhNTEZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKyBGaWxlLnNlcGFyYXRvciArICJwbHVnaW4ueG1sIik7Ci0JCWFzc2VydFRydWUoCi0JCQkicGx1Z2luIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiIgKyBwbHVnaW5YTUxGaWxlLAotCQkJcGx1Z2luWE1MRmlsZS5leGlzdHMoKSk7Ci0KLQkJRmlsZSBmZWF0dXJlRmlsZSA9Ci0JCQluZXcgRmlsZSgKLQkJCQlzaXRlLAotCQkJCVNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICi0JCQkJCSsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBmZWF0dXJlRmlsZS5leGlzdHMoKSk7Ci0KLQkJLy8gY2xlYW4gcGx1Z2lucyAmIGZlYXR1cmUKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwbHVnaW5OYW1lID0gZW50cmllc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQkJCXBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShwbHVnaW5GaWxlKTsKLQkJCUluc3RhbGxSZWdpc3RyeS51bnJlZ2lzdGVyUGx1Z2luKGVudHJpZXNbaV0pOwotCQl9Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmZWF0dXJlRmlsZSk7Ci0KLQkJLy8gdmVyaWZ5IGNoaWxkIEZlYXR1cmUKLQkJSUZlYXR1cmUgY2hpbGRGZWF0dXJlID0KLQkJCXJlbW90ZUZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpWzBdLmdldEZlYXR1cmUobnVsbCk7Ci0JCWVudHJpZXMgPSBjaGlsZEZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQlhc3NlcnRUcnVlKCJubyBwbHVnaW5zIGVudHJ5IiwgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCAhPSAwKSk7Ci0JCXBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQlwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7Ci0JCWFzc2VydFRydWUoCi0JCQkicGx1Z2luIGZpbGVzIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiICsgcGx1Z2luRmlsZSwKLQkJCXBsdWdpbkZpbGUuZXhpc3RzKCkpOwotCQlwbHVnaW5YTUxGaWxlID0KLQkJCW5ldyBGaWxlKAotCQkJCXNpdGUsCi0JCQkJU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSArIEZpbGUuc2VwYXJhdG9yICsgInBsdWdpbi54bWwiKTsKLQkJYXNzZXJ0VHJ1ZSgicGx1Z2luLnhtbCBmaWxlIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIHBsdWdpblhNTEZpbGUuZXhpc3RzKCkpOwotCi0JCWZlYXR1cmVGaWxlID0KLQkJCW5ldyBGaWxlKAotCQkJCXNpdGUsCi0JCQkJU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgKLQkJCQkJKyBjaGlsZEZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQlhc3NlcnRUcnVlKAotCQkJImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IiArIGZlYXR1cmVGaWxlLAotCQkJZmVhdHVyZUZpbGUuZXhpc3RzKCkpOwotCi0JCS8vIGNsZWFuIHBsdWdpbnMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQkJCXBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShwbHVnaW5GaWxlKTsKLQkJfQotCi0JCS8vIGNsZWFuIGZlYXR1cmVzCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmZWF0dXJlRmlsZSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShuZXcgRmlsZShsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpKSk7Ci0JfQotCi0vLwlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbCgpIHRocm93cyBFeGNlcHRpb24gewotLy8KLS8vCQkvLyBjbGVhbnVwIGxvY2FsIGZpbGVzLi4uCi0vLwkJVVJMIGxvY2FsVVJMID0gKChMb2NhbFNpdGUpIFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpOwotLy8JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUobG9jYWxVUkwuZ2V0RmlsZSgpKTsKLS8vCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsKLS8vCQlJbnN0YWxsUmVnaXN0cnkuY2xlYW51cCgpOwotLy8KLS8vCQlVUkwgSU5TVEFMTF9TSVRFID0gbnVsbDsKLS8vCQl0cnkgewotLy8JCQlJTlNUQUxMX1NJVEUgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsICJuZXN0ZWRGZWF0dXJlU2l0ZVRlc3Qvc2l0ZS54bWwiKTsKLS8vCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8JCQlmYWlsKGUudG9TdHJpbmcoKSk7Ci0vLwkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJfQotLy8KLS8vCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShJTlNUQUxMX1NJVEUsbnVsbCk7Ci0vLwkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcyA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLS8vCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gbnVsbDsKLS8vCi0vLwkJaWYgKGZlYXR1cmVzID09IG51bGwgfHwgZmVhdHVyZXMubGVuZ3RoID09IDApCi0vLwkJCWZhaWwoIk5vIGZlYXR1cmVzIG9uIHRoZSBzaXRlIik7Ci0vLwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLS8vCQkJaWYgKGZlYXR1cmVzW2ldLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkuZW5kc1dpdGgoInJvb3RmZWF0dXJlLmphciIpKSB7Ci0vLwkJCQlyZW1vdGVGZWF0dXJlID0gZmVhdHVyZXNbaV0uZ2V0RmVhdHVyZShudWxsKTsKLS8vCQkJCWJyZWFrOwotLy8JCQl9Ci0vLwkJfQotLy8KLS8vCQlhc3NlcnROb3ROdWxsKCJDYW5ub3QgZmluZCByb290ZmVhdHVyZS5qYXIgb24gc2l0ZSIsIHJlbW90ZUZlYXR1cmUpOwotLy8JCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0vLwkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPQotLy8JCQlsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsKLS8vCi0vLwkJKChDb25maWd1cmVkU2l0ZSlzaXRlKS5zZXRVcGRhdGFibGUodHJ1ZSk7Ci0vLwkJc2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsIG51bGwpOwotLy8KLS8vCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0vLwkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOwotLy8KLS8vCQlTdHJpbmcgc2l0ZVBhdGggPSBzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCk7Ci0vLwkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotLy8JCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGVQYXRoLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKLS8vCQlhc3NlcnRUcnVlKCJwbHVnaW4gaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHkiK3BsdWdpbkZpbGUsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOwotLy8KLS8vCQlGaWxlIGZlYXR1cmVGaWxlID0KLS8vCQkJbmV3IEZpbGUoCi0vLwkJCQlzaXRlUGF0aCwKLS8vCQkJCVNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICi0vLwkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLS8vCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5IiwgZmVhdHVyZUZpbGUuZXhpc3RzKCkpOwotLy8KLS8vCQkvL2NsZWFudXAKLS8vCQlGaWxlIGZpbGUgPQotLy8JCQluZXcgRmlsZSgKLS8vCQkJCXNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKQotLy8JCQkJCSsgRmlsZS5zZXBhcmF0b3IKLS8vCQkJCQkrIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICi0vLwkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7Ci0vLwkJLy8gY2xlYW4gcGx1Z2lucwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotLy8JCQlwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLS8vCQkJcGx1Z2luRmlsZSA9Ci0vLwkJCQluZXcgRmlsZSgKLS8vCQkJCQlzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCksCi0vLwkJCQkJU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7Ci0vLwkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShwbHVnaW5GaWxlKTsKLS8vCQl9Ci0vLwotLy8JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsKLS8vCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0ocGx1Z2luRmlsZSk7Ci0vLwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7Ci0vLwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKAotLy8JCQluZXcgRmlsZSgKLS8vCQkJCSgoSW5zdGFsbENvbmZpZ3VyYXRpb24pIGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpKQotLy8JCQkJCS5nZXRVUkwoKQotLy8JCQkJCS5nZXRGaWxlKCkpKTsKLS8vCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9BbGxQYXJzZXJUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGFyc2VyL0FsbFBhcnNlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NGIyN2QuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGFyc2VyL0FsbFBhcnNlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnBhcnNlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLQotcHVibGljIGNsYXNzIEFsbFBhcnNlclRlc3RzIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLXB1YmxpYyBBbGxQYXJzZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlzdWl0ZS5zZXROYW1lKCJQYXJzaW5nIFRlc3RzIik7Ci0JCi0JLy8gdGhlIGZvbGxvd2luZyB3aWxsIHRha2UgYWxsIHRlaCB0ZXN0IG1ldGhvZHMgaW4gdGVoIGNsYXNzIHRoYXQgc3RhcnQgd2l0aCAndGVzdCcKLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEZlYXR1cmVQYXJzZS5jbGFzcykpOwotCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0U2l0ZVBhcnNlLmNsYXNzKSk7CQotCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0Q2F0ZWdvcmllcy5jbGFzcykpOwkJCi0JCi0JLy8gb3IgeW91IGNhbiBzcGVjaWZ5IHRoZSBtZXRob2QKLQkvL3N1aXRlLmFkZFRlc3QobmV3IFRlc3RHZXRGZWF0dXJlKCJtZXRob2RUaGF0RG9lc05vdFN0YXJ0V2l0aHRlc3QiKSk7CQotCQotCXJldHVybiBzdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9UZXN0Q2F0ZWdvcmllcy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGFyc2VyL1Rlc3RDYXRlZ29yaWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YjhhMTAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGFyc2VyL1Rlc3RDYXRlZ29yaWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnBhcnNlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0Q2F0ZWdvcmllcyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFRlc3QxCi0JICovCi0JcHVibGljIFRlc3RDYXRlZ29yaWVzKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXRlZ29yaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJVVJMIHJlbW90ZVVybCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJ4bWxzL3NpdGUxLyIpOwotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShyZW1vdGVVcmwsbnVsbCk7Ci0KLQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJLy9JQ2F0ZWdvcnlbXSBjYXRlZ29yaWVzID0gcmVtb3RlU2l0ZS5nZXRDYXRlZ29yaWVzKCk7Ci0KLQkJSUNhdGVnb3J5IGZlYXR1cmVDYXRlZ29yeSA9IGZlYXR1cmVbMF0uZ2V0Q2F0ZWdvcmllcygpWzBdOwotCi0JCWFzc2VydEVxdWFscygiVU1MIHRvb2xzIiwgZmVhdHVyZUNhdGVnb3J5LmdldExhYmVsKCkpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9yZGVyZWRDYXRlZ29yaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJVVJMIHJlbW90ZVVybCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJ4bWxzL3NpdGUxLyIpOwotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShyZW1vdGVVcmwsbnVsbCk7Ci0KLQkJSUNhdGVnb3J5W10gY2F0ZWdvcmllcyA9IHJlbW90ZVNpdGUuZ2V0Q2F0ZWdvcmllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhdGVnb3JpZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2F0IG9yZGVyZWQtPiIgKyBjYXRlZ29yaWVzW2ldLmdldE5hbWUoKSk7Ci0JCX0KLQotCQlhc3NlcnRFcXVhbHMoIkVjbGlwc2UgdG9vbHMiLCBjYXRlZ29yaWVzWzFdLmdldExhYmVsKCkpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyYW5zbGF0ZWRDYXRlZ29yaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0hUVFBfU0lURSxudWxsKTsKLQotCQlJQ2F0ZWdvcnlbXSBjYXRlZ29yaWVzID0gcmVtb3RlU2l0ZS5nZXRDYXRlZ29yaWVzKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJSZXF1aXJlZCBEcml2ZXJzIiwgY2F0ZWdvcmllc1swXS5nZXRMYWJlbCgpKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9UZXN0RmVhdHVyZVBhcnNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9wYXJzZXIvVGVzdEZlYXR1cmVQYXJzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjUzN2U0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9UZXN0RmVhdHVyZVBhcnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkRlZmF1bHRGZWF0dXJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkZlYXR1cmVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5VUkxFbnRyeU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFRlc3RGZWF0dXJlUGFyc2UgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFRlc3QxCi0JICovCi0JcHVibGljIFRlc3RGZWF0dXJlUGFyc2UoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJU3RyaW5nIHhtbEZpbGUgPSAieG1scy9mZWF0dXJlXzEuMC4wLyI7Ci0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsIG51bGwpOwotCQlVUkwgdXJsID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChyZW1vdGVTaXRlLmdldFVSTCgpLCB4bWxGaWxlLCBudWxsKTsKLQotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsKLQkJcmVmLnNldFNpdGUocmVtb3RlU2l0ZSk7Ci0JCXJlZi5zZXRVUkwodXJsKTsKLQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCi0JCVN0cmluZyBwcm92ID0gZmVhdHVyZS5nZXRQcm92aWRlcigpOwotCQlhc3NlcnRFcXVhbHMoIk9iamVjdCBUZWNobm9sb2d5IEludGVybmF0aW9uYWwiLCBwcm92KTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVZhbGlkMSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXRyeSB7Ci0JCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL2ZlYXR1cmUxLnhtbCIpOwotCQkJRGVmYXVsdEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRGZWF0dXJlUGFyc2VyKCk7Ci0JCQlwYXJzZXIuaW5pdChuZXcgRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5KCkpOwotCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsKLQkJCUZlYXR1cmVNb2RlbCByZW1vdGVGZWF0dXJlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7Ci0JCQlyZW1vdGVGZWF0dXJlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsKLQotCQl9IGNhdGNoIChTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2hvdWxkIE5PVCBiZSB0aHJvd24iKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVZhbGlkMWJpcygpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXRyeSB7Ci0JCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL2ZlYXR1cmUxYmlzLnhtbCIpOwotCQkJRGVmYXVsdEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRGZWF0dXJlUGFyc2VyKCk7Ci0JCQlwYXJzZXIuaW5pdChuZXcgRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5KCkpOwotCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsKLQkJCUZlYXR1cmVNb2RlbCByZW1vdGVGZWF0dXJlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7Ci0JCQlyZW1vdGVGZWF0dXJlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsKLQotCQl9IGNhdGNoIChTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2hvdWxkIE5PVCBiZSB0aHJvd24iKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVZhbGlkMigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXRyeSB7Ci0JCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL2ZlYXR1cmUyLnhtbCIpOwotCQkJRGVmYXVsdEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRGZWF0dXJlUGFyc2VyKCk7Ci0JCQlwYXJzZXIuaW5pdChuZXcgRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5KCkpOwotCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsKLQkJCUZlYXR1cmVNb2RlbCByZW1vdGVGZWF0dXJlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7Ci0JCQlyZW1vdGVGZWF0dXJlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsKLQotCQl9IGNhdGNoIChTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2hvdWxkIG5vdCBiZSB0aHJvd24iICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJdHJ5IHsKLQkJCVVSTCByZW1vdGVVUkwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAicGFyc2VydGVzdHMvZmVhdHVyZTMueG1sIik7Ci0JCQlEZWZhdWx0RmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdEZlYXR1cmVQYXJzZXIoKTsKLQkJCXBhcnNlci5pbml0KG5ldyBGZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnkoKSk7Ci0JCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOwotCQkJRmVhdHVyZU1vZGVsIHJlbW90ZUZlYXR1cmUgPSBwYXJzZXIucGFyc2UocmVzb2x2ZWRVUkwub3BlblN0cmVhbSgpKTsKLQkJCXJlbW90ZUZlYXR1cmUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOwotCi0JCQlTdHJpbmcgY29weXJpZ2h0U3RyaW5nID0gcmVtb3RlRmVhdHVyZS5nZXRDb3B5cmlnaHRNb2RlbCgpLmdldFVSTCgpLmdldEZpbGUoKTsKLQkJCWJvb2xlYW4gcmVzb2x2ZWQgPSBjb3B5cmlnaHRTdHJpbmcuaW5kZXhPZihTaXRlTWFuYWdlci5nZXRPUygpKSAhPSAtMTsKLQkJCWFzc2VydFRydWUoIkNvcHlyaWdodCBVUkwgbm90IHJlc29sdmVkOiIgKyBjb3B5cmlnaHRTdHJpbmcsIHJlc29sdmVkKTsKLQkJfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXhjZXB0aW9uIHNob3VsZCBub3QgYmUgdGhyb3duIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCS8vIHBhcnNlIHR5cGUKLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQl0cnkgewotCQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9mZWF0dXJlNC54bWwiKTsKLQkJCURlZmF1bHRGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0RmVhdHVyZVBhcnNlcigpOwotCQkJcGFyc2VyLmluaXQobmV3IEZlYXR1cmVFeGVjdXRhYmxlRmFjdG9yeSgpKTsKLQkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHJlbW90ZVVSTCk7Ci0JCQlGZWF0dXJlTW9kZWwgcmVtb3RlRmVhdHVyZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOwotCQkJcmVtb3RlRmVhdHVyZS5yZXNvbHZlKHJlbW90ZVVSTCwgbnVsbCk7Ci0KLQkJCVVSTEVudHJ5TW9kZWxbXSBtb2RlbHMgPSByZW1vdGVGZWF0dXJlLmdldERpc2NvdmVyeVNpdGVFbnRyeU1vZGVscygpOwotCQkJYXNzZXJ0VHJ1ZSgiRGlzY292ZXJ5IG1vZGVsIGlzIG5vdCBhIFdlYiBNb2RlbCIsIG1vZGVsc1swXS5nZXRUeXBlKCk9PUlVUkxFbnRyeS5XRUJfU0lURSk7Ci0JCQlVUkxFbnRyeU1vZGVsIGNvcHlyaWdodCA9IHJlbW90ZUZlYXR1cmUuZ2V0Q29weXJpZ2h0TW9kZWwoKTsKLQkJCWFzc2VydFRydWUoIkNvcHlyaWdodCBtb2RlbCBpcyBub3QgYW4gVXBkYXRlIE1vZGVsIiwgY29weXJpZ2h0LmdldFR5cGUoKT09SVVSTEVudHJ5LlVQREFURV9TSVRFKTsKLQkJCQotCQl9IGNhdGNoIChTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2hvdWxkIG5vdCBiZSB0aHJvd24iICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9wYXJzZXIvVGVzdFNpdGVQYXJzZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGFyc2VyL1Rlc3RTaXRlUGFyc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA5MGE3Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9wYXJzZXIvVGVzdFNpdGVQYXJzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5TaXRlRmlsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVVJMRW5jb2RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGVzdFNpdGVQYXJzZSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVGVzdDEKLQkgKi8KLQlwdWJsaWMgVGVzdFNpdGVQYXJzZShTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlVUkwgcmVtb3RlVXJsID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInhtbHMvc2l0ZTEvIik7Ci0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKHJlbW90ZVVybCxudWxsKTsKLQotCQkvL0lGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJLy9JQ2F0ZWdvcnlbXSBjYXRlZ29yaWVzID0gcmVtb3RlU2l0ZS5nZXRDYXRlZ29yaWVzKCk7Ci0KLQkJU3RyaW5nIHBhdGggPSByZW1vdGVVcmwuZ2V0RmlsZSgpOwotCQlTdHJpbmcgcGF0aDIgPSByZW1vdGVTaXRlLmdldERlc2NyaXB0aW9uKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocGF0aCArICJpbmRleC5odG1sIiksIG5ldyBGaWxlKHBhdGgyKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVtYmVyT2ZGZWF0dXJlcygpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVVSTCByZW1vdGVVUkwgPSBuZXcgVVJMKCJodHRwIiwgZ2V0SHR0cEhvc3QoKSwgZ2V0SHR0cFBvcnQoKSwgYnVuZGxlLmdldFN0cmluZygiSFRUUF9QQVRIXzIiKSk7Ci0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKHJlbW90ZVVSTCxudWxsKTsKLQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCWFzc2VydEVxdWFscyhmZWF0dXJlLmxlbmd0aCwgMik7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL3NpdGUueG1sIik7Ci0JCURlZmF1bHRTaXRlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0U2l0ZVBhcnNlcigpOwotCQlwYXJzZXIuaW5pdChuZXcgU2l0ZUZpbGVGYWN0b3J5KCkpOwotCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOwotCQlTaXRlTW9kZWwgcmVtb3RlU2l0ZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOwotCQlyZW1vdGVTaXRlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsKLQotCQlGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBmZWF0dXJlID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCk7Ci0JCUNhdGVnb3J5TW9kZWxbXSBjYXRlZ29yaWVzID0gcmVtb3RlU2l0ZS5nZXRDYXRlZ29yeU1vZGVscygpOwotCQlBcmNoaXZlUmVmZXJlbmNlTW9kZWxbXSBhcmNoaXZlcyA9IHJlbW90ZVNpdGUuZ2V0QXJjaGl2ZVJlZmVyZW5jZU1vZGVscygpOwotCi0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBmZWF0dXJlcyIsIGZlYXR1cmUubGVuZ3RoID09IDYpOwotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgY2F0ZWdvcmllcyIsIGNhdGVnb3JpZXMubGVuZ3RoID09IDMpOwotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgYXJjaGl2ZXMiLCBhcmNoaXZlcy5sZW5ndGggPT0gMCk7Ci0KLQkJU3RyaW5nIHBhdGggPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAicGFyc2VydGVzdHMvIikuZ2V0RmlsZSgpOwotCQlTdHJpbmcgcGF0aDIgPSByZW1vdGVTaXRlLmdldERlc2NyaXB0aW9uTW9kZWwoKS5nZXRVUkwoKS5nZXRGaWxlKCk7Ci0JCWFzc2VydEVxdWFscyhwYXRoICsgImluZGV4Lmh0bWwiLCBwYXRoMik7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL3JlZGRvdC54bWwiKTsKLQkJRGVmYXVsdFNpdGVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRTaXRlUGFyc2VyKCk7Ci0JCXBhcnNlci5pbml0KG5ldyBTaXRlRmlsZUZhY3RvcnkoKSk7Ci0JCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHJlbW90ZVVSTCk7Ci0JCVNpdGVNb2RlbCByZW1vdGVTaXRlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7Ci0JCXJlbW90ZVNpdGUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOwotCi0JCUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKTsKLQkJQ2F0ZWdvcnlNb2RlbFtdIGNhdGVnb3JpZXMgPSByZW1vdGVTaXRlLmdldENhdGVnb3J5TW9kZWxzKCk7Ci0JCUFyY2hpdmVSZWZlcmVuY2VNb2RlbFtdIGFyY2hpdmVzID0gcmVtb3RlU2l0ZS5nZXRBcmNoaXZlUmVmZXJlbmNlTW9kZWxzKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGZlYXR1cmVzIiwgZmVhdHVyZS5sZW5ndGggPT0gMik7Ci0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBjYXRlZ29yaWVzIiwgY2F0ZWdvcmllcy5sZW5ndGggPT0gMSk7Ci0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBhcmNoaXZlcyIsIGFyY2hpdmVzLmxlbmd0aCA9PSAyKTsKLQotCQlTdHJpbmcgdmFsaWRlU3RyaW5nID0gIlRoaXMgY2F0ZWdvcnkgY29udGFpbnMgYWxsIG9mIHRoZSA8Y3VycmVudGx5PiBhdmFpbGFibGUgdmVyc2lvbnMgb2YgUmVkIERvdCBmZWF0dXJlLiA8Z3JlZXRpbmc+SGVsbG8sIHdvcmxkITwvZ3JlZXRpbmc+IjsKLQkJYXNzZXJ0RXF1YWxzKHZhbGlkZVN0cmluZywgcmVtb3RlU2l0ZS5nZXRDYXRlZ29yeU1vZGVscygpWzBdLmdldERlc2NyaXB0aW9uTW9kZWwoKS5nZXRBbm5vdGF0aW9uKCkpOwotCi0JCVN0cmluZyBwYXRoID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzLyIpLmdldEZpbGUoKTsKLQkJU3RyaW5nIHBhdGgyID0gcmVtb3RlU2l0ZS5nZXREZXNjcmlwdGlvbk1vZGVsKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOwotCQlhc3NlcnRFcXVhbHMocGF0aCArICJpbmRleC5odG1sIiwgcGF0aDIpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9yZWRkb3QxLnhtbCIpOwotCQlEZWZhdWx0U2l0ZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdFNpdGVQYXJzZXIoKTsKLQkJcGFyc2VyLmluaXQobmV3IFNpdGVGaWxlRmFjdG9yeSgpKTsKLQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsKLQkJU2l0ZU1vZGVsIHJlbW90ZVNpdGUgPSBwYXJzZXIucGFyc2UocmVzb2x2ZWRVUkwub3BlblN0cmVhbSgpKTsKLQkJcmVtb3RlU2l0ZS5yZXNvbHZlKHJlbW90ZVVSTCwgbnVsbCk7Ci0KLQkJRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOwotCQlDYXRlZ29yeU1vZGVsW10gY2F0ZWdvcmllcyA9IHJlbW90ZVNpdGUuZ2V0Q2F0ZWdvcnlNb2RlbHMoKTsKLQkJQXJjaGl2ZVJlZmVyZW5jZU1vZGVsW10gYXJjaGl2ZXMgPSByZW1vdGVTaXRlLmdldEFyY2hpdmVSZWZlcmVuY2VNb2RlbHMoKTsKLQotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgZmVhdHVyZXMiLCBmZWF0dXJlLmxlbmd0aCA9PSAyKTsKLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGNhdGVnb3JpZXMiLCBjYXRlZ29yaWVzLmxlbmd0aCA9PSAxKTsKLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGFyY2hpdmVzIiwgYXJjaGl2ZXMubGVuZ3RoID09IDIpOwotCi0JCVN0cmluZyB2YWxpZGVTdHJpbmcgPSAiVGhpcyBjYXRlZ29yeSBjb250YWlucyBhbGwgb2YgdGhlIDxjdXJyZW50bHk+IGF2YWlsYWJsZSB2ZXJzaW9ucyBvZiBSZWQgRG90IGZlYXR1cmUuIjsKLQkJYXNzZXJ0RXF1YWxzKHZhbGlkZVN0cmluZywgcmVtb3RlU2l0ZS5nZXRDYXRlZ29yeU1vZGVscygpWzBdLmdldERlc2NyaXB0aW9uTW9kZWwoKS5nZXRBbm5vdGF0aW9uKCkpOwotCi0JCVN0cmluZyBwYXRoID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzLyIpLmdldEZpbGUoKTsKLQkJU3RyaW5nIHBhdGgyID0gcmVtb3RlU2l0ZS5nZXREZXNjcmlwdGlvbk1vZGVsKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOwotCQlhc3NlcnRFcXVhbHMocGF0aCArICJpbmRleC5odG1sIiwgcGF0aDIpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJTaXRlVVJMVGVzdC9kYXRhL3NpdGUueG1sIik7Ci0JCURlZmF1bHRTaXRlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0U2l0ZVBhcnNlcigpOwotCQlwYXJzZXIuaW5pdChuZXcgU2l0ZUZpbGVGYWN0b3J5KCkpOwotCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOwotCQlTaXRlTW9kZWwgcmVtb3RlU2l0ZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOwotCQlyZW1vdGVTaXRlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsKLQotCQlGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBmZWF0dXJlID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCk7Ci0JCS8vQ2F0ZWdvcnlNb2RlbFtdIGNhdGVnb3JpZXMgPSByZW1vdGVTaXRlLmdldENhdGVnb3J5TW9kZWxzKCk7Ci0JCUFyY2hpdmVSZWZlcmVuY2VNb2RlbFtdIGFyY2hpdmVzID0gcmVtb3RlU2l0ZS5nZXRBcmNoaXZlUmVmZXJlbmNlTW9kZWxzKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGZlYXR1cmVzIiwgZmVhdHVyZS5sZW5ndGggPT0gMik7Ci0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBhcmNoaXZlcyIsIGFyY2hpdmVzLmxlbmd0aCA9PSAzKTsKLQotCQlVUkwgcGF0aDEgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAiU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvZmVhdHVyZXMvaGVscEZlYXR1cmUuamFyIik7Ci0JCVVSTCB1cmwxID0gZmVhdHVyZVswXS5nZXRVUkwoKTsKLQkJYXNzZXJ0RXF1YWxzKHBhdGgxLCB1cmwxKTsKLQkJVVJMIHBhdGgyID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgIlNpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL3BsdWdpbnMvaGVscC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHBhdGgyLCBhcmNoaXZlc1swXS5nZXRVUkwoKSk7Ci0KLQkJU3RyaW5nIHBhdGggPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAiU2l0ZVVSTFRlc3QvZGF0YS9pbmZvLyIpLmdldEZpbGUoKTsKLQkJU3RyaW5nIHBhdGgzID0gcmVtb3RlU2l0ZS5nZXREZXNjcmlwdGlvbk1vZGVsKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOwotCQlhc3NlcnRFcXVhbHMocGF0aCArICJzaXRlSW5mby5odG1sIiwgcGF0aDMpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQ1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9zaXRlMi54bWwiKTsKLQkJRGVmYXVsdFNpdGVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRTaXRlUGFyc2VyKCk7Ci0JCXBhcnNlci5pbml0KG5ldyBTaXRlRmlsZUZhY3RvcnkoKSk7Ci0JCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHJlbW90ZVVSTCk7Ci0JCVNpdGVNb2RlbCByZW1vdGVTaXRlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7Ci0JCXJlbW90ZVNpdGUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOwotCi0JCUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGZlYXR1cmVSZWYgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKTsKLQkJLy9DYXRlZ29yeU1vZGVsW10gY2F0ZWdvcmllcyA9IHJlbW90ZVNpdGUuZ2V0Q2F0ZWdvcnlNb2RlbHMoKTsKLQkJQXJjaGl2ZVJlZmVyZW5jZU1vZGVsW10gYXJjaGl2ZXMgPSByZW1vdGVTaXRlLmdldEFyY2hpdmVSZWZlcmVuY2VNb2RlbHMoKTsKLQotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgZmVhdHVyZXMiLCBmZWF0dXJlUmVmLmxlbmd0aCA9PSAxKTsKLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGFyY2hpdmVzIiwgYXJjaGl2ZXMubGVuZ3RoID09IDApOwotCi0JCXRyeSB7Ci0JCQkoKEZlYXR1cmVSZWZlcmVuY2UpIGZlYXR1cmVSZWZbMF0pLmdldEZlYXR1cmUobnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVGhyb3dhYmxlIGUxID0gZS5nZXRTdGF0dXMoKS5nZXRFeGNlcHRpb24oKTsKLQkJCWlmIChlMS5nZXRNZXNzYWdlKCkuaW5kZXhPZigibm90LWVjbGlwc2UiKSA9PSAtMSkgewotCQkJCXRocm93IGU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL3NpdGU0LnhtbCIpOwotCQlEZWZhdWx0U2l0ZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdFNpdGVQYXJzZXIoKTsKLQkJcGFyc2VyLmluaXQobmV3IFNpdGVGaWxlRmFjdG9yeSgpKTsKLQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsKLQkJU2l0ZU1vZGVsIHJlbW90ZVNpdGUgPSBwYXJzZXIucGFyc2UocmVzb2x2ZWRVUkwub3BlblN0cmVhbSgpKTsKLQkJcmVtb3RlU2l0ZS5yZXNvbHZlKHJlbW90ZVVSTCwgbnVsbCk7Ci0KLQkJRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gZmVhdHVyZVJlZiA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOwotCQkvL0NhdGVnb3J5TW9kZWxbXSBjYXRlZ29yaWVzID0gcmVtb3RlU2l0ZS5nZXRDYXRlZ29yeU1vZGVscygpOwotCQlBcmNoaXZlUmVmZXJlbmNlTW9kZWxbXSBhcmNoaXZlcyA9IHJlbW90ZVNpdGUuZ2V0QXJjaGl2ZVJlZmVyZW5jZU1vZGVscygpOwotCi0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBmZWF0dXJlcyIsIGZlYXR1cmVSZWYubGVuZ3RoID09IDIpOwotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgYXJjaGl2ZXMiLCBhcmNoaXZlcy5sZW5ndGggPT0gMCk7Ci0KLQkJdHJ5IHsKLQkJCSgoRmVhdHVyZVJlZmVyZW5jZSkgZmVhdHVyZVJlZlswXSkuZ2V0RmVhdHVyZShudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgZTEgPSBlLmdldFN0YXR1cygpLmdldEV4Y2VwdGlvbigpOwotCQkJU3RyaW5nIG1zZyA9IGUxLmdldE1lc3NhZ2UoKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLQkJCWlmIChtc2cuaW5kZXhPZigiXzEuMC4wLmphci9mZWF0dXJlLnhtbCIpID09IC0xKSB7Ci0JCQkJdGhyb3cgZTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVVua25vd25DYXRlZ29yeSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVVSTCByZW1vdGVVUkwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAicGFyc2VydGVzdHMvc2l0ZTMueG1sIik7Ci0JCURlZmF1bHRTaXRlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0U2l0ZVBhcnNlcigpOwotCQlwYXJzZXIuaW5pdChuZXcgU2l0ZUZpbGVGYWN0b3J5KCkpOwotCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOwotCQlTaXRlTW9kZWwgcmVtb3RlU2l0ZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOwotCQlyZW1vdGVTaXRlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsKLQotCQlGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBmZWF0dXJlUmVmID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCk7Ci0JCUlDYXRlZ29yeVtdIGNhdGVnb3JpZXMgPSAoKFNpdGVGZWF0dXJlUmVmZXJlbmNlKSBmZWF0dXJlUmVmWzBdKS5nZXRDYXRlZ29yaWVzKCk7Ci0JCWFzc2VydFRydWUoY2F0ZWdvcmllcy5sZW5ndGggPT0gMSAmJiAiT3RoZXIiLmVxdWFscyhjYXRlZ29yaWVzWzBdLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVZhbGlkNygpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXRyeSB7Ci0JCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL3NpdGU3LnhtbCIpOwotCQkJRGVmYXVsdFNpdGVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRTaXRlUGFyc2VyKCk7Ci0JCQlwYXJzZXIuaW5pdChuZXcgU2l0ZUZpbGVGYWN0b3J5KCkpOwotCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsKLQkJCVNpdGVNb2RlbCByZW1vdGVTaXRlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7Ci0JCQlyZW1vdGVTaXRlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsKLQotCQl9IGNhdGNoIChTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFeGNlcHRpb24gc2hvdWxkIG5vdCBiZSB0aHJvd24iICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQ4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJdHJ5IHsKLQkJCVVSTCByZW1vdGVVUkwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAicGFyc2VydGVzdHMvc2l0ZTgueG1sIik7Ci0JCQlEZWZhdWx0U2l0ZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdFNpdGVQYXJzZXIoKTsKLQkJCXBhcnNlci5pbml0KG5ldyBTaXRlRmlsZUZhY3RvcnkoKSk7Ci0JCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOwotCQkJU2l0ZU1vZGVsIHJlbW90ZVNpdGUgPSBwYXJzZXIucGFyc2UocmVzb2x2ZWRVUkwub3BlblN0cmVhbSgpKTsKLQkJCXJlbW90ZVNpdGUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOwotCi0JCX0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBzaG91bGQgbm90IGJlIHRocm93biIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQl0cnkgewotCQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9zaXRlOS54bWwiKTsKLQkJCURlZmF1bHRTaXRlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0U2l0ZVBhcnNlcigpOwotCQkJcGFyc2VyLmluaXQobmV3IFNpdGVGaWxlRmFjdG9yeSgpKTsKLQkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHJlbW90ZVVSTCk7Ci0JCQlTaXRlTW9kZWwgcmVtb3RlU2l0ZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOwotCQkJcmVtb3RlU2l0ZS5yZXNvbHZlKHJlbW90ZVVSTCwgbnVsbCk7Ci0JCX0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBzaG91bGQgbm90IGJlIHRocm93biIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDEwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJU2l0ZU1vZGVsIHJlbW90ZVNpdGUgPSBudWxsOwotCQl0cnkgewotCQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9zaXRlMTAueG1sIik7Ci0JCQlEZWZhdWx0U2l0ZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdFNpdGVQYXJzZXIoKTsKLQkJCXBhcnNlci5pbml0KG5ldyBTaXRlRmlsZUZhY3RvcnkoKSk7Ci0JCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOwotCQkJcmVtb3RlU2l0ZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOwotCQkJcmVtb3RlU2l0ZS5yZXNvbHZlKHJlbW90ZVVSTCwgbnVsbCk7Ci0JCX0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBzaG91bGQgbm90IGJlIHRocm93biIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gbW9kZWxzID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCk7Ci0JCWFzc2VydEVxdWFscygiSW52YWxpZCB2ZXJzaW9uZWQgaWRlbnRpZmllciIsIG1vZGVsc1swXS5nZXRGZWF0dXJlSWRlbnRpZmllcigpLCAib3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlIik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9wZXJmbXMvQWxsUGVyZm9ybWFuY2VUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGVyZm1zL0FsbFBlcmZvcm1hbmNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk2OWM5MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9wZXJmbXMvQWxsUGVyZm9ybWFuY2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5wZXJmbXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi0KLXB1YmxpYyBjbGFzcyBBbGxQZXJmb3JtYW5jZVRlc3RzIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLXB1YmxpYyBBbGxQZXJmb3JtYW5jZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCXN1aXRlLnNldE5hbWUoIlVwZGF0ZSBQZXJmb3JtYW5jZSBUZXN0cyIpOwotCQotCS8vIHRoZSBmb2xsb3dpbmcgd2lsbCB0YWtlIGFsbCB0ZWggdGVzdCBtZXRob2RzIGluIHRoZSBjbGFzcyB0aGF0IHN0YXJ0IHdpdGggJ3Rlc3QnCi0JLy9zdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFN0YXJ0dXAuY2xhc3MpKTsKLQlyZXR1cm4gc3VpdGU7Ci19Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9wZXJmbXMvVGVzdFN0YXJ0dXAuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BlcmZtcy9UZXN0U3RhcnR1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjc0ODY2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BlcmZtcy9UZXN0U3RhcnR1cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5wZXJmbXM7Ci0vL2ltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VNZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yLlBsYXRmb3JtQ29uZmlndXJhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvci5TaXRlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFRlc3RTdGFydHVwIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQlwdWJsaWMgVGVzdFN0YXJ0dXAoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyYXRpb25DcmVhdGlvbigpIHsKLQkJUGVyZm9ybWFuY2UgcGVyZj0gUGVyZm9ybWFuY2UuZ2V0RGVmYXVsdCgpOwotCQlQZXJmb3JtYW5jZU1ldGVyIHBlcmZvcm1hbmNlTWV0ZXI9IHBlcmYuY3JlYXRlUGVyZm9ybWFuY2VNZXRlcihwZXJmLmdldERlZmF1bHRTY2VuYXJpb0lkKHRoaXMpKTsKLQkJcGVyZi50YWdBc0dsb2JhbFN1bW1hcnkocGVyZm9ybWFuY2VNZXRlciwgIkNvbmZpZ3VyYXRpb24gY3JlYXRpb24iLCBEaW1lbnNpb24uRUxBUFNFRF9QUk9DRVNTKTsKLQkJCi0JCXRyeSB7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgMTA7IGkrKykgewotCQkJCXBlcmZvcm1hbmNlTWV0ZXIuc3RhcnQoKTsKLQkJCQl0cnkgewotCQkJCQlVUkwgcGxhdGZvcm1YbWwgPSBuZXcgVVJMKCJmaWxlIiwgIiIsZGF0YVBhdGggKyAiLyIgKyAicGVyZi9wbGF0Zm9ybS54bWwiKTsKLQkJCQkJbmV3IFBsYXRmb3JtQ29uZmlndXJhdGlvbkZhY3RvcnkoKS5nZXRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24ocGxhdGZvcm1YbWwpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYW5ub3QgY3JlYXRlIGNvbmZpZ3VyYXRpb24gZm9yIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50Iik7Ci0JCQkJfQotCQkJCXBlcmZvcm1hbmNlTWV0ZXIuc3RvcCgpOwotCSAJCX0KLQkJCXBlcmZvcm1hbmNlTWV0ZXIuY29tbWl0KCk7Ci0JCQlwZXJmLmFzc2VydFBlcmZvcm1hbmNlKHBlcmZvcm1hbmNlTWV0ZXIpOwotCSAJfSBmaW5hbGx5IHsKLQkJCXBlcmZvcm1hbmNlTWV0ZXIuZGlzcG9zZSgpOwotCSAJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJhdGlvbkRldGVjdGlvbigpIHsKLQkJUGVyZm9ybWFuY2UgcGVyZj0gUGVyZm9ybWFuY2UuZ2V0RGVmYXVsdCgpOwotCQlQZXJmb3JtYW5jZU1ldGVyIHBlcmZvcm1hbmNlTWV0ZXI9IHBlcmYuY3JlYXRlUGVyZm9ybWFuY2VNZXRlcihwZXJmLmdldERlZmF1bHRTY2VuYXJpb0lkKHRoaXMpKTsKLQkJcGVyZi50YWdBc0dsb2JhbFN1bW1hcnkocGVyZm9ybWFuY2VNZXRlciwgIkNvbmZpZ3VyYXRpb24gZGV0ZWN0aW9uIiwgRGltZW5zaW9uLkVMQVBTRURfUFJPQ0VTUyk7Ci0KLQkJdHJ5IHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCQkJcGVyZm9ybWFuY2VNZXRlci5zdGFydCgpOwotCQkJCXRyeSB7Ci0JCQkJCVVSTCBzaXRlVVJMID0gbmV3IFVSTCgiZmlsZSIsICIiLGRhdGFQYXRoICsgIi8iICsgInBlcmYvZWNsaXBzZSIpOwotCQkJCQlTaXRlRW50cnkgc2l0ZSA9IG5ldyBTaXRlRW50cnkoc2l0ZVVSTCk7Ci0JCQkJCXNpdGUubG9hZEZyb21EaXNrKDApOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2Fubm90IGNyZWF0ZSBzaXRlIGVudHJ5IGZvciBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudCIpOwotCQkJCX0KLQkJCQlwZXJmb3JtYW5jZU1ldGVyLnN0b3AoKTsKLQkgCQl9Ci0JCQlwZXJmb3JtYW5jZU1ldGVyLmNvbW1pdCgpOwotCQkJcGVyZi5hc3NlcnRQZXJmb3JtYW5jZShwZXJmb3JtYW5jZU1ldGVyKTsKLQkgCX0gZmluYWxseSB7Ci0JCQlwZXJmb3JtYW5jZU1ldGVyLmRpc3Bvc2UoKTsKLQkgCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWNvbmNpbGlhdGlvbi9BbGxSZWNvbmNpbGlhdGlvblRlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWNvbmNpbGlhdGlvbi9BbGxSZWNvbmNpbGlhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OGQ3YzEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVjb25jaWxpYXRpb24vQWxsUmVjb25jaWxpYXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWNvbmNpbGlhdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBBUEkgdGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEFsbFJlY29uY2lsaWF0aW9uVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFsbFJlY29uY2lsaWF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIExpc3Qgb2YgQVBJIHRlc3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuc2V0TmFtZSgiQVBJIFRlc3RzIik7Ci0KLQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFNpdGVSZWNvbmNpbGlhdGlvbi5jbGFzcykpOwotCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWNvbmNpbGlhdGlvbi9UZXN0U2l0ZVJlY29uY2lsaWF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWNvbmNpbGlhdGlvbi9UZXN0U2l0ZVJlY29uY2lsaWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZTA2ZDkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVjb25jaWxpYXRpb24vVGVzdFNpdGVSZWNvbmNpbGlhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVjb25jaWxpYXRpb247Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5JUGxhdGZvcm1Db25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy4qOwotCi1wdWJsaWMgY2xhc3MgVGVzdFNpdGVSZWNvbmNpbGlhdGlvbiBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JCi0KLQkKLQotCS8qKgotCSAqIFRlc3QgdGhlIGdldEZlYXR1cmVzKCkKLQkgKi8KLQlwdWJsaWMgVGVzdFNpdGVSZWNvbmNpbGlhdGlvbihTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQ29uZmlnU2l0ZShpbnQgcG9saWN5LCBVUkwgdXJsLFN0cmluZ1tdIGxpc3RPZlBsdWdpbnMpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgeG1sRmlsZSA9ICgoTG9jYWxTaXRlKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKG5ldyBGaWxlKHhtbEZpbGUpKTsJCQotCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmxvY2FsU2l0ZT1udWxsOwotCQkvLyBnZXQgbmV3IGNvbmZpZyBvYmplY3QKLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjZmlnID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOwotCQlJU2l0ZVBvbGljeSBwMSA9IGNmaWcuY3JlYXRlU2l0ZVBvbGljeShwb2xpY3ksIGxpc3RPZlBsdWdpbnMpOwkKLQkJSVNpdGVFbnRyeSBzMSA9IGNmaWcuY3JlYXRlU2l0ZUVudHJ5KHVybCxwMSk7Ci0JCWNmaWcuY29uZmlndXJlU2l0ZShzMSk7CQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlQ29uZmlnU2l0ZShVUkwgdXJsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gZ2V0IG5ldyBjb25maWcgb2JqZWN0Ci0JCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gY2ZpZyA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKLQkJSVNpdGVFbnRyeSBzMSA9IGNmaWcuZmluZENvbmZpZ3VyZWRTaXRlKHVybCk7Ci0JCWFzc2VydE5vdE51bGwoIlVuYWJsZSB0byBmaW5kIHNpdGUgZW50cnk6Iit1cmwsczEpOwotCQljZmlnLnVuY29uZmlndXJlU2l0ZShzMSk7Ci0JCWNmaWcuc2F2ZSgpOwotCX0JCi0JLyoqCi0JICogU2l0ZSAxIGNvbnRhaW5zIGEgZmVhdHVyZSB3aGljaCBuZWVkcyBhIHBsdWdpbiB0YWh0IGlzIG5vdCBvbiB0aGUgcGF0aCB3aGVuIHdlIHN0YXJ0Ci0JICogaXQgd2lsbCBuZXZlciBiZSBjb25maWd1cmVkCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpdGVJbmNsdWRlMSgpIHRocm93cyBFeGNlcHRpb24gewotCQotCQlpbnQgcG9saWN5ICA9IElTaXRlUG9saWN5LlVTRVJfSU5DTFVERTsKLQkJVVJMIHVybCA9IG5ldyBVUkwoImZpbGUiLG51bGwsZGF0YVBhdGgrInJlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTEvIik7Ci0JCVN0cmluZ1tdIHBsdWdpbnMgPSBuZXcgU3RyaW5nW117fTsKLQkJYWRkQ29uZmlnU2l0ZShwb2xpY3ksdXJsLCBwbHVnaW5zKTsKLQotCQlJTG9jYWxTaXRlIGxvY2FsID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCSgoTG9jYWxTaXRlKWxvY2FsKS5zZXRTdGFtcCgwKTsKLQkJSUNvbmZpZ3VyZWRTaXRlW10gbmV3U2l0ZXMgPSBsb2NhbC5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQlJQ29uZmlndXJlZFNpdGUgbmV3U2l0ZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3U2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChVcGRhdGVNYW5hZ2VyVXRpbHMuc2FtZVVSTChuZXdTaXRlc1tpXS5nZXRTaXRlKCkuZ2V0VVJMKCksdXJsKSl7Ci0JCQkJbmV3U2l0ZSA9IG5ld1NpdGVzW2ldOwotCQkJfQotCQl9Ci0JCQotCQlpZiAobmV3U2l0ZT09bnVsbCkgZmFpbCgiU2l0ZSBub3QgZm91bmQgaW4gY29uZmlndXJhdGlvbiIpOwotCQkKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWYgPSBuZXdTaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBjb25maWd1cmVkIGZlYXR1cmVzIiwwLHJlZi5sZW5ndGgpOwkJCi0JCXJlZiA9ICgoQ29uZmlndXJlZFNpdGUpbmV3U2l0ZSkuZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpLmdldFVuY29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHVuY29uZmlndXJlZCBmZWF0dXJlcyIsMCxyZWYubGVuZ3RoKTsJCQotCQkKLQkJcmVtb3ZlQ29uZmlnU2l0ZSh1cmwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaXRlRXhjbHVkZTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCWludCBwb2xpY3kgID0gSVNpdGVQb2xpY3kuVVNFUl9FWENMVURFOwotCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsbnVsbCxkYXRhUGF0aCsicmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMS8iKTsKLQkJU3RyaW5nW10gcGx1Z2lucyA9IG5ldyBTdHJpbmdbXXt9OwotCQlhZGRDb25maWdTaXRlKHBvbGljeSx1cmwsIHBsdWdpbnMpOwotCQkKLQkJSUxvY2FsU2l0ZSBsb2NhbCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQkoKExvY2FsU2l0ZSlsb2NhbCkuc2V0U3RhbXAoMCk7CQkKLQkJSUNvbmZpZ3VyZWRTaXRlW10gbmV3U2l0ZXMgPSBsb2NhbC5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQlJQ29uZmlndXJlZFNpdGUgbmV3U2l0ZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3U2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChVcGRhdGVNYW5hZ2VyVXRpbHMuc2FtZVVSTChuZXdTaXRlc1tpXS5nZXRTaXRlKCkuZ2V0VVJMKCksdXJsKSl7Ci0JCQkJbmV3U2l0ZSA9IG5ld1NpdGVzW2ldOwotCQkJfQotCQl9Ci0JCQotCQlpZiAobmV3U2l0ZT09bnVsbCkgZmFpbCgiU2l0ZSBub3QgZm91bmQgaW4gY29uZmlndXJhdGlvbiIpOwotCQkKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWYgPSBuZXdTaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBjb25maWd1cmVkIGZlYXR1cmVzIiwwLHJlZi5sZW5ndGgpOwkJCi0JCXJlZiA9ICgoQ29uZmlndXJlZFNpdGUpbmV3U2l0ZSkuZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpLmdldFVuY29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHVuY29uZmlndXJlZCBmZWF0dXJlcyIsMCxyZWYubGVuZ3RoKTsJCQkJCi0JCXJlbW92ZUNvbmZpZ1NpdGUodXJsKTsKLQl9Ci0KLQkvKioKLQkgKiBTaXRlIDIgY29udGFpbnMgYSBmZWF0dXJlIHdoaWNoIG5lZWRzIGEgcGx1Z2luIHRhaHQgaXMgb24gdGhlIHBhdGggd2hlbiB3ZSBzdGFydAotCSAqIGl0IHdpbGwgYmUgY29uZmlndXJlZAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaXRlSW5jbHVkZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCWludCBwb2xpY3kgID0gSVNpdGVQb2xpY3kuVVNFUl9JTkNMVURFOwotCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsbnVsbCxkYXRhUGF0aCsicmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMi8iKTsKLQkJU3RyaW5nW10gcGx1Z2lucyA9IG5ldyBTdHJpbmdbXXt9OwotCQlhZGRDb25maWdTaXRlKHBvbGljeSx1cmwsIHBsdWdpbnMpOwotCQlJTG9jYWxTaXRlIGxvY2FsID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCSgoTG9jYWxTaXRlKWxvY2FsKS5zZXRTdGFtcCgwKTsJCQotCQlJQ29uZmlndXJlZFNpdGVbXSBuZXdTaXRlcyA9IGxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCUlDb25maWd1cmVkU2l0ZSBuZXdTaXRlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdTaXRlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKFVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKG5ld1NpdGVzW2ldLmdldFNpdGUoKS5nZXRVUkwoKSx1cmwpKXsKLQkJCQluZXdTaXRlID0gbmV3U2l0ZXNbaV07Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChuZXdTaXRlPT1udWxsKSBmYWlsKCJTaXRlIG5vdCBmb3VuZCBpbiBjb25maWd1cmF0aW9uIik7Ci0JCQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZiA9IG5ld1NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIGNvbmZpZ3VyZWQgZmVhdHVyZXMiLDAscmVmLmxlbmd0aCk7Ci0JCXJlZiA9ICgoQ29uZmlndXJlZFNpdGUpbmV3U2l0ZSkuZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpLmdldFVuY29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHVuY29uZmlndXJlZCBmZWF0dXJlcyIsMCxyZWYubGVuZ3RoKTsKLQkJCi0JCXJlbW92ZUNvbmZpZ1NpdGUodXJsKTsKLQl9Ci0KLQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpdGVFeGNsdWRlMigpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJaW50IHBvbGljeSAgPSBJU2l0ZVBvbGljeS5VU0VSX0VYQ0xVREU7Ci0JCVVSTCB1cmwgPSBuZXcgVVJMKCJmaWxlIixudWxsLGRhdGFQYXRoKyJyZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUyLyIpOwotCQlTdHJpbmdbXSBwbHVnaW5zID0gbmV3IFN0cmluZ1tde307Ci0JCWFkZENvbmZpZ1NpdGUocG9saWN5LHVybCwgcGx1Z2lucyk7Ci0JCUlMb2NhbFNpdGUgbG9jYWwgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJKChMb2NhbFNpdGUpbG9jYWwpLnNldFN0YW1wKDApOwkJCi0JCUlDb25maWd1cmVkU2l0ZVtdIG5ld1NpdGVzID0gbG9jYWwuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJSUNvbmZpZ3VyZWRTaXRlIG5ld1NpdGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld1NpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoVXBkYXRlTWFuYWdlclV0aWxzLnNhbWVVUkwobmV3U2l0ZXNbaV0uZ2V0U2l0ZSgpLmdldFVSTCgpLHVybCkpewotCQkJCW5ld1NpdGUgPSBuZXdTaXRlc1tpXTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKG5ld1NpdGU9PW51bGwpIGZhaWwoIlNpdGUgbm90IGZvdW5kIGluIGNvbmZpZ3VyYXRpb24iKTsKLQkJCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmID0gbmV3U2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgY29uZmlndXJlZCBmZWF0dXJlcyIsMCxyZWYubGVuZ3RoKTsKLQkJcmVmID0gKChDb25maWd1cmVkU2l0ZSluZXdTaXRlKS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCkuZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdW5jb25maWd1cmVkIGZlYXR1cmVzIiwwLHJlZi5sZW5ndGgpOwotCi0JCXJlbW92ZUNvbmZpZ1NpdGUodXJsKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL0FsbFJlZ3VsYXJJbnN0YWxsVGVzdHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL0FsbFJlZ3VsYXJJbnN0YWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ViZjE5Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9BbGxSZWd1bGFySW5zdGFsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJJbnN0YWxsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotCi1wdWJsaWMgY2xhc3MgQWxsUmVndWxhckluc3RhbGxUZXN0cyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci1wdWJsaWMgQWxsUmVndWxhckluc3RhbGxUZXN0cyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQlzdWl0ZS5zZXROYW1lKCJSZWd1bGFyIEluc3RhbGwgVGVzdHMiKTsKLQkKLQkvLyB0aGUgZm9sbG93aW5nIHdpbGwgdGFrZSBhbGwgdGVoIHRlc3QgbWV0aG9kcyBpbiB0ZWggY2xhc3MgdGhhdCBzdGFydCB3aXRoICd0ZXN0JwotCi0Jc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RJbnN0YWxsLmNsYXNzKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RJbnN0YWxsVVJMU0l0ZVhNTC5jbGFzcykpOwkKLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFNwYWNlSW5JbnN0YWxsLmNsYXNzKSk7CQotCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0R2V0RmVhdHVyZS5jbGFzcykpOwotCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0RXhlY3V0YWJsZUluc3RhbGwuY2xhc3MpKTsJCi0Jc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RFeGVjdXRhYmxlUGFja2FnZWRJbnN0YWxsLmNsYXNzKSk7CQkKLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdERhdGFFbnRyeUluc3RhbGwuY2xhc3MpKTsKLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdExvY2FsU2l0ZS5jbGFzcykpOwkJCi0JCi0JLy8gb3IgeW91IGNhbiBzcGVjaWZ5IHRoZSBtZXRob2QKLQkvL3N1aXRlLmFkZFRlc3QobmV3IFRlc3RHZXRGZWF0dXJlKCJtZXRob2RUaGF0RG9lc05vdFN0YXJ0V2l0aHRlc3QiKSk7CQotCQotCXJldHVybiBzdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL011bHRpcGxlVGVzdExvY2FsU2l0ZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvTXVsdGlwbGVUZXN0TG9jYWxTaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNmRmOTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvTXVsdGlwbGVUZXN0TG9jYWxTaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJJbnN0YWxsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotCi1wdWJsaWMgY2xhc3MgTXVsdGlwbGVUZXN0TG9jYWxTaXRlIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLXB1YmxpYyBNdWx0aXBsZVRlc3RMb2NhbFNpdGUoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0Jc3VpdGUuc2V0TmFtZSgiTXVsdGlwbGUgVGVzdCBMb2NhbCBTaXRlIik7Ci0JCi0JLy8gdGhlIGZvbGxvd2luZyB3aWxsIHRha2UgYWxsIHRlaCB0ZXN0IG1ldGhvZHMgaW4gdGVoIGNsYXNzIHRoYXQgc3RhcnQgd2l0aCAndGVzdCcKLQkKLQlmb3IoaW50IGk9MDsgaTw1MDsgaSsrKXsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RMb2NhbFNpdGUuY2xhc3MpKTsKLQl9Ci0JCi0JcmV0dXJuIHN1aXRlOwotfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdERhdGFFbnRyeUluc3RhbGwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3REYXRhRW50cnlJbnN0YWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MTA1YzEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdERhdGFFbnRyeUluc3RhbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJJbnN0YWxsOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZU1hbmFnZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgVGVzdERhdGFFbnRyeUluc3RhbGwgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBUZXN0MQotCSAqLwotCXB1YmxpYyBUZXN0RGF0YUVudHJ5SW5zdGFsbChTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQkvKioKLQkgKiBXaXRoIHNpdGUueG1sCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERhdGFFbnRyeVNpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQkvL2NsZWFudXAgdGFyZ2V0IAotCQlGaWxlIHRhcmdldCA9IG5ldyBGaWxlKFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7Ci0JCQotCQlVUkwgbmV3VVJMID1uZXcgRmlsZShkYXRhUGF0aCArICJkYXRhRW50cnlTaXRlVGVzdC9zaXRlMS9zaXRlLnhtbCIpLnRvVVJMKCk7Ci0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ld1VSTCxudWxsKTsKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlc1JlZiA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJSVNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShUQVJHRVRfRklMRV9TSVRFLG51bGwpOwotCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gbnVsbDsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNSZWYubGVuZ3RoOyBpKyspIHsKLQkJCXJlbW90ZUZlYXR1cmUgPSBmZWF0dXJlc1JlZltpXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCxudWxsKTsKLQotCQkJLy8gdmVyaWZ5Ci0JCQlTdHJpbmcgc2l0ZSA9IGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCk7Ci0JCQlJTm9uUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXROb25QbHVnaW5FbnRyaWVzKCk7Ci0JCQlhc3NlcnRUcnVlKCJubyBkYXRhIGVudHJ5IiwgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCAhPSAwKSk7Ci0JCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0SWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkrRmlsZS5zZXBhcmF0b3IrIHBsdWdpbk5hbWUpOwotCQkJYXNzZXJ0VHJ1ZSgiZGF0YSBmaWxlcyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitwbHVnaW5GaWxlLCBwbHVnaW5GaWxlLmV4aXN0cygpKTsKLQkJfSAKLQotCQkvL2NsZWFudXAgdGFyZ2V0IAotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsKLQotCi0JfQotCQotCQotCS8qKgotCSAqIFdpdGggc2l0ZS54bWwKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RGF0YUVudHJ5U2l0ZVBhY2thZ2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy9jbGVhbnVwIHRhcmdldCAKLQkJRmlsZSB0YXJnZXQgPSBuZXcgRmlsZShUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXQpOwotCQkKLQkJVVJMIG5ld1VSTCA9bmV3IEZpbGUoZGF0YVBhdGggKyAiZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTIvc2l0ZS54bWwiKS50b1VSTCgpOwotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXdVUkwsbnVsbCk7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXNSZWYgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSxudWxsKTsKLQkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IG51bGw7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzUmVmLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZW1vdGVGZWF0dXJlID0gZmVhdHVyZXNSZWZbaV0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCWxvY2FsU2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsbnVsbCk7Ci0KLQkJCS8vIHZlcmlmeQotCQkJU3RyaW5nIHNpdGUgPSBsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpOwotCQkJSU5vblBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0Tm9uUGx1Z2luRW50cmllcygpOwotCQkJYXNzZXJ0VHJ1ZSgibm8gZGF0YSBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOwotCQkJZW50cmllc1swXS5nZXRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQkJCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKStGaWxlLnNlcGFyYXRvcisgIm5vbmRhdGEiK0ZpbGUuc2VwYXJhdG9yKyJmaWxlMS56aXAiKTsKLQkJCWFzc2VydFRydWUoIkRhdGEgZmlsZSBpbnNpZGUgdGhlIGphciBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitwbHVnaW5GaWxlLCBwbHVnaW5GaWxlLmV4aXN0cygpKTsKLQkJCXBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkrRmlsZS5zZXBhcmF0b3IrICJmaWxlLnppcCIpOwotCQkJYXNzZXJ0VHJ1ZSgiRGF0YSBmaWxlIG91dHNpZGUgdGhlIGphciBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitwbHVnaW5GaWxlLCBwbHVnaW5GaWxlLmV4aXN0cygpKTsKLQkJCQotCQl9IAotCQkKLQotCQkvL2NsZWFudXAgdGFyZ2V0IAotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsKLQotCi0JfQkKLQkKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RFeGVjdXRhYmxlSW5zdGFsbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEV4ZWN1dGFibGVJbnN0YWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmOWRmZTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEV4ZWN1dGFibGVJbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJJbnN0YWxsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RFeGVjdXRhYmxlSW5zdGFsbCBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVGVzdDEKLQkgKi8KLQlwdWJsaWMgVGVzdEV4ZWN1dGFibGVJbnN0YWxsKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQkKLQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGVTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJCi0JCS8vY2xlYW51cCB0YXJnZXQgCi0JCUZpbGUgdGFyZ2V0ID0gbmV3IEZpbGUoVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsJCQotCQlJbnN0YWxsUmVnaXN0cnkuY2xlYW51cCgpOwotCQkKLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURV9JTlNUQUxMRUQsbnVsbCk7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVtb3RlRmVhdHVyZVJlZmVyZW5jZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IHJlbW90ZUZlYXR1cmVSZWZlcmVuY2VbMF0uZ2V0RmVhdHVyZShudWxsKTsKLQkJSVNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShUQVJHRVRfRklMRV9TSVRFLG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHJlbW90ZUZlYXR1cmUpOwotCQlyZW1vdmUocmVtb3RlRmVhdHVyZSxsb2NhbFNpdGUpOwkJCi0JCWxvY2FsU2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsbnVsbCxudWxsKTsKLQkJCi0JCS8vIHZlcmlmeQotCQlTdHJpbmcgc2l0ZSA9IGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCk7Ci0JCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSByZW1vdGVGZWF0dXJlLmdldFJhd1BsdWdpbkVudHJpZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsKGVudHJpZXMhPW51bGwgJiYgZW50cmllcy5sZW5ndGghPTApKTsKLQkJU3RyaW5nIHBsdWdpbk5hbWU9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIK3BsdWdpbk5hbWUpOwotCQlpZiAoTG9jYWxlLmdldERlZmF1bHQoKS50b1N0cmluZygpLmluZGV4T2YoInVzIikgIT0gLTEpCi0JCQlhc3NlcnRUcnVlKCJwbHVnaW4gZmlsZXMgbm90IGluc3RhbGxlZCBsb2NhbGx5IixwbHVnaW5GaWxlLmV4aXN0cygpKTsKLQotCQlGaWxlIGZlYXR1cmVGaWxlID0gbmV3IEZpbGUoc2l0ZSxTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCtyZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK2ZlYXR1cmVGaWxlLGZlYXR1cmVGaWxlLmV4aXN0cygpKTsKLQkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBpcyBhIGZpbGUsIG5vdCBhIGRpcmVjdG9yeToiK2ZlYXR1cmVGaWxlLGZlYXR1cmVGaWxlLmlzRGlyZWN0b3J5KCkpOwotCi0JCQotCQlGaWxlIGZlYXR1cmVGaWxlWE1MID0gbmV3IEZpbGUoc2l0ZSxTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCtyZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpK0ZpbGUuc2VwYXJhdG9yKyJmZWF0dXJlLnhtbCIpOwotCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiBubyBmZWF0dXJlLnhtbCIsZmVhdHVyZUZpbGVYTUwuZXhpc3RzKCkpOwotCi0JCS8vY2xlYW51cCB0YXJnZXQgCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXQpOwotCQkKLQl9Ci0KLX0KLQotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0RXhlY3V0YWJsZVBhY2thZ2VkSW5zdGFsbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEV4ZWN1dGFibGVQYWNrYWdlZEluc3RhbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQyMmNmYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0RXhlY3V0YWJsZVBhY2thZ2VkSW5zdGFsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVndWxhckluc3RhbGw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFRlc3RFeGVjdXRhYmxlUGFja2FnZWRJbnN0YWxsIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVGVzdDEKLQkgKi8KLQlwdWJsaWMgVGVzdEV4ZWN1dGFibGVQYWNrYWdlZEluc3RhbGwoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JLyoqCi0JICogV2l0aCBzaXRlLnhtbAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RGaWxlUGFja2FnZUV4ZWN1dGFibGVGZWF0dXJlU2l0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vY2xlYW51cCB0YXJnZXQgIAotCQlGaWxlIHRhcmdldCA9IG5ldyBGaWxlKFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7Ci0JCQotCQlVUkwgbmV3VVJMID0gbmV3IEZpbGUoZGF0YVBhdGggKyAiRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvc2l0ZS54bWwiKS50b1VSTCgpOwotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXdVUkwsbnVsbCk7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXNSZWYgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSxudWxsKTsKLQkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IG51bGw7Ci0JCQotCQkvLyBhdCBsZWFzdCBvbmUgZXhlY3V0YWJsZSBmZWF0dXJlIGFuZCBvbiBwYWNrYWdlZAotCQlib29sZWFuIGV4ZWNGZWF0dXJlID0gZmFsc2U7Ci0JCWJvb2xlYW4gcGFja0ZlYXR1cmUgPSBmYWxzZTsKLQotCQlpZiAoZmVhdHVyZXNSZWYubGVuZ3RoPT0wKSBmYWlsICgibm8gZmVhdHVyZSBmb3VuZCIpOwotCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzUmVmLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZW1vdGVGZWF0dXJlID0gZmVhdHVyZXNSZWZbaV0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCXJlbW92ZShyZW1vdGVGZWF0dXJlLGxvY2FsU2l0ZSk7CQkJCi0JCQlsb2NhbFNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLG51bGwpOwotCQkJCi0JCQlpZiAocmVtb3RlRmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIpIHBhY2tGZWF0dXJlID0gdHJ1ZTsKLQkJCWlmIChyZW1vdGVGZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyKSBleGVjRmVhdHVyZSA9IHRydWU7Ci0KLQkJCS8vIHZlcmlmeQotCQkJU3RyaW5nIHNpdGUgPSBsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpOwotCQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UmF3UGx1Z2luRW50cmllcygpOwotCQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOwotCQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7Ci0JCQlpZiAoIXBsdWdpbkZpbGUuZXhpc3RzKCkpIHsKLQkJCQkvL3ByaW50IG91dCBtb3JlIGZhaWx1cmUgZGV0YWlscyAtIHNlZSBidWcgMjcxMTk2Ci0JCQkJRmlsZVtdIGV4aXN0aW5nID0gcGx1Z2luRmlsZS5nZXRQYXJlbnRGaWxlKCkubGlzdEZpbGVzKCk7Ci0JCQkJU3RyaW5nIGRldGFpbCA9IGV4aXN0aW5nID09IG51bGwgPyAibm8gY2hpbGRyZW4iIDogU3RyaW5nLnZhbHVlT2YoQXJyYXlzLmFzTGlzdChleGlzdGluZykpOwotCQkJCWFzc2VydFRydWUoInBsdWdpbiBmaWxlcyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitwbHVnaW5GaWxlICsgImNoaWxkcmVuIGZvdW5kOiAiICsgZGV0YWlsLCBwbHVnaW5GaWxlLmV4aXN0cygpKTsKLQkJCX0KLQotCQkJRmlsZSBmZWF0dXJlRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiIrZmVhdHVyZUZpbGUsIGZlYXR1cmVGaWxlLmV4aXN0cygpKTsKLQotCQkJRmlsZSBmZWF0dXJlRmlsZVhNTCA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSArIEZpbGUuc2VwYXJhdG9yICsgImZlYXR1cmUueG1sIik7Ci0JCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiBubyBmZWF0dXJlLnhtbCIsIGZlYXR1cmVGaWxlWE1MLmV4aXN0cygpKTsKLQkJfQotCi0JCWlmICghZXhlY0ZlYXR1cmUgJiYgIXBhY2tGZWF0dXJlKXsKLQkJCWZhaWwoImNhbm5vdCBmaW5kIG9uZSBleGVjdXRhYmxlIGFuZCBvbmUgcGFja2FnZSBmZWF0dXJlIG9uIHRlaCBzaXRlIik7Ci0JCX0KLQotCQkvL2NsZWFudXAgdGFyZ2V0IAotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsKLQotCi0JfQotCQotCQotCS8qKgotCSAqIFdpdGhvdXQgc2l0ZS54bWwKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsZU5vU2l0ZVhNTFNpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQkvL2NsZWFudXAgdGFyZ2V0IAotCQlGaWxlIHRhcmdldCA9IG5ldyBGaWxlKFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7Ci0JCQotCQlVUkwgbmV3VVJMID0gbmV3IEZpbGUoZGF0YVBhdGggKyAiRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS8iKS50b1VSTCgpOwotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXdVUkwsbnVsbCk7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXNSZWYgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSxudWxsKTsKLQkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IG51bGw7Ci0JCQotCQkvLyBhdCBsZWFzdCBvbmUgZXhlY3V0YWJsZSBmZWF0dXJlIGFuZCBvbiBwYWNrYWdlZAotCQlib29sZWFuIGV4ZWNGZWF0dXJlID0gZmFsc2U7Ci0JCWJvb2xlYW4gcGFja0ZlYXR1cmUgPSBmYWxzZTsKLQotCQlpZiAoZmVhdHVyZXNSZWYubGVuZ3RoPT0wKSBmYWlsICgibm8gZmVhdHVyZSBmb3VuZCIpOwotCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzUmVmLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCXJlbW90ZUZlYXR1cmUgPSBmZWF0dXJlc1JlZltpXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsKLQkJCQlUaHJvd2FibGUgZTEgPSBlLmdldFN0YXR1cygpLmdldEV4Y2VwdGlvbigpOwotCQkJCVN0cmluZyBtc2cgPSBlMS5nZXRNZXNzYWdlKCkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsJy8nKTsKLQkJCQlpZiAobXNnLmluZGV4T2YoIkNWUy9mZWF0dXJlLnhtbCIpPT0tMSl7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQkJCQkKLQkJCX0KLQkJCWlmIChyZW1vdGVGZWF0dXJlIT1udWxsKXsKLQkJCQlyZW1vdmUocmVtb3RlRmVhdHVyZSxsb2NhbFNpdGUpOwotCQkJCWxvY2FsU2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsbnVsbCwgbnVsbCk7Ci0JCQkJCi0JCQkJaWYgKHJlbW90ZUZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyKSBwYWNrRmVhdHVyZSA9IHRydWU7Ci0JCQkJaWYgKHJlbW90ZUZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIpIGV4ZWNGZWF0dXJlID0gdHJ1ZTsKLQkKLQkJCQkvLyB2ZXJpZnkKLQkJCQlTdHJpbmcgc2l0ZSA9IGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCk7Ci0JCQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UmF3UGx1Z2luRW50cmllcygpOwotCQkJCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsKLQkJCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7Ci0JCQkJYXNzZXJ0VHJ1ZSgicGx1Z2luIGZpbGVzIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK3BsdWdpbkZpbGUsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOwotCQotCQkJCUZpbGUgZmVhdHVyZUZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQkJCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitmZWF0dXJlRmlsZSwgZmVhdHVyZUZpbGUuZXhpc3RzKCkpOwotCQotCQkJCUZpbGUgZmVhdHVyZUZpbGVYTUwgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvciArICJmZWF0dXJlLnhtbCIpOwotCQkJCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IG5vIGZlYXR1cmUueG1sIiwgZmVhdHVyZUZpbGVYTUwuZXhpc3RzKCkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFleGVjRmVhdHVyZSAmJiAhcGFja0ZlYXR1cmUpewotCQkJZmFpbCgiY2Fubm90IGZpbmQgb25lIGV4ZWN1dGFibGUgYW5kIG9uZSBwYWNrYWdlIGZlYXR1cmUgb24gdGVoIHNpdGUiKTsKLQkJfQotCi0JCS8vY2xlYW51cCB0YXJnZXQgCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXQpOwotCi0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0R2V0RmVhdHVyZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEdldEZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYyMDkxNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0R2V0RmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWd1bGFySW5zdGFsbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdEdldEZlYXR1cmUgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogVGVzdCB0aGUgZ2V0RmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBUZXN0R2V0RmVhdHVyZShTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEZlYXR1cmVGaWxlU2l0ZSgpIHRocm93cyBFeGNlcHRpb257Ci0JCQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFLG51bGwpOwotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlbW90ZUZlYXR1cmVzID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlpZiAocmVtb3RlRmVhdHVyZXM9PW51bGwgfHwgcmVtb3RlRmVhdHVyZXMubGVuZ3RoPT0wKSBmYWlsKCJObyBmZWF0dXJlIGF2YWlsYWJsZSBmb3IgdGVzdGluZyIpOwotCQlmb3IgKGludCBpPTA7aTxyZW1vdGVGZWF0dXJlcy5sZW5ndGg7aSsrKXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZmVhdHVyZToiK3JlbW90ZUZlYXR1cmVzW2ldLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZUhUVFBTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbnsgCi0JCQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfSFRUUF9TSVRFLG51bGwpOwotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlbW90ZUZlYXR1cmVzID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlpZiAocmVtb3RlRmVhdHVyZXM9PW51bGwgfHwgcmVtb3RlRmVhdHVyZXMubGVuZ3RoPT0wKSBmYWlsKCJObyBmZWF0dXJlIGF2YWlsYWJsZSBmb3IgdGVzdGluZyIpOwkJCi0JCWZvciAoaW50IGk9MDtpPHJlbW90ZUZlYXR1cmVzLmxlbmd0aDtpKyspewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJmZWF0dXJlOiIrcmVtb3RlRmVhdHVyZXNbaV0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCX0KLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEluc3RhbGwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RJbnN0YWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODFmODQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEluc3RhbGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJJbnN0YWxsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUxvY2FsU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlRmVhdHVyZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5Db25maWd1cmVkU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5JbnN0YWxsQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5JbnN0YWxsUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuTG9jYWxTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0SW5zdGFsbCBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFRF9GRUFUVVJFX1RZUEUgPSAicGFja2FnZWQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIFNldCBmaWxlc1RvRGVsZXRlID0gbmV3IEhhc2hTZXQoKTsKLQkKLQotCXB1YmxpYyBjbGFzcyBMaXN0ZW5lciBpbXBsZW1lbnRzIElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lciB7Ci0KLQkJcHVibGljIGJvb2xlYW4gbm90aWZpZWQgPSBmYWxzZTsKLQotCQlwdWJsaWMgdm9pZCBmZWF0dXJlSW5zdGFsbGVkKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJCW5vdGlmaWVkID0gdHJ1ZTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm90aWZpZWQgRGVmYXVsdEZlYXR1cmUgSW5zdGFsbGVkIik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBmZWF0dXJlUmVtb3ZlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBmZWF0dXJlQ29uZmlndXJlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZmVhdHVyZVVuY29uZmlndXJlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc05vdGlmaWVkKCkgewotCQkJcmV0dXJuIG5vdGlmaWVkOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFRlc3QxCi0JICovCi0JcHVibGljIFRlc3RJbnN0YWxsKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXByaXZhdGUgSUZlYXR1cmUgZ2V0RmVhdHVyZTEoSVNpdGUgc2l0ZSkKLQkJdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IG5ldyBTaXRlRmVhdHVyZVJlZmVyZW5jZSgpOwotCQlyZWYuc2V0U2l0ZShzaXRlKTsKLQkJcmVmLnNldFVSTFN0cmluZygiZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyIik7Ci0JCXJlZi5zZXRUeXBlKGdldERlZmF1bHRJbnN0YWxsYWJsZUZlYXR1cmVUeXBlKCkpOwotCQlyZWYucmVzb2x2ZShzaXRlLmdldFVSTCgpLCBudWxsKTsKLQkJcmV0dXJuIHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCX0KLQkKLQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGVTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSxudWxsKTsKLQkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IGdldEZlYXR1cmUxKHJlbW90ZVNpdGUpOwotCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFRBUkdFVF9GSUxFX1NJVEUsIG51bGwpOwotCQlmaWxlc1RvRGVsZXRlLmFkZChuZXcgRmlsZShsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpKSk7Ci0JCWxvY2FsU2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsIG51bGwpOwotCi0JCS8vIHZlcmlmeQotCQlTdHJpbmcgc2l0ZSA9IGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCk7Ci0JCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSByZW1vdGVGZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOwotCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOwotCQlmaWxlc1RvRGVsZXRlLmFkZChwbHVnaW5GaWxlKTsKLQkJYXNzZXJ0VHJ1ZSgicGx1Z2luIGZpbGVzIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK3BsdWdpbkZpbGUsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOwotCQlGaWxlIHBsdWdpblhNTEZpbGUgPQotCQkJbmV3IEZpbGUoCi0JCQkJc2l0ZSwKLQkJCQlTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lICsgRmlsZS5zZXBhcmF0b3IgKyAicGx1Z2luLnhtbCIpOwotCQlhc3NlcnRUcnVlKCJwbHVnaW4ueG1sIGZpbGUgbm90IGluc3RhbGxlZCBsb2NhbGx5IiwgcGx1Z2luWE1MRmlsZS5leGlzdHMoKSk7Ci0KLQkJRmlsZSBmZWF0dXJlRmlsZSA9Ci0JCQluZXcgRmlsZSgKLQkJCQlzaXRlLAotCQkJCVNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICi0JCQkJCSsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCWFzc2VydFRydWUoCi0JCQkiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiICsgZmVhdHVyZUZpbGUsCi0JCQlmZWF0dXJlRmlsZS5leGlzdHMoKSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SFRUUFNpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfSFRUUF9TSVRFLG51bGwpOwotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gbnVsbDsKLQotCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCB8fCBmZWF0dXJlcy5sZW5ndGggPT0gMCkKLQkJCWZhaWwoIk5vIGZlYXR1cmVzIG9uIHRoZSBzaXRlIik7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZlYXR1cmVzW2ldLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkuZW5kc1dpdGgoImZlYXR1cmVzMi5qYXIiKSkgewotCQkJCXJlbW90ZUZlYXR1cmUgPSBmZWF0dXJlc1tpXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJYXNzZXJ0Tm90TnVsbCgiQ2Fubm90IGZpbmQgZmVhdHVyZTIuamFyIG9uIHNpdGUiLCByZW1vdGVGZWF0dXJlKTsKLQkJSVNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShUQVJHRVRfRklMRV9TSVRFLCBudWxsKTsKLQkJZmlsZXNUb0RlbGV0ZS5hZGQobmV3IEZpbGUobG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKSkpOwotCQlsb2NhbFNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLCBudWxsKTsKLQotCQkvLyBmZWF0dXJlMi5qYXIgc2hvdWxkIG5vdCBiZSBpbiB0aGUgbG9jYWwgc2l0ZQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGxvY2FsRmVhdHVyZXMgPSBsb2NhbFNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJaWYgKGxvY2FsRmVhdHVyZXMgPT0gbnVsbCB8fCBsb2NhbEZlYXR1cmVzLmxlbmd0aCA9PSAwKQotCQkJZmFpbCgiTm8gZmVhdHVyZXMgb24gdGhlIHRhcmdldCBzaXRlIik7Ci0KLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsRmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChsb2NhbEZlYXR1cmVzW2ldLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkuZW5kc1dpdGgoImZlYXR1cmVzMi5qYXIiKSkgewotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWFzc2VydFRydWUoCi0JCQkiRm91bmQgZmVhdHVyZTIuamFyIG9uIHRhcmdldCBzaXRlLiBUYXJnZXQgc2l0ZSBmZWF0dXJlIHJlZiBzaG91bGRub3QgY29udGFpbiBKQVIgZmlsZSIsCi0JCQkhZm91bmQpOwotCi0JCS8vIGNoZWNrCi0JCVN0cmluZyBzaXRlID0gbG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKTsKLQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQlhc3NlcnRUcnVlKCJubyBwbHVnaW5zIGVudHJ5IiwgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCAhPSAwKSk7Ci0KLQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKLQkJZmlsZXNUb0RlbGV0ZS5hZGQocGx1Z2luRmlsZSk7Ci0JCWFzc2VydFRydWUoInBsdWdpbiBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK3BsdWdpbkZpbGUsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOwotCi0JCUZpbGUgZmVhdHVyZUZpbGUgPQotCQkJbmV3IEZpbGUoCi0JCQkJc2l0ZSwKLQkJCQlTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSAotCQkJCQkrIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5IiwgZmVhdHVyZUZpbGUuZXhpc3RzKCkpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbCgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vIGNsZWFudXAgbG9jYWwgZmlsZXMuLi4KLQkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZSgoKExvY2FsU2l0ZSlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCkpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsKLQotCQlVUkwgSU5TVEFMTF9TSVRFID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlOU1RBTExfU0lURSA9Ci0JCQkJbmV3IFVSTCgiaHR0cCIsIGdldEh0dHBIb3N0KCksIGdldEh0dHBQb3J0KCksIGJ1bmRsZS5nZXRTdHJpbmcoIkhUVFBfUEFUSF8yIikpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoSU5TVEFMTF9TSVRFLG51bGwpOwotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gbnVsbDsKLQotCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCB8fCBmZWF0dXJlcy5sZW5ndGggPT0gMCkKLQkJCWZhaWwoIk5vIGZlYXR1cmVzIG9uIHRoZSBzaXRlIik7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZlYXR1cmVzW2ldLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkuZW5kc1dpdGgoImhlbHBGZWF0dXJlLmphciIpKSB7Ci0JCQkJcmVtb3RlRmVhdHVyZSA9IGZlYXR1cmVzW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlhc3NlcnROb3ROdWxsKCJDYW5ub3QgZmluZCBoZWxwLmphciBvbiBzaXRlIiwgcmVtb3RlRmVhdHVyZSk7Ci0JCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCUlDb25maWd1cmVkU2l0ZSBzaXRlID0KLQkJCWxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdOwotCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpOwotCQlzaXRlLmFkZENvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQkoKENvbmZpZ3VyZWRTaXRlKXNpdGUpLnNldFVwZGF0YWJsZSh0cnVlKTsKLQkJCi0JCS8vIGxpc3Qgb2YgZmlsZXMgdG8gYmUgY2xlYW5lZCBhdCB0aGUgZW5kCi0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKCBzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCkgKwotCQkJCQkJCSAgRmlsZS5zZXBhcmF0b3IgKyAKLQkJCQkJCQkgIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgCi0JCQkJCQkJICByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7Ci0JCWZpbGVzVG9EZWxldGUuYWRkKGZpbGUpOwotCQlmaWxlc1RvRGVsZXRlLmFkZChsb2NhbEZpbGUpOwotCQlmaWxlc1RvRGVsZXRlLmFkZCggbmV3IEZpbGUoKChJbnN0YWxsQ29uZmlndXJhdGlvbikgbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkpLmdldFVSTCgpLmdldEZpbGUoKSkpOwotCQkKLQkJc2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsIG51bGwpOwotCi0JCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSByZW1vdGVGZWF0dXJlLmdldFJhd1BsdWdpbkVudHJpZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOwotCi0JCVN0cmluZyBzaXRlUGF0aCA9IHNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKTsKLQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlUGF0aCwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7Ci0JCWZpbGVzVG9EZWxldGUuYWRkKHBsdWdpbkZpbGUpOwotCQlpZiAoTG9jYWxlLmdldERlZmF1bHQoKS50b1N0cmluZygpLmluZGV4T2YoImZyIikgIT0gLTEpIHsKLQkJCWFzc2VydFRydWUoInBsdWdpbiBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOwkJCQotCQl9Ci0KLQkJRmlsZSBmZWF0dXJlRmlsZSA9Ci0JCQluZXcgRmlsZSgKLQkJCQlzaXRlUGF0aCwKLQkJCQlTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSAotCQkJCQkrIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5IiwgZmVhdHVyZUZpbGUuZXhpc3RzKCkpOwotCQkKLQotCQkKLQotCQlzaXRlLnJlbW92ZUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCi0JCWFzc2VydFRydWUoIkxpc3RlbmVyIGhhc24ndCByZWNlaXZlZCBub3RpZmljYXRpb24iLCBsaXN0ZW5lci5pc05vdGlmaWVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxlU2l0ZVdpdGhvdXRTaXRlWE1MKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSxudWxsKTsKLQkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IGdldEZlYXR1cmUxKHJlbW90ZVNpdGUpOwotCQkKLQkJSVNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShUQVJHRVRfRklMRV9TSVRFLG51bGwpOwotCQlsb2NhbFNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLCBudWxsKTsKLQkJCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXMgPSBsb2NhbFNpdGUuZ2V0UmF3RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJaW50IG51bWJlck9mSW5zdGFsbGVkRmVhdHVyZXMgPSBmZWF0dXJlcy5sZW5ndGg7Ci0KLQkJRmlsZSBmaWxlID0KLQkJCW5ldyBGaWxlKAotCQkJCWxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCkKLQkJCQkJKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkrIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICi0JCQkJCSsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOwotCQlmaWxlc1RvRGVsZXRlLmFkZChmaWxlKTsKLQkJZmlsZSA9Ci0JCQluZXcgRmlsZSgKLQkJCQlsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpCi0JCQkJCSsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJKyBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEgKLQkJCQkJKyAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNiIpOwotCQlmaWxlc1RvRGVsZXRlLmFkZChmaWxlKTsKLQkJZmlsZSA9Ci0JCQluZXcgRmlsZSgKLQkJCQlsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpCi0JCQkJCSsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJKyBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEgKLQkJCQkJKyAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMCIpOwotCQlmaWxlc1RvRGVsZXRlLmFkZChmaWxlKTsKLQkJZmlsZSA9IG5ldyBGaWxlKCgoTG9jYWxTaXRlKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7Ci0JCWZpbGVzVG9EZWxldGUuYWRkKGZpbGUpOwotCi0JCQotCQlpZiAobnVtYmVyT2ZJbnN0YWxsZWRGZWF0dXJlcyA9PSAwKQotCQkJZmFpbCgiVGhlIGxvY2FsIHNpdGUgZG9lcyBub3QgY29udGFpbiBmZWF0dXJlLCBzaG91bGQgbm90IGNvbnRhaW4gYW4gWE1MIGZpbGUgYnV0IGZlYXR1cmVzIHNob3VsZCBiZSBmb3VuZCBhbnl3YXkgYnkgcGFyc2luZyIpOwotCQlpZiAobG9jYWxTaXRlLyouZ2V0U2l0ZSgpKi8uZ2V0QXJjaGl2ZXMoKS5sZW5ndGggPT0gMCkKLQkJCWZhaWwoIlRoZSBsb2NhbCBzaXRlIGRvZXMgbm90IGNvbnRhaW4gYXJjaGl2ZXMsIHNob3VsZCBub3QgY29udGFpbiBhbiBYTUwgZmlsZSBidXQgYXJjaGl2ZXMgc2hvdWxkIGJlIGZvdW5kIGFueXdheSBieSBwYXJzaW5nIik7Ci0JCQotCQl0cnkgewotCQkJU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyIpLG51bGwpOwotCQkJZmFpbCgiVGhlIHNpdGUgY29udGFpbnMgc2l0ZS54bWwuLi4gaXQgc2hvdWxkIGJlIGFuIEhUVFAgc2l0ZSB3aXRob3V0IGFuIFhNTCBmaWxlIik7CQkJCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCi0JfQotCi0JLyoKLQkgKiBAc2VlIElTaXRlI2dldERlZmF1bHRJbnN0YWxsYWJsZUZlYXR1cmVUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRJbnN0YWxsYWJsZUZlYXR1cmVUeXBlKCkgewotCQlTdHJpbmcgcGx1Z2luSUQgPQotCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSArICIuIjsKLQkJcmV0dXJuIHBsdWdpbklEICsgUEFDS0FHRURfRkVBVFVSRV9UWVBFOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1bVRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUl0ZXJhdG9yIGZpbGVzID0gZmlsZXNUb0RlbGV0ZS5pdGVyYXRvcigpOwkJCi0JCXdoaWxlKGZpbGVzLmhhc05leHQoKSkgewotCQkJRmlsZSBmaWxlID0gKEZpbGUpZmlsZXMubmV4dCgpOwotCQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOwkJCQotCQl9Ci0JCWZpbGVzVG9EZWxldGUuY2xlYXIoKTsKLQkJCi0JCUluc3RhbGxSZWdpc3RyeS5jbGVhbnVwKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0SW5zdGFsbFVSTFNJdGVYTUwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RJbnN0YWxsVVJMU0l0ZVhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWVjYTBlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RJbnN0YWxsVVJMU0l0ZVhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVndWxhckluc3RhbGw7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy4qOwotCi1wdWJsaWMgY2xhc3MgVGVzdEluc3RhbGxVUkxTSXRlWE1MIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VEX0ZFQVRVUkVfVFlQRSA9ICJwYWNrYWdlZCI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwdWJsaWMgY2xhc3MgTGlzdGVuZXIgaW1wbGVtZW50cyBJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIgewotCi0JCXB1YmxpYyBib29sZWFuIG5vdGlmaWVkID0gZmFsc2U7Ci0KLQkJcHVibGljIHZvaWQgZmVhdHVyZUluc3RhbGxlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCQlub3RpZmllZCA9IHRydWU7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vdGlmaWVkIERlZmF1bHRGZWF0dXJlIEluc3RhbGxlZCIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZmVhdHVyZVJlbW92ZWQoSUZlYXR1cmUgZmVhdHVyZSkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgZmVhdHVyZUNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGZlYXR1cmVVbmNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSkgewotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNOb3RpZmllZCgpIHsKLQkJCXJldHVybiBub3RpZmllZDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBUZXN0MQotCSAqLwotCXB1YmxpYyBUZXN0SW5zdGFsbFVSTFNJdGVYTUwoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHJpdmF0ZSBJRmVhdHVyZSBnZXRGZWF0dXJlMShJU2l0ZSBzaXRlKQotCQl0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7Ci0JCXJlZi5zZXRTaXRlKHNpdGUpOwotCQlyZWYuc2V0VVJMU3RyaW5nKCJmZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMV8xLjAuNC5qYXIiKTsKLQkJcmVmLnNldFR5cGUoSVNpdGUuREVGQVVMVF9QQUNLQUdFRF9GRUFUVVJFX1RZUEUpOwotCQlyZWYucmVzb2x2ZShzaXRlLmdldFVSTCgpLCBudWxsKTsKLQkJcmV0dXJuIHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxlU2l0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUlTaXRlIHJlbW90ZVNpdGUgPQotCQkJU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsIFNpdGUuU0lURV9YTUwpLHRydWUsbnVsbCk7Ci0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBnZXRGZWF0dXJlMShyZW1vdGVTaXRlKTsKLQkJVVJMIHVybCA9IFRBUkdFVF9GSUxFX1NJVEU7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKTsKLQkJaWYgKCFmaWxlLmV4aXN0cygpKSBmaWxlLm1rZGlycygpOwotCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKHVybCx0cnVlLG51bGwpOwotCQlyZW1vdmUocmVtb3RlRmVhdHVyZSxsb2NhbFNpdGUpOwotCQlsb2NhbFNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLCBudWxsKTsKLQotCQkvLyB2ZXJpZnkKLQkJU3RyaW5nIHNpdGUgPSBUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKTsKLQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQlhc3NlcnRUcnVlKCJubyBwbHVnaW5zIGVudHJ5IiwgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCAhPSAwKSk7Ci0JCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7Ci0JCWFzc2VydFRydWUoInBsdWdpbiBmaWxlcyBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBwbHVnaW5GaWxlLmV4aXN0cygpKTsKLQkJRmlsZSBwbHVnaW5YTUxGaWxlID0KLQkJCW5ldyBGaWxlKAotCQkJCXNpdGUsCi0JCQkJU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSArIEZpbGUuc2VwYXJhdG9yICsgInBsdWdpbi54bWwiKTsKLQkJYXNzZXJ0VHJ1ZSgicGx1Z2luLnhtbCBmaWxlIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIHBsdWdpblhNTEZpbGUuZXhpc3RzKCkpOwotCi0JCUZpbGUgZmVhdHVyZUZpbGUgPQotCQkJbmV3IEZpbGUoCi0JCQkJc2l0ZSwKLQkJCQlTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSAotCQkJCQkrIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQlhc3NlcnRUcnVlKAotCQkJImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IiArIGZlYXR1cmVGaWxlLAotCQkJZmVhdHVyZUZpbGUuZXhpc3RzKCkpOwotCQkvL2NsZWFudXAKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHBsdWdpbkZpbGUpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUobG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKSkpOwotCQlJbnN0YWxsUmVnaXN0cnkuY2xlYW51cCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RIVFRQU2l0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vIGNsZWFuCi0JCUZpbGUgdGFyZ2V0RmlsZSAgPSBuZXcgRmlsZShUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXRGaWxlKTsKLQkJSW5zdGFsbFJlZ2lzdHJ5LmNsZWFudXAoKTsKLQotCQlJU2l0ZSByZW1vdGVTaXRlID0KLQkJCVNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTChTT1VSQ0VfSFRUUF9TSVRFLCBTaXRlLlNJVEVfWE1MKSx0cnVlLG51bGwpOwotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gbnVsbDsKLQotCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCB8fCBmZWF0dXJlcy5sZW5ndGggPT0gMCkKLQkJCWZhaWwoIk5vIGZlYXR1cmVzIG9uIHRoZSBzaXRlIik7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZlYXR1cmVzW2ldLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkuZW5kc1dpdGgoImZlYXR1cmVzMi5qYXIiKSkgewotCQkJCXJlbW90ZUZlYXR1cmUgPSBmZWF0dXJlc1tpXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJYXNzZXJ0Tm90TnVsbCgiQ2Fubm90IGZpbmQgZmVhdHVyZTIuamFyIG9uIHNpdGUiLCByZW1vdGVGZWF0dXJlKTsKLQkJVVJMIHVybCA9IFRBUkdFVF9GSUxFX1NJVEU7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKTsKLQkJaWYgKCFmaWxlLmV4aXN0cygpKSBmaWxlLm1rZGlycygpOwotCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKHVybCx0cnVlLG51bGwpOwotCQlsb2NhbFNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLCBudWxsKTsKLQotCQkvLyBmZWF0dXJlMi5qYXIgc2hvdWxkIG5vdCBiZSBpbiB0aGUgbG9jYWwgc2l0ZQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGxvY2FsRmVhdHVyZXMgPSBsb2NhbFNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJaWYgKGxvY2FsRmVhdHVyZXMgPT0gbnVsbCB8fCBsb2NhbEZlYXR1cmVzLmxlbmd0aCA9PSAwKQotCQkJZmFpbCgiTm8gZmVhdHVyZXMgb24gdGhlIHRhcmdldCBzaXRlIik7Ci0KLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsRmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChsb2NhbEZlYXR1cmVzW2ldLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkuZW5kc1dpdGgoImZlYXR1cmVzMi5qYXIiKSkgewotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWFzc2VydFRydWUoCi0JCQkiRm91bmQgZmVhdHVyZTIuamFyIG9uIHRhcmdldCBzaXRlLiBUYXJnZXQgc2l0ZSBmZWF0dXJlIHJlZiBzaG91bGRub3QgY29udGFpbiBKQVIgZmlsZSIsCi0JCQkhZm91bmQpOwotCi0JCS8vIGNoZWNrCi0JCVN0cmluZyBzaXRlID0gVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCk7Ci0JCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSByZW1vdGVGZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOwotCi0JCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7Ci0JCWFzc2VydFRydWUoInBsdWdpbiBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOwotCi0JCUZpbGUgZmVhdHVyZUZpbGUgPQotCQkJbmV3IEZpbGUoCi0JCQkJc2l0ZSwKLQkJCQlTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSAotCQkJCQkrIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5IiwgZmVhdHVyZUZpbGUuZXhpc3RzKCkpOwotCi0JCS8vbG9jYWxTaXRlLnNhdmUoKTsKLQotCQkvL2NsZWFudXAKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHBsdWdpbkZpbGUpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUobG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKSkpOwotCQlJbnN0YWxsUmVnaXN0cnkuY2xlYW51cCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy8gY2xlYW51cCBsb2NhbCBmaWxlcy4uLgotCQlMb2NhbFNpdGUgc2l0ZUxvY2FsID0gKChMb2NhbFNpdGUpIFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKTsKLQkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZShzaXRlTG9jYWwuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCkpOwotCQkvL2lmICghbG9jYWxGaWxlLmV4aXN0cygpKSBmYWlsKCJMb2NhbFNpdGUgZmlsZSBkb2Vzbid0IGV4aXN0IC0+Iitsb2NhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkrIjwtIik7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkJCi0JCS8qCi0JCWxvY2FsRmlsZSA9IG5ldyBGaWxlKGxvY2FsRmlsZSxMb2NhbFNpdGUuU0lURV9MT0NBTF9GSUxFKTsKLQkJaWYgKCFsb2NhbEZpbGUuZXhpc3RzKCkpIGZhaWwoIkxvY2FsU2l0ZS54bWwgZG9lc24ndCBleGlzdDoiK2xvY2FsRmlsZSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwotCQkqLwotCQkKLQkJSW50ZXJuYWxTaXRlTWFuYWdlci5sb2NhbFNpdGUgPSBudWxsOwotCi0JCVVSTCBJTlNUQUxMX1NJVEUgPSBudWxsOwotCQl0cnkgewotCQkJSU5TVEFMTF9TSVRFID0KLQkJCQluZXcgVVJMKCJodHRwIiwgZ2V0SHR0cEhvc3QoKSwgZ2V0SHR0cFBvcnQoKSwgYnVuZGxlLmdldFN0cmluZygiSFRUUF9QQVRIXzIiKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKGUudG9TdHJpbmcoKSk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoSU5TVEFMTF9TSVRFLHRydWUsbnVsbCk7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXMgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBudWxsOwotCi0JCWlmIChmZWF0dXJlcyA9PSBudWxsIHx8IGZlYXR1cmVzLmxlbmd0aCA9PSAwKQotCQkJZmFpbCgiTm8gZmVhdHVyZXMgb24gdGhlIHNpdGUiKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmVhdHVyZXNbaV0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKS5lbmRzV2l0aCgiaGVscEZlYXR1cmUuamFyIikpIHsKLQkJCQlyZW1vdGVGZWF0dXJlID0gZmVhdHVyZXNbaV0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWFzc2VydE5vdE51bGwoIkNhbm5vdCBmaW5kIGhlbHAuamFyIG9uIHNpdGUiLCByZW1vdGVGZWF0dXJlKTsKLQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPSBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKTsKLQkJc2l0ZS5hZGRDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJKChDb25maWd1cmVkU2l0ZSlzaXRlKS5zZXRVcGRhdGFibGUodHJ1ZSk7Ci0JCXNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLCBudWxsKTsKLQotCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRSYXdQbHVnaW5FbnRyaWVzKCk7Ci0JCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsKLQotCQlTdHJpbmcgc2l0ZVBhdGggPSBzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCk7Ci0JCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZVBhdGgsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOwotCQlpZiAoTG9jYWxlLmdldERlZmF1bHQoKS50b1N0cmluZygpLmluZGV4T2YoImZyIikgIT0gLTEpCi0JCQlhc3NlcnRUcnVlKCJwbHVnaW4gaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitwbHVnaW5GaWxlLCBwbHVnaW5GaWxlLmV4aXN0cygpKTsKLQotCQlGaWxlIGZlYXR1cmVGaWxlID0KLQkJCW5ldyBGaWxlKAotCQkJCXNpdGVQYXRoLAotCQkJCVNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICi0JCQkJCSsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCWlmIChMb2NhbGUuZ2V0RGVmYXVsdCgpLnRvU3RyaW5nKCkuaW5kZXhPZigiZnIiKSAhPSAtMSB8fAotCQkJCUxvY2FsZS5nZXREZWZhdWx0KCkudG9TdHJpbmcoKS5pbmRleE9mKCJ1cyIpICE9IC0xIHx8Ci0JCQkJTG9jYWxlLmdldERlZmF1bHQoKS50b1N0cmluZygpLmluZGV4T2YoImRlIikgIT0gLTEpCi0JCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBmZWF0dXJlRmlsZS5leGlzdHMoKSk7Ci0KLQkJLy9jbGVhbnVwCi0JCUZpbGUgZmlsZSA9Ci0JCQluZXcgRmlsZSgKLQkJCQlzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCkKLQkJCQkJKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkrIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICi0JCQkJCSsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShwbHVnaW5GaWxlKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSgKLQkJCW5ldyBGaWxlKAotCQkJCSgoSW5zdGFsbENvbmZpZ3VyYXRpb24pIGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpKQotCQkJCQkuZ2V0VVJMKCkKLQkJCQkJLmdldEZpbGUoKSkpOwotCQlJbnN0YWxsUmVnaXN0cnkuY2xlYW51cCgpOwotCQkKLQkJc2l0ZS5yZW1vdmVDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoIkxpc3RlbmVyIGhhc24ndCByZWNlaXZlZCBub3RpZmljYXRpb24iLCBsaXN0ZW5lci5pc05vdGlmaWVkKCkpOwotCX0KLQotLy8JcHVibGljIHZvaWQgdGVzdEZpbGVTaXRlV2l0aG91dFNpdGVYTUwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCi0vLwkJSVNpdGUgcmVtb3RlU2l0ZSA9Ci0vLwkJCVNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFLCBTaXRlLlNJVEVfWE1MKSx0cnVlLG51bGwpOwotLy8JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBnZXRGZWF0dXJlMShyZW1vdGVTaXRlKTsKLS8vCQlJQ29uZmlndXJlZFNpdGUgbG9jYWxTaXRlID0KLS8vCQkJU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsKLS8vCQlsb2NhbFNpdGUuZ2V0U2l0ZSgpLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCwgbnVsbCk7Ci0vLwotLy8JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXMgPSBsb2NhbFNpdGUuZ2V0U2l0ZSgpLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0vLwkJaWYgKGZlYXR1cmVzLmxlbmd0aCA9PSAwKQotLy8JCQlmYWlsKCJUaGUgbG9jYWwgc2l0ZSBkb2VzIG5vdCBjb250YWluIGZlYXR1cmUsIHNob3VsZCBub3QgY29udGFpbiBhbiBYTUwgZmlsZSBidXQgZmVhdHVyZXMgc2hvdWxkIGJlIGZvdW5kIGFueXdheSBieSBwYXJzaW5nIik7Ci0vLwkJaWYgKGxvY2FsU2l0ZS5nZXRTaXRlKCkuZ2V0QXJjaGl2ZXMoKS5sZW5ndGggPT0gMCkKLS8vCQkJZmFpbCgiVGhlIGxvY2FsIHNpdGUgZG9lcyBub3QgY29udGFpbiBhcmNoaXZlcywgc2hvdWxkIG5vdCBjb250YWluIGFuIFhNTCBmaWxlIGJ1dCBhcmNoaXZlcyBzaG91bGQgYmUgZm91bmQgYW55d2F5IGJ5IHBhcnNpbmciKTsKLS8vCi0vLwkJLy9jbGVhbnVwCi0vLwkJRmlsZSBmaWxlID0KLS8vCQkJbmV3IEZpbGUoCi0vLwkJCQlsb2NhbFNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKQotLy8JCQkJCSsgRmlsZS5zZXBhcmF0b3IKLS8vCQkJCQkrIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICi0vLwkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7Ci0vLwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOwotLy8JCWZpbGUgPQotLy8JCQluZXcgRmlsZSgKLS8vCQkJCWxvY2FsU2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpCi0vLwkJCQkJKyBGaWxlLnNlcGFyYXRvcgotLy8JCQkJCSsgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRICi0vLwkJCQkJKyAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNiIpOwotLy8JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsKLS8vCQlmaWxlID0KLS8vCQkJbmV3IEZpbGUoCi0vLwkJCQlsb2NhbFNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKQotLy8JCQkJCSsgRmlsZS5zZXBhcmF0b3IKLS8vCQkJCQkrIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSAotLy8JCQkJCSsgIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAiKTsKLS8vCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7Ci0vLwkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZSgoKExvY2FsU2l0ZSlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCkpOwotLy8JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwotLy8KLS8vCX0KLQotCS8qKgotCSogCi0JKi8KLS8vCXByaXZhdGUgRmVhdHVyZSBjcmVhdGVQYWNrYWdlZEZlYXR1cmUoVVJMIHVybCwgSVNpdGUgc2l0ZSkKLS8vCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0vLwkJU3RyaW5nIHBhY2thZ2VkRmVhdHVyZVR5cGUgPSBJU2l0ZS5ERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRTsKLS8vCQlGZWF0dXJlIHJlc3VsdCA9IG51bGw7Ci0vLwkJaWYgKHBhY2thZ2VkRmVhdHVyZVR5cGUgIT0gbnVsbCkgewotLy8JCQlJRmVhdHVyZUZhY3RvcnkgZmFjdG9yeSA9Ci0vLwkJCQlGZWF0dXJlVHlwZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRGYWN0b3J5KHBhY2thZ2VkRmVhdHVyZVR5cGUpOwotLy8JCQlyZXN1bHQgPSAoRmVhdHVyZSkgZmFjdG9yeS5jcmVhdGVGZWF0dXJlKHVybCwgc2l0ZSk7Ci0vLwkJfQotLy8JCXJldHVybiByZXN1bHQ7Ci0vLwl9Ci0JLyoKLQkgKiBAc2VlIElTaXRlI2dldERlZmF1bHRJbnN0YWxsYWJsZUZlYXR1cmVUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRJbnN0YWxsYWJsZUZlYXR1cmVUeXBlKCkgewotCQlTdHJpbmcgcGx1Z2luSUQgPQotCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXREZXNjcmlwdG9yKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpICsgIi4iOwotCQlyZXR1cm4gcGx1Z2luSUQgKyBQQUNLQUdFRF9GRUFUVVJFX1RZUEU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0TG9jYWxTaXRlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0TG9jYWxTaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YjA0MTEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdExvY2FsU2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVndWxhckluc3RhbGw7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy4qOwotCi1wdWJsaWMgY2xhc3MgVGVzdExvY2FsU2l0ZSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JCi0JLyoqCi0JICogVGVzdCB0aGUgZ2V0RmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBUZXN0TG9jYWxTaXRlKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRpb25Db25maWdGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy9jbGVhbiB1cAotCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKCgoTG9jYWxTaXRlKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkKLQkJSW50ZXJuYWxTaXRlTWFuYWdlci5sb2NhbFNpdGU9bnVsbDsJCi0KLQotCQlJTG9jYWxTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJc2l0ZS5zYXZlKCk7Ci0JCWFzc2VydFRydWUoImNvbmZpZyBmaWxlIGhhc24ndCBiZWVuIHNhdmVkIGluIDoiK2xvY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgbG9jYWxGaWxlLmV4aXN0cygpKTsKLQkJCi0JCS8vIGNsZWFudXAKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkKLQkJCi0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRDb25maWdGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy9jbGVhbiB1cAotCi0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQotCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmxvY2FsU2l0ZT1udWxsOwotCi0JCUlMb2NhbFNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQlhc3NlcnRUcnVlKCJUaGUgbG9jYWwgc2l0ZSBkb2VzIG5vdCBjb250YWluIGFuIGhpc3Rvcnkgb2YgaW5zdGFsbCBjb25maWd1cmF0aW9uIixzaXRlLmdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkubGVuZ3RoIT0wKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGxvY2FsIHNpdGUgZG9lcyBub3QgY29udGFpbiBhbiBjdXJyZW50IGluc3RhbGwgY29uZmlndXJhdGlvbiIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpIT1udWxsKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGxvY2FsIHNpdGUgZG9lcyBub3QgY29udGFpbiBhIGRlZmF1bHQgY29uZmlndXJhdGlvbiBzaXRlIGZvciB0aGUgY3VycmVudCBpbnN0YWxsIGNvbmZpZyIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpLmxlbmd0aCE9MCk7Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRlZmF1bHQgQ29uZmlnIFNpdGUgaXMgOiIrc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdLmdldFNpdGUoKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJCi0JCS8vIGNsZWFudXAJCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkJCi0JCQotCi0JfQotCQotLyoJcHVibGljIHZvaWQgdGVzdEluc3RhbGxGZWF0dXJlU2F2ZUNvbmZpZygpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vY2xlYW4gdXAKLQkJTG9jYWxTaXRlIHNpdGVMb2NhbCA9IChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCVVSTCBuZXdVUkwgPSBuZXcgVVJMKHNpdGVMb2NhbC5nZXRMb2NhdGlvblVSTCgpLExvY2FsU2l0ZS5TSVRFX0xPQ0FMX0ZJTEUpOwotCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKG5ld1VSTC5nZXRGaWxlKCkpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKG5ldyBGaWxlKCgoSW5zdGFsbENvbmZpZ3VyYXRpb24pc2l0ZUxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkpLmdldFVSTCgpLmdldEZpbGUoKSkpOwkKLQkJSW50ZXJuYWxTaXRlTWFuYWdlci5sb2NhbFNpdGU9bnVsbDsJCQotCi0JCUlMb2NhbFNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFX0lOU1RBTExFRCk7Ci0JCUlGZWF0dXJlIGZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF0uZ2V0RmVhdHVyZSgpOwotCQlpbnQgb2xkTnVtYmVyID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpLmxlbmd0aDsKLQkJCi0JCS8vIHdlIGFyZSBub3QgY2hlY2tpbmcgaWYgdGhpcyBpcyByZWFkIG9ubHkKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIG5ld0NvbmZpZyA9IHNpdGUuY2xvbmVDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQluZXdDb25maWcuc2V0TGFiZWwoIm5ldyBMYWJlbCIpOwkJCi0JCS8vSUluc3RhbGxDb25maWd1cmF0aW9uIG5ld0NvbmZpZyA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUgPSBuZXdDb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07Ci0JCUNvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCBjb25maWdQb2xpY3kgPSBuZXcgQmFzZVNpdGVMb2NhbEZhY3RvcnkoKS5jcmVhdGVDb25maWd1cmF0aW9uUG9saWN5TW9kZWwoKTsKLQkJY29uZmlnUG9saWN5LnNldFBvbGljeShJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlUG9saWN5LlVTRVJfSU5DTFVERSk7Ci0JCSgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZSkuc2V0Q29uZmlndXJhdGlvblBvbGljeSgoQ29uZmlndXJhdGlvblBvbGljeSljb25maWdQb2xpY3kpOwotCQlpbnQgb2xkTnVtYmVyT2ZoaXN0b3J5ID0gc2l0ZS5nZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpLmxlbmd0aDsJCQotCQlzaXRlLmFkZENvbmZpZ3VyYXRpb24obmV3Q29uZmlnKTsJCi0JCWFzc2VydE5vdE51bGwoZmVhdHVyZSk7CQotCi0JCSgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZSkuaXNVcGRhdGFibGUodHJ1ZSk7Ci0JCXJlbW92ZShmZWF0dXJlLGNvbmZpZ1NpdGUpOwkJCQkKLQkJY29uZmlnU2l0ZS5pbnN0YWxsKGZlYXR1cmUsbnVsbCxudWxsKTsKLQkJCQkKLQkJLy8gdGVoIGN1cnJlbnQgb25lIHBvaW50cyB0byBhIHJlYWwgZmF0dXJlCi0JCS8vIGRvZXMgbm90IHRocm93IGVycm9yLgotCQlJQ29uZmlndXJlZFNpdGUgY29uZmlnU2l0ZTIgPSBzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07Ci0JCWFzc2VydFRydWUoIk5vIENvbmZpZ3VyZWQgZmVhdHVyZXMgZm91bmQiLGNvbmZpZ1NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCkubGVuZ3RoPjApOwotCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBjb25maWdTaXRlMi5nZXRDb25maWd1cmVkRmVhdHVyZXMoKVswXTsKLQkJSUZlYXR1cmUgZmVhdHVyZTIgPSByZWYuZ2V0RmVhdHVyZSgpOwotCQkvL1N0cmluZyBjb25maWd1cmVkRmVhdHVyZSA9IGZlYXR1cmUyLmdldExhYmVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKGZlYXR1cmUyLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpLCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlM18xLjAuMCIpOwotCQlhc3NlcnRUcnVlKCJXcm9uZyBpZCAgdmVyc2lvbiBvZiBmZWF0dXJlIixmZWF0dXJlMi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlM18xLjAuMCIpKTsKLQkJCi0JCS8vIG9ubHkgb25lIGZlYXR1cmUgY29uZmlndXJlZAotCQlhc3NlcnRUcnVlKCJ0b28gbWFueSBmZWF0dXJlcyBjb25maWd1cmVkIixjb25maWdTaXRlMi5nZXRDb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGg9PTEpOwotCQkKLQkJLy8gbm8gZmVhdHVyZSB1bmNvbmZpZ3VyZWQKLQkJYXNzZXJ0VHJ1ZSgidG9vIG1hbnkgdW5jb25maWd1cmVkIGZlYXR1cmVzIiwoKENvbmZpZ3VyZWRTaXRlKWNvbmZpZ1NpdGUyKS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCkuZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGg9PTApOwotCQkKLQkJLy8gdGVzdCBvbmx5IDIgaW5zdGFsbCBjb25maWcgaW4gbG9jYWwgc2l0ZQotCQkvL2Fzc2VydEVxdWFscygid3JvbmcgbnVtYmVyIG9mIGhpc3RvcnkgaW4gTG9jYWwgc2l0ZToiLG9sZE51bWJlck9maGlzdG9yeSsxLHNpdGUuZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKS5sZW5ndGgpOwotCQkKLQkJLy8gdGVzdCBzYW1lICMgb2Ygc2l0ZXMgaW4gY3VycmVudCBjb25maWcKLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGNvbmZpZyBzaXRlcyBpbiBjdXJyZW50IGNvbmZpZyIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpLmxlbmd0aD09b2xkTnVtYmVyKTsKLQkJCi0JCS8vdGVzdCBvbmx5IG9uZSBmZWF0dXJlIGZvciB0aGUgc2l0ZQotCQlhc3NlcnRUcnVlKCJ3cm9uZyBudW1iZXIgb2YgY29uZmlndXJlZCBmZWF0dXJlcyBmb3IgY29uZmlnIHNpdGUiLHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGg9PTEpOwotCQkKLQkJLy8gdGVzdCBvbmx5IDIgYWN0aXZpdGllcwotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgYWN0aXZpdGllcyBmb3IgaW5zdGFsbCBjb25maWciLHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRBY3Rpdml0aWVzKCkubGVuZ3RoPT0yKTsKLQotCQlzaXRlLnNhdmUoKTsJCQotCi0JCS8vIGNoZWNrCi0JCS8vIHRoZXJlIGFyZSAyIGNvbmZpZ3VyYXRpb24KLQkJU3RyaW5nIHRpbWUgPSAiIitzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q3JlYXRpb25EYXRlKCkuZ2V0VGltZSgpOwotCQlVUkwgbG9jYXRpb24gPSAoKExvY2FsU2l0ZSlzaXRlKS5nZXRMb2NhdGlvblVSTCgpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLCJDb25maWciK3RpbWUrIi54bWwiKS5nZXRGaWxlKCkpOwotCQlhc3NlcnRUcnVlKCJuZXcgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBleGlzdCIsIGZpbGUuZXhpc3RzKCkpOwotCQkKLQkJLy8gY2xlYW51cAotCQlsb2NhbEZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLExvY2FsU2l0ZS5TSVRFX0xPQ0FMX0ZJTEUpLmdldEZpbGUoKSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkJCi0JCWxvY2FsRmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwobG9jYXRpb24sTG9jYWxTaXRlLkRFRkFVTFRfQ09ORklHX0ZJTEUpLmdldEZpbGUoKSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkKLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUobmV3IFVSTChsb2NhdGlvbixTaXRlLkRFRkFVTFRfRkVBVFVSRV9QQVRIK0ZpbGUuc2VwYXJhdG9yK2ZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpLmdldEZpbGUoKSk7CQkKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQotCQlsb2NhbEZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLFNpdGUuREVGQVVMVF9GRUFUVVJFX1BBVEgrRmlsZS5zZXBhcmF0b3IrZmVhdHVyZTIuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpLmdldEZpbGUoKSk7CQkKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7CQkKLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUoZmVhdHVyZTIuZ2V0VVJMKCkuZ2V0RmlsZSgpKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7Ci0JfQotKi8KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmV0cml2ZUNvbmZpZygpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vY2xlYW4gdXAKLQkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZSgoKExvY2FsU2l0ZSlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCkpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCi0JCUludGVybmFsU2l0ZU1hbmFnZXIubG9jYWxTaXRlPW51bGw7CQkKLQotCQlJTG9jYWxTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURV9JTlNUQUxMRUQsbnVsbCk7Ci0JCUlGZWF0dXJlIGZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF0uZ2V0RmVhdHVyZShudWxsKTsKLQkJaW50IG9sZE51bWJlciA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKS5sZW5ndGg7CQkKLQkJCi0JCS8vIHdlIGFyZSBub3QgY2hlY2tpbmcgaWYgdGhpcyBpcyByZWFkIG9ubHkKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIG5ld0NvbmZpZyA9IHNpdGUuY2xvbmVDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQluZXdDb25maWcuc2V0TGFiZWwoIm5ldyBMYWJlbCIpOwkJCi0JCUlDb25maWd1cmVkU2l0ZSBjb25maWdTaXRlID0gbmV3Q29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdOwotCQlDb25maWd1cmF0aW9uUG9saWN5TW9kZWwgY29uZmlnUG9saWN5ID0gbmV3IEJhc2VTaXRlTG9jYWxGYWN0b3J5KCkuY3JlYXRlQ29uZmlndXJhdGlvblBvbGljeU1vZGVsKCk7Ci0JCWNvbmZpZ1BvbGljeS5zZXRQb2xpY3koSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUpOwotCQkoKENvbmZpZ3VyZWRTaXRlKWNvbmZpZ1NpdGUpLnNldENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbChjb25maWdQb2xpY3kpOwkKLQkJc2l0ZS5hZGRDb25maWd1cmF0aW9uKG5ld0NvbmZpZyk7Ci0JCWFzc2VydE5vdE51bGwoZmVhdHVyZSk7CQkJCi0JCQotCQkoKENvbmZpZ3VyZWRTaXRlKWNvbmZpZ1NpdGUpLnNldFVwZGF0YWJsZSh0cnVlKTsKLQkJcmVtb3ZlKGZlYXR1cmUsY29uZmlnU2l0ZSk7CQkJCi0JCWNvbmZpZ1NpdGUuaW5zdGFsbChmZWF0dXJlLG51bGwsbnVsbCk7Ci0JCXNpdGUuc2F2ZSgpOwotCQkKLQkJLy8gd2UgY3JlYXRlZCB0aGUgc2Vjb25kIHhtbCBmaWxlCi0KLQkJLy9kbyBub3QgY2xlYW51cCwgd2Ugd2FudCB0byByZXVzZSBwcmV2aW91c2x5IGNyZWF0ZWQgbG9jYWwgc2l0ZQotCQkvLyBidXQgZm9yY2UgcmUtcmVhZCBvZiB4bWwgRmlsZQotCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmxvY2FsU2l0ZT1udWxsOwotCQlzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCQotCQkvLyBjaGVjawotCQkvLyB0aGVyZSBhcmUgMiBjb25maWd1cmF0aW9uCi0JCVVSTCBsb2NhdGlvbiA9ICgoTG9jYWxTaXRlKXNpdGUpLmdldExvY2F0aW9uVVJMKCk7CQkKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUobmV3IFVSTChsb2NhdGlvbiwicGxhdGZvcm0ueG1sIikuZ2V0RmlsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgibmV3IGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgZXhpc3QiLCBmaWxlLmV4aXN0cygpKTsKLQkJCi0JCS8vIHRlaCBjdXJyZW50IG9uZSBwb2ludHMgdG8gYSByZWFsIGZhdHVyZQotCQkvLyBkb2VzIG5vdCB0aHJvdyBlcnJvci4KLQkJSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUyID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdOwotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBjb25maWdTaXRlMi5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJSUZlYXR1cmUgZmVhdHVyZTIgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCUlGZWF0dXJlIGZlYXR1cmUzID0gcmVmc1tpXS5nZXRGZWF0dXJlKG51bGwpOwkJCQotCQkJaWYgKCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlM18xLjAuMCIuZXF1YWxzKGZlYXR1cmUzLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKSl7Ci0JCQkJZmVhdHVyZTIgPSBmZWF0dXJlMzsKLQkJCQlicmVhazsKLQkJCX0JCQotCQl9Ci0JCWFzc2VydE5vdE51bGwoIkZlYXR1cmUgMiBpcyBOdWxsIixmZWF0dXJlMik7Ci0JCWFzc2VydFRydWUoIldyb25nIGlkICB2ZXJzaW9uIG9mIGZlYXR1cmUiLGZlYXR1cmUyLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UoIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUzXzEuMC4wIikpOwotCQkKLQkJLy8gdGVzdCBvbmx5IDIgaW5zdGFsbCBjb25maWcgaW4gbG9jYWwgc2l0ZQotLy8JCWFzc2VydEVxdWFscygid3JvbmcgbnVtYmVyIG9mIGhpc3RvcnkgaW4gTG9jYWwgc2l0ZToiLG9sZE51bWJlck9maGlzdG9yeSsxLHNpdGUuZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKS5sZW5ndGgpOwotCQkKLQkJLy8gdGVzdCAjIG9mIHNpdGVzIGluIGN1cnJlbnQgY29uZmlnCi0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBjb25maWcgc2l0ZXMgaW4gY3VycmVudCBjb25maWciLHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKS5sZW5ndGg9PW9sZE51bWJlcik7Ci0JCQotCQkvL3Rlc3Qgb25seSBvbmUgZmVhdHVyZSBmb3IgdGhlIHNpdGUKLS8vCQlhc3NlcnRUcnVlKCJ3cm9uZyBudW1iZXIgb2YgY29uZmlndXJlZCBmZWF0dXJlcyBmb3IgY29uZmlnIHNpdGUiLHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGg9PTEpOwotCQkKLQkJLy8gdGVzdCBvbmx5IDIgYWN0aXZpdGllcwotLy8JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBhY3Rpdml0aWVzIGZvciBpbnN0YWxsIGNvbmZpZyIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldEFjdGl2aXRpZXMoKS5sZW5ndGg9PTIpOwotCQkKLQkJCi0JCS8vIGNsZWFudXAKLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUoKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkKLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUobmV3IFVSTChsb2NhdGlvbixTaXRlLkRFRkFVTFRfRkVBVFVSRV9QQVRIK0ZpbGUuc2VwYXJhdG9yK2ZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpLmdldEZpbGUoKSk7CQkKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkJCQkKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOwkJCi0JfQotCi0vKglwdWJsaWMgdm9pZCB0ZXN0UmV0cml2ZUNvbmZpZ0hUVFBJbnN0YWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy9jbGVhbiB1cAotCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKCgoTG9jYWxTaXRlKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwotCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmxvY2FsU2l0ZT1udWxsOwkJCi0KLQkJSUxvY2FsU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9IVFRQX1NJVEUsbnVsbCk7Ci0JCUlGZWF0dXJlIGZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCi0JCS8vIHdlIGFyZSBub3QgY2hlY2tpbmcgaWYgdGhpcyBpcyByZWFkIG9ubHkKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIG5ld0NvbmZpZyA9IHNpdGUuY2xvbmVDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQluZXdDb25maWcuc2V0TGFiZWwoIm5ldyBMYWJlbCIpOwkJCi0JCUlDb25maWd1cmVkU2l0ZSBjb25maWdTaXRlID0gbmV3Q29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdOwotCQlDb25maWd1cmF0aW9uUG9saWN5TW9kZWwgY29uZmlnUG9saWN5ID0gbmV3IEJhc2VTaXRlTG9jYWxGYWN0b3J5KCkuY3JlYXRlQ29uZmlndXJhdGlvblBvbGljeU1vZGVsKCk7Ci0JCWNvbmZpZ1BvbGljeS5zZXRQb2xpY3koSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUpOwotCQkoKENvbmZpZ3VyZWRTaXRlKWNvbmZpZ1NpdGUpLnNldENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCgoQ29uZmlndXJhdGlvblBvbGljeU1vZGVsKWNvbmZpZ1BvbGljeSk7CQotCQlpbnQgb2xkTnVtYmVyT2ZoaXN0b3J5ID0gc2l0ZS5nZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpLmxlbmd0aDsJCQkKLQkJc2l0ZS5hZGRDb25maWd1cmF0aW9uKG5ld0NvbmZpZyk7Ci0JCQotCQotCQkoKENvbmZpZ3VyZWRTaXRlKWNvbmZpZ1NpdGUpLnNldFVwZGF0YWJsZSh0cnVlKTsJCQkJCi0JCWNvbmZpZ1NpdGUuaW5zdGFsbChmZWF0dXJlLG51bGwsbnVsbCk7Ci0JCXNpdGUuc2F2ZSgpOwotCi0JCS8vZG8gbm90IGNsZWFudXAsIHdlIHdhbnQgdG8gcmV1c2UgcHJldmlvdXNseSBjcmVhdGVkIGxvY2FsIHNpdGUKLQkJLy8gYnV0IGZvcmNlIHJlLXJlYWQgb2YgeG1sIEZpbGUKLQkJSW50ZXJuYWxTaXRlTWFuYWdlci5sb2NhbFNpdGU9bnVsbDsKLQkJc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQlmZWF0dXJlID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpWzBdLmdldEZlYXR1cmUobnVsbCk7Ci0JCWludCBvbGROdW1iZXIgPSBzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCkubGVuZ3RoOwkJCi0JCQotCQkvLyBjaGVjawotCQkvLyB0aGVyZSBhcmUgMiBjb25maWd1cmF0aW9uCi0JCVN0cmluZyB0aW1lID0gIiIrc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENyZWF0aW9uRGF0ZSgpLmdldFRpbWUoKTsKLQkJVVJMIGxvY2F0aW9uID0gKChMb2NhbFNpdGUpc2l0ZSkuZ2V0TG9jYXRpb25VUkwoKTsJCQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLCJwbGF0Zm9ybS54bWwiKS5nZXRGaWxlKCkpOwotCQlhc3NlcnRUcnVlKCJuZXcgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBleGlzdCIsIGZpbGUuZXhpc3RzKCkpOwotCQkKLQkJLy8gdGVoIGN1cnJlbnQgb25lIHBvaW50cyB0byBhIHJlYWwgZmF0dXJlCi0JCS8vIGRvZXMgbm90IHRocm93IGVycm9yLgotCQlJQ29uZmlndXJlZFNpdGUgY29uZmlnU2l0ZTIgPSBzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07Ci0JCQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBjb25maWdTaXRlMi5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlJRmVhdHVyZSBmZWF0dXJlMiA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyAhZm91bmQgJiYgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCUlGZWF0dXJlIGZlYXR1cmUzID0gcmVmc1tpXS5nZXRGZWF0dXJlKG51bGwpOwkJCQotCQkJaWYgKCJvcmcudGVzdDEuaWRlbnQxXzEuMC4wIi5lcXVhbHMoZmVhdHVyZTMuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpKXsKLQkJCQlmZWF0dXJlMiA9IGZlYXR1cmUzOwotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCX0JCQotCQl9Ci0KLQkJLy9TdHJpbmcgY29uZmlndXJlZEZlYXR1cmUgPSBmZWF0dXJlMi5nZXRMYWJlbCgpOwotCQlhc3NlcnRUcnVlKCJjYW5ub3QgZmluZCBmZWF0dXJlIG9yZy50ZXN0MS5pZGVudDFfMS4wLjAgaW4gY29uZmlndXJlZCBTaXRlIixmb3VuZCk7Ci0JCWFzc2VydFRydWUoIldyb25nIGlkICB2ZXJzaW9uIG9mIGZlYXR1cmUiLGZlYXR1cmUyLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UoIm9yZy50ZXN0MS5pZGVudDFfMS4wLjAiKSk7Ci0JCQotCQkvLyB0ZXN0IG9ubHkgMiBpbnN0YWxsIGNvbmZpZyBpbiBsb2NhbCBzaXRlCi0vLwkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2YgaGlzdG9yeSBpbiBMb2NhbCBzaXRlOiIsb2xkTnVtYmVyT2ZoaXN0b3J5KzEsc2l0ZS5nZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpLmxlbmd0aCk7Ci0JCQotCQkvLyB0ZXN0IHNhbWUgbnVtYmVyIG9mIHNpdGVzIGluIGN1cnJlbnQgY29uZmlnCi0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBjb25maWcgc2l0ZXMgaW4gY3VycmVudCBjb25maWciLHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKS5sZW5ndGg9PW9sZE51bWJlcik7Ci0JCQotCQkvL3Rlc3Qgb25seSBvbmUgZmVhdHVyZSBmb3IgdGhlIHNpdGUKLS8vCQlhc3NlcnRUcnVlKCJ3cm9uZyBudW1iZXIgb2YgY29uZmlndXJlZCBmZWF0dXJlcyBmb3IgY29uZmlnIHNpdGUiLHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGg9PTEpOwotCQkKLQkJLy8gdGVzdCBvbmx5IDIgYWN0aXZpdGllcwotLy8JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBhY3Rpdml0aWVzIGZvciBpbnN0YWxsIGNvbmZpZyIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldEFjdGl2aXRpZXMoKS5sZW5ndGg9PTIpOwotCQkKLQkJCi0JCS8vIGNsZWFudXAKLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUobG9jYXRpb24uZ2V0RmlsZSgpKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkKLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUobmV3IFVSTChsb2NhdGlvbixTaXRlLkRFRkFVTFRfRkVBVFVSRV9QQVRIK0ZpbGUuc2VwYXJhdG9yK2ZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpLmdldEZpbGUoKSk7CQkKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkJCQkJCQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7CQkKLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUoZmVhdHVyZTIuZ2V0VVJMKCkuZ2V0RmlsZSgpKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7Ci0JfSovCi0JCi0vL1RPRE8gdW5jb21tZW50IHRoaXMgb25jZSBzaXRlIGRpc2FibGluZyBpcyBzdXBwb3J0ZWQKLXB1YmxpYyB2b2lkIHRlc3RSZXRyaXZlQ29uZmlnSFRUUEluc3RhbGxOb3RFbmFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8qCi0JLy9jbGVhbiB1cAotCUxvY2FsU2l0ZSBzaXRlTG9jYWwgPSAoTG9jYWxTaXRlKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCVVSTCBuZXdVUkwgPSBuZXcgVVJMKHNpdGVMb2NhbC5nZXRMb2NhdGlvblVSTCgpLExvY2FsU2l0ZS5TSVRFX0xPQ0FMX0ZJTEUpOwotCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUobmV3VVJMLmdldEZpbGUoKSk7Ci0JVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7Ci0JVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKG5ldyBGaWxlKCgoSW5zdGFsbENvbmZpZ3VyYXRpb24pc2l0ZUxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkpLmdldFVSTCgpLmdldEZpbGUoKSkpOwkKLQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmxvY2FsU2l0ZT1udWxsOwkJCi0KLQlJTG9jYWxTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfSFRUUF9TSVRFKTsKLQlJRmVhdHVyZSBmZWF0dXJlID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpWzBdLmdldEZlYXR1cmUobnVsbCk7Ci0JCQotCS8vIHdlIGFyZSBub3QgY2hlY2tpbmcgaWYgdGhpcyBpcyByZWFkIG9ubHkKLQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnID0gc2l0ZS5jbG9uZUN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JbmV3Q29uZmlnLnNldExhYmVsKCJuZXcgTGFiZWwiKTsJCQotCUlDb25maWd1cmVkU2l0ZSBjb25maWdTaXRlID0gbmV3Q29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdOwotCUNvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCBjb25maWdQb2xpY3kgPSBuZXcgQmFzZVNpdGVMb2NhbEZhY3RvcnkoKS5jcmVhdGVDb25maWd1cmF0aW9uUG9saWN5TW9kZWwoKTsKLQljb25maWdQb2xpY3kuc2V0UG9saWN5KElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVQb2xpY3kuVVNFUl9JTkNMVURFKTsKLQkoKENvbmZpZ3VyZWRTaXRlKWNvbmZpZ1NpdGUpLnNldENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCgoQ29uZmlndXJhdGlvblBvbGljeU1vZGVsKWNvbmZpZ1BvbGljeSk7CQotCWludCBvbGROdW1iZXJPZmhpc3RvcnkgPSBzaXRlLmdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkubGVuZ3RoOwkJCQotCXNpdGUuYWRkQ29uZmlndXJhdGlvbihuZXdDb25maWcpOwotCQkKLQkKLQkoKENvbmZpZ3VyZWRTaXRlKWNvbmZpZ1NpdGUpLnNldFVwZGF0YWJsZSh0cnVlKTsKLQljb25maWdTaXRlLmluc3RhbGwoZmVhdHVyZSxudWxsLG51bGwpOwotCSgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZSkuc2V0RW5hYmxlZChmYWxzZSk7CQotCXNpdGUuc2F2ZSgpOwotCi0JLy9kbyBub3QgY2xlYW51cCwgd2Ugd2FudCB0byByZXVzZSBwcmV2aW91c2x5IGNyZWF0ZWQgbG9jYWwgc2l0ZQotCS8vIGJ1dCBmb3JjZSByZS1yZWFkIG9mIHhtbCBGaWxlCi0JSW50ZXJuYWxTaXRlTWFuYWdlci5sb2NhbFNpdGU9bnVsbDsKLQlzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXS5nZXRGZWF0dXJlKG51bGwpOwotCWludCBvbGROdW1iZXIgPSBzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCkubGVuZ3RoOwkJCi0JCQotCS8vIGNoZWNrCi0JLy8gdGhlcmUgYXJlIDIgY29uZmlndXJhdGlvbgotCVN0cmluZyB0aW1lID0gIiIrc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENyZWF0aW9uRGF0ZSgpLmdldFRpbWUoKTsKLQlVUkwgbG9jYXRpb24gPSAoKExvY2FsU2l0ZSlzaXRlKS5nZXRMb2NhdGlvblVSTCgpOwkJCi0JRmlsZSBmaWxlID0gbmV3IEZpbGUobG9jYXRpb24uZ2V0RmlsZSgpKTsKLQlhc3NlcnRUcnVlKCJuZXcgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBleGlzdCIsIGZpbGUuZXhpc3RzKCkpOwotCQkKLQkvLyB0ZWggY3VycmVudCBvbmUgcG9pbnRzIHRvIGEgcmVhbCBmYXR1cmUKLQkvLyBkb2VzIG5vdCB0aHJvdyBlcnJvci4KLQlJQ29uZmlndXJlZFNpdGUgY29uZmlnU2l0ZTIgPSBzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07Ci0JCQotCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGNvbmZpZ1NpdGUyLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQlJRmVhdHVyZSBmZWF0dXJlMiA9IG51bGw7Ci0JZm9yIChpbnQgaSA9IDA7ICFmb3VuZCAmJiBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotCQlJRmVhdHVyZSBmZWF0dXJlMyA9IHJlZnNbaV0uZ2V0RmVhdHVyZShudWxsKTsJCQkKLQkJaWYgKCJvcmcudGVzdDEuaWRlbnQxXzEuMC4wIi5lcXVhbHMoZmVhdHVyZTMuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpKXsKLQkJCWZlYXR1cmUyID0gZmVhdHVyZTM7Ci0JCQlmb3VuZCA9IHRydWU7Ci0JCX0JCQotCX0KLQotCS8vU3RyaW5nIGNvbmZpZ3VyZWRGZWF0dXJlID0gZmVhdHVyZTIuZ2V0TGFiZWwoKTsKLQlhc3NlcnRUcnVlKCJmb3VuZCBmZWF0dXJlIG9yZy50ZXN0MS5pZGVudDFfMS4wLjAgaW4gZGlzYWJsZWQgY29uZmlndXJlZCBTaXRlIiwhZm91bmQpOwotCQkKLQkvL3Rlc3Qgbm8gY29uZmlndXJlZCBmZWF0dXJlcwotLy8JYXNzZXJ0VHJ1ZSgid3JvbmcgbnVtYmVyIG9mIGNvbmZpZ3VyZWQgZmVhdHVyZXMgZm9yIGNvbmZpZyBzaXRlIixzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF0uZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCkubGVuZ3RoPT0wKTsKLQkKLQkKLQljb25maWdTaXRlMi5zZXRFbmFibGVkKHRydWUpOwotCXJlZnMgPSBjb25maWdTaXRlMi5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsJCi0JZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCUlGZWF0dXJlIGZlYXR1cmUzID0gcmVmc1tpXS5nZXRGZWF0dXJlKG51bGwpOwkJCQotCQlpZiAoIm9yZy50ZXN0MS5pZGVudDFfMS4wLjAiLmVxdWFscyhmZWF0dXJlMy5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSkpewotCQkJZmVhdHVyZTIgPSBmZWF0dXJlMzsKLQkJCWZvdW5kID0gdHJ1ZTsKLQkJfQkJCi0JfQotCi0JLy9TdHJpbmcgY29uZmlndXJlZEZlYXR1cmUgPSBmZWF0dXJlMi5nZXRMYWJlbCgpOwotCWFzc2VydFRydWUoImNhbm5vdCBmaW5kIGZlYXR1cmUgb3JnLnRlc3QxLmlkZW50MV8xLjAuMCBpbiBjb25maWd1cmVkIFNpdGUiLGZvdW5kKTsKLQlhc3NlcnRUcnVlKCJXcm9uZyBpZCAgdmVyc2lvbiBvZiBmZWF0dXJlIixmZWF0dXJlMi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKCJvcmcudGVzdDEuaWRlbnQxXzEuMC4wIikpOwotCQkKLQkvLyB0ZXN0IG9ubHkgMiBpbnN0YWxsIGNvbmZpZyBpbiBsb2NhbCBzaXRlCi0vLwlhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBoaXN0b3J5IGluIExvY2FsIHNpdGU6IixvbGROdW1iZXJPZmhpc3RvcnkrMSxzaXRlLmdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkubGVuZ3RoKTsKLQkJCi0JLy8gdGVzdCBzYW1lIG51bWJlciBvZiBzaXRlcyBpbiBjdXJyZW50IGNvbmZpZwotLy8JYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGNvbmZpZyBzaXRlcyBpbiBjdXJyZW50IGNvbmZpZyIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpLmxlbmd0aD09b2xkTnVtYmVyKTsKLQkJCi0JLy90ZXN0IG9ubHkgb25lIGZlYXR1cmUgZm9yIHRoZSBzaXRlCi0vLwlhc3NlcnRUcnVlKCJ3cm9uZyBudW1iZXIgb2YgY29uZmlndXJlZCBmZWF0dXJlcyBmb3IgY29uZmlnIHNpdGUiLHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGg9PTEpOwotCQkKLQkvLyB0ZXN0IG9ubHkgMiBhY3Rpdml0aWVzCi0vLwlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgYWN0aXZpdGllcyBmb3IgaW5zdGFsbCBjb25maWciLHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRBY3Rpdml0aWVzKCkubGVuZ3RoPT0yKTsKLQkJCi0JCQotCS8vIGNsZWFudXAKLQlsb2NhbEZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLExvY2FsU2l0ZS5TSVRFX0xPQ0FMX0ZJTEUpLmdldEZpbGUoKSk7Ci0JVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkKLQlsb2NhbEZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLExvY2FsU2l0ZS5ERUZBVUxUX0NPTkZJR19GSUxFKS5nZXRGaWxlKCkpOwotCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkKLQlsb2NhbEZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLFNpdGUuREVGQVVMVF9GRUFUVVJFX1BBVEgrRmlsZS5zZXBhcmF0b3IrZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSkuZ2V0RmlsZSgpKTsJCQotCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkKLQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUoKChJbnN0YWxsQ29uZmlndXJhdGlvbilzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkpLmdldFVSTCgpLmdldEZpbGUoKSkpOwkJCQkJCQotCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsJCQotCWxvY2FsRmlsZSA9IG5ldyBGaWxlKGZlYXR1cmUyLmdldFVSTCgpLmdldEZpbGUoKSk7Ci0JVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7Ki8KLX0KLQotCi19Ci0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RTcGFjZUluSW5zdGFsbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdFNwYWNlSW5JbnN0YWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjExMWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdFNwYWNlSW5JbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWd1bGFySW5zdGFsbDsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0U3BhY2VJbkluc3RhbGwgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBUZXN0MQotCSAqLwotCXB1YmxpYyBUZXN0U3BhY2VJbkluc3RhbGwoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JLyoqCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U3BhY2VJblVSTCgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vY2xlYW51cCB0YXJnZXQgCi0JCVVSTCB0ZXN0VVJMID0gbmV3IFVSTChUQVJHRVRfRklMRV9TSVRFLCJ0ZXN0IHNpdGUgc3BhY2UvIik7IAotCQlTdHJpbmcgdGVzdFBhdGggPSB0ZXN0VVJMLmdldEZpbGUoKTsKLQkJRmlsZSB0YXJnZXQgPSBuZXcgRmlsZSh0ZXN0UGF0aCk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXQpOwotCQkKLQkJVVJMIG5ld1VSTCA9IG5ldyBGaWxlKGRhdGFQYXRoICsgIlNpdGUgd2l0aCBzcGFjZS9zaXRlLnhtbCIpLnRvVVJMKCk7Ci0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ld1VSTCx0cnVlLG51bGwpOwotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzUmVmID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlpZiAoIXRhcmdldC5leGlzdHMoKSkgdGFyZ2V0Lm1rZGlycygpOwotCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKHRlc3RVUkwsdHJ1ZSxudWxsKTsKLQkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IG51bGw7Ci0JCQotCQkvLyBhdCBsZWFzdCBvbmUgZXhlY3V0YWJsZSBmZWF0dXJlIGFuZCBvbiBwYWNrYWdlZAotCQlib29sZWFuIGV4ZWNGZWF0dXJlID0gZmFsc2U7Ci0JCWJvb2xlYW4gcGFja0ZlYXR1cmUgPSBmYWxzZTsKLQotCQlpZiAoZmVhdHVyZXNSZWYubGVuZ3RoPT0wKSBmYWlsICgibm8gZmVhdHVyZSBmb3VuZCIpOwotCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzUmVmLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZW1vdGVGZWF0dXJlID0gZmVhdHVyZXNSZWZbaV0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCXJlbW92ZShyZW1vdGVGZWF0dXJlLGxvY2FsU2l0ZSk7IAotCQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCxudWxsKTsKLQkJCQotCQkJaWYgKHJlbW90ZUZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyKSBwYWNrRmVhdHVyZSA9IHRydWU7Ci0JCQlpZiAocmVtb3RlRmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcikgZXhlY0ZlYXR1cmUgPSB0cnVlOwotCi0JCQkvLyB2ZXJpZnkKLQkJCVN0cmluZyBzaXRlID0gdGVzdFBhdGg7Ci0JCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRSYXdQbHVnaW5FbnRyaWVzKCk7Ci0JCQlhc3NlcnRUcnVlKCJubyBwbHVnaW5zIGVudHJ5IiwgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCAhPSAwKSk7Ci0JCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKLQkJCWFzc2VydFRydWUoInBsdWdpbiBmaWxlcyBub3QgaW5zdGFsbGVkIGxvY2FsbHkgKHBsdWdpbkZpbGU9IiArIHBsdWdpbkZpbGUgKyAiLHRhcmdldD0iICsgdGFyZ2V0ICsgJyknLCBwbHVnaW5GaWxlLmV4aXN0cygpKTsKLQotCQkJRmlsZSBmZWF0dXJlRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiIrZmVhdHVyZUZpbGUsIGZlYXR1cmVGaWxlLmV4aXN0cygpKTsKLQotCQkJRmlsZSBmZWF0dXJlRmlsZVhNTCA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSArIEZpbGUuc2VwYXJhdG9yICsgImZlYXR1cmUueG1sIik7Ci0JCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiBubyBmZWF0dXJlLnhtbCIsIGZlYXR1cmVGaWxlWE1MLmV4aXN0cygpKTsKLQkJfQotCi0JCWlmICghZXhlY0ZlYXR1cmUgJiYgIXBhY2tGZWF0dXJlKXsKLQkJCWZhaWwoImNhbm5vdCBmaW5kIG9uZSBleGVjdXRhYmxlIGFuZCBvbmUgcGFja2FnZSBmZWF0dXJlIG9uIHRlaCBzaXRlIik7Ci0JCX0KLQotCQkvL2NsZWFudXAgdGFyZ2V0IAotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsKLQotCi0JfQotCQotCQotCS8qKgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNwYWNlSW5IVFRQVVJMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy9jbGVhbnVwIHRhcmdldCAgCi0JCUZpbGUgdGFyZ2V0ID0gbmV3IEZpbGUoVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsKLQkJSW5zdGFsbFJlZ2lzdHJ5LmNsZWFudXAoKTsKLQkJCi0JCVN0cmluZyBwYXRoID0gYnVuZGxlLmdldFN0cmluZygiSFRUUF9QQVRIXzMiKTsKLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTCgiaHR0cCIsZ2V0SHR0cEhvc3QoKSxnZXRIdHRwUG9ydCgpLHBhdGgpLHRydWUsbnVsbCk7CQkKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlc1JlZiA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJSVNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShUQVJHRVRfRklMRV9TSVRFLHRydWUsbnVsbCk7Ci0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBudWxsOwotCQkKLQkJLy8gYXQgbGVhc3Qgb25lIGV4ZWN1dGFibGUgZmVhdHVyZSBhbmQgb24gcGFja2FnZWQKLQkJYm9vbGVhbiBleGVjRmVhdHVyZSA9IGZhbHNlOwotCQlib29sZWFuIHBhY2tGZWF0dXJlID0gZmFsc2U7Ci0KLQkJaWYgKGZlYXR1cmVzUmVmLmxlbmd0aD09MCkgZmFpbCAoIm5vIGZlYXR1cmUgZm91bmQiKTsKLQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc1JlZi5sZW5ndGg7IGkrKykgewotCQkJcmVtb3RlRmVhdHVyZSA9IGZlYXR1cmVzUmVmW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQlsb2NhbFNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLG51bGwpOwotCQkJCi0JCQlpZiAocmVtb3RlRmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIpIHBhY2tGZWF0dXJlID0gdHJ1ZTsKLQkJCWlmIChyZW1vdGVGZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyKSBleGVjRmVhdHVyZSA9IHRydWU7Ci0KLQkJCS8vIHZlcmlmeQotCQkJU3RyaW5nIHNpdGUgPSBUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKTsJCQkKLQkJCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSByZW1vdGVGZWF0dXJlLmdldFJhd1BsdWdpbkVudHJpZXMoKTsKLQkJCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsKLQkJCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQkJCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOwotCQkJYXNzZXJ0VHJ1ZSgicGx1Z2luIGZpbGVzIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOwotCi0JCQlGaWxlIGZlYXR1cmVGaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitmZWF0dXJlRmlsZSwgZmVhdHVyZUZpbGUuZXhpc3RzKCkpOwotCi0JCQlGaWxlIGZlYXR1cmVGaWxlWE1MID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpICsgRmlsZS5zZXBhcmF0b3IgKyAiZmVhdHVyZS54bWwiKTsKLQkJCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IG5vIGZlYXR1cmUueG1sIiwgZmVhdHVyZUZpbGVYTUwuZXhpc3RzKCkpOwotCQl9Ci0KLQkJaWYgKCFleGVjRmVhdHVyZSAmJiAhcGFja0ZlYXR1cmUpewotCQkJZmFpbCgiY2Fubm90IGZpbmQgb25lIGV4ZWN1dGFibGUgYW5kIG9uZSBwYWNrYWdlIGZlYXR1cmUgb24gdGVoIHNpdGUiKTsKLQkJfQotCi0JCS8vY2xlYW51cCB0YXJnZXQgCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXQpOwotCQlJbnN0YWxsUmVnaXN0cnkuY2xlYW51cCgpOwotCi0JfQotCQkKLQkJCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFyUmVtb3ZlL0FsbFJlZ3VsYXJSZW1vdmVUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhclJlbW92ZS9BbGxSZWd1bGFyUmVtb3ZlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQzOGM0My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFyUmVtb3ZlL0FsbFJlZ3VsYXJSZW1vdmVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWd1bGFyUmVtb3ZlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotCi1wdWJsaWMgY2xhc3MgQWxsUmVndWxhclJlbW92ZVRlc3RzIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLXB1YmxpYyBBbGxSZWd1bGFyUmVtb3ZlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0Jc3VpdGUuc2V0TmFtZSgiUmVndWxhciBSZW1vdmUgVGVzdHMiKTsKLQkKLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFJlbW92ZS5jbGFzcykpOwotCQotCXJldHVybiBzdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJSZW1vdmUvVGVzdFJlbW92ZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhclJlbW92ZS9UZXN0UmVtb3ZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZTc1ZTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhclJlbW92ZS9UZXN0UmVtb3ZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJSZW1vdmU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UmVtb3ZlIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQotCXB1YmxpYyBjbGFzcyBMaXN0ZW5lciBpbXBsZW1lbnRzIElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lciB7Ci0KLQkJcHVibGljIGJvb2xlYW4gbm90aWZpZWQgPSBmYWxzZTsKLQotCQlwdWJsaWMgdm9pZCBmZWF0dXJlSW5zdGFsbGVkKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJCW5vdGlmaWVkID0gdHJ1ZTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm90aWZpZWQgRGVmYXVsdEZlYXR1cmUgSW5zdGFsbGVkIik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBmZWF0dXJlUmVtb3ZlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZmVhdHVyZUNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSkgewotCQl9Ci0JCXB1YmxpYyB2b2lkIGZlYXR1cmVVbmNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSkgewotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNOb3RpZmllZCgpIHsKLQkJCXJldHVybiBub3RpZmllZDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBUZXN0MQotCSAqLwotCXB1YmxpYyBUZXN0UmVtb3ZlKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXByaXZhdGUgSUZlYXR1cmUgZ2V0RmVhdHVyZTEoSVNpdGUgc2l0ZSkKLQkJdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vVVJMIHVybCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSwgImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphciIsIG51bGwpOwotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsKLQkJcmVmLnNldFNpdGUoc2l0ZSk7Ci0JCXJlZi5zZXRVUkxTdHJpbmcoImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphciIpOwotCQlyZWYuc2V0VHlwZShJU2l0ZS5ERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRSk7Ci0JCXJlZi5yZXNvbHZlKHNpdGUuZ2V0VVJMKCksIG51bGwpOwotCQlyZXR1cm4gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQkvLyBpbnN0YWxsIGZlYXR1cmUKLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSxudWxsKTsKLQkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IGdldEZlYXR1cmUxKHJlbW90ZVNpdGUpOwotCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFRBUkdFVF9GSUxFX1NJVEUsbnVsbCk7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IGxvY2FsU2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsIG51bGwpOwotCi0JCS8vIHRoZW4gcmVtb3ZlIGl0Ci0JCWFzc2VydE5vdE51bGwoIkZlYXR1cmUgaXMgbnVsbCIscmVmLmdldEZlYXR1cmUobnVsbCkpOwotCQlTdHJpbmcgZmVhdHVyZVJlZiA9IHJlZi5nZXRGZWF0dXJlKG51bGwpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQlsb2NhbFNpdGUucmVtb3ZlKHJlZi5nZXRGZWF0dXJlKG51bGwpLCBudWxsKTsKLQotCQkvLyB2ZXJpZnkKLQkJU3RyaW5nIHNpdGUgPSBUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKTsKLQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQlhc3NlcnRUcnVlKCJubyBwbHVnaW5zIGVudHJ5IiwgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCAhPSAwKSk7Ci0JCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQotCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKLQkJYXNzZXJ0VHJ1ZSgicGx1Z2luIGZpbGVzIGluc3RhbGxlZCBsb2NhbGx5IiwgIXBsdWdpbkZpbGUuZXhpc3RzKCkpOwotCi0JCUZpbGUgZmVhdHVyZUZpbGUgPQotCQkJbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyBmZWF0dXJlUmVmKTsKLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJmZWF0dXJlIGluZm8gaW5zdGFsbGVkIGxvY2FsbHk6IiArIGZlYXR1cmVGaWxlLAotCQkJIWZlYXR1cmVGaWxlLmV4aXN0cygpKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc2l0ZXZhbGlkYXRpb24vQWxsU2l0ZVZhbGlkYXRpb25UZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc2l0ZXZhbGlkYXRpb24vQWxsU2l0ZVZhbGlkYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmYzNjM3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3NpdGV2YWxpZGF0aW9uL0FsbFNpdGVWYWxpZGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuc2l0ZXZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgQWxsU2l0ZVZhbGlkYXRpb25UZXN0cyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JcHVibGljIEFsbFNpdGVWYWxpZGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5zZXROYW1lKCJTaXRlIFZhbGlkYXRpb24gVGVzdHMiKTsKLQotCQkvLyB0aGUgZm9sbG93aW5nIHdpbGwgdGFrZSBhbGwgdGVoIHRlc3QgbWV0aG9kcyBpbiB0ZWggY2xhc3MgdGhhdCBzdGFydCB3aXRoICd0ZXN0JwotCi0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0U2l0ZVZhbGlkYXRpb24uY2xhc3MpKTsKLQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc2l0ZXZhbGlkYXRpb24vVGVzdFNpdGVWYWxpZGF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zaXRldmFsaWRhdGlvbi9UZXN0U2l0ZVZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY5ZDViMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zaXRldmFsaWRhdGlvbi9UZXN0U2l0ZVZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnNpdGV2YWxpZGF0aW9uOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuSVBsYXRmb3JtQ29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLio7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0U2l0ZVZhbGlkYXRpb24gZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAKLQkgKi8KLQlwdWJsaWMgVGVzdFNpdGVWYWxpZGF0aW9uKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVDb25maWdTaXRlKFVSTCB1cmwpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBnZXQgbmV3IGNvbmZpZyBvYmplY3QKLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjZmlnID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOwotCQlJU2l0ZUVudHJ5IHMxID0gY2ZpZy5maW5kQ29uZmlndXJlZFNpdGUodXJsKTsKLQkJYXNzZXJ0Tm90TnVsbCgiVW5hYmxlIHRvIGZpbmQgc2l0ZSBlbnRyeToiK3VybCxzMSk7Ci0JCWNmaWcudW5jb25maWd1cmVTaXRlKHMxKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l0ZTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlVUkwgcmVtb3RlVXJsID0gbmV3IFVSTChUQVJHRVRfRklMRV9TSVRFICsgInZhbGlkYXRpb24vc2l0ZTEvZWNsaXBzZSIpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZW1vdGVVcmwuZ2V0RmlsZSgpKTsKLQkJSUxvY2FsU2l0ZSBsb2NhbCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IGxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCWZpbGUubWtkaXJzKCk7Ci0JCUlDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSA9IGN1cnJlbnRDb25maWcuY3JlYXRlQ29uZmlndXJlZFNpdGUoZmlsZSk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gY29uZmlndXJlZFNpdGUudmVyaWZ5VXBkYXRhYmxlU3RhdHVzKCk7Ci0KLQkJU3RyaW5nIG1zZyA9ICJUaGUgc2l0ZSAiK2ZpbGUrIiBzaG91bGQgYmUgdXBkYXRhYmxlLiI7Ci0JCWlmICghc3RhdHVzLmlzT0soKSl7Ci0JCQlmYWlsKG1zZytzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQljdXJyZW50Q29uZmlnLnJlbW92ZUNvbmZpZ3VyZWRTaXRlKGNvbmZpZ3VyZWRTaXRlKTsKLQkJcmVtb3ZlQ29uZmlnU2l0ZShjb25maWd1cmVkU2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2l0ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlVUkwgcmVtb3RlVXJsID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInZhbGlkYXRpb24vc2l0ZTIvZWNsaXBzZS8iKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocmVtb3RlVXJsLmdldEZpbGUoKSk7Ci0JCUlMb2NhbFNpdGUgbG9jYWwgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBsb2NhbC5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQlJQ29uZmlndXJlZFNpdGUgY29uZmlndXJlZFNpdGU7Ci0JCXRyeSB7Ci0JCSBjb25maWd1cmVkU2l0ZSA9IGN1cnJlbnRDb25maWcuY3JlYXRlQ29uZmlndXJlZFNpdGUoZmlsZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVN0YXR1cyBzdGF0dXMgPSBjb25maWd1cmVkU2l0ZS52ZXJpZnlVcGRhdGFibGVTdGF0dXMoKTsKLQotLy8JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShuZXcgRmlsZShmaWxlLCIuZWNsaXBzZVVNIikpOwotCi0JCVN0cmluZyBtc2cgPSAiVGhlIHNpdGUgIitmaWxlKyIgc2hvdWxkIG5vdCBiZSB1cGRhdGFibGUuIjsKLQkJaWYgKHN0YXR1cy5pc09LKCkpewotCQkJZmFpbChtc2crc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJaWYgKHN0YXR1cy5nZXRNZXNzYWdlKCkuaW5kZXhPZigiVGhpcyBzaXRlIGlzIGNvbnRhaW5lZCBpbiBhbm90aGVyIHNpdGU6Iik9PS0xKXsKLQkJCWZhaWwoIldyb25nIHZhbGlkYXRpb246IitzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l0ZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlVUkwgcmVtb3RlVXJsID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInZhbGlkYXRpb24vc2l0ZTMvZWNsaXBzZS8iKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocmVtb3RlVXJsLmdldEZpbGUoKSk7Ci0JCUlMb2NhbFNpdGUgbG9jYWwgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBsb2NhbC5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQlJQ29uZmlndXJlZFNpdGUgY29uZmlndXJlZFNpdGUgPSBjdXJyZW50Q29uZmlnLmNyZWF0ZUNvbmZpZ3VyZWRTaXRlKGZpbGUpOwotCQlJU3RhdHVzIHN0YXR1cyA9IGNvbmZpZ3VyZWRTaXRlLnZlcmlmeVVwZGF0YWJsZVN0YXR1cygpOwotCi0vLwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKG5ldyBGaWxlKGZpbGUsIi5lY2xpcHNlVU0iKSk7Ci0KLQkJU3RyaW5nIG1zZyA9ICJUaGUgc2l0ZSAiK2ZpbGUrIiBzaG91bGQgbm90IGJlIHVwZGF0YWJsZS4iOwotCQlpZiAoc3RhdHVzLmlzT0soKSl7Ci0JCQlmYWlsKG1zZytzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfQotLy8JCWlmIChzdGF0dXMuZ2V0TWVzc2FnZSgpLmluZGV4T2YoIlRoaXMgc2l0ZSBpcyBjb250YWluZWQgaW4gYW5vdGhlciBzaXRlOiIpPT0tMSl7Ci0vLwkJCWZhaWwoIldyb25nIHZhbGlkYXRpb246IitzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLS8vCQl9Ci0JfQkKLQotCXB1YmxpYyB2b2lkIHRlc3RTaXRlNCgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVVSTCByZW1vdGVVcmwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAidmFsaWRhdGlvbi9zaXRlNC9lY2xpcHNlLyIpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZW1vdGVVcmwuZ2V0RmlsZSgpKTsKLQkJSUxvY2FsU2l0ZSBsb2NhbCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IGxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCUlDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSA9IGN1cnJlbnRDb25maWcuY3JlYXRlQ29uZmlndXJlZFNpdGUoZmlsZSk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gY29uZmlndXJlZFNpdGUudmVyaWZ5VXBkYXRhYmxlU3RhdHVzKCk7Ci0KLQkJU3RyaW5nIG1zZyA9ICJUaGUgc2l0ZSAiK2ZpbGUrIiBzaG91bGQgbm90IGJlIHVwZGF0YWJsZS4iOwotCQlpZiAoc3RhdHVzLmlzT0soKSl7Ci0JCQlmYWlsKG1zZytzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlpZiAoc3RhdHVzLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJUaGUgc2l0ZSBjYW5ub3QgYmUgbW9kaWZpZWQgYnkgdGhpcyBwcm9kdWN0LiBJdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBwcm9kdWN0OiIpPT0tMSl7Ci0JCQlmYWlsKCJXcm9uZyB2YWxpZGF0aW9uOiIrc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdFNpdGU1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJVVJMIHJlbW90ZVVybCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJ2YWxpZGF0aW9uL3NpdGU1LyIpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZW1vdGVVcmwuZ2V0RmlsZSgpKTsKLQkJSUxvY2FsU2l0ZSBsb2NhbCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IGxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCUlDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSA9IGN1cnJlbnRDb25maWcuY3JlYXRlQ29uZmlndXJlZFNpdGUoZmlsZSk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gY29uZmlndXJlZFNpdGUudmVyaWZ5VXBkYXRhYmxlU3RhdHVzKCk7Ci0KLQkJU3RyaW5nIG1zZyA9ICJUaGUgc2l0ZSAiK2ZpbGUrIiBzaG91bGQgYmUgdXBkYXRhYmxlLiI7Ci0JCWlmICghc3RhdHVzLmlzT0soKSl7Ci0JCQlmYWlsKG1zZytzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQkKLQkJCS8vIGdldCBuZXcgY29uZmlnIG9iamVjdAotCQlVUkwgdXJsID0gY29uZmlndXJlZFNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpOwotCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIGNmaWcgPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7Ci0JCUlTaXRlRW50cnkgczEgPSBjZmlnLmZpbmRDb25maWd1cmVkU2l0ZSh1cmwpOwotCQlhc3NlcnROb3ROdWxsKCJTaXRlIGVudHJ5IG5vdCBmb3VuZDoiK3VybCxzMSk7Ci0JCWNmaWcudW5jb25maWd1cmVTaXRlKHMxKTsKLQkJY2ZpZy5zYXZlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTaXRlNigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVVSTCByZW1vdGVVcmwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAidmFsaWRhdGlvbi9zaXRlNi9jaGlsZHJlbi9jaGlsZHJlbi9lY2xpcHNlLyIpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZW1vdGVVcmwuZ2V0RmlsZSgpKTsKLQkJaWYgKCFmaWxlLmV4aXN0cygpKSBmaWxlLm1rZGlycygpOwotCQlJTG9jYWxTaXRlIGxvY2FsID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gbG9jYWwuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ3VyZWRTaXRlID0gY3VycmVudENvbmZpZy5jcmVhdGVDb25maWd1cmVkU2l0ZShmaWxlKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBjb25maWd1cmVkU2l0ZS52ZXJpZnlVcGRhdGFibGVTdGF0dXMoKTsKLQotLy8JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShuZXcgRmlsZShmaWxlLCIuZWNsaXBzZVVNIikpOwotCi0JCVN0cmluZyBtc2cgPSAiVGhlIHNpdGUgIitmaWxlKyIgc2hvdWxkIG5vdCBiZSB1cGRhdGFibGUuIjsKLQkJaWYgKHN0YXR1cy5pc09LKCkpewotCQkJZmFpbChtc2crc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLS8vCQlpZiAoc3RhdHVzLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJUaGlzIHNpdGUgaXMgY29udGFpbmVkIGluIGFub3RoZXIgc2l0ZToiKT09LTEpewotLy8JCQlmYWlsKCJXcm9uZyB2YWxpZGF0aW9uOiIrc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0vLwkJfQotCX0JCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL0FsbFN0YW5kYWxvbmVUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9BbGxTdGFuZGFsb25lVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU3Y2MyZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL0FsbFN0YW5kYWxvbmVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnN0YW5kYWxvbmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgQWxsU3RhbmRhbG9uZVRlc3RzIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlewotCi0JcHVibGljIEFsbFN0YW5kYWxvbmVUZXN0cyhTdHJpbmcgbmFtZSl7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKXsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5zZXROYW1lKCJTdGFuZGFsb25lIFRlc3RzIik7Ci0JCQotCQkvLyB0aGUgZm9sbG93aW5nIHdpbGwgdGFrZSBhbGwgdGhlIHRlc3QgbWV0aG9kcyBpbiAKLQkJLy8gdGhlIGNsYXNzIHRoYXQgc3RhcnQgd2l0aCAidGVzdCIKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RGZWF0dXJlSW5zdGFsbC5jbGFzcykpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEZlYXR1cmVVcGRhdGUuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RGZWF0dXJlRW5hYmxlLmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0RmVhdHVyZURpc2FibGUuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RGZWF0dXJlVW5pbnN0YWxsLmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0QnVuZGxlc0luc3RhbGwuY2xhc3MpKTsKLQkJLy9hbmQgdGhpcyBvbmUncyBmb3IgZnVuIDopCi0vLwkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RTaXRlU2VhcmNoLmNsYXNzKSk7Ci0JCQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9TdGFuZGFsb25lTWFuYWdlclRlc3RDYXNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1N0YW5kYWxvbmVNYW5hZ2VyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBhZWJmZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1N0YW5kYWxvbmVNYW5hZ2VyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuc3RhbmRhbG9uZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLio7Ci0KLXB1YmxpYyBjbGFzcyBTdGFuZGFsb25lTWFuYWdlclRlc3RDYXNlIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciBlcnJPdXRwdXQ7Ci0JcHVibGljIHN0YXRpYyBJbnRlZ2VyIGV4aXRWYWx1ZT0gbmV3IEludGVnZXIoLTEpOwotCXB1YmxpYyBzdGF0aWMgVVJMIFRBUkdFVF9GSUxFX1NJVEU7Ci0JcHJpdmF0ZSBib29sZWFuIG9sZENhY2hlID0gZmFsc2U7Ci0JCi0Jc3RhdGljIHsKLQkJRmlsZSB0YXJnZXREaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikpOwotCQl0YXJnZXREaXIgPSBuZXcgRmlsZSh0YXJnZXREaXIsICJzdGFuZGFsb25lIik7Ci0JCXRhcmdldERpciA9IG5ldyBGaWxlKHRhcmdldERpciwgIm15dGFyZ2V0Iik7Ci0JCWlmICh0YXJnZXREaXIuZXhpc3RzKCkpCi0JCQlkZWxldGVEaXJlY3RvcnkodGFyZ2V0RGlyKTsKLQkJdHJ5IHsKLQkJCVRBUkdFVF9GSUxFX1NJVEUgPSB0YXJnZXREaXIudG9VUkwoKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFN0YW5kYWxvbmVNYW5hZ2VyVGVzdENhc2UgKFN0cmluZyBhcmcwKXsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdXAgdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBvcGVuIGEgbmV0d29yayBjb25uZWN0aW9uLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVtU2V0VXAoKSB7Ci0JCS8vIHNldHVwIGNhY2hlIHNpdGUgdG8gdHJ1ZQotCQlvbGRDYWNoZSA9IEludGVybmFsU2l0ZU1hbmFnZXIuZ2xvYmFsVXNlQ2FjaGU7Ci0JCUludGVybmFsU2l0ZU1hbmFnZXIuZ2xvYmFsVXNlQ2FjaGUgPSB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBUZWFycyBkb3duIHRoZSBmaXh0dXJlLCBmb3IgZXhhbXBsZSwgY2xvc2UgYSBuZXR3b3JrIGNvbm5lY3Rpb24uCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1bVRlYXJEb3duKCkgewotCQkvLyBkbyBub3RoaW5nLgotCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmdsb2JhbFVzZUNhY2hlID0gb2xkQ2FjaGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNoZWNrQ29uZmlndXJlZFNpdGVzKCl7Ci0JCUlMb2NhbFNpdGUgbG9jYWxTaXRlOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4iKTsKLQkJdHJ5IHsKLQkJCWxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2NhbFNpdGU6ICIgKyBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRMYWJlbCgpKTsKLQkJCi0JCS8vR2V0IHNpdGUgdG8gaW5zdGFsbCB0bwotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQlJQ29uZmlndXJlZFNpdGVbXSBzaXRlcyA9IGN1cnJlbnRDb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0vLwkKLS8vCQkJLy8gc3RhcnQgb2YgY29uZmlnIHNpdGUgcHJpbnQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJHRVRUSU5HIENPTkZJR1VSRUQgU0lURVMuLi4iKTsKLQkJZm9yIChpbnQgaSA9IDA7IGk8c2l0ZXMubGVuZ3RoOyBpKyspewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJzaXRlICMiICsgaSArICI6ICIgKyBzaXRlc1tpXS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpKTsKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4iKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCX0KLQl9Ci0JCi0JLy8gZ2V0IHRoZSBmaXJzdCBjb25maWd1cmVkIHNpdGUgZm91bmQgYmVjYXVzZSB0aGlzIGlzIHRoZSBvbmUgd2UncmUgbW9zdCBsaWtlbHkgdG8gCi0JLy8gaGF2ZSBpbnN0YWxsZWQgaW50bwotCXB1YmxpYyBJU2l0ZSBnZXRDb25maWd1cmVkU2l0ZShVUkwgdGFyZ2V0KXsKLQkJdHJ5IHsKLQkJCUlMb2NhbFNpdGUgbG9jYWwgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gbG9jYWwuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJCUlDb25maWd1cmVkU2l0ZVtdIHNpdGVzID0gY3VycmVudENvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5yZXRyaWV2aW5nIGNvbmZpZ3VyZWQgc2l0ZXMuLi4iKTsKLQkJCVN0cmluZyB0YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0LmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaTxzaXRlcy5sZW5ndGggOyBpKyspewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2l0ZVsiK2krIl06ICIgKyBzaXRlc1tpXS5nZXRTaXRlKCkuZ2V0VVJMKCkpOwotCQkJCVN0cmluZyBzaXRlRmlsZSA9IG5ldyBGaWxlKHNpdGVzW2ldLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpOwotCQkJCWlmICh0YXJnZXRGaWxlLmVxdWFscyhzaXRlRmlsZSkpCi0JCQkJCXJldHVybiBzaXRlc1tpXS5nZXRTaXRlKCk7Ci0JCQl9Ci0JCQlpZiAoc2l0ZXMubGVuZ3RoID09IDApCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gc2l0ZXNbMF0uZ2V0U2l0ZSgpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCS8vV2F0Y2hEb2cgdGhyZWFkIHRvIGtpbGwgbWlycm9yaW5nIHByb2Nlc3MgaWYgaXQgaGFuZ3MgKG9yIHRha2VzIHRvbyBsb25nKQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVGltZXIgZXh0ZW5kcyBUaHJlYWR7Ci0JCXByaXZhdGUgUHJvY2VzcyBwcm9jOwotCQkKLQkJcHVibGljIFRpbWVyKFByb2Nlc3MgcHJvYyl7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zZXREYWVtb24odHJ1ZSk7Ci0JCQl0aGlzLnByb2MgPSBwcm9jOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBydW4oKXsKLQkJCXRyeSB7Ci0JCQkJLy8gc2xlZXAgdGltZSA1bWluCi0JCQkJc2xlZXAoMzAwMDAwKTsgCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJkZXN0cm95aW5nIHByb2Nlc3MiKTsKLQkJCQlwcm9jLmRlc3Ryb3koKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLy8gU3RyZWFtQ29uc3VtZXIgdG8gZGlzcGxheSBvdXRwdXQgdG8gb3V0cHV0IGZpbGVzIG9yIGNvbnNvbGUKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmVhbUNvbnN1bWVyIGV4dGVuZHMgVGhyZWFkIHsKLQkJcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciBiUmVhZGVyOwotCi0JCXB1YmxpYyBTdHJlYW1Db25zdW1lcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQkJc3VwZXIoKTsKLQkJCXNldERhZW1vbih0cnVlKTsKLQkJCWJSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtKSk7Ci0JCQllcnJPdXRwdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBsaW5lOwotCQkJCXdoaWxlIChudWxsICE9IChsaW5lID0gYlJlYWRlci5yZWFkTGluZSgpKSkgewotCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4obGluZSk7Ci0JCQkJCWVyck91dHB1dC5hcHBlbmQobGluZSk7Ci0JCQkJCWVyck91dHB1dC5hcHBlbmQoIlxuIik7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBjb21tYW5kIDogY29tbWFuZCBhcmd1bWVudCB0byBydW4gb24gc2l0ZS9mZWF0dXJlIAotCSAqIChpLmUuICdpbnN0YWxsJywgJ2VuYWJsZScsICdkaXNhYmxlJywgJ3VwZGF0ZScpICo8aT5yZXF1aXJlZDwvaT4qCi0JICogQHBhcmFtIGZpZCA6IGZlYXR1cmUgaWQgb2YgdGhlIGZlYXR1cmUgYmVpbmcgaW5zdGFsbGVkLCBlbmFibGVkLCBldGMuCi0JICogKG9wdGlvbmFsIC0gY2FuIGJlIG51bGwpCi0JICogQHBhcmFtIHZlciA6IHZlcnNpb24gb2YgZmVhdHVyZSBiZWluZyBpbnN0YWxsZWQsIGVuYWJsZWQsIGV0Yy4gKG9wdGlvbmFsIC0gY2FuIGJlIG51bGwpCi0JICogQHBhcmFtIGNvbmZpZyA6IGxvY2F0aW9uIG9mIGNvbmZpZ3VyYXRpb24gaW5mbyAoaS5lLiBmaWxlOkQ6XHRlbXBcLmNvbmZpZ1wpCi0JICogQHBhcmFtIHJlbW90ZUxvYyA6IHJlbW90ZSBzaXRlIHVybCAocmVxdWlyZWQgZm9yIGluc3RhbGxpbmcvc2VhcmNoaW5nIGZyb20gcmVtb3RlIHNpdGUpCi0JICogQHBhcmFtIGxvY2FsTG9jIDogdGFyZ2V0IHNpdGUgZGlyZWN0b3J5IChyZXF1aXJlZCB1bmxlc3MgdXBkYXRpbmcvc2VhcmNoaW5nKQotCSAqIEByZXR1cm4gYSBzdHJpbmcgYXJyYXkgY29uc2lzdGluZyBvZiBjb21tYW5kcyBhbmQgdGhlaXIgYXJndW1lbnRzIHRvCi0JICogYmUgcnVuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldENvbW1hbmQoCi0JCVN0cmluZyBjb21tYW5kLAotCQlTdHJpbmcgZmlkLAotCQlTdHJpbmcgdmVyLAotCQlTdHJpbmcgY29uZmlnLAotCQlTdHJpbmcgcmVtb3RlTG9jLAotCQlTdHJpbmcgbG9jYWxMb2MpewotCQlmaW5hbCBTdHJpbmcgY2xhc3NwYXRoID0gInN0YXJ0dXAuamFyIjsKLQkJZmluYWwgU3RyaW5nIGxhdW5jaGVyID0gIm9yZy5lY2xpcHNlLmNvcmUubGF1bmNoZXIuTWFpbiI7Ci0JCWZpbmFsIFN0cmluZyBhcHBsaWNhdGlvbiA9ICJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5zdGFuZGFsb25lVXBkYXRlIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfQ1AgPSAiLWNwIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfQVBQID0gIi1hcHBsaWNhdGlvbiI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX0NNRCA9ICItY29tbWFuZCI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX0ZJRCA9ICItZmVhdHVyZUlkIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfREFUQSA9ICItZGF0YSI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX1ZFUlNJT04gPSAiLXZlcnNpb24iOwotCQlmaW5hbCBTdHJpbmcgRkxBR19GUk9NID0gIi1mcm9tIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfVE8gPSAiLXRvIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfQ09ORklHID0gIi1jb25maWd1cmF0aW9uIjsKLS8vCQlmaW5hbCBTdHJpbmcgRkxBR19VUkwgPSAiLW1pcnJvclVSTCI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX1NQTEFTSCA9ICItbm9zcGxhc2giOwotCQlmaW5hbCBTdHJpbmcgRkxBR19DT05TT0xFTE9HID0gIi1jb25zb2xlbG9nIjsKLQkJZmluYWwgU3RyaW5nIGRhdGEgPQotCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQlTdHJpbmdbXSBjbWQgPQotCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQlnZXRKYXZhVk1QYXRoKCksCi0JCQkJRkxBR19DUCwKLQkJCQljbGFzc3BhdGgsCi0JCQkJbGF1bmNoZXIsCi0JCQkJRkxBR19BUFAsCi0JCQkJYXBwbGljYXRpb24sCi0JCQkJRkxBR19DTUQsCi0JCQkJY29tbWFuZCwKLQkJCQkocmVtb3RlTG9jICE9bnVsbCA/IEZMQUdfRlJPTSA6ICIiKSwKLQkJCQkocmVtb3RlTG9jICE9bnVsbCA/IHJlbW90ZUxvYyA6ICIiKSwKLQkJCQkobG9jYWxMb2MgIT1udWxsID8gRkxBR19UTyA6ICIiKSwKLQkJCQkobG9jYWxMb2MgIT1udWxsID9sb2NhbExvYy5yZXBsYWNlRmlyc3QoImZpbGU6IiwgIiIpIDogIiIpLAotCQkJCShmaWQgIT0gbnVsbCA/IEZMQUdfRklEIDogIiIpLAotCQkJCShmaWQgIT0gbnVsbCA/IGZpZCA6ICIiKSwKLQkJCQkodmVyICE9IG51bGwgPyBGTEFHX1ZFUlNJT04gOiAiIiksCi0JCQkJKHZlciAhPSBudWxsID8gdmVyIDogIiIpLAotCQkJCShjb25maWcgIT0gbnVsbCA/IEZMQUdfQ09ORklHIDogIiIpLAotCQkJCShjb25maWcgIT0gbnVsbCA/IGNvbmZpZyA6ICIiKSwKLQkJCQlGTEFHX1NQTEFTSCwKLQkJCQlGTEFHX0RBVEEsCi0JCQkJZGF0YSwKLQkJCQlGTEFHX0NPTlNPTEVMT0d9OwotCQlmb3IgKGludCBpID0gMCA7aTxjbWQubGVuZ3RoOyBpKyspewotCQkJU3lzdGVtLm91dC5wcmludChjbWRbaV0gKyAiICIpOwkJCQotCQl9U3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCXJldHVybiBjbWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVZNUGF0aCgpIHsKLQkJLy8gQ3JlYXRlIGNvbW1hbmQgc3RyaW5nIGZvciBsYXVuY2hpbmcgdGhlIHByb2Nlc3MKLQkJU3RyaW5nIHZtID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZtLm5hbWUiKTsKLQkJU3RyaW5nIGV4ZWN1dGFibGUgPSAiSjkiLmVxdWFscyh2bSkgPyAiajkiIDogImphdmEiOwotCQlpZiAob3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkNvbnN0YW50cy5PU19XSU4zMi5lcXVhbHMoUGxhdGZvcm0uZ2V0T1MoKSkpCi0JCQlleGVjdXRhYmxlICs9ICJ3LmV4ZSI7Ci0KLQkJU3RyaW5nIGphdmFJbnN0YWxsRGlyID0KLQkJCVN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikgKyBGaWxlLnNlcGFyYXRvciArICJiaW4iOwotCQlyZXR1cm4gamF2YUluc3RhbGxEaXIgKyBGaWxlLnNlcGFyYXRvciArIGV4ZWN1dGFibGU7Ci0JfQotCQotCXB1YmxpYyBpbnQgcGVyZm9ybUFjdGlvbihTdHJpbmdbXSBjbWQpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZ2V0RWNsaXBzZVJvb3QoKSk7Ci0JCXRyeSB7Ci0KLQkJCVByb2Nlc3MgcHJvYyA9Ci0JCQkJUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjbWQsIChTdHJpbmdbXSkgbnVsbCwgZmlsZSk7Ci0KLQkJCVN0cmVhbUNvbnN1bWVyIG91dHB1dHMgPSBuZXcgU3RyZWFtQ29uc3VtZXIocHJvYy5nZXRJbnB1dFN0cmVhbSgpKTsKLQkJCW91dHB1dHMuc3RhcnQoKTsKLQkJCVN0cmVhbUNvbnN1bWVyIGVycm9ycyA9IG5ldyBTdHJlYW1Db25zdW1lcihwcm9jLmdldEVycm9yU3RyZWFtKCkpOwotCQkJZXJyb3JzLnN0YXJ0KCk7Ci0JCQlUaW1lciB0aW1lciA9IG5ldyBUaW1lcihwcm9jKTsKLQkJCXRpbWVyLnN0YXJ0KCk7Ci0KLQkJCXJldHVybiBwcm9jLndhaXRGb3IoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVjbGlwc2VSb290KCkgewotCQlyZXR1cm4gQ29uZmlndXJhdG9yVXRpbHMuZ2V0SW5zdGFsbFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkucmVwbGFjZUZpcnN0KAotCQkJImZpbGU6IiwKLQkJCSIiKTsKLQl9Ci0JCi0JcHVibGljIEFycmF5TGlzdCBnZXRBcnJheUxpc3QoU3RyaW5nW10gbGlzdCl7Ci0JCUFycmF5TGlzdCB0ZW1wID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IoaW50IGkgPSAwOyBpPCBsaXN0Lmxlbmd0aDsgaSsrKXsKLQkJCXRlbXAuYWRkKGxpc3RbaV0pOwotCQl9Ci0JCXJldHVybiB0ZW1wOwotCX0KLQkKLQlwdWJsaWMgRmlsZSBnZXRMYXRlc3RDb25maWd1cmF0aW9uRmlsZShGaWxlIGxvY2FsRmlsZSkgewotCi0JCXRyeSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlYWRpbmcgZnJvbSA6ICIgKyBsb2NhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCUZpbGVSZWFkZXIgZnJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKGxvY2FsRmlsZSk7Ci0JCQkJQnVmZmVyZWRSZWFkZXIgYnJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmcmVhZGVyKTsKLQkJCQl3aGlsZSAoYnJlYWRlci5yZWFkeSgpKSB7Ci0JCQkJCWJyZWFkZXIucmVhZExpbmUoKTsKLS8vCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obGluZSk7Ci0JCQkJfQotCQkJCS8vIHJlYWQgY29uZmlnIGZpbGUKLQkJCQlGaWxlIHBhcmVudCA9IG5ldyBGaWxlKGxvY2FsRmlsZS5nZXRQYXJlbnQoKSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJwYXJlbnQ6ICIgKyBwYXJlbnQuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCVN0cmluZ1tdIHBhckxpc3QgPSBwYXJlbnQubGlzdCgpOwotCQkJCWludCBsYXRlc3QgPSAwOyAKLQkJCQlmb3IgKGludCBpID0gcGFyTGlzdC5sZW5ndGgtMTsgaT49MDsgaS0tKXsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJwYXJMaXN0WyIgKyBpICsgIl06ICIgKyBwYXJMaXN0W2ldKTsKLQkJCQkJaWYgKHBhckxpc3RbaV0uc3RhcnRzV2l0aCgicGxhdGZvcm0iKSl7Ci0JCQkJCQlsYXRlc3QgPSBpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJRmlsZSBjb25maWdGaWxlID0gbmV3IEZpbGUocGFyZW50LmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBwYXJMaXN0W2xhdGVzdF0pOwotCQkJCXJldHVybiBjb25maWdGaWxlOwotCQkJCS8vIGVuZCBvZiBjb25maWcgZmlsZSByZWFkCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBsb2NhbEZpbGU7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgZGVsZXRlRGlyZWN0b3J5KEZpbGUgZGlyKSB7Ci0JCUZpbGVbXSBsaXN0ID0gZGlyLmxpc3RGaWxlcygpOwotCQlpZiAobGlzdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkJCi0JCWZvciAoaW50IGk9MDsgaTxsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobGlzdFtpXS5pc0RpcmVjdG9yeSgpKSAKLQkJCQlkZWxldGVEaXJlY3RvcnkobGlzdFtpXSk7Ci0JCQlpZiAoIWxpc3RbaV0uZGVsZXRlKCkpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gZGVsZXRlICIrbGlzdFtpXS50b1N0cmluZygpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEJ1bmRsZXNJbnN0YWxsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RCdW5kbGVzSW5zdGFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDI5NmNjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEJ1bmRsZXNJbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnN0YW5kYWxvbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmUuKjsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdEJ1bmRsZXNJbnN0YWxsIGV4dGVuZHMgU3RhbmRhbG9uZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luc3RhbGxlZDsKLQotCXB1YmxpYyBUZXN0QnVuZGxlc0luc3RhbGwoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JCWlzSW5zdGFsbGVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdW1TZXRVcCgpIHsKLQkJc3VwZXIudW1TZXRVcCgpOwotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibG9va2luZyBhdCBjb25maWd1cmVkIHNpdGVzIGF2YWlsYWJsZS4uLi4iKTsKLQkJLy9jaGVja0NvbmZpZ3VyZWRTaXRlcygpOwotCQkKLQkJU3RyaW5nIGZlYXR1cmVJZCA9ICJjb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZSI7Ci0JCVN0cmluZyB2ZXJzaW9uID0gIjEuMC4wIjsKLQotCQlTdHJpbmcgZnJvbVJlbW90ZVNpdGVVcmwgPSAiaHR0cDovLyIrZ2V0SHR0cEhvc3QoKSsiOiIrIGdldEh0dHBQb3J0KCkrICIvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUudXBkYXRldGVzdHMvYnVuZGxlU2l0ZS8iOwotCQlpZiAoIWlzSW5zdGFsbGVkKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQkJIj09PT09PT09PT09PT09IiArIHRoaXMuZ2V0Q2xhc3MoKSArICI9PT09PT09PT09PT09Iik7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24gYXBwID0gbmV3IFN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbigpOwotCQkJdHJ5IHsKLQkJCQlleGl0VmFsdWUgPSAoSW50ZWdlcilhcHAucnVuKGdldENvbW1hbmQoCi0JCQkJCSJpbnN0YWxsIiwKLQkJCQkJZmVhdHVyZUlkLAotCQkJCQl2ZXJzaW9uLAotCQkJCQludWxsLAotCQkJCQlmcm9tUmVtb3RlU2l0ZVVybCwKLQkJCQkJVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCWlzSW5zdGFsbGVkID0gdHJ1ZTsKLQkJfQotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGx1Z2luc0V4aXN0KCkgewotCQlJU2l0ZSBsb2NhbFNpdGUgPSBnZXRDb25maWd1cmVkU2l0ZShUQVJHRVRfRklMRV9TSVRFKTsKLQkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbigibG9jYWxTaXRlOiAiICsgbG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKSk7Ci0JCUlQbHVnaW5FbnRyeVtdIHBsdWdpbkVudHJpZXMgPSBsb2NhbFNpdGUuZ2V0UGx1Z2luRW50cmllcygpOwotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHBsdWdpbkVudHJpZXMgPT0gbnVsbCB8fCBwbHVnaW5FbnRyaWVzLmxlbmd0aCA9PSAwKXsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiTm8gcGx1Z2luIGVudHJpZXMgb24gdGhlIHRhcmdldCBzaXRlIik7Ci0JCQlmYWlsKCJObyBwbHVnaW4gZW50cmllcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKLQkJfSBlbHNlewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5FbnRyaWVzLmxlbmd0aDsgaSsrKXsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIHBsdWdpbjogIiArIHBsdWdpbkVudHJpZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQkJCWxpc3QuYWRkKHBsdWdpbkVudHJpZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nW10gcGx1Z2luTmFtZXMgPQotCQkJewkiY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbl8xLjAuMCIsCi0JCQkJImNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWlfMi4wLjAiLAotCQkJCSJjb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnRfMS4wLjAiLAotCQkJCSJjb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aV8xLjAuMCJ9OwotCQlhc3NlcnRUcnVlKGNoZWNrRmlsZXNJbkxpc3QocGx1Z2luTmFtZXMsIGxpc3QpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZXNFeGlzdCgpIHsKLQkJdHJ5IHsKLQkJCUlTaXRlIGxvY2FsU2l0ZSA9ICBnZXRDb25maWd1cmVkU2l0ZShUQVJHRVRfRklMRV9TSVRFKTsKLQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJsb2NhbFNpdGU6ICIgKyBsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpKTsKLQkJCS8vIGdldCBmZWF0dXJlIHJlZmVyZW5jZXMgCi0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGxvY2FsRmVhdHVyZXMgPQotCQkJCWxvY2FsU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJsb2NhbCBjdXJyZW50Q09uZmlnU2l0ZTogIiArIGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKSk7Ci0JCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChsb2NhbEZlYXR1cmVzID09IG51bGwgfHwgbG9jYWxGZWF0dXJlcy5sZW5ndGggPT0gMCl7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJObyBmZWF0dXJlcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKLQkJCQlmYWlsKCJObyBmZWF0dXJlcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEZlYXR1cmVzLmxlbmd0aDsgaSsrKQotCQkJCQlsaXN0LmFkZChsb2NhbEZlYXR1cmVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJCX0KLQkJCVN0cmluZ1tdIGZlYXR1cmVOYW1lcyA9Ci0JCQkJewotCQkJCQkiY29tLmV4YW1wbGUuYnVuZGxlLmZlYXR1cmVfMS4wLjAifTsKLQkJCWFzc2VydFRydWUoY2hlY2tGaWxlc0luTGlzdChmZWF0dXJlTmFtZXMsIGxpc3QpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCX0KLQl9Ci0KLQkvLyBtYWtlcyBzdXJlIGFsbCBmaWxlcy9kaXJlY3RvcmllcyBpbiAibmFtZXMiIGFyZSBpbiB0aGUgZGlyZWN0b3J5IGxpc3RpbmcgImxpc3QiCi0JcHVibGljIGJvb2xlYW4gY2hlY2tGaWxlc0luTGlzdCgKLQkJU3RyaW5nW10gbmFtZXMsCi0JCUFycmF5TGlzdCBsaXN0KSB7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obmFtZXNbaV0pOwotCQkJaWYgKCFsaXN0LmNvbnRhaW5zKG5hbWVzW2ldKSl7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vIGVuc3VyZSBleGl0IHdpdGhvdXQgcHJvYmxlbXMKLQlwdWJsaWMgdm9pZCB0ZXN0RXhpdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZXhpdFZhbHVlOiAiICsgZXhpdFZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKGV4aXRWYWx1ZSwgSVBsYXRmb3JtUnVubmFibGUuRVhJVF9PSyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0RmVhdHVyZURpc2FibGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEZlYXR1cmVEaXNhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MzI3NTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0RmVhdHVyZURpc2FibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuc3RhbmRhbG9uZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGxhdGZvcm1SdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmUuKjsKLQotcHVibGljIGNsYXNzIFRlc3RGZWF0dXJlRGlzYWJsZSBleHRlbmRzIFN0YW5kYWxvbmVNYW5hZ2VyVGVzdENhc2UgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Rpc2FibGVkOwotCQotCXB1YmxpYyBUZXN0RmVhdHVyZURpc2FibGUoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JCWlzRGlzYWJsZWQgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bVNldFVwKCkgewotCQlzdXBlci51bVNldFVwKCk7Ci0JCQotCQlTdHJpbmcgZmVhdHVyZUlkID0gIm15LmFscGhhYmV0IjsKLQkJU3RyaW5nIHZlcnNpb24gPSAiMS4wLjAiOwotCi0JCWNoZWNrQ29uZmlndXJlZFNpdGVzKCk7Ci0JCWlmICghaXNEaXNhYmxlZCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJCSI9PT09PT09PT09PT09PSIgKyB0aGlzLmdldENsYXNzKCkgKyAiPT09PT09PT09PT09PSIpOwotCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uIGFwcCA9IG5ldyBTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24oKTsKLQkJCXRyeSB7Ci0JCQkJZXhpdFZhbHVlID0gKEludGVnZXIpYXBwLnJ1bihnZXRDb21tYW5kKAotCQkJCQkiZGlzYWJsZSIsCi0JCQkJCWZlYXR1cmVJZCwKLQkJCQkJdmVyc2lvbiwKLQkJCQkJbnVsbCwKLQkJCQkJbnVsbCwKLQkJCQkJVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCWlzRGlzYWJsZWQgPSB0cnVlOwotCQkJY2hlY2tDb25maWd1cmVkU2l0ZXMoKTsKLQkJfQotCX0KLQkKLQkvLyBlbnN1cmUgZXhpdCB3aXRob3V0IHByb2JsZW1zCi0JcHVibGljIHZvaWQgdGVzdEV4aXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImV4aXRWYWx1ZTogIiArIGV4aXRWYWx1ZSk7Ci0JCWFzc2VydEVxdWFscyhleGl0VmFsdWUsIElQbGF0Zm9ybVJ1bm5hYmxlLkVYSVRfT0spOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlU3RhdHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKGxvY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWFzc2VydFRydWUobG9jYWxGaWxlLmV4aXN0cygpKTsKLQkJRmlsZSBjb25maWdGaWxlID0gZ2V0TGF0ZXN0Q29uZmlndXJhdGlvbkZpbGUobG9jYWxGaWxlKTsKLQkKLQkJU3RyaW5nW10gbmFtZXMgPQotCQkJewotCQkJCSJmZWF0dXJlcy9teS5hbHBoYWJldC5yb3VuZC5sZXR0ZXJzXzEuMC4wLyIsCi0JCQkJImZlYXR1cmVzL215LmFscGhhYmV0LnN0cmFpZ2h0LmxldHRlcnNfMS4wLjAvIiwKLQkJCQkiZmVhdHVyZXMvbXkuYWxwaGFiZXRfMS4wLjAvIiB9OwotCQlhc3NlcnRUcnVlKGNvbmZpZ0ZpbGUuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKGNoZWNrRmVhdHVyZXNEaXNhYmxlZChnZXRBcnJheUxpc3QobmFtZXMpLGNvbmZpZ0ZpbGUsIFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hlY2tGZWF0dXJlc0Rpc2FibGVkKEFycmF5TGlzdCBmZWF0dXJlTmFtZXMsIEZpbGUgY29uZmlnRmlsZSwgU3RyaW5nIHNpdGVMb2NhdGlvbil7Ci0JCXRyeSB7Ci0JCQlGaWxlUmVhZGVyIGZyZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihjb25maWdGaWxlKTsKLQkJCUJ1ZmZlcmVkUmVhZGVyIGJyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZnJlYWRlcik7Ci0JCQlTdHJpbmcgbGluZTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigibm93IHJlYWRpbmcuLi4iICsgY29uZmlnRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQlib29sZWFuIGlzU2l0ZVRvQ2hlY2sgPSBmYWxzZTsKLQkJCXdoaWxlIChicmVhZGVyLnJlYWR5KCkpIHsKLQkJCQlsaW5lID0gYnJlYWRlci5yZWFkTGluZSgpOwotCQkJCWlmIChsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCI8c2l0ZSB1cmwiKSl7Ci0JCQkJCWlzU2l0ZVRvQ2hlY2sgPSBsaW5lLnRyaW0oKS5zcGxpdCgiXCIiKVsxXS5yZXBsYWNlRmlyc3QoImZpbGU6IiwiIikuZXF1YWxzKHNpdGVMb2NhdGlvbik7Ci0JCQkJfSBlbHNlIGlmIChpc1NpdGVUb0NoZWNrICYmIGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoIjxmZWF0dXJlIGNvbmZpZ3VyZWQiKSl7Ci0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbihsaW5lKTsKLQkJCQkJU3RyaW5nW10gY29uZmlnTGluZSA9IGxpbmUuc3BsaXQoIlwiIik7Ci0JCQkJCWlmIChmZWF0dXJlTmFtZXMuY29udGFpbnMoY29uZmlnTGluZVszXSkgJiYgY29uZmlnTGluZVsxXS5lcXVhbHMoInRydWUiKSl7Ci0JCQkJCQlmYWlsKGNvbmZpZ0xpbmVbM10gKyAiIGhhcyBub3QgYmVlbiBkaXNhYmxlZC4iKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJfSAKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlRW5hYmxlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlRW5hYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYzQwN2MuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0RmVhdHVyZUVuYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5zdGFuZGFsb25lOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbGF0Zm9ybVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc3RhbmRhbG9uZS4qOwotCi1wdWJsaWMgY2xhc3MgVGVzdEZlYXR1cmVFbmFibGUgZXh0ZW5kcyBTdGFuZGFsb25lTWFuYWdlclRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbmFibGVkOwotCQotCXB1YmxpYyBUZXN0RmVhdHVyZUVuYWJsZShTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQkJaXNFbmFibGVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdW1TZXRVcCgpIHsKLQotCQlzdXBlci51bVNldFVwKCk7Ci0JCQotCQlTdHJpbmcgZmVhdHVyZUlkID0gIm15LmFscGhhYmV0IjsKLQkJU3RyaW5nIHZlcnNpb24gPSAiMS4wLjAiOwotCi0JCWNoZWNrQ29uZmlndXJlZFNpdGVzKCk7Ci0JCWlmICghaXNFbmFibGVkKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQkJIj09PT09PT09PT09PT09IiArIHRoaXMuZ2V0Q2xhc3MoKSArICI9PT09PT09PT09PT09Iik7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24gYXBwID0gbmV3IFN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbigpOwotCQkJdHJ5IHsKLQkJCQlleGl0VmFsdWUgPSAoSW50ZWdlcilhcHAucnVuKGdldENvbW1hbmQoCi0JCQkJCSJlbmFibGUiLAotCQkJCQlmZWF0dXJlSWQsCi0JCQkJCXZlcnNpb24sCi0JCQkJCW51bGwsCi0JCQkJCW51bGwsCi0JCQkJCVRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlpc0VuYWJsZWQgPSB0cnVlOwotCQkJY2hlY2tDb25maWd1cmVkU2l0ZXMoKTsKLQkJfQotCX0KLQkKLQkvLyBlbnN1cmUgZXhpdCB3aXRob3V0IHByb2JsZW1zCi0JcHVibGljIHZvaWQgdGVzdEV4aXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImV4aXRWYWx1ZTogIiArIGV4aXRWYWx1ZSk7Ci0JCWFzc2VydEVxdWFscyhleGl0VmFsdWUsIElQbGF0Zm9ybVJ1bm5hYmxlLkVYSVRfT0spOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlU3RhdHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCi0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoKChMb2NhbFNpdGUpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKGxvY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWFzc2VydFRydWUobG9jYWxGaWxlLmV4aXN0cygpKTsKLQkJRmlsZSBjb25maWdGaWxlID0gZ2V0TGF0ZXN0Q29uZmlndXJhdGlvbkZpbGUobG9jYWxGaWxlKTsKLQkJCi0JCVN0cmluZ1tdIG5hbWVzID0KLQkJCXsKLQkJCQkiZmVhdHVyZXMvbXkuYWxwaGFiZXQucm91bmQubGV0dGVyc18xLjAuMC8iLAotCQkJCSJmZWF0dXJlcy9teS5hbHBoYWJldC5zdHJhaWdodC5sZXR0ZXJzXzEuMC4wLyIsCi0JCQkJImZlYXR1cmVzL215LmFscGhhYmV0XzEuMC4wLyIgfTsKLQkJYXNzZXJ0VHJ1ZShjb25maWdGaWxlLmV4aXN0cygpKTsKLQkJYXNzZXJ0VHJ1ZShjaGVja0ZlYXR1cmVzRW5hYmxlZChnZXRBcnJheUxpc3QobmFtZXMpLGNvbmZpZ0ZpbGUsIFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hlY2tGZWF0dXJlc0VuYWJsZWQoQXJyYXlMaXN0IGZlYXR1cmVOYW1lcywgRmlsZSBjb25maWdGaWxlLCBTdHJpbmcgc2l0ZUxvY2F0aW9uKXsKLQkJdHJ5IHsKLQkJCUZpbGVSZWFkZXIgZnJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKGNvbmZpZ0ZpbGUpOwotCQkJQnVmZmVyZWRSZWFkZXIgYnJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmcmVhZGVyKTsKLQkJCVN0cmluZyBsaW5lOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJub3cgcmVhZGluZy4uLiIgKyBjb25maWdGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCWJvb2xlYW4gaXNTaXRlVG9DaGVjayA9IGZhbHNlOwotCQkJd2hpbGUgKGJyZWFkZXIucmVhZHkoKSkgewotCQkJCWxpbmUgPSBicmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkJaWYgKGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoIjxzaXRlIHVybCIpKXsKLQkJCQkJaXNTaXRlVG9DaGVjayA9IGxpbmUudHJpbSgpLnNwbGl0KCJcIiIpWzFdLnJlcGxhY2VGaXJzdCgiZmlsZToiLCIiKS5lcXVhbHMoc2l0ZUxvY2F0aW9uKTsKLQkJCQl9IGVsc2UgaWYgKGlzU2l0ZVRvQ2hlY2sgJiYgbGluZS50cmltKCkuc3RhcnRzV2l0aCgiPGZlYXR1cmUgY29uZmlndXJlZCIpKXsKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKGxpbmUpOwotCQkJCQlTdHJpbmdbXSBjb25maWdMaW5lID0gbGluZS5zcGxpdCgiXCIiKTsKLQkJCQkJaWYgKGZlYXR1cmVOYW1lcy5jb250YWlucyhjb25maWdMaW5lWzNdKSAmJiBjb25maWdMaW5lWzFdLmVxdWFscygiZmFsc2UiKSl7Ci0JCQkJCQlmYWlsKGNvbmZpZ0xpbmVbM10gKyAiIGhhcyBub3QgYmVlbiBlbmFibGVkLiIpOwotCQkJCQl9Ci0JCQkJCS8vIHRlbXAgLSBkZWxldGUgbGF0ZXIKLQkJCQkJaWYgKGZlYXR1cmVOYW1lcy5jb250YWlucyhjb25maWdMaW5lWzNdKSkKLQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbihsaW5lKTsKLQkJCQkJLy8gZW5kIG9mIHRlbXAgZGVsZXRlCi0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOwotCQl9IAotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEZlYXR1cmVJbnN0YWxsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlSW5zdGFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTczY2I0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEZlYXR1cmVJbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnN0YW5kYWxvbmU7Ci0KLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc3RhbmRhbG9uZS4qOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0RmVhdHVyZUluc3RhbGwgZXh0ZW5kcyBTdGFuZGFsb25lTWFuYWdlclRlc3RDYXNlIHsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5zdGFsbGVkOwotCi0JcHVibGljIFRlc3RGZWF0dXJlSW5zdGFsbChTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQkJaXNJbnN0YWxsZWQgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bVNldFVwKCkgewotCQlzdXBlci51bVNldFVwKCk7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKCJsb29raW5nIGF0IGNvbmZpZ3VyZWQgc2l0ZXMgYXZhaWxhYmxlLi4uLiIpOwotCQkvL2NoZWNrQ29uZmlndXJlZFNpdGVzKCk7Ci0JCQotCQlTdHJpbmcgZmVhdHVyZUlkID0gIm15LmFscGhhYmV0IjsKLQkJU3RyaW5nIHZlcnNpb24gPSAiMS4wLjAiOwotCi0JCVN0cmluZyBmcm9tUmVtb3RlU2l0ZVVybCA9Ci0JCQkiaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS8lN0VjaGVja291dCU3RS9wbGF0Zm9ybS11cGRhdGUtaG9tZS8zLjAvc2l0ZS8iOwotCQlpZiAoIWlzSW5zdGFsbGVkKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQkJIj09PT09PT09PT09PT09IiArIHRoaXMuZ2V0Q2xhc3MoKSArICI9PT09PT09PT09PT09Iik7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24gYXBwID0gbmV3IFN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbigpOwotCQkJdHJ5IHsKLQkJCQlleGl0VmFsdWUgPSAoSW50ZWdlcilhcHAucnVuKGdldENvbW1hbmQoCi0JCQkJCSJpbnN0YWxsIiwKLQkJCQkJZmVhdHVyZUlkLAotCQkJCQl2ZXJzaW9uLAotCQkJCQludWxsLAotCQkJCQlmcm9tUmVtb3RlU2l0ZVVybCwKLQkJCQkJVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCWlzSW5zdGFsbGVkID0gdHJ1ZTsKLQkJfQotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGx1Z2luc0V4aXN0KCkgewotCQlJU2l0ZSBsb2NhbFNpdGUgPSBnZXRDb25maWd1cmVkU2l0ZShUQVJHRVRfRklMRV9TSVRFKTsKLQkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbigibG9jYWxTaXRlOiAiICsgbG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKSk7Ci0JCUlQbHVnaW5FbnRyeVtdIHBsdWdpbkVudHJpZXMgPSBsb2NhbFNpdGUuZ2V0UGx1Z2luRW50cmllcygpOwotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHBsdWdpbkVudHJpZXMgPT0gbnVsbCB8fCBwbHVnaW5FbnRyaWVzLmxlbmd0aCA9PSAwKXsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiTm8gcGx1Z2luIGVudHJpZXMgb24gdGhlIHRhcmdldCBzaXRlIik7Ci0JCQlmYWlsKCJObyBwbHVnaW4gZW50cmllcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKLQkJfSBlbHNlewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5FbnRyaWVzLmxlbmd0aDsgaSsrKXsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImZvdW5kIHBsdWdpbjogIiArIHBsdWdpbkVudHJpZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQkJCWxpc3QuYWRkKHBsdWdpbkVudHJpZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nW10gcGx1Z2luTmFtZXMgPQotCQkJewkibXkuYWxwaGFiZXQubGV0dGVyLmFfMS4wLjAiLAotCQkJCSJteS5hbHBoYWJldC5sZXR0ZXIuYl8xLjAuMCIsCi0JCQkJIm15LmFscGhhYmV0LmxldHRlci5jXzEuMC4wIiwKLQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmVfMS4wLjAiLAotCQkJCSJteS5hbHBoYWJldC5yb3VuZC5sZXR0ZXJzXzEuMC4wIiwKLQkJCQkibXkuYWxwaGFiZXQuc3RyYWlnaHQubGV0dGVyc18xLjAuMCIsCi0JCQkJIm15LmFscGhhYmV0XzEuMC4wIiB9OwotCQlhc3NlcnRUcnVlKGNoZWNrRmlsZXNJbkxpc3QocGx1Z2luTmFtZXMsIGxpc3QpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZXNFeGlzdCgpIHsKLQkJdHJ5IHsKLQkJCUlTaXRlIGxvY2FsU2l0ZSA9ICBnZXRDb25maWd1cmVkU2l0ZShUQVJHRVRfRklMRV9TSVRFKTsKLQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJsb2NhbFNpdGU6ICIgKyBsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpKTsKLQkJCS8vIGdldCBmZWF0dXJlIHJlZmVyZW5jZXMgCi0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGxvY2FsRmVhdHVyZXMgPQotCQkJCWxvY2FsU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJsb2NhbCBjdXJyZW50Q09uZmlnU2l0ZTogIiArIGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKSk7Ci0JCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChsb2NhbEZlYXR1cmVzID09IG51bGwgfHwgbG9jYWxGZWF0dXJlcy5sZW5ndGggPT0gMCl7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJObyBmZWF0dXJlcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKLQkJCQlmYWlsKCJObyBmZWF0dXJlcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEZlYXR1cmVzLmxlbmd0aDsgaSsrKQotCQkJCQlsaXN0LmFkZChsb2NhbEZlYXR1cmVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJCX0KLQkJCVN0cmluZ1tdIGZlYXR1cmVOYW1lcyA9Ci0JCQkJewotCQkJCQkibXkuYWxwaGFiZXQucm91bmQubGV0dGVyc18xLjAuMCIsCi0JCQkJCSJteS5hbHBoYWJldC5zdHJhaWdodC5sZXR0ZXJzXzEuMC4wIiwKLQkJCQkJIm15LmFscGhhYmV0XzEuMC4wIiB9OwotCQkJYXNzZXJ0VHJ1ZShjaGVja0ZpbGVzSW5MaXN0KGZlYXR1cmVOYW1lcywgbGlzdCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJfQotCX0KLQotCS8vIG1ha2VzIHN1cmUgYWxsIGZpbGVzL2RpcmVjdG9yaWVzIGluICJuYW1lcyIgYXJlIGluIHRoZSBkaXJlY3RvcnkgbGlzdGluZyAibGlzdCIKLQlwdWJsaWMgYm9vbGVhbiBjaGVja0ZpbGVzSW5MaXN0KAotCQlTdHJpbmdbXSBuYW1lcywKLQkJQXJyYXlMaXN0IGxpc3QpIHsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihuYW1lc1tpXSk7Ci0JCQlpZiAoIWxpc3QuY29udGFpbnMobmFtZXNbaV0pKXsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gZW5zdXJlIGV4aXQgd2l0aG91dCBwcm9ibGVtcwotCXB1YmxpYyB2b2lkIHRlc3RFeGl0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJleGl0VmFsdWU6ICIgKyBleGl0VmFsdWUpOwotCQlhc3NlcnRFcXVhbHMoZXhpdFZhbHVlLCBJUGxhdGZvcm1SdW5uYWJsZS5FWElUX09LKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlVW5pbnN0YWxsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlVW5pbnN0YWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMGQwNzkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0RmVhdHVyZVVuaW5zdGFsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5zdGFuZGFsb25lOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zdGFuZGFsb25lLio7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RGZWF0dXJlVW5pbnN0YWxsIGV4dGVuZHMgU3RhbmRhbG9uZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVW5pbnN0YWxsZWQ7Ci0JCi0JcHVibGljIFRlc3RGZWF0dXJlVW5pbnN0YWxsKFN0cmluZyBhcmcwKXsKLQkJc3VwZXIoYXJnMCk7Ci0JCWlzVW5pbnN0YWxsZWQgPSBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdW1TZXRVcCgpIHsKLQkJc3VwZXIudW1TZXRVcCgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImxvb2tpbmcgYXQgY29uZmlndXJlZCBzaXRlcyBhdmFpbGFibGUuLi4uIik7Ci0JCWNoZWNrQ29uZmlndXJlZFNpdGVzKCk7Ci0JCQotCQlTdHJpbmcgZmVhdHVyZUlkID0gIm15LmFscGhhYmV0IjsKLQkJU3RyaW5nIHZlcnNpb24gPSAiMS4wLjAiOwotCi0JCWlmKCFpc1VuaW5zdGFsbGVkKXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCQkiPT09PT09PT09PT09PT0iICsgdGhpcy5nZXRDbGFzcygpICsgIj09PT09PT09PT09PT0iKTsKLQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbiBhcHAgPSBuZXcgU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uKCk7Ci0JCQl0cnkgewotCQkJCWV4aXRWYWx1ZSA9IChJbnRlZ2VyKWFwcC5ydW4oZ2V0Q29tbWFuZCgKLQkJCQkJInVuaW5zdGFsbCIsCi0JCQkJCWZlYXR1cmVJZCwKLQkJCQkJdmVyc2lvbiwKLQkJCQkJbnVsbCwKLQkJCQkJbnVsbCwKLQkJCQkJVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCWlzVW5pbnN0YWxsZWQgPSB0cnVlOwotCQl9Ci0JfQotCQotCS8vIGVuc3VyZSBleGl0IHdpdGhvdXQgcHJvYmxlbXMKLQlwdWJsaWMgdm9pZCB0ZXN0RXhpdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZXhpdFZhbHVlOiAiICsgZXhpdFZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKGV4aXRWYWx1ZSwgSVBsYXRmb3JtUnVubmFibGUuRVhJVF9PSyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlc1VuaW5zdGFsbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJU2l0ZSBsb2NhbFNpdGUgPSBnZXRDb25maWd1cmVkU2l0ZShUQVJHRVRfRklMRV9TSVRFKTsKLQkJCQotCQkJLy8gZ2V0IGZlYXR1cmUgcmVmZXJlbmNlcyAKLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gbG9jYWxGZWF0dXJlcyA9Ci0JCQkJbG9jYWxTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChsb2NhbEZlYXR1cmVzID09IG51bGwgfHwgbG9jYWxGZWF0dXJlcy5sZW5ndGggPT0gMCl7Ci0JCQkJZmFpbCgiTm8gZmVhdHVyZXMgb24gdGhlIHRhcmdldCBzaXRlIik7Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxGZWF0dXJlcy5sZW5ndGg7IGkrKykKLQkJCQkJbGlzdC5hZGQobG9jYWxGZWF0dXJlc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlTdHJpbmdbXSBmZWF0dXJlTmFtZXMgPQotCQkJCXsKLQkJCQkJIm15LmFscGhhYmV0LnJvdW5kLmxldHRlcnNfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQuc3RyYWlnaHQubGV0dGVyc18xLjAuMCIsCi0JCQkJCSJteS5hbHBoYWJldF8xLjAuMCIgfTsKLQkJCWFzc2VydFRydWUoY2hlY2tGaWxlc05vdEluTGlzdChmZWF0dXJlTmFtZXMsIGxpc3QpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFBsdWdpbnNVbmluc3RhbGxlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQkJSVNpdGUgbG9jYWxTaXRlID0gZ2V0Q29uZmlndXJlZFNpdGUoVEFSR0VUX0ZJTEVfU0lURSk7Ci0JCQkKLQkJCUlQbHVnaW5FbnRyeVtdIHBsdWdpbkVudHJpZXMgPSBsb2NhbFNpdGUuZ2V0UGx1Z2luRW50cmllcygpOwotCQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAocGx1Z2luRW50cmllcyA9PSBudWxsIHx8IHBsdWdpbkVudHJpZXMubGVuZ3RoID09IDApCi0JCQkJZmFpbCgiTm8gcGx1Z2luIGVudHJpZXMgb24gdGhlIHRhcmdldCBzaXRlIik7Ci0JCQllbHNlCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5FbnRyaWVzLmxlbmd0aDsgaSsrKXsKLQkJCQkJbGlzdC5hZGQocGx1Z2luRW50cmllc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicGx1Z2luIGZvdW5kOiAiICsgcGx1Z2luRW50cmllc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQkJfQotCi0JCQlTdHJpbmdbXSBwbHVnaW5OYW1lcyA9Ci0JCQkJewkibXkuYWxwaGFiZXQubGV0dGVyLmFfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmJfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmNfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmVfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQucm91bmQubGV0dGVyc18xLjAuMCIsCi0JCQkJCSJteS5hbHBoYWJldC5zdHJhaWdodC5sZXR0ZXJzXzEuMC4wIiwKLQkJCQkJIm15LmFscGhhYmV0XzEuMC4wIiB9OwotCQkJYXNzZXJ0VHJ1ZShjaGVja0ZpbGVzTm90SW5MaXN0KHBsdWdpbk5hbWVzLCBsaXN0KSk7CQotCX0KLQkKLQkvLyBtYWtlcyBzdXJlIGFsbCBmaWxlcy9kaXJlY3RvcmllcyBpbiAibmFtZXMiIGFyZSBOT1QgaW4gdGhlIGRpcmVjdG9yeSBsaXN0aW5nICJsaXN0IgotCXB1YmxpYyBib29sZWFuIGNoZWNrRmlsZXNOb3RJbkxpc3QoCi0JCVN0cmluZ1tdIG5hbWVzLAotCQlBcnJheUxpc3QgbGlzdCkgewotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJzZWFyY2hpbmcgZm9yICIgKyBuYW1lc1tpXSArICIuLi4iKTsKLQkJCWlmIChsaXN0LmNvbnRhaW5zKG5hbWVzW2ldKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0RmVhdHVyZVVwZGF0ZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0RmVhdHVyZVVwZGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTg5YjY5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEZlYXR1cmVVcGRhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuc3RhbmRhbG9uZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc3RhbmRhbG9uZS4qOwotCi1wdWJsaWMgY2xhc3MgVGVzdEZlYXR1cmVVcGRhdGUgZXh0ZW5kcyBTdGFuZGFsb25lTWFuYWdlclRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVcGRhdGVkOwotCQotCXB1YmxpYyBUZXN0RmVhdHVyZVVwZGF0ZShTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQkJaXNVcGRhdGVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdW1TZXRVcCgpIHsKLQkJc3VwZXIudW1TZXRVcCgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImxvb2tpbmcgYXQgY29uZmlndXJlZCBzaXRlcyBhdmFpbGFibGUuLi4uIik7Ci0JCWNoZWNrQ29uZmlndXJlZFNpdGVzKCk7Ci0JCQotCQlTdHJpbmcgZmVhdHVyZUlkID0gIm15LmFscGhhYmV0IjsKLQkJU3RyaW5nIHZlcnNpb24gPSAiMS4wLjEiOwotCi0JCWlmICghaXNVcGRhdGVkKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQkJIj09PT09PT09PT09PT09IiArIHRoaXMuZ2V0Q2xhc3MoKSArICI9PT09PT09PT09PT09Iik7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24gYXBwID0gbmV3IFN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbigpOwotCQkJdHJ5IHsKLQkJCQlleGl0VmFsdWUgPSAoSW50ZWdlcilhcHAucnVuKGdldENvbW1hbmQoCi0JCQkJCQkidXBkYXRlIiwKLQkJCQkJCWZlYXR1cmVJZCwKLQkJCQkJCXZlcnNpb24sCi0JCQkJCQludWxsLAotCQkJCQkJbnVsbCwKLQkJCQkJCVRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlpc1VwZGF0ZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0KLQkvLyBlbnN1cmUgZXhpdCB3aXRob3V0IHByb2JsZW1zCi0JcHVibGljIHZvaWQgdGVzdEV4aXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImV4aXRWYWx1ZTogIiArIGV4aXRWYWx1ZSk7Ci0JCWFzc2VydEVxdWFscyhleGl0VmFsdWUsIElQbGF0Zm9ybVJ1bm5hYmxlLkVYSVRfT0spOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UGx1Z2luc0V4aXN0KCkgewotCi0JCQlJU2l0ZSBsb2NhbFNpdGUgPSAgZ2V0Q29uZmlndXJlZFNpdGUoVEFSR0VUX0ZJTEVfU0lURSk7Ci0KLQkJCUlQbHVnaW5FbnRyeVtdIHBsdWdpbkVudHJpZXMgPSBsb2NhbFNpdGUuZ2V0UGx1Z2luRW50cmllcygpOwotCQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAocGx1Z2luRW50cmllcyA9PSBudWxsIHx8IHBsdWdpbkVudHJpZXMubGVuZ3RoID09IDApCi0JCQkJZmFpbCgiTm8gcGx1Z2luIGVudHJpZXMgb24gdGhlIHRhcmdldCBzaXRlIik7Ci0JCQllbHNlCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5FbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWxpc3QuYWRkKAotCQkJCQkJcGx1Z2luRW50cmllc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQkJfQotCi0JCQlTdHJpbmdbXSBwbHVnaW5OYW1lcyA9Ci0JCQkJewotCQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmFfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmJfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmNfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmVfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQucm91bmQubGV0dGVyc18xLjAuMCIsCi0JCQkJCSJteS5hbHBoYWJldC5zdHJhaWdodC5sZXR0ZXJzXzEuMC4wIiwKLQkJCQkJIm15LmFscGhhYmV0XzEuMC4wIiwKLQkJCQkJIm15LmFscGhhYmV0LmxldHRlci5hXzEuMC4xIiwKLQkJCQkJIm15LmFscGhhYmV0LmxldHRlci5iXzEuMC4xIiwKLQkJCQkJIm15LmFscGhhYmV0LmxldHRlci5jXzEuMC4xIiwKLQkJCQkJIm15LmFscGhhYmV0LmxldHRlci5lXzEuMC4xIiwKLQkJCQkJIm15LmFscGhhYmV0LnJvdW5kLmxldHRlcnNfMS4wLjEiLAotCQkJCQkibXkuYWxwaGFiZXQuc3RyYWlnaHQubGV0dGVyc18xLjAuMSIsCi0JCQkJCSJteS5hbHBoYWJldF8xLjAuMSIgfTsKLQkJCWFzc2VydFRydWUoY2hlY2tGaWxlc0luTGlzdChwbHVnaW5OYW1lcywgbGlzdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlc0V4aXN0KCkgewotCQl0cnkgewotCQkJSVNpdGUgbG9jYWxTaXRlID0gZ2V0Q29uZmlndXJlZFNpdGUoVEFSR0VUX0ZJTEVfU0lURSk7Ci0KLQkJCS8vIGdldCBmZWF0dXJlIHJlZmVyZW5jZXMKLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gbG9jYWxGZWF0dXJlcyA9Ci0JCQkJbG9jYWxTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChsb2NhbEZlYXR1cmVzID09IG51bGwgfHwgbG9jYWxGZWF0dXJlcy5sZW5ndGggPT0gMCkgewotCQkJCWZhaWwoIk5vIGZlYXR1cmVzIG9uIHRoZSB0YXJnZXQgc2l0ZSIpOwotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsRmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJbGlzdC5hZGQoCi0JCQkJCQlsb2NhbEZlYXR1cmVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJCQkJbG9jYWxGZWF0dXJlc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nW10gZmVhdHVyZU5hbWVzID0KLQkJCQl7Ci0JCQkJCSJteS5hbHBoYWJldC5yb3VuZC5sZXR0ZXJzXzEuMC4wIiwKLQkJCQkJIm15LmFscGhhYmV0LnN0cmFpZ2h0LmxldHRlcnNfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXRfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQucm91bmQubGV0dGVyc18xLjAuMSIsCi0JCQkJCSJteS5hbHBoYWJldC5zdHJhaWdodC5sZXR0ZXJzXzEuMC4xIiwKLQkJCQkJIm15LmFscGhhYmV0XzEuMC4xIiB9OwotCQkJYXNzZXJ0VHJ1ZShjaGVja0ZpbGVzSW5MaXN0KGZlYXR1cmVOYW1lcywgbGlzdCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJfQotCX0KLQotCS8vIG1ha2VzIHN1cmUgYWxsIGZpbGVzL2RpcmVjdG9yaWVzIGluICJuYW1lcyIgYXJlIGluIHRoZSBkaXJlY3RvcnkgbGlzdGluZwotCS8vICJsaXN0IgotCXB1YmxpYyBib29sZWFuIGNoZWNrRmlsZXNJbkxpc3QoU3RyaW5nW10gbmFtZXMsIEFycmF5TGlzdCBsaXN0KSB7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFsaXN0LmNvbnRhaW5zKG5hbWVzW2ldKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy90eXBlcy9BbGxUeXBlc1Rlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy90eXBlcy9BbGxUeXBlc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOGM0NWUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdHlwZXMvQWxsVHlwZXNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy50eXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLQotcHVibGljIGNsYXNzIEFsbFR5cGVzVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotcHVibGljIEFsbFR5cGVzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0Jc3VpdGUuc2V0TmFtZSgiUmVndWxhciBJbnN0YWxsIFRlc3RzIik7Ci0JCi0JLy8gdGhlIGZvbGxvd2luZyB3aWxsIHRha2UgYWxsIHRlaCB0ZXN0IG1ldGhvZHMgaW4gdGVoIGNsYXNzIHRoYXQgc3RhcnQgd2l0aCAndGVzdCcKLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEZlYXR1cmVUeXBlLmNsYXNzKSk7Ci0Jc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RTaXRlVHlwZS5jbGFzcykpOwkKLQkKLQkvLyBvciB5b3UgY2FuIHNwZWNpZnkgdGhlIG1ldGhvZAotCS8vc3VpdGUuYWRkVGVzdChuZXcgVGVzdEdldEZlYXR1cmUoIm1ldGhvZFRoYXREb2VzTm90U3RhcnRXaXRodGVzdCIpKTsJCi0JCi0JcmV0dXJuIHN1aXRlOwotfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdHlwZXMvVGVzdEZlYXR1cmVUeXBlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy90eXBlcy9UZXN0RmVhdHVyZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyNzA1Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy90eXBlcy9UZXN0RmVhdHVyZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnR5cGVzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0RmVhdHVyZVR5cGUgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRURfRkVBVFVSRV9UWVBFID0gInBhY2thZ2VkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNUQUxMRURfRkVBVFVSRV9UWVBFID0gImluc3RhbGxlZCI7IC8vJE5PTi1OTFMtMSQJCi0JCi0JLyoqCi0JICogVGVzdCB0aGUgZ2V0RmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBUZXN0RmVhdHVyZVR5cGUoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEluc3RhbGxhYmxlRmVhdHVyZVR5cGUoKSB7Ci0JCVN0cmluZyBwbHVnaW5JRCA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0RGVzY3JpcHRvcigpLmdldFVuaXF1ZUlkZW50aWZpZXIoKSArICIuIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcGx1Z2luSUQgKyBQQUNLQUdFRF9GRUFUVVJFX1RZUEU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEV4ZWN1dGFibGVGZWF0dXJlVHlwZSgpIHsKLQkJU3RyaW5nIHBsdWdpbklEID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXREZXNjcmlwdG9yKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpICsgIi4iOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwbHVnaW5JRCArIElOU1RBTExFRF9GRUFUVVJFX1RZUEU7Ci0JfQkJCi0JCi0JLyoqCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlUGFja2FnZWRGZWF0dXJlVHlwZSgpIHRocm93cyBFeGNlcHRpb257IAotCQlGZWF0dXJlVHlwZUZhY3RvcnkgZmFjdG9yaWVzID0gRmVhdHVyZVR5cGVGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCUlGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0gZmFjdG9yaWVzLmdldEZhY3RvcnkoZ2V0RGVmYXVsdEluc3RhbGxhYmxlRmVhdHVyZVR5cGUoKSk7Ci0JCQotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFLG51bGwpOwotCQlVUkwgZmVhdHVyZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSwiZmVhdHVyZXMvZmVhdHVyZXMyLmphciAiKTsKLQkJCi0JCUlGZWF0dXJlIGFub3RoZXJGZWF0dXJlID0gZmFjdG9yeS5jcmVhdGVGZWF0dXJlKGZlYXR1cmVVUkwsc2l0ZSxudWxsKTsKLQkJCi0JCWFzc2VydFRydWUoIkZhY3RvcnkgZG9lc24ndCBjcmVhdGUgc2FtZSBmZWF0dXJlIixhbm90aGVyRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZXF1YWxzKGFub3RoZXJGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpOwotCX0JCi0JCi0JCS8qKgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZUV4ZWN1dGFibGVGZWF0dXJlVHlwZSgpIHRocm93cyBFeGNlcHRpb257IAotCQlGZWF0dXJlVHlwZUZhY3RvcnkgZmFjdG9yaWVzID0gRmVhdHVyZVR5cGVGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCUlGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0gZmFjdG9yaWVzLmdldEZhY3RvcnkoZ2V0RGVmYXVsdEV4ZWN1dGFibGVGZWF0dXJlVHlwZSgpKTsKLQkJCi0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsbnVsbCk7Ci0JCVVSTCBmZWF0dXJlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFLCJ0ZXN0QVBJLyIrU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgrImZlYXR1cmUzLyIpOwotCQkKLQkJSUZlYXR1cmUgYW5vdGhlckZlYXR1cmUgPSBmYWN0b3J5LmNyZWF0ZUZlYXR1cmUoZmVhdHVyZVVSTCxzaXRlLG51bGwpOwotCQkKLQkJYXNzZXJ0VHJ1ZSgiRmFjdG9yeSBkb2Vzbid0IGNyZWF0ZSBzYW1lIGZlYXR1cmUiLGFub3RoZXJGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5lcXVhbHMoYW5vdGhlckZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSk7Ci0JfQkKLQkKLQkvKioKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlVHlwZSgpIHRocm93cyBFeGNlcHRpb257IAotCQlGZWF0dXJlVHlwZUZhY3RvcnkgZmFjdG9yaWVzID0gRmVhdHVyZVR5cGVGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCUlGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0gZmFjdG9yaWVzLmdldEZhY3RvcnkoZ2V0RGVmYXVsdEluc3RhbGxhYmxlRmVhdHVyZVR5cGUoKSk7Ci0JCQotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfSFRUUF9TSVRFLG51bGwpOwotCQlJRmVhdHVyZSBmZWF0dXJlID0gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpWzBdLmdldEZlYXR1cmUobnVsbCk7Ci0JCQotCQlJRmVhdHVyZSBhbm90aGVyRmVhdHVyZSA9IGZhY3RvcnkuY3JlYXRlRmVhdHVyZShmZWF0dXJlLmdldFVSTCgpLHNpdGUsbnVsbCk7Ci0JCQotCQlhc3NlcnRUcnVlKCJGYWN0b3J5IGRvZXNuJ3QgY3JlYXRlIHNhbWUgZmVhdHVyZSIsZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZXF1YWxzKGFub3RoZXJGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlTmV3VHlwZSgpIHRocm93cyBFeGNlcHRpb257IAotCQlGZWF0dXJlVHlwZUZhY3RvcnkgZmFjdG9yaWVzID0gRmVhdHVyZVR5cGVGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCUlGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0gZmFjdG9yaWVzLmdldEZhY3RvcnkoZ2V0RGVmYXVsdEV4ZWN1dGFibGVGZWF0dXJlVHlwZSgpKTsKLQkJCi0JCVN0cmluZyBmZWF0dXJlUGF0aCA9IGRhdGFQYXRoKyJGZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUxL3NpdGUueG1sIjsKLQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IEZpbGUoZmVhdHVyZVBhdGgpLnRvVVJMKCksbnVsbCk7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXTsKLQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkKLQkJSUZlYXR1cmUgYW5vdGhlckZlYXR1cmUgPSBmYWN0b3J5LmNyZWF0ZUZlYXR1cmUoZmVhdHVyZS5nZXRVUkwoKSxzaXRlLG51bGwpOwotCi0JCWFzc2VydFRydWUoZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcik7CQkKLQkJYXNzZXJ0VHJ1ZSgoKEZlYXR1cmVSZWZlcmVuY2UpcmVmKS5nZXRUeXBlKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS5mZWF0dXJlMSIpKTsJCQotCQlhc3NlcnRUcnVlKCJGYWN0b3J5IGRvZXNuJ3QgY3JlYXRlIHNhbWUgZmVhdHVyZSIsZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZXF1YWxzKGFub3RoZXJGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpOwotCi0KLQl9Ci0JCi0JCi0JCS8qKgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEZlYXR1cmVBbm90aGVyVHlwZSgpIHRocm93cyBFeGNlcHRpb257IAotCQlGZWF0dXJlVHlwZUZhY3RvcnkgZmFjdG9yaWVzID0gRmVhdHVyZVR5cGVGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCUlGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0gZmFjdG9yaWVzLmdldEZhY3RvcnkoZ2V0RGVmYXVsdEluc3RhbGxhYmxlRmVhdHVyZVR5cGUoKSk7Ci0JCQotCQlTdHJpbmcgZmVhdHVyZVBhdGggPSBkYXRhUGF0aCsiRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMi9zaXRlLnhtbCI7Ci0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBGaWxlKGZlYXR1cmVQYXRoKS50b1VSTCgpLG51bGwpOwotCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF07CQkKLQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkKLQkJSUZlYXR1cmUgYW5vdGhlckZlYXR1cmUgPSBmYWN0b3J5LmNyZWF0ZUZlYXR1cmUoZmVhdHVyZS5nZXRVUkwoKSxzaXRlLG51bGwpOwotCQkKLQkJYXNzZXJ0VHJ1ZSgiRmFjdG9yeSBkb2Vzbid0IGNyZWF0ZSBzYW1lIGZlYXR1cmUiLGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyhhbm90aGVyRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKTsKLQkJYXNzZXJ0VHJ1ZShmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIEZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlcik7Ci0JCWFzc2VydFRydWUoKChGZWF0dXJlUmVmZXJlbmNlKXJlZikuZ2V0VHlwZSgpLmVxdWFscygib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUucGFja2FnZWQiKSk7Ci0JCQotCX0KLQkJCi0JCQotCS8qKgotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEZlYXR1cmVVbmtub3duVHlwZSgpIHRocm93cyBFeGNlcHRpb257IAotCQlTdHJpbmcgZmVhdHVyZVBhdGggPSBkYXRhUGF0aCsiRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMy9zaXRlLnhtbCI7Ci0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBGaWxlKGZlYXR1cmVQYXRoKS50b1VSTCgpLG51bGwpOwotCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF07CQkKLQkJdHJ5IHsKLQkJCXJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJYXNzZXJ0VHJ1ZSgiaWQgZm91bmQsIHNob3VsZCBub3QgYmUgZm91bmQiLGZhbHNlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKXsKLQkJCWlmIChlLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS51bmtub3dudHlwZS5qYXIiKT09LTEpewotCQkJCXRocm93IGU7Ci0JCQl9Ci0JCX0KLQkJCi0JfQkJCi0JCQotfQotCi0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3R5cGVzL1Rlc3RTaXRlVHlwZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdHlwZXMvVGVzdFNpdGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYzc0NTUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdHlwZXMvVGVzdFNpdGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnR5cGVzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlNpdGVVUkxDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuaW1wbGVtZW50YXRpb24uU2l0ZUZUUEZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0U2l0ZVR5cGUgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogVGVzdCB0aGUgZ2V0RmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBUZXN0U2l0ZVR5cGUoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JLyoqCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2l0ZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgZmVhdHVyZVBhdGggPSBkYXRhUGF0aCArICJTaXRlVHlwZUV4YW1wbGVzL3NpdGUxL3NpdGUueG1sIjsKLQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IEZpbGUoZmVhdHVyZVBhdGgpLnRvVVJMKCksbnVsbCk7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXTsKLQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCi0JCWFzc2VydFRydWUoc2l0ZS5nZXRTaXRlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBTaXRlVVJMQ29udGVudFByb3ZpZGVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKFNpdGUpIHNpdGUpLmdldFR5cGUoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmh0dHAiKSk7Ci0JCWFzc2VydFRydWUoZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIpOwotCi0JfQotCi0JLyoqCi0JCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RGVFBTaXRlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJGVFBMaWtlU2l0ZS8iKSxudWxsKTsKLQotCQkvLyBzaG91bGQgbm90IGZpbmQgdGhlIG1hcHBpbmcKLQkJLy8gYnV0IHRoZW4gc2hvdWxkIGF0dGVtcHQgdG8gcmVhZCB0aGUgWE1MIGZpbGUKLQkJLy8gZm91bmQgYSBuZXcgdHlwZQotCQkvLyBjYWxsIHRoZSBuZXcgdHlwZQotCQlhc3NlcnRUcnVlKAotCQkJIldyb25nIHNpdGUgdHlwZSIsCi0JCQlzaXRlLmdldFR5cGUoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5mdHAiKSk7Ci0JCWFzc2VydFRydWUoCi0JCQkiV3JvbmcgZmlsZSIsCi0JCQlzaXRlLmdldFVSTCgpLmdldEZpbGUoKS5lcXVhbHMoIi8iICsgU2l0ZUZUUEZhY3RvcnkuRklMRSkpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL3NpdGVmdHAueG1sIik7Ci0JCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShyZW1vdGVVUkwsbnVsbCk7Ci0JCQlzaXRlLmdldEFyY2hpdmVzKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJaWYgKGUuZ2V0TWVzc2FnZSgpLmluZGV4T2YoIjwvZmVhdHVyZT4iKSA9PSAtMSkgewotCQkJCXRocm93IGU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3VpdmFsdWVzL0FsbENvcmVVSVRlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy91aXZhbHVlcy9BbGxDb3JlVUlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDFlNTk5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3VpdmFsdWVzL0FsbENvcmVVSVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnVpdmFsdWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotCi1wdWJsaWMgY2xhc3MgQWxsQ29yZVVJVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotcHVibGljIEFsbENvcmVVSVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCXN1aXRlLnNldE5hbWUoIlJlZ3VsYXIgSW5zdGFsbCBUZXN0cyIpOwotCQotCS8vIHRoZSBmb2xsb3dpbmcgd2lsbCB0YWtlIGFsbCB0ZWggdGVzdCBtZXRob2RzIGluIHRlaCBjbGFzcyB0aGF0IHN0YXJ0IHdpdGggJ3Rlc3QnCi0Jc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RVSUxhYmVsLmNsYXNzKSk7Ci0JCi0JLy8gb3IgeW91IGNhbiBzcGVjaWZ5IHRoZSBtZXRob2QKLQkvL3N1aXRlLmFkZFRlc3QobmV3IFRlc3RHZXRGZWF0dXJlKCJtZXRob2RUaGF0RG9lc05vdFN0YXJ0V2l0aHRlc3QiKSk7CQotCQotCXJldHVybiBzdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3VpdmFsdWVzL1Rlc3RVSUxhYmVsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy91aXZhbHVlcy9UZXN0VUlMYWJlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2VmN2RkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3VpdmFsdWVzL1Rlc3RVSUxhYmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnVpdmFsdWVzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdFVJTGFiZWwgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogVGVzdCB0aGUgZ2V0RmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBUZXN0VUlMYWJlbChTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogTWV0aG9kIHRlc3RIVFRQU2l0ZS4KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYW5hZ2VyU2l0ZSgpIHRocm93cyBFeGNlcHRpb257IAotCQkKLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTCgiaHR0cCIsZ2V0SHR0cEhvc3QoKSxnZXRIdHRwUG9ydCgpLGJ1bmRsZS5nZXRTdHJpbmcoIkhUVFBfUEFUSF8yIikpLG51bGwpOwotCQlJQ2F0ZWdvcnlbXSBjYXRlZ29yaWVzID0gcmVtb3RlU2l0ZS5nZXRDYXRlZ29yaWVzKCk7Ci0JCWZvciAoaW50IGkgPTA7IGk8Y2F0ZWdvcmllcy5sZW5ndGg7IGkrKyl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNhdGVnb3J5IC0+IitjYXRlZ29yaWVzW2ldLmdldExhYmVsKCkrIjoiK2NhdGVnb3JpZXNbaV0uZ2V0TmFtZSgpKTsKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVtb3RlU2l0ZS5nZXREZXNjcmlwdGlvbigpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlbW90ZUZlYXR1cmVzID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlpZiAocmVtb3RlRmVhdHVyZXM9PW51bGwgfHwgcmVtb3RlRmVhdHVyZXMubGVuZ3RoPT0wKSBmYWlsKCJObyBmZWF0dXJlIGF2YWlsYWJsZSBmb3IgdGVzdGluZyIpOwkJCi0JCWZvciAoaW50IGk9MDtpPHJlbW90ZUZlYXR1cmVzLmxlbmd0aDtpKyspewotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlbW90ZUZlYXR1cmVzW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImZlYXR1cmU6IitmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSsiLT4iK2ZlYXR1cmUuZ2V0TGFiZWwoKSk7Ci0JCQlwcmludChmZWF0dXJlLmdldExpY2Vuc2UoKSwiTGljZW5zZSIpOwotCQkJcHJpbnQoZmVhdHVyZS5nZXRDb3B5cmlnaHQoKSwiQ29weXJpZ2h0Iik7CQkJCi0JCQlwcmludChmZWF0dXJlLmdldERlc2NyaXB0aW9uKCksIkRlc2NyaXB0aW9uIik7CQkJCQotCQkJCi0JCQkvLyBjaGVjayB0aGF0IGl0IGRvd25sb2FkcyB0aGUgZmVhdHVyZS5qYXIgdW5kZXIgdGhlIGNvdmVyCi0JCQkvLyBhbmQgdW5wYWNrIGl0Ci0JCQkKLQkJCVVSTCB1cmwgPSBmZWF0dXJlLmdldExpY2Vuc2UoKS5nZXRVUkwoKTsKLQkJCWlmICh1cmwhPW51bGwpewotCQkJCWFzc2VydFRydWUoKG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpKS5leGlzdHMoKSk7Ci0JCQl9Ci0KLQkJCXVybCA9IGZlYXR1cmUuZ2V0Q29weXJpZ2h0KCkuZ2V0VVJMKCk7Ci0JCQlpZiAodXJsIT1udWxsKXsKLQkJCQlhc3NlcnRUcnVlKChuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKSkuZXhpc3RzKCkpOwotCQkJfQotCQkJCi0JCQl1cmwgPSBmZWF0dXJlLmdldERlc2NyaXB0aW9uKCkuZ2V0VVJMKCk7Ci0JCQlpZiAodXJsIT1udWxsKXsKLQkJCQlhc3NlcnRUcnVlKChuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKSkuZXhpc3RzKCkpOwotCQkJfQotCQkJCi0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogTWV0aG9kIHByaW50LgotCSAqIEBwYXJhbSBpbmZvCi0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJpbnQoSVVSTEVudHJ5IGluZm8sIFN0cmluZyB0ZXh0KXsKLQkJU3lzdGVtLm91dC5wcmludCgiLT4iK3RleHQrIjoiKTsKLQkJaWYgKGluZm8uZ2V0VVJMKCkhPW51bGwpIAotCQkJU3lzdGVtLm91dC5wcmludGxuKCI8IitpbmZvLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkrIj4iKTsKLQkJZWxzZSAKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihpbmZvLmdldEFubm90YXRpb24oKSk7Ci0JfQotfSAKLQotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9mZWF0dXJlcyBzcGFjZS9oZWxwRmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9mZWF0dXJlcyBzcGFjZS9oZWxwRmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1OWUwMmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvZmVhdHVyZXMgc3BhY2UvaGVscEZlYXR1cmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvZmVhdHVyZXMgc3BhY2Uvc3BhY2UgZmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9mZWF0dXJlcyBzcGFjZS9zcGFjZSBmZWF0dXJlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFhNmQ1NS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9mZWF0dXJlcyBzcGFjZS9zcGFjZSBmZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MTdiYjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9pbmZvL2ltZy93ZWxfbWwuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvaW5mby9pbWcvd2VsX21sLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFlMzNkZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9pbmZvL2ltZy93ZWxfbWwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvaW5mby9zaXRlSW5mby5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvaW5mby9zaXRlSW5mby5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDY1YWEzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2luZm8vc2l0ZUluZm8uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLTwvaGVhZD4NCi0gIDxib2R5Pg0KLTxpbWcgc3JjPSJpbWcvdG9wX3RpdGxzbS5naWYiIGFsdD0iIiB3aWR0aD0iNDYwIiBoZWlnaHQ9IjUwIj4NCi08YnI+DQotPGJyPg0KLSAgICAgSXQgc3RhcnRlZCB3aXRoIFNtYWxsdGFsazxicj4NCi0gICAgT1RJIGhhcyBiZWVuIGJ1aWxkaW5nIHRvb2xzIGZvciBwbGF0Zm9ybS1pbmRlcGVuZGVudCBPTyBkZXZlbG9wbWVudCBzaW5jZQ0KLSAgMTk4OC4gT3VyIEVOVlkmcmVnOyB0ZWNobm9sb2d5IGZpcnN0IGJyb3VnaHQgY29sbGFib3JhdGl2ZSBzb2Z0d2FyZSBkZXZlbG9wbWVudCwNCi0gIHZlcnNpb24gbWFuYWdlbWVudCBhbmQgc2hhcmVkIHJlcG9zaXRvcmllcyB0byBTbWFsbHRhbGsuIElCTSBpcyBvbmUgb2YNCi1tYW55ICAgY29tcGFuaWVzIHRvIGxpY2Vuc2UgRU5WWSwgd2hpY2ggY29udGludWVzIHRvIGJlIHRoZSBmb3VuZGF0aW9uIG9mDQotVmlzdWFsQWdlJnJlZzsgICBTbWFsbHRhbGsuPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIE5leHQgY2FtZSBKYXZhJiM4NDgyOzxicj4NCi0gICAgQmVjYXVzZSBvZiBvdXIgZXhwZXJ0aXNlIGluIE9PIHRlY2hub2xvZ3ksIElCTSB0dXJuZWQgdG8gT1RJIGZvciBhIG5leHQtZ2VuZXJhdGlvbg0KLSAgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgZm9yIEphdmEuIFRoZSByZXN1bHQgaXMgVmlzdWFsQWdlIGZvciBKYXZhLCB3aGljaA0KLSAgY29udGludWVzIHRvIHdpbiBhd2FyZHMgZm9yIGl0cyBpbm5vdmF0aXZlIElERSBhbmQgdGVhbSBzdXBwb3J0LiBJbmZvV29ybGQNCi0gIGhhcyBjaG9zZW4gVmlzdWFsQWdlIGZvciBKYXZhIGFzIGRldmVsb3BtZW50IHRvb2wgb2YgdGhlIHllYXIgLSB5ZWFyIGFmdGVyDQotICB5ZWFyIGFmdGVyIHllYXIhPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIFRoZW4gcGVydmFzaXZlIGNvbXB1dGluZzxicj4NCi0gICAgT1RJIGNvbnRpbnVlcyBpdHMgZGV2ZWxvcG1lbnQgb2YgSUJNJ3MgVmlzdWFsQWdlIE1pY3JvIEVkaXRpb24sIGEgc3RhdGUtb2YtdGhlLWFydA0KLSAgcGxhdGZvcm0gZm9yIGNvbGxhYm9yYXRpdmUgZGV2ZWxvcG1lbnQgb2YgZW1iZWRkZWQgYXBwbGljYXRpb25zIGFuZCBzeXN0ZW1zDQotICB0aGF0IGFyZSB2ZXJ5IGxlYW4uIEFzIHRoZSBzdGVhZHkgc3RyZWFtIG9mIHByZXNzIHJlbGVhc2VzIGF0dGVzdHMsIFZpc3VhbEFnZQ0KLSAgTWljcm8gRWRpdGlvbiBpcyBhbHJlYWR5IGxpY2Vuc2VkIHRvIHRoZSBsZWFkaW5nIG1pY3JvY2hpcCBtYW51ZmFjdHVyZXJzLA0KLSAgbWljcm9rZXJuZWwgZGV2ZWxvcGVycywgYW5kIHByb2R1Y2VycyBvZiBoYW5kaGVsZCBhbmQgY29uc3VtZXIgZGV2aWNlcy48YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotICAgICAgTm93IGl0J3MgRWNsaXBzZTxicj4NCi0gICAgT1RJIGhhcyBidWlsdCB0aGUgbmV4dCBnZW5lcmF0aW9uIElCTSBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCB0b29scyBwbGF0Zm9ybS4NCi0gIEVjbGlwc2UgaXMgYSBraW5kIG9mIHVuaXZlcnNhbCB0b29sIHBsYXRmb3JtIC0gYW4gb3BlbiBleHRlbnNpYmxlIElERSBmb3INCi0gIGFueXRoaW5nIGFuZCBub3RoaW5nIGluIHBhcnRpY3VsYXIuIFRoZSByZWFsIHZhbHVlIGNvbWVzIGZyb20gdG9vbCBwbHVnLWlucw0KLSAgdGhhdCAidGVhY2giIEVjbGlwc2UgaG93IHRvIHdvcmsgd2l0aCB0aGluZ3MgLSBqYXZhIGZpbGVzLCB3ZWIgY29udGVudCwNCi1ncmFwaGljcywgIHZpZGVvIC0gYWxtb3N0IGFueXRoaW5nIHlvdSBjYW4gaW1hZ2luZS4gRWNsaXBzZSBhbGxvd3MgeW91IHRvDQotaW5kZXBlbmRlbnRseSAgZGV2ZWxvcCB0b29scyB0aGF0IGludGVncmF0ZSB3aXRoIG90aGVyIHBlb3BsZSdzIHRvb2xzIHNvDQotc2VhbWxlc3NseSB5b3Ugd29uJ3Qga25vdyB3aGVyZSBvbmUgdG9vbCBlbmRzIGFuZCBhbm90aGVyIHN0YXJ0cy4gVGhlIElCTQ0KLXN1cHBvcnRlZCB2ZXJzaW9uIG9mIHRoaXMgdGVjaG5vbG9neSwgV2ViU3BoZXJlIFN0dWRpbyBXb3JrYmVuY2gsIHdpbGwgYmUNCi10aGUgY29yZSBvZiB0aGUgbmV4dCAgZ2VuZXJhdGlvbiBvZiBJQk0gYW5kIElCTSBCdXNpbmVzcyBQYXJ0bmVyIGUtYnVzaW5lc3MNCi10b29scyBvcHRpbWl6ZWQgZm9yICB0aGUgV2ViU3BoZXJlIHNvZnR3YXJlIHBsYXRmb3JtLjxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBTbyB3aGF0J3MgbmV4dD88YnI+DQotICAgIE9USSBjb250aW51ZXMgdG8gZGVsaXZlciBvYmplY3Qtb3JpZW50ZWQgdGVjaG5vbG9neSB0aGF0IHNjYWxlcyBhY3Jvc3MNCi0gcGxhdGZvcm1zLCAgYWNyb3NzIHRlYW1zIGFuZCBhY3Jvc3MgcHJvamVjdCBzaXplLiBGcm9tIGEgbWFpbmZyYW1lIHRvIGENCi13YXRjaCAgLSB3ZSdyZSAgY2xvc2luZyBpbiBvbiB0aGF0IHZpc2lvbi48YnI+DQotPGJyPg0KLTxpbWcgc3JjPSJpbWcvd2VsX21sLmpwZyIgd2lkdGg9IjQ2MCIgaGVpZ2h0PSI0NjAiIGFsdD0iIj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2luc3RhbGwvZmVhdHVyZXMgc3BhY2UvZmVhdHVyZTMvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9pbnN0YWxsL2ZlYXR1cmVzIHNwYWNlL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Nzc0MWQ5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2luc3RhbGwvZmVhdHVyZXMgc3BhY2UvZmVhdHVyZTMvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMyIgaW1hZ2U9ImZlYXR1cmUxLmdpZiIgbGFiZWw9IlRoaXJkIEZlYXR1cmUiIHByb3ZpZGVyLW5hbWU9IlNtYXJ0IENvbXBhbnkiIHZlcnNpb249IjEuMC4wIiA+DQotICA8ZGVzY3JpcHRpb24+RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPg0KLSAgPGNvcHlyaWdodD5jb3B5cmlnaHQ8L2NvcHlyaWdodD4NCi0gIDxsaWNlbnNlPmxpY2Vuc2U8L2xpY2Vuc2U+DQotICA8dXJsPg0KLSAgICA8dXBkYXRlIGxhYmVsPSJVUkwgdG8gdXBkYXRlIHRoZSBmZWF0dXJlIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGF0aC9mZWF0dXJlMS8iLz4NCi0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDEiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPg0KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMiIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+DQotICA8L3VybD4NCi08L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9QZGVfY29yZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL1BkZV9jb3JlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwNzIxNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL1BkZV9jb3JlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvaGVscC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL2hlbHAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTg0ZjY2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvaGVscC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL2p1bml0XzMuNy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL2p1bml0XzMuNy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NTg3YjIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9qdW5pdF8zLjcuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2Uvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkNGJiZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHNpdGU+DQotPGRlc2NyaXB0aW9uIHVybD0iaW5mby9zaXRlSW5mby5odG1sIi8+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzIHNwYWNlL2hlbHBGZWF0dXJlLmphciI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL1VNTCIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcyBzcGFjZS9zcGFjZSBmZWF0dXJlLmphciI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL0oyRUUiLz4NCi0gIDwvZmVhdHVyZT4NCi0NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UuaGVscF8xLjAuMC5qYXIiIHVybD0icGx1Z2lucyBzcGFjZS9oZWxwLmphciIvPg0KLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZV8xLjAuMC5qYXIiIHVybD0icGx1Z2lucyBzcGFjZS9QZGVfY29yZS5qYXIiLz4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmp1bml0XzMuNS4wLmphciIgdXJsPSJwbHVnaW5zIHNwYWNlL2p1bml0XzMuNy5qYXIiLz4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEiIHVybD0icGx1Z2lucyBzcGFjZS9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMSIvPiAgDQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJJQk0gV1NBRCBUb29scyIgbmFtZT0iZWNsaXBzZSIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSjJFRSB0b29scyIgbmFtZT0iZWNsaXBzZS9KMkVFIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJFSkIgVG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRS9FSkIiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IlVNTCB0b29scyIgbmFtZT0iZWNsaXBzZS9VTUwiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9Ik1lc3NhZ2luZyBUb29scyIgbmFtZT0iQjJCIi8+ICANCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL2ZlYXR1cmVzL2hlbHBGZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9mZWF0dXJlcy9oZWxwRmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYzY3ZDQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL2ZlYXR1cmVzL2hlbHBGZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuZmVhdHVyZV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzBiNDBhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuZmVhdHVyZV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvaW5mby9pbWcvdG9wX3RpdGxzbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MTdiYjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL2luZm8vaW1nL3dlbF9tbC5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvaW5mby9pbWcvd2VsX21sLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFlMzNkZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvaW5mby9pbWcvd2VsX21sLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9pbmZvL3NpdGVJbmZvLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvaW5mby9zaXRlSW5mby5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDY1YWEzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9pbmZvL3NpdGVJbmZvLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08L2hlYWQ+DQotICA8Ym9keT4NCi08aW1nIHNyYz0iaW1nL3RvcF90aXRsc20uZ2lmIiBhbHQ9IiIgd2lkdGg9IjQ2MCIgaGVpZ2h0PSI1MCI+DQotPGJyPg0KLTxicj4NCi0gICAgIEl0IHN0YXJ0ZWQgd2l0aCBTbWFsbHRhbGs8YnI+DQotICAgIE9USSBoYXMgYmVlbiBidWlsZGluZyB0b29scyBmb3IgcGxhdGZvcm0taW5kZXBlbmRlbnQgT08gZGV2ZWxvcG1lbnQgc2luY2UNCi0gIDE5ODguIE91ciBFTlZZJnJlZzsgdGVjaG5vbG9neSBmaXJzdCBicm91Z2h0IGNvbGxhYm9yYXRpdmUgc29mdHdhcmUgZGV2ZWxvcG1lbnQsDQotICB2ZXJzaW9uIG1hbmFnZW1lbnQgYW5kIHNoYXJlZCByZXBvc2l0b3JpZXMgdG8gU21hbGx0YWxrLiBJQk0gaXMgb25lIG9mDQotbWFueSAgIGNvbXBhbmllcyB0byBsaWNlbnNlIEVOVlksIHdoaWNoIGNvbnRpbnVlcyB0byBiZSB0aGUgZm91bmRhdGlvbiBvZg0KLVZpc3VhbEFnZSZyZWc7ICAgU21hbGx0YWxrLjxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBOZXh0IGNhbWUgSmF2YSYjODQ4Mjs8YnI+DQotICAgIEJlY2F1c2Ugb2Ygb3VyIGV4cGVydGlzZSBpbiBPTyB0ZWNobm9sb2d5LCBJQk0gdHVybmVkIHRvIE9USSBmb3IgYSBuZXh0LWdlbmVyYXRpb24NCi0gIGRldmVsb3BtZW50IGVudmlyb25tZW50IGZvciBKYXZhLiBUaGUgcmVzdWx0IGlzIFZpc3VhbEFnZSBmb3IgSmF2YSwgd2hpY2gNCi0gIGNvbnRpbnVlcyB0byB3aW4gYXdhcmRzIGZvciBpdHMgaW5ub3ZhdGl2ZSBJREUgYW5kIHRlYW0gc3VwcG9ydC4gSW5mb1dvcmxkDQotICBoYXMgY2hvc2VuIFZpc3VhbEFnZSBmb3IgSmF2YSBhcyBkZXZlbG9wbWVudCB0b29sIG9mIHRoZSB5ZWFyIC0geWVhciBhZnRlcg0KLSAgeWVhciBhZnRlciB5ZWFyITxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBUaGVuIHBlcnZhc2l2ZSBjb21wdXRpbmc8YnI+DQotICAgIE9USSBjb250aW51ZXMgaXRzIGRldmVsb3BtZW50IG9mIElCTSdzIFZpc3VhbEFnZSBNaWNybyBFZGl0aW9uLCBhIHN0YXRlLW9mLXRoZS1hcnQNCi0gIHBsYXRmb3JtIGZvciBjb2xsYWJvcmF0aXZlIGRldmVsb3BtZW50IG9mIGVtYmVkZGVkIGFwcGxpY2F0aW9ucyBhbmQgc3lzdGVtcw0KLSAgdGhhdCBhcmUgdmVyeSBsZWFuLiBBcyB0aGUgc3RlYWR5IHN0cmVhbSBvZiBwcmVzcyByZWxlYXNlcyBhdHRlc3RzLCBWaXN1YWxBZ2UNCi0gIE1pY3JvIEVkaXRpb24gaXMgYWxyZWFkeSBsaWNlbnNlZCB0byB0aGUgbGVhZGluZyBtaWNyb2NoaXAgbWFudWZhY3R1cmVycywNCi0gIG1pY3Jva2VybmVsIGRldmVsb3BlcnMsIGFuZCBwcm9kdWNlcnMgb2YgaGFuZGhlbGQgYW5kIGNvbnN1bWVyIGRldmljZXMuPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIE5vdyBpdCdzIEVjbGlwc2U8YnI+DQotICAgIE9USSBoYXMgYnVpbHQgdGhlIG5leHQgZ2VuZXJhdGlvbiBJQk0gYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgdG9vbHMgcGxhdGZvcm0uDQotICBFY2xpcHNlIGlzIGEga2luZCBvZiB1bml2ZXJzYWwgdG9vbCBwbGF0Zm9ybSAtIGFuIG9wZW4gZXh0ZW5zaWJsZSBJREUgZm9yDQotICBhbnl0aGluZyBhbmQgbm90aGluZyBpbiBwYXJ0aWN1bGFyLiBUaGUgcmVhbCB2YWx1ZSBjb21lcyBmcm9tIHRvb2wgcGx1Zy1pbnMNCi0gIHRoYXQgInRlYWNoIiBFY2xpcHNlIGhvdyB0byB3b3JrIHdpdGggdGhpbmdzIC0gamF2YSBmaWxlcywgd2ViIGNvbnRlbnQsDQotZ3JhcGhpY3MsICB2aWRlbyAtIGFsbW9zdCBhbnl0aGluZyB5b3UgY2FuIGltYWdpbmUuIEVjbGlwc2UgYWxsb3dzIHlvdSB0bw0KLWluZGVwZW5kZW50bHkgIGRldmVsb3AgdG9vbHMgdGhhdCBpbnRlZ3JhdGUgd2l0aCBvdGhlciBwZW9wbGUncyB0b29scyBzbw0KLXNlYW1sZXNzbHkgeW91IHdvbid0IGtub3cgd2hlcmUgb25lIHRvb2wgZW5kcyBhbmQgYW5vdGhlciBzdGFydHMuIFRoZSBJQk0NCi1zdXBwb3J0ZWQgdmVyc2lvbiBvZiB0aGlzIHRlY2hub2xvZ3ksIFdlYlNwaGVyZSBTdHVkaW8gV29ya2JlbmNoLCB3aWxsIGJlDQotdGhlIGNvcmUgb2YgdGhlIG5leHQgIGdlbmVyYXRpb24gb2YgSUJNIGFuZCBJQk0gQnVzaW5lc3MgUGFydG5lciBlLWJ1c2luZXNzDQotdG9vbHMgb3B0aW1pemVkIGZvciAgdGhlIFdlYlNwaGVyZSBzb2Z0d2FyZSBwbGF0Zm9ybS48YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotICAgICAgU28gd2hhdCdzIG5leHQ/PGJyPg0KLSAgICBPVEkgY29udGludWVzIHRvIGRlbGl2ZXIgb2JqZWN0LW9yaWVudGVkIHRlY2hub2xvZ3kgdGhhdCBzY2FsZXMgYWNyb3NzDQotIHBsYXRmb3JtcywgIGFjcm9zcyB0ZWFtcyBhbmQgYWNyb3NzIHByb2plY3Qgc2l6ZS4gRnJvbSBhIG1haW5mcmFtZSB0byBhDQotd2F0Y2ggIC0gd2UncmUgIGNsb3NpbmcgaW4gb24gdGhhdCB2aXNpb24uPGJyPg0KLTxicj4NCi08aW1nIHNyYz0iaW1nL3dlbF9tbC5qcGciIHdpZHRoPSI0NjAiIGhlaWdodD0iNDYwIiBhbHQ9IiI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvcGx1Z2lucy9QZGVfY29yZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvcGx1Z2lucy9QZGVfY29yZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMDcyMTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL3BsdWdpbnMvUGRlX2NvcmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL3BsdWdpbnMvaGVscC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvcGx1Z2lucy9oZWxwLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU4NGY2Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvcGx1Z2lucy9oZWxwLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9wbHVnaW5zL2p1bml0XzMuNy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvcGx1Z2lucy9qdW5pdF8zLjcuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzU4N2IyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9wbHVnaW5zL2p1bml0XzMuNy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNWZkYTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSA+DQotPGRlc2NyaXB0aW9uIHVybD0iaW5mby9zaXRlSW5mby5odG1sIi8+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2hlbHBGZWF0dXJlLmphciI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL1VNTCIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuZmVhdHVyZV8xLjAuMC5qYXIiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9KMkVFIi8+DQotICA8L2ZlYXR1cmU+DQotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLmhlbHBfMS4wLjAuamFyIiB1cmw9InBsdWdpbnMvaGVscC5qYXIiLz4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmNvcmVfMS4wLjAuamFyIiB1cmw9InBsdWdpbnMvUGRlX2NvcmUuamFyIi8+DQotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5qdW5pdF8zLjUuMC5qYXIiIHVybD0icGx1Z2lucy9qdW5pdF8zLjcuamFyIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJJQk0gV1NBRCBUb29scyIgbmFtZT0iZWNsaXBzZSIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSjJFRSB0b29scyIgbmFtZT0iZWNsaXBzZS9KMkVFIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJFSkIgVG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRS9FSkIiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IlVNTCB0b29scyIgbmFtZT0iZWNsaXBzZS9VTUwiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9Ik1lc3NhZ2luZyBUb29scyIgbmFtZT0iQjJCIi8+ICANCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9mZWF0dXJlcy9mZWF0dXJlczIuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9mZWF0dXJlcy9mZWF0dXJlczIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWRmNzJjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvZmVhdHVyZXMyLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFhZWUzZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTE1ZmY0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9mZWF0dXJlcy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9mZWF0dXJlcy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmUzOGQzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L2ZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmNoaWxkcmVuZmVhdHVyZV8yLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9mZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5jaGlsZHJlbmZlYXR1cmVfMi4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjI2NjVjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L2ZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmNoaWxkcmVuZmVhdHVyZV8yLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9mZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9mZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MTk4MDMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvZmVhdHVyZXMvcm9vdGZlYXR1cmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOWY1YmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjRiMDRhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIyMDhmZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3Qvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IwOWM4Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlPgotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphciIgb3M9IioiLz4KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMS4wLjAvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMi4yLjIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDBkODgyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMS4wLjAvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMi4yLjIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUxLnBsdWdpbjFfMS4xLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUxLnBsdWdpbjFfMS4xLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzk5NWQ1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMS5wbHVnaW4xXzEuMS4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMi5wbHVnaW4yXzIuMi4yLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMi5wbHVnaW4yXzIuMi4yLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM5OTVkNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTIucGx1Z2luMl8yLjIuMi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZHVtbXlfNy45LjguamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmR1bW15XzcuOS44LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY3MzdmNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZHVtbXlfNy45LjguamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjg2OTBmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBhNjEyZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU3ZDliMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMiIG5hbWU9IlRlc3RzIiB2ZXJzaW9uPSIwLjAuMSI+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC5qYXIiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIi8+DQotICA8L2ZlYXR1cmU+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmVzMi5qYXIiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxL3N1YmNhdDEiLz4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MiIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMV8xLjAuNC5qYXIiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIi8+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTIiLz4NCi0gIDwvZmVhdHVyZT4NCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlLmphciIvPg0KLSAgPGZlYXR1cmUgdXJsPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8xLjAuMC9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8yLjIuMi5qYXIiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIi8+DQotICA8L2ZlYXR1cmU+DQotICA8ZmVhdHVyZSB1cmw9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphciI+DQotICA8L2ZlYXR1cmU+DQotDQotICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImNhdGVnb3J5MS9zdWJjYXQxIiBsYWJlbD0iU3BlY2lhbCBGaXgiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkxIiBsYWJlbD0iJWRyaXZlcnMiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkyIiBsYWJlbD0iJXNlY3VyaXR5Ii8+DQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9mZWF0dXJlcy9jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvZmVhdHVyZXMvY29tLmV4YW1wbGUuYnVuZGxlLmZlYXR1cmVfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGQzNTg5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9mZWF0dXJlcy9jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvcGx1Z2lucy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvcGx1Z2lucy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3OWQyY2QuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3BsdWdpbnMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWlfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3BsdWdpbnMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50XzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9wbHVnaW5zL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudF8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYjAyYmIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3BsdWdpbnMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50XzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9wbHVnaW5zL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWlfMi4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3BsdWdpbnMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aV8yLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZWMwMmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3BsdWdpbnMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aV8yLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvcGx1Z2lucy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9wbHVnaW5zL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW5fMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjFiNjkzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9wbHVnaW5zL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW5fMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWIxMzMyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlPgotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZV8xLjAuMC5qYXIiIGlkPSJjb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZSIgdmVyc2lvbj0iMS4wLjAiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9IkJ1bmRsZUZlYXR1cmUiLz4KLSAgIDwvZmVhdHVyZT4KLSAgIDxjYXRlZ29yeS1kZWYgbmFtZT0iQnVuZGxlRmVhdHVyZSIgbGFiZWw9IkZlYXR1cmUgd2l0aCBCdW5kbGVzIi8+Ci08L3NpdGU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvLmNsYXNzcGF0aCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTIwOTAzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPmNvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0PmNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW48L3Byb2plY3Q+Ci0JCTxwcm9qZWN0PmNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWk8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWk8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS8udGVtcGxhdGUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2JjZDQxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS8udGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGZvcm0+DQotICAgPHAvPjxwPjxiPlRpcHMgb24gd29ya2luZyB3aXRoIHRoaXMgcGx1Zy1pbiBwcm9qZWN0PC9iPjwvcD48bGk+Rm9yIHRoZSB2aWV3IG9mIHRoZSBuZXcgcGx1Zy1pbiBhdCBhIGdsYW5jZSwgZ28gdG8gdGhlIDxpbWcgaHJlZj0icGFnZUltYWdlIi8+PGEgaHJlZj0iT3ZlcnZpZXdQYWdlIj5PdmVydmlldzwvYT4uPC9saT48bGk+WW91IGNhbiB0ZXN0IHRoZSBjb250cmlidXRpb25zIG9mIHRoaXMgcGx1Zy1pbiBieSBsYXVuY2hpbmcgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGUgd29ya2JlbmNoLiBPbiB0aGUgPGI+UnVuPC9iPiBtZW51LCBjbGljayA8Yj5SdW4gQXM8L2I+IGFuZCBjaG9vc2UgPGltZyBocmVmPSJydW5UaW1lV29ya2JlbmNoSW1hZ2UiLz48YSBocmVmPSJhY3Rpb24ucnVuIj5SdW4tdGltZSBXb3JrYmVuY2g8L2E+IGZyb20gdGhlIGF2YWlsYWJsZSBjaG9pY2VzLjwvbGk+PGxpPllvdSBjYW4gYWRkIG1vcmUgZnVuY3Rpb25hbGl0eSB0byB0aGlzIHBsdWctaW4gYnkgYWRkaW5nIGV4dGVuc2lvbnMgdXNpbmcgdGhlIDxhIGhyZWY9ImFjdGlvbi5uZXdFeHRlbnNpb24iPk5ldyBFeHRlbnNpb24gV2l6YXJkPC9hPi48L2xpPjxsaT5UaGUgcGx1Zy1pbiBwcm9qZWN0IGNvbnRhaW5zIEphdmEgY29kZSB0aGF0IHlvdSBjYW4gZGVidWcuIFBsYWNlIGJyZWFrcG9pbnRzIGluIEphdmEgY2xhc3Nlcy4gT24gdGhlIDxiPlJ1bjwvYj4gbWVudSwgc2VsZWN0IDxiPkRlYnVnIEFzPC9iPiBhbmQgY2hvb3NlIDxpbWcgaHJlZj0icnVuVGltZVdvcmtiZW5jaEltYWdlIi8+PGEgaHJlZj0iYWN0aW9uLmRlYnVnIj5SdW4tdGltZSBXb3JrYmVuY2g8L2E+IGZyb20gdGhlIGF2YWlsYWJsZSBjaG9pY2VzLjwvbGk+DQotPC9mb3JtPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFkNjg2Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLUdlbmVyYXRlZC1mcm9tOiAxMDc3MDYyOTc0NDUxDQotQnVuZGxlLU5hbWU6IFVpIEZyYWdtZW50DQotQnVuZGxlLVZlcnNpb246IDEuMC4wDQotQnVuZGxlLVN5bWJvbGljTmFtZTogY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkNCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZw0KLUJ1bmRsZS1DbGFzc1BhdGg6IHVpLmphcg0KLUxlZ2FjeTogdHJ1ZQ0KLUZyYWdtZW50LUhvc3Q6IGNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWk7IGJ1bmRsZS12ZXJzaW9uPTIuMC4wDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpL2ZyYWdtZW50LnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS9mcmFnbWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNDg0YjMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpL2ZyYWdtZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08ZnJhZ21lbnQKLSAgIGlkPSJjb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aSIKLSAgIG5hbWU9IlVpIEZyYWdtZW50IgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBwcm92aWRlci1uYW1lPSJFY2xpcHNlLm9yZyIKLSAgIHBsdWdpbi1pZD0iY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aSIKLSAgIHBsdWdpbi12ZXJzaW9uPSIyLjAuMCIKLSAgIG1hdGNoPSJncmVhdGVyT3JFcXVhbCI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0idWkuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi08L2ZyYWdtZW50PgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjNlNGJjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPmNvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjQxMDQzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9ImNvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlIgotICAgICAgbGFiZWw9ImNvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlIgotICAgICAgdmVyc2lvbj0iMS4wLjAiCi0gICAgICBwcm92aWRlci1uYW1lPSJFY2xpcHNlLm9yZyI+Ci0KLSAgIDxsaWNlbnNlPgotICAgICAgQSBwbGFjZWhvbGRlciBsaWNlbnNlIGZvciB0aGUgZmVhdHVyZS4KLSAgIDwvbGljZW5zZT4KLQotICAgPGluc3RhbGwtaGFuZGxlci8+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImNvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImNvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvLmNsYXNzcGF0aCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50Ly5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZkMGMyMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+Y29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0PmNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW48L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWk8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvLnRlbXBsYXRlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC8udGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYmNkNDEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC8udGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGZvcm0+DQotICAgPHAvPjxwPjxiPlRpcHMgb24gd29ya2luZyB3aXRoIHRoaXMgcGx1Zy1pbiBwcm9qZWN0PC9iPjwvcD48bGk+Rm9yIHRoZSB2aWV3IG9mIHRoZSBuZXcgcGx1Zy1pbiBhdCBhIGdsYW5jZSwgZ28gdG8gdGhlIDxpbWcgaHJlZj0icGFnZUltYWdlIi8+PGEgaHJlZj0iT3ZlcnZpZXdQYWdlIj5PdmVydmlldzwvYT4uPC9saT48bGk+WW91IGNhbiB0ZXN0IHRoZSBjb250cmlidXRpb25zIG9mIHRoaXMgcGx1Zy1pbiBieSBsYXVuY2hpbmcgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGUgd29ya2JlbmNoLiBPbiB0aGUgPGI+UnVuPC9iPiBtZW51LCBjbGljayA8Yj5SdW4gQXM8L2I+IGFuZCBjaG9vc2UgPGltZyBocmVmPSJydW5UaW1lV29ya2JlbmNoSW1hZ2UiLz48YSBocmVmPSJhY3Rpb24ucnVuIj5SdW4tdGltZSBXb3JrYmVuY2g8L2E+IGZyb20gdGhlIGF2YWlsYWJsZSBjaG9pY2VzLjwvbGk+PGxpPllvdSBjYW4gYWRkIG1vcmUgZnVuY3Rpb25hbGl0eSB0byB0aGlzIHBsdWctaW4gYnkgYWRkaW5nIGV4dGVuc2lvbnMgdXNpbmcgdGhlIDxhIGhyZWY9ImFjdGlvbi5uZXdFeHRlbnNpb24iPk5ldyBFeHRlbnNpb24gV2l6YXJkPC9hPi48L2xpPjxsaT5UaGUgcGx1Zy1pbiBwcm9qZWN0IGNvbnRhaW5zIEphdmEgY29kZSB0aGF0IHlvdSBjYW4gZGVidWcuIFBsYWNlIGJyZWFrcG9pbnRzIGluIEphdmEgY2xhc3Nlcy4gT24gdGhlIDxiPlJ1bjwvYj4gbWVudSwgc2VsZWN0IDxiPkRlYnVnIEFzPC9iPiBhbmQgY2hvb3NlIDxpbWcgaHJlZj0icnVuVGltZVdvcmtiZW5jaEltYWdlIi8+PGEgaHJlZj0iYWN0aW9uLmRlYnVnIj5SdW4tdGltZSBXb3JrYmVuY2g8L2E+IGZyb20gdGhlIGF2YWlsYWJsZSBjaG9pY2VzLjwvbGk+DQotPC9mb3JtPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDY2NDgwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLUdlbmVyYXRlZC1mcm9tOiAxMDc3MDYyOTA5NDg3DQotQnVuZGxlLU5hbWU6IEZyYWdtZW50IEZyYWdtZW50DQotQnVuZGxlLVZlcnNpb246IDEuMC4wDQotQnVuZGxlLVN5bWJvbGljTmFtZTogY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50DQotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcNCi1CdW5kbGUtQ2xhc3NQYXRoOiBmcmFnbWVudC5qYXINCi1MZWdhY3k6IHRydWUNCi1GcmFnbWVudC1Ib3N0OiBjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luOyBidW5kbGUtdmVyc2lvbj0xLjAuMA0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvZnJhZ21lbnQueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC9mcmFnbWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNWNkNmUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC9mcmFnbWVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPGZyYWdtZW50Ci0gICBpZD0iY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50IgotICAgbmFtZT0iRnJhZ21lbnQgRnJhZ21lbnQiCi0gICB2ZXJzaW9uPSIxLjAuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IkVjbGlwc2Uub3JnIgotICAgcGx1Z2luLWlkPSJjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luIgotICAgcGx1Z2luLXZlcnNpb249IjEuMC4wIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJmcmFnbWVudC5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0KLTwvZnJhZ21lbnQ+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS8uY2xhc3NwYXRoIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjMzU1My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPmNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+Y29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aTwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvLnRlbXBsYXRlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2JjZDQxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpLy50ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Zm9ybT4NCi0gICA8cC8+PHA+PGI+VGlwcyBvbiB3b3JraW5nIHdpdGggdGhpcyBwbHVnLWluIHByb2plY3Q8L2I+PC9wPjxsaT5Gb3IgdGhlIHZpZXcgb2YgdGhlIG5ldyBwbHVnLWluIGF0IGEgZ2xhbmNlLCBnbyB0byB0aGUgPGltZyBocmVmPSJwYWdlSW1hZ2UiLz48YSBocmVmPSJPdmVydmlld1BhZ2UiPk92ZXJ2aWV3PC9hPi48L2xpPjxsaT5Zb3UgY2FuIHRlc3QgdGhlIGNvbnRyaWJ1dGlvbnMgb2YgdGhpcyBwbHVnLWluIGJ5IGxhdW5jaGluZyBhbm90aGVyIGluc3RhbmNlIG9mIHRoZSB3b3JrYmVuY2guIE9uIHRoZSA8Yj5SdW48L2I+IG1lbnUsIGNsaWNrIDxiPlJ1biBBczwvYj4gYW5kIGNob29zZSA8aW1nIGhyZWY9InJ1blRpbWVXb3JrYmVuY2hJbWFnZSIvPjxhIGhyZWY9ImFjdGlvbi5ydW4iPlJ1bi10aW1lIFdvcmtiZW5jaDwvYT4gZnJvbSB0aGUgYXZhaWxhYmxlIGNob2ljZXMuPC9saT48bGk+WW91IGNhbiBhZGQgbW9yZSBmdW5jdGlvbmFsaXR5IHRvIHRoaXMgcGx1Zy1pbiBieSBhZGRpbmcgZXh0ZW5zaW9ucyB1c2luZyB0aGUgPGEgaHJlZj0iYWN0aW9uLm5ld0V4dGVuc2lvbiI+TmV3IEV4dGVuc2lvbiBXaXphcmQ8L2E+LjwvbGk+PGxpPlRoZSBwbHVnLWluIHByb2plY3QgY29udGFpbnMgSmF2YSBjb2RlIHRoYXQgeW91IGNhbiBkZWJ1Zy4gUGxhY2UgYnJlYWtwb2ludHMgaW4gSmF2YSBjbGFzc2VzLiBPbiB0aGUgPGI+UnVuPC9iPiBtZW51LCBzZWxlY3QgPGI+RGVidWcgQXM8L2I+IGFuZCBjaG9vc2UgPGltZyBocmVmPSJydW5UaW1lV29ya2JlbmNoSW1hZ2UiLz48YSBocmVmPSJhY3Rpb24uZGVidWciPlJ1bi10aW1lIFdvcmtiZW5jaDwvYT4gZnJvbSB0aGUgYXZhaWxhYmxlIGNob2ljZXMuPC9saT4NCi08L2Zvcm0+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM1MDdhOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLUdlbmVyYXRlZC1mcm9tOiAxMDc3MDYyOTk5ODI3DQotQnVuZGxlLU5hbWU6IFVpIFBsdWctaW4NCi1CdW5kbGUtVmVyc2lvbjogMi4wLjANCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpDQotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcNCi1CdW5kbGUtQ2xhc3NQYXRoOiB1aS5qYXINCi1MZWdhY3k6IHRydWUNCi1CdW5kbGUtQWN0aXZhdG9yOiBjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpLlVpUGx1Z2luDQotUmVxdWlyZS1CdW5kbGU6IA0KLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsDQotIG9yZy5lY2xpcHNlLnVpLA0KLSBjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luOyBidW5kbGUtdmVyc2lvbj0xLjAuMDt2ZXJzaW9uLW1hdGNoPXBlcmZlY3QNCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS9iaW4vY29tL2V4YW1wbGUvYnVuZGxlL3BsdWdpbi91aS9VaVBsdWdpbi5jbGFzcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpL2Jpbi9jb20vZXhhbXBsZS9idW5kbGUvcGx1Z2luL3VpL1VpUGx1Z2luLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjczMTg5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpL2Jpbi9jb20vZXhhbXBsZS9idW5kbGUvcGx1Z2luL3VpL1VpUGx1Z2luLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZmZkZWYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0iY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aSIKLSAgIG5hbWU9IlVpIFBsdWctaW4iCi0gICB2ZXJzaW9uPSIyLjAuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IkVjbGlwc2Uub3JnIgotICAgY2xhc3M9ImNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkuVWlQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InVpLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49ImNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4iIHZlcnNpb249IjEuMC4wIiBtYXRjaD0icGVyZmVjdCIvPgotICAgPC9yZXF1aXJlcz4KLQotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLy5jbGFzc3BhdGggYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzE5ZDczLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+Y29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpPC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi8udGVtcGxhdGUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi8udGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYmNkNDEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vLnRlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxmb3JtPg0KLSAgIDxwLz48cD48Yj5UaXBzIG9uIHdvcmtpbmcgd2l0aCB0aGlzIHBsdWctaW4gcHJvamVjdDwvYj48L3A+PGxpPkZvciB0aGUgdmlldyBvZiB0aGUgbmV3IHBsdWctaW4gYXQgYSBnbGFuY2UsIGdvIHRvIHRoZSA8aW1nIGhyZWY9InBhZ2VJbWFnZSIvPjxhIGhyZWY9Ik92ZXJ2aWV3UGFnZSI+T3ZlcnZpZXc8L2E+LjwvbGk+PGxpPllvdSBjYW4gdGVzdCB0aGUgY29udHJpYnV0aW9ucyBvZiB0aGlzIHBsdWctaW4gYnkgbGF1bmNoaW5nIGFub3RoZXIgaW5zdGFuY2Ugb2YgdGhlIHdvcmtiZW5jaC4gT24gdGhlIDxiPlJ1bjwvYj4gbWVudSwgY2xpY2sgPGI+UnVuIEFzPC9iPiBhbmQgY2hvb3NlIDxpbWcgaHJlZj0icnVuVGltZVdvcmtiZW5jaEltYWdlIi8+PGEgaHJlZj0iYWN0aW9uLnJ1biI+UnVuLXRpbWUgV29ya2JlbmNoPC9hPiBmcm9tIHRoZSBhdmFpbGFibGUgY2hvaWNlcy48L2xpPjxsaT5Zb3UgY2FuIGFkZCBtb3JlIGZ1bmN0aW9uYWxpdHkgdG8gdGhpcyBwbHVnLWluIGJ5IGFkZGluZyBleHRlbnNpb25zIHVzaW5nIHRoZSA8YSBocmVmPSJhY3Rpb24ubmV3RXh0ZW5zaW9uIj5OZXcgRXh0ZW5zaW9uIFdpemFyZDwvYT4uPC9saT48bGk+VGhlIHBsdWctaW4gcHJvamVjdCBjb250YWlucyBKYXZhIGNvZGUgdGhhdCB5b3UgY2FuIGRlYnVnLiBQbGFjZSBicmVha3BvaW50cyBpbiBKYXZhIGNsYXNzZXMuIE9uIHRoZSA8Yj5SdW48L2I+IG1lbnUsIHNlbGVjdCA8Yj5EZWJ1ZyBBczwvYj4gYW5kIGNob29zZSA8aW1nIGhyZWY9InJ1blRpbWVXb3JrYmVuY2hJbWFnZSIvPjxhIGhyZWY9ImFjdGlvbi5kZWJ1ZyI+UnVuLXRpbWUgV29ya2JlbmNoPC9hPiBmcm9tIHRoZSBhdmFpbGFibGUgY2hvaWNlcy48L2xpPg0KLTwvZm9ybT4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzFhZGFmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotR2VuZXJhdGVkLWZyb206IDEwNzcwNjI2MDM3MDgNCi1CdW5kbGUtTmFtZTogUGx1Z2luIFBsdWctaW4NCi1CdW5kbGUtVmVyc2lvbjogMS4wLjANCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luDQotQnVuZGxlLVZlbmRvcjogRVhBTVBMRQ0KLUJ1bmRsZS1DbGFzc1BhdGg6IHBsdWdpbi5qYXINCi1MZWdhY3k6IHRydWUNCi1CdW5kbGUtQWN0aXZhdG9yOiBjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLlBsdWdpblBsdWdpbg0KLVJlcXVpcmUtQnVuZGxlOiANCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLA0KLSBvcmcuZWNsaXBzZS51aQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luL2Jpbi9jb20vZXhhbXBsZS9idW5kbGUvcGx1Z2luL1BsdWdpblBsdWdpbi5jbGFzcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luL2Jpbi9jb20vZXhhbXBsZS9idW5kbGUvcGx1Z2luL1BsdWdpblBsdWdpbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZjYWYwMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9iaW4vY29tL2V4YW1wbGUvYnVuZGxlL3BsdWdpbi9QbHVnaW5QbHVnaW4uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk3YmM3Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luIgotICAgbmFtZT0iUGx1Z2luIFBsdWctaW4iCi0gICB2ZXJzaW9uPSIxLjAuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IkVjbGlwc2Uub3JnIgotICAgY2xhc3M9ImNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4uUGx1Z2luUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJwbHVnaW4uamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkOTZiNTEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9SRUFETUUuVFhUIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9SRUFETUUuVFhUCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTlhOGE0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvUkVBRE1FLlRYVAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotVGhpcyBidW5kbGUgaXMgb2Jzb2xldGUuIEZ1bmN0aW9uYWxpdHkgZnJvbSB0aGlzIGJ1bmRsZSB3YXMgbW92ZWQgdG8gb3JnLmVjbGlwc2UudWkuZm9ybXMKLWluIHRoZSBFY2xpcHNlIDMuMCByZWxlYXNlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzY0YTA4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMjwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvUkVBRE1FLlRYVCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvUkVBRE1FLlRYVApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEzY2RiNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL1JFQURNRS5UWFQKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLVRoaXMgYnVuZGxlIGlzIG9ic29sZXRlLiBJdCBjb250YWluZWQgd2VsY29tZSBjb250ZW50IHRoYXQgaXMgbm93IGluIG9yZy5lY2xpcHNlLnVpLmlkZS4gVGhpcwotYnVuZGxlIHdhcyByZW1vdmVkIGZyb20gdGhlIEVjbGlwc2UgU0RLIGFmdGVyIHRoZSBFY2xpcHNlIDIuMSByZWxlYXNlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLmNsYXNzcGF0aCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFiM2FkOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLmN2c2lnbm9yZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDg1ODUxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLnVwZGF0ZS51aTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTUzNGNkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotI1R1ZSBEZWMgMDkgMTE6MTE6MjMgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmNvbXBhcmluZ0lkZW50aWNhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlYWRDb2RlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSGFzaENvZGVNZXRob2Q9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1N5bmNocm9uaXplZE9uSW5oZXJpdGVkTWV0aG9kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnRTdXBlcmludGVyZmFjZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL0dyYXBoaWNzX3VwZGF0ZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9HcmFwaGljc191cGRhdGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhZTFhMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL0dyYXBoaWNzX3VwZGF0ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTU1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMTEwKWh0dHA6Ly9kZXNpZ24udG9yb2xhYi5pYm0uY29tL2FpbS9XU1dCLWVjbGlwc2UvMTAyMF9QREUvaW1wbGVtZW50YXRpb25faWNvbnMvb3JnLmVjbGlwc2UucGRlL0dyYXBoaWNzX3BkZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPmdyYXBoaWNzPC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9IkdyZWcgQWRhbXMiIG5hbWU9QXV0aG9yPgotPE1FVEEgY29udGVudD0iTWljcm9zb2Z0IEZyb250UGFnZSA0LjAiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGJnQ29sb3I9d2hpdGU+Ci08SDI+b3JnLmVjbGlwc2UudXBkYXRlLnVpIC0gR3JhcGhpY3MgU3VtbWFyeTwvSDI+PEZPTlQgc2l6ZT0tMT48U1RST05HPkNvbXBldGVuY3kgCi1sZWFkOiA8L1NUUk9ORz5WbGFkIEtsaWNuaWsgLyBUT0wgPEJSPjxTVFJPTkc+VGVjaG5pY2FsIGxlYWQ6IDwvU1RST05HPkRlamFuIAotR2xvemljIC8gVE9MIDxCUj48U1RST05HPlVDRCBkZXNpZ25lcjogPC9TVFJPTkc+SnVsaWFuIEpvbmVzIC8gVE9MIAotPEJSPjxTVFJPTkc+VUkgZGVzaWduZXI6IDwvU1RST05HPkFuZHLpZSBQcm91bHggLyBUT0wgPEJSPjxTVFJPTkc+SUQgd3JpdGVyOiAKLTwvU1RST05HPi08L0ZPTlQ+IAotPEhSIHdpZHRoPSIxMDAlIiBTSVpFPTE+Ci08Qj48Rk9OVCBzaXplPS0xPkhpc3Rvcnk6PC9GT05UPjwvQj4gCi08cD48Zm9udCBzaXplPSItMSI+QXByaWwgMTksIDIwMDIgOiBUZW1wbGF0ZSBTdWJtaXNzaW9uPC9mb250PjwvcD4KLTxIUiB3aWR0aD0iMTAwJSIgU0laRT0xPgotPCEtLS0gU3RhcnQgSGVyZSAtLS0+Ci08VEFCTEUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0zIHdpZHRoPSIxMDAlIiBib3JkZXI9MCBoZWlnaHQ9IjMxNDciPgotICAKLSAgPFRSIGJnQ29sb3I9I2JmYmY3Zj4KLSAgICA8VEQgY29sU3Bhbj03PjxCPjxGT05UIHNpemU9KzI+VmlldzwvRk9OVD48L0I+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZGZkZjlmPgotICAgIDxURD4mbmJzcDs8L1REPgotICAgIDxURD48Qj48Rk9OVCBzaXplPS0xPkl0ZW08L0ZPTlQ+PC9CPjwvVEQ+Ci0gICAgPFREPjxCPjxGT05UIHNpemU9LTE+RmlsZSBOYW1lJm5ic3A7ICguZ2lmKTwvRk9OVD48L0I+PC9URD4KLSAgICA8VEQ+PEI+PEZPTlQgc2l6ZT0tMT5EZXNjcmlwdGlvbi9Ib292ZXIgSGVscDwvRk9OVD48L0I+PC9URD4KLSAgICA8VEQ+Ci0gICAgICA8Q0VOVEVSPjxCPjxGT05UIHNpemU9LTE+T2xkPC9GT05UPjwvQj4gPC9DRU5URVI+PC9URD4KLSAgICA8VEQ+Ci0gICAgICA8Q0VOVEVSPjxCPjxGT05UIHNpemU9LTE+TmV3IEZ1bGw8L0ZPTlQ+PC9CPiA8L0NFTlRFUj48L1REPgotICAgIDxURD48Qj48Rk9OVCBzaXplPS0xPlN0YXR1czwvRk9OVD48L0I+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURD4xPC9URD4KLSAgICA8VEQ+Q29uZmlndXJhdGlvbnM8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPmNvbmZpZ3M8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gc2hvd3MgdGhlIGNvbmZpZ3VyYXRpb25zIG9mIHRoZSBFY2xpcHNlLWJhc2VkIGFwcGxpY2F0aW9uPC9GT05UPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvdmlldzE2L2NvbmZpZ3MuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY3ZpZXcxNi9jb25maWdzLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgCi0gICAgICBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2V2aWV3MTYvY29uZmlncy5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+MjwvVEQ+Ci0gICAgPFREPlVwZGF0ZXM8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPnVwZGF0ZXM8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT5zaG93cyBzaXRlcyBhbiBFY2xpcHNlIGFwcCBjYW4gYmUgdXBkYXRlZCBmcm9tPC9GT05UPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvdmlldzE2L3VwZGF0ZXMuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY3ZpZXcxNi91cGRhdGVzLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgCi0gICAgICBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2V2aWV3MTYvdXBkYXRlcy5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgPFREPjM8L1REPgotICAgIDxURD5QcmV2aWV3PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPnByZXZpZXc8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPnNob3dzIGRldGFpbHMgb2YgdGhlIHNlbGVjdGVkIG9iamVjdDwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL3ZpZXcxNi9wcmV2aWV3LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2N2aWV3MTYvcHJldmlldy5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IAotICAgICAgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9ldmlldzE2L3ByZXZpZXcuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZGZkZmI+Ci0gICAgPFREPjQ8L1REPgotICAgIDxURD5XZWIgQnJvd3NlcjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5icm93c2VyPC9mb250PjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5hIGZ1bGx5LWZ1bmN0aW9uaW5nIFdlYiBicm93c2VyIChob3N0cyBJRTUgLSBXaW5kb3dzIG9ubHkpPC9mb250PjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvdmlldzE2L2Jyb3dzZXIuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY3ZpZXcxNi9icm93c2VyLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgCi0gICAgICBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2V2aWV3MTYvYnJvd3Nlci5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0gICA8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURD41PC9URD4KLSAgICA8VEQ+VXBkYXRlIFBlcnNwZWN0aXZlPC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPnVwZGF0ZV9wZXJzPC9mb250PjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5SZXByZXNlbnRzIEluc3RhbGwvVXBkYXRlCi0gICAgICBwZXJzcGVjdGl2ZSBpbiB0aGUgVUk8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2N2aWV3MTYvdXBkYXRlX3BlcnMuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiAKLSAgICAgIGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZXZpZXcxNi91cGRhdGVfcGVycy5naWYiIHdpZHRoPTE2IAotYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+Ci0gIDwvVFI+Ci0gIAotICA8VFIgYmdDb2xvcj0jYmZiZjdmPgotICAgIDxURCBjb2xTcGFuPTc+PEI+PEZPTlQgc2l6ZT0rMj5Ub29sYmFyIFdpemFyZDwvRk9OVD48L0I+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURD4xPC9URD4KLSAgICA8VEQ+IDwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7PC9GT05UPjwvVEQ+Ci0gICAgPFREPgotICAgICAgPFRBQkxFIGNlbGxTcGFjaW5nPTIgY2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+Ci0gICAgICAgIAotICAgICAgICA8VFI+Ci0gICAgICAgICAgPFREIHZBbGlnbj10b3A+PGZvbnQgc2l6ZT0iLTEiPiAgICBkZXNjcmlwdGlvbjwvZm9udD48L1REPgotICAgICAgICAgIDxURCB2QWxpZ249Y2VudGVyIGFsaWduPXJpZ2h0PgotICAgICAgICAgICAgPFRBQkxFPgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgIDxURCAKLSAgICAgICAgICAgICAgICBzdHlsZT0iQk9SREVSLVJJR0hUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1UT1A6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUxFRlQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUJPVFRPTTogYmxhY2sgMXB4IHNvbGlkIiAKLSAgICAgICAgICAgICAgICBhbGlnbj1taWRkbGUgYmdDb2xvcj0jZmZmZmUxPjxGT05UIAotICAgICAgICAgICAgICAgICAgc2l6ZT0tMj4mbmJzcDt0b29sIHRpcCZuYnNwOzwvRk9OVD48L1REPjwvVFI+PC9UQUJMRT48L1REPjwvVFI+PC9UQUJMRT48L1REPgotICAgIDxURD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNjY2NjY2M+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2N0b29sMTYvY29uZmlnX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgCi0gICAgICBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9ldG9vbDE2L2NvbmZpZ193aXouZ2lmIiB3aWR0aD0xNiAKLSAgICAgIGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9kdG9vbDE2L2NvbmZpZ193aXouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotCQotICA8VFIgYmdDb2xvcj0jZGZkZjlmPgotICAgIDxURD4yPC9URD4KLSAgICA8VEQ+IDwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+PC9GT05UPjwvVEQ+Ci0gICAgPFREPgotICAgICAgPFRBQkxFIGNlbGxTcGFjaW5nPTIgY2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+Ci0gICAgICAgIAotICAgICAgICA8VFI+Ci0gICAgICAgICAgPFREIHZBbGlnbj10b3A+PGZvbnQgc2l6ZT0iLTEiPiAgICBkZXNjcmlwdGlvbjwvZm9udD48L1REPgotICAgICAgICAgIDxURCB2QWxpZ249Y2VudGVyIGFsaWduPXJpZ2h0PgotICAgICAgICAgICAgPFRBQkxFPgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgIDxURCAKLSAgICAgICAgICAgICAgICBzdHlsZT0iQk9SREVSLVJJR0hUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1UT1A6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUxFRlQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUJPVFRPTTogYmxhY2sgMXB4IHNvbGlkIiAKLSAgICAgICAgICAgICAgICBhbGlnbj1taWRkbGUgYmdDb2xvcj0jZmZmZmUxPjxGT05UIAotICAgICAgICAgICAgICAgICAgc2l6ZT0tMj4mbmJzcDt0b29sIHRpcCZuYnNwOzwvRk9OVD48L1REPjwvVFI+PC9UQUJMRT48L1REPjwvVFI+PC9UQUJMRT48L1REPgotICAgIDxURD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNjY2NjY2M+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2N0b29sMTYvaW5zdGFsbF93aXouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIAotICAgICAgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZXRvb2wxNi9pbnN0YWxsX3dpei5naWYiIHdpZHRoPTE2IAotICAgICAgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2R0b29sMTYvaW5zdGFsbF93aXouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotICAKLSAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+MzwvVEQ+Ci0gICAgPFREPiA8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwOzwvRk9OVD48L1REPgotICAgIDxURD4KLSAgICAgIDxUQUJMRSBjZWxsU3BhY2luZz0yIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEwMCUiIGJvcmRlcj0wPgotICAgICAgICAKLSAgICAgICAgPFRSPgotICAgICAgICAgIDxURCB2QWxpZ249dG9wPjxmb250IHNpemU9Ii0xIj4gICAgZGVzY3JpcHRpb248L2ZvbnQ+PC9URD4KLSAgICAgICAgICA8VEQgdkFsaWduPWNlbnRlciBhbGlnbj1yaWdodD4KLSAgICAgICAgICAgIDxUQUJMRT4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICA8VEQgCi0gICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1SSUdIVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItVE9QOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1MRUZUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1CT1RUT006IGJsYWNrIDFweCBzb2xpZCIgCi0gICAgICAgICAgICAgICAgYWxpZ249bWlkZGxlIGJnQ29sb3I9I2ZmZmZlMT48Rk9OVCAKLSAgICAgICAgICAgICAgICAgIHNpemU9LTI+Jm5ic3A7dG9vbCB0aXAmbmJzcDs8L0ZPTlQ+PC9URD48L1RSPjwvVEFCTEU+PC9URD48L1RSPjwvVEFCTEU+PC9URD4KLSAgICA8VEQ+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jY2NjY2NjPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jdG9vbDE2L25ld19ib29rbWFya193aXouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIAotICAgICAgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZXRvb2wxNi9uZXdfYm9va21hcmtfd2l6LmdpZiIgd2lkdGg9MTYgCi0gICAgICBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvZHRvb2wxNi9uZXdfYm9va21hcmtfd2l6LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLQkKLSAgPFRSIGJnQ29sb3I9I2RmZGY5Zj4KLSAgICA8VEQ+NDwvVEQ+Ci0gICAgPFREPiA8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwOzwvRk9OVD48L1REPgotICAgIDxURD4KLSAgICAgIDxUQUJMRSBjZWxsU3BhY2luZz0yIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEwMCUiIGJvcmRlcj0wPgotICAgICAgICAKLSAgICAgICAgPFRSPgotICAgICAgICAgIDxURCB2QWxpZ249dG9wPjxmb250IHNpemU9Ii0xIj4gICAgZGVzY3JpcHRpb248L2ZvbnQ+PC9URD4KLSAgICAgICAgICA8VEQgdkFsaWduPWNlbnRlciBhbGlnbj1yaWdodD4KLSAgICAgICAgICAgIDxUQUJMRT4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICA8VEQgCi0gICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1SSUdIVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItVE9QOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1MRUZUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1CT1RUT006IGJsYWNrIDFweCBzb2xpZCIgCi0gICAgICAgICAgICAgICAgYWxpZ249bWlkZGxlIGJnQ29sb3I9I2ZmZmZlMT48Rk9OVCAKLSAgICAgICAgICAgICAgICAgIHNpemU9LTI+Jm5ic3A7dG9vbCB0aXAmbmJzcDs8L0ZPTlQ+PC9URD48L1RSPjwvVEFCTEU+PC9URD48L1RSPjwvVEFCTEU+PC9URD4KLSAgICA8VEQ+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jY2NjY2NjPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jdG9vbDE2L25ld19mb2xkZXJfd2l6LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyAKLSAgICAgIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2V0b29sMTYvbmV3X2ZvbGRlcl93aXouZ2lmIiB3aWR0aD0xNiAKLSAgICAgIGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9kdG9vbDE2L25ld19mb2xkZXJfd2l6LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+NTwvVEQ+Ci0gICAgPFREPiA8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwOzwvRk9OVD48L1REPgotICAgIDxURD4KLSAgICAgIDxUQUJMRSBjZWxsU3BhY2luZz0yIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEwMCUiIGJvcmRlcj0wPgotICAgICAgICAKLSAgICAgICAgPFRSPgotICAgICAgICAgIDxURCB2QWxpZ249dG9wPjxmb250IHNpemU9Ii0xIj4gICAgZGVzY3JpcHRpb248L2ZvbnQ+PC9URD4KLSAgICAgICAgICA8VEQgdkFsaWduPWNlbnRlciBhbGlnbj1yaWdodD4KLSAgICAgICAgICAgIDxUQUJMRT4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICA8VEQgCi0gICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1SSUdIVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItVE9QOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1MRUZUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1CT1RUT006IGJsYWNrIDFweCBzb2xpZCIgCi0gICAgICAgICAgICAgICAgYWxpZ249bWlkZGxlIGJnQ29sb3I9I2ZmZmZlMT48Rk9OVCAKLSAgICAgICAgICAgICAgICAgIHNpemU9LTI+Jm5ic3A7dG9vbCB0aXAmbmJzcDs8L0ZPTlQ+PC9URD48L1RSPjwvVEFCTEU+PC9URD48L1RSPjwvVEFCTEU+PC9URD4KLSAgICA8VEQ+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jY2NjY2NjPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jdG9vbDE2L25ld19zZWFyY2hfd2l6LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyAKLSAgICAgIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2V0b29sMTYvbmV3X3NlYXJjaF93aXouZ2lmIiB3aWR0aD0xNiAKLSAgICAgIGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9kdG9vbDE2L25ld19zZWFyY2hfd2l6LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLQkKLSAgPFRSIGJnQ29sb3I9I2RmZGY5Zj4KLSAgICA8VEQ+NjwvVEQ+Ci0gICAgPFREPiA8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwOzwvRk9OVD48L1REPgotICAgIDxURD4KLSAgICAgIDxUQUJMRSBjZWxsU3BhY2luZz0yIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEwMCUiIGJvcmRlcj0wPgotICAgICAgICAKLSAgICAgICAgPFRSPgotICAgICAgICAgIDxURCB2QWxpZ249dG9wPjxmb250IHNpemU9Ii0xIj4gICAgZGVzY3JpcHRpb248L2ZvbnQ+PC9URD4KLSAgICAgICAgICA8VEQgdkFsaWduPWNlbnRlciBhbGlnbj1yaWdodD4KLSAgICAgICAgICAgIDxUQUJMRT4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICA8VEQgCi0gICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1SSUdIVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItVE9QOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1MRUZUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1CT1RUT006IGJsYWNrIDFweCBzb2xpZCIgCi0gICAgICAgICAgICAgICAgYWxpZ249bWlkZGxlIGJnQ29sb3I9I2ZmZmZlMT48Rk9OVCAKLSAgICAgICAgICAgICAgICAgIHNpemU9LTI+Jm5ic3A7dG9vbCB0aXAmbmJzcDs8L0ZPTlQ+PC9URD48L1RSPjwvVEFCTEU+PC9URD48L1RSPjwvVEFCTEU+PC9URD4KLSAgICA8VEQ+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jY2NjY2NjPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jdG9vbDE2L3VuaW5zdGFsbF93aXouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIAotICAgICAgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZXRvb2wxNi91bmluc3RhbGxfd2l6LmdpZiIgd2lkdGg9MTYgCi0gICAgICBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvZHRvb2wxNi91bmluc3RhbGxfd2l6LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLQk8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURD43PC9URD4KLSAgICA8VEQ+IDwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7PC9GT05UPjwvVEQ+Ci0gICAgPFREPgotICAgICAgPFRBQkxFIGNlbGxTcGFjaW5nPTIgY2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+Ci0gICAgICAgIAotICAgICAgICA8VFI+Ci0gICAgICAgICAgPFREIHZBbGlnbj10b3A+PGZvbnQgc2l6ZT0iLTEiPiAgICBkZXNjcmlwdGlvbjwvZm9udD48L1REPgotICAgICAgICAgIDxURCB2QWxpZ249Y2VudGVyIGFsaWduPXJpZ2h0PgotICAgICAgICAgICAgPFRBQkxFPgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgIDxURCAKLSAgICAgICAgICAgICAgICBzdHlsZT0iQk9SREVSLVJJR0hUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1UT1A6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUxFRlQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUJPVFRPTTogYmxhY2sgMXB4IHNvbGlkIiAKLSAgICAgICAgICAgICAgICBhbGlnbj1taWRkbGUgYmdDb2xvcj0jZmZmZmUxPjxGT05UIAotICAgICAgICAgICAgICAgICAgc2l6ZT0tMj4mbmJzcDt0b29sIHRpcCZuYnNwOzwvRk9OVD48L1REPjwvVFI+PC9UQUJMRT48L1REPjwvVFI+PC9UQUJMRT48L1REPgotICAgIDxURD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNjY2NjY2M+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2N0b29sMTYvdXBkYXRlX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgCi0gICAgICBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9ldG9vbDE2L3VwZGF0ZV93aXouZ2lmIiB3aWR0aD0xNiAKLSAgICAgIGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9kdG9vbDE2L3VwZGF0ZV93aXouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotICAKLSAgCi0gIDxUUiBiZ0NvbG9yPSNiZmJmN2Y+Ci0gICAgPFREIGNvbFNwYW49Nz48Qj48Rk9OVCBzaXplPSsyPkxvY2FsIFRvb2xiYXI8L0ZPTlQ+PC9CPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+MTwvVEQ+Ci0gICAgPFREPkdvIEJhY2t3YXJkPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDtiYWNrd2FyZF9uYXY8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+Ci0gICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4KLSAgICAgICAgCi0gICAgICAgIDxUUj4KLSAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+QSBzdGFuZGFyZCBicm93c2VyICdiYWNrd2FyZCcgYnV0dG9uPC9mb250PjwvVEQ+Ci0gICAgICAgICAgPFREIHZBbGlnbj1jZW50ZXIgYWxpZ249cmlnaHQ+Ci0gICAgICAgICAgICA8VEFCTEU+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgPFREIAotICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAotICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCi0gICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO0dvIEJhY2t3YXJkJm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvY2xjbDE2L2JhY2t3YXJkX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiA8SU1HIAotICAgICAgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZWxjbDE2L2JhY2t3YXJkX25hdi5naWYiIAotICAgICAgd2lkdGg9MTYgYm9yZGVyPTA+IDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZGxjbDE2L2JhY2t3YXJkX25hdi5naWYiIAotICAgICAgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jY2NjY2NjPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jbGNsMTYvYmFja3dhcmRfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyAKLSAgICAgIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2VsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmIiB3aWR0aD0xNiAKLSAgICAgIGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9kbGNsMTYvYmFja3dhcmRfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLQkKLSAgPFRSIGJnQ29sb3I9I2RmZGY5Zj4KLSAgICA8VEQ+MjwvVEQ+Ci0gICAgPFREPkdvIEZvcndhcmQ8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO2ZvcndhcmRfbmF2PC9GT05UPjwvVEQ+Ci0gICAgPFREPgotICAgICAgPFRBQkxFIGNlbGxTcGFjaW5nPTIgY2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+Ci0gICAgICAgIAotICAgICAgICA8VFI+Ci0gICAgICAgICAgPFREIHZBbGlnbj10b3A+PGZvbnQgc2l6ZT0iLTEiPkEgc3RhbmRhcmQgYnJvd3NlciAnZm9yd2FyZCcgYnV0dG9uPC9mb250PjwvVEQ+Ci0gICAgICAgICAgPFREIHZBbGlnbj1jZW50ZXIgYWxpZ249cmlnaHQ+Ci0gICAgICAgICAgICA8VEFCTEU+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgPFREIAotICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAotICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCi0gICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO0dvIEZvcndhcmQmbmJzcDs8L0ZPTlQ+PC9URD48L1RSPjwvVEFCTEU+PC9URD48L1RSPjwvVEFCTEU+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9jbGNsMTYvZm9yd2FyZF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4gPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9lbGNsMTYvZm9yd2FyZF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4gPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9kbGNsMTYvZm9yd2FyZF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNjY2NjY2M+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2NsY2wxNi9mb3J3YXJkX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgCi0gICAgICBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9lbGNsMTYvZm9yd2FyZF9uYXYuZ2lmIiB3aWR0aD0xNiAKLSAgICAgIGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9kbGNsMTYvZm9yd2FyZF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURD4zPC9URD4KLSAgICA8VEQ+R288L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO2dvX25hdjwvRk9OVD48L1REPgotICAgIDxURD4KLSAgICAgIDxUQUJMRSBjZWxsU3BhY2luZz0yIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEwMCUiIGJvcmRlcj0wPgotICAgICAgICAKLSAgICAgICAgPFRSPgotICAgICAgICAgIDxURCB2QWxpZ249dG9wPjxmb250IHNpemU9Ii0xIj5BIHN0YW5kYXJkIGJyb3dzZXIgYnV0dG9uIGZvcgotICAgICAgICAgICAgbmF2aWdhdGluZyB0byBhIFVSTC48L2ZvbnQ+PC9URD4KLSAgICAgICAgICA8VEQgdkFsaWduPWNlbnRlciBhbGlnbj1yaWdodD4KLSAgICAgICAgICAgIDxUQUJMRT4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICA8VEQgCi0gICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1SSUdIVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItVE9QOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1MRUZUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1CT1RUT006IGJsYWNrIDFweCBzb2xpZCIgCi0gICAgICAgICAgICAgICAgYWxpZ249bWlkZGxlIGJnQ29sb3I9I2ZmZmZlMT48Rk9OVCAKLSAgICAgICAgICAgICAgICAgIHNpemU9LTI+Jm5ic3A7R28mbmJzcDs8L0ZPTlQ+PC9URD48L1RSPjwvVEFCTEU+PC9URD48L1RSPjwvVEFCTEU+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9jbGNsMTYvZ29fbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+IDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZWxjbDE2L2dvX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2RsY2wxNi9nb19uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNjY2NjY2M+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2NsY2wxNi9nb19uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiAKLSAgICAgIGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZWxjbDE2L2dvX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgCi0gICAgICBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9kbGNsMTYvZ29fbmF2LmdpZiIgd2lkdGg9MTYgCi0gICAgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLQkKLSAgPFRSIGJnQ29sb3I9I2RmZGY5Zj4KLSAgICA8VEQ+NDwvVEQ+Ci0gICAgPFREPkdvIEhvbWU8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO2hvbWVfbmF2PC9GT05UPjwvVEQ+Ci0gICAgPFREID4KLSAgICAgIDxUQUJMRSBjZWxsU3BhY2luZz0yIGNlbGxQYWRkaW5nPTAgYm9yZGVyPTA+Ci0gICAgICAgIAotICAgICAgICA8VFI+Ci0gICAgICAgICAgPFREIHZBbGlnbj10b3A+PGZvbnQgc2l6ZT0iLTEiPkEgc3RhbmRhcmQgYnJvd3NlciBidXR0b24KLSAgICAgICAgICAgIGZvciBnb2luZyB0byB0aGUgaG9tZSBsb2NhdGlvbjwvZm9udD48L1REPgotICAgICAgICAgIDxURD4KLSAgICAgICAgICAgIDxUQUJMRT4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICA8VEQgCi0gICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1SSUdIVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItVE9QOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1MRUZUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1CT1RUT006IGJsYWNrIDFweCBzb2xpZCIgCi0gICAgICAgICAgICAgICAgYWxpZ249bWlkZGxlIGJnQ29sb3I9I2ZmZmZlMT48Rk9OVCAKLSAgICAgICAgICAgICAgICAgIHNpemU9LTI+Jm5ic3A7R28gSG9tZSZuYnNwOzwvRk9OVD48L1REPjwvVFI+PC9UQUJMRT48L1REPjwvVFI+PC9UQUJMRT48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2NsY2wxNi9ob21lX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2VsY2wxNi9ob21lX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2RsY2wxNi9ob21lX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY2xjbDE2L2hvbWVfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyAKLSAgICAgIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2VsY2wxNi9ob21lX25hdi5naWYiIHdpZHRoPTE2IAotICAgICAgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9kbGNsMTYvaG9tZV9uYXYuZ2lmIiAKLSAgICAgIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgPFREPjU8L1REPgotICAgIDxURD5SZWZyZXNoPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDtyZWZyZXNoX25hdjwvRk9OVD48L1REPgotICAgIDxURD4KLSAgICAgIDxUQUJMRSBjZWxsU3BhY2luZz0yIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEwMCUiIGJvcmRlcj0wPgotICAgICAgICAKLSAgICAgICAgPFRSPgotICAgICAgICAgIDxURCB2QWxpZ249dG9wPjxmb250IHNpemU9Ii0xIj5SZWZyZXNoIHRoZSBjb250ZW50cyBvZiB0aGUgdmlldzwvZm9udD48L1REPgotICAgICAgICAgIDxURCB2QWxpZ249Y2VudGVyIGFsaWduPXJpZ2h0PgotICAgICAgICAgICAgPFRBQkxFPgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgIDxURCAKLSAgICAgICAgICAgICAgICBzdHlsZT0iQk9SREVSLVJJR0hUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1UT1A6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUxFRlQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUJPVFRPTTogYmxhY2sgMXB4IHNvbGlkIiAKLSAgICAgICAgICAgICAgICBhbGlnbj1taWRkbGUgYmdDb2xvcj0jZmZmZmUxPjxGT05UIAotICAgICAgICAgICAgICAgICAgc2l6ZT0tMj4mbmJzcDtSZWZyZXNoJm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvY2xjbDE2L3JlZnJlc2hfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+IDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZWxjbDE2L3JlZnJlc2hfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+IDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZGxjbDE2L3JlZnJlc2hfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jY2NjY2NjPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jbGNsMTYvcmVmcmVzaF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIAotICAgICAgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZWxjbDE2L3JlZnJlc2hfbmF2LmdpZiIgd2lkdGg9MTYgCi0gICAgICBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvZGxjbDE2L3JlZnJlc2hfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGY5Zj4KLSAgICA8VEQ+NjwvVEQ+Ci0gICAgPFREPlN0b3A8L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+c3RvcF9uYXY8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+Ci0gICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4KLSAgICAgICAgCi0gICAgICAgIDxUUj4KLSAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+QSBzdGFuZGFyZCBicm93c2VyIGJ1dHRvbiBmb3Igc3RvcHBpbmcKLSAgICAgICAgICAgIHRoZSBuYXZpZ2F0aW9uIGluIHByb2dyZXNzPC9mb250PjwvVEQ+Ci0gICAgICAgICAgPFREIHZBbGlnbj1jZW50ZXIgYWxpZ249cmlnaHQ+Ci0gICAgICAgICAgICA8VEFCTEU+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgPFREIAotICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAotICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCi0gICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO1N0b3AmbmJzcDsmbmJzcDs8L0ZPTlQ+PC9URD48L1RSPjwvVEFCTEU+PC9URD48L1RSPjwvVEFCTEU+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9jbGNsMTYvc3RvcF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4gPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9lbGNsMTYvc3RvcF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4gPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9kbGNsMTYvc3RvcF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNjY2NjY2M+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2NsY2wxNi9zdG9wX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgCi0gICAgICBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9lbGNsMTYvc3RvcF9uYXYuZ2lmIiB3aWR0aD0xNiAKLSAgICAgIGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZGxjbDE2L3N0b3BfbmF2LmdpZiIgCi0gICAgICB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotICA8VFI+Ci0gICAgPFREPjc8L1REPgotICAgIDxURD5TaG93IFVuY29uZmlndXJlZCBGZWF0dXJlczwvVEQ+Ci0gICAgPFREPnNob3dfdW5jb25mPC9URD4KLSAgICA8VEQ+Ci0gICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4KLSAgICAgICAgCi0gICAgICAgIDxUUj4KLSAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+QSB0b2dnbGUgYnV0dG9uIHRoYXQgYWxsb3dzCi0gICAgICAgICAgICB1bmNvbmZpZ3VyZWQgZmVhdHVyZXMgdG8gc2hvdyBpbiB0aGUgdmlldzwvZm9udD48L1REPgotICAgICAgICAgIDxURCB2QWxpZ249Y2VudGVyIGFsaWduPXJpZ2h0PgotICAgICAgICAgICAgPFRBQkxFPgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgIDxURCAKLSAgICAgICAgICAgICAgICBzdHlsZT0iQk9SREVSLVJJR0hUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1UT1A6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUxFRlQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUJPVFRPTTogYmxhY2sgMXB4IHNvbGlkIiAKLSAgICAgICAgICAgICAgICBhbGlnbj1taWRkbGUgYmdDb2xvcj0jZmZmZmUxPjxGT05UIAotICAgICAgICAgICAgICAgICAgc2l6ZT0tMj4mbmJzcDtTaG93IFVuY29uZmlndXJlZCBGZWF0dXJlcyZuYnNwOzwvRk9OVD48L1REPjwvVFI+PC9UQUJMRT48L1REPjwvVFI+PC9UQUJMRT48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2NsY2wxNi9zaG93X3VuY29uZi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiA8L1REPgotICAgIDxURCBCR0NPTE9SPSNjY2NjY2M+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2NsY2wxNi9zaG93X3VuY29uZi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgCi0gICAgICBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9lbGNsMTYvc2hvd191bmNvbmYuZ2lmIiB3aWR0aD0xNiAKLSAgICAgIGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9kbGNsMTYvc2hvd191bmNvbmYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgotICAgIDxURD48L1REPjwvVFI+Ci0JCi0gIDxUUiBiZ0NvbG9yPSNiZmJmN2Y+Ci0gICAgPFREIGNvbFNwYW49Nz48Qj48Rk9OVCBzaXplPSsyPk1vZGVsIE9iamVjdDwvRk9OVD48L0I+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURD4xPC9URD4KLSAgICA8VEQ+Jm5ic3A7QXBwbGljYXRpb24gQ29uZmlndXJhdGlvbjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7YXBwX29iajwvRk9OVD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+dGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiB1c2VkIHRvIGxvYWQgdGhlIGN1cnJlbnQKLSAgICAgIGFwcGxpY2F0aW9uPC9mb250PjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvYXBwX29iai5naWYiIHdpZHRoPTE2IAotICAgIGFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi9hcHBfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLQkKLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD4yPC9URD4KLSAgICA8VEQ+TXkgQ29tcHV0ZXI8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO2NvbXB1dGVyX29iajwvRk9OVD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+dGhlIGZpbGUgc3lzdGVtIHJvb3Q8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi9jb21wdXRlcl9vYmouZ2lmIiB3aWR0aD0xNiAKLSAgICBhbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICAgIDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi9jb21wdXRlcl9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KLSAgICAgIDxQPjwvUD48L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURD4zPC9URD4KLSAgICA8VEQ+Jm5ic3A7RmVhdHVyZTwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7ZmVhdHVyZV9vYmo8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmZlYXR1cmUgb2JqZWN0PC9mb250PjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvZmVhdHVyZV9vYmouZ2lmIiB3aWR0aD0xNiAKLWFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPgotICAgICAgPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L2ZlYXR1cmVfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Ci0gICAgICA8UD48L1A+PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD40PC9URD4KLSAgICA8VEQ+VW5jb25maWd1cmVkIEZlYXR1cmU8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO3VuY29uZl9mZWF0dXJlX29iajwvRk9OVD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+ZmVhdHVyZSB0aGF0IGlzIGN1cnJlbnRseSB1bmNvbmZpZ3VyZWQgKGkuZS4gc3RpbGwKLSAgICAgIHByZXNlbnQgYnV0IGRpc2FibGVkIGluIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24pPC9mb250PjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvdW5jb25mX2ZlYXR1cmVfb2JqLmdpZiIgd2lkdGg9MTYgCi0gICAgYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgICA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvdW5jb25mX2ZlYXR1cmVfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Ci0gICAgICA8UD48L1A+PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+NTwvVEQ+Ci0gICAgPFREPlBsYWNlcyB0byBWaXNpdDwvVEQ+Ci0gICAgPFREPnBsYWNlc19vYmo8L1REPgotICAgIDxURD5hIGZvbGRlciB0aGF0IGNvbnRhaW5zIGJvb2ttYXJrcyB0byByZW1vdGUgc2l0ZXMgdGhhdAotICAgICAgY29udGFpbiBjb29sIGZlYXR1cmVzPC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi9wbGFjZXNfb2JqLmdpZiIgd2lkdGg9MTYgCi1hbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvcGxhY2VzX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgotICAgICAgJm5ic3A7PC9URD4KLSAgICA8VEQ+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZGZkZmI+Ci0gICAgPFREPjY8L1REPgotICAgIDxURD5TaXRlPC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPnNpdGVfb2JqJm5ic3A7PC9mb250PjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj51cGRhdGUgc2l0ZSBvYmplY3QgdGhhdCByZXByZXNlbnQgYSBwcm92aWRlcgotICAgICAgc2l0ZSAoc2l0ZSB0aGF0IGlzIHNldCB1cCB0byBhY3QgYXMgYSBzb3VyY2Ugb2YgZmVhdHVyZXMpPC9mb250PjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvc2l0ZV9vYmouZ2lmIiB3aWR0aD0xNiAKLWFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPgotICAgICAgPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L3NpdGVfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Ci0gICAgICA8UD48L1A+PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgPFRSPgotICAgIDxURD43PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPkxvY2FsIFNpdGU8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmxzaXRlX29iajwvZm9udD48L1REPgotICAgIDxURD51cGRhdGUgc2l0ZSBvYmplY3QgdGhhdCByZXByZXNlbnRzIGEgcmVjZWl2ZXIgc2l0ZSAoc2l0ZQotICAgICAgdGhhdCBpcyBzZXQgdXAgdG8gYWN0IGFzIGEgdGFyZ2V0IG9mIHRoZSBmZWF0dXJlIGluc3RhbGxhdGlvbik8L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiAKLSAgICAgIGFsdD0iIiAKLXNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvbHNpdGVfb2JqLmdpZiIgd2lkdGg9MTYgYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L2xzaXRlX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgotICAgICAgJm5ic3A7PC9URD4KLSAgICA8VEQ+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZGZkZmI+Ci0gICAgPFREPjg8L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+RmVhdHVyZSBDYXRlZ29yeTwvZm9udD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+Y2F0ZWdvcnlfb2JqPC9mb250PjwvVEQ+Ci0gICAgPFREPnNpdGVzIGNhbiBjbGFzc2lmeSBmZWF0dXJlcyB0aGV5IGhvc3QgaW50byBoaWVyYXJjaGljYWwKLSAgICAgIGNhdGVnb3JpZXM8L1REPgotICAgIDxURD4KLSAgICAgIDxQIGFsaWduPWxlZnQ+PElNRyBoZWlnaHQ9MTYgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi9jYXRlZ29yeV9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1A+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi9jYXRlZ29yeV9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KLSAgICAgICZuYnNwOzwvVEQ+Ci0gICAgPFREPjwvVEQ+PC9UUj4KLSAgPFRSPgotICAgIDxURD45PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPkJvb2ttYXJrIEZvbGRlcjwvZm9udD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+YmZvbGRlcl9vYmo8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+Zm9sZGVyIG9iamVjdCBpbiB0aGUgdmlldyB0aGF0IHByb3ZpZGVzIGZvcgotICAgICAgb3JnYW5pemluZyBzaXRlIGJvb2ttYXJrcyBhbmQgc2VhcmNoIG9iamVjdHM8L1REPgotICAgIDxURD4KLSAgICAgIDxQIGFsaWduPWxlZnQ+PElNRyBoZWlnaHQ9MTYgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi9iZm9sZGVyX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvUD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmYgPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi9iZm9sZGVyX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgotICAgICAgJm5ic3A7PC9URD4KLSAgICA8VEQ+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZGZkZmI+Ci0gICAgPFREPjEwPC9URD4KLSAgICA8VEQ+VGV4dCBTZWFyY2g8L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+dHNlYXJjaF9vYmo8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPlRleHQgc2VhcmNoIG9iamVjdCZuYnNwOzwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L3RzZWFyY2hfb2JqLmdpZiIgd2lkdGg9MTYgYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgICA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvdHNlYXJjaF9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KLSAgICAgIDxQPjwvUD48L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotICA8VFI+Ci0gICAgPFREPjExPC9URD4KLSAgICA8VEQ+VXBkYXRlIFNlYXJjaDwvVEQ+Ci0gICAgPFREPnVzZWFyY2hfb2JqPC9URD4KLSAgICA8VEQ+QXZhaWxhYmxlIFVwZGF0ZXMgc2VhcmNoIG9iamVjdDwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvdXNlYXJjaF9vYmouZ2lmIiB3aWR0aD0xNiBhbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICAgIDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi91c2VhcmNoX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgotICAgICAgPFA+PC9QPgotICAgIDwvVEQ+Ci0gICAgPFREPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD4xMjwvVEQ+Ci0gICAgPFREPlBsdWctaW4gU2VhcmNoPC9URD4KLSAgICA8VEQ+cHNlYXJjaF9vYmo8L1REPgotICAgIDxURD5QbHVnLWluIHNlYXJjaCBvYmplY3Q8L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L3BzZWFyY2hfb2JqLmdpZiIgd2lkdGg9MTYgYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgICA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvcHNlYXJjaF9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KLSAgICAgIDxQPjwvUD4KLSAgICA8L1REPgotICAgIDxURD48L1REPjwvVFI+Ci0gIDxUUj4KLSAgICA8VEQ+MTM8L1REPgotICAgIDxURD5GaXhlZCBWb2x1bWU8L1REPgotICAgIDxURD52Zml4ZWRfb2JqPC9URD4KLSAgICA8VEQ+TG9jYWwgZmlsZSBzeXN0ZW0gdm9sdW1lIHRoYXQgcmVwcmVzZW50cyBhIGZpeGVkIGRyaXZlIChXaW5kb3dzKSBvcgotICAgICAgZm9sZGVyIChMaW51eCk8L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiAKLSAgICAgIGFsdD0iIiBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L3ZmaXhlZF9vYmouZ2lmIiB3aWR0aD0xNiBhbGlnbj1sZWZ0IGJvcmRlcj0wPgotICAgIDwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvdmZpeGVkX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgotICAgICAgCi0gICAgPC9URD4KLSAgICA8VEQ+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZGZkZmI+Ci0gICAgPFREPjE0PC9URD4KLSAgICA8VEQ+UmVtb3RlIFZvbHVtZTwvVEQ+Ci0gICAgPFREPnZyZW1vdGVfb2JqPC9URD4KLSAgICA8VEQ+UmVtb3RlIGZpbGUgc3lzdGVtIHZvbHVtZSB0aGF0IHJlcHJlc2VudHMgYSBzaGFyZWQgZHJpdmUgKFdpbmRvdykgb3IKLSAgICAgIG1vdW50ZWQgdm9sdW1lIChMaW51eCk8L1REPgotICAgIDxURCBoZWlnaHQgPTE2IAotICAgICAgYWx0PSIiIDxJTUcgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi92cmVtb3RlX29iai5naWYiIHdpZHRoPTE2IGFsaWduPWxlZnQgYm9yZGVyPSIxIiAKLSAgID4KLSAgICA8L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L3ZyZW1vdGVfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Ci0gICAgICAmbmJzcDsKLSAgICA8L1REPgotICAgIDxURD48L1REPjwvVFI+Ci0gIDxUUj4KLSAgICA8VEQ+MTU8L1REPgotICAgIDxURD5SZW1vdmFibGUgVm9sdW1lPC9URD4KLSAgICA8VEQ+dnJlbW92YWJsZV9vYmo8L1REPgotICAgIDxURD5SZW1vdmFibGUgZmlsZSBzeXN0ZW0gdm9sdW1lIHRoYXQgaXMgbmVpdGhlciBDRC1ST00gbm9yIEZsb3BweSBEaXNrLgotICAgICAgVGhpcyBpbWFnZSBpcyB1c2VkIGZvciBhbGwgb3RoZXIgcmVtb3ZhYmxlIHZvbHVtZXMgbGlrZSBEVkQtUk9NLCB2YXJpb3VzCi0gICAgICBQQ01DSUEgY2FyZHMgZXRjLjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IAotICAgICAgYWx0PSIiIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvdnJlbW92YWJsZV9vYmouZ2lmIiB3aWR0aD0xNiBhbGlnbj1sZWZ0IGJvcmRlcj0wPgotICAgIDwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvdnJlbW92YWJsZV9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KLSAgICAgICZuYnNwOwotICAgIDwvVEQ+Ci0gICAgPFREPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD4xNjwvVEQ+Ci0gICAgPFREPkNELVJPTTwvVEQ+Ci0gICAgPFREPmNkX29iajwvVEQ+Ci0gICAgPFREPkZpbGUgc3lzdGVtIHZvbHVtZSB0aGF0IHJlcHJlc2VudCBhIENELVJPTSBkcml2ZTwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvY2Rfb2JqLmdpZiIgd2lkdGg9MTYgYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgICA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvY2Rfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Ci0gICAgICA8UD48L1A+Ci0gICAgPC9URD4KLSAgICA8VEQ+PC9URD48L1RSPgotICA8VFI+Ci0gICAgPFREPjE3PC9URD4KLSAgICA8VEQ+RmxvcHB5IERpc2s8L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+ZmxvcHB5X29iajwvZm9udD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+RmlsZSBzeXN0ZW0gdm9sdW1lIHRoYXQgcmVwcmVzZW50cyBhIDMgMS8yIGluY2ggZmxvcHB5Ci0gICAgICBkaXNrIGRyaXZlPC9mb250PjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvZmxvcHB5X29iai5naWYiIHdpZHRoPTE2IGFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPgotICAgICAgPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L2Zsb3BweV9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KLSAgICAgIDxQPjwvUD48L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZGZkZmI+Ci0gICAgPFREPjE4PC9URD4KLSAgICA8VEQ+U2F2ZWQgQ29uZmlndXJhdGlvbnM8L1REPgotICAgIDxURD5zYXZlZF9vYmo8L1REPgotICAgIDxURD48Zm9udCBzaXplPSIyIj5Gb2xkZXIgdGhhdCBob2xkcyBwYXN0IGNvbmZpZ3VyYXRpb25zIHRoYXQgaGF2ZSBiZWVuIHByZXNlcnZlZCBhbmQvb3IKLSAgICAgIHJlbmFtZWQ8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgCi0gICAgICBhbHQ9IiIgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi9zYXZlZF9vYmouZ2lmIiB3aWR0aD0xNiBhbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZiA+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L3NhdmVkX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREPjwvVEQ+PC9UUj4KLSAgPFRSPgotICAgIDxURD4xOTwvVEQ+Ci0gICAgPFREPkNvbmZpZ3VyYXRpb24gSGlzdG9yeTwvVEQ+Ci0gICAgPFREPmhpc3Rvcnlfb2JqPC9URD4KLSAgICA8VEQ+Rm9sZGVyIHRoYXQgaG9sZHMgcGFzdCBjb25maWd1cmF0aW9uczwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IAotICAgICAgYWx0PSIiIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvaGlzdG9yeV9vYmouZ2lmIiB3aWR0aD0xNiBhbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZiA+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L2hpc3Rvcnlfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQ+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZGZkZmI+Ci0gICAgPFREPjIwPC9URD4KLSAgICA8VEQ+QXZhaWxhYmxlIFVwZGF0ZXM8L1REPgotICAgIDxURD51cGRhdGVzX29iajwvVEQ+Ci0gICAgPFREPlVwZGF0ZSBTZWFyY2ggb2JqZWN0IHRoYXQgaXMgcHJlLWNvbmZpZ3VyZWQgdG8gbG9vayBmb3IKLSAgICAgIGF2YWlsYWJsZSB1cGRhdGVzIG9mIGFsbCB0aGUgaW5zdGFsbGVkIGZlYXR1cmVzLiBJdCBjYW5ub3QgYmUgcmVtb3ZlZCBmcm9tCi0gICAgICB0aGUgdmlldy48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiAKLSAgICAgIGFsdD0iIiBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L3VwZGF0ZXNfb2JqLmdpZiIgd2lkdGg9MTYgYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmYgPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi91cGRhdGVzX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREPjwvVEQ+PC9UUj4KLSAgPFRSPgotICAgIDxURD4yMTwvVEQ+Ci0gICAgPFREPkNvbmZpZ3VyYXRpb248L1REPgotICAgIDxURD5jb25maWdfb2JqPC9URD4KLSAgICA8VEQ+QSBjb25maWd1cmF0aW9uIGhpc3RvcnkgZW50cnkgdGhhdCByZXByZXNlbnRzIG9uZQotICAgICAgY29uZmlndXJhdGlvbjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IAotICAgICAgYWx0PSIiIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvY29uZmlnX29iai5naWYiIHdpZHRoPTE2IGFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmID48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvY29uZmlnX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREPjwvVEQ+PC9UUj4KLQkKLQkKLQkKLSAgPFRSIGJnQ29sb3I9I2NjY2NjYz4KLSAgICA8VEQgY29sU3Bhbj03PjxCPjxGT05UIHNpemU9KzI+T2JqZWN0IE92ZXJsYXkgPC9GT05UPjwvQj48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgPFREPjE8L1REPgotICAgIDxURD4mbmJzcDtjdXJyZW50PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmN1cnJlbnRfY28mbmJzcDs8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDtpbmRpY2F0ZXMgdGhhdCB0aGUgY29uZmlndXJhdGlvbiBpcyBjdXJyZW50IGkuZS4gaW4KLSAgICAgIGVmZmVjdDwvRk9OVD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD04IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb3ZyMTYvY3VycmVudF9jby5naWYiIHdpZHRoPTcgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPgotICAgICAgPElNRyBoZWlnaHQ9OCBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb3ZyMTYvY3VycmVudF9jby5naWYiIHdpZHRoPTcgYm9yZGVyPTA+Ci0gICAgICA8UD48L1A+PC9URD4KLSAgICA8VEQ+IDwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD4yPC9URD4KLSAgICA8VEQ+Jm5ic3A7ZXJyb3I8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPmVycm9yX2NvJm5ic3A7PC9GT05UPjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+d2lsbCBiZSBvdmVybGF5ZWQgb3ZlciBQREUgZWRpdG9yIG9iamVjdHMgdGhhdCBhcmUgCi0gICAgICBzb21laG93IGFzc29jaWF0ZWQgd2l0aCBYTUwgc3ludGF4IG9yIHZhbGlkYXRpb24gZXJyb3JzJm5ic3A7PC9GT05UPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTggYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9jby5naWYiIHdpZHRoPTcgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPgotICAgICAgPElNRyBoZWlnaHQ9OCBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb3ZyMTYvZXJyb3JfY28uZ2lmIiB3aWR0aD03IGJvcmRlcj0wPgotICAgICAgPFA+PC9QPjwvVEQ+Ci0gICAgPFREPiA8L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgPFREPjM8L1REPgotICAgIDxURD4mbmJzcDtpbnN0YWxsYWJsZTwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5pbnN0YWxsYWJsZV9jbyZuYnNwOzwvZm9udD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+aW5kaWNhdGVzIHRoYXQgc2l0ZSBjYW4gYWNjZXB0IGZlYXR1cmVzIGR1cmluZwotICAgICAgaW5zdGFsbGF0aW9uPC9mb250PjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTggYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vdnIxNi9pbnN0YWxsYWJsZV9jby5naWYiIHdpZHRoPTcgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPgotICAgICAgPElNRyBoZWlnaHQ9OCBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb3ZyMTYvaW5zdGFsbGFibGVfY28uZ2lmIiB3aWR0aD03IGJvcmRlcj0wPgotICAgICAgPFA+PC9QPjwvVEQ+Ci0gICAgPFREPiA8L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+NDwvVEQ+Ci0gICAgPFREPiZuYnNwO2xpbmtlZDwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5saW5rZWRfY28mbmJzcDs8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmluZGljYXRlcyB0aGF0IHRoZSBzaXRlIGlzIG9ubHkgbGlua2VkIHRvIHRoZQotICAgICAgY29uZmlndXJhdGlvbjwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xMCBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL292cjE2L2xpbmtlZF9jby5naWYiIHdpZHRoPTExIGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICAgIDxJTUcgaGVpZ2h0PTggYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL292cjE2L2xpbmtlZF9jby5naWYiIHdpZHRoPTcgYm9yZGVyPTA+Ci0gICAgICA8UD48L1A+PC9URD4KLSAgICA8VEQ+IDwvVEQ+PC9UUj4KLSAgICA8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURD41PC9URD4KLSAgICA8VEQ+dW5jb25maWd1cmVkPC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPnVuY29uZmlndXJlZF9jbyZuYnNwOzwvZm9udD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+ICAgICAgCi0gICAgICA8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPgotICAgICAgPFA+PC9QPjxJTUcgaGVpZ2h0PTggYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9vdnIxNi91bmNvbmZpZ3VyZWRfY28uZ2lmIiAKLSAgICAgIHdpZHRoPTcgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQ+IDwvVEQ+PC9UUj4KLQkKLSAgCi0gIAotICA8dHIgYmdDb2xvcj0jY2NjY2NjPgotICAgIDxURCBjb2xTcGFuPTc+PGI+PGZvbnQgc2l6ZT0iKzIiPkZvcm1zIEFydHdvcms8L2ZvbnQ+PC9iPjwvVEQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8VEQ+MTwvVEQ+Ci0gICAgPFREPiZuYnNwO1RvcGljPC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPnRvcGljJm5ic3A7PC9mb250PjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7YW4gaW1hZ2UgdG8gYmUgdXNlZCBhcyBhIGN1c3RvbSBidWxsZXQgZm9yIGl0ZW1zIGluCi0gICAgICBhICdXZWxjb21lJyBwYWdlPC9GT05UPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZm9ybXMvdG9waWMuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2Zvcm1zL3RvcGljLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQ+IDwvVEQ+Ci0gIDwvdHI+Ci0gIDx0ciBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+MjwvVEQ+Ci0gICAgPFREPkRlZmF1bHQgUHJvdmlkZXI8L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+ZGVmX3Byb3ZpZGVyJm5ic3A7PC9mb250PjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5hbiBpbWFnZSB0byBiZSB1c2VkIGluIGEgZmVhdHVyZSBkZXNjcmlwdGlvbiBwYWdlIGluIAotICAgICAgY2FzZXMgd2hlcmUgb25lIHdhcyBub3Qgc3VwcGxpZWQgYnkgZmVhdHVyZSBwcm92aWRlciAoc2hvdWxkIGJlIEpQRUcpPElNRyAKLSAgICAgIGhlaWdodD00OCBhbHQ9IiIgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9mb3Jtcy9kZWZfcHJvdmlkZXIuZ2lmIiB3aWR0aD0xMDkgCi0gICAgICBib3JkZXI9MD4gICAgICAgICAgCi0gICAgICAgICAgICAgICAgIDwvZm9udD48L1REPgotICAgIDxURD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+PElNRyBoZWlnaHQ9MTUwIGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9mb3Jtcy9kZWZfcHJvdmlkZXIuZ2lmIiB3aWR0aD0xOTAgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+IDwvVEQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8VEQ+MzwvVEQ+Ci0gICAgPFREPiZuYnNwO0Zvcm0gQmFubmVyPC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmZvcm1fYmFubmVyJm5ic3A7PC9mb250PjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5hIGJhbm5lciBpbWFnZSB1c2VkIGluIGFsbCBmb3JtIHBhZ2VzIGJlaGluZCB0aGUgaGVhZGluZwotICAgICAgKHNob3duIGhlcmUgaW4gMToxMCB6b29tIG91dCk8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MyBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2Zvcm1zL2Zvcm1fYmFubmVyLmdpZiIgd2lkdGg9NjAgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPiZuYnNwOwotICAgICAgPFA+PC9QPjwvVEQ+Ci0gICAgPFREPiA8L1REPgotICA8L3RyPgotICA8dHIgYmdDb2xvcj0jZGZkZmI+Ci0gICAgPFREPjQ8L1REPgotICAgIDxURD4mbmJzcDtGb3JtIEJhbm5lciBVbmRlcmxpbmU8L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+Zm9ybV91bmRlcmxpbmUmbmJzcDs8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmEgc2Vjb25kIHBvcnRpb24gb2YgdGhlIGJhbm5lciB1c2VkIHVuZGVyIHRoZSBoZWFkaW5nCi0gICAgICB0ZXh0IChzaG93biBoZXJlIGluIDE6MTAgem9vbSBvdXQpPC9mb250PjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTEgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9mb3Jtcy9mb3JtX3VuZGVybGluZS5naWYiIHdpZHRoPTYwIGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4mbmJzcDsKLSAgICAgIDxQPjwvUD48L1REPgotICAgIDxURD4gPC9URD4KLSAgPC90cj4KLSAgCi0gIAotICAKLSAgCi0gIDxUUiBiZ0NvbG9yPSNjY2NjY2M+Ci0gICAgPFREIGNvbFNwYW49Nz48Qj48Rk9OVCBzaXplPSsyPldpemFyZCBHcmFwaGljPC9GT05UPjwvQj48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgPFREPjE8L1REPgotICAgIDxURD5OZXcgQm9va21hcmsgd2l6YXJkPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDtuZXdfYm9va21hcmtfd2l6PC9GT05UPjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5jcmVhdGVzIGEgbmV3IHVwZGF0ZSBzaXRlIGJvb2ttYXJrPC9mb250PjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvd2l6YmFuL25ld19ib29rbWFya193aXouZ2lmIiAKLSAgICAgIHdpZHRoPTc1IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD01OCBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvd2l6YmFuL25ld19ib29rbWFya193aXouZ2lmIiB3aWR0aD03NSBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD4gPC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZGZkZmI+Ci0gICAgPFREPjI8L1REPgotICAgIDxURD5OZXcgRm9sZGVyIHdpemFyZDwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7bmV3X2ZvbGRlcl93aXo8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmNyZWF0ZXMgYSBuZXcgYm9va21hcmsgZm9sZGVyPC9mb250PjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvd2l6YmFuL25ld19mb2xkZXJfd2l6LmdpZiIgCi0gICAgICB3aWR0aD03NSBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+PElNRyBoZWlnaHQ9NTggYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL3dpemJhbi9uZXdfZm9sZGVyX3dpei5naWYiIHdpZHRoPTc1IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPiA8L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgPFREPjM8L1REPgotICAgIDxURD5OZXcgU2VhcmNoIHdpemFyZDwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7bmV3X3NlYXJjaF93aXo8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT5jcmVhdGVzIGEgbmV3IHNlYXJjaCBvYmplY3Q8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9NTggYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC93aXpiYW4vbmV3X3NlYXJjaF93aXouZ2lmIiAKLSAgICAgIHdpZHRoPTc1IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD01OCBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvd2l6YmFuL25ld19zZWFyY2hfd2l6LmdpZiIgd2lkdGg9NzUgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+IDwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD40PC9URD4KLSAgICA8VEQ+SW5zdGFsbCBGZWF0dXJlIHdpemFyZDwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7aW5zdGFsbF93aXo8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmluc3RhbGxzIGEgbmV3IGZlYXR1cmUgaW50byB0aGUgcGxhdGZvcm08L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9NTggYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC93aXpiYW4vaW5zdGFsbF93aXouZ2lmIiAKLSAgICAgIHdpZHRoPTc1IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD01OCBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvd2l6YmFuL2luc3RhbGxfd2l6LmdpZiIgd2lkdGg9NzUgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+IDwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQgPjU8L1REPgotICAgIDxURD5VcGRhdGUgRmVhdHVyZSB3aXphcmQ8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO3VwZGF0ZV93aXo8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmluc3RhbGxzIGEgbmV3ZXIgdmVyc2lvbiBvZiBhbiBhbHJlYWR5IGluc3RhbGxlZCBmZWF0dXJlPC9mb250PjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvd2l6YmFuL3VwZGF0ZV93aXouZ2lmIiAKLSAgICAgIHdpZHRoPTc1IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD01OCBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvd2l6YmFuL3VwZGF0ZV93aXouZ2lmIiB3aWR0aD03NSBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD4gPC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZGZkZmI+Ci0gICAgPFREID42PC9URD4KLSAgICA8VEQ+Q29uZmlndXJlIEZlYXR1cmUgd2l6YXJkPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDtjb25maWdfd2l6PC9GT05UPjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5jb25maWd1cmVzIG9yIHVuY29uZmlndXJlcyBhbiBpbnN0YWxsZWQgZmVhdHVyZTwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD01OCBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL3dpemJhbi9jb25maWdfd2l6LmdpZiIgCi0gICAgICB3aWR0aD03NSBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+PElNRyBoZWlnaHQ9NTggYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL3dpemJhbi9jb25maWdfd2l6LmdpZiIgd2lkdGg9NzUgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+IDwvVEQ+PC9UUj4KLSAgPFRSPgotICAgIDxURD43PC9URD4KLSAgICA8VEQ+VW5pbnN0YWxsIEZlYXR1cmUgd2l6YXJkPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDt1bmluc3RhbGxfd2l6PC9GT05UPjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5wZXJtYW5lbnRseSByZW1vdmVzIGEgZmVhdHVyZSBmcm9tIHRoZSBwbGF0Zm9ybTwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD01OCBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL3dpemJhbi91bmluc3RhbGxfd2l6LmdpZiIgCi0gICAgICB3aWR0aD03NSBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+PElNRyBoZWlnaHQ9NTggYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL3dpemJhbi91bmluc3RhbGxfd2l6LmdpZiIgd2lkdGg9NzUgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+IDwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD44PC9URD4KLSAgICA8VEQ+RGVmYXVsdCBJbnN0YWxsIFdpemFyZCBiYW5uZXI8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO2RlZl93aXpiYW48L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmEgZGVmYXVsdCBpbWFnZSBzaG93biBpbiBpbnN0YWxsIHdpemFyZCBwYWdlcyB3aGVuIAotICAgICAgb25lIGlzIG5vdCBzdXBwbGllZCBieSBmZWF0dXJlIHByb3ZpZGVyczxJTUcgaGVpZ2h0PTI1OCBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL3dpemJhbi9kZWZfd2l6YmFuLmpwZyIgd2lkdGg9MTE4IAotYm9yZGVyPTA+ICAgICAgICAgCi0gICAgICAgICAgIDwvZm9udD48L1REPgotICAgIDxURD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+PElNRyBoZWlnaHQ9MjU4IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC93aXpiYW4vZGVmX3dpemJhbi5qcGciIHdpZHRoPTExOCBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD4gPC9URD48L1RSPjwvVEFCTEU+Ci08UD48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvYWJvdXQuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9idWlsZC5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjdjMzczLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgaWNvbnMvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwNCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwNCi0gICAgICAgICAgICAgICBNRVRBLUlORi8NCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sDQotc291cmNlLi4gPSBzcmMvDQotI2phcnMuZXh0cmEuY2xhc3NwYXRoID0gLi4vb3JnLmVjbGlwc2UudG9tY2F0L3NlcnZsZXQuamFyDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kbGNsMTYvY29sbGFwc2VhbGwuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kbGNsMTYvY29sbGFwc2VhbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGMwZGU1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZGxjbDE2L2NvbGxhcHNlYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZGxjbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2RsY2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmVlYjZkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZGxjbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2RsY2wxNi9zaG93X3VuY29uZi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2RsY2wxNi9zaG93X3VuY29uZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4Y2Y5NmIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kbGNsMTYvc2hvd191bmNvbmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kdG9vbDE2L2NvbmZpZ193aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kdG9vbDE2L2NvbmZpZ193aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZThhY2VjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZHRvb2wxNi9jb25maWdfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZHRvb2wxNi9pbnN0YWxsX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2R0b29sMTYvaW5zdGFsbF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODlmZjI5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZHRvb2wxNi9pbnN0YWxsX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2R0b29sMTYvdW5pbnN0YWxsX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2R0b29sMTYvdW5pbnN0YWxsX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NWZjZDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kdG9vbDE2L3VuaW5zdGFsbF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kdG9vbDE2L3VwZGF0ZV93aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kdG9vbDE2L3VwZGF0ZV93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTlkNDQ5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZHRvb2wxNi91cGRhdGVfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZWxjbDE2L2NvbGxhcHNlYWxsLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZWxjbDE2L2NvbGxhcHNlYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkODBhOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2VsY2wxNi9jb2xsYXBzZWFsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2VsY2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9lbGNsMTYvaGllcmFyY2hpY2FsTGF5b3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NDg2MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2VsY2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9lbGNsMTYvc2hvd191bmNvbmYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9lbGNsMTYvc2hvd191bmNvbmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTViNzA1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZWxjbDE2L3Nob3dfdW5jb25mLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZXRvb2wxNi9jb25maWdfd2l6LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZXRvb2wxNi9jb25maWdfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVhYzcyMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2V0b29sMTYvY29uZmlnX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2V0b29sMTYvaW5zdGFsbF93aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldG9vbDE2L2luc3RhbGxfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0YzYzZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2V0b29sMTYvaW5zdGFsbF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldG9vbDE2L3VuaW5zdGFsbF93aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldG9vbDE2L3VuaW5zdGFsbF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzMzMTI4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZXRvb2wxNi91bmluc3RhbGxfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZXRvb2wxNi91cGRhdGVfd2l6LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZXRvb2wxNi91cGRhdGVfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4NGViZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2V0b29sMTYvdXBkYXRlX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2V2aWV3MTYvY29uZmlncy5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2V2aWV3MTYvY29uZmlncy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ODRmYmEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldmlldzE2L2NvbmZpZ3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldmlldzE2L3ByZXZpZXcuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldmlldzE2L3ByZXZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmJmOWNmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZXZpZXcxNi9wcmV2aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZm9ybXMvZGVmX3Byb3ZpZGVyLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZm9ybXMvZGVmX3Byb3ZpZGVyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJiMDNmZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Zvcm1zL2RlZl9wcm92aWRlci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Zvcm1zL2Zvcm1fYmFubmVyLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZm9ybXMvZm9ybV9iYW5uZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWJjMGIyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZm9ybXMvZm9ybV9iYW5uZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mb3Jtcy9mb3JtX2Jhbm5lci5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Zvcm1zL2Zvcm1fYmFubmVyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUzZTJkMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Zvcm1zL2Zvcm1fYmFubmVyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZm9ybXMvZm9ybV91bmRlcmxpbmUuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mb3Jtcy9mb3JtX3VuZGVybGluZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZjNkMGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mb3Jtcy9mb3JtX3VuZGVybGluZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Zvcm1zL3RvcGljLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZm9ybXMvdG9waWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWRkNGVjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZm9ybXMvdG9waWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9hcHBfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvYXBwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1M2NhZDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9hcHBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvYmZvbGRlcl9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9iZm9sZGVyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMjczZTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9iZm9sZGVyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2NhdGVnb3J5X29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2NhdGVnb3J5X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ODdkMDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9jYXRlZ29yeV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9jb25maWdfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvY29uZmlnX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ODRmYmEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9jb25maWdfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvZWZpeDJfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvZWZpeDJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEzODk1Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2VmaXgyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2VmaXhfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvZWZpeF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2ZjNDk5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvZWZpeF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9lcnJvcl9zdF9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9lcnJvcl9zdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmM2MDY4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvZXJyb3Jfc3Rfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvZXNpdGVfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvZXNpdGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVmZDA3Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2VzaXRlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2ZlYXR1cmVfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvZmVhdHVyZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzA2NjgwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvZmVhdHVyZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9oaXN0b3J5X29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2hpc3Rvcnlfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg5ZDQzYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2hpc3Rvcnlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvbHNpdGVfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvbHNpdGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY1MGJkYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2xzaXRlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L25vdGluc3RhbGxlZF9mZWF0dXJlX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L25vdGluc3RhbGxlZF9mZWF0dXJlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxOTJiODQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9ub3RpbnN0YWxsZWRfZmVhdHVyZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9va19zdF9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9va19zdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2FjYjk2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvb2tfc3Rfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvcHNpdGVfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvcHNpdGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg4OTdmMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L3BzaXRlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L3NpdGVfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvc2l0ZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODU2OGY0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvc2l0ZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi91bmNvbmZfZmVhdHVyZV9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi91bmNvbmZfZmVhdHVyZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Njg4MWZkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvdW5jb25mX2ZlYXR1cmVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvdXBkYXRlc19vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi91cGRhdGVzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZjRmN2MuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi91cGRhdGVzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L3VzZWFyY2hfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvdXNlYXJjaF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDgwNTk5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvdXNlYXJjaF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi93ZWJfYmttcmtfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvd2ViX2JrbXJrX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYmM1MjguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi93ZWJfYmttcmtfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvYWRkX3N0YXQuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9hZGRfc3RhdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjNhMmIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9hZGRfc3RhdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L2N1cnJlbnRfY28uZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9jdXJyZW50X2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMwNzdmOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L2N1cnJlbnRfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9kZWxfc3RhdC5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L2RlbF9zdGF0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwMjA3Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L2RlbF9zdGF0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvZXJyb3JfY28uZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9lcnJvcl9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOWRjY2MuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9lcnJvcl9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L2luc3RhbGxhYmxlX2NvLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvaW5zdGFsbGFibGVfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTk5OWI2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvaW5zdGFsbGFibGVfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9saW5rZWRfY28uZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9saW5rZWRfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjQwZTFiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvbGlua2VkX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvbW9kX2NvLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvbW9kX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIxYjhkNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L21vZF9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L3VuY29uZmlndXJlZF9jby5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L3VuY29uZmlndXJlZF9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNTg5Y2UuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi91bmNvbmZpZ3VyZWRfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi91cGRhdGVkX2NvLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvdXBkYXRlZF9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNjg2YWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi91cGRhdGVkX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvd2FybmluZ19jby5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L3dhcm5pbmdfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTJkYWM0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvd2FybmluZ19jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi9jb25maWdfd2l6LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvd2l6YmFuL2NvbmZpZ193aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTE5ZmJmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvd2l6YmFuL2NvbmZpZ193aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy93aXpiYW4vZGVmX3dpemJhbi5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi9kZWZfd2l6YmFuLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3ZWJhNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi9kZWZfd2l6YmFuLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvd2l6YmFuL2luc3RhbGxfd2l6LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvd2l6YmFuL2luc3RhbGxfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VlZTdjMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi9pbnN0YWxsX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi91bmluc3RhbGxfd2l6LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvd2l6YmFuL3VuaW5zdGFsbF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjIzMzc4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvd2l6YmFuL3VuaW5zdGFsbF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy93aXpiYW4vdXBkYXRlX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi91cGRhdGVfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IzNjQ4Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi91cGRhdGVfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9Db25maWd1cmF0aW9uTWFuYWdlcldpbmRvdy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL0NvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MjM1M2IuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL0NvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5VcGRhdGVKb2I7Ci0KLS8qKgotICogQ29uZmlndXJhdGlvbiBNYW5hZ2VyIHdpbmRvdy4KLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93IGV4dGVuZHMgQXBwbGljYXRpb25XaW5kb3cgewotCXByaXZhdGUgQ29uZmlndXJhdGlvblZpZXcgdmlldzsKLQotCXByaXZhdGUgR2xvYmFsQWN0aW9uIHByb3BlcnRpZXNBY3Rpb247Ci0KLQlwcml2YXRlIElBY3Rpb24gcHJvcGVydGllc0FjdGlvbkhhbmRsZXI7Ci0KLQlwcml2YXRlIElKb2JDaGFuZ2VMaXN0ZW5lciBqb2JMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIEhhc2h0YWJsZSBqb2JOYW1lczsKLQotCWNsYXNzIEdsb2JhbEFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQkJcHJpdmF0ZSBJQWN0aW9uIGhhbmRsZXI7Ci0KLQkJcHVibGljIEdsb2JhbEFjdGlvbigpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEFjdGlvbkhhbmRsZXIoSUFjdGlvbiBhY3Rpb24pIHsKLQkJCWlmIChoYW5kbGVyICE9IG51bGwpIHsKLQkJCQloYW5kbGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQkJaGFuZGxlciA9IG51bGw7Ci0JCQl9Ci0JCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCQl0aGlzLmhhbmRsZXIgPSBhY3Rpb247Ci0JCQkJYWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQl9Ci0JCQlpZiAoaGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJc2V0RW5hYmxlZChoYW5kbGVyLmlzRW5hYmxlZCgpKTsKLQkJCQlzZXRDaGVja2VkKGhhbmRsZXIuaXNDaGVja2VkKCkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKEFjdGlvbi5FTkFCTEVEKSkgewotCQkJCUJvb2xlYW4gYm9vbCA9IChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCXNldEVuYWJsZWQoYm9vbC5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9IGVsc2UgaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKEFjdGlvbi5DSEVDS0VEKSkgewotCQkJCUJvb2xlYW4gYm9vbCA9IChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCXNldENoZWNrZWQoYm9vbC5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAoaGFuZGxlciAhPSBudWxsKQotCQkJCWhhbmRsZXIucnVuKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbk1hbmFnZXJXaW5kb3coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JCS8vIFNldHVwIHdpbmRvdy4KLQkJYWRkTWVudUJhcigpOwotCQlhZGRBY3Rpb25zKCk7Ci0JCWFkZFRvb2xCYXIoU1dULkZMQVQpOwotCQlhZGRTdGF0dXNMaW5lKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUHJvZ3Jlc3NDYW5jZWxlZCgpIHsKLQkJcmV0dXJuIGdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRBY3Rpb25zKCkgewotCQlJTWVudU1hbmFnZXIgbWVudUJhciA9IGdldE1lbnVCYXJNYW5hZ2VyKCk7Ci0JCUlNZW51TWFuYWdlciBmaWxlTWVudSA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93X2ZpbGVNZW51KTsKLQkJbWVudUJhci5hZGQoZmlsZU1lbnUpOwotCi0JCXByb3BlcnRpZXNBY3Rpb24gPSBuZXcgR2xvYmFsQWN0aW9uKCk7Ci0JCXByb3BlcnRpZXNBY3Rpb24KLQkJCQkuc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93X3Byb3BlcnRpZXMpOwotCQlwcm9wZXJ0aWVzQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWZpbGVNZW51LmFkZChwcm9wZXJ0aWVzQWN0aW9uKTsKLQkJZmlsZU1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0KLQkJQWN0aW9uIGNsb3NlQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQljbG9zZSgpOwotCQkJfQotCQl9OwotCQljbG9zZUFjdGlvbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvbk1hbmFnZXJXaW5kb3dfY2xvc2UpOwotCQlmaWxlTWVudS5hZGQoY2xvc2VBY3Rpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBob29rR2xvYmFsQWN0aW9ucygpIHsKLQkJaWYgKHByb3BlcnRpZXNBY3Rpb25IYW5kbGVyICE9IG51bGwpCi0JCQlwcm9wZXJ0aWVzQWN0aW9uLnNldEFjdGlvbkhhbmRsZXIocHJvcGVydGllc0FjdGlvbkhhbmRsZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdmlldyA9IG5ldyBDb25maWd1cmF0aW9uVmlldyh0aGlzKTsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJYWRkU2VwYXJhdG9yKGNvbnRhaW5lcik7Ci0JCUdyaWREYXRhIGdkOwotCi0JCXZpZXcuY3JlYXRlUGFydENvbnRyb2woY29udGFpbmVyKTsKLQkJQ29udHJvbCB2aWV3Q29udHJvbCA9IHZpZXcuZ2V0Q29udHJvbCgpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQl2aWV3Q29udHJvbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlhZGRTZXBhcmF0b3IoY29udGFpbmVyKTsKLQotCQlob29rR2xvYmFsQWN0aW9ucygpOwotCi0JCXVwZGF0ZUFjdGlvbkJhcnMoKTsKLQotCQlVcGRhdGVMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJZ2V0U2hlbGwoKS5zZXRJbWFnZShwcm92aWRlci5nZXQoVXBkYXRlVUlJbWFnZXMuREVTQ19DT05GSUdTX1ZJRVcsIDApKTsKLQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZVN0YXR1c0xpbmUoU3RyaW5nIG1lc3NhZ2UsIEltYWdlIGltYWdlKSB7Ci0JCWdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuc2V0TWVzc2FnZShpbWFnZSwgbWVzc2FnZSk7Ci0JCWdldFN0YXR1c0xpbmVNYW5hZ2VyKCkudXBkYXRlKHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRyYWNrVXBkYXRlSm9iKEpvYiBqb2IsIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChqb2JMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlqb2JOYW1lcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJCWpvYkxpc3RlbmVyID0gbmV3IElKb2JDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBhYm91dFRvUnVuKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGF3YWtlKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCUpvYiBqb2IgPSBldmVudC5nZXRKb2IoKTsKLQkJCQkJaWYgKGpvYi5iZWxvbmdzVG8oVXBkYXRlSm9iLkZBTUlMWSkpIHsKLQkJCQkJCUpvYiBbXSByZW1haW5pbmcgPSBKb2IuZ2V0Sm9iTWFuYWdlcigpLmZpbmQoVXBkYXRlSm9iLkZBTUlMWSk7Ci0JCQkJCQl1cGRhdGVQcm9ncmVzcyhmYWxzZSwgcmVtYWluaW5nKTsKLQkJCQkJCWpvYk5hbWVzLnJlbW92ZShqb2IpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcnVubmluZyhJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJSm9iIGpvYiA9IGV2ZW50LmdldEpvYigpOwotCQkJCQlpZiAoam9iLmJlbG9uZ3NUbyhVcGRhdGVKb2IuRkFNSUxZKSkgewotCQkJCQkJSm9iIFtdIGV4aXN0aW5nID0gSm9iLmdldEpvYk1hbmFnZXIoKS5maW5kKFVwZGF0ZUpvYi5GQU1JTFkpOwotCQkJCQkJdXBkYXRlUHJvZ3Jlc3ModHJ1ZSwgZXhpc3RpbmcpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgc2NoZWR1bGVkKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHNsZWVwaW5nKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCX0KLQkJCX07Ci0JCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLmFkZEpvYkNoYW5nZUxpc3RlbmVyKGpvYkxpc3RlbmVyKTsKLQkJfQotCQlqb2JOYW1lcy5wdXQoam9iLCBuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlUHJvZ3Jlc3MoZmluYWwgYm9vbGVhbiBiZWdpbiwgZmluYWwgSm9iW10gam9icykgewotCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IGdldFN0YXR1c0xpbmVNYW5hZ2VyKCkKLQkJCQkJCS5nZXRQcm9ncmVzc01vbml0b3IoKTsKLQkJCQlpZiAoYmVnaW4pIHsKLQkJCQkJaWYgKGpvYnMubGVuZ3RoID09IDEpCi0JCQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl1cGRhdGVUYXNrTmFtZShtb25pdG9yLCBqb2JzKTsKLQkJCQkJZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS5zZXRDYW5jZWxFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChqb2JzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCQlnZXRTdGF0dXNMaW5lTWFuYWdlcigpLnNldENhbmNlbEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQkJdXBkYXRlVGFza05hbWUobW9uaXRvciwgam9icyk7Ci0JCQkJfQotCQkJCWdldFN0YXR1c0xpbmVNYW5hZ2VyKCkudXBkYXRlKHRydWUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlVGFza05hbWUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBKb2IgW10gam9icykgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpPTA7IGk8am9icy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWpvYk5hbWVzLmdldChqb2JzW2ldKTsKLQkJCWlmIChuYW1lIT1udWxsKSB7Ci0JCQkJaWYgKGJ1Zi5sZW5ndGgoKT4wKQotCQkJCQlidWYuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmLmFwcGVuZChuYW1lKTsKLQkJCX0KLQkJfQotCQltb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoCi0JCQkJVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uTWFuYWdlcldpbmRvd19zZWFyY2hUYXNrTmFtZSwKLQkJCQlidWYudG9TdHJpbmcoKSkpOyAKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkU2VwYXJhdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZERhdGEgZ2Q7Ci0JCUxhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmhlaWdodEhpbnQgPSAxOwotCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShnZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUFjdGlvbkJhcnMoKSB7Ci0JCWdldE1lbnVCYXJNYW5hZ2VyKCkudXBkYXRlQWxsKGZhbHNlKTsKLQkJZ2V0VG9vbEJhck1hbmFnZXIoKS51cGRhdGUoZmFsc2UpOwotCQlnZXRTdGF0dXNMaW5lTWFuYWdlcigpLnVwZGF0ZShmYWxzZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJaWYgKGpvYkxpc3RlbmVyICE9IG51bGwpCi0JCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLnJlbW92ZUpvYkNoYW5nZUxpc3RlbmVyKGpvYkxpc3RlbmVyKTsKLQkJaWYgKHZpZXcgIT0gbnVsbCkKLQkJCXZpZXcuZGlzcG9zZSgpOwotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY3JlYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGUoKSB7Ci0JCXN1cGVyLmNyZWF0ZSgpOwotCQkvLyBzZXQgdGhlIHRpdGxlCi0JCWdldFNoZWxsKCkuc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25NYW5hZ2VyQWN0aW9uX3RpdGxlKTsKLQkJZ2V0U2hlbGwoKS5zZXRTaXplKDgwMCwgNjAwKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjb3BlbigpCi0JICovCi0JcHVibGljIGludCBvcGVuKCkgewotCQkvLyB1cGRhdGUgYWN0aW9uIGJhcnMKLQkJdXBkYXRlQWN0aW9uQmFycygpOwotCQlyZXR1cm4gc3VwZXIub3BlbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXNBY3Rpb25IYW5kbGVyKElBY3Rpb24gaGFuZGxlcikgewotCQlwcm9wZXJ0aWVzQWN0aW9uSGFuZGxlciA9IGhhbmRsZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1Jlc3RhcnREaWFsb2cuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9SZXN0YXJ0RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ODA5MWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1Jlc3RhcnREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi0vKioKLSAqIEEgZGlhbG9nIHdoaWNoIHByb21wdHMgdGhlIHVzZXIgdG8gcmVzdGFydCBhZnRlciBhbiB1cGRhdGUgb3BlcmF0aW9uCi0gKiBhbmQgcHJvdmlkZXMgWWVzLCBObywgQ29udGludWUgYnV0dG9ucy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXN0YXJ0RGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRJTlVFID0gMjsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSB5ZXNObyA9IG5ldyBTdHJpbmdbXSB7SURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUx9OwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIHllc05vQXBwbHkgPSBuZXcgU3RyaW5nW10ge0lEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMLCBVcGRhdGVVSU1lc3NhZ2VzLkFwcGx5Q2hhbmdlc307IAotCQotCXByaXZhdGUgaW50IGJ1dHRvbklkID0gMDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGRpYWxvZwotCSAqIEBzZWUgTWVzc2FnZURpYWxvZyNNZXNzYWdlRGlhbG9nKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsLCBqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2UsIGphdmEubGFuZy5TdHJpbmcsIGludCwgamF2YS5sYW5nLlN0cmluZ1tdLCBpbnQpCi0JICovCi0JcHVibGljIFJlc3RhcnREaWFsb2coU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLCBib29sZWFuIHJlc3RhcnROZWVkZWQpIHsKLQkJc3VwZXIocGFyZW50LAotCQkJCXRpdGxlLAotCQkJCW51bGwsCS8vIGFjY2VwdCB0aGUgZGVmYXVsdCB3aW5kb3cgaWNvbgotCQkJCW1lc3NhZ2UsCi0JCQkJUVVFU1RJT04sCi0JCQkJcmVzdGFydE5lZWRlZCA/IHllc05vIDogeWVzTm9BcHBseSwgCi0JCQkJMCk7CQkvLyB5ZXMgaXMgdGhlIGRlZmF1bHQKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gb3BlbiB0aGUgWWVzL05vL0NvbnRpbnVlIHF1ZXN0aW9uIGRpYWxvZy4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHBhcmFtIHJlc3RhcnRJc1JlYWxseU5lZWRlZCB3aGVuIGZhbHNlLCB0aGUgY2hhbmdlcyBhcmUgYXBwbGllZCB0byB0aGUgY3VycmVudCBjb25maWcKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1c2VyIHByZXNzZXMgIFlFUwotCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlblF1ZXN0aW9uKFNoZWxsIHBhcmVudCwgYm9vbGVhbiByZXN0YXJ0SXNSZWFsbHlOZWVkZWQpIHsKLQkJU3RyaW5nIHRpdGxlID0gVXBkYXRlVUlNZXNzYWdlcy5SZXN0YXJ0VGl0bGU7IAotCQlJUHJvZHVjdCBwcm9kdWN0ID0gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpOwotCQlTdHJpbmcgcHJvZHVjdE5hbWUgPSBwcm9kdWN0ICE9IG51bGwgJiYgcHJvZHVjdC5nZXROYW1lKCkgIT0gbnVsbCA/IHByb2R1Y3QuZ2V0TmFtZSgpIDogVXBkYXRlVUlNZXNzYWdlcy5BcHBsaWNhdGlvbkluUmVzdGFydERpYWxvZzsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChyZXN0YXJ0SXNSZWFsbHlOZWVkZWQgPyBVcGRhdGVVSU1lc3NhZ2VzLlJlc3RhcnRNZXNzYWdlOiBVcGRhdGVVSU1lc3NhZ2VzLk9wdGlvbmFsUmVzdGFydE1lc3NhZ2UsIHByb2R1Y3ROYW1lKTsKLQkJUmVzdGFydERpYWxvZyBkaWFsb2cgPSBuZXcgUmVzdGFydERpYWxvZyhwYXJlbnQsIHRpdGxlLAltZXNzYWdlLCByZXN0YXJ0SXNSZWFsbHlOZWVkZWQpOwotCQlpbnQgYnV0dG9uPSBkaWFsb2cub3BlbigpOwotCQlpZiAoYnV0dG9uID09IDIpCi0JCQlPcGVyYXRpb25zTWFuYWdlci5hcHBseUNoYW5nZXNOb3coKTsKLQkJcmV0dXJuIGJ1dHRvbiA9PSAwOyAvLyBZZXMKLQl9Ci0JCi0JLyoqCi0JICogV2hlbiBhIGJ1dHRvbiBpcyBwcmVzc2VkLCBzdG9yZSB0aGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2J1dHRvblByZXNzZWQoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGlkKSB7Ci0JCWlmIChpZCA9PSAyKSB7IAotCQkJYnV0dG9uSWQ9IENPTlRJTlVFOwotCQl9IAotCQkKLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChpZCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVzZXIncyBzZWxlY3Rpb24sCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHVzZXIgaGFzbid0IGNob3NlbiB5ZXQuCi0JICogCi0JICogQHJldHVybiB0aGUgdXNlcidzIHNlbGVjdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gYnV0dG9uSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VSTENvZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVVJMQ29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRiODRlMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVVJMQ29kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBVUkxDb2RlciB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHMpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHVybEVuY29kZShzLmdldEJ5dGVzKCJVVEY4IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyBzKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKHVybERlY29kZShzKSwgIlVURjgiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB1cmxFbmNvZGUoYnl0ZVtdIGRhdGEpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoZGF0YS5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKLQkJCWJ1Zi5hcHBlbmQoJyUnKTsKLQkJCWJ1Zi5hcHBlbmQoQ2hhcmFjdGVyLmZvckRpZ2l0KChkYXRhW2ldICYgMjQwKSA+Pj4gNCwgMTYpKTsKLQkJCWJ1Zi5hcHBlbmQoQ2hhcmFjdGVyLmZvckRpZ2l0KGRhdGFbaV0gJiAxNSwgMTYpKTsKLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHVybERlY29kZShTdHJpbmcgZW5jb2RlZFVSTCkgewotCQlpbnQgbGVuID0gZW5jb2RlZFVSTC5sZW5ndGgoKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbShsZW4pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjspIHsKLQkJCXN3aXRjaCAoZW5jb2RlZFVSTC5jaGFyQXQoaSkpIHsKLQkJCWNhc2UgJyUnOgotCQkJCWlmIChsZW4gPj0gaSArIDMpIHsKLQkJCQkJb3Mud3JpdGUoSW50ZWdlci5wYXJzZUludChlbmNvZGVkVVJMLnN1YnN0cmluZyhpICsgMSwgaSArIDMpLCAxNikpOwotCQkJCX0KLQkJCQlpICs9IDM7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICcrJzogLy8gZXhjZXB0aW9uIGZyb20gc3RhbmRhcmQKLQkJCQlvcy53cml0ZSgnICcpOwotCQkJCWkrKzsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJb3Mud3JpdGUoZW5jb2RlZFVSTC5jaGFyQXQoaSsrKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gb3MudG9CeXRlQXJyYXkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlTGFiZWxQcm92aWRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VwZGF0ZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAxOTU5Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHMuKjsKLQotLyoqCi0gKiAKLSAqLwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlTGFiZWxQcm92aWRlciBleHRlbmRzIFNoYXJlZExhYmVsUHJvdmlkZXIgewotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBVcGRhdGVMYWJlbFByb3ZpZGVyLgotCSAqLwotCXB1YmxpYyBVcGRhdGVMYWJlbFByb3ZpZGVyKCkgewotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmopOwotCX0KLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqKTsKLQl9Ci0JCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRMb2NhbFNpdGVEZXNjcmlwdG9yKElDb25maWd1cmVkU2l0ZSBjc2l0ZSkgewotCQlpZiAoY3NpdGUuaXNQcm9kdWN0U2l0ZSgpKQotCQkJcmV0dXJuIFVwZGF0ZVVJSW1hZ2VzLkRFU0NfUFNJVEVfT0JKOwotCQlpZiAoY3NpdGUuaXNFeHRlbnNpb25TaXRlKCkpCi0JCQlyZXR1cm4gVXBkYXRlVUlJbWFnZXMuREVTQ19FU0lURV9PQko7Ci0JCXJldHVybiBVcGRhdGVVSUltYWdlcy5ERVNDX0xTSVRFX09CSjsKLQl9Ci0JCi0JcHVibGljIEltYWdlIGdldExvY2FsU2l0ZUltYWdlKElDb25maWd1cmVkU2l0ZSBjc2l0ZSkgewotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IGdldExvY2FsU2l0ZURlc2NyaXB0b3IoY3NpdGUpOwotCQlyZXR1cm4gZ2V0KGRlc2MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VcGRhdGVVSS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VwZGF0ZVVJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MWMzOGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VwZGF0ZVVJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5icm93c2VyLklXZWJCcm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLlVwZGF0ZU1vZGVsOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVVSSBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS51cGRhdGUudWkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0FQUF9JRCA9ICJvcmcuZWNsaXBzZS51cGRhdGUiOyAvLyROT04tTkxTLTEkCi0JLy8gcHJlZmVyZW5jZSBrZXkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0RJU0NPVkVSWV9TSVRFU19FTkFCTEVEID0gImRpc2NvdmVyeVNpdGVzRW5hYmxlZCI7IC8vJE5PTi1OTFMtMSQKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgVXBkYXRlVUkgcGx1Z2luOwotCXByaXZhdGUgVXBkYXRlTW9kZWwgbW9kZWw7Ci0JcHJpdmF0ZSBTdHJpbmcgYXBwU2VydmVySG9zdDsKLQlwcml2YXRlIGludCBhcHBTZXJ2ZXJQb3J0OwotCXByaXZhdGUgVXBkYXRlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBVcGRhdGVVSSgpIHsKLQotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVwZGF0ZVVJIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTaGVsbCBnZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJcmV0dXJuIHdpbmRvdyAhPSBudWxsID8gd2luZG93LmdldFNoZWxsKCkgOiBnZXRTdGFuZGFyZERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFdpbmRvdyBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JfQotCi0JcHVibGljIFVwZGF0ZUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpIHsKLQkJaWYgKGxhYmVsUHJvdmlkZXIgPT0gbnVsbCkKLQkJCWxhYmVsUHJvdmlkZXIgPSBuZXcgVXBkYXRlTGFiZWxQcm92aWRlcigpOwotCQlyZXR1cm4gbGFiZWxQcm92aWRlcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQltb2RlbCA9IG5ldyBVcGRhdGVNb2RlbCgpOwotCQlpbnQgaGlzdG9yeVByZWYgPQotCQkJZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoVXBkYXRlQ29yZS5QX0hJU1RPUllfU0laRSk7Ci0JCWlmIChoaXN0b3J5UHJlZiA+IDApIHsKLQkJCVVwZGF0ZUNvcmUuREVGQVVMVF9ISVNUT1JZID0gaGlzdG9yeVByZWY7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBcHBTZXJ2ZXJIb3N0KCkgewotCQlyZXR1cm4gYXBwU2VydmVySG9zdDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEFwcFNlcnZlclBvcnQoKSB7Ci0JCXJldHVybiBhcHBTZXJ2ZXJQb3J0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChtb2RlbCAhPSBudWxsKQotCQkJbW9kZWwuc2h1dGRvd24oKTsKLQotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0KLQl9Ci0KLQlwdWJsaWMgVXBkYXRlTW9kZWwgZ2V0VXBkYXRlTW9kZWwoKSB7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBlKSB7Ci0JCWxvZ0V4Y2VwdGlvbihlLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBlLCBib29sZWFuIHNob3dFcnJvckRpYWxvZykgewotCQlpZiAoZSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLQkJCWUgPSAoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIGUpLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlpZiAoZSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCXN0YXR1cyA9ICgoQ29yZUV4Y2VwdGlvbikgZSkuZ2V0U3RhdHVzKCk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkKLQkJCQltZXNzYWdlID0gZS50b1N0cmluZygpOwotCQkJc3RhdHVzID0KLQkJCQluZXcgU3RhdHVzKAotCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQlnZXRQbHVnaW5JZCgpLAotCQkJCQlJU3RhdHVzLk9LLAotCQkJCQltZXNzYWdlLAotCQkJCQllKTsKLQkJfQotCQlsb2coc3RhdHVzLCBzaG93RXJyb3JEaWFsb2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMsIGJvb2xlYW4gc2hvd0Vycm9yRGlhbG9nKSB7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLnVwZGF0ZS51aSIpOyAvLyROT04tTkxTLTEkCi0JCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXMpOwotCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCB8fCAhc2hvd0Vycm9yRGlhbG9nKQotCQkJcmV0dXJuOwotCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5JTkZPKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwgbnVsbCwgbnVsbCwgc3RhdHVzKTsKLQkJfSBlbHNlIHsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKGdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksIG51bGwsIHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBVUkwgZ2V0T3JpZ2luYXRpbmdVUkwoU3RyaW5nIGlkKSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gZ2V0T3JpZ2luYXRpbmdVUkxTZWN0aW9uKCk7Ci0JCVN0cmluZyB2YWx1ZSA9IHNlY3Rpb24uZ2V0KGlkKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIG5ldyBVUkwodmFsdWUpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0T3JpZ2luYXRpbmdVUkwoU3RyaW5nIGlkLCBVUkwgdXJsKSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gZ2V0T3JpZ2luYXRpbmdVUkxTZWN0aW9uKCk7Ci0JCXNlY3Rpb24ucHV0KGlkLCB1cmwudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSURpYWxvZ1NldHRpbmdzIGdldE9yaWdpbmF0aW5nVVJMU2VjdGlvbigpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gc2V0dGluZ3MuZ2V0U2VjdGlvbigib3JpZ2luYXRpbmdVUkxzIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNlY3Rpb24gPT0gbnVsbCkKLQkJCXNlY3Rpb24gPSBzZXR0aW5ncy5hZGROZXdTZWN0aW9uKCJvcmlnaW5hdGluZ1VSTHMiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0KLQkKLQkvKioKLQkgKiBQcm9tcHRzIHRoZSB1c2VyIHRvIHJlc3RhcnQsIGFuZCBwZXJmb3JtcyB0aGUgcmVzdGFydCBpZiB0aGUgdXNlciBnaXZlcyB0aGUgb2suCi0JICogCi0JICogQHBhcmFtIHJlc3RhcnRJc1JlYWxseU5lZWRlZCB0cnVlIHdoZW4gYSByZXN0YXJ0IGlzIG5lZWRlZCwgZmFsc2UgaWYgdGhlIHVzZXIgZmVlbHMgbHVja3kgKHRtKSBhbmQgd2FudHMgdGhlIGNoYW5nZXMKLQkgKiBhcHBsaWVkIHRvIHRoZSBjdXJyZW50IGNvbmZpZwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN5c3RlbSBpcyByZXN0YXJ0aW5nLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXF1ZXN0UmVzdGFydChib29sZWFuIHJlc3RhcnRJc1JlYWxseU5lZWRlZCkgewotCQlib29sZWFuIHJlc3RhcnQgPQotCQkJUmVzdGFydERpYWxvZy5vcGVuUXVlc3Rpb24oCi0JCQkJZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQlyZXN0YXJ0SXNSZWFsbHlOZWVkZWQpOwotCQlpZiAocmVzdGFydCkKLQkJCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLnJlc3RhcnQoKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzaG93VVJMKFN0cmluZyB1cmwpIHsKLQkJc2hvd1VSTCh1cmwsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2hvd1VSTChTdHJpbmcgdXJsLCBib29sZWFuIGVuY29kZUhvc3RBbmRQb3J0KSB7Ci0JCWlmIChlbmNvZGVIb3N0QW5kUG9ydCkKLQkJCXVybCA9IGVuY29kZUhvc3RBbmRQb3J0KHVybCk7Ci0KLQkJSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0IHN1cHBvcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEJyb3dzZXJTdXBwb3J0KCk7Ci0JCXRyeSB7Ci0JCQlJV2ViQnJvd3NlciBicm93c2VyID0gc3VwcG9ydC5nZXRFeHRlcm5hbEJyb3dzZXIoKTsKLQkJCWJyb3dzZXIub3BlblVSTChuZXcgVVJMKHVybCkpOwotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZW5jb2RlSG9zdEFuZFBvcnQoU3RyaW5nIHVybE5hbWUpIHsKLQkJU3RyaW5nIGNhbGxiYWNrVVJMID0gZ2V0Q2FsbGJhY2tVUkxBc1N0cmluZygpOwotCQlpZiAoY2FsbGJhY2tVUkwgPT0gbnVsbCkKLQkJCXJldHVybiB1cmxOYW1lOwotCQlTdHJpbmcgY2FsbGJhY2tQYXJhbWV0ZXIgPSAidXBkYXRlVVJMPSIgKyBjYWxsYmFja1VSTDsgLy8kTk9OLU5MUy0xJAotCQlpZiAodXJsTmFtZS5pbmRleE9mKCc/JykgIT0gLTEpCi0JCQlyZXR1cm4gdXJsTmFtZSArICImIiArIGNhbGxiYWNrUGFyYW1ldGVyOyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCXJldHVybiB1cmxOYW1lICsgIj8iICsgY2FsbGJhY2tQYXJhbWV0ZXI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENhbGxiYWNrVVJMQXNTdHJpbmcoKSB7Ci0JCVN0cmluZyBob3N0ID0gZ2V0RGVmYXVsdCgpLmdldEFwcFNlcnZlckhvc3QoKTsKLQkJaW50IHBvcnQgPSBnZXREZWZhdWx0KCkuZ2V0QXBwU2VydmVyUG9ydCgpOwotCQlpZiAoaG9zdCA9PSBudWxsIHx8IHBvcnQgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIHsKLQkJCVN0cmluZyB2YWx1ZSA9Ci0JCQkJImh0dHA6Ly8iIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBob3N0Ci0JCQkJCSsgIjoiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBwb3J0Ci0JCQkJCSsgIi8iIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBXRUJfQVBQX0lECi0JCQkJCSsgIi9pbnN0YWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJdHJ5IHsKLQkJCQl2YWx1ZSA9IFVSTENvZGVyLmVuY29kZSh2YWx1ZSk7Ci0JCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBkaXNwbGF5IHRvIGJlIHVzZWQuIFRoZSBtZXRob2QgZmlyc3QgY2hlY2tzLCBpZgotCSAqIHRoZSB0aHJlYWQgY2FsbGluZyB0aGlzIG1ldGhvZCBoYXMgYW4gYXNzb2NpYXRlZCBkaXNhcGx5LiBJZiBzbywgdGhpcwotCSAqIGRpc3BsYXkgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgbWV0aG9kIHJldHVybnMgdGhlIGRlZmF1bHQgZGlzcGxheS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpc3BsYXkgZ2V0U3RhbmRhcmREaXNwbGF5KCkgewotCQlEaXNwbGF5IGRpc3BsYXk7Ci0JCWRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkKLQkJCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJcmV0dXJuIGRpc3BsYXk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jaW5pdGlhbGl6ZURlZmF1bHRQbHVnaW5QcmVmZXJlbmNlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQbHVnaW5QcmVmZXJlbmNlcygpIHsKLQkJUHJlZmVyZW5jZXMgc3RvcmUgPSBnZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlzdG9yZS5zZXREZWZhdWx0KFBfRElTQ09WRVJZX1NJVEVTX0VOQUJMRUQsIHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VcGRhdGVVSUltYWdlcy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VwZGF0ZVVJSW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYzJhNGEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VwZGF0ZVVJSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci0KLS8qKgotICogQnVuZGxlIG9mIGFsbCBpbWFnZXMgdXNlZCBieSB0aGUgUERFIHBsdWdpbi4KLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZVVJSW1hZ2VzIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElDT05TX1BBVEggPSAiaWNvbnMvIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2V0IG9mIHByZWRlZmluZWQgSW1hZ2UgRGVzY3JpcHRvcnMuCi0JICovCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfT0JKPSBJQ09OU19QQVRIKyJvYmoxNi8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfVklFVyA9IElDT05TX1BBVEgrImV2aWV3MTYvIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX0xDTD0gSUNPTlNfUEFUSCsiZWxjbDE2LyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9MQ0xfRElTQUJMRUQ9IElDT05TX1BBVEgrImRsY2wxNi8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfT1ZSID0gSUNPTlNfUEFUSCArICJvdnIxNi8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfV0laQkFOID0gSUNPTlNfUEFUSCArICJ3aXpiYW4vIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfRk9STVMgPSBJQ09OU19QQVRIICsgImZvcm1zLyI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLyoqCi0JICogRnJlcXVlbnRseSB1c2VkIGltYWdlcwotCSAqLwotCi0JLyoqCi0JICogT0JKMTYKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0FQUF9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJhcHBfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19DQVRFR09SWV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJjYXRlZ29yeV9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NPTkZJR19PQkogPSBjcmVhdGUoUEFUSF9PQkosICJjb25maWdfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19GRUFUVVJFX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImZlYXR1cmVfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19FRklYX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImVmaXgyX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfSElTVE9SWV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJoaXN0b3J5X29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfTFNJVEVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAibHNpdGVfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19QU0lURV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJwc2l0ZV9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0VTSVRFX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImVzaXRlX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU0lURV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJzaXRlX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfVU5DT05GX0ZFQVRVUkVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAidW5jb25mX2ZlYXR1cmVfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19OT1RJTlNUX0ZFQVRVUkVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAibm90aW5zdGFsbGVkX2ZlYXR1cmVfb2JqLmdpZiIpOwkgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRVJSX1NUX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImVycm9yX3N0X29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfT0tfU1RfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAib2tfc3Rfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQkKLQkvKioKLQkgKiBPVlIxNgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfTElOS0VEX0NPICAgPSBjcmVhdGUoUEFUSF9PVlIsICJsaW5rZWRfY28uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1VQREFURURfQ08gICA9IGNyZWF0ZShQQVRIX09WUiwgInVwZGF0ZWRfY28uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NVUlJFTlRfQ08gPSBjcmVhdGUoUEFUSF9PVlIsICJjdXJyZW50X2NvLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19FUlJPUl9DTyA9IGNyZWF0ZShQQVRIX09WUiwgImVycm9yX2NvLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19XQVJOSU5HX0NPID0gY3JlYXRlKFBBVEhfT1ZSLCAid2FybmluZ19jby5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfTU9EX0NPID0gY3JlYXRlKFBBVEhfT1ZSLCAibW9kX2NvLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19BRERfQ08gPSBjcmVhdGUoUEFUSF9PVlIsICJhZGRfc3RhdC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfREVMX0NPID0gY3JlYXRlKFBBVEhfT1ZSLCAiZGVsX3N0YXQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1VOQ09ORl9DTyA9IGNyZWF0ZShQQVRIX09WUiwgInVuY29uZmlndXJlZF9jby5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVklFVzE2Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19DT05GSUdTX1ZJRVcgPSBjcmVhdGUoUEFUSF9WSUVXLCAiY29uZmlncy5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTENMCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19DT0xMQVBTRV9BTEwgPSBjcmVhdGUoUEFUSF9MQ0wsICJjb2xsYXBzZWFsbC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU0hPV19ISUVSQVJDSFkgPSBjcmVhdGUoUEFUSF9MQ0wsICJoaWVyYXJjaGljYWxMYXlvdXQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1NIT1dfSElFUkFSQ0hZX0QgPSBjcmVhdGUoUEFUSF9MQ0xfRElTQUJMRUQsICJoaWVyYXJjaGljYWxMYXlvdXQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFdJWgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfVVBEQVRFX1dJWiAgPSBjcmVhdGUoUEFUSF9XSVpCQU4sICJ1cGRhdGVfd2l6LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19DT05GSUdfV0laICA9IGNyZWF0ZShQQVRIX1dJWkJBTiwgImNvbmZpZ193aXouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0lOU1RBTExfQkFOTkVSICA9IGNyZWF0ZShQQVRIX1dJWkJBTiwgImRlZl93aXpiYW4uanBnIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1BST1ZJREVSID0gY3JlYXRlKFBBVEhfRk9STVMsICJkZWZfcHJvdmlkZXIuanBnIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBjcmVhdGUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG1ha2VJbWFnZVVSTChwcmVmaXgsIG5hbWUpKTsKLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIFVSTCBtYWtlSW1hZ2VVUkwoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIHBhdGggPSAiJG5sJC8iICsgcHJlZml4ICsgbmFtZTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gRmlsZUxvY2F0b3IuZmluZChVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCksIG5ldyBQYXRoKHBhdGgpLCBudWxsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VcGRhdGVVSU1lc3NhZ2VzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTFiY2JiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VcGRhdGVVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBVcGRhdGVVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVXBkYXRlVUlNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzdGFydFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc3RhcnRNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wdGlvbmFsUmVzdGFydE1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXBwbGljYXRpb25JblJlc3RhcnREaWFsb2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXBwbHlDaGFuZ2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25NYW5hZ2VyQWN0aW9uX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93X2ZpbGVNZW51OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93X3Byb3BlcnRpZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbk1hbmFnZXJXaW5kb3dfY2xvc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZEFjdGlvbl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX3JldHJ5VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9yZXRyeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRQYWdlX0ZlYXR1cmVfU2l6ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRQYWdlX0ZlYXR1cmVfVmVyc2lvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRQYWdlX0ZlYXR1cmVOYW1lQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldFBhZ2VfSW5zdGFsbGF0aW9uRGlyZWN0b3J5Q29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpc2NvdmVyeUZvbGRlcl9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVBZGFwdGVyX2ZhaWx1cmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUJvb2ttYXJrX2Nvbm5lY3Rpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZUJvb2ttYXJrX2Rvd25sb2FkaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1haW5QcmVmZXJlbmNlUGFnZV9jaGVja1NpZ25hdHVyZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYWluUHJlZmVyZW5jZVBhZ2VfYXV0b21hdGljYWxseUNob29zZU1pcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYWluUHJlZmVyZW5jZVBhZ2VfaGlzdG9yeVNpemU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFpblByZWZlcmVuY2VQYWdlX2ludmFsaWRIaXN0b3J5U2l6ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYWluUHJlZmVyZW5jZVBhZ2VfdXBkYXRlVmVyc2lvbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFpblByZWZlcmVuY2VQYWdlX3VwZGF0ZVZlcnNpb25zX2VxdWl2YWxlbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFpblByZWZlcmVuY2VQYWdlX3VwZGF0ZVZlcnNpb25zX2NvbXBhdGlibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFpblByZWZlcmVuY2VQYWdlX3VwZGF0ZVBvbGljeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYWluUHJlZmVyZW5jZVBhZ2VfdXBkYXRlUG9saWN5VVJMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1haW5QcmVmZXJlbmNlUGFnZV9wcm94eUdyb3VwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1haW5QcmVmZXJlbmNlUGFnZV9kaWdpdGFsU2lnbmF0dXJlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1haW5QcmVmZXJlbmNlUGFnZV9kaWdpdGFsU2lnbmF0dXJlX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRlU2V0dGluZ3NQcmVmZXJlbmNlUGFnZV9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVTZXR0aW5nc1ByZWZlcmVuY2VQYWdlX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwZGF0ZVNldHRpbmdzUHJlZmVyZW5jZVBhZ2VfaW52YWxpZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZV9wYXRoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlX3R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2VfZW5hYmxlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZV95ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2Vfbm87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2VfZXh0ZW5zaW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlX3Byb2R1Y3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2VfdW5rbm93bjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlQ29weXJpZ2h0UHJvcGVydHlQYWdlX3Nob3dJbkJyb3dzZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUNvcHlyaWdodFByb3BlcnR5UGFnZV9ub0NvcHlyaWdodDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX2lkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX3ZlcnNpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2VfcHJvdmlkZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2Vfc2l6ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV9wbGF0Zm9ybXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2Vfd3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2VfYXJjaDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV9ubDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV9hbGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2Vfb3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV9LaWxvYnl0ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZUxpY2Vuc2VQcm9wZXJ0eVBhZ2Vfc2hvd0luQnJvd3NlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlTGljZW5zZVByb3BlcnR5UGFnZV9ub0xpY2Vuc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZV9wZW5kaW5nQ2hhbmdlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlU3RhdHVzUHJvcGVydHlQYWdlX3JlYXNvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlU3RhdHVzUHJvcGVydHlQYWdlX21pc3NpbmdPcHRpb25hbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlU3RhdHVzUHJvcGVydHlQYWdlX21pc3Npbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZV9nb29kQ29uZmlndXJhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfd3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvbkRpYWxvZ19UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfVmVyaWZpY2F0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvbkRpYWxvZ19Db21wb25lbnROb3RJbnN0YWxsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0Fib3V0VG9JbnN0YWxsX0ZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uRGlhbG9nX05vdERpZ2l0YWxseVNpZ25lZF9GaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvbkRpYWxvZ19DYW5ub3RWZXJpZnlQcm92aWRlcl9GaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvbkRpYWxvZ19Db3JydXB0ZWRDb250ZW50X0ZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uRGlhbG9nX1NpZ25lZENvbXBvbmVudF9GaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvbkRpYWxvZ19Vbmtub3duQ2VydGlmaWNhdGVfRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfVW5hYmxlVG9WZXJpZnlQcm92aWRlcl9GaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvbkRpYWxvZ19Qcm92aWRlcktub3duX0ZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0tub3duQ2VydGlmaWNhdGVfRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfQWJvdXRUb0luc3RhbGxfRmVhdHVyZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfTm90RGlnaXRhbGx5U2lnbmVkX0ZlYXR1cmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0Nhbm5vdFZlcmlmeVByb3ZpZGVyX0ZlYXR1cmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0NvcnJ1cHRlZENvbnRlbnRfRmVhdHVyZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfU2lnbmVkQ29tcG9uZW50X0ZlYXR1cmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uRGlhbG9nX1Vua25vd25DZXJ0aWZpY2F0ZV9GZWF0dXJlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvbkRpYWxvZ19VbmFibGVUb1ZlcmlmeVByb3ZpZGVyX0ZlYXR1cmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uRGlhbG9nX1Byb3ZpZGVyS25vd25fRmVhdHVyZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfS25vd25DZXJ0aWZpY2F0ZV9GZWF0dXJlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvbkRpYWxvZ19GaWxlTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfRmVhdHVyZU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0ZlYXR1cmVJZGVudGlmaWVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvbkRpYWxvZ19Qcm92aWRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfTWF5Q2hvb3NlVG9JbnN0YWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvbkRpYWxvZ19NYXlDaG9vc2VUb0NvbnRpbnVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvbkRpYWxvZ19JbnN0YWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvbkRpYWxvZ19JbnN0YWxsQWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvbkRpYWxvZ19Db250aW51ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfQ2FuY2VsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphclZlcmlmaWNhdGlvbkRpYWxvZ19Sb290Q0E7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmFyVmVyaWZpY2F0aW9uRGlhbG9nX1N1YmplY3RDQTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXJWZXJpZmljYXRpb25EaWFsb2dfQ2VydGlmaWNhdGVJbmZvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJWZXJpZmljYXRpb25EaWFsb2dfUGFzc3dvcmRSZXF1aXJlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VyVmVyaWZpY2F0aW9uRGlhbG9nX0Nvbm5lY3RUbzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VyVmVyaWZpY2F0aW9uRGlhbG9nX1Bhc3N3b3JkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJWZXJpZmljYXRpb25EaWFsb2dfVXNlck5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblByZXZpZXdGb3JtX2NvbmZpZ0Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QcmV2aWV3Rm9ybV9pbnN0YWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QcmV2aWV3Rm9ybV9BdmFpbGFibGVUYXNrczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19taXNzaW5nRmVhdHVyZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19jdXJyZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X3BlbmRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfZXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfY29sbGFwc2VMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19jb2xsYXBzZVRvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfcmV2ZXJ0TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfaW5zdGFsbEhpc3Rvcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfZXh0TG9jYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfdW5pbnN0YWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X3VuY29uZmlndXJlQW5kVW5pbnN0YWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X2luc3RhbGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfYW5vdGhlclZlcnNpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfZmluZFVwZGF0ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfc2hvd05lc3RlZEZlYXR1cmVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X3Nob3dOZXN0ZWRUb29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X3Nob3dJbnN0YWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X3Nob3dJbnN0YWxsVG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19zaG93RGlzYWJsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfc2hvd0Rpc2FibGVkVG9vbHRpcDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19zaG93QWN0aXZpdGllc0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X25ldzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19yZXBsYWNlV2l0aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19yZXZlcnRQcmV2aW91c0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X3JldmVydFByZXZpb3VzRGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld191cGRhdGVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld191cGRhdGVEZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X2luc3RhbGxIaXN0TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfaW5zdGFsbEhpc3REZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X2FjdGl2aXRpZXNMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19hY3Rpdml0aWVzRGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19lbmFibGVMb2NEZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X2V4dExvY0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X2V4dExvY0Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfcHJvcGVydGllc0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X2luc3RhbGxQcm9wRGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19yZXBsYWNlVmVyc2lvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X3JlcGxhY2VWZXJzaW9uRGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19lbmFibGVGZWF0dXJlRGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19pbnN0YWxsT3B0aW9uYWxMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uVmlld19pbnN0YWxsT3B0aW9uYWxEZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X3VuaW5zdGFsbExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X3VuaW5zdGFsbERlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfdW5pbnN0YWxsRGVzYzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfc2NhbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X3NjYW5EZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X2ZlYXR1cmVQcm9wTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblZpZXdfZmVhdHVyZVByb3BEZXNjOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25WaWV3X2xvYWRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aW9uc19icm9rZW5Db25maWdRdWVzdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlU3RhdGVBY3Rpb25fZGlzYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlU3RhdGVBY3Rpb25fZW5hYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVTdGF0ZUFjdGlvbl9kaXNhYmxlUXVlc3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZVN0YXRlQWN0aW9uX0VuYWJsZVF1ZXN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVTdGF0ZUFjdGlvbl9kaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlVW5pbnN0YWxsQWN0aW9uX3VuaW5zdGFsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlVW5pbnN0YWxsQWN0aW9uX3VuaW5zdGFsbFF1ZXN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZlYXR1cmVVbmluc3RhbGxBY3Rpb25fZGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZVVuY29uZmlndXJlQW5kVW5pbnN0YWxsQWN0aW9uX3VuaW5zdGFsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZWF0dXJlVW5jb25maWd1cmVBbmRVbmluc3RhbGxBY3Rpb25fcXVlc3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZVVuY29uZmlndXJlQW5kVW5pbnN0YWxsQWN0aW9uX2RpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVTdGF0ZUFjdGlvbl9kaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlU3RhdGVBY3Rpb25fZGlzYWJsZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVTdGF0ZUFjdGlvbl9kaXNhYmxlTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlU3RhdGVBY3Rpb25fZW5hYmxlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZVN0YXRlQWN0aW9uX2VuYWJsZU1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbl9kYXRlVGltZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uX3RhcmdldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uX2FjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uX3N0YXR1czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uX2Vycm9yczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdFeHRlbnNpb25Mb2NhdGlvbkFjdGlvbl9zZWxlY3RFeHRMb2NhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdFeHRlbnNpb25Mb2NhdGlvbkFjdGlvbl9leHRJbmZvVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3RXh0ZW5zaW9uTG9jYXRpb25BY3Rpb25fZXh0SW5mb01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdGllc1RhYmxlVmlld2VyX2VuYWJsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdGllc1RhYmxlVmlld2VyX2ZlYXR1cmVJbnN0YWxsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdGllc1RhYmxlVmlld2VyX2ZlYXR1cmVSZW1vdmVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXRpZXNUYWJsZVZpZXdlcl9zaXRlSW5zdGFsbGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXRpZXNUYWJsZVZpZXdlcl9zaXRlUmVtb3ZlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0aWVzVGFibGVWaWV3ZXJfZGlzYWJsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdGllc1RhYmxlVmlld2VyX3JldmVydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0aWVzVGFibGVWaWV3ZXJfcmVjb25jaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXRpZXNUYWJsZVZpZXdlcl91bmtub3duOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXRpZXNUYWJsZVZpZXdlcl9kYXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXRpZXNUYWJsZVZpZXdlcl90YXJnZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdGllc1RhYmxlVmlld2VyX2FjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEdXBsaWNhdGVDb25mbGljdHNEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nX3RyZWVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb2RlU2VsZWN0aW9uUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb2RlU2VsZWN0aW9uUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vZGVTZWxlY3Rpb25QYWdlX3VwZGF0ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW9kZVNlbGVjdGlvblBhZ2VfdXBkYXRlc1RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW9kZVNlbGVjdGlvblBhZ2VfbmV3RmVhdHVyZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW9kZVNlbGVjdGlvblBhZ2VfbmV3RmVhdHVyZXNUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vcmVJbmZvR2VuZXJhdG9yX21vcmVJbmZvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1VwZGF0ZVNpdGVEaWFsb2dfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdVcGRhdGVTaXRlRGlhbG9nX3VybDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdVcGRhdGVTaXRlRGlhbG9nX2Vycm9yX25hbWVPclVybE5vdFNwZWNpZmllZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdVcGRhdGVTaXRlRGlhbG9nX2Vycm9yX2R1cGxpY2F0ZU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3VXBkYXRlU2l0ZURpYWxvZ19lcnJvcl9kdXBsaWNhdGVVcmw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3VXBkYXRlU2l0ZURpYWxvZ19lcnJvcl9pbmNvcnJlY3RVcmw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9pc1J1bm5pbmdUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX2lzUnVubmluZ0luZm87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9qb2JOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfZG93bmxvYWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9kb3dubG9hZGluZ0ZlYXR1cmVKYXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9hbm90aGVySm9iOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfYW5vdGhlckpvYlRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfd3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfT3B0aW9uYWxGZWF0dXJlc1BhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9PcHRpb25hbEZlYXR1cmVzUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfT3B0aW9uYWxGZWF0dXJlc1BhZ2VfdHJlZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfT3B0aW9uYWxGZWF0dXJlc1BhZ2Vfc2VsZWN0QWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfT3B0aW9uYWxGZWF0dXJlc1BhZ2VfZGVzZWxlY3RBbGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX2NvdW50ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV96ZXJvVXBkYXRlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfemVyb0ZlYXR1cmVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfZGVzZWxlY3RBbGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX21vcmVJbmZvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9wcm9wZXJ0aWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9zZWxlY3RSZXF1aXJlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2Vfc2hvd1N0YXR1czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfZmlsdGVyRmVhdHVyZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX2ZpbHRlclBhdGNoZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX2ZpbHRlck9sZGVyRmVhdHVyZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX2ludmFsaWRfbG9uZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfaW52YWxpZF9zaG9ydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfY3ljbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9MaWNlbnNlUGFnZV9hY2NlcHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9MaWNlbnNlUGFnZV9hY2NlcHQyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfTGljZW5zZVBhZ2VfZGVjbGluZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX0xpY2Vuc2VQYWdlX2RlY2xpbmUyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfTGljZW5zZVBhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX0xpY2Vuc2VQYWdlX2Rlc2MyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfTGljZW5zZVBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9qb2JzTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX3NpdGVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfbmV3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9kZWxldGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX3JlcXVpcmVkU3BhY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX2F2YWlsYWJsZVNwYWNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9sb2NhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfbG9jYXRpb25fY2hhbmdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9sb2NhdGlvbl9tZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9sb2NhdGlvbl9lbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfbG9jYXRpb25fZXJyb3JfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX3NpemVfS0I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX3NpemVfTUI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX3NpemVfR0I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX3Vua25vd25TaXplOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9wYXRjaEVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9wYXRjaEVycm9yMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsV2l6YXJkMl91cGRhdGVPcGVyYXRpb25IYXNGYWlsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZF93dGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZFBhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9hY3Rpdml0aWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJldmVydENvbmZpZ3VyYXRpb25XaXphcmRQYWdlX3F1ZXN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJldmVydF9Qcm9ibGVtRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNob3dBY3Rpdml0aWVzRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNob3dBY3Rpdml0aWVzRGlhbG9nX2RhdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2hvd0FjdGl2aXRpZXNEaWFsb2dfbG9jOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNob3dBY3Rpdml0aWVzRGlhbG9nX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVQYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZVBhZ2VfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZVBhZ2VfYWRkVXBkYXRlU2l0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlUGFnZV9hZGRMb2NhbFNpdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZVBhZ2VfYWRkTG9jYWxaaXBwZWRTaXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVQYWdlX2VkaXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZVBhZ2VfcmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVQYWdlX2ltcG9ydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlUGFnZV9leHBvcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZVBhZ2VfaWdub3JlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVQYWdlX2F1dG9tYXRpY2FsbHlTZWxlY3RNaXJyb3JzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpdGVQYWdlX25ldzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaXRlUGFnZV9kaWFsb2dFZGl0TG9jYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZVBhZ2VfZGlhbG9nRWRpdFVwZGF0ZVNpdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZVBhZ2VfcmVtb3ZlX2xvY2F0aW9uX2NvbmZfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2l0ZVBhZ2VfcmVtb3ZlX2xvY2F0aW9uX2NvbmY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9jYWxTaXRlU2VsZWN0b3JfZGlhbG9nTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2NhbFNpdGVTZWxlY3Rvcl9kaXJJbmZvVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9jYWxTaXRlU2VsZWN0b3JfZGlySW5mb01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9jYWxTaXRlU2VsZWN0b3JfZGlyRHVwbGljYXRlRGVmaW5pdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2NhbFNpdGVTZWxlY3Rvcl9kaWFsb2dNZXNzYWdlemlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2FsU2l0ZVNlbGVjdG9yX3ppcEluZm9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2NhbFNpdGVTZWxlY3Rvcl96aXBJbmZvTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2NhbFNpdGVTZWxlY3Rvcl96aXBEdXBsaWNhdGVEZWZpbml0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2FsU2l0ZVNlbGVjdG9yX2RpYWxvZ01lc3NhZ2VJbXBvcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9jYWxTaXRlU2VsZWN0b3JfaW1wb3J0SW5mb1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2FsU2l0ZVNlbGVjdG9yX2ltcG9ydEluZm9NZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2FsU2l0ZVNlbGVjdG9yX2RpYWxvZ01lc3NhZ2VFeHBvcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlzc2luZ0ZlYXR1cmVfcHJvdmlkZXI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTWlzc2luZ0ZlYXR1cmVfaWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlzc2luZ0ZlYXR1cmVfZGVzY191bmtub3duOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pc3NpbmdGZWF0dXJlX2Rlc2Nfb3B0aW9uYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3dhcEZlYXR1cmVXaXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3dhcEZlYXR1cmVXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN3YXBGZWF0dXJlV2l6YXJkUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN3YXBGZWF0dXJlV2l6YXJkUGFnZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNaXJyb3JzRGlhbG9nX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlycm9yc0RpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNVcGRhdGVzSm9iX1VwZGF0ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b21hdGljVXBkYXRlc0pvYl9FY2xpcHNlVXBkYXRlczE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b21hdGljVXBkYXRlc0pvYl9VcGRhdGVzQXZhaWxhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY1VwZGF0ZXNKb2JfRWNsaXBzZVVwZGF0ZXMyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY1VwZGF0ZXNKb2JfVXBkYXRlc0Rvd25sb2FkZWQ7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRmVhdHVyZVBhZ2Vfb3B0aW9uYWxJbnN0YWxsX3RpdGxlOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgVXBkYXRlVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbk1hbmFnZXJXaW5kb3dfc2VhcmNoVGFza05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmluZFVwZGF0ZXNBY3Rpb25fdHJhY2tlZFByb2dyZXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbmRVcGRhdGVzQWN0aW9uX2FsbEZlYXR1cmVzU2VhcmNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJldmlld1BhZ2VfdmFsaWRhdGluZzsKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VcGRhdGVVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VwZGF0ZVVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MmRkMjguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VwZGF0ZVVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIwotIwotUmVzdGFydFRpdGxlID0gSW5zdGFsbC9VcGRhdGUKLVJlc3RhcnRNZXNzYWdlID0gWW91IHdpbGwgbmVlZCB0byByZXN0YXJ0IHRoZSB7MH0gZm9yIHRoZSBjaGFuZ2VzIHRvIHRha2UgZWZmZWN0LiBcCi1Xb3VsZCB5b3UgbGlrZSB0byByZXN0YXJ0IG5vdz8KLQotT3B0aW9uYWxSZXN0YXJ0TWVzc2FnZSA9IEl0IGlzIHJlY29tbWVuZGVkIHlvdSByZXN0YXJ0IHRoZSB7MH0gZm9yIHRoZSBjaGFuZ2VzIHRvIHRha2UgZWZmZWN0LCBcCi1idXQgaXQgbWF5IGJlIHBvc3NpYmxlIHRvIGFwcGx5IHRoZSBjaGFuZ2VzIHRvIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gd2l0aG91dCByZXN0YXJ0aW5nLiBcCi1Xb3VsZCB5b3UgbGlrZSB0byByZXN0YXJ0IG5vdz8KLQotQXBwbGljYXRpb25JblJlc3RhcnREaWFsb2cgPWFwcGxpY2F0aW9uCi0KLUFwcGx5Q2hhbmdlcz1BcHBseSBDaGFuZ2VzCi0KLQotQ29uZmlndXJhdGlvbk1hbmFnZXJBY3Rpb25fdGl0bGU9UHJvZHVjdCBDb25maWd1cmF0aW9uCi1Db25maWd1cmF0aW9uTWFuYWdlcldpbmRvd19maWxlTWVudT0mRmlsZQotQ29uZmlndXJhdGlvbk1hbmFnZXJXaW5kb3dfcHJvcGVydGllcz0mUHJvcGVydGllcwotQ29uZmlndXJhdGlvbk1hbmFnZXJXaW5kb3dfc2VhcmNoVGFza05hbWU9U2VhcmNoaW5nIGZvciB1cGRhdGVzOiB7MH0KLUNvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93X2Nsb3NlPSZDbG9zZQotCi0KLUluc3RhbGxXaXphcmRBY3Rpb25fdGl0bGU9SW5zdGFsbC9VcGRhdGUKLUluc3RhbGxXaXphcmRfcmV0cnlUaXRsZSA9IFByb2JsZW0gb2NjdXJyZWQKLUluc3RhbGxXaXphcmRfcmV0cnkgPSBEbyB5b3Ugd2FudCB0byByZXRyeT8KLQotCi1EaXNjb3ZlcnlGb2xkZXJfbmFtZT1TaXRlcyB0byBWaXNpdAotRmVhdHVyZUFkYXB0ZXJfZmFpbHVyZT08ZmFpbHVyZT4KLVNpdGVCb29rbWFya19jb25uZWN0aW5nID0gQ29ubmVjdGluZyB0byAiezB9Ii4uLgotU2l0ZUJvb2ttYXJrX2Rvd25sb2FkaW5nID0gRG93bmxvYWRpbmc6XAotCi1NYWluUHJlZmVyZW5jZVBhZ2VfY2hlY2tTaWduYXR1cmUgPSBDaGVjayBkaWdpdGFsICZzaWduYXR1cmVzIG9mIGRvd25sb2FkZWQgYXJjaGl2ZXMKLU1haW5QcmVmZXJlbmNlUGFnZV9hdXRvbWF0aWNhbGx5Q2hvb3NlTWlycm9yID0gQXV0b21hdGljYWxseSBzZWxlY3QgJm1pcnJvcnMKLU1haW5QcmVmZXJlbmNlUGFnZV9oaXN0b3J5U2l6ZSA9ICZNYXhpbXVtIG51bWJlciBvZiAnSGlzdG9yeScgY29uZmlndXJhdGlvbnM6Ci1NYWluUHJlZmVyZW5jZVBhZ2VfaW52YWxpZEhpc3RvcnlTaXplID0gVGhlIG1heGltdW0gbnVtYmVyIG9mICdIaXN0b3J5JyBjb25maWd1cmF0aW9ucyBtdXN0IGJlIDAgb3IgbW9yZS4KLU1haW5QcmVmZXJlbmNlUGFnZV91cGRhdGVWZXJzaW9ucyA9IFZhbGlkIHVwZGF0ZXMKLU1haW5QcmVmZXJlbmNlUGFnZV91cGRhdGVWZXJzaW9uc19lcXVpdmFsZW50ID0gZSZxdWl2YWxlbnQgKDEuMC4xIC0+IDEuMC4yIC0gb25seSBzZXJ2aWNlIGluY3JlbWVudHMpCi1NYWluUHJlZmVyZW5jZVBhZ2VfdXBkYXRlVmVyc2lvbnNfY29tcGF0aWJsZSA9ICZjb21wYXRpYmxlICgxLjAuOSAtPiAxLjEuMCAtIHNlcnZpY2UgYW5kIG1pbm9yIGluY3JlbWVudHMpCi1NYWluUHJlZmVyZW5jZVBhZ2VfdXBkYXRlUG9saWN5ID0gJlVwZGF0ZSBQb2xpY3kKLU1haW5QcmVmZXJlbmNlUGFnZV91cGRhdGVQb2xpY3lVUkwgPSBQbyZsaWN5IFVSTDoKLU1haW5QcmVmZXJlbmNlUGFnZV9wcm94eUdyb3VwID0gUHJveHkgc2V0dGluZ3MKLU1haW5QcmVmZXJlbmNlUGFnZV9kaWdpdGFsU2lnbmF0dXJlX3RpdGxlID0gRGlnaXRhbCBTaWduYXR1cmUgQ2hlY2sKLU1haW5QcmVmZXJlbmNlUGFnZV9kaWdpdGFsU2lnbmF0dXJlX21lc3NhZ2UgPSBZb3UgaGF2ZSBjaG9zZW4gdG8gZGlzYWJsZSBkaWdpdGFsIHNpZ25hdHVyZSBcCi1jaGVja3MgZm9yIGRvd25sb2FkZWQgYXJjaGl2ZXMuIE5vdGUgdGhhdCB1bnNpZ25lZCBhcmNoaXZlcyBtYXkgXAotY29udGFpbiBzb2Z0d2FyZSB0aGF0IGNhbiBoYXJtIHlvdXIgY29tcHV0ZXIuCi0KLVVwZGF0ZVNldHRpbmdzUHJlZmVyZW5jZVBhZ2VfZGVzY3JpcHRpb249U2V0dGluZ3MgZm9yIGF1dG9tYXRpYyBmZWF0dXJlIHVwZGF0ZQotVXBkYXRlU2V0dGluZ3NQcmVmZXJlbmNlUGFnZV9sYWJlbD1BZGRyZXNzICZNYXBwaW5ncyBVUkw6Ci1VcGRhdGVTZXR0aW5nc1ByZWZlcmVuY2VQYWdlX2ludmFsaWQ9SW52YWxpZCBtYXBwaW5ncyBVUkwKLQotCi1Db25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZV9wYXRoPUxvY2F0aW9uIHBhdGg6Ci1Db25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZV90eXBlPUxvY2F0aW9uIHR5cGU6Ci1Db25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZV9lbmFibGVkPUVuYWJsZWQ6Ci1Db25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZV95ZXM9eWVzCi1Db25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZV9ubz1ubwotQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2VfZXh0ZW5zaW9uPXByb2R1Y3QgZXh0ZW5zaW9uCi1Db25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZV9wcm9kdWN0PXByb2R1Y3QKLUNvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlX3Vua25vd249dW5rbm93bgotCi1GZWF0dXJlQ29weXJpZ2h0UHJvcGVydHlQYWdlX3Nob3dJbkJyb3dzZXI9JlNob3cgaW4gQnJvd3NlcgotRmVhdHVyZUNvcHlyaWdodFByb3BlcnR5UGFnZV9ub0NvcHlyaWdodD1GZWF0dXJlIGRvZXMgbm90IGNvbnRhaW4gYSBjb3B5cmlnaHQgc3RhdGVtZW50Ci0KLUZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX25hbWU9TmFtZToKLUZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX2lkPUlkZW50aWZpZXI6Ci1GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV92ZXJzaW9uPVZlcnNpb246Ci1GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV9wcm92aWRlcj1Qcm92aWRlcjoKLUZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX3NpemU9U2l6ZToKLUZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX3BsYXRmb3Jtcz1TdXBwb3J0ZWQgUGxhdGZvcm1zCi1GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV93cz1XaW5kb3dpbmcgU3lzdGVtOiB7MH0KLUZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX2FyY2g9Q1BVIEFyY2hpdGVjdHVyZTogezB9Ci1GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV9ubD1MYW5ndWFnZXM6IHswfQotRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2VfYWxsPWFsbAotRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2Vfb3M9T3BlcmF0aW5nIFN5c3RlbTogezB9Ci1GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV9kZXNjPURlc2NyaXB0aW9uCi1GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV9LaWxvYnl0ZXMgPSBLQgotCi1GZWF0dXJlTGljZW5zZVByb3BlcnR5UGFnZV9zaG93SW5Ccm93c2VyPSZTaG93IGluIEJyb3dzZXIKLUZlYXR1cmVMaWNlbnNlUHJvcGVydHlQYWdlX25vTGljZW5zZT1GZWF0dXJlIGRvZXMgbm90IGNvbnRhaW4gYSBsaWNlbnNlLgotCi1GZWF0dXJlU3RhdHVzUHJvcGVydHlQYWdlX3BlbmRpbmdDaGFuZ2VzPVRoZSBmZWF0dXJlIGhhcyBwZW5kaW5nIGNoYW5nZXMuICBUaGVyZWZvcmUsIGl0cyBzdGF0dXMgY2Fubm90IGJlIGRldGVybWluZWQgdW50aWwgeW91IHJlc3RhcnQgdGhlIHdvcmtiZW5jaC4KLUZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2VfcmVhc29uPVJlYXNvbjoKLUZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2VfbWlzc2luZ09wdGlvbmFsPVRoaXMgb3B0aW9uYWwgZmVhdHVyZSBpcyBjdXJyZW50bHkgbm90IGluc3RhbGxlZC4KLUZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2VfbWlzc2luZz1SZWZlcmVuY2VkIGZlYXR1cmUgbm90IGZvdW5kLgotRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZV9nb29kQ29uZmlndXJhdGlvbj1UaGUgZmVhdHVyZSBpcyBjb25maWd1cmVkIHByb3Blcmx5LgotCi1KYXJWZXJpZmljYXRpb25EaWFsb2dfd3RpdGxlID0gVmVyaWZpY2F0aW9uCi1KYXJWZXJpZmljYXRpb25EaWFsb2dfVGl0bGU9IEZlYXR1cmUgVmVyaWZpY2F0aW9uCi1KYXJWZXJpZmljYXRpb25EaWFsb2dfVmVyaWZpY2F0aW9uPVZlcmlmaWNhdGlvbgotSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0NvbXBvbmVudE5vdEluc3RhbGxlZD1UaGlzIGZlYXR1cmUgd2lsbCBub3QgYmUgaW5zdGFsbGVkLgotCi1KYXJWZXJpZmljYXRpb25EaWFsb2dfQWJvdXRUb0luc3RhbGxfRmlsZT1XYXJuaW5nOiBZb3UgYXJlIGFib3V0IHRvIGluc3RhbGwgYW4gdW5zaWduZWQgZmVhdHVyZSBmaWxlLgotSmFyVmVyaWZpY2F0aW9uRGlhbG9nX05vdERpZ2l0YWxseVNpZ25lZF9GaWxlPSBUaGlzIGZlYXR1cmUgZmlsZSBoYXMgbm90IGJlZW4gZGlnaXRhbGx5IHNpZ25lZC4KLUphclZlcmlmaWNhdGlvbkRpYWxvZ19DYW5ub3RWZXJpZnlQcm92aWRlcl9GaWxlPVRoZSBwcm92aWRlciBvZiB0aGlzIGZlYXR1cmUgZmlsZSBjYW5ub3QgYmUgdmVyaWZpZWQuCi1KYXJWZXJpZmljYXRpb25EaWFsb2dfQ29ycnVwdGVkQ29udGVudF9GaWxlPVRoZSBjb250ZW50IG9mIHRoaXMgZmVhdHVyZSBmaWxlIGhhcyBiZWVuIGNvcnJ1cHRlZAotSmFyVmVyaWZpY2F0aW9uRGlhbG9nX1NpZ25lZENvbXBvbmVudF9GaWxlPVlvdSBhcmUgYWJvdXQgdG8gaW5zdGFsbCBhIHNpZ25lZCBmZWF0dXJlIGZpbGUuCi1KYXJWZXJpZmljYXRpb25EaWFsb2dfVW5rbm93bkNlcnRpZmljYXRlX0ZpbGU9VGhlIGNlcnRpZmljYXRlcyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGlzIGZlYXR1cmUgZmlsZSBhcmUgbm90IHJlY29nbml6ZWQuCi1KYXJWZXJpZmljYXRpb25EaWFsb2dfVW5hYmxlVG9WZXJpZnlQcm92aWRlcl9GaWxlPVRoZSBwcm92aWRlciBvZiB0aGlzIGZlYXR1cmUgZmlsZSBjYW5ub3QgYmUgdmVyaWZpZWQuCi1KYXJWZXJpZmljYXRpb25EaWFsb2dfUHJvdmlkZXJLbm93bl9GaWxlPVRoZSBwcm92aWRlciBvZiB0aGlzIGZlYXR1cmUgZmlsZSBoYXMgYmVlbiB2YWxpZGF0ZWQgYnkgYSB0cnVzdGVkIHRoaXJkIHBhcnR5LgotSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0tub3duQ2VydGlmaWNhdGVfRmlsZT1PbmUgb2YgdGhlIGNlcnRpZmljYXRlcyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGlzIGZlYXR1cmUgZmlsZSB3YXMgcmVjb2duaXplZC4KLQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0Fib3V0VG9JbnN0YWxsX0ZlYXR1cmU9V2FybmluZzogWW91IGFyZSBhYm91dCB0byBpbnN0YWxsIGFuIHVuc2lnbmVkIGZlYXR1cmUuCi1KYXJWZXJpZmljYXRpb25EaWFsb2dfTm90RGlnaXRhbGx5U2lnbmVkX0ZlYXR1cmU9IFRoaXMgZmVhdHVyZSBoYXMgbm90IGJlZW4gZGlnaXRhbGx5IHNpZ25lZC4KLUphclZlcmlmaWNhdGlvbkRpYWxvZ19DYW5ub3RWZXJpZnlQcm92aWRlcl9GZWF0dXJlPVRoZSBwcm92aWRlciBvZiB0aGlzIGZlYXR1cmUgY2Fubm90IGJlIHZlcmlmaWVkLgotSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0NvcnJ1cHRlZENvbnRlbnRfRmVhdHVyZT1UaGUgY29udGVudCBvZiB0aGlzIGZlYXR1cmUgaGFzIGJlZW4gY29ycnVwdGVkCi1KYXJWZXJpZmljYXRpb25EaWFsb2dfU2lnbmVkQ29tcG9uZW50X0ZlYXR1cmU9WW91IGFyZSBhYm91dCB0byBpbnN0YWxsIGEgc2lnbmVkIGZlYXR1cmUuCi1KYXJWZXJpZmljYXRpb25EaWFsb2dfVW5rbm93bkNlcnRpZmljYXRlX0ZlYXR1cmU9VGhlIGNlcnRpZmljYXRlcyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGlzIGZlYXR1cmUgYXJlIG5vdCByZWNvZ25pemVkLgotSmFyVmVyaWZpY2F0aW9uRGlhbG9nX1VuYWJsZVRvVmVyaWZ5UHJvdmlkZXJfRmVhdHVyZT1UaGUgcHJvdmlkZXIgb2YgdGhpcyBmZWF0dXJlIGNhbm5vdCBiZSB2ZXJpZmllZC4KLUphclZlcmlmaWNhdGlvbkRpYWxvZ19Qcm92aWRlcktub3duX0ZlYXR1cmU9VGhlIHByb3ZpZGVyIG9mIHRoaXMgZmVhdHVyZSBoYXMgYmVlbiB2YWxpZGF0ZWQgYnkgYSB0cnVzdGVkIHRoaXJkIHBhcnR5LgotSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0tub3duQ2VydGlmaWNhdGVfRmVhdHVyZT1PbmUgb2YgdGhlIGNlcnRpZmljYXRlcyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGlzIGZlYXR1cmUgd2FzIHJlY29nbml6ZWQuCi0KLUphclZlcmlmaWNhdGlvbkRpYWxvZ19GaWxlTmFtZT1GaWxlIElkZW50aWZpZXI6Ci1KYXJWZXJpZmljYXRpb25EaWFsb2dfRmVhdHVyZU5hbWU9RmVhdHVyZSBuYW1lOgotSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0ZlYXR1cmVJZGVudGlmaWVyPUZlYXR1cmUgSWRlbnRpZmllcjoKLUphclZlcmlmaWNhdGlvbkRpYWxvZ19Qcm92aWRlcj0JUHJvdmlkZXI6Ci1KYXJWZXJpZmljYXRpb25EaWFsb2dfTWF5Q2hvb3NlVG9JbnN0YWxsPVlvdSBtYXkgY2hvb3NlIHRvIGluc3RhbGwgdGhlIGZlYXR1cmUgb3IgY2FuY2VsIGl0cyBpbnN0YWxsYXRpb24uCi1KYXJWZXJpZmljYXRpb25EaWFsb2dfTWF5Q2hvb3NlVG9Db250aW51ZT1Zb3UgbWF5IGNob29zZSB0byBjb250aW51ZSB0byBpbnN0YWxsIHRoZSBmZWF0dXJlIG9yIGNhbmNlbCBpdHMgaW5zdGFsbGF0aW9uLgotSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0luc3RhbGw9Jkluc3RhbGwKLUphclZlcmlmaWNhdGlvbkRpYWxvZ19JbnN0YWxsQWxsPUluc3RhbGwgJkFsbAotSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0NvbnRpbnVlPUMmb250aW51ZQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0NhbmNlbD0mQ2FuY2VsCi1KYXJWZXJpZmljYXRpb25EaWFsb2dfUm9vdENBPSBBY2NvcmRpbmcgdG86Ci1KYXJWZXJpZmljYXRpb25EaWFsb2dfU3ViamVjdENBPSBGaWxlIHNpZ25lZCBieToKLUphclZlcmlmaWNhdGlvbkRpYWxvZ19DZXJ0aWZpY2F0ZUluZm89IENlcnRpZmljYXRlOgotCi1Vc2VyVmVyaWZpY2F0aW9uRGlhbG9nX1Bhc3N3b3JkUmVxdWlyZWQ9UGFzc3dvcmQgUmVxdWlyZWQKLVVzZXJWZXJpZmljYXRpb25EaWFsb2dfQ29ubmVjdFRvPUNvbm5lY3QgdG86Ci1Vc2VyVmVyaWZpY2F0aW9uRGlhbG9nX1Bhc3N3b3JkPVBhc3N3b3JkOgotVXNlclZlcmlmaWNhdGlvbkRpYWxvZ19Vc2VyTmFtZT1Vc2VyIG5hbWU6Ci0KLUNvbmZpZ3VyYXRpb25QcmV2aWV3Rm9ybV9jb25maWdEZXNjcmlwdGlvbj1UaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotQ29uZmlndXJhdGlvblByZXZpZXdGb3JtX2luc3RhbGw9SW5zdGFsbCBMb2NhdGlvbgotQ29uZmlndXJhdGlvblByZXZpZXdGb3JtX0F2YWlsYWJsZVRhc2tzPUF2YWlsYWJsZSBUYXNrcwotCi1Db25maWd1cmF0aW9uVmlld19taXNzaW5nRmVhdHVyZSA9IHswfSAobm90IGluc3RhbGxlZCkKLUNvbmZpZ3VyYXRpb25WaWV3X2N1cnJlbnQ9Q3VycmVudCBDb25maWd1cmF0aW9uCi1Db25maWd1cmF0aW9uVmlld19wZW5kaW5nPVwgKHBlbmRpbmcgY2hhbmdlcykKLUNvbmZpZ3VyYXRpb25WaWV3X2Vycm9yPUVycm9yCi1Db25maWd1cmF0aW9uVmlld19jb2xsYXBzZUxhYmVsPUNvbGxhcHNlIEFsbAotQ29uZmlndXJhdGlvblZpZXdfY29sbGFwc2VUb29sdGlwPUNvbGxhcHNlIEFsbAotQ29uZmlndXJhdGlvblZpZXdfcmV2ZXJ0TGFiZWw9UmV2ZXJ0Li4uCi1Db25maWd1cmF0aW9uVmlld19pbnN0YWxsSGlzdG9yeSA9SW5zdGFsbGF0aW9uIEhpc3RvcnkKLUNvbmZpZ3VyYXRpb25WaWV3X2V4dExvY2F0aW9uPUV4dGVuc2lvbiBMb2NhdGlvbi4uLgotQ29uZmlndXJhdGlvblZpZXdfdW5pbnN0YWxsPVVuaW5zdGFsbAotQ29uZmlndXJhdGlvblZpZXdfdW5jb25maWd1cmVBbmRVbmluc3RhbGw9VW5pbnN0YWxsCi1Db25maWd1cmF0aW9uVmlld19pbnN0YWxsPUluc3RhbGwKLUNvbmZpZ3VyYXRpb25WaWV3X2Fub3RoZXJWZXJzaW9uPSZBbm90aGVyIFZlcnNpb24uLi4KLUNvbmZpZ3VyYXRpb25WaWV3X2ZpbmRVcGRhdGVzPUZpbmQgVXBkYXRlcy4uLgotQ29uZmlndXJhdGlvblZpZXdfc2hvd05lc3RlZEZlYXR1cmVzPVNob3cgTmVzdGVkIEZlYXR1cmVzCi1Db25maWd1cmF0aW9uVmlld19zaG93TmVzdGVkVG9vbHRpcD1TaG93IE5lc3RlZCBGZWF0dXJlcwotQ29uZmlndXJhdGlvblZpZXdfc2hvd0luc3RhbGw9U2hvdyBJbnN0YWxsIExvY2F0aW9ucwotQ29uZmlndXJhdGlvblZpZXdfc2hvd0luc3RhbGxUb29sdGlwPVNob3cgSW5zdGFsbCBMb2NhdGlvbnMKLUNvbmZpZ3VyYXRpb25WaWV3X3Nob3dEaXNhYmxlZD1TaG93IERpc2FibGVkIEZlYXR1cmVzCi1Db25maWd1cmF0aW9uVmlld19zaG93RGlzYWJsZWRUb29sdGlwPVNob3cgRGlzYWJsZWQgRmVhdHVyZXMKLUNvbmZpZ3VyYXRpb25WaWV3X3Nob3dBY3Rpdml0aWVzTGFiZWwgPSBTaG93IEFjdGl2aXRpZXMKLQotQ29uZmlndXJhdGlvblZpZXdfbmV3PUFkZAotQ29uZmlndXJhdGlvblZpZXdfcmVwbGFjZVdpdGg9UmVwbGFjZSB3aXRoCi1Db25maWd1cmF0aW9uVmlld19yZXZlcnRQcmV2aW91c0xhYmVsPVJldmVydCB0byBQcmV2aW91cwotQ29uZmlndXJhdGlvblZpZXdfcmV2ZXJ0UHJldmlvdXNEZXNjPVlvdSBjYW4gcmV2ZXJ0IHRvIG9uZSBvZiB0aGUgcHJldmlvdXMgY29uZmlndXJhdGlvbnMgaWYgeW91IGFyZSBoYXZpbmcgcHJvYmxlbXMgd2l0aCB0aGUgY3VycmVudCBvbmUuCi1Db25maWd1cmF0aW9uVmlld191cGRhdGVMYWJlbD1TY2FuIGZvciBVcGRhdGVzCi1Db25maWd1cmF0aW9uVmlld191cGRhdGVEZXNjPVNlYXJjaCBmb3IgdXBkYXRlcyBmb3IgYWxsIHRoZSBpbnN0YWxsZWQgZmVhdHVyZXMuCi1Db25maWd1cmF0aW9uVmlld19pbnN0YWxsSGlzdExhYmVsPVZpZXcgSW5zdGFsbGF0aW9uIEhpc3RvcnkKLUNvbmZpZ3VyYXRpb25WaWV3X2luc3RhbGxIaXN0RGVzYz1WaWV3IGFsbCBhY3Rpdml0aWVzIHNpbmNlIHRoZSBpbnN0YWxsYXRpb24gb2YgdGhlIHByb2R1Y3QuCi1Db25maWd1cmF0aW9uVmlld19hY3Rpdml0aWVzTGFiZWw9U2hvdyBBY3Rpdml0aWVzCi1Db25maWd1cmF0aW9uVmlld19hY3Rpdml0aWVzRGVzYz1WaWV3IHRoZSBhY3Rpdml0aWVzIHRoYXQgY2F1c2VkIHRoZSBjcmVhdGlvbiBvZiB0aGlzIGNvbmZpZ3VyYXRpb24uCi1Db25maWd1cmF0aW9uVmlld19lbmFibGVMb2NEZXNjPVlvdSBjYW4gZW5hYmxlIG9yIGRpc2FibGUgYW4gZW50aXJlIGluc3RhbGwgbG9jYXRpb24uIERpc2FibGluZyBhIGxvY2F0aW9uIGlzIGVxdWl2YWxlbnQgdG8gZGlzYWJsaW5nIGV2ZXJ5IGZlYXR1cmUgaW4gaXQuCi1Db25maWd1cmF0aW9uVmlld19leHRMb2NMYWJlbD1BZGQgYW4gRXh0ZW5zaW9uIExvY2F0aW9uCi1Db25maWd1cmF0aW9uVmlld19leHRMb2NEZXNjPUxvY2F0ZSBhbmQgYWRkIGFuIGV4dGVuc2lvbiBsb2NhdGlvbiB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiBBbiBleHRlbnNpb24gbG9jYXRpb24gY29udGFpbnMgZmVhdHVyZXMgYW5kIHBsdWdpbnMgcHJldmlvdXNseSBpbnN0YWxsZWQuCi1Db25maWd1cmF0aW9uVmlld19wcm9wZXJ0aWVzTGFiZWw9U2hvdyBQcm9wZXJ0aWVzCi1Db25maWd1cmF0aW9uVmlld19pbnN0YWxsUHJvcERlc2M9VmlldyB0aGUgcHJvcGVydGllcyBvZiB0aGUgaW5zdGFsbCBsb2NhdGlvbi4KLUNvbmZpZ3VyYXRpb25WaWV3X3JlcGxhY2VWZXJzaW9uTGFiZWw9UmVwbGFjZSBXaXRoIEFub3RoZXIgVmVyc2lvbgotQ29uZmlndXJhdGlvblZpZXdfcmVwbGFjZVZlcnNpb25EZXNjPURpc2FibGVzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIGZlYXR1cmUgYW5kIHJlcGxhY2VzIGl0IHdpdGggYW5vdGhlciB2ZXJzaW9uIGZyb20gdGhlIGxpc3Qgb2YgdGhlIGN1cnJlbnRseSBkaXNhYmxlZCBmZWF0dXJlcy4KLUNvbmZpZ3VyYXRpb25WaWV3X2VuYWJsZUZlYXR1cmVEZXNjPVlvdSBjYW4gZW5hYmxlIG9yIGRpc2FibGUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYSBmZWF0dXJlLiBUaGUgZmVhdHVyZSBpcyBub3QgcmVtb3ZlZCBieSB0aGlzIGFjdGlvbi4KLUNvbmZpZ3VyYXRpb25WaWV3X2luc3RhbGxPcHRpb25hbExhYmVsPUluc3RhbGwgZnJvbSBPcmlnaW5hdGluZyBTZXJ2ZXIKLUNvbmZpZ3VyYXRpb25WaWV3X2luc3RhbGxPcHRpb25hbERlc2M9VGhpcyBvcHRpb25hbCBmZWF0dXJlIHdhcyBub3Qgb3JpZ2luYWxseSBpbnN0YWxsZWQuIFlvdSBjYW4gaW5zdGFsbCBpdCBub3cgYnkgY29ubmVjdGluZyB0byB0aGUgb3JpZ2luYXRpbmcgc2VydmVyIG9mIHRoZSBwYXJlbnQuCi1Db25maWd1cmF0aW9uVmlld191bmluc3RhbGxMYWJlbD1Vbmluc3RhbGwKLUNvbmZpZ3VyYXRpb25WaWV3X3VuaW5zdGFsbERlc2M9VGhpcyBmZWF0dXJlIGlzIGN1cnJlbnRseSBub3QgdXNlZCBhbmQgY2FuIGJlIHVuaW5zdGFsbGVkIGZyb20gdGhlIHByb2R1Y3QuCi1Db25maWd1cmF0aW9uVmlld191bmluc3RhbGxEZXNjMj1Vbmluc3RhbGwgdGhlIGZlYXR1cmUgZnJvbSB0aGUgcHJvZHVjdC4gVGhpcyB3aWxsIGRpc2FibGUgdGhlIGZlYXR1cmUgZnJvbSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgZGlzay4KLUNvbmZpZ3VyYXRpb25WaWV3X3NjYW5MYWJlbD1TY2FuIGZvciBVcGRhdGVzCi1Db25maWd1cmF0aW9uVmlld19zY2FuRGVzYz1TZWFyY2ggZm9yIHVwZGF0ZXMgZm9yIHRoaXMgZmVhdHVyZS4KLUNvbmZpZ3VyYXRpb25WaWV3X2ZlYXR1cmVQcm9wTGFiZWw9U2hvdyBQcm9wZXJ0aWVzCi1Db25maWd1cmF0aW9uVmlld19mZWF0dXJlUHJvcERlc2M9VmlldyBwcm9wZXJ0aWVzIG9mIHRoZSBmZWF0dXJlIHN1Y2ggYXMgdmVyc2lvbiwgcHJvdmlkZXIgbmFtZSwgbGljZW5zZSBhZ3JlZW1lbnQgZXRjLgotQ29uZmlndXJhdGlvblZpZXdfbG9hZGluZyA9IExvYWRpbmcuLi4KLQotQWN0aW9uc19icm9rZW5Db25maWdRdWVzdGlvbj1UaGUgY3VycmVudCBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGVycm9ycyBhbmQgdGhpcyBvcGVyYXRpb24gY2FuIGhhdmUgdW5wcmVkaWN0YWJsZSByZXN1bHRzLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZSA/Ci0KLUZlYXR1cmVTdGF0ZUFjdGlvbl9kaXNhYmxlPURpc2FibGUKLUZlYXR1cmVTdGF0ZUFjdGlvbl9lbmFibGU9RW5hYmxlCi1GZWF0dXJlU3RhdGVBY3Rpb25fZGlzYWJsZVF1ZXN0aW9uPURvIHlvdSB3YW50IHRvIGRpc2FibGUgdGhpcyBmZWF0dXJlPwotRmVhdHVyZVN0YXRlQWN0aW9uX0VuYWJsZVF1ZXN0aW9uPURvIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzIGZlYXR1cmU/Ci1GZWF0dXJlU3RhdGVBY3Rpb25fZGlhbG9nVGl0bGU9Q3VycmVudCBDb25maWd1cmF0aW9uCi0KLUZlYXR1cmVVbmluc3RhbGxBY3Rpb25fdW5pbnN0YWxsPVVuaW5zdGFsbAotRmVhdHVyZVVuaW5zdGFsbEFjdGlvbl91bmluc3RhbGxRdWVzdGlvbj1EbyB5b3Ugd2FudCB0byB1bmluc3RhbGwgdGhpcyBmZWF0dXJlPwotRmVhdHVyZVVuaW5zdGFsbEFjdGlvbl9kaWFsb2dUaXRsZT1DdXJyZW50IENvbmZpZ3VyYXRpb24KLQotRmVhdHVyZVVuY29uZmlndXJlQW5kVW5pbnN0YWxsQWN0aW9uX3VuaW5zdGFsbD1Vbmluc3RhbGwKLUZlYXR1cmVVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEFjdGlvbl9xdWVzdGlvbj1EbyB5b3Ugd2FudCB0byBkaXNhYmxlIGFuZCB1bmluc3RhbGwgdGhpcyBmZWF0dXJlPwotRmVhdHVyZVVuY29uZmlndXJlQW5kVW5pbnN0YWxsQWN0aW9uX2RpYWxvZ1RpdGxlPVVuaW5zdGFsbAotCi1TaXRlU3RhdGVBY3Rpb25fZGlhbG9nVGl0bGU9Q3VycmVudCBDb25maWd1cmF0aW9uCi1TaXRlU3RhdGVBY3Rpb25fZGlzYWJsZUxhYmVsPURpc2FibGUKLVNpdGVTdGF0ZUFjdGlvbl9kaXNhYmxlTWVzc2FnZT1EbyB5b3Ugd2FudCB0byBkaXNhYmxlIGFsbCB0aGUgZmVhdHVyZXMgaW4gInswfSI/Ci1TaXRlU3RhdGVBY3Rpb25fZW5hYmxlTGFiZWw9RW5hYmxlCi1TaXRlU3RhdGVBY3Rpb25fZW5hYmxlTWVzc2FnZT1EbyB5b3Ugd2FudCB0byBlbmFibGUgZmVhdHVyZXMgaW4gInswfSI/Ci0KLUZpbmRVcGRhdGVzQWN0aW9uX3RyYWNrZWRQcm9ncmVzcz17MH0gezF9OiAoezJ9JSkKLUZpbmRVcGRhdGVzQWN0aW9uX2FsbEZlYXR1cmVzU2VhcmNoPUFsbCBGZWF0dXJlcwotCi1JbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uX3RpdGxlPUluc3RhbGxhdGlvbiBIaXN0b3J5Ci1JbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uX2Rlc2M9VGhlIGxpc3QgYmVsb3cgcmVwcmVzZW50cyB0aGUgaGlzdG9yeSBvZiB5b3VyIHVwZGF0ZSBhY3Rpdml0aWVzIGZyb20gdGhlIHByb2R1Y3QgaW5zdGFsbGF0aW9uIHRvIGRhdGUuIEVhY2ggb3BlcmF0aW9uIGNhcnJpZXMgYSBkYXRlIGl0IGNvbW1lbmNlZCwgYXMgd2VsbCBhcyBhY3Rpdml0aWVzIHBlcmZvcm1lZC4gT3BlcmF0aW9ucyBhcmUgc29ydGVkIGJ5IGRhdGUgaW4gYXNjZW5kaW5nIG9yZGVyLgotSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbl9kYXRlVGltZT1EYXRlIC8gVGltZQotSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbl90YXJnZXQ9VGFyZ2V0Ci1JbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uX2FjdGlvbj1BY3Rpb24KLUluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb25fc3RhdHVzPVN0YXR1cwotSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbl9lcnJvcnM9RXJyb3JzIHdoaWxlIGNyZWF0aW5nIGluc3RhbGxhdGlvbiBoaXN0b3J5IGZpbGUuCi0KLU5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uX3NlbGVjdEV4dExvY2F0aW9uPVNlbGVjdCBhbiBleHRlbnNpb24gbG9jYXRpb24uIEFuIGV4dGVuc2lvbiBsb2NhdGlvbiBpcyBhIGRpcmVjdG9yeSBuYW1lZCBlY2xpcHNlLCB3aGljaCBjb250YWlucyB0aGUgLmVjbGlwc2VleHRlbnNpb24gbWFya2VyIGZpbGUsIGFzIHdlbGwgYXMgdGhlIGZlYXR1cmVzIGFuZCBwbHVnaW5zIGZvbGRlcnMuCi1OZXdFeHRlbnNpb25Mb2NhdGlvbkFjdGlvbl9leHRJbmZvVGl0bGU9SW52YWxpZCBFeHRlbnNpb24KLU5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uX2V4dEluZm9NZXNzYWdlPVNlbGVjdGVkIGxvY2F0aW9uIGRvZXMgbm90IGNvbnRhaW4gYSBwcm9kdWN0IGV4dGVuc2lvbi4gQW4gZXh0ZW5zaW9uIHNob3VsZCBjb25zaXN0IG9mIGEgZGlyZWN0b3J5IG5hbWVkIGVjbGlwc2UsIHdoaWNoIGNvbnRhaW5zIGEgbWFya2VyIGZpbGUgY2FsbGVkIC5lY2xpcHNlZXh0ZW5zaW9uIGFuZCB0aGUgZmVhdHVyZXMgYW5kIHBsdWdpbnMgZm9sZGVycy4gIFBsZWFzZSBzZWxlY3QgYW5vdGhlciBsb2NhdGlvbi4KLQotQWN0aXZpdGllc1RhYmxlVmlld2VyX2VuYWJsZWQ9RW5hYmxlZAotQWN0aXZpdGllc1RhYmxlVmlld2VyX2ZlYXR1cmVJbnN0YWxsZWQ9RmVhdHVyZSBJbnN0YWxsZWQKLUFjdGl2aXRpZXNUYWJsZVZpZXdlcl9mZWF0dXJlUmVtb3ZlZD1GZWF0dXJlIFJlbW92ZWQKLUFjdGl2aXRpZXNUYWJsZVZpZXdlcl9zaXRlSW5zdGFsbGVkPVNpdGUgSW5zdGFsbGVkCi1BY3Rpdml0aWVzVGFibGVWaWV3ZXJfc2l0ZVJlbW92ZWQ9U2l0ZSBSZW1vdmVkCi1BY3Rpdml0aWVzVGFibGVWaWV3ZXJfZGlzYWJsZWQ9RGlzYWJsZWQKLUFjdGl2aXRpZXNUYWJsZVZpZXdlcl9yZXZlcnQ9UmV2ZXJ0Ci1BY3Rpdml0aWVzVGFibGVWaWV3ZXJfcmVjb25jaWxlPVJlY29uY2lsZQotQWN0aXZpdGllc1RhYmxlVmlld2VyX3Vua25vd249dW5rbm93bgotQWN0aXZpdGllc1RhYmxlVmlld2VyX2RhdGU9RGF0ZQotQWN0aXZpdGllc1RhYmxlVmlld2VyX3RhcmdldD1UYXJnZXQKLUFjdGl2aXRpZXNUYWJsZVZpZXdlcl9hY3Rpb249QWN0aW9uCi0KLQotRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nX3RpdGxlID0gRHVwbGljYXRlIENvbmZsaWN0cwotRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nX21lc3NhZ2UgPSBJZiB5b3UgY29udGludWUgd2l0aCB0aGUgdXBkYXRlL2luc3RhbGwsIFwKLXRoZSByZXN1bHRpbmcgY29uZmlndXJhdGlvbiB3aWxsIGNvbnRhaW4gZHVwbGljYXRpb24gY29uZmxpY3RzIFwKLXRoYXQgbWF5IGNhdXNlIHBhcnRzIG9mIHRoZSBwcm9kdWN0IHRvIGJlIHVudXNhYmxlLiBEbyB5b3Ugd2FudCB0byBcCi1jb250aW51ZT8KLUR1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZ190cmVlTGFiZWwgPSAmRGV0ZWN0ZWQgY29uZmxpY3RzOgotCi0KLU1vZGVTZWxlY3Rpb25QYWdlX3RpdGxlPUZlYXR1cmUgVXBkYXRlcwotTW9kZVNlbGVjdGlvblBhZ2VfZGVzYz1DaG9vc2UgdGhlIHdheSB5b3Ugd2FudCB0byBzZWFyY2ggZm9yIGZlYXR1cmVzIHRvIGluc3RhbGwKLU1vZGVTZWxlY3Rpb25QYWdlX3VwZGF0ZXM9U2VhcmNoIGZvciAmdXBkYXRlcyBvZiB0aGUgY3VycmVudGx5IGluc3RhbGxlZCBmZWF0dXJlcwotTW9kZVNlbGVjdGlvblBhZ2VfdXBkYXRlc1RleHQ9U2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIHNlYXJjaCBmb3IgdXBkYXRlcyBvZiB0aGUgZmVhdHVyZXMgeW91IGFscmVhZHkgaGF2ZSBpbnN0YWxsZWQuCi1Nb2RlU2VsZWN0aW9uUGFnZV9uZXdGZWF0dXJlcz0mU2VhcmNoIGZvciBuZXcgZmVhdHVyZXMgdG8gaW5zdGFsbAotTW9kZVNlbGVjdGlvblBhZ2VfbmV3RmVhdHVyZXNUZXh0PVNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byBpbnN0YWxsIG5ldyBmZWF0dXJlcyBmcm9tIGV4aXN0aW5nIG9yIG5ldyB1cGRhdGUgc2l0ZXMuIFwKLVNvbWUgc2l0ZXMgbWF5IGFscmVhZHkgYmUgYXZhaWxhYmxlLiBZb3UgY2FuIGFkZCBuZXcgdXBkYXRlIHNpdGUgVVJMcyB0byB0aGUgc2VhcmNoLgotCi1Nb3JlSW5mb0dlbmVyYXRvcl9tb3JlSW5mbz1Nb3JlIGluZm8uLi4KLQotTmV3VXBkYXRlU2l0ZURpYWxvZ19uYW1lPU5hbWU6Ci1OZXdVcGRhdGVTaXRlRGlhbG9nX3VybD1VUkw6Ci1OZXdVcGRhdGVTaXRlRGlhbG9nX2Vycm9yX25hbWVPclVybE5vdFNwZWNpZmllZD1Cb3RoIG5hbWUgYW5kIHVybCBoYXZlIHRvIGJlIHNwZWNpZmllZAotTmV3VXBkYXRlU2l0ZURpYWxvZ19lcnJvcl9kdXBsaWNhdGVOYW1lPVRoaXMgbmFtZSBpcyBhbHJlYWR5IGluIHVzZQotTmV3VXBkYXRlU2l0ZURpYWxvZ19lcnJvcl9kdXBsaWNhdGVVcmw9VGhpcyBVUkwgaXMgYWxyZWFkeSBkZWZpbmVkIHVuZGVyIG5hbWUgezB9Ci1OZXdVcGRhdGVTaXRlRGlhbG9nX2Vycm9yX2luY29ycmVjdFVybD1VUkwgaXMgbm90IGNvcnJlY3QKLQotSW5zdGFsbFdpemFyZF9pc1J1bm5pbmdUaXRsZT1JbnN0YWxsL1VwZGF0ZSBpbiBwcm9ncmVzcwotSW5zdGFsbFdpemFyZF9pc1J1bm5pbmdJbmZvPUFub3RoZXIgaW5zdGFsbC91cGRhdGUgam9iIGlzIGluIHByb2dyZXNzLiBQbGVhc2UgY2FuY2VsIGl0IGFuZCB0aGVuIHJlLWxhdW5jaCB0aGlzIGFjdGlvbi4KLUluc3RhbGxXaXphcmRfam9iTmFtZT1VcGRhdGUgTWFuYWdlcgotSW5zdGFsbFdpemFyZF9kb3dubG9hZD1Eb3dubG9hZCBhbmQgaW5zdGFsbCBzZWxlY3RlZCBmZWF0dXJlcy4KLUluc3RhbGxXaXphcmRfZG93bmxvYWRpbmdGZWF0dXJlSmFyPURvd25sb2FkaW5nIGZlYXR1cmUgamFyIGZvciB7MH0KLUluc3RhbGxXaXphcmRfYW5vdGhlckpvYiA9IFRoZXJlIGlzIGFub3RoZXIgdXBkYXRlL2luc3RhbGwgdGFzayBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kLiBEbyB5b3Ugd2FudCB0byBraWxsIGl0IGFuZCBjb250aW51ZSB0aGUgY3VycmVudCB0YXNrcyBpbnN0ZWFkPwotSW5zdGFsbFdpemFyZF9hbm90aGVySm9iVGl0bGU9SW5zdGFsbGVyIGlzIHJ1bm5pbmcKLUluc3RhbGxXaXphcmRfd3RpdGxlPUluc3RhbGwKLUluc3RhbGxXaXphcmRfT3B0aW9uYWxGZWF0dXJlc1BhZ2VfdGl0bGU9IE9wdGlvbmFsIEZlYXR1cmVzCi1JbnN0YWxsV2l6YXJkX09wdGlvbmFsRmVhdHVyZXNQYWdlX2Rlc2MgPSBTb21lIG9mIHRoZSBmZWF0dXJlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGlzIGZlYXR1cmUgYXJlIG9wdGlvbmFsLgotSW5zdGFsbFdpemFyZF9PcHRpb25hbEZlYXR1cmVzUGFnZV90cmVlTGFiZWwgPSAmQXZhaWxhYmxlIG9wdGlvbmFsIGZlYXR1cmVzOgotSW5zdGFsbFdpemFyZF9PcHRpb25hbEZlYXR1cmVzUGFnZV9zZWxlY3RBbGwgPSAmU2VsZWN0IEFsbAotSW5zdGFsbFdpemFyZF9PcHRpb25hbEZlYXR1cmVzUGFnZV9kZXNlbGVjdEFsbCA9ICZEZXNlbGVjdCBBbGwKLQotSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX2NvdW50ZXIgPSB7MH0gb2YgezF9IHNlbGVjdGVkLgotSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX3RpdGxlPVNlYXJjaCBSZXN1bHRzCi1JbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfZGVzYz1TZWxlY3QgZmVhdHVyZXMgdG8gaW5zdGFsbCBmcm9tIHRoZSBzZWFyY2ggcmVzdWx0IGxpc3QuCi1JbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfemVyb1VwZGF0ZXM9Tm8gdXBkYXRlcyBmb3IgdGhlIGN1cnJlbnRseSBpbnN0YWxsZWQgZmVhdHVyZShzKSBmb3VuZCwgdHJ5IGFnYWluIGxhdGVyLgotSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX3plcm9GZWF0dXJlcz1ObyBmZWF0dXJlcyBmb3VuZCBvbiB0aGUgc2VsZWN0ZWQgc2l0ZShzKS4gQ2hvb3NlIGEgZGlmZmVyZW50IHNpdGUgb3Igc2l0ZSBjYXRlZ29yeS4KLUluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9sYWJlbD1TZWxlY3QgdGhlIGZlYXR1cmVzIHRvICZpbnN0YWxsOgotSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX2Rlc2VsZWN0QWxsPSZEZXNlbGVjdCBBbGwKLUluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9tb3JlSW5mbz0mTW9yZSBJbmZvCi1JbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfcHJvcGVydGllcz0mUHJvcGVydGllcwotSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX3NlbGVjdFJlcXVpcmVkPSZTZWxlY3QgUmVxdWlyZWQKLUluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9zaG93U3RhdHVzPSZFcnJvciBEZXRhaWxzLi4uCi1JbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfZmlsdGVyRmVhdHVyZXM9XCBGaWwmdGVyIGZlYXR1cmVzIGluY2x1ZGVkIGluIG90aGVyIGZlYXR1cmVzIG9uIHRoZSBsaXN0Ci1JbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfZmlsdGVyUGF0Y2hlcz1cIEZpbCZ0ZXIgcGF0Y2hlcyBpbmNsdWRlZCBpbiBvdGhlciBwYXRjaGVzIG9uIHRoZSBsaXN0Ci1JbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfZmlsdGVyT2xkZXJGZWF0dXJlcz1cIFNob3cgdGhlIGxhdGVzdCAmdmVyc2lvbiBvZiBhIGZlYXR1cmUgb25seQotSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX2ludmFsaWRfbG9uZz1JbnZhbGlkIGNvbWJpbmF0aW9uIC0gc2VsZWN0IFwiU2hvdyBTdGF0dXMuLi5cIiBmb3IgZGV0YWlscy4KLUluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9pbnZhbGlkX3Nob3J0PUludmFsaWQgY29tYmluYXRpb24KLUluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9jeWNsZT1DeWNsZSBzdGFydGluZyBhdCB7MH0KLQotSW5zdGFsbFdpemFyZF9MaWNlbnNlUGFnZV9hY2NlcHQgPSBJICZhY2NlcHQgdGhlIHRlcm1zIGluIHRoZSBsaWNlbnNlIGFncmVlbWVudAotSW5zdGFsbFdpemFyZF9MaWNlbnNlUGFnZV9hY2NlcHQyID0gSSAmYWNjZXB0IHRoZSB0ZXJtcyBpbiB0aGUgbGljZW5zZSBhZ3JlZW1lbnRzCi1JbnN0YWxsV2l6YXJkX0xpY2Vuc2VQYWdlX2RlY2xpbmUgPSBJICZkbyBub3QgYWNjZXB0IHRoZSB0ZXJtcyBpbiB0aGUgbGljZW5zZSBhZ3JlZW1lbnQKLUluc3RhbGxXaXphcmRfTGljZW5zZVBhZ2VfZGVjbGluZTIgPSBJICZkbyBub3QgYWNjZXB0IHRoZSB0ZXJtcyBpbiB0aGUgbGljZW5zZSBhZ3JlZW1lbnRzCi1JbnN0YWxsV2l6YXJkX0xpY2Vuc2VQYWdlX2Rlc2MgPSBUaGlzIGZlYXR1cmUgaGFzIGEgbGljZW5zZSBcCi1hZ3JlZW1lbnQgdGhhdCB5b3UgbmVlZCB0byBhY2NlcHQgYmVmb3JlIHByb2NlZWRpbmcgd2l0aCBcCi10aGUgaW5zdGFsbGF0aW9uLgotSW5zdGFsbFdpemFyZF9MaWNlbnNlUGFnZV9kZXNjMiA9IFNvbWUgb2YgdGhlIGZlYXR1cmVzIGhhdmUgbGljZW5zZSBcCi1hZ3JlZW1lbnRzIHRoYXQgeW91IG5lZWQgdG8gYWNjZXB0IGJlZm9yZSBwcm9jZWVkaW5nIHdpdGggXAotdGhlIGluc3RhbGxhdGlvbi4KLUluc3RhbGxXaXphcmRfTGljZW5zZVBhZ2VfdGl0bGUgPSBGZWF0dXJlIExpY2Vuc2UKLQotSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX3RpdGxlID0gSW5zdGFsbGF0aW9uCi1JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfZGVzYyA9IFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgd2lsbCBiZSBpbnN0YWxsZWQuIFlvdSBjYW4gc2VsZWN0IGEgZmVhdHVyZSBhbmQgY2hhbmdlIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgZmVhdHVyZSB3aWxsIGJlIGluc3RhbGxlZC4KLUluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9qb2JzTGFiZWwgPSBGZWF0dXJlcyB0byAmaW5zdGFsbDoKLUluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9zaXRlTGFiZWwgPSBBJnZhaWxhYmxlIGluc3RhbGxhdGlvbiBsb2NhdGlvbnM6Ci1JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfbmV3ID0gJkFkZCBMb2NhdGlvbi4uLgotSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX2RlbGV0ZSA9ICZSZW1vdmUgTG9jYXRpb24KLUluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9yZXF1aXJlZFNwYWNlID0gUmVxdWlyZWQgc3BhY2U6Ci1JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfYXZhaWxhYmxlU3BhY2UgPSBGcmVlIHNwYWNlOgotSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX2xvY2F0aW9uID0gSW5zdGFsbCBMb2NhdGlvbjoKLUluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9sb2NhdGlvbl9jaGFuZ2UgPSBDaGFuZ2UgTG9jYXRpb24gLi4uCi1JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfbG9jYXRpb25fbWVzc2FnZSA9IFNlbGVjdCBhIG5ldyBpbnN0YWxsIGxvY2F0aW9uCi1JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfbG9jYXRpb25fZW1wdHkgPSBUYXJnZXQgaW5zdGFsbCBsb2NhdGlvbiBtdXN0IGJlIHNlbGVjdGVkLiBJZiBub25lIGlzIGF2YWlsYWJsZSwgY3JlYXRlIGEgbmV3IG9uZS4KLUluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9sb2NhdGlvbl9lcnJvcl90aXRsZSA9IEludmFsaWQgTG9jYXRpb24KLUluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9zaXplX0tCID0gezB9IEtCCi1JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2Vfc2l6ZV9NQiA9IHswfSBNQgotSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX3NpemVfR0IgPSB7MH0gR0IKLUluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV91bmtub3duU2l6ZSA9IFVua25vd24KLUluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9wYXRjaEVycm9yID0gUGF0Y2ggInswfSIgbXVzdCBiZSBpbnN0YWxsZWQgaW4gdGhlIHNhbWUgbG9jYXRpb24gYXMgInsxfSIKLUluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9wYXRjaEVycm9yMiA9IFBhdGNoICJ7MH0iIG11c3QgYmUgaW5zdGFsbGVkIGluIHRoZSBzYW1lIGxvY2F0aW9uIGFzICJ7MX0iIDogezJ9Ci1JbnN0YWxsV2l6YXJkMl91cGRhdGVPcGVyYXRpb25IYXNGYWlsZWQ9IFVwZGF0ZSBvcGVyYXRpb24gaGFzIGZhaWxlZAotCi1SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkX3d0aXRsZT1SZXZlcnQgdG8gYSBQcmV2aW91cyBDb25maWd1cmF0aW9uCi1SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZV90aXRsZT1SZXZlcnQgdG8gYSBQcmV2aW91cyBDb25maWd1cmF0aW9uCi1SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9kZXNjPUNob29zZSBhIHN0YWJsZSBjb25maWd1cmF0aW9uIHRvIHdoaWNoIHlvdSB3b3VsZCBsaWtlIHRvIHJldmVydAotUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZFBhZ2VfbGFiZWw9JlBhc3QgY29uZmlndXJhdGlvbnM6Ci1SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9hY3Rpdml0aWVzPSZBY3Rpdml0aWVzIHRoYXQgY2F1c2VkIHRoZSBjcmVhdGlvbiBvZiB0aGlzIGNvbmZpZ3VyYXRpb246Ci1SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9xdWVzdGlvbj1UaGlzIG9wZXJhdGlvbiByZXF1aXJlcyByZXN0YXJ0aW5nIHRoZSB3b3JrYmVuY2guICBXb3VsZCB5b3UgbGlrZSB0byBwcm9jZWVkPwotCi1SZXZlcnRfUHJvYmxlbURpYWxvZ190aXRsZSA9IFJlc3RvcmUgUHJvYmxlbXMKLQotU2hvd0FjdGl2aXRpZXNEaWFsb2dfdGl0bGUgPSBDdXJyZW50IENvbmZpZ3VyYXRpb24KLVNob3dBY3Rpdml0aWVzRGlhbG9nX2RhdGUgPSBEYXRlOgotU2hvd0FjdGl2aXRpZXNEaWFsb2dfbG9jID0gTG9jYXRpb246Ci1TaG93QWN0aXZpdGllc0RpYWxvZ19sYWJlbCA9IEFjdGl2aXRpZXMgdGhhdCBjYXVzZWQgdGhlIGNyZWF0aW9uIG9mIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb246Ci0KLVNpdGVQYWdlX3RpdGxlPVVwZGF0ZSBzaXRlcyB0byB2aXNpdAotU2l0ZVBhZ2VfZGVzYz1TZWxlY3QgdXBkYXRlIHNpdGVzIHRvIHZpc2l0IHdoaWxlIGxvb2tpbmcgZm9yIG5ldyBmZWF0dXJlcy4KLVNpdGVQYWdlX2xhYmVsPSZTaXRlcyB0byBpbmNsdWRlIGluIHNlYXJjaDoKLVNpdGVQYWdlX2FkZFVwZGF0ZVNpdGU9TmV3IFJlbW8mdGUgU2l0ZS4uLgotU2l0ZVBhZ2VfYWRkTG9jYWxTaXRlPU5ldyAmTG9jYWwgU2l0ZS4uLgotU2l0ZVBhZ2VfYWRkTG9jYWxaaXBwZWRTaXRlPU5ldyAmQXJjaGl2ZWQgU2l0ZS4uLgotU2l0ZVBhZ2VfZWRpdD0mRWRpdC4uLgotU2l0ZVBhZ2VfcmVtb3ZlPSZSZW1vdmUKLVNpdGVQYWdlX2ltcG9ydD1JJm1wb3J0IHNpdGVzLi4uCi1TaXRlUGFnZV9leHBvcnQ9RSZ4cG9ydCBzaXRlcy4uLgotU2l0ZVBhZ2VfaWdub3JlPSZJZ25vcmUgZmVhdHVyZXMgbm90IGFwcGxpY2FibGUgdG8gdGhpcyBlbnZpcm9ubWVudAotU2l0ZVBhZ2VfYXV0b21hdGljYWxseVNlbGVjdE1pcnJvcnM9QXV0b21hdGljYWxseSBzZWxlY3QgJm1pcnJvcnMKLVNpdGVQYWdlX25ldz1OZXcgVXBkYXRlIFNpdGUKLVNpdGVQYWdlX2RpYWxvZ0VkaXRMb2NhbD1FZGl0IExvY2FsIFNpdGUKLVNpdGVQYWdlX2RpYWxvZ0VkaXRVcGRhdGVTaXRlPUVkaXQgUmVtb3RlIFNpdGUKLVNpdGVQYWdlX3JlbW92ZV9sb2NhdGlvbl9jb25mX3RpdGxlPVJlbW92ZSBMb2NhdGlvbgotU2l0ZVBhZ2VfcmVtb3ZlX2xvY2F0aW9uX2NvbmY9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZSB0aGlzIGxvY2F0aW9uPwotCi0KLUxvY2FsU2l0ZVNlbGVjdG9yX2RpYWxvZ01lc3NhZ2U9U2VsZWN0IGEgbG9jYWwgdXBkYXRlIHNpdGUuCi1Mb2NhbFNpdGVTZWxlY3Rvcl9kaXJJbmZvVGl0bGU9SW52YWxpZCBTaXRlCi1Mb2NhbFNpdGVTZWxlY3Rvcl9kaXJJbmZvTWVzc2FnZT1TZWxlY3RlZCBsb2NhdGlvbiBkb2VzIG5vdCBjb250YWluIGFuIHVwZGF0ZSBzaXRlLiAgUGxlYXNlIHNlbGVjdCBhbm90aGVyIGxvY2F0aW9uLgotTG9jYWxTaXRlU2VsZWN0b3JfZGlyRHVwbGljYXRlRGVmaW5pdGlvbj1TZWxlY3RlZCBsb2NhdGlvbiBpcyBhbHJlYWR5IGRlZmluZWQgdW5kZXIgYW5vdGhlciBuYW1lLiAgUGxlYXNlIHNlbGVjdCBhbm90aGVyIGxvY2F0aW9uLgotTG9jYWxTaXRlU2VsZWN0b3JfZGlhbG9nTWVzc2FnZXppcD1TZWxlY3QgTG9jYWwgU2l0ZSBBcmNoaXZlCi1Mb2NhbFNpdGVTZWxlY3Rvcl96aXBJbmZvVGl0bGU9SW52YWxpZCBTaXRlCi1Mb2NhbFNpdGVTZWxlY3Rvcl96aXBJbmZvTWVzc2FnZT1TZWxlY3RlZCBhcmNoaXZlIGRvZXMgbm90IGNvbnRhaW4gYW4gdXBkYXRlIHNpdGUuICBQbGVhc2Ugc2VsZWN0IGFub3RoZXIgYXJjaGl2ZS4KLUxvY2FsU2l0ZVNlbGVjdG9yX3ppcER1cGxpY2F0ZURlZmluaXRpb249U2VsZWN0ZWQgYXJjaGl2ZSBpcyBhbHJlYWR5IGRlZmluZWQgdW5kZXIgYW5vdGhlciBuYW1lLiAgUGxlYXNlIHNlbGVjdCBhbm90aGVyIGFyY2hpdmUuCi1Mb2NhbFNpdGVTZWxlY3Rvcl9kaWFsb2dNZXNzYWdlSW1wb3J0PUltcG9ydCBTaXRlcyBCb29rbWFya3MKLUxvY2FsU2l0ZVNlbGVjdG9yX2ltcG9ydEluZm9UaXRsZT1JbnZhbGlkIEJvb2ttYXJrcyBGaWxlCi1Mb2NhbFNpdGVTZWxlY3Rvcl9pbXBvcnRJbmZvTWVzc2FnZT1TZWxlY3RlZCBmaWxlIGRvZXMgbm90IGNvbnRhaW4gdXBkYXRlIHNpdGVzIGJvb2ttYXJrcy4gIFBsZWFzZSBzZWxlY3QgYW5vdGhlciBmaWxlLgotTG9jYWxTaXRlU2VsZWN0b3JfZGlhbG9nTWVzc2FnZUV4cG9ydD1FeHBvcnQgU2l0ZXMgQm9va21hcmtzCi0KLQotTWlzc2luZ0ZlYXR1cmVfaWQgPSB1bmtub3duCi1NaXNzaW5nRmVhdHVyZV9wcm92aWRlciA9IE4vQQotTWlzc2luZ0ZlYXR1cmVfZGVzY191bmtub3duID0gVGhlIGZlYXR1cmUgd2FzIG5vdCBsb2FkZWQgZHVlIHRvIGVycm9ycy4gT3BlbiBmZWF0dXJlIHByb3BlcnRpZXMgZm9yIGRldGFpbHMuCi1NaXNzaW5nRmVhdHVyZV9kZXNjX29wdGlvbmFsID0gVGhpcyBvcHRpb25hbCBmZWF0dXJlIGhhcyBub3QgYmVlbiBpbnN0YWxsZWQuCi1Td2FwRmVhdHVyZVdpemFyZF90aXRsZT1SZXBsYWNlIFdpdGggQW5vdGhlciBWZXJzaW9uCi1Td2FwRmVhdHVyZVdpemFyZFBhZ2VfdGl0bGU9UmVwbGFjZSBXaXRoIEFub3RoZXIgVmVyc2lvbgotU3dhcEZlYXR1cmVXaXphcmRQYWdlX2Rlc2M9RGlzYWJsZSB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBmZWF0dXJlIGFuZCByZXBsYWNlIGl0IHdpdGggb25lIG9mIHRoZSB2ZXJzaW9ucyBmcm9tIHRoZSBsaXN0Ci1Td2FwRmVhdHVyZVdpemFyZFBhZ2VfbGFiZWw9JkF2YWlsYWJsZSBkaXNhYmxlZCB2ZXJzaW9uczoKLQotTWlycm9yc0RpYWxvZ190ZXh0PVRoZSBjb250ZW50IG9mIHRoZSB1cGRhdGUgc2l0ZSAiezB9IiBpcyBhbHNvIGF2YWlsYWJsZSBvbiB0aGUgbWlycm9ycyBsaXN0ZWQgYmVsb3cuIFlvdSBtYXkgY2hvb3NlIHRvIHNlbGVjdCBhIG1pcnJvciBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHVwZGF0ZSBzaXRlLgotTWlycm9yc0RpYWxvZ190aXRsZT1VcGRhdGUgU2l0ZSBNaXJyb3JzCi0KLUF1dG9tYXRpY1VwZGF0ZXNKb2JfVXBkYXRlcz1VcGRhdGVzCi1BdXRvbWF0aWNVcGRhdGVzSm9iX0VjbGlwc2VVcGRhdGVzMT1BdXRvbWF0aWMgVXBkYXRlcwotQXV0b21hdGljVXBkYXRlc0pvYl9VcGRhdGVzQXZhaWxhYmxlPU5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuIERvIHlvdSB3YW50IHRvIHJldmlldyBhbmQgaW5zdGFsbCB0aGVtIG5vdz8KLUF1dG9tYXRpY1VwZGF0ZXNKb2JfRWNsaXBzZVVwZGF0ZXMyPUF1dG9tYXRpYyBVcGRhdGVzCi1BdXRvbWF0aWNVcGRhdGVzSm9iX1VwZGF0ZXNEb3dubG9hZGVkPU5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUgYW5kIGRvd25sb2FkZWQuIERvIHlvdSB3YW50IHRvIHJldmlldyBhbmQgaW5zdGFsbCB0aGVtIG5vdz8KLQotRmVhdHVyZVBhZ2Vfb3B0aW9uYWxJbnN0YWxsX3RpdGxlID0gT3B0aW9uYWwgSW5zdGFsbAotUmV2aWV3UGFnZV92YWxpZGF0aW5nPVZhbGlkYXRpbmcgc2VsZWN0aW9uLi4uCi1UYXJnZXRQYWdlX0ZlYXR1cmVOYW1lQ29sdW1uPUZlYXR1cmUgTmFtZQotVGFyZ2V0UGFnZV9GZWF0dXJlX1ZlcnNpb249RmVhdHVyZSBWZXJzaW9uCi1UYXJnZXRQYWdlX0ZlYXR1cmVfU2l6ZT1GZWF0dXJlIFNpemUKLVRhcmdldFBhZ2VfSW5zdGFsbGF0aW9uRGlyZWN0b3J5Q29sdW1uPUluc3RhbGxhdGlvbiBEaXJlY3RvcnkKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9Cb29rbWFya0ZvbGRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0Jvb2ttYXJrRm9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNjVmOWUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0Jvb2ttYXJrRm9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotcHVibGljIGNsYXNzIEJvb2ttYXJrRm9sZGVyIGV4dGVuZHMgTmFtZWRNb2RlbE9iamVjdCB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICBwcm90ZWN0ZWQgQXJyYXlMaXN0IGNoaWxkcmVuPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHVibGljIEJvb2ttYXJrRm9sZGVyKCkgewotCX0KLQkKLQlwdWJsaWMgQm9va21hcmtGb2xkZXIoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQlyZXR1cm4gY2hpbGRyZW4uc2l6ZSgpPjA7Ci0JfSAKLQkKLQlwdWJsaWMgdm9pZCBhZGRDaGlsZChOYW1lZE1vZGVsT2JqZWN0IG9iamVjdCkgewotCQlpbnRlcm5hbEFkZChvYmplY3QpOwotCQlub3RpZnlPYmplY3RzQWRkZWQodGhpcywgbmV3IE9iamVjdFtdIHtvYmplY3R9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZHJlbihOYW1lZE1vZGVsT2JqZWN0IFtdIG9iamVjdHMpIHsKLQkJZm9yIChpbnQgaT0wOyBpPG9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCWludGVybmFsQWRkKG9iamVjdHNbaV0pOwotCQl9Ci0JCW5vdGlmeU9iamVjdHNBZGRlZCh0aGlzLCBvYmplY3RzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxBZGQoTmFtZWRNb2RlbE9iamVjdCBjaGlsZCkgewotCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQljaGlsZC5zZXRNb2RlbChnZXRNb2RlbCgpKTsKLQkJY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZHJlbihOYW1lZE1vZGVsT2JqZWN0IFtdIG9iamVjdHMpIHsKLQkJZm9yIChpbnQgaT0wOyBpPG9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCWNoaWxkcmVuLnJlbW92ZShvYmplY3RzW2ldKTsKLQkJCW9iamVjdHNbaV0uc2V0UGFyZW50KG51bGwpOwotCQl9Ci0JCW5vdGlmeU9iamVjdHNSZW1vdmVkKHRoaXMsIG9iamVjdHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9Cb29rbWFya1V0aWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9Cb29rbWFya1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNmNDYwNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvQm9va21hcmtVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotCi1wdWJsaWMgY2xhc3MgQm9va21hcmtVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvY3VtZW50QnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFyc2UoU3RyaW5nIGZpbGVOYW1lLCBWZWN0b3IgYm9va21hcmtzKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCi0JCXRyeSB7Ci0JCQlkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCQkJRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9IGRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQlEb2N1bWVudCBkb2MgPSBwYXJzZXIucGFyc2UoZmlsZSk7Ci0JCQlOb2RlIHJvb3QgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQlwcm9jZXNzUm9vdChyb290LCBib29rbWFya3MpOwotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTaXRlQm9va21hcmtbXSBnZXRCb29rbWFya3MoVmVjdG9yIGJvb2ttYXJrcykgewotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJvb2ttYXJrcy5zaXplKCk7IGkrKykgewotCQkJcHJvY2Vzc0VudHJ5KGJvb2ttYXJrcy5nZXQoaSksIHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIChTaXRlQm9va21hcmtbXSkgcmVzdWx0LnRvQXJyYXkobmV3IFNpdGVCb29rbWFya1tyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBCb29rbWFya0ZvbGRlciBnZXRGb2xkZXIoVmVjdG9yIGJvb2ttYXJrcywgSVBhdGggcGF0aCkgewotCQlOYW1lZE1vZGVsT2JqZWN0IG9iamVjdCA9IGZpbmQoYm9va21hcmtzLCBwYXRoKTsKLQkJaWYgKG9iamVjdCAhPSBudWxsICYmIG9iamVjdCBpbnN0YW5jZW9mIEJvb2ttYXJrRm9sZGVyKQotCQkJcmV0dXJuIChCb29rbWFya0ZvbGRlcikgb2JqZWN0OwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE5hbWVkTW9kZWxPYmplY3QgZmluZChWZWN0b3IgYm9va21hcmtzLCBJUGF0aCBwYXRoKSB7Ci0JCU9iamVjdFtdIGFycmF5ID0gYm9va21hcmtzLnRvQXJyYXkoKTsKLQkJcmV0dXJuIGZpbmQoYXJyYXksIHBhdGgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIE5hbWVkTW9kZWxPYmplY3QgZmluZChPYmplY3RbXSBhcnJheSwgSVBhdGggcGF0aCkgewotCQlTdHJpbmcgbmFtZSA9IHBhdGguc2VnbWVudCgwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJTmFtZWRNb2RlbE9iamVjdCBvYmogPSAoTmFtZWRNb2RlbE9iamVjdCkgYXJyYXlbaV07Ci0JCQlpZiAob2JqLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQm9va21hcmtGb2xkZXIpIHsKLQkJCQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJCQlJUGF0aCBjaGlsZFBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7Ci0JCQkJCQlCb29rbWFya0ZvbGRlciBmb2xkZXIgPSAoQm9va21hcmtGb2xkZXIpIG9iajsKLQkJCQkJCXJldHVybiBmaW5kKGZvbGRlci5nZXRDaGlsZHJlbihudWxsKSwgY2hpbGRQYXRoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gb2JqOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc1Jvb3QoTm9kZSByb290LCBWZWN0b3IgYm9va21hcmtzKSB7Ci0JCWlmIChyb290LmdldE5vZGVOYW1lKCkuZXF1YWxzKCJib29rbWFya3MiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHJvb3QuZ2V0Q2hpbGROb2RlcygpOwotCQkJcHJvY2Vzc0NoaWxkcmVuKGNoaWxkcmVuLCBudWxsLCBib29rbWFya3MpOwotCQl9Ci0JfQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc0NoaWxkcmVuKAotCQlOb2RlTGlzdCBjaGlsZHJlbiwKLQkJQm9va21hcmtGb2xkZXIgZm9sZGVyLAotCQlWZWN0b3IgYm9va21hcmtzKSB7Ci0JCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQlOYW1lZE1vZGVsT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCWlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscygic2l0ZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJb2JqZWN0ID0gY3JlYXRlU2l0ZShjaGlsZCk7Ci0JCQkJfSBlbHNlIGlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscygiZm9sZGVyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlvYmplY3QgPSBjcmVhdGVGb2xkZXIoY2hpbGQpOwotCQkJCX0gCi0JCQl9Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlpZiAoZm9sZGVyICE9IG51bGwpIHsKLQkJCQkJZm9sZGVyLmFkZENoaWxkKG9iamVjdCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYm9va21hcmtzLmFkZChvYmplY3QpOwotCQkJCX0KLQkJCQlvYmplY3Quc2V0TW9kZWwobW9kZWwpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU2l0ZUJvb2ttYXJrIGNyZWF0ZVNpdGUoTm9kZSBjaGlsZCkgewotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShjaGlsZCwgIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQlVUkwgdXJsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXVybCA9IG5ldyBVUkwoZ2V0QXR0cmlidXRlKGNoaWxkLCAidXJsIikpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQlTdHJpbmcgd2ViID0gZ2V0QXR0cmlidXRlKGNoaWxkLCAid2ViIik7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiB3ZWJCb29rbWFyayA9ICh3ZWIgIT0gbnVsbCAmJiB3ZWIuZXF1YWxzKCJ0cnVlIikpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIHNlbCA9IGdldEF0dHJpYnV0ZShjaGlsZCwgInNlbGVjdGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBzZWxlY3RlZCA9IChzZWwgIT0gbnVsbCAmJiBzZWwuZXF1YWxzKCJ0cnVlIikpOyAvLyROT04tTkxTLTEkCi0KLQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gbmV3IFNpdGVCb29rbWFyayhuYW1lLCB1cmwsIHdlYkJvb2ttYXJrLCBzZWxlY3RlZCk7Ci0KLQkJU3RyaW5nIGxvY2FsID0gZ2V0QXR0cmlidXRlKGNoaWxkLCAibG9jYWwiKTsgLy8kTk9OLU5MUy0xJAotCQlib29rbWFyay5zZXRMb2NhbChsb2NhbCAhPSBudWxsICYmIGxvY2FsLmVxdWFscygidHJ1ZSIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBpZ24gPSBnZXRBdHRyaWJ1dGUoY2hpbGQsICJpZ25vcmVkLWNhdGVnb3JpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaWduICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciBzdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihpZ24sICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCUFycmF5TGlzdCBhcnJheSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXdoaWxlIChzdG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyB0b2sgPSBzdG9rLm5leHRUb2tlbigpOwotCQkJCWFycmF5LmFkZCh0b2spOwotCQkJfQotCQkJYm9va21hcmsuc2V0SWdub3JlZENhdGVnb3JpZXMoKFN0cmluZ1tdKSBhcnJheS50b0FycmF5KG5ldyBTdHJpbmdbYXJyYXkuc2l6ZSgpXSkpOwotCQl9Ci0JCS8vIHJlYWQgZGVzY3JpcHRpb24KLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBjaGlsZC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBub2RlID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlib29rbWFyay5zZXREZXNjcmlwdGlvbihjcmVhdGVEZXNjcmlwdGlvbihub2RlKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJvb2ttYXJrOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVEZXNjcmlwdGlvbihOb2RlIGNoaWxkKSB7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0JCU5vZGVMaXN0IGNoaWxkcmVuID0gY2hpbGQuZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAKLQkJCQlkZXNjcmlwdGlvbiArPSBub2RlLmdldE5vZGVWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkJCi0JcHJpdmF0ZSBzdGF0aWMgQm9va21hcmtGb2xkZXIgY3JlYXRlRm9sZGVyKE5vZGUgY2hpbGQpIHsKLQkJQm9va21hcmtGb2xkZXIgZm9sZGVyID0gbmV3IEJvb2ttYXJrRm9sZGVyKCk7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKGNoaWxkLCAibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCWZvbGRlci5zZXROYW1lKG5hbWUpOwotCQlpZiAoY2hpbGQuaGFzQ2hpbGROb2RlcygpKQotCQkJcHJvY2Vzc0NoaWxkcmVuKGNoaWxkLmdldENoaWxkTm9kZXMoKSwgZm9sZGVyLCBudWxsKTsKLQkJcmV0dXJuIGZvbGRlcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc3RvcmUoU3RyaW5nIGZpbGVOYW1lLCBWZWN0b3IgYm9va21hcmtzKSB7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKLQkJT3V0cHV0U3RyZWFtV3JpdGVyIG9zdyA9IG51bGw7Ci0JCVByaW50V3JpdGVyIHdyaXRlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlTmFtZSk7Ci0JCQlvc3cgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGZvcywgIlVURjgiKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG9zdyk7Ci0JCQl3cml0ZXIucHJpbnRsbigiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci5wcmludGxuKCI8Ym9va21hcmtzPiIpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJvb2ttYXJrcy5zaXplKCk7IGkrKykgewotCQkJCU9iamVjdCBvYmogPSBib29rbWFya3MuZ2V0KGkpOwotCQkJCXdyaXRlT2JqZWN0KCIgICAiLCBvYmosIHdyaXRlcik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUsIGZhbHNlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXdyaXRlci5wcmludGxuKCI8L2Jvb2ttYXJrcz4iKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCQl3cml0ZXIuY2xvc2UoKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKG9zdyAhPSBudWxsKQotCQkJCQlvc3cuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUxLCBmYWxzZSk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCWlmIChmb3MgIT0gbnVsbCkKLQkJCQkJZm9zLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMikgewotCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlMiwgZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVPYmplY3QoCi0JCVN0cmluZyBpbmRlbnQsCi0JCU9iamVjdCBvYmosCi0JCVByaW50V3JpdGVyIHdyaXRlcikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKSB7Ci0JCQlTaXRlQm9va21hcmsgYm9va21hcmsgPSAoU2l0ZUJvb2ttYXJrKSBvYmo7Ci0JCQlTdHJpbmcgbmFtZSA9IGJvb2ttYXJrLmdldE5hbWUoKTsKLQkJCVN0cmluZyB1cmwgPSBib29rbWFyay5nZXRVUkwoKS50b1N0cmluZygpOwotCQkJU3RyaW5nIHdlYiA9IGJvb2ttYXJrLmlzV2ViQm9va21hcmsoKT8idHJ1ZSI6ImZhbHNlIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTdHJpbmcgc2VsID0gYm9va21hcmsuaXNTZWxlY3RlZCgpPyJ0cnVlIjoiZmFsc2UiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN0cmluZyBsb2NhbCA9IGJvb2ttYXJrLmlzTG9jYWwoKSA/ICJ0cnVlIiA6ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3RyaW5nIFtdIGlnbiA9IGJvb2ttYXJrLmdldElnbm9yZWRDYXRlZ29yaWVzKCk7Ci0JCQlTdHJpbmdCdWZmZXIgd2lnbiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaWduLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgPiAwKQotCQkJCQl3aWduLmFwcGVuZCgnLCcpOwotCQkJCXdpZ24uYXBwZW5kKGlnbltpXSk7Ci0JCQl9Ci0JCQl3cml0ZXIucHJpbnQoaW5kZW50ICsgIjxzaXRlIG5hbWU9XCIiICsgVXBkYXRlTWFuYWdlclV0aWxzLmdldFdyaXRhYmxlWE1MU3RyaW5nKG5hbWUpICsgIlwiIHVybD1cIiIgKyB1cmwgKyAiXCIgd2ViPVwiIiArIHdlYiArICJcIiBzZWxlY3RlZD1cIiIgKyBzZWwgKyAiXCIgbG9jYWw9XCIiICsgbG9jYWwgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQKLQkJCWlmICh3aWduLmxlbmd0aCgpID4gMCkKLQkJCQl3cml0ZXIucHJpbnQoIiBpZ25vcmVkLWNhdGVnb3JpZXM9XCIiK3dpZ24udG9TdHJpbmcoKSsiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpZiAoYm9va21hcmsuZ2V0RGVzY3JpcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyLnByaW50bG4oIj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXdyaXRlci5wcmludChpbmRlbnQrIiAgPGRlc2NyaXB0aW9uPiIpOyAvLyROT04tTkxTLTEkCi0JCQkJd3JpdGVyLnByaW50KFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRXcml0YWJsZVhNTFN0cmluZyhib29rbWFyay5nZXREZXNjcmlwdGlvbigpKSk7Ci0JCQkJd3JpdGVyLnByaW50bG4oIjwvZGVzY3JpcHRpb24+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl3cml0ZXIucHJpbnRsbihpbmRlbnQgKyI8L3NpdGU+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJd3JpdGVyLnByaW50bG4oIi8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBCb29rbWFya0ZvbGRlcikgewotCQkJQm9va21hcmtGb2xkZXIgZm9sZGVyID0gKEJvb2ttYXJrRm9sZGVyKSBvYmo7Ci0JCQlTdHJpbmcgbmFtZSA9IGZvbGRlci5nZXROYW1lKCk7Ci0JCQl3cml0ZXIucHJpbnRsbihpbmRlbnQgKyAiPGZvbGRlciBuYW1lPVwiIiArIFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRXcml0YWJsZVhNTFN0cmluZyhuYW1lKSArICJcIj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlPYmplY3RbXSBjaGlsZHJlbiA9IGZvbGRlci5nZXRDaGlsZHJlbihmb2xkZXIpOwotCQkJU3RyaW5nIGluZGVudDIgPSBpbmRlbnQgKyAiICAgIjsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCXdyaXRlT2JqZWN0KGluZGVudDIsIGNoaWxkcmVuW2ldLCB3cml0ZXIpOwotCQkJfQotCQkJd3JpdGVyLnByaW50bG4oaW5kZW50ICsgIjwvZm9sZGVyPiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUpIHsKLQkJTmFtZWROb2RlTWFwIGF0dHMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJTm9kZSBhdHQgPSBhdHRzLmdldE5hbWVkSXRlbShuYW1lKTsKLQkJaWYgKGF0dCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYXR0LmdldE5vZGVWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NGb2xkZXIoQm9va21hcmtGb2xkZXIgZm9sZGVyLCBBcnJheUxpc3QgcmVzdWx0KSB7Ci0JCU9iamVjdFtdIGNoaWxkcmVuID0gZm9sZGVyLmdldENoaWxkcmVuKGZvbGRlcik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCXByb2Nlc3NFbnRyeShjaGlsZHJlbltpXSwgcmVzdWx0KTsKLQkJfQotCX0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NFbnRyeShPYmplY3Qgb2JqLCBBcnJheUxpc3QgcmVzdWx0KSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBTaXRlQm9va21hcmspCi0JCQlyZXN1bHQuYWRkKG9iaik7Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEJvb2ttYXJrRm9sZGVyKSB7Ci0JCQlwcm9jZXNzRm9sZGVyKChCb29rbWFya0ZvbGRlcikgb2JqLCByZXN1bHQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0NvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0NvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzM2ZTVhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9Db25maWd1cmVkRmVhdHVyZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcgotCWV4dGVuZHMgU2ltcGxlRmVhdHVyZUFkYXB0ZXIKLQlpbXBsZW1lbnRzIElDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIgewotCXByaXZhdGUgSUNvbmZpZ3VyZWRTaXRlQWRhcHRlciBhZGFwdGVyOwotCXByaXZhdGUgYm9vbGVhbiBjb25maWd1cmVkOwotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGVkOwotCi0JcHVibGljIENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcigKLQkJSUNvbmZpZ3VyZWRTaXRlQWRhcHRlciBhZGFwdGVyLAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlib29sZWFuIGNvbmZpZ3VyZWQsCi0JCWJvb2xlYW4gdXBkYXRlZCwKLQkJYm9vbGVhbiBvcHRpb25hbCkgewotCQlzdXBlcihmZWF0dXJlLCBvcHRpb25hbCk7Ci0JCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0JCXRoaXMuY29uZmlndXJlZCA9IGNvbmZpZ3VyZWQ7Ci0JCXRoaXMudXBkYXRlZCA9IHVwZGF0ZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAob2JqZWN0ID09IHRoaXMpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgewotCQkJdHJ5IHsKLQkJCQlDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIgYWQgPSAoQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKSBvYmplY3Q7Ci0JCQkJcmV0dXJuIGFkLmdldENvbmZpZ3VyZWRTaXRlKCkuZXF1YWxzKGdldENvbmZpZ3VyZWRTaXRlKCkpCi0JCQkJCSYmIGFkLmdldEZlYXR1cmUobnVsbCkuZXF1YWxzKGdldEZlYXR1cmUobnVsbCkpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgZ2V0Q29uZmlndXJlZFNpdGUoKSB7Ci0JCXJldHVybiBhZGFwdGVyLmdldENvbmZpZ3VyZWRTaXRlKCk7Ci0JfQotCXB1YmxpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb24gZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBhZGFwdGVyLmdldEluc3RhbGxDb25maWd1cmF0aW9uKCk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzQ29uZmlndXJlZCgpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNVcGRhdGVkKCkgewotCQlyZXR1cm4gdXBkYXRlZDsKLQl9Ci0JcHVibGljIElGZWF0dXJlQWRhcHRlcltdIGdldEluY2x1ZGVkRmVhdHVyZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gaW5jbHVkZWQgPQotCQkJCWdldEZlYXR1cmUobnVsbCkuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyW10gcmVzdWx0ID0KLQkJCQluZXcgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyW2luY2x1ZGVkLmxlbmd0aF07Ci0JCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJU3ViUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpOwotCQkJc3ViTW9uaXRvci5iZWdpblRhc2soIiIsIGluY2x1ZGVkLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNsdWRlZC5sZW5ndGg7IGkrKykgewotCQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgZnJlZiA9IGluY2x1ZGVkW2ldOwotCQkJCUlGZWF0dXJlIGZlYXR1cmU7Ci0JCQkJYm9vbGVhbiBjaGlsZENvbmZpZ3VyZWQgPSBjb25maWd1cmVkOwotCQkJCWJvb2xlYW4gdXBkYXRlZCA9IGZhbHNlOwotCQkJCXRyeSB7Ci0JCQkJCWZlYXR1cmUgPSBmcmVmLmdldEZlYXR1cmUoCi0JCQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihzdWJNb25pdG9yLCAxKSk7Ci0JCQkJCWNoaWxkQ29uZmlndXJlZCA9Ci0JCQkJCQlhZGFwdGVyLmdldENvbmZpZ3VyZWRTaXRlKCkuaXNDb25maWd1cmVkKGZlYXR1cmUpOwotCQkJCQkvLy8qCi0JCQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIHJlZnBpZCA9Ci0JCQkJCQlmcmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCk7Ci0JCQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIGZwaWQgPQotCQkJCQkJZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpOwotCQkJCQl1cGRhdGVkID0gIXJlZnBpZC5lcXVhbHMoZnBpZCk7Ci0JCQkJCS8vKi8KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJZmVhdHVyZSA9IG5ldyBNaXNzaW5nRmVhdHVyZShnZXRGZWF0dXJlKG51bGwpLCBmcmVmKTsKLQkJCQkJY2hpbGRDb25maWd1cmVkID0gZmFsc2U7Ci0JCQkJfQotCi0JCQkJcmVzdWx0W2ldID0KLQkJCQkJbmV3IENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcigKLQkJCQkJCWFkYXB0ZXIsCi0JCQkJCQlmZWF0dXJlLAotCQkJCQkJY2hpbGRDb25maWd1cmVkLAotCQkJCQkJdXBkYXRlZCwKLQkJCQkJCWZyZWYuaXNPcHRpb25hbCgpKTsKLQkJCQlyZXN1bHRbaV0uc2V0SW5jbHVkZWQodHJ1ZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBuZXcgSUZlYXR1cmVBZGFwdGVyWzBdOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0NvbmZpZ3VyZWRTaXRlQWRhcHRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0NvbmZpZ3VyZWRTaXRlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjU1Y2IwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9Db25maWd1cmVkU2l0ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyZWRTaXRlQWRhcHRlcgotCWV4dGVuZHMgVUlNb2RlbE9iamVjdAotCWltcGxlbWVudHMgSUNvbmZpZ3VyZWRTaXRlQWRhcHRlciB7Ci0JcHJpdmF0ZSBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnOwotCXByaXZhdGUgSUNvbmZpZ3VyZWRTaXRlIGNzaXRlOwotCQkKLQlwdWJsaWMgQ29uZmlndXJlZFNpdGVBZGFwdGVyKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsIElDb25maWd1cmVkU2l0ZSBjc2l0ZSkgewotCQl0aGlzLmNzaXRlID0gY3NpdGU7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQkKLQlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlIGdldENvbmZpZ3VyZWRTaXRlKCkgewotCQlyZXR1cm4gY3NpdGU7Ci0JfQotCi0JcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBnZXRJbnN0YWxsQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdD09bnVsbCkgcmV0dXJuIGZhbHNlOwotCQlpZiAob2JqZWN0ID09IHRoaXMpIHJldHVybiB0cnVlOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ29uZmlndXJlZFNpdGVBZGFwdGVyKSB7Ci0JCQlDb25maWd1cmVkU2l0ZUFkYXB0ZXIgYWRhcHRlciA9IChDb25maWd1cmVkU2l0ZUFkYXB0ZXIpb2JqZWN0OwotCQkJcmV0dXJuIGNzaXRlIT1udWxsICYmIGNzaXRlLmdldFNpdGUoKS5lcXVhbHMoYWRhcHRlci5nZXRDb25maWd1cmVkU2l0ZSgpLmdldFNpdGUoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0Q29uZmlndXJlZFNpdGUoKS5nZXRTaXRlKCkuZ2V0VVJMKCkudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvRGlzY292ZXJ5Rm9sZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvRGlzY292ZXJ5Rm9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZTQ4YzEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0Rpc2NvdmVyeUZvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlYXJjaC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLio7Ci0KLXB1YmxpYyBjbGFzcyBEaXNjb3ZlcnlGb2xkZXIgZXh0ZW5kcyBCb29rbWFya0ZvbGRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICBVcGRhdGVQb2xpY3kgdXBkYXRlUG9saWN5ID0gbmV3IFVwZGF0ZVBvbGljeSgpOwotCQotCXB1YmxpYyBEaXNjb3ZlcnlGb2xkZXIoKSB7Ci0JCXN1cGVyKFVwZGF0ZVVJTWVzc2FnZXMuRGlzY292ZXJ5Rm9sZGVyX25hbWUpOyAKLQkJc2V0TW9kZWwoVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCkpOwotCX0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQljaGlsZHJlbi5jbGVhcigpOwotCQkvLyBjaGVjayBpZiBkaXNjb3Zlcnkgc2l0ZXMgZGVmaW5lZCBieSBmZWF0dXJlcyBzaG91bGQgYmUgZXhwb3NlZCB0byB0aGUgdXNlcgotCQlpZiAoIVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oVXBkYXRlVUkuUF9ESVNDT1ZFUllfU0lURVNfRU5BQkxFRCkpCi0JCQlyZXR1cm47Ci0JCQotCQl0cnkgewotCQkJVVJMIHVwZGF0ZU1hcFVSTCA9IFVwZGF0ZVV0aWxzLmdldFVwZGF0ZU1hcFVSTCgpOwotCQkJaWYgKHVwZGF0ZU1hcFVSTCE9bnVsbCkgewotCQkJCXVwZGF0ZVBvbGljeSA9IG5ldyBVcGRhdGVQb2xpY3koKTsKLQkJCQkvLyBUT0RPIG1heSBuZWVkIHRvIHVzZSBhIHByb3BlciBtb25pdG9yIHRvIGJlIGFibGUgdG8gY2FuY2VsIGNvbm5lY3Rpb25zCi0JCQkJSVN0YXR1cyBzdGF0dXMgPSBVcGRhdGVVdGlscy5sb2FkVXBkYXRlUG9saWN5KHVwZGF0ZVBvbGljeSwgdXBkYXRlTWFwVVJMLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLQkJCQkJLy8gbG9nIGFuZCBjb250aW51ZQotCQkJCQlVcGRhdGVVdGlscy5sb2coc3RhdHVzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGFuZCBjb250aW51ZQotCQkJVXBkYXRlVXRpbHMubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQl9Ci0JCQotCQl0cnkgewotCQkJSUxvY2FsU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQkJSUNvbmZpZ3VyZWRTaXRlW10gY3NpdGVzID0gY29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBjc2l0ZXNbaV07Ci0JCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0gY3NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHJlZnNbal07Ci0JCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJSVVSTEVudHJ5W10gZW50cmllcyA9IGZlYXR1cmUuZ2V0RGlzY292ZXJ5U2l0ZUVudHJpZXMoKTsKLQkJCQkJaWYgKGVudHJpZXMubGVuZ3RoID4gMCkgewotCQkJCQkJLy8gT25seSBhZGQgZGlzY292ZXJ5IHNpdGVzIG9mIHJvb3QgZmVhdHVyZXMKLQkJCQkJCWlmIChpc0luY2x1ZGVkKHJlZiwgcmVmcykpCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQlhZGRCb29rbWFya3MoZmVhdHVyZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCXByaXZhdGUgYm9vbGVhbiBpc0luY2x1ZGVkKAotCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYsCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcykgewotCQl0cnkgewotCQkJVmVyc2lvbmVkSWRlbnRpZmllciB2aWQgPSByZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUZlYXR1cmVSZWZlcmVuY2UgY2FuZGlkYXRlID0gcmVmc1tpXTsKLQkJCQkvLyBJZ25vcmUgc2VsZgotCQkJCWlmIChjYW5kaWRhdGUuZXF1YWxzKHJlZikpCi0JCQkJCWNvbnRpbnVlOwotCQkJCUlGZWF0dXJlIGNmZWF0dXJlID0gY2FuZGlkYXRlLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBpcmVmcyA9Ci0JCQkJCWNmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGlyZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlGZWF0dXJlUmVmZXJlbmNlIGlyZWYgPSBpcmVmc1tqXTsKLQkJCQkJVmVyc2lvbmVkSWRlbnRpZmllciBpdmlkID0gaXJlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQkJCWlmIChpdmlkLmVxdWFscyh2aWQpKSB7Ci0JCQkJCQkvLyBiaW5nbyAtIGluY2x1ZGVkIGluIGF0IGxlYXN0IG9uZSBmZWF0dXJlCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwcml2YXRlIHZvaWQgYWRkQm9va21hcmtzKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJLy8gU2VlIGlmIHRoaXMgcXVlcnkgc2l0ZSBhZGFwdGVyIGlzIG1hcHBlZCBpbiB0aGUgbWFwIGZpbGUKLQkJLy8gdG8gYSBkaWZmZXJlbnQgVVJMLgotCQlpZiAodXBkYXRlUG9saWN5ICE9IG51bGwgJiYgdXBkYXRlUG9saWN5LmlzTG9hZGVkKCkpIHsKLQkJCUlVcGRhdGVTaXRlQWRhcHRlciBtYXBwZWRTaXRlID0gdXBkYXRlUG9saWN5LmdldE1hcHBlZERpc2NvdmVyeVNpdGUoZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpKTsKLQkJCWlmIChtYXBwZWRTaXRlICE9IG51bGwpIHsKLQkJCQlTaXRlQm9va21hcmsgYm9va21hcmsgPQotCQkJCQluZXcgU2l0ZUJvb2ttYXJrKG1hcHBlZFNpdGUuZ2V0TGFiZWwoKSwJbWFwcGVkU2l0ZS5nZXRVUkwoKSwgZmFsc2UpOwotCQkJCWJvb2ttYXJrLnNldFJlYWRPbmx5KHRydWUpOwotCQkJCWlmICghY29udGFpbnMoYm9va21hcmspKQotCQkJCQlpbnRlcm5hbEFkZChib29rbWFyayk7Ci0JCQkJcmV0dXJuOwotCQkJfSBlbHNlIGlmICghdXBkYXRlUG9saWN5LmlzRmFsbGJhY2tBbGxvd2VkKCkpIHsKLQkJCQkvLyBubyBtYXRjaCAtIHVzZSBvcmlnaW5hbCBzaXRlcyBpZiBmYWxsYmFjayBhbGxvd2VkLCBvciBub3RoaW5nLgotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlJVVJMRW50cnlbXSBlbnRyaWVzID0gZmVhdHVyZS5nZXREaXNjb3ZlcnlTaXRlRW50cmllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlVUkxFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCQlTaXRlQm9va21hcmsgYm9va21hcmsgPQotCQkJCW5ldyBTaXRlQm9va21hcmsoCi0JCQkJCWVudHJ5LmdldEFubm90YXRpb24oKSwKLQkJCQkJZW50cnkuZ2V0VVJMKCksCi0JCQkJCWVudHJ5LmdldFR5cGUoKSA9PSBJVVJMRW50cnkuV0VCX1NJVEUpOwotCQkJYm9va21hcmsuc2V0UmVhZE9ubHkoZW50cnkuZ2V0VHlwZSgpICE9IElVUkxFbnRyeS5XRUJfU0lURSk7Ci0JCQlpZiAoIWNvbnRhaW5zKGJvb2ttYXJrKSkKLQkJCQlpbnRlcm5hbEFkZChib29rbWFyayk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zKFNpdGVCb29rbWFyayBib29rbWFyaykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3QgbyA9IGNoaWxkcmVuLmdldChpKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKSB7Ci0JCQkJLy8gbm90ZTogbWF0Y2ggb24gVVJMLCBub3QgdGhlIGxhYmVsCi0JCQkJaWYgKGJvb2ttYXJrLmdldFVSTCgpLmVxdWFscygoKFNpdGVCb29rbWFyaykgbykuZ2V0VVJMKCkpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCWlmIChoYXNDaGlsZHJlbigpID09IGZhbHNlKQotCQkJaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvRmVhdHVyZUFkYXB0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9GZWF0dXJlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTg5ZDI3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9GZWF0dXJlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGZWF0dXJlQWRhcHRlciBleHRlbmRzIFVJTW9kZWxPYmplY3QgaW1wbGVtZW50cyBJRmVhdHVyZUFkYXB0ZXIgewotCXByaXZhdGUgYm9vbGVhbiBpbmNsdWRlZD1mYWxzZTsKLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZUFkYXB0ZXIjZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb24oKQotCSAqLwotCXB1YmxpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb24gZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0luY2x1ZGVkKCkgewotCQlyZXR1cm4gaW5jbHVkZWQ7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldEluY2x1ZGVkKGJvb2xlYW4gaW5jbHVkZWQpIHsKLQkJdGhpcy5pbmNsdWRlZCA9IGluY2x1ZGVkOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQl0cnkgewotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUobnVsbCk7Ci0JCQlyZXR1cm4gZmVhdHVyZS5nZXRMYWJlbCgpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVBZGFwdGVyX2ZhaWx1cmU7IAotCQl9Ci0JfQotCXB1YmxpYyBib29sZWFuIGhhc0luY2x1ZGVkRmVhdHVyZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZSBbXSBpbmNsdWRlZCA9IGdldEZlYXR1cmUobW9uaXRvcikuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJcmV0dXJuIGluY2x1ZGVkLmxlbmd0aD4wOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9GZWF0dXJlUmVmZXJlbmNlQWRhcHRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0ZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNWRjMWYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0ZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotCi1wdWJsaWMgY2xhc3MgRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXIgZXh0ZW5kcyBGZWF0dXJlQWRhcHRlciB7Ci0JcHJpdmF0ZSBJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmOwotCXByaXZhdGUgYm9vbGVhbiB0b3VjaGVkOwotCi0JcHVibGljIEZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyKElGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWYpIHsKLQkJdGhpcy5mZWF0dXJlUmVmID0gZmVhdHVyZVJlZjsKLQkJc2V0SW5jbHVkZWQoZmVhdHVyZVJlZiBpbnN0YW5jZW9mIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UpOwotCX0KLQkKLQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZlYXR1cmVSZWYuZ2V0RmVhdHVyZShtb25pdG9yKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRGYXN0TGFiZWwoKSB7Ci0JCXJldHVybiBmZWF0dXJlUmVmLmdldFVSTCgpLnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBJU2l0ZSBnZXRTaXRlKCkgewotCQlyZXR1cm4gZmVhdHVyZVJlZi5nZXRTaXRlKCk7Ci0JfQotCQotCXB1YmxpYyBVUkwgZ2V0VVJMKCkgewotCQlyZXR1cm4gZmVhdHVyZVJlZi5nZXRVUkwoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNPcHRpb25hbCgpIHsKLQkJcmV0dXJuIGZlYXR1cmVSZWYgaW5zdGFuY2VvZiBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlID8gCi0JCQkoKElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UpZmVhdHVyZVJlZikuaXNPcHRpb25hbCgpOmZhbHNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0b3VjaEluY2x1ZGVkRmVhdHVyZXMoSVJ1bm5hYmxlQ29udGV4dCBjb250ZXh0KSB7Ci0JCWlmICh0b3VjaGVkKSByZXR1cm47Ci0JCWZpbmFsIElGZWF0dXJlUmVmZXJlbmNlIFtdIGluY2x1ZGVkOwotCQkKLQkJdHJ5IHsKLQkJCWluY2x1ZGVkID0gCWdldEZlYXR1cmUobnVsbCkuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoaW5jbHVkZWQubGVuZ3RoID09IDApIHJldHVybjsKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcyAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soVXBkYXRlVUlNZXNzYWdlcy5TaXRlQm9va21hcmtfZG93bmxvYWRpbmcsIGluY2x1ZGVkLmxlbmd0aCk7IAotCQkJCWZvciAoaW50IGk9MDsgaTxpbmNsdWRlZC5sZW5ndGg7IGkrKykgewotCQkJCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBpbmNsdWRlZFtpXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCW1vbml0b3Iuc3ViVGFzayhyZWYuZ2V0VVJMKCkudG9TdHJpbmcoKSk7Ci0JCQkJCQlyZWYuZ2V0RmVhdHVyZShuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJCQkJCS8vbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9OwotCQl0cnkgewotCQkJY29udGV4dC5ydW4odHJ1ZSwgZmFsc2UsIG9wKTsKLQkJCXRvdWNoZWQ9dHJ1ZTsKLQkJfQotCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCXB1YmxpYyBJRmVhdHVyZUFkYXB0ZXJbXSBnZXRJbmNsdWRlZEZlYXR1cmVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBpbmNsdWRlZCA9Ci0JCQkJZ2V0RmVhdHVyZShtb25pdG9yKS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlGZWF0dXJlUmVmZXJlbmNlQWRhcHRlcltdIHJlc3VsdCA9Ci0JCQkJbmV3IEZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyW2luY2x1ZGVkLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluY2x1ZGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcmVzdWx0W2ldID0gbmV3IEZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyKGluY2x1ZGVkW2ldKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG5ldyBJRmVhdHVyZUFkYXB0ZXJbMF07Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgZ2V0RmVhdHVyZVJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmVSZWY7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9JQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZWNmMWMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7Ci0KLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlciBleHRlbmRzIElGZWF0dXJlQWRhcHRlciwgSUNvbmZpZ3VyZWRTaXRlQ29udGV4dCB7Ci0JcHVibGljIGJvb2xlYW4gaXNDb25maWd1cmVkKCk7Ci0JcHVibGljIGJvb2xlYW4gaXNVcGRhdGVkKCk7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSUNvbmZpZ3VyZWRTaXRlQWRhcHRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lDb25maWd1cmVkU2l0ZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZmYzhiNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSUNvbmZpZ3VyZWRTaXRlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJlZFNpdGVBZGFwdGVyIGV4dGVuZHMgSUNvbmZpZ3VyZWRTaXRlQ29udGV4dCB7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSUNvbmZpZ3VyZWRTaXRlQ29udGV4dC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lDb25maWd1cmVkU2l0ZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ1ZGQ1OC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSUNvbmZpZ3VyZWRTaXRlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25maWd1cmVkU2l0ZUNvbnRleHQgewotCXB1YmxpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb24gZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb24oKTsKLQlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlIGdldENvbmZpZ3VyZWRTaXRlKCk7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSUZlYXR1cmVBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSUZlYXR1cmVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiODY5NDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lGZWF0dXJlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGludGVyZmFjZSBJRmVhdHVyZUFkYXB0ZXIgewotCXB1YmxpYyBVUkwgZ2V0VVJMKCk7Ci0JcHVibGljIElTaXRlIGdldFNpdGUoKTsKLQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCXB1YmxpYyBJRmVhdHVyZUFkYXB0ZXIgW10gZ2V0SW5jbHVkZWRGZWF0dXJlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCXB1YmxpYyBib29sZWFuIGhhc0luY2x1ZGVkRmVhdHVyZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQlwdWJsaWMgYm9vbGVhbiBpc0luY2x1ZGVkKCk7Ci0JcHVibGljIGJvb2xlYW4gaXNPcHRpb25hbCgpOwotCXB1YmxpYyBTdHJpbmcgZ2V0RmFzdExhYmVsKCk7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSVNpdGVBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSVNpdGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MjA4YWQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lTaXRlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTaXRlQWRhcHRlciB7Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpOwotCXB1YmxpYyBVUkwgZ2V0VVJMKCk7Ci0JcHVibGljIElTaXRlIGdldFNpdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotfQotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvTWlzc2luZ0ZlYXR1cmUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9NaXNzaW5nRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjA2ZGE4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9NaXNzaW5nRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLQotcHVibGljIGNsYXNzIE1pc3NpbmdGZWF0dXJlIGltcGxlbWVudHMgSUZlYXR1cmUgewotCi0JcHJpdmF0ZSBVUkwgdXJsOwotCXByaXZhdGUgSVNpdGUgc2l0ZTsKLQlwcml2YXRlIElGZWF0dXJlUmVmZXJlbmNlIHJlZmVyZW5jZTsKLQlwcml2YXRlIElGZWF0dXJlIHBhcmVudDsKLQlwcml2YXRlIElVUkxFbnRyeSBkZXNjOwotCXByaXZhdGUgVmVyc2lvbmVkSWRlbnRpZmllciBpZCA9IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKFVwZGF0ZVVJTWVzc2FnZXMuTWlzc2luZ0ZlYXR1cmVfaWQsICIwLjAuMCIpOyAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBNaXNzaW5nRmVhdHVyZShJU2l0ZSBzaXRlLCBVUkwgdXJsKSB7Ci0JCXRoaXMuc2l0ZSA9IHNpdGU7Ci0JCXRoaXMudXJsID0gdXJsOwotCQlkZXNjID0gbmV3IElVUkxFbnRyeSgpIHsKLQkJCXB1YmxpYyBVUkwgZ2V0VVJMKCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uKCkgewotCQkJCXJldHVybiBVcGRhdGVVSU1lc3NhZ2VzLk1pc3NpbmdGZWF0dXJlX2Rlc2NfdW5rbm93bjsgCi0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCQkJcmV0dXJuIElVUkxFbnRyeS5VUERBVEVfU0lURTsKLQkJCX0KLQkJfTsKLQl9Ci0JcHVibGljIE1pc3NpbmdGZWF0dXJlKElGZWF0dXJlUmVmZXJlbmNlIHJlZikgewotCQl0aGlzKG51bGwsIHJlZik7Ci0JfQotCi0JcHVibGljIE1pc3NpbmdGZWF0dXJlKElGZWF0dXJlIHBhcmVudCwgSUZlYXR1cmVSZWZlcmVuY2UgcmVmKSB7Ci0JCXRoaXMocmVmLmdldFNpdGUoKSwgcmVmLmdldFVSTCgpKTsKLQkJdGhpcy5yZWZlcmVuY2UgPSByZWY7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCi0JCWlmIChpc09wdGlvbmFsKCkpIHsKLQkJCWRlc2MgPSBuZXcgSVVSTEVudHJ5KCkgewotCQkJCXB1YmxpYyBVUkwgZ2V0VVJMKCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uKCkgewotCQkJCQlyZXR1cm4gVXBkYXRlVUlNZXNzYWdlcy5NaXNzaW5nRmVhdHVyZV9kZXNjX29wdGlvbmFsOyAKLQkJCQl9Ci0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGtleSkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcHVibGljIGludCBnZXRUeXBlKCkgewotCQkJCQlyZXR1cm4gSVVSTEVudHJ5LlVQREFURV9TSVRFOwotCQkJCX0KLQkJCX07Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlICE9IG51bGwKLQkJCSYmIHJlZmVyZW5jZSBpbnN0YW5jZW9mIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UKLQkJCSYmICgoSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSkgcmVmZXJlbmNlKS5pc09wdGlvbmFsKCk7Ci0JfQotCi0JcHVibGljIElGZWF0dXJlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgVVJMIGdldE9yaWdpbmF0aW5nU2l0ZVVSTCgpIHsKLQkJVmVyc2lvbmVkSWRlbnRpZmllciB2aWQgPSBnZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCWlmICh2aWQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcga2V5ID0gdmlkLmdldElkZW50aWZpZXIoKTsKLQkJcmV0dXJuIFVwZGF0ZVVJLmdldE9yaWdpbmF0aW5nVVJMKGtleSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElGZWF0dXJlI2dldElkZW50aWZpZXIoKQotCSAqLwotCXB1YmxpYyBWZXJzaW9uZWRJZGVudGlmaWVyIGdldFZlcnNpb25lZElkZW50aWZpZXIoKSB7Ci0JCWlmIChyZWZlcmVuY2UgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gcmVmZXJlbmNlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0U2l0ZSgpCi0JICovCi0JcHVibGljIElTaXRlIGdldFNpdGUoKSB7Ci0JCXJldHVybiBzaXRlOwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZSNnZXRMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsCi0JCQkmJiByZWZlcmVuY2UgaW5zdGFuY2VvZiBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKSB7Ci0JCQlTdHJpbmcgbmFtZSA9ICgoSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSkgcmVmZXJlbmNlKS5nZXROYW1lKCk7Ci0JCQlpZiAobmFtZSAhPSBudWxsKQotCQkJCXJldHVybiBuYW1lOwotCQl9Ci0JCXJldHVybiB1cmwudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0VVJMKCkKLQkgKi8KLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0VXBkYXRlSW5mbygpCi0JICovCi0JcHVibGljIElVUkxFbnRyeSBnZXRVcGRhdGVTaXRlRW50cnkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZSNnZXREaXNjb3ZlcnlJbmZvcygpCi0JICovCi0JcHVibGljIElVUkxFbnRyeVtdIGdldERpc2NvdmVyeVNpdGVFbnRyaWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0UHJvdmlkZXIoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBVcGRhdGVVSU1lc3NhZ2VzLk1pc3NpbmdGZWF0dXJlX3Byb3ZpZGVyOyAKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0RGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyBJVVJMRW50cnkgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjOwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZSNnZXRDb3B5cmlnaHQoKQotCSAqLwotCXB1YmxpYyBJVVJMRW50cnkgZ2V0Q29weXJpZ2h0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0TGljZW5zZSgpCi0JICovCi0JcHVibGljIElVUkxFbnRyeSBnZXRMaWNlbnNlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0T1MoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T1MoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZSNnZXRXUygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXUygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElGZWF0dXJlI2dldE5MKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5MKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0QXJjaCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPU0FyY2goKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZSNnZXRJbWFnZSgpCi0JICovCi0JcHVibGljIFVSTCBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElGZWF0dXJlI2dldEltcG9ydHMoKQotCSAqLwotCXB1YmxpYyBJSW1wb3J0W10gZ2V0SW1wb3J0cygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElGZWF0dXJlI2dldEFyY2hpdmVzKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0QXJjaGl2ZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZSNnZXREYXRhRW50cmllcygpCi0JICovCi0JcHVibGljIElOb25QbHVnaW5FbnRyeVtdIGdldE5vblBsdWdpbkVudHJpZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZSNhZGREYXRhRW50cnkoSURhdGFFbnRyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGROb25QbHVnaW5FbnRyeShJTm9uUGx1Z2luRW50cnkgZGF0YUVudHJ5KSB7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElGZWF0dXJlI2dldERvd25sb2FkU2l6ZSgpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0RG93bmxvYWRTaXplKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0SW5zdGFsbFNpemUoSVNpdGUpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0SW5zdGFsbFNpemUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZSNpc1ByaW1hcnkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJpbWFyeSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZSNnZXRBcHBsaWNhdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjZ2V0UGx1Z2luRW50cmllcygpCi0JICovCi0JcHVibGljIElQbHVnaW5FbnRyeVtdIGdldFBsdWdpbkVudHJpZXMoKSB7Ci0JCXJldHVybiBuZXcgSVBsdWdpbkVudHJ5WzBdOwotCX0KLQotCS8qCi0JICogQHNlZSBJUGx1Z2luQ29udGFpbmVyI2dldFBsdWdpbkVudHJ5Q291bnQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UGx1Z2luRW50cnlDb3VudCgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjZ2V0RG93bmxvYWRTaXplKElQbHVnaW5FbnRyeSkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXREb3dubG9hZFNpemUoSVBsdWdpbkVudHJ5IGVudHJ5KSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qCi0JICogQHNlZSBJUGx1Z2luQ29udGFpbmVyI2dldEluc3RhbGxTaXplKElQbHVnaW5FbnRyeSkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRJbnN0YWxsU2l6ZShJUGx1Z2luRW50cnkgZW50cnkpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjYWRkUGx1Z2luRW50cnkoSVBsdWdpbkVudHJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBsdWdpbkVudHJ5KElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSkgewotCX0KLQotCS8qCi0JICogQHNlZSBJUGx1Z2luQ29udGFpbmVyI3N0b3JlKElQbHVnaW5FbnRyeSwgU3RyaW5nLCBJbnB1dFN0cmVhbSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9yZShJUGx1Z2luRW50cnkgZW50cnksIFN0cmluZyBuYW1lLCBJbnB1dFN0cmVhbSBpblN0cmVhbSkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCS8qCi0JICogQHNlZSBJQWRhcHRhYmxlI2dldEFkYXB0ZXIoQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjcmVtb3ZlKElQbHVnaW5FbnRyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoSVBsdWdpbkVudHJ5IGVudHJ5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElGZWF0dXJlI3NldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoSUZlYXR1cmVDb250ZW50UHJvdmlkZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcihJRmVhdHVyZUNvbnRlbnRQcm92aWRlciBmZWF0dXJlQ29udGVudFByb3ZpZGVyKSB7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElGZWF0dXJlI2dldEZlYXR1cmVDb250ZW50Q29uc3VtZXIoKQotCSAqLwotCXB1YmxpYyBJRmVhdHVyZUNvbnRlbnRDb25zdW1lciBnZXRGZWF0dXJlQ29udGVudENvbnN1bWVyKCkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmUjc2V0U2l0ZShJU2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaXRlKElTaXRlIHNpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhpcy5zaXRlID0gc2l0ZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpCi0JICovCi0JcHVibGljIElGZWF0dXJlQ29udGVudFByb3ZpZGVyIGdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZSNpbnN0YWxsKElGZWF0dXJlLElWZXJpZmllciwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbCgKLQkJSUZlYXR1cmUgdGFyZ2V0RmVhdHVyZSwKLQkJSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWNhdGlvbkxpc3RlbmVyLAotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlI2luc3RhbGwoSUZlYXR1cmUsIElGZWF0dXJlUmVmZXJlbmNlW10sIElWZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbCgKLQkJSUZlYXR1cmUgdGFyZ2V0RmVhdHVyZSwKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbEZlYXR1cmVzLAotCQlJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpY2F0aW9uTGlzdGVuZXIsCi0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJdGhyb3dzIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qCi0JICogQHNlZSBJRmVhdHVyZSNyZW1vdmUoSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjcmVtb3ZlKElQbHVnaW5FbnRyeSwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoSVBsdWdpbkVudHJ5IGVudHJ5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0Tm9uUGx1Z2luRW50cnlDb3VudCgpCi0JICovCi0JcHVibGljIGludCBnZXROb25QbHVnaW5FbnRyeUNvdW50KCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0SW5zdGFsbEhhbmRsZXJFbnRyeSgpCi0JICovCi0JcHVibGljIElJbnN0YWxsSGFuZGxlckVudHJ5IGdldEluc3RhbGxIYW5kbGVyRW50cnkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBnZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbMF07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRmVhdHVyZSNnZXRBZmZpbml0eUZlYXR1cmUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWZmaW5pdHlGZWF0dXJlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZSNnZXRSYXdJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGdldFJhd0luY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZSNnZXRSYXdOb25QbHVnaW5FbnRyaWVzKCkKLQkgKi8KLQlwdWJsaWMgSU5vblBsdWdpbkVudHJ5W10gZ2V0UmF3Tm9uUGx1Z2luRW50cmllcygpIHsKLQkJcmV0dXJuIGdldE5vblBsdWdpbkVudHJpZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlI2dldFJhd1BsdWdpbkVudHJpZXMoKQotCSAqLwotCXB1YmxpYyBJUGx1Z2luRW50cnlbXSBnZXRSYXdQbHVnaW5FbnRyaWVzKCkgewotCQlyZXR1cm4gZ2V0UGx1Z2luRW50cmllcygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmUjZ2V0UHJpbWFyeVBsdWdpbklEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlQbHVnaW5JRCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZSNnZXRSYXdJbXBvcnRzKCkKLQkgKi8KLQlwdWJsaWMgSUltcG9ydFtdIGdldFJhd0ltcG9ydHMoKSB7Ci0JCXJldHVybiBuZXcgSUltcG9ydFswXTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlI2lzUGF0Y2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGF0Y2goKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNFeGNsdXNpdmUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9OYW1lZE1vZGVsT2JqZWN0LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvTmFtZWRNb2RlbE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2FiOTY1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9OYW1lZE1vZGVsT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC4qOwotCi1wdWJsaWMgY2xhc3MgTmFtZWRNb2RlbE9iamVjdCBleHRlbmRzIFVJTW9kZWxPYmplY3QgCi0JCQkJCQkJaW1wbGVtZW50cyBJV29ya2JlbmNoQWRhcHRlciwgU2VyaWFsaXphYmxlICB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICBwcml2YXRlIFN0cmluZyBuYW1lOwotCXRyYW5zaWVudCBwcml2YXRlIE5hbWVkTW9kZWxPYmplY3QgcGFyZW50OwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfTkFNRT0icF9uYW1lIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBOYW1lZE1vZGVsT2JqZWN0KCkgewotCX0KLQkKLQlwdWJsaWMgTmFtZWRNb2RlbE9iamVjdChTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoYWRhcHRlci5lcXVhbHMoSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MpKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQobnVsbCk7Ci0JCWlmIChwYXJlbnQhPW51bGwgJiYgcGFyZW50IGluc3RhbmNlb2YgTmFtZWRNb2RlbE9iamVjdCkKLQkJCXJldHVybiAoKE5hbWVkTW9kZWxPYmplY3QpcGFyZW50KS5nZXRQYXRoKCkuYXBwZW5kKGdldE5hbWUoKSk7Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgUGF0aChnZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCW5vdGlmeU9iamVjdENoYW5nZWQoUF9OQU1FKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoQWRhcHRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hBZGFwdGVyI2dldEltYWdlRGVzY3JpcHRvcihPYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0TGFiZWwoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoQWRhcHRlciNnZXRQYXJlbnQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBhcmcwKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChOYW1lZE1vZGVsT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvU2ltcGxlRmVhdHVyZUFkYXB0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9TaW1wbGVGZWF0dXJlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODBmNzlkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9TaW1wbGVGZWF0dXJlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUZlYXR1cmVBZGFwdGVyIGV4dGVuZHMgRmVhdHVyZUFkYXB0ZXIgewotCXByb3RlY3RlZCBJRmVhdHVyZSBmZWF0dXJlOwotCXByaXZhdGUgYm9vbGVhbiBvcHRpb25hbDsKLQlwdWJsaWMgU2ltcGxlRmVhdHVyZUFkYXB0ZXIoSUZlYXR1cmUgZmVhdHVyZSkgewotCQl0aGlzKGZlYXR1cmUsIGZhbHNlKTsKLQl9Ci0JcHVibGljIFNpbXBsZUZlYXR1cmVBZGFwdGVyKElGZWF0dXJlIGZlYXR1cmUsIGJvb2xlYW4gb3B0aW9uYWwpIHsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJdGhpcy5vcHRpb25hbCA9IG9wdGlvbmFsOwotCX0KLQkKLQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RmFzdExhYmVsKCkgewotCQlyZXR1cm4gZmVhdHVyZS5nZXRMYWJlbCgpOwotCX0KLQkKLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsKLQkJcmV0dXJuIGZlYXR1cmUuZ2V0VVJMKCk7Ci0JfQotCQotCXB1YmxpYyBJU2l0ZSBnZXRTaXRlKCkgewotCQlyZXR1cm4gZmVhdHVyZS5nZXRTaXRlKCk7Ci0JfQotCQotCXB1YmxpYyBJRmVhdHVyZUFkYXB0ZXJbXSBnZXRJbmNsdWRlZEZlYXR1cmVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGluY2x1ZGVkID0gZ2V0RmVhdHVyZShtb25pdG9yKS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlTaW1wbGVGZWF0dXJlQWRhcHRlcltdIHJlc3VsdCA9Ci0JCQkJbmV3IFNpbXBsZUZlYXR1cmVBZGFwdGVyW2luY2x1ZGVkLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluY2x1ZGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcmVzdWx0W2ldID0KLQkJCQkJbmV3IFNpbXBsZUZlYXR1cmVBZGFwdGVyKGluY2x1ZGVkW2ldLmdldEZlYXR1cmUobnVsbCksIGluY2x1ZGVkW2ldLmlzT3B0aW9uYWwoKSk7Ci0JCQkJcmVzdWx0W2ldLnNldEluY2x1ZGVkKHRydWUpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbmV3IElGZWF0dXJlQWRhcHRlclswXTsKLQkJfQotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgewotCQlyZXR1cm4gb3B0aW9uYWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1NpdGVCb29rbWFyay5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1NpdGVCb29rbWFyay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTJkNjVkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9TaXRlQm9va21hcmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotCi1wdWJsaWMgY2xhc3MgU2l0ZUJvb2ttYXJrIGV4dGVuZHMgTmFtZWRNb2RlbE9iamVjdCAKLQkJCQkJCQlpbXBsZW1lbnRzIElTaXRlQWRhcHRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1VSTD0icF91cmwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9UWVBFPSJwX3R5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBVUkwgdXJsOwotCXRyYW5zaWVudCBwcml2YXRlIElTaXRlIHNpdGU7Ci0JdHJhbnNpZW50IHByaXZhdGUgVmVjdG9yIGNhdGFsb2cgPSBuZXcgVmVjdG9yKCk7Ci0JdHJhbnNpZW50IHByaXZhdGUgU2l0ZUNhdGVnb3J5IG90aGVyQ2F0ZWdvcnk7Ci0JcHJpdmF0ZSBib29sZWFuIHdlYkJvb2ttYXJrOwotCXByaXZhdGUgYm9vbGVhbiBzZWxlY3RlZDsKLQlwcml2YXRlIFN0cmluZyBbXSBpZ25vcmVkQ2F0ZWdvcmllcyA9IG5ldyBTdHJpbmdbMF07Ci0JcHJpdmF0ZSBib29sZWFuIHJlYWRPbmx5ID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGxvY2FsID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHVuYXZhaWxhYmxlID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgU2l0ZUJvb2ttYXJrKCkgewotCX0KLQkKLQlwdWJsaWMgU2l0ZUJvb2ttYXJrKFN0cmluZyBuYW1lLCBVUkwgdXJsLCBib29sZWFuIHdlYkJvb2ttYXJrKSB7Ci0JCXRoaXMobmFtZSwgdXJsLCB3ZWJCb29rbWFyaywgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgU2l0ZUJvb2ttYXJrKFN0cmluZyBuYW1lLCBVUkwgdXJsLCBib29sZWFuIHdlYkJvb2ttYXJrLCBib29sZWFuIHNlbGVjdGVkKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQl0aGlzLnVybCA9IHVybDsKLQkJdGhpcy53ZWJCb29rbWFyayA9IHdlYkJvb2ttYXJrOwotCQl0aGlzLnNlbGVjdGVkID0gc2VsZWN0ZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKG9iaiA9PSB0aGlzKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFNpdGVCb29rbWFyaykpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIFNpdGVCb29rbWFyayBiID0gKFNpdGVCb29rbWFyaylvYmo7Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHVybC5lcXVhbHMoYi51cmwpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIGlmICh1cmwgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gdXJsLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0ZWQoYm9vbGVhbiBzZWxlY3RlZCkgewotCQl0aGlzLnNlbGVjdGVkID0gc2VsZWN0ZWQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoKSB7Ci0JCXJldHVybiBzZWxlY3RlZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBbXSBnZXRJZ25vcmVkQ2F0ZWdvcmllcygpIHsKLQkJcmV0dXJuIGlnbm9yZWRDYXRlZ29yaWVzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJZ25vcmVkQ2F0ZWdvcmllcyhTdHJpbmcgW10gY2F0ZWdvcmllcykgewotCQl0aGlzLmlnbm9yZWRDYXRlZ29yaWVzID0gY2F0ZWdvcmllczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0V2ViQm9va21hcmsoYm9vbGVhbiB2YWx1ZSkgewotCQlpZiAoaXNMb2NhbCgpKSByZXR1cm47Ci0JCXRoaXMud2ViQm9va21hcmsgPSB2YWx1ZTsKLQkJbm90aWZ5T2JqZWN0Q2hhbmdlZChQX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1dlYkJvb2ttYXJrKCkgewotCQlyZXR1cm4gd2ViQm9va21hcms7Ci0JfQotCQotCXB1YmxpYyBVUkwgZ2V0VVJMKCkgewotCQlyZXR1cm4gdXJsOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0VVJMKFVSTCB1cmwpIHsKLQkJdGhpcy51cmwgPSB1cmw7Ci0JCXNpdGUgPSBudWxsOwotCQlub3RpZnlPYmplY3RDaGFuZ2VkKFBfVVJMKTsKLQl9Ci0JCi0JcHVibGljIElTaXRlIGdldFNpdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBnZXRTaXRlKHRydWUsIG1vbml0b3IpOwotCX0KLQkKLQlwdWJsaWMgSVNpdGUgZ2V0U2l0ZShib29sZWFuIHNob3dEaWFsb2dJZkZhaWxlZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChzaXRlPT1udWxsKSB7Ci0JCQl0cnkgewotCQkJCWNvbm5lY3QobW9uaXRvcik7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUsIHNob3dEaWFsb2dJZkZhaWxlZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNpdGU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzU2l0ZUNvbm5lY3RlZCgpIHsKLQkJcmV0dXJuIHNpdGUhPW51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNvbm5lY3QoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWNvbm5lY3QodHJ1ZSwgbW9uaXRvcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNvbm5lY3QoYm9vbGVhbiB1c2VDYWNoZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlpZiAobW9uaXRvcj09bnVsbCkgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMik7IC8vJE5PTi1OTFMtMSQKLQkJCW1vbml0b3Iuc3ViVGFzayhOTFMuYmluZChVcGRhdGVVSU1lc3NhZ2VzLlNpdGVCb29rbWFya19jb25uZWN0aW5nLCB1cmwudG9TdHJpbmcoKSkpOwotCQkJc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUodXJsLCB1c2VDYWNoZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0JCQlpZiAoc2l0ZSE9bnVsbCkgewotCQkJCWNyZWF0ZUNhdGFsb2cobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0JCQkJdW5hdmFpbGFibGUgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2F0YWxvZyA9IG5ldyBWZWN0b3IoKTsKLQkJCQl1bmF2YWlsYWJsZSA9IHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdW5hdmFpbGFibGUgPSB0cnVlOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1VuYXZhaWxhYmxlKCkgewotCQlyZXR1cm4gdW5hdmFpbGFibGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFVuYXZhaWxhYmxlKGJvb2xlYW4gdmFsdWUpIHsKLQkJdW5hdmFpbGFibGUgPSB2YWx1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNhdGFsb2coSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWNhdGFsb2cgPSBuZXcgVmVjdG9yKCk7Ci0JCW90aGVyQ2F0ZWdvcnkgPSBuZXcgU2l0ZUNhdGVnb3J5KHRoaXMsIG51bGwsIG51bGwpOwotCQkvLyBBZGQgYWxsIHRoZSBjYXRlZ29yaWVzCi0JCUlDYXRlZ29yeSBbXSBjYXRlZ29yaWVzID0gc2l0ZS5nZXRDYXRlZ29yaWVzKCk7Ci0JCQotCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgW10gZmVhdHVyZVJlZnM7Ci0JCWZlYXR1cmVSZWZzID0gc2l0ZS5nZXRSYXdGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkKLQkJbW9uaXRvci5iZWdpblRhc2soIiIsIGZlYXR1cmVSZWZzLmxlbmd0aCArIGNhdGVnb3JpZXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZvciAoaW50IGk9MDsgaTxjYXRlZ29yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBjYXRlZ29yaWVzW2ldOwotCQkJYWRkQ2F0ZWdvcnlUb0NhdGFsb2coY2F0ZWdvcnkpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCX0KLQkJLy8gQWRkIGZlYXR1cmVzIHRvIGNhdGVnb3JpZXMKLQotCQlmb3IgKGludCBpPTA7IGk8ZmVhdHVyZVJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmID0gZmVhdHVyZVJlZnNbaV07Ci0JCQlhZGRGZWF0dXJlVG9DYXRhbG9nKGZlYXR1cmVSZWYpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCX0KLQkJaWYgKG90aGVyQ2F0ZWdvcnkuZ2V0Q2hpbGRDb3VudCgpPjApCi0JCSAgIGNhdGFsb2cuYWRkKG90aGVyQ2F0ZWdvcnkpOwotCQkKLQkJLy8gc2V0IHRoZSBzaXRlIGRlc2NyaXB0aW9uCi0JCUlVUkxFbnRyeSBkZXNjVVJMID0gc2l0ZS5nZXREZXNjcmlwdGlvbigpOwotCQlpZiAoZGVzY1VSTCAhPSBudWxsKQotCQkJZGVzY3JpcHRpb24gPSBkZXNjVVJMLmdldEFubm90YXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IFtdIGdldENhdGFsb2coYm9vbGVhbiB3aXRoQ2F0ZWdvcmllcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmICh3aXRoQ2F0ZWdvcmllcykKLQkJCXJldHVybiBjYXRhbG9nLnRvQXJyYXkoKTsKLQkJZWxzZSB7Ci0JCQkvLyBNYWtlIGEgZmxhdCBjYXRhbG9nCi0JCQlWZWN0b3IgZmxhdENhdGFsb2cgPSBuZXcgVmVjdG9yKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8Y2F0YWxvZy5zaXplKCk7IGkrKykgewotCQkJCVNpdGVDYXRlZ29yeSBjYXRlZ29yeSA9IChTaXRlQ2F0ZWdvcnkpY2F0YWxvZy5nZXQoaSk7Ci0JCQkJY2F0ZWdvcnkuYWRkRmVhdHVyZXNUbyhmbGF0Q2F0YWxvZyk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmxhdENhdGFsb2cudG9BcnJheSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRDYXRlZ29yeVRvQ2F0YWxvZyhJQ2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLQkJU3RyaW5nIG5hbWUgPSBjYXRlZ29yeS5nZXROYW1lKCk7Ci0JCWludCBsb2MgPSBuYW1lLmluZGV4T2YoJy8nKTsKLQkJaWYgKGxvYyA9PSAtMSkgewotCQkJLy8gZmlyc3QgbGV2ZWwKLQkJCWNhdGFsb2cuYWRkKG5ldyBTaXRlQ2F0ZWdvcnkodGhpcywgbmFtZSwgY2F0ZWdvcnkpKTsKLQkJfQotCQllbHNlIHsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChuYW1lKTsKLQkJCW5hbWUgPSBwYXRoLmxhc3RTZWdtZW50KCkudG9TdHJpbmcoKTsKLQkJCXBhdGggPSBwYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQkJCVNpdGVDYXRlZ29yeSBwYXJlbnRDYXRlZ29yeSA9IGZpbmRDYXRlZ29yeShwYXRoLCBjYXRhbG9nLnRvQXJyYXkoKSk7Ci0JCQlpZiAocGFyZW50Q2F0ZWdvcnkhPW51bGwpIHsKLQkJCQlwYXJlbnRDYXRlZ29yeS5hZGQobmV3IFNpdGVDYXRlZ29yeSh0aGlzLCBuYW1lLCBjYXRlZ29yeSkpOwotCQkJfQotCQl9Ci0JfQotCXByaXZhdGUgdm9pZCBhZGRGZWF0dXJlVG9DYXRhbG9nKElTaXRlRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlKSB7Ci0JCUlDYXRlZ29yeSBbXSBjYXRlZ29yaWVzID0gZmVhdHVyZS5nZXRDYXRlZ29yaWVzKCk7Ci0JCWJvb2xlYW4gb3JwaGFuID0gdHJ1ZTsKLQotCQlmb3IgKGludCBpPTA7IGk8Y2F0ZWdvcmllcy5sZW5ndGg7IGkrKykgewotCQkJSUNhdGVnb3J5IGNhdGVnb3J5ID0gY2F0ZWdvcmllc1tpXTsKLQkJCVN0cmluZyBuYW1lID0gY2F0ZWdvcnkuZ2V0TmFtZSgpOwotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKG5hbWUpOwotCQkJU2l0ZUNhdGVnb3J5IHBhcmVudENhdGVnb3J5ID0gZmluZENhdGVnb3J5KHBhdGgsIGNhdGFsb2cudG9BcnJheSgpKTsKLQkJCWlmIChwYXJlbnRDYXRlZ29yeSE9bnVsbCkgewotCQkgICAJCXBhcmVudENhdGVnb3J5LmFkZChuZXcgRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXIoZmVhdHVyZSkpOwotCQkgICAJCW9ycGhhbiA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmIChvcnBoYW4pCi0JCQlvdGhlckNhdGVnb3J5LmFkZChuZXcgRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXIoZmVhdHVyZSkpOwotCX0KLQkKLQlwcml2YXRlIFNpdGVDYXRlZ29yeSBmaW5kQ2F0ZWdvcnkoSVBhdGggcGF0aCwgT2JqZWN0IFtdIGNoaWxkcmVuKSB7Ci0JCWZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBTaXRlQ2F0ZWdvcnkpIHsKLQkJCQlTaXRlQ2F0ZWdvcnkgc2MgPSAoU2l0ZUNhdGVnb3J5KWNoaWxkOwotCQkJCWlmIChzYy5nZXROYW1lKCkuZXF1YWxzKHBhdGguc2VnbWVudCgwKSkpIHsKLQkJCQkgICBpZiAocGF0aC5zZWdtZW50Q291bnQoKT09MSkgcmV0dXJuIHNjOwotCQkJCQllbHNlIHsKLQkJCQkJCXBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7Ci0JCQkJCQlyZXR1cm4gZmluZENhdGVnb3J5KHBhdGgsIHNjLmdldENoaWxkcmVuKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElTaXRlQWRhcHRlciNnZXRMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiByZWFkT25seSkgewotCQl0aGlzLnJlYWRPbmx5ID0gcmVhZE9ubHk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiByZWFkT25seTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TG9jYWwoYm9vbGVhbiBsb2NhbCkgewotCQl0aGlzLmxvY2FsID0gbG9jYWw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzTG9jYWwoKSB7Ci0JCXJldHVybiBsb2NhbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwgJiYgaXNTaXRlQ29ubmVjdGVkKCkpIHsKLQkJCUlVUkxFbnRyeSBkZXNjVVJMID0gc2l0ZS5nZXREZXNjcmlwdGlvbigpOwotCQkJaWYgKGRlc2NVUkwgIT0gbnVsbCkKLQkJCQlkZXNjcmlwdGlvbiA9IGRlc2NVUkwuZ2V0QW5ub3RhdGlvbigpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvU2l0ZUNhdGVnb3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvU2l0ZUNhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1M2IwOTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1NpdGVDYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JVVJMRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBTaXRlQ2F0ZWdvcnkgZXh0ZW5kcyBVSU1vZGVsT2JqZWN0IHsKLQotCVZlY3RvciBjaGlsZHJlbjsKLQlwcml2YXRlIElDYXRlZ29yeSBjYXRlZ29yeTsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgYm9vbGVhbiB0b3VjaGVkOwotCXByaXZhdGUgaW50IGZlYXR1cmVDb3VudDsKLQlwcml2YXRlIGJvb2xlYW4gY2FuY2VsZWQ7Ci0JcHJpdmF0ZSBTaXRlQm9va21hcmsgYm9va21hcms7Ci0KLQljbGFzcyBPdGhlckNhdGVnb3J5IGltcGxlbWVudHMgSUNhdGVnb3J5IHsKLQkJSVVSTEVudHJ5IGVudHJ5OwotCQlwdWJsaWMgT3RoZXJDYXRlZ29yeSgpIHsKLQkJCWVudHJ5ID0gbmV3IElVUkxFbnRyeSgpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb24oKSB7Ci0JCQkJCXJldHVybiBNZXNzYWdlcy5TaXRlQ2F0ZWdvcnlfb3RoZXJfZGVzY3JpcHRpb247IAotCQkJCX0KLQkJCQlwdWJsaWMgVVJMIGdldFVSTCgpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBjbGF6eikgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcHVibGljIGludCBnZXRUeXBlKCkgewotCQkJCQlyZXR1cm4gSVVSTEVudHJ5LlVQREFURV9TSVRFOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIFNpdGVDYXRlZ29yeS50aGlzLmdldE5hbWUoKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkJcmV0dXJuIFNpdGVDYXRlZ29yeS50aGlzLmdldE5hbWUoKTsKLQkJfQotCQlwdWJsaWMgSVVSTEVudHJ5IGdldERlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIGVudHJ5OwotCQl9Ci0JCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBjbGF6eikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU2l0ZUNhdGVnb3J5KFNpdGVCb29rbWFyayBib29rbWFyaywgU3RyaW5nIG5hbWUsIElDYXRlZ29yeSBjYXRlZ29yeSkgewotCQl0aGlzLmJvb2ttYXJrID0gYm9va21hcms7Ci0JCWlmIChjYXRlZ29yeSA9PSBudWxsKSB7Ci0JCQl0aGlzLm5hbWUgPSBNZXNzYWdlcy5TaXRlQ2F0ZWdvcnlfb3RoZXJfbGFiZWw7IAotCQkJdGhpcy5jYXRlZ29yeSA9IG5ldyBPdGhlckNhdGVnb3J5KCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OwotCQl9Ci0JCWNoaWxkcmVuID0gbmV3IFZlY3RvcigpOwotCX0KLQkKLQlwdWJsaWMgU2l0ZUJvb2ttYXJrIGdldEJvb2ttYXJrKCkgewotCQlyZXR1cm4gYm9va21hcms7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPdGhlckNhdGVnb3J5KCkgewotCQlyZXR1cm4gY2F0ZWdvcnkgaW5zdGFuY2VvZiBPdGhlckNhdGVnb3J5OwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIGNhbmNlbGVkID8gbmV3IE9iamVjdFswXSA6IGNoaWxkcmVuLnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENoaWxkQ291bnQoKSB7Ci0JCXJldHVybiBjYW5jZWxlZCA/IDAgOiBjaGlsZHJlbi5zaXplKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsKLQkJcmV0dXJuIGNhdGVnb3J5LmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gY2F0ZWdvcnkuZ2V0TGFiZWwoKTsKLQl9Ci0KLQlwdWJsaWMgSUNhdGVnb3J5IGdldENhdGVnb3J5KCkgewotCQlyZXR1cm4gY2F0ZWdvcnk7Ci0JfQotCi0Jdm9pZCBhZGQoT2JqZWN0IGNoaWxkKSB7Ci0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIElGZWF0dXJlQWRhcHRlcikKLQkJCWZlYXR1cmVDb3VudCsrOwotCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRvdWNoRmVhdHVyZXMoSVJ1bm5hYmxlQ29udGV4dCBjb250ZXh0KSB7Ci0JCWlmIChjaGlsZHJlbi5zaXplKCkgPT0gMCB8fCB0b3VjaGVkIHx8IGZlYXR1cmVDb3VudCA9PSAwKQotCQkJcmV0dXJuOwotCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soCi0JCQkJCVVwZGF0ZVVJTWVzc2FnZXMuU2l0ZUJvb2ttYXJrX2Rvd25sb2FkaW5nLCAKLQkJCQkJZmVhdHVyZUNvdW50KTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQkJCU9iamVjdCBjaGlsZCA9IGNoaWxkcmVuLmdldChpKTsKLQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQkJYnJlYWs7Ci0JCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElGZWF0dXJlQWRhcHRlcikgewotCQkJCQkJSUZlYXR1cmVBZGFwdGVyIGFkYXB0ZXIgPSAoSUZlYXR1cmVBZGFwdGVyKSBjaGlsZDsKLQkJCQkJCW1vbml0b3Iuc3ViVGFzayhhZGFwdGVyLmdldEZhc3RMYWJlbCgpKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJYWRhcHRlci5nZXRGZWF0dXJlKAotCQkJCQkJCQluZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQljb250ZXh0LnJ1bih0cnVlLCB0cnVlLCBvcCk7Ci0JCQl0b3VjaGVkID0gdHJ1ZTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJY2FuY2VsZWQgPSB0cnVlOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEZlYXR1cmVzVG8oVmVjdG9yIGZsYXRMaXN0KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGNoaWxkcmVuLmdldChpKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyKSB7Ci0JCQkJRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXIgY2ZlYXR1cmUgPQotCQkJCQkoRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXIpIGNoaWxkOwotCQkJCS8vIERvbid0IGFkZCBkdXBsaWNhdGVzIC0gdGhlcmUgbWF5IGJlIHRoZSBzYW1lCi0JCQkJLy8gZmVhdHVyZSBwcmVzZW50IGluIHNldmVyYWwgY2F0ZWdvcmllcwotCQkJCWlmIChmaW5kRmVhdHVyZShmbGF0TGlzdCwgY2ZlYXR1cmUuZ2V0RmVhdHVyZVJlZmVyZW5jZSgpKQotCQkJCQk9PSBudWxsKSB7Ci0JCQkJCWZsYXRMaXN0LmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIFNpdGVDYXRlZ29yeSkgewotCQkJCSgoU2l0ZUNhdGVnb3J5KSBjaGlsZCkuYWRkRmVhdHVyZXNUbyhmbGF0TGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyIGZpbmRGZWF0dXJlKAotCQlWZWN0b3IgZmxhdExpc3QsCi0JCUlGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWYpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGF0TGlzdC5zaXplKCk7IGkrKykgewotCQkJRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXIgY2ZlYXR1cmUgPQotCQkJCShGZWF0dXJlUmVmZXJlbmNlQWRhcHRlcikgZmxhdExpc3QuZ2V0KGkpOwotCQkJaWYgKGNmZWF0dXJlLmdldEZlYXR1cmVSZWZlcmVuY2UoKS5lcXVhbHMoZmVhdHVyZVJlZikpCi0JCQkJcmV0dXJuIGNmZWF0dXJlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0KLQkJaWYgKCAob2JqZWN0ID09IG51bGwpIHx8ICEoIG9iamVjdCBpbnN0YW5jZW9mIFNpdGVDYXRlZ29yeSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAoIHRoaXMgPT0gb2JqZWN0KQotCQkJcmV0dXJuIHRydWU7Ci0JCQotCQlyZXR1cm4gZ2V0TmFtZSgpLmVxdWFscygoKFNpdGVDYXRlZ29yeSlvYmplY3QpLmdldE5hbWUoKSkgJiYgYm9va21hcmsuZXF1YWxzKCgoU2l0ZUNhdGVnb3J5KW9iamVjdCkuZ2V0Qm9va21hcmsoKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCi0JCXJldHVybiBnZXROYW1lKCkuaGFzaENvZGUoKSAqICggKGJvb2ttYXJrID09IG51bGwpPyAxOiBib29rbWFyay5oYXNoQ29kZSgpKTsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvVUlNb2RlbE9iamVjdC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1VJTW9kZWxPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3NDk3OC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvVUlNb2RlbE9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuKjsKLQotCi1wdWJsaWMgY2xhc3MgVUlNb2RlbE9iamVjdCBleHRlbmRzIFBsYXRmb3JtT2JqZWN0IGltcGxlbWVudHMgSVdvcmtiZW5jaEFkYXB0ZXIgewotCVVwZGF0ZU1vZGVsIG1vZGVsOwotCQotCXB1YmxpYyB2b2lkIHNldE1vZGVsKFVwZGF0ZU1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQl9Ci0JCi0JcHVibGljIFVwZGF0ZU1vZGVsIGdldE1vZGVsKCkgewotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeU9iamVjdENoYW5nZWQoU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWlmIChtb2RlbD09bnVsbCkgcmV0dXJuOwotCQltb2RlbC5maXJlT2JqZWN0Q2hhbmdlZCh0aGlzLCBwcm9wZXJ0eSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeU9iamVjdHNBZGRlZChPYmplY3QgcGFyZW50LCBPYmplY3QgW10gb2JqZWN0cykgewotCQlpZiAobW9kZWw9PW51bGwpIHJldHVybjsKLQkJbW9kZWwuZmlyZU9iamVjdHNBZGRlZChwYXJlbnQsIG9iamVjdHMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlPYmplY3RzUmVtb3ZlZChPYmplY3QgcGFyZW50LCBPYmplY3QgW10gb2JqZWN0cykgewotCQlpZiAobW9kZWw9PW51bGwpIHJldHVybjsKLQkJbW9kZWwuZmlyZU9iamVjdHNSZW1vdmVkKHBhcmVudCwgb2JqZWN0cyk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iaikgewotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiB0b1N0cmluZygpOwotCX0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9VcGRhdGVNb2RlbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1VwZGF0ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNTkxYjcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1VwZGF0ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVNb2RlbCBpbXBsZW1lbnRzIElBZGFwdGFibGUgewotCXByaXZhdGUgVmVjdG9yIGJvb2ttYXJrcyA9IG5ldyBWZWN0b3IoKTsKLQlwcml2YXRlIFZlY3RvciBsaXN0ZW5lcnMgPSBuZXcgVmVjdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0tNQVJLX0ZJTEUgPSAiYm9va21hcmtzLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgVXBkYXRlTW9kZWwoKSB7Ci0JCXJlc2V0KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQkvLyBsb2FkIGJvb2ttYXJrcwotCQlib29rbWFya3MuY2xlYXIoKTsKLQkJQm9va21hcmtVdGlsLnBhcnNlKGdldEJvb2ttYXJrc0ZpbGVOYW1lKCksIGJvb2ttYXJrcyk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEJvb2ttYXJrc0ZpbGVOYW1lKCkgewotCQlVUkwgcGxhdGZvcm1YTUwgPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCk7Ci0JCWlmICghImZpbGUiLmVxdWFscyhwbGF0Zm9ybVhNTC5nZXRQcm90b2NvbCgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlJUGF0aCBwYXRoID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKTsKLQkJCXBhdGggPSBwYXRoLmFwcGVuZChCT09LTUFSS19GSUxFKTsKLQkJCXJldHVybiBwYXRoLnRvT1NTdHJpbmcoKTsKLQkJfSBlbHNlIHsKLQkJCUZpbGUgZiA9IG5ldyBGaWxlKHBsYXRmb3JtWE1MLmdldEZpbGUoKSk7Ci0JCQlmID0gbmV3IEZpbGUoZi5nZXRQYXJlbnRGaWxlKCksIEJPT0tNQVJLX0ZJTEUpOwotCQkJcmV0dXJuIGYuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCXNhdmVCb29rbWFya3MoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2F2ZUJvb2ttYXJrcygpIHsKLQkJQm9va21hcmtVdGlsLnN0b3JlKGdldEJvb2ttYXJrc0ZpbGVOYW1lKCksIGJvb2ttYXJrcyk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIGFkZEJvb2ttYXJrKE5hbWVkTW9kZWxPYmplY3QgYm9va21hcmspIHsKLQkJYm9va21hcmtzLmFkZChib29rbWFyayk7Ci0JCWJvb2ttYXJrLnNldE1vZGVsKHRoaXMpOwotCQlmaXJlT2JqZWN0c0FkZGVkKG51bGwsIG5ldyBPYmplY3QgW117Ym9va21hcmt9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlQm9va21hcmsoTmFtZWRNb2RlbE9iamVjdCBib29rbWFyaykgewotCQlib29rbWFya3MucmVtb3ZlKGJvb2ttYXJrKTsKLQkJYm9va21hcmsuc2V0TW9kZWwobnVsbCk7Ci0JCWZpcmVPYmplY3RzUmVtb3ZlZChudWxsLCBuZXcgT2JqZWN0IFtde2Jvb2ttYXJrfSk7Ci0JfQotCQotCXB1YmxpYyBOYW1lZE1vZGVsT2JqZWN0IFtdIGdldEJvb2ttYXJrcygpIHsKLQkJcmV0dXJuIChOYW1lZE1vZGVsT2JqZWN0W10pYm9va21hcmtzLnRvQXJyYXkobmV3IE5hbWVkTW9kZWxPYmplY3RbYm9va21hcmtzLnNpemUoKV0pOwotCX0KLQkKLQlwdWJsaWMgU2l0ZUJvb2ttYXJrIFtdIGdldEJvb2ttYXJrTGVhZnMoKSB7Ci0JCXJldHVybiBCb29rbWFya1V0aWwuZ2V0Qm9va21hcmtzKGJvb2ttYXJrcyk7Ci0JfQotCQotCXB1YmxpYyBCb29rbWFya0ZvbGRlciBnZXRGb2xkZXIoSVBhdGggcGF0aCkgewotCQlyZXR1cm4gQm9va21hcmtVdGlsLmdldEZvbGRlcihib29rbWFya3MsIHBhdGgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcihJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKCFsaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSAKLQkJICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCByZW1vdmVVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcihJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpCi0JCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZmlyZU9iamVjdHNBZGRlZChPYmplY3QgcGFyZW50LCBPYmplY3QgW10gY2hpbGRyZW4pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyPWxpc3RlbmVycy5pdGVyYXRvcigpOwotCQkJCWl0ZXIuaGFzTmV4dCgpOykgewotCQkJSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcilpdGVyLm5leHQoKTsKLQkJCWxpc3RlbmVyLm9iamVjdHNBZGRlZChwYXJlbnQsIGNoaWxkcmVuKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgZmlyZU9iamVjdHNSZW1vdmVkKE9iamVjdCBwYXJlbnQsIE9iamVjdCBbXSBjaGlsZHJlbikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9bGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JCQkJaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKWl0ZXIubmV4dCgpOwotCQkJbGlzdGVuZXIub2JqZWN0c1JlbW92ZWQocGFyZW50LCBjaGlsZHJlbik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZmlyZU9iamVjdENoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcj1saXN0ZW5lcnMuaXRlcmF0b3IoKTsKLQkJCWl0ZXIuaGFzTmV4dCgpOykgewotCQkJSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcilpdGVyLm5leHQoKTsKLQkJCWxpc3RlbmVyLm9iamVjdENoYW5nZWQob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JCX0KLQl9Ci0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGtleSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvQWJzdHJhY3RPdmVybGF5SWNvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL0Fic3RyYWN0T3ZlcmxheUljb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJlNTBiOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvQWJzdHJhY3RPdmVybGF5SWNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotCi0vKioKLSAqIEFuIE92ZXJsYXlJY29uIGNvbnNpc3RzIG9mIGEgbWFpbiBpY29uIGFuZCBzZXZlcmFsIGFkb3JubWVudHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE92ZXJsYXlJY29uIGV4dGVuZHMgQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yIHsKLQotCXN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9XSURUSCA9IDE2OwotCXN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9IRUlHSFQgPSAxNjsKLQotCXByaXZhdGUgUG9pbnQgZlNpemUgPSBudWxsOwotCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZk92ZXJsYXlzW11bXTsKLQotCXB1YmxpYyBBYnN0cmFjdE92ZXJsYXlJY29uKEltYWdlRGVzY3JpcHRvcltdW10gb3ZlcmxheXMpIHsKLQkJdGhpcyhvdmVybGF5cywgbnVsbCk7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0T3ZlcmxheUljb24oSW1hZ2VEZXNjcmlwdG9yW11bXSBvdmVybGF5cywgUG9pbnQgc2l6ZSkgewotCQlmT3ZlcmxheXMgPSBvdmVybGF5czsKLQkJaWYgKHNpemUgIT0gbnVsbCkKLQkJCWZTaXplID0gc2l6ZTsKLQkJZWxzZQotCQkJZlNpemUgPSBuZXcgUG9pbnQoREVGQVVMVF9XSURUSCwgREVGQVVMVF9IRUlHSFQpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3Qm90dG9tTGVmdChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgewotCQlpZiAob3ZlcmxheXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGxlbmd0aCA9IG92ZXJsYXlzLmxlbmd0aDsKLQkJaW50IHggPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJaWYgKGkgPCBsZW5ndGggJiYgb3ZlcmxheXNbaV0gIT0gbnVsbCkgewotCQkJCUltYWdlRGF0YSBpZCA9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOwotCQkJCWRyYXdJbWFnZShpZCwgeCwgZ2V0U2l6ZSgpLnkgLSBpZC5oZWlnaHQpOwotCQkJCXggKz0gaWQud2lkdGg7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgZHJhd0JvdHRvbVJpZ2h0KEltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzKSB7Ci0JCWlmIChvdmVybGF5cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gb3ZlcmxheXMubGVuZ3RoOwotCQlpbnQgeCA9IGdldFNpemUoKS54OwotCQlmb3IgKGludCBpID0gMjsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKLQkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLQkJCQl4IC09IGlkLndpZHRoOwotCQkJCWRyYXdJbWFnZShpZCwgeCwgZ2V0U2l6ZSgpLnkgLSBpZC5oZWlnaHQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEltYWdlRGF0YSBnZXRCYXNlSW1hZ2VEYXRhKCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3Q29tcG9zaXRlSW1hZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCUltYWdlRGF0YSBiYXNlID0gZ2V0QmFzZUltYWdlRGF0YSgpOwotCQlkcmF3SW1hZ2UoYmFzZSwgMCwgMCk7Ci0JCWlmIChmT3ZlcmxheXMgIT0gbnVsbCkgewotCQkJaWYgKGZPdmVybGF5cy5sZW5ndGggPiAwKQotCQkJCWRyYXdUb3BSaWdodChmT3ZlcmxheXNbMF0pOwotCi0JCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDEpCi0JCQkJZHJhd0JvdHRvbVJpZ2h0KGZPdmVybGF5c1sxXSk7Ci0KLQkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMikKLQkJCQlkcmF3Qm90dG9tTGVmdChmT3ZlcmxheXNbMl0pOwotCi0JCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDMpCi0JCQkJZHJhd1RvcExlZnQoZk92ZXJsYXlzWzNdKTsKLQkJfQotCX0KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3VG9wTGVmdChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgewotCQlpZiAob3ZlcmxheXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGxlbmd0aCA9IG92ZXJsYXlzLmxlbmd0aDsKLQkJaW50IHggPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJaWYgKGkgPCBsZW5ndGggJiYgb3ZlcmxheXNbaV0gIT0gbnVsbCkgewotCQkJCUltYWdlRGF0YSBpZCA9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOwotCQkJCWRyYXdJbWFnZShpZCwgeCwgMCk7Ci0JCQkJeCArPSBpZC53aWR0aDsKLQkJCX0KLQkJfQotCX0KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3VG9wUmlnaHQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLQkJaWYgKG92ZXJsYXlzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7Ci0JCWludCB4ID0gZ2V0U2l6ZSgpLng7Ci0JCWZvciAoaW50IGkgPSAyOyBpID49IDA7IGktLSkgewotCQkJaWYgKGkgPCBsZW5ndGggJiYgb3ZlcmxheXNbaV0gIT0gbnVsbCkgewotCQkJCUltYWdlRGF0YSBpZCA9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOwotCQkJCXggLT0gaWQud2lkdGg7Ci0JCQkJZHJhd0ltYWdlKGlkLCB4LCAwKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBQb2ludCBnZXRTaXplKCkgewotCQlyZXR1cm4gZlNpemU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL0RlZmF1bHRDb250ZW50UHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9EZWZhdWx0Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMWMxZjMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL0RlZmF1bHRDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbnRlbnRQcm92aWRlciB7Ci0KLXB1YmxpYyBEZWZhdWx0Q29udGVudFByb3ZpZGVyKCkgewotCXN1cGVyKCk7Ci19Ci1wdWJsaWMgdm9pZCBkaXNwb3NlKCkge30KLXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkge30KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9JbWFnZU92ZXJsYXlJY29uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvSW1hZ2VPdmVybGF5SWNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODc5MThiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9JbWFnZU92ZXJsYXlJY29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBbiBPdmVybGF5SWNvbiBjb25zaXN0cyBvZiBhIG1haW4gaWNvbiBhbmQgc2V2ZXJhbCBhZG9ybm1lbnRzLgotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VPdmVybGF5SWNvbiBleHRlbmRzIEFic3RyYWN0T3ZlcmxheUljb24gewotCXByaXZhdGUgSW1hZ2UgYmFzZTsKLQotCXB1YmxpYyBJbWFnZU92ZXJsYXlJY29uKEltYWdlIGJhc2UsIEltYWdlRGVzY3JpcHRvcltdW10gb3ZlcmxheXMpIHsKLQkJdGhpcyhiYXNlLCBvdmVybGF5cywgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBJbWFnZU92ZXJsYXlJY29uKEltYWdlIGJhc2UsIEltYWdlRGVzY3JpcHRvcltdW10gb3ZlcmxheXMsIFBvaW50IHNpemUpIHsKLQkJc3VwZXIob3ZlcmxheXMsIHNpemUpOwotCQl0aGlzLmJhc2UgPSBiYXNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW1hZ2VEYXRhIGdldEJhc2VJbWFnZURhdGEoKSB7Ci0JCXJldHVybiBiYXNlLmdldEltYWdlRGF0YSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9PdmVybGF5SWNvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL092ZXJsYXlJY29uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MDViOWMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL092ZXJsYXlJY29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQW4gT3ZlcmxheUljb24gY29uc2lzdHMgb2YgYSBtYWluIGljb24gYW5kIHNldmVyYWwgYWRvcm5tZW50cy4KLSAqLwotcHVibGljIGNsYXNzIE92ZXJsYXlJY29uIGV4dGVuZHMgQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yIHsKLQkKLQlzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfV0lEVEg9IDE2OwotCXN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9IRUlHSFQ9IDE2OwotCQotCXByaXZhdGUgUG9pbnQgZlNpemU9IG51bGw7Ci0JCQotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGZCYXNlOwotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGZPdmVybGF5c1tdW107Ci0KLQlwdWJsaWMgT3ZlcmxheUljb24oSW1hZ2VEZXNjcmlwdG9yIGJhc2UsIEltYWdlRGVzY3JpcHRvcltdW10gb3ZlcmxheXMpIHsKLQkJZkJhc2U9IGJhc2U7Ci0JCWlmIChmQmFzZSA9PSBudWxsKQotCQkJZkJhc2U9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCWZPdmVybGF5cz0gb3ZlcmxheXM7Ci0JCWZTaXplPSBuZXcgUG9pbnQoREVGQVVMVF9XSURUSCwgREVGQVVMVF9IRUlHSFQpOwotCX0KLQlwdWJsaWMgT3ZlcmxheUljb24oSW1hZ2VEZXNjcmlwdG9yIGJhc2UsIEltYWdlRGVzY3JpcHRvcltdW10gb3ZlcmxheXMsIFBvaW50IHNpemUpIHsKLQkJZkJhc2U9IGJhc2U7Ci0JCWlmIChmQmFzZSA9PSBudWxsKQotCQkJZkJhc2U9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCWZPdmVybGF5cz0gb3ZlcmxheXM7Ci0JCWZTaXplPSBzaXplOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3Qm90dG9tTGVmdChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgewotCQlpZiAob3ZlcmxheXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGxlbmd0aD0gb3ZlcmxheXMubGVuZ3RoOwotCQlpbnQgeD0gMDsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IDM7IGkrKykgewotCQkJaWYgKGkgPCBsZW5ndGggJiYgb3ZlcmxheXNbaV0gIT0gbnVsbCkgewotCQkJCUltYWdlRGF0YSBpZD0gb3ZlcmxheXNbaV0uZ2V0SW1hZ2VEYXRhKCk7Ci0JCQkJZHJhd0ltYWdlKGlkLCB4LCBnZXRTaXplKCkueS1pZC5oZWlnaHQpOwotCQkJCXgrPSBpZC53aWR0aDsKLQkJCX0KLQkJfQotCX0KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3Qm90dG9tUmlnaHQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLQkJaWYgKG92ZXJsYXlzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGg9IG92ZXJsYXlzLmxlbmd0aDsKLQkJaW50IHg9IGdldFNpemUoKS54OwotCQlmb3IgKGludCBpPSAyOyBpID49IDA7IGktLSkgewotCQkJaWYgKGkgPCBsZW5ndGggJiYgb3ZlcmxheXNbaV0gIT0gbnVsbCkgewotCQkJCUltYWdlRGF0YSBpZD0gb3ZlcmxheXNbaV0uZ2V0SW1hZ2VEYXRhKCk7Ci0JCQkJeC09IGlkLndpZHRoOwotCQkJCWRyYXdJbWFnZShpZCwgeCwgZ2V0U2l6ZSgpLnktaWQuaGVpZ2h0KTsKLQkJCX0KLQkJfQotCX0KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3Q29tcG9zaXRlSW1hZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCUltYWdlRGF0YSBiZz0gZkJhc2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JCWRyYXdJbWFnZShiZywgMCwgMCk7Ci0JCQotCQlpZiAoZk92ZXJsYXlzICE9IG51bGwpIHsKLQkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMCkKLQkJCQlkcmF3VG9wUmlnaHQoIGZPdmVybGF5c1swXSk7Ci0JCQkJCi0JCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDEpCi0JCQkJZHJhd0JvdHRvbVJpZ2h0KGZPdmVybGF5c1sxXSk7Ci0JCQkJCi0JCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDIpCi0JCQkJZHJhd0JvdHRvbUxlZnQoZk92ZXJsYXlzWzJdKTsKLQkJCQkKLQkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMykKLQkJCQlkcmF3VG9wTGVmdChmT3ZlcmxheXNbM10pOwotCQl9CQotCX0KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3VG9wTGVmdChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgewotCQlpZiAob3ZlcmxheXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGxlbmd0aD0gb3ZlcmxheXMubGVuZ3RoOwotCQlpbnQgeD0gMDsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IDM7IGkrKykgewotCQkJaWYgKGkgPCBsZW5ndGggJiYgb3ZlcmxheXNbaV0gIT0gbnVsbCkgewotCQkJCUltYWdlRGF0YSBpZD0gb3ZlcmxheXNbaV0uZ2V0SW1hZ2VEYXRhKCk7Ci0JCQkJZHJhd0ltYWdlKGlkLCB4LCAwKTsKLQkJCQl4Kz0gaWQud2lkdGg7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgZHJhd1RvcFJpZ2h0KEltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzKSB7Ci0JCWlmIChvdmVybGF5cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoPSBvdmVybGF5cy5sZW5ndGg7Ci0JCWludCB4PSBnZXRTaXplKCkueDsKLQkJZm9yIChpbnQgaT0gMjsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKLQkJCQlJbWFnZURhdGEgaWQ9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOwotCQkJCXgtPSBpZC53aWR0aDsKLQkJCQlkcmF3SW1hZ2UoaWQsIHgsIDApOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFBvaW50IGdldFNpemUoKSB7Ci0JCXJldHVybiBmU2l6ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvUGl4ZWxDb252ZXJ0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9QaXhlbENvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTdiNjA4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9QaXhlbENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBQaXhlbENvbnZlcnRlciB7Ci0JCi0JcHJpdmF0ZSBGb250TWV0cmljcyBmRm9udE1ldHJpY3M7Ci0JCi0JcHVibGljIFBpeGVsQ29udmVydGVyKENvbnRyb2wgY29udHJvbCkgewotCQlHQyBnYyA9IG5ldyBHQyhjb250cm9sKTsKLQkJZ2Muc2V0Rm9udChjb250cm9sLmdldEZvbnQoKSk7Ci0JCWZGb250TWV0cmljcz0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCX0KLQkKLQlwdWJsaWMgaW50IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoaW50IGNoYXJzKSB7Ci0JCXJldHVybiBEaWFsb2cuY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyhmRm9udE1ldHJpY3MsIGNoYXJzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKGludCBkbHVzKSB7Ci0JCXJldHVybiBEaWFsb2cuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoZkZvbnRNZXRyaWNzLCBkbHVzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhpbnQgZGx1cykgewotCQlyZXR1cm4gRGlhbG9nLmNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhmRm9udE1ldHJpY3MsIGRsdXMpOwotCX0KLQkKLQlwdWJsaWMgaW50IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhpbnQgY2hhcnMpIHsKLQkJcmV0dXJuIERpYWxvZy5jb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoZkZvbnRNZXRyaWNzLCBjaGFycyk7Ci0JfQkKLQotfQotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvU1dUVXRpbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL1NXVFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJhNDAzMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvU1dUVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHM7Ci0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gc2ltcGxpZnkgYWNjZXNzIHRvIHNvbWUgU1dUIHJlc291cmNlcy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBTV1RVdGlsIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YW5kYXJkIGRpc3BsYXkgdG8gYmUgdXNlZC4gVGhlIG1ldGhvZCBmaXJzdCBjaGVja3MsIGlmCi0JICogdGhlIHRocmVhZCBjYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyBhbiBhc3NvY2lhdGVkIGRpc2FwbHkuIElmIHNvLCB0aGlzCi0JICogZGlzcGxheSBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgZGVmYXVsdCBkaXNwbGF5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlzcGxheSBnZXRTdGFuZGFyZERpc3BsYXkoKSB7Ci0JCURpc3BsYXkgZGlzcGxheTsKLQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlpZiAoZGlzcGxheSA9PSBudWxsKQotCQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQlyZXR1cm4gZGlzcGxheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGVsbCBmb3IgdGhlIGdpdmVuIHdpZGdldC4gSWYgdGhlIHdpZGdldCBkb2Vzbid0IHJlcHJlc2VudAotCSAqIGEgU1dUIG9iamVjdCB0aGF0IG1hbmFnZSBhIHNoZWxsLCA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaGVsbCBmb3IgdGhlIGdpdmVuIHdpZGdldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2hlbGwgZ2V0U2hlbGwoV2lkZ2V0IHdpZGdldCkgewotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgQ29udHJvbCkKLQkJCXJldHVybiAoKENvbnRyb2wpIHdpZGdldCkuZ2V0U2hlbGwoKTsKLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIENhcmV0KQotCQkJcmV0dXJuICgoQ2FyZXQpIHdpZGdldCkuZ2V0UGFyZW50KCkuZ2V0U2hlbGwoKTsKLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIERyYWdTb3VyY2UpCi0JCQlyZXR1cm4gKChEcmFnU291cmNlKSB3aWRnZXQpLmdldENvbnRyb2woKS5nZXRTaGVsbCgpOwotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgRHJvcFRhcmdldCkKLQkJCXJldHVybiAoKERyb3BUYXJnZXQpIHdpZGdldCkuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCk7Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBNZW51KQotCQkJcmV0dXJuICgoTWVudSkgd2lkZ2V0KS5nZXRQYXJlbnQoKS5nZXRTaGVsbCgpOwotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgU2Nyb2xsQmFyKQotCQkJcmV0dXJuICgoU2Nyb2xsQmFyKSB3aWRnZXQpLmdldFBhcmVudCgpLmdldFNoZWxsKCk7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHdpZHRoIGhpbnQgZm9yIGEgYnV0dG9uIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0QnV0dG9uV2lkdGhIaW50KEJ1dHRvbiBidXR0b24pIHsKLQkJaWYgKGJ1dHRvbi5nZXRGb250KCkuZXF1YWxzKEpGYWNlUmVzb3VyY2VzLmdldERlZmF1bHRGb250KCkpKQotCQkJYnV0dG9uLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0RGlhbG9nRm9udCgpKTsKLQkJUGl4ZWxDb252ZXJ0ZXIgY29udmVydGVyPSBuZXcgUGl4ZWxDb252ZXJ0ZXIoYnV0dG9uKTsKLQkJaW50IHdpZHRoSGludD0gY29udmVydGVyLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuQlVUVE9OX1dJRFRIKTsKLQkJcmV0dXJuIE1hdGgubWF4KHdpZHRoSGludCwgYnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSkueCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB3aWR0aCBhbmQgaGVpZ2h0IGhpbnQgZm9yIHRoZSBidXR0b24gY29udHJvbC4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBpcyBhIE5PUCBpZiB0aGUgYnV0dG9uJ3MgbGF5b3V0IGRhdGEgaXMgbm90Ci0JICogYW4gaW5zdGFuY2Ugb2YgPGNvZGU+R3JpZERhdGE8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBidXR0b24JdGhlIGJ1dHRvbiBmb3Igd2hpY2ggdG8gc2V0IHRoZSBkaW1lbnNpb24gaGludAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRCdXR0b25EaW1lbnNpb25IaW50KEJ1dHRvbiBidXR0b24pIHsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChidXR0b24pOwotCQlBc3NlcnQuaXNOb3ROdWxsKGJ1dHRvbik7Ci0JCU9iamVjdCBnZCA9IGJ1dHRvbi5nZXRMYXlvdXREYXRhKCk7Ci0JCWlmIChnZCBpbnN0YW5jZW9mIEdyaWREYXRhKSB7Ci0JCQkoKEdyaWREYXRhKSBnZCkud2lkdGhIaW50ID0gZ2V0QnV0dG9uV2lkdGhIaW50KGJ1dHRvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGlhbG9nU2l6ZShEaWFsb2cgZGlhbG9nLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJUG9pbnQgY29tcHV0ZWRTaXplID0KLQkJCWRpYWxvZy5nZXRTaGVsbCgpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCXdpZHRoID0gTWF0aC5tYXgoY29tcHV0ZWRTaXplLngsIHdpZHRoKTsKLQkJaGVpZ2h0ID0gTWF0aC5tYXgoY29tcHV0ZWRTaXplLnksIGhlaWdodCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUod2lkdGgsIGhlaWdodCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL1NoYXJlZExhYmVsUHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9TaGFyZWRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZTQ4YjMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL1NoYXJlZExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzOwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci0KLS8qKgotICogQHZlcnNpb24gCTEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgU2hhcmVkTGFiZWxQcm92aWRlcgotCWV4dGVuZHMgTGFiZWxQcm92aWRlcgotCWltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9FUlJPUiA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9XQVJOSU5HID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX0NVUlJFTlQgPSA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfSU5TVEFMTEFCTEUgPSA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfTElOS0VEID0gMTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9NT0QgPSAzMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX1VQREFURUQgPSA2NDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX1VOQ09ORklHVVJFRCA9IDEyODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX0FERCA9IDI1NjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX0RFTCA9IDUxMjsKLQotCUhhc2h0YWJsZSBpbWFnZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JQXJyYXlMaXN0IGNvbnN1bWVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBTaGFyZWRMYWJlbFByb3ZpZGVyKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIGNvbm5lY3QoT2JqZWN0IGNvbnN1bWVyKSB7Ci0JCWlmICghY29uc3VtZXJzLmNvbnRhaW5zKGNvbnN1bWVyKSkKLQkJCWNvbnN1bWVycy5hZGQoY29uc3VtZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoT2JqZWN0IGNvbnN1bWVyKSB7Ci0JCWNvbnN1bWVycy5yZW1vdmUoY29uc3VtZXIpOwotCQlpZiAoY29uc3VtZXJzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXNldCgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXJlc2V0KCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVzZXQoKSB7Ci0JCWZvciAoRW51bWVyYXRpb24gaXRlcmF0b3IgPSBpbWFnZXMuZWxlbWVudHMoKTsgaXRlcmF0b3IuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgaXRlcmF0b3IubmV4dEVsZW1lbnQoKTsKLQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJfQotCQlpbWFnZXMuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0KEltYWdlRGVzY3JpcHRvciBkZXNjKSB7Ci0JCXJldHVybiBnZXQoZGVzYywgMCk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldChJbWFnZURlc2NyaXB0b3IgZGVzYywgaW50IGZsYWdzKSB7Ci0JCU9iamVjdCBrZXkgPSBkZXNjOwotCi0JCWlmIChmbGFncyAhPSAwKSB7Ci0JCQlrZXkgPSBnZXRLZXkoZGVzYy5oYXNoQ29kZSgpLCBmbGFncyk7Ci0JCX0KLQkJSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIGltYWdlcy5nZXQoa2V5KTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCWltYWdlID0gY3JlYXRlSW1hZ2UoZGVzYywgZmxhZ3MpOwotCQkJaW1hZ2VzLnB1dChrZXksIGltYWdlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCQotCXB1YmxpYyBJbWFnZSBnZXQoSW1hZ2UgaW1hZ2UsIGludCBmbGFncykgewotCQlpZiAoZmxhZ3M9PTApIHJldHVybiBpbWFnZTsKLQkJU3RyaW5nIGtleSA9IGdldEtleShpbWFnZS5oYXNoQ29kZSgpLCBmbGFncyk7Ci0JCUltYWdlIHJlc3VsdEltYWdlID0gKEltYWdlKWltYWdlcy5nZXQoa2V5KTsKLQkJaWYgKHJlc3VsdEltYWdlID09IG51bGwpIHsKLQkJCXJlc3VsdEltYWdlID0gY3JlYXRlSW1hZ2UoaW1hZ2UsIGZsYWdzKTsKLQkJCWltYWdlcy5wdXQoa2V5LCByZXN1bHRJbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdEltYWdlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEtleShsb25nIGhhc2hDb2RlLCBpbnQgZmxhZ3MpIHsKLQkJcmV0dXJuICgiIitoYXNoQ29kZSkgKyAiOiIrZmxhZ3M7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXByaXZhdGUgSW1hZ2UgY3JlYXRlSW1hZ2UoSW1hZ2VEZXNjcmlwdG9yIGJhc2VEZXNjLCBpbnQgZmxhZ3MpIHsKLQkJaWYgKGZsYWdzID09IDApIHsKLQkJCXJldHVybiBiYXNlRGVzYy5jcmVhdGVJbWFnZSgpOwotCQl9Ci0JCUltYWdlRGVzY3JpcHRvcltdIGxvd2VyTGVmdCA9IGdldExvd2VyTGVmdE92ZXJsYXlzKGZsYWdzKTsKLQkJSW1hZ2VEZXNjcmlwdG9yW10gdXBwZXJSaWdodCA9IGdldFVwcGVyUmlnaHRPdmVybGF5cyhmbGFncyk7Ci0JCUltYWdlRGVzY3JpcHRvcltdIGxvd2VyUmlnaHQgPSBnZXRMb3dlclJpZ2h0T3ZlcmxheXMoZmxhZ3MpOwotCQlJbWFnZURlc2NyaXB0b3JbXSB1cHBlckxlZnQgPSBnZXRVcHBlckxlZnRPdmVybGF5cyhmbGFncyk7Ci0JCU92ZXJsYXlJY29uIGNvbXBEZXNjID0KLQkJCW5ldyBPdmVybGF5SWNvbigKLQkJCQliYXNlRGVzYywKLQkJCQluZXcgSW1hZ2VEZXNjcmlwdG9yW11bXSB7IHVwcGVyUmlnaHQsIGxvd2VyUmlnaHQsIGxvd2VyTGVmdCwgdXBwZXJMZWZ0IH0pOwotCQlyZXR1cm4gY29tcERlc2MuY3JlYXRlSW1hZ2UoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJbWFnZSBjcmVhdGVJbWFnZShJbWFnZSBiYXNlSW1hZ2UsIGludCBmbGFncykgewotCQlpZiAoZmxhZ3MgPT0gMCkgewotCQkJcmV0dXJuIGJhc2VJbWFnZTsKLQkJfQotCQlJbWFnZURlc2NyaXB0b3JbXSBsb3dlckxlZnQgPSBnZXRMb3dlckxlZnRPdmVybGF5cyhmbGFncyk7Ci0JCUltYWdlRGVzY3JpcHRvcltdIHVwcGVyUmlnaHQgPSBnZXRVcHBlclJpZ2h0T3ZlcmxheXMoZmxhZ3MpOwotCQlJbWFnZURlc2NyaXB0b3JbXSBsb3dlclJpZ2h0ID0gZ2V0TG93ZXJSaWdodE92ZXJsYXlzKGZsYWdzKTsKLQkJSW1hZ2VEZXNjcmlwdG9yW10gdXBwZXJMZWZ0ID0gZ2V0VXBwZXJMZWZ0T3ZlcmxheXMoZmxhZ3MpOwotCQlJbWFnZU92ZXJsYXlJY29uIGNvbXBEZXNjID0KLQkJCW5ldyBJbWFnZU92ZXJsYXlJY29uKAotCQkJCWJhc2VJbWFnZSwKLQkJCQluZXcgSW1hZ2VEZXNjcmlwdG9yW11bXSB7IHVwcGVyUmlnaHQsIGxvd2VyUmlnaHQsIGxvd2VyTGVmdCwgdXBwZXJMZWZ0IH0pOwotCQlyZXR1cm4gY29tcERlc2MuY3JlYXRlSW1hZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvcltdIGdldExvd2VyTGVmdE92ZXJsYXlzKGludCBmbGFncykgewotCQlpZiAoKGZsYWdzICYgRl9FUlJPUikgIT0gMCkKLQkJCXJldHVybiBuZXcgSW1hZ2VEZXNjcmlwdG9yW10geyBVcGRhdGVVSUltYWdlcy5ERVNDX0VSUk9SX0NPIH07Ci0JCWlmICgoZmxhZ3MgJiBGX1dBUk5JTkcpICE9IDApCi0JCQlyZXR1cm4gbmV3IEltYWdlRGVzY3JpcHRvcltdIHsgVXBkYXRlVUlJbWFnZXMuREVTQ19XQVJOSU5HX0NPIH07Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yW10gZ2V0VXBwZXJSaWdodE92ZXJsYXlzKGludCBmbGFncykgewotCQlpZiAoKGZsYWdzICYgRl9BREQpICE9IDApCi0JCQlyZXR1cm4gbmV3IEltYWdlRGVzY3JpcHRvcltdIHsgVXBkYXRlVUlJbWFnZXMuREVTQ19BRERfQ08gfTsKLQkJaWYgKChmbGFncyAmIEZfREVMKSAhPSAwKQotCQkJcmV0dXJuIG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfREVMX0NPIH07Ci0JCWlmICgoZmxhZ3MgJiBGX1VOQ09ORklHVVJFRCkgIT0gMCkKLQkJCXJldHVybiBuZXcgSW1hZ2VEZXNjcmlwdG9yW10geyBVcGRhdGVVSUltYWdlcy5ERVNDX1VOQ09ORl9DTyB9OwotCQlpZiAoKGZsYWdzICYgRl9MSU5LRUQpICE9IDApCi0JCQlyZXR1cm4gbmV3IEltYWdlRGVzY3JpcHRvcltdIHsgVXBkYXRlVUlJbWFnZXMuREVTQ19MSU5LRURfQ08gfTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yW10gZ2V0TG93ZXJSaWdodE92ZXJsYXlzKGludCBmbGFncykgewotCQlpZiAoKGZsYWdzICYgRl9DVVJSRU5UKSAhPSAwKQotCQkJcmV0dXJuIG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfQ1VSUkVOVF9DTyB9OwotCQlpZiAoKGZsYWdzICYgRl9NT0QpICE9IDApCi0JCQlyZXR1cm4gbmV3IEltYWdlRGVzY3JpcHRvcltdIHsgVXBkYXRlVUlJbWFnZXMuREVTQ19NT0RfQ08gfTsKLQkJLyoKLQkJaWYgKChmbGFncyAmIEZfQUREKSAhPSAwKQotCQkJcmV0dXJuIG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfQUREX0NPIH07Ci0JCWlmICgoZmxhZ3MgJiBGX0RFTCkgIT0gMCkKLQkJCXJldHVybiBuZXcgSW1hZ2VEZXNjcmlwdG9yW10geyBVcGRhdGVVSUltYWdlcy5ERVNDX0RFTF9DTyB9OwotCQlpZiAoKGZsYWdzICYgRl9VTkNPTkZJR1VSRUQpICE9IDApCi0JCQlyZXR1cm4gbmV3IEltYWdlRGVzY3JpcHRvcltdIHsgVXBkYXRlVUlJbWFnZXMuREVTQ19VTkNPTkZfQ08gfTsKLQkJKi8KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yW10gZ2V0VXBwZXJMZWZ0T3ZlcmxheXMoaW50IGZsYWdzKSB7Ci0JCWlmICgoZmxhZ3MgJiBGX1VQREFURUQpICE9IDApCi0JCQlyZXR1cm4gbmV3IEltYWdlRGVzY3JpcHRvcltdIHsgVXBkYXRlVUlJbWFnZXMuREVTQ19VUERBVEVEX0NPIH07Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGdldFRleHQob2JqKTsKLQl9Ci0JcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmosIGludCBpbmRleCkgewotCQlyZXR1cm4gZ2V0SW1hZ2Uob2JqKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2VGcm9tVVJMKAotCQlVUkwgaW5zdGFsbFVSTCwKLQkJU3RyaW5nIHN1YmRpcmVjdG9yeUFuZEZpbGVuYW1lKSB7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVVSTCBuZXdVUkwgPSBuZXcgVVJMKGluc3RhbGxVUkwsIHN1YmRpcmVjdG9yeUFuZEZpbGVuYW1lKTsKLQkJCVN0cmluZyBrZXkgPSBuZXdVUkwudG9TdHJpbmcoKTsKLQkJCWltYWdlID0gKEltYWdlKWltYWdlcy5nZXQoa2V5KTsKLQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChuZXdVUkwpOwotCQkJCWltYWdlID0gZGVzYy5jcmVhdGVJbWFnZSgpOwotCQkJCWltYWdlcy5wdXQoa2V5LCBpbWFnZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9NYWluUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9NYWluUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI1OWEyMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvTWFpblByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQHNlZSBQcmVmZXJlbmNlUGFnZQotICovCi1wdWJsaWMgY2xhc3MgTWFpblByZWZlcmVuY2VQYWdlCi0JZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZQotCWltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCS8vcHJpdmF0ZSBMYWJlbCBoaXN0b3J5U2l6ZUxhYmVsOwotCXByaXZhdGUgVGV4dCBoaXN0b3J5U2l6ZVRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24gY2hlY2tTaWduYXR1cmVDaGVja2JveDsKLQlwcml2YXRlIEJ1dHRvbiBhdXRvbWF0aWNhbGx5Q2hvb3NlTWlycm9yQ2hlY2tib3g7Ci0JcHJpdmF0ZSBCdXR0b24gZXF1aXZhbGVudEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBjb21wYXRpYmxlQnV0dG9uOwotCXByaXZhdGUgVGV4dCB1cGRhdGVQb2xpY3lUZXh0OwotCi0JLy8gdGhlc2UgdHdvIHZhbHVlcyBhcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgY29kZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVRVUlWQUxFTlRfVkFMVUUgPSAiZXF1aXZhbGVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QQVRJQkxFX1ZBTFVFID0gImNvbXBhdGlibGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIE1haW5QcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgb24gUHJlZmVyZW5jZVBhZ2UuCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5NYWluUHJlZmVyZW5jZVBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCi0JCUNvbXBvc2l0ZSBtYWluQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQltYWluQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCUxhYmVsIGhpc3RvcnlTaXplTGFiZWwgPSBuZXcgTGFiZWwobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQloaXN0b3J5U2l6ZUxhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5NYWluUHJlZmVyZW5jZVBhZ2VfaGlzdG9yeVNpemUpOyAKLQkJaGlzdG9yeVNpemVUZXh0ID0gbmV3IFRleHQobWFpbkNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQloaXN0b3J5U2l6ZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWhpc3RvcnlTaXplVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQloaXN0b3J5U2l6ZUNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY2hlY2tTaWduYXR1cmVDaGVja2JveCA9Ci0JCQluZXcgQnV0dG9uKG1haW5Db21wb3NpdGUsIFNXVC5DSEVDSyB8IFNXVC5MRUZUKTsKLQkJY2hlY2tTaWduYXR1cmVDaGVja2JveC5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuTWFpblByZWZlcmVuY2VQYWdlX2NoZWNrU2lnbmF0dXJlKTsgCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJY2hlY2tTaWduYXR1cmVDaGVja2JveC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJY2hlY2tTaWduYXR1cmVDaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoY2hlY2tTaWduYXR1cmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSA9PSBmYWxzZSkgewotCQkJCQl3YXJuU2lnbmF0dXJlQ2hlY2soZ2V0U2hlbGwoKSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCWF1dG9tYXRpY2FsbHlDaG9vc2VNaXJyb3JDaGVja2JveCA9Ci0JCQluZXcgQnV0dG9uKG1haW5Db21wb3NpdGUsIFNXVC5DSEVDSyB8IFNXVC5MRUZUKTsKLQkJYXV0b21hdGljYWxseUNob29zZU1pcnJvckNoZWNrYm94LnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5NYWluUHJlZmVyZW5jZVBhZ2VfYXV0b21hdGljYWxseUNob29zZU1pcnJvcik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJYXV0b21hdGljYWxseUNob29zZU1pcnJvckNoZWNrYm94LnNldExheW91dERhdGEoZ2QpOwotCi0JCWNyZWF0ZVNwYWNlcihtYWluQ29tcG9zaXRlLCAyKTsKLQotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5NYWluUHJlZmVyZW5jZVBhZ2VfdXBkYXRlVmVyc2lvbnMpOyAKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdyb3VwLnNldExheW91dERhdGEoZ2QpOwotCi0JCWVxdWl2YWxlbnRCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotCQllcXVpdmFsZW50QnV0dG9uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5NYWluUHJlZmVyZW5jZVBhZ2VfdXBkYXRlVmVyc2lvbnNfZXF1aXZhbGVudCk7IAotCi0JCWNvbXBhdGlibGVCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotCQljb21wYXRpYmxlQnV0dG9uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5NYWluUHJlZmVyZW5jZVBhZ2VfdXBkYXRlVmVyc2lvbnNfY29tcGF0aWJsZSk7IAotCi0JCWNyZWF0ZVNwYWNlcihtYWluQ29tcG9zaXRlLCAyKTsKLQotCQlncm91cCA9IG5ldyBHcm91cChtYWluQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5NYWluUHJlZmVyZW5jZVBhZ2VfdXBkYXRlUG9saWN5KTsgCi0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLk1haW5QcmVmZXJlbmNlUGFnZV91cGRhdGVQb2xpY3lVUkwpOyAKLQkJdXBkYXRlUG9saWN5VGV4dCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJdXBkYXRlUG9saWN5VGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkvL2NyZWF0ZVNwYWNlcihtYWluQ29tcG9zaXRlLCAyKTsKLQkJLy9jcmVhdGVIdHRwUHJveHkobWFpbkNvbXBvc2l0ZSwgMik7Ci0JCWluaXRpYWxpemUoKTsKLQkJdXBkYXRlUG9saWN5VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQl0ZXh0Q2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIG1haW5Db21wb3NpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChnZXRDb250cm9sKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNwYWNlcihDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgY29sdW1uU3BhbikgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW5TcGFuOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVIdHRwUHJveHkoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IGNvbHVtblNwYW4pIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5NYWluUHJlZmVyZW5jZVBhZ2VfcHJveHlHcm91cCk7IAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uU3BhbjsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0SGlzdG9yeUNvdW50KCkgewotCQl0cnkgewotCQkJSW50ZWdlciBjb3VudCA9IG5ldyBJbnRlZ2VyKGhpc3RvcnlTaXplVGV4dC5nZXRUZXh0KCkpOwotCQkJcmV0dXJuIGNvdW50LmludFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0SW50KAotCQkJVXBkYXRlQ29yZS5QX0hJU1RPUllfU0laRSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoaXN0b3J5U2l6ZUNoYW5nZWQoKSB7Ci0JCQotCQl0cnkgewotCQkJaW50IGhpc3RvcnlTaXplID0gSW50ZWdlci5wYXJzZUludChoaXN0b3J5U2l6ZVRleHQuZ2V0VGV4dCgpKTsKLQkJCWlmIChoaXN0b3J5U2l6ZSA8IDApIHsKLQkJCQlzZXRWYWxpZChmYWxzZSk7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKFVwZGF0ZVVJTWVzc2FnZXMuTWFpblByZWZlcmVuY2VQYWdlX2ludmFsaWRIaXN0b3J5U2l6ZSk7IAotCQkJCXJldHVybjsKLQkJCX0KLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJCXNldEVycm9yTWVzc2FnZShVcGRhdGVVSU1lc3NhZ2VzLk1haW5QcmVmZXJlbmNlUGFnZV9pbnZhbGlkSGlzdG9yeVNpemUpOyAKLQkJCXJldHVybjsKLQkJfQotCQlzZXRWYWxpZCh0cnVlKTsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwkKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldENvbnRyb2woKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5zZXRNYXhpbXVtSGlzdG9yeUNvdW50KAotCQkJCQkJZ2V0SGlzdG9yeUNvdW50KCkpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcHJlZnMuc2V0VmFsdWUoCi0JCQlVcGRhdGVDb3JlLlBfQ0hFQ0tfU0lHTkFUVVJFLAotCQkJY2hlY2tTaWduYXR1cmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCXByZWZzLnNldFZhbHVlKFVwZGF0ZUNvcmUuUF9BVVRPTUFUSUNBTExZX0NIT09TRV9NSVJST1IsIGF1dG9tYXRpY2FsbHlDaG9vc2VNaXJyb3JDaGVja2JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCXByZWZzLnNldFZhbHVlKFVwZGF0ZUNvcmUuUF9ISVNUT1JZX1NJWkUsIGhpc3RvcnlTaXplVGV4dC5nZXRUZXh0KCkpOwotCQlwcmVmcy5zZXRWYWx1ZSgKLQkJCVVwZGF0ZUNvcmUuUF9VUERBVEVfVkVSU0lPTlMsCi0JCQllcXVpdmFsZW50QnV0dG9uLmdldFNlbGVjdGlvbigpCi0JCQkJPyBFUVVJVkFMRU5UX1ZBTFVFCi0JCQkJOiBDT01QQVRJQkxFX1ZBTFVFKTsKLQkJcHJlZnMuc2V0VmFsdWUoCi0JCQlVcGRhdGVVdGlscy5QX1VQREFURV9QT0xJQ1lfVVJMLAotCQkJdXBkYXRlUG9saWN5VGV4dC5nZXRUZXh0KCkpOwotCi0JCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBzdXBlci5wZXJmb3JtT2soKTsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQljaGVja1NpZ25hdHVyZUNoZWNrYm94LnNldFNlbGVjdGlvbigKLQkJCXByZWZzLmdldEJvb2xlYW4oVXBkYXRlQ29yZS5QX0NIRUNLX1NJR05BVFVSRSkpOwotCQlhdXRvbWF0aWNhbGx5Q2hvb3NlTWlycm9yQ2hlY2tib3guc2V0U2VsZWN0aW9uKAotCQkJCXByZWZzLmdldEJvb2xlYW4oVXBkYXRlQ29yZS5QX0FVVE9NQVRJQ0FMTFlfQ0hPT1NFX01JUlJPUikpOwotCi0JCWhpc3RvcnlTaXplVGV4dC5zZXRUZXh0KHByZWZzLmdldFN0cmluZyhVcGRhdGVDb3JlLlBfSElTVE9SWV9TSVpFKSk7Ci0KLQkJYm9vbGVhbiBpc0NvbXBhdGlibGUgPQotCQkJVXBkYXRlQ29yZS5DT01QQVRJQkxFX1ZBTFVFLmVxdWFscygKLQkJCQlwcmVmcy5nZXRTdHJpbmcoVXBkYXRlQ29yZS5QX1VQREFURV9WRVJTSU9OUykpOwotCQllcXVpdmFsZW50QnV0dG9uLnNldFNlbGVjdGlvbighaXNDb21wYXRpYmxlKTsKLQkJY29tcGF0aWJsZUJ1dHRvbi5zZXRTZWxlY3Rpb24oaXNDb21wYXRpYmxlKTsKLQotCQlTdHJpbmcgdGV4dCA9IHByZWZzLmdldFN0cmluZyhVcGRhdGVVdGlscy5QX1VQREFURV9QT0xJQ1lfVVJMKTsKLQkJdXBkYXRlUG9saWN5VGV4dC5zZXRUZXh0KHRleHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXh0Q2hhbmdlZCgpIHsKLQkJU3RyaW5nIHRleHQgPSB1cGRhdGVQb2xpY3lUZXh0LmdldFRleHQoKTsKLQkJaWYgKHRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0cnkgewotCQkJCW5ldyBVUkwodGV4dCk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoVXBkYXRlVUlNZXNzYWdlcy5VcGRhdGVTZXR0aW5nc1ByZWZlcmVuY2VQYWdlX2ludmFsaWQpOyAKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc2V0VmFsaWQodHJ1ZSk7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQl1cGRhdGVQb2xpY3lUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJY2hlY2tTaWduYXR1cmVDaGVja2JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWF1dG9tYXRpY2FsbHlDaG9vc2VNaXJyb3JDaGVja2JveC5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQloaXN0b3J5U2l6ZVRleHQuc2V0VGV4dCgKLQkJCXByZWZzLmdldERlZmF1bHRTdHJpbmcoVXBkYXRlQ29yZS5QX0hJU1RPUllfU0laRSkpOwotCQkKLQkJZXF1aXZhbGVudEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWNvbXBhdGlibGVCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd2FyblNpZ25hdHVyZUNoZWNrKFNoZWxsIHNoZWxsKSB7Ci0JCU1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcoc2hlbGwsIFVwZGF0ZVVJTWVzc2FnZXMuTWFpblByZWZlcmVuY2VQYWdlX2RpZ2l0YWxTaWduYXR1cmVfdGl0bGUsIAotCQlVcGRhdGVVSU1lc3NhZ2VzLk1haW5QcmVmZXJlbmNlUGFnZV9kaWdpdGFsU2lnbmF0dXJlX21lc3NhZ2UpOyAKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvVXBkYXRlU2V0dGluZ3NQcmVmZXJlbmNlUGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1VwZGF0ZVNldHRpbmdzUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgwODQ4OC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvVXBkYXRlU2V0dGluZ3NQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQHNlZSBQcmVmZXJlbmNlUGFnZQotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlU2V0dGluZ3NQcmVmZXJlbmNlUGFnZQotCWV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UKLQlpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0JcHJpdmF0ZSBUZXh0IG1hcHBpbmdzRmlsZTsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgVXBkYXRlU2V0dGluZ3NQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc2V0RGVzY3JpcHRpb24oVXBkYXRlVUlNZXNzYWdlcy5VcGRhdGVTZXR0aW5nc1ByZWZlcmVuY2VQYWdlX2Rlc2NyaXB0aW9uKTsgCi0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5VcGRhdGVTZXR0aW5nc1ByZWZlcmVuY2VQYWdlX2xhYmVsKTsgCi0JCW1hcHBpbmdzRmlsZSA9IG5ldyBUZXh0KGNvbnRhaW5lciwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCi0JCWluaXRpYWxpemUoKTsKLQkJbWFwcGluZ3NGaWxlLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXRleHRDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQltYXBwaW5nc0ZpbGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWYgPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyB0ZXh0ID0gcHJlZi5nZXRTdHJpbmcoVXBkYXRlVXRpbHMuUF9VUERBVEVfUE9MSUNZX1VSTCk7Ci0JCW1hcHBpbmdzRmlsZS5zZXRUZXh0KHRleHQpOwotCQl0ZXh0Q2hhbmdlZCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXh0Q2hhbmdlZCgpIHsKLQkJU3RyaW5nIHRleHQgPSBtYXBwaW5nc0ZpbGUuZ2V0VGV4dCgpOwotCQlpZiAodGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJbmV3IFVSTCh0ZXh0KTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJc2V0VmFsaWQoZmFsc2UpOwotCQkJCXNldEVycm9yTWVzc2FnZShVcGRhdGVVSU1lc3NhZ2VzLlVwZGF0ZVNldHRpbmdzUHJlZmVyZW5jZVBhZ2VfaW52YWxpZCk7IAotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzZXRWYWxpZCh0cnVlKTsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIHRleHQgPSBtYXBwaW5nc0ZpbGUuZ2V0VGV4dCgpOwotCQlpZiAodGV4dC5sZW5ndGgoKSA+IDApCi0JCQlwcmVmLnNldFZhbHVlKFVwZGF0ZVV0aWxzLlBfVVBEQVRFX1BPTElDWV9VUkwsIHRleHQpOwotCQllbHNlCi0JCQlwcmVmLnNldFRvRGVmYXVsdChVcGRhdGVVdGlscy5QX1VQREFURV9QT0xJQ1lfVVJMKTsKLQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQltYXBwaW5nc0ZpbGUuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChnZXRDb250cm9sKCkpOwotCQkvKgotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoCi0JCQlwYXJlbnQsIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5BcHBTZXJ2ZXJQcmVmZXJlbmNlUGFnZSIpOwotCQkqLwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0NvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9Db25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWFlYjJiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0NvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOwotCi0vKioKLSAqIEBzZWUgUHJvcGVydHlQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcm9wZXJ0eVBhZ2UgewotCS8qKgotCSAqCi0JICovCi0JcHVibGljIENvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlKCkgewotCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpICB7Ci0JCUlDb25maWd1cmVkU2l0ZUFkYXB0ZXIgYWRhcHRlciA9IChJQ29uZmlndXJlZFNpdGVBZGFwdGVyKWdldEVsZW1lbnQoKTsKLQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gYWRhcHRlci5nZXRDb25maWd1cmVkU2l0ZSgpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlhZGRQcm9wZXJ0eShjb21wb3NpdGUsIFVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2VfcGF0aCwgY3NpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLnRvU3RyaW5nKCkpOyAKLQkJYWRkUHJvcGVydHkoY29tcG9zaXRlLCBVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlX3R5cGUsIGdldExvY2F0aW9uVHlwZShjc2l0ZSkpOyAKLQkJYWRkUHJvcGVydHkoY29tcG9zaXRlLCBVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlX2VuYWJsZWQsIGNzaXRlLmlzRW5hYmxlZCgpP1VwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2VfeWVzOlVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2Vfbm8pOyAKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TG9jYXRpb25UeXBlKElDb25maWd1cmVkU2l0ZSBjc2l0ZSkgewotCQlpZiAoY3NpdGUuaXNFeHRlbnNpb25TaXRlKCkpCi0JCQlyZXR1cm4gVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZV9leHRlbnNpb247IAotCQlpZiAoY3NpdGUuaXNQcm9kdWN0U2l0ZSgpKQotCQkJcmV0dXJuIFVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2VfcHJvZHVjdDsgCi0JCXJldHVybiBVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlX3Vua25vd247IAotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkUHJvcGVydHkoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KGtleSk7Ci0JCQotCQlsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dCh2YWx1ZSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0ZlYXR1cmVDb3B5cmlnaHRQcm9wZXJ0eVBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0ZlYXR1cmVDb3B5cmlnaHRQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU1YzJhNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9GZWF0dXJlQ29weXJpZ2h0UHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOwotCi0vKioKLSAqIEBzZWUgUHJvcGVydHlQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlQ29weXJpZ2h0UHJvcGVydHlQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByb3BlcnR5UGFnZSB7Ci0JLyoqCi0JICoKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZUNvcHlyaWdodFByb3BlcnR5UGFnZSgpIHsKLQkJbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRyeSB7Ci0JCQlJRmVhdHVyZUFkYXB0ZXIgYWRhcHRlciA9IChJRmVhdHVyZUFkYXB0ZXIpIGdldEVsZW1lbnQoKTsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyLmdldEZlYXR1cmUobnVsbCk7Ci0KLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCQlHcmlkRGF0YSBnZCA9Ci0JCQkJbmV3IEdyaWREYXRhKAotCQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQkJZ2Qud2lkdGhIaW50ID0gY29tcHV0ZVdpZHRoTGltaXQobGFiZWwsIDgwKTsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCi0JCQlJVVJMRW50cnkgY29weXJpZ2h0ID0gZmVhdHVyZS5nZXRDb3B5cmlnaHQoKTsKLQkJCVN0cmluZyBhbm5vdGF0aW9uID0gKGNvcHlyaWdodCAhPSBudWxsKSA/IGNvcHlyaWdodC5nZXRBbm5vdGF0aW9uKCkgOiBudWxsOwotCi0JCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsICYmIGFubm90YXRpb24ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJbGFiZWwuc2V0VGV4dChhbm5vdGF0aW9uKTsKLQkJCQlmaW5hbCBVUkwgdXJsID0gY29weXJpZ2h0LmdldFVSTCgpOwotCQkJCVN0cmluZyBmaWxlbmFtZSA9ICh1cmwgIT0gbnVsbCkgPyB1cmwuZ2V0RmlsZSgpIDogbnVsbDsKLQkJCQlpZiAoZmlsZW5hbWUgIT0gbnVsbAotCQkJCQkmJiAoZmlsZW5hbWUuZW5kc1dpdGgoIi5odG0iKSB8fCBmaWxlbmFtZS5lbmRzV2l0aCgiLmh0bWwiKSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQkJCQlidXR0b24uc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVDb3B5cmlnaHRQcm9wZXJ0eVBhZ2Vfc2hvd0luQnJvd3Nlcik7IAotCQkJCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQkJCQkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KGJ1dHRvbik7Ci0JCQkJCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCQlVcGRhdGVVSS5zaG93VVJMKHVybC50b0V4dGVybmFsRm9ybSgpKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZUNvcHlyaWdodFByb3BlcnR5UGFnZV9ub0NvcHlyaWdodCk7IAotCQkJfQotCQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZVdpZHRoTGltaXQoTGFiZWwgbGFiZWwsIGludCBuY2hhcnMpIHsKLQkJR0MgZ2MgPSBuZXcgR0MobGFiZWwpOwotCQlnYy5zZXRGb250KGxhYmVsLmdldEZvbnQoKSk7Ci0JCUZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzPSBnYy5nZXRGb250TWV0cmljcygpOwotCQlnYy5kaXNwb3NlKCk7Ci0JCXJldHVybiBEaWFsb2cuY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCBuY2hhcnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0ZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhY2JhMTEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JVVJMRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuQ29udGVudEVudHJ5TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLklGZWF0dXJlQWRhcHRlcjsKLQotcHVibGljIGNsYXNzIEZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlCi0JZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UKLQlpbXBsZW1lbnRzIElXb3JrYmVuY2hQcm9wZXJ0eVBhZ2UgewotCQkKLQlwdWJsaWMgRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2UoKSB7Ci0JCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0cnkgewotCQkJSUZlYXR1cmVBZGFwdGVyIGFkYXB0ZXIgPSAoSUZlYXR1cmVBZGFwdGVyKSBnZXRFbGVtZW50KCk7Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gYWRhcHRlci5nZXRGZWF0dXJlKG51bGwpOwotCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxNTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCQotCQkJYWRkR2VuZXJhbFNlY3Rpb24oZmVhdHVyZSwgY29tcG9zaXRlKTsKLQkJCWFkZFN1cHBvcnRlZFBsYXRmb3Jtc1NlY3Rpb24oZmVhdHVyZSwgY29tcG9zaXRlKTsKLQkJCWFkZERlc2NyaXB0aW9uKGZlYXR1cmUsIGNvbXBvc2l0ZSk7Ci0JCQkKLQkJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJCQotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRHZW5lcmFsU2VjdGlvbihJRmVhdHVyZSBmZWF0dXJlLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlDb21wb3NpdGUgZmllbGRDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWZpZWxkQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJTGFiZWwgaW1hZ2VMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5SSUdIVCk7Ci0JCWltYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWlmIChmZWF0dXJlLmdldEltYWdlKCkhPW51bGwpIHsKLQkJCUltYWdlRGVzY3JpcHRvciBkZXNjID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoZmVhdHVyZS5nZXRJbWFnZSgpKTsKLQkJCWltYWdlTGFiZWwuc2V0SW1hZ2UoVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5nZXQoZGVzYykpOwotCQl9Ci0JCWVsc2UgewotCQkJaW1hZ2VMYWJlbC5zZXRJbWFnZShVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmdldChVcGRhdGVVSUltYWdlcy5ERVNDX1BST1ZJREVSKSk7Ci0JCX0KLQkJYWRkRmllbGQoZmllbGRDb21wb3NpdGUsIFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2VfbmFtZSwgZmVhdHVyZS5nZXRMYWJlbCgpKTsKLQotCQlhZGRGaWVsZCgKLQkJCQlmaWVsZENvbXBvc2l0ZSwKLQkJCVVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2VfaWQsIAotCQkJZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpKTsKLQkJYWRkRmllbGQoCi0JCQkJZmllbGRDb21wb3NpdGUsCi0JCQlVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX3ZlcnNpb24sIAotCQkJZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkpOwotCQlhZGRGaWVsZChmaWVsZENvbXBvc2l0ZSwgVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV9wcm92aWRlciwgZmVhdHVyZS5nZXRQcm92aWRlcigpKTsgCi0JCWxvbmcgc2l6ZSA9IGZlYXR1cmUuZ2V0SW5zdGFsbFNpemUoKTsKLQkJaWYgKHNpemUgIT0gQ29udGVudEVudHJ5TW9kZWwuVU5LTk9XTl9TSVpFKSB7Ci0JCQlhZGRGaWVsZChmaWVsZENvbXBvc2l0ZSwgVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV9zaXplLCBuZXcgTG9uZyhzaXplKS50b1N0cmluZygpICsgIiAiICsgVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV9LaWxvYnl0ZXMpOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRTdXBwb3J0ZWRQbGF0Zm9ybXNTZWN0aW9uKElGZWF0dXJlIGZlYXR1cmUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV9wbGF0Zm9ybXMpOyAKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE5MUy5iaW5kKFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2Vfb3MsZXh0cmFjdFZhbHVlKGZlYXR1cmUuZ2V0T1MoKSkpKTsgCi0KLQkJbGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChOTFMuYmluZChVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX3dzLCBleHRyYWN0VmFsdWUoZmVhdHVyZS5nZXRXUygpKSkpOyAKLQotCQlsYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KE5MUy5iaW5kKFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2VfYXJjaCwgZXh0cmFjdFZhbHVlKGZlYXR1cmUuZ2V0T1NBcmNoKCkpKSk7IAotCi0JCWxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoTkxTLmJpbmQoVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZV9ubCwgZXh0cmFjdFZhbHVlKGZlYXR1cmUuZ2V0TkwoKSkpKTsgCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBwcm9wZXJ0eSwgU3RyaW5nIHZhbHVlKSB7Ci0KLQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQocHJvcGVydHkpOwotCi0JCQlsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQoZ2V0RXNjYXBlZFN0cmluZyh2YWx1ZSkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGV4dHJhY3RWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUuZXF1YWxzKCIqIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlX2FsbDsgCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRGVzY3JpcHRpb24oSUZlYXR1cmUgZmVhdHVyZSwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlJVVJMRW50cnkgZGVzY3JpcHRpb24gPSBmZWF0dXJlLmdldERlc2NyaXB0aW9uKCk7Ci0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgYW5ub3RhdGlvbiA9IGRlc2NyaXB0aW9uLmdldEFubm90YXRpb24oKTsKLQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwgJiYgYW5ub3RhdGlvbi5sZW5ndGgoKSA+IDApIHsKLQkJCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQkJCQlncm91cC5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2VfZGVzYyk7IAotCQkJCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkJCVRleHQgdGV4dCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7Ci0JCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCQlnZC5oZWlnaHRIaW50ID0gMjAwOwotCQkJCWdkLndpZHRoSGludCA9IDM1MDsKLQkJCQl0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCQl0ZXh0LnNldFRleHQoYW5ub3RhdGlvbik7Ci0JCQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRFc2NhcGVkU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcih2YWx1ZS5sZW5ndGgoKSArIDEwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGgoKTsgKytpKSB7Ci0JCQljaGFyIGMgPSB2YWx1ZS5jaGFyQXQoaSk7Ci0JCQlpZiAoJyYnID09IGMpIHsKLQkJCQlyZXN1bHQuYXBwZW5kKCImJiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXJlc3VsdC5hcHBlbmQoYyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0ZlYXR1cmVMaWNlbnNlUHJvcGVydHlQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9GZWF0dXJlTGljZW5zZVByb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjZlODNiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0ZlYXR1cmVMaWNlbnNlUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBGZWF0dXJlTGljZW5zZVByb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcm9wZXJ0eVBhZ2UgewotCXB1YmxpYyBGZWF0dXJlTGljZW5zZVByb3BlcnR5UGFnZSgpIHsKLQkJbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSAgewotCQl0cnkgewotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCQlJRmVhdHVyZUFkYXB0ZXIgYWRhcHRlciA9IChJRmVhdHVyZUFkYXB0ZXIpZ2V0RWxlbWVudCgpOwotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXIuZ2V0RmVhdHVyZShudWxsKTsJCQkKLQkJCUlVUkxFbnRyeSBsaWNlbnNlID0gZmVhdHVyZS5nZXRMaWNlbnNlKCk7Ci0JCQlTdHJpbmcgYW5ub3RhdGlvbiA9IChsaWNlbnNlICE9IG51bGwpID8gbGljZW5zZS5nZXRBbm5vdGF0aW9uKCkgOiBudWxsOwotCQkJCi0JCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsICYmIGFubm90YXRpb24ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuQk9SREVSIHwgU1dULldSQVApOwotCQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQkJZ2QuaGVpZ2h0SGludCA9IDIwMDsKLQkJCQlnZC53aWR0aEhpbnQgPSAzNTA7Ci0JCQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCQl0ZXh0LnNldFRleHQoYW5ub3RhdGlvbik7Ci0JCQkJdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQkJZmluYWwgVVJMIHVybCA9IGxpY2Vuc2UuZ2V0VVJMKCk7Ci0JCQkJU3RyaW5nIGZpbGVuYW1lID0gKHVybCAhPSBudWxsKSA/IHVybC5nZXRGaWxlKCkgOiBudWxsOwotCQkJCWlmIChmaWxlbmFtZSAhPSBudWxsICYmIChmaWxlbmFtZS5lbmRzV2l0aCgiLmh0bSIpIHx8IHVybC5nZXRGaWxlKCkuZW5kc1dpdGgoIi5odG1sIikpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJCQkJYnV0dG9uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlTGljZW5zZVByb3BlcnR5UGFnZV9zaG93SW5Ccm93c2VyKTsgCi0JCQkJCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCkpOwotCQkJCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoYnV0dG9uKTsKLQkJCQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJCVVwZGF0ZVVJLnNob3dVUkwodXJsLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQkJCWxhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlTGljZW5zZVByb3BlcnR5UGFnZV9ub0xpY2Vuc2UpOyAKLQkJCX0KLQkJCQotCQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQkJCi0JCQlyZXR1cm4gY29tcG9zaXRlOwotCQkJCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0ZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0ZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI5MDg4Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9GZWF0dXJlU3RhdHVzUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi0vKioKLSAqIEBzZWUgUHJvcGVydHlQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlU3RhdHVzUHJvcGVydHlQYWdlCi0JZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UKLQlpbXBsZW1lbnRzIElXb3JrYmVuY2hQcm9wZXJ0eVBhZ2UgewotCS8qKgotCSAqCi0JICovCi0JcHVibGljIEZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2UoKSB7Ci0JCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0cnkgewotCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAyMDsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkJVGV4dCBtZXNzYWdlID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7Ci0JCQltZXNzYWdlLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlnZC53aWR0aEhpbnQgPSAzNTA7Ci0JCQltZXNzYWdlLnNldExheW91dERhdGEoZ2QpOwotCQkJCi0JCQlDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIgYWRhcHRlciA9IChDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIGdldEVsZW1lbnQoKTsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkKLQkJCWlmIChPcGVyYXRpb25zTWFuYWdlci5maW5kUGVuZGluZ09wZXJhdGlvbihmZWF0dXJlKSAhPSBudWxsKSB7Ci0JCQkJbWVzc2FnZS5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZV9wZW5kaW5nQ2hhbmdlcyk7IAotCQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCQl9Ci0JCQkKLQkJCUlTdGF0dXMgc3RhdHVzID0gZ2V0U3RhdHVzKGZlYXR1cmUpOwotCQkJaW50IHNldmVyaXR5ID0gc3RhdHVzLmdldFNldmVyaXR5KCk7Ci0JCQlpZiAoc2V2ZXJpdHkgPT0gSVN0YXR1cy5FUlJPUgotCQkJCSYmIGdldFN0YXR1c0NvZGUoZmVhdHVyZSwgc3RhdHVzKSA9PSBJRmVhdHVyZS5TVEFUVVNfSEFQUFkpIHsKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JCQkJbWVzc2FnZS5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZV9nb29kQ29uZmlndXJhdGlvbik7IAotCQkJfSBlbHNlIHsKLQkJCQltZXNzYWdlLnNldFRleHQoc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCQlpZiAoc2V2ZXJpdHkgIT0gSVN0YXR1cy5PSyAmJiBzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQkJU3RyaW5nIHJlYXNvbiA9IGdldFJlYXNvbihzdGF0dXMpOwotCQkJCWlmIChyZWFzb24ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCQkJY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQkJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQkJCWNvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOwotCQkJCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZV9yZWFzb24pOyAKLQotCQkJCQlUZXh0IHRleHQgPQotCQkJCQkJbmV3IFRleHQoY29tcCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMKTsKLQkJCQkJdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQkJCXRleHQuc2V0VGV4dChyZWFzb24pOwotCQkJCQlnZC53aWR0aEhpbnQgPSAzNTA7Ci0JCQkJCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQkJfQotCi0JCQl9Ci0JCQkKLQkJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJCQotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFJlYXNvbihJU3RhdHVzIHN0YXR1cykgewotCQlJU3RhdHVzW10gY2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBjaGlsZHJlbltpXS5nZXRNZXNzYWdlKCk7Ci0JCQlpZiAobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgKLQkJCQkJbWVzc2FnZQotCQkJCQkJKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBnZXRTdGF0dXMoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIE1pc3NpbmdGZWF0dXJlKSB7Ci0JCQlpbnQgc2V2ZXJpdHk7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoKChNaXNzaW5nRmVhdHVyZSkgZmVhdHVyZSkuaXNPcHRpb25hbCgpKSB7Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQkJCW1lc3NhZ2UgPSBVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2VfbWlzc2luZ09wdGlvbmFsOyAKLQkJCX0gZWxzZSB7Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQkJCW1lc3NhZ2UgPSBVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2VfbWlzc2luZzsgCi0JCQl9Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgVXBkYXRlVUkuUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0RmVhdHVyZVN0YXR1cyhmZWF0dXJlKTsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRTdGF0dXNDb2RlKElGZWF0dXJlIGZlYXR1cmUsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWludCBjb2RlID0gc3RhdHVzLmdldENvZGUoKTsKLQkJaWYgKGNvZGUgPT0gSUZlYXR1cmUuU1RBVFVTX1VOSEFQUFkpIHsKLQkJCWlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQkJSVN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQlJU3RhdHVzIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQkJCWlmIChjaGlsZC5pc011bHRpU3RhdHVzKCkKLQkJCQkJCXx8IGNoaWxkLmdldENvZGUoKSAhPSBJRmVhdHVyZS5TVEFUVVNfRElTQUJMRUQpCi0JCQkJCQlyZXR1cm4gY29kZTsKLQkJCQl9Ci0JCQkJLy8gSWYgd2UgYXJlIGhlcmUsIGdsb2JhbCBzdGF0dXMgaXMgdW5oYXBweQotCQkJCS8vIGJlY2F1c2Ugb25lIG9yIG1vcmUgaW5jbHVkZWQgZmVhdHVyZXMKLQkJCQkvLyBpcyBkaXNhYmxlZC4KLQkJCQlpZiAoVXBkYXRlVXRpbHMuaGFzT2Jzb2xldGVQYXRjaGVzKGZlYXR1cmUpKSB7Ci0JCQkJCS8vIFRoZSBkaXNhYmxlZCBpbmNsdWRlZCBmZWF0dXJlcwotCQkJCQkvLyBhcmUgb2xkIHBhdGNoZXMgdGhhdCBhcmUgbm93Ci0JCQkJCS8vIHN1YnN1bWVkIGJ5IGJldHRlciB2ZXJzaW9ucyBvZgotCQkJCQkvLyB0aGUgZmVhdHVyZXMgdGhleSB3ZXJlIGRlc2lnbmVkIHRvCi0JCQkJCS8vIHBhdGNoLgotCQkJCQlyZXR1cm4gSUZlYXR1cmUuU1RBVFVTX0hBUFBZOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29kZTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9JbnN0YWxsQ29uZmlndXJhdGlvblByb3BlcnR5UGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvSW5zdGFsbENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVmNTdiYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9JbnN0YWxsQ29uZmlndXJhdGlvblByb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOwotCi0vKioKLSAqIEBzZWUgUHJvcGVydHlQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnN0YWxsQ29uZmlndXJhdGlvblByb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcm9wZXJ0eVBhZ2UgewotCS8qKgotCSAqCi0JICovCi0JcHVibGljIEluc3RhbGxDb25maWd1cmF0aW9uUHJvcGVydHlQYWdlKCkgewotCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpICB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCxTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWFkZFByb3BlcnR5KGNvbXBvc2l0ZSwgVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZV9wYXRoLCBDb25maWd1cmF0b3JVdGlscy5nZXRJbnN0YWxsVVJMKCkudG9TdHJpbmcoKSk7IAotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQotCXByaXZhdGUgdm9pZCBhZGRQcm9wZXJ0eShDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoa2V5KTsKLQkJCi0JCWxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KHZhbHVlKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L0F1dGhlbnRpY2F0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvQXV0aGVudGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmYjlhNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvQXV0aGVudGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VjdXJpdHk7Ci0KLS8qKgotICogS2VlcHMgdXNlciBhbmQgcGFzc3dvcmQgc3RyaW5ncy4KLSAqLwotcHVibGljIGNsYXNzIEF1dGhlbnRpY2F0aW9uIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIHVzZXI7Ci0JcHJvdGVjdGVkIFN0cmluZyBwYXNzd29yZDsKLQlwdWJsaWMgQXV0aGVudGljYXRpb24oU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd29yZCl7Ci0JCXRoaXMudXNlciA9IHVzZXI7Ci0JCXRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhc3N3b3JkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7Ci0JCXJldHVybiBwYXNzd29yZDsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB1c2VyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlcigpIHsKLQkJcmV0dXJuIHVzZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvbkRpYWxvZy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmU5MjhhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWN1cml0eS9KYXJWZXJpZmljYXRpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlY3VyaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXJWZXJpZmljYXRpb25EaWFsb2cgZXh0ZW5kcyBUaXRsZUFyZWFEaWFsb2cgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElOU1RBTExfQUxMID0gQ0FOQ0VMICsgT0sgKyAxOwotCXByaXZhdGUgSVZlcmlmaWNhdGlvblJlc3VsdCBfVmVyaWZpY2F0aW9uUmVzdWx0ID0gbnVsbDsKLQlwcml2YXRlIElEaWFsb2dQYWdlIF9EaWFsb2dQYWdlOwotCXByaXZhdGUgQ29tcG9zaXRlIHBhZ2VDb250YWluZXI7Ci0JcHJpdmF0ZSBJbWFnZSBkZWZhdWx0SW1hZ2UgPSBudWxsOwotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGRlZmF1bHRJbWFnZURlc2NyaXB0b3IgPQotCQlVcGRhdGVVSUltYWdlcy5ERVNDX1VQREFURV9XSVo7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEphclZlcmlmaWNhdGlvbkRpYWxvZy4KLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKi8KLQlwdWJsaWMgSmFyVmVyaWZpY2F0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLElEaWFsb2dQYWdlIGRpYWxvZ1BhZ2UsIElWZXJpZmljYXRpb25SZXN1bHQgdmVyaWZpY2F0aW9uUmVzdWx0KSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJc2V0U2hlbGxTdHlsZShTV1QuVElUTEUgfCBTV1QuQk9SREVSIHwgU1dULkFQUExJQ0FUSU9OX01PREFMIHwgU1dULlJFU0laRSk7CQkKLQkJX1ZlcmlmaWNhdGlvblJlc3VsdCA9IHZlcmlmaWNhdGlvblJlc3VsdDsKLQkJX0RpYWxvZ1BhZ2UgPSBkaWFsb2dQYWdlOwotCQlpZiAoZGlhbG9nUGFnZSBpbnN0YW5jZW9mIEphclZlcmlmaWNhdGlvblBhZ2UpewotCQkJKChKYXJWZXJpZmljYXRpb25QYWdlKV9EaWFsb2dQYWdlKS5zZXRUaXRsZUFyZWFEaWFsb2codGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgYnV0dG9ucyB0byB0aGUgZGlhbG9nJ3MgYnV0dG9uIGJhci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKF9WZXJpZmljYXRpb25SZXN1bHQuZ2V0VmVyaWZpY2F0aW9uQ29kZSgpCi0JCQkhPSBJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfQ09SUlVQVEVEKSB7Ci0KLQkJCWlmIChfVmVyaWZpY2F0aW9uUmVzdWx0LmlzRmVhdHVyZVZlcmlmaWNhdGlvbigpKSB7Ci0JCQkJY3JlYXRlQnV0dG9uKAotCQkJCQlwYXJlbnQsCi0JCQkJCUlEaWFsb2dDb25zdGFudHMuT0tfSUQsCi0JCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0luc3RhbGwsIAotCQkJCQlmYWxzZSk7Ci0JCQl9IGVsc2UgewotCQkJCWNyZWF0ZUJ1dHRvbigKLQkJCQkJcGFyZW50LAotCQkJCQlJRGlhbG9nQ29uc3RhbnRzLk9LX0lELAotCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19Db250aW51ZSwgCi0JCQkJCWZhbHNlKTsJCQkJCi0JCQl9Ci0JCQkvLyBSYWRpbyBidXR0b246IEluc3RhbGwgYWxsIHdpdGhvdXQgcHJvbXB0aW5nCi0JCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCWNyZWF0ZUJ1dHRvbigKLQkJCQlwYXJlbnQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0lELAotCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0luc3RhbGxBbGwsIAotCQkJCWZhbHNlKTsJCQotCQkJCi0JCQkvLyBSYWRpbyBidXR0b246IENhbmNlbCBpbnN0YWxsYXRpb24KLQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJY3JlYXRlQnV0dG9uKAotCQkJCXBhcmVudCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19DYW5jZWwsIAotCQkJCXRydWUpOwkJCQkJCQkKLQkJfSBlbHNlIHsKLQkJCWNyZWF0ZUJ1dHRvbigKLQkJCQlwYXJlbnQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJVXBkYXRlVUlNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25EaWFsb2dfQ2FuY2VsLCAKLQkJCQl0cnVlKTsKLQkJfQotCQlnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpLnNldEZvY3VzKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlUGFyZW50ID0gKENvbXBvc2l0ZSlzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCXNldFRpdGxlSW1hZ2UodGhpcy5nZXRJbWFnZSgpKTsKLQkJc2V0VGl0bGUoVXBkYXRlVUlNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25EaWFsb2dfVGl0bGUpOyAKLQkJCi0JCV9EaWFsb2dQYWdlLmNyZWF0ZUNvbnRyb2woY29tcG9zaXRlUGFyZW50KTsKLQkJcGFnZUNvbnRhaW5lcj0oQ29tcG9zaXRlKV9EaWFsb2dQYWdlLmdldENvbnRyb2woKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJcGFnZUNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcGFnZUNvbnRhaW5lci5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwkJCi0JCQotCQkvLyBCdWlsZCB0aGUgc2VwYXJhdG9yIGxpbmUKLQkJTGFiZWwgc2VwYXJhdG9yPSBuZXcgTGFiZWwoY29tcG9zaXRlUGFyZW50LCBTV1QuSE9SSVpPTlRBTCB8IFNXVC5TRVBBUkFUT1IpOwotCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlUGFyZW50OwotCX0KLQkKLQkJLyoqCi0JICogQHNlZSBJRGlhbG9nUGFnZSNnZXRJbWFnZSgpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlpZiAoZGVmYXVsdEltYWdlID09IG51bGwpCi0JCQlkZWZhdWx0SW1hZ2UgPSBkZWZhdWx0SW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0KLQkJcmV0dXJuIGRlZmF1bHRJbWFnZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJLy8gZGlzcG9zZSBvZiBpbWFnZQotCQlpZiAoZGVmYXVsdEltYWdlICE9IG51bGwpIHsKLQkJCWRlZmF1bHRJbWFnZS5kaXNwb3NlKCk7Ci0JCQlkZWZhdWx0SW1hZ2UgPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwkJCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2J1dHRvblByZXNzZWQoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfSUQgPT0gYnV0dG9uSWQpCi0JCQlpbnN0YWxsQWxsUHJlc3NlZCgpOwotCQllbHNlCi0JCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxBbGxQcmVzc2VkKCkgewotICAgICAgICBzZXRSZXR1cm5Db2RlKEphclZlcmlmaWNhdGlvbkRpYWxvZy5JTlNUQUxMX0FMTCk7Ci0gICAgICAgIGNsb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvblBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWN1cml0eS9KYXJWZXJpZmljYXRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NTNiZWYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlY3VyaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkZvbnRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JVmVyaWZpY2F0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLkJhbm5lclBhZ2U7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXJWZXJpZmljYXRpb25QYWdlIGV4dGVuZHMgQmFubmVyUGFnZSB7Ci0KLQlwcml2YXRlIElWZXJpZmljYXRpb25SZXN1bHQgX1ZlcmlmaWNhdGlvblJlc3VsdCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX2ZpbGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfc3RyRmVhdHVyZU5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF9zdHJJZCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX3N0clByb3ZpZGVyTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBUaXRsZUFyZWFEaWFsb2cgX0RpYWxvZzsKLQotCS8qCi0JICogQ29uc3RydWN0b3IgZm9yIEphclZlcmlmaWNhdGlvblBhZ2UuCi0JICovCi0JcHVibGljIEphclZlcmlmaWNhdGlvblBhZ2UoSVZlcmlmaWNhdGlvblJlc3VsdCB2ZXJpZmljYXRpb25SZXN1bHQpIHsKLQkJc3VwZXIoVXBkYXRlVUlNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25EaWFsb2dfVmVyaWZpY2F0aW9uKTsgCi0JCV9maWxlTmFtZSA9IHZlcmlmaWNhdGlvblJlc3VsdC5nZXRDb250ZW50UmVmZXJlbmNlKCkuZ2V0SWRlbnRpZmllcigpOwotCQlfVmVyaWZpY2F0aW9uUmVzdWx0ID0gdmVyaWZpY2F0aW9uUmVzdWx0OwotCQlfc3RySWQgPSB2ZXJpZmljYXRpb25SZXN1bHQuZ2V0RmVhdHVyZSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQlfc3RyRmVhdHVyZU5hbWUgPSB2ZXJpZmljYXRpb25SZXN1bHQuZ2V0RmVhdHVyZSgpLmdldExhYmVsKCk7Ci0JCV9zdHJQcm92aWRlck5hbWUgPSB2ZXJpZmljYXRpb25SZXN1bHQuZ2V0RmVhdHVyZSgpLmdldFByb3ZpZGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIGNvbXBvc2l0ZVBhcmVudCkgewotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZVBhcmVudCwgIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5KYXJWZXJpZmljYXRpb25QYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gQ29tcG9zaXRlOiBDbGllbnQKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZUNsaWVudCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlUGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZUNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlQ2xpZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCS8vIFRleHQgSW5mb3JtYXRpb24KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0JCQotCQljcmVhdGVUZXh0QXJlYShjb21wb3NpdGVDbGllbnQpOwotCi0JCS8vIENlcnRpZmljYXRlIEFyZWEKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0KLQkJY3JlYXRlQ2VydGlmaWNhdGVBcmVhKGNvbXBvc2l0ZUNsaWVudCk7Ci0KLQkJLy8gRmlsZSBhbmQgRmVhdHVyZSBJbmZvcm1hdGlvbgotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCQkKLQkJY3JlYXRlSW5mb3JtYXRpb25BcmVhKGNvbXBvc2l0ZUNsaWVudCk7Ci0KLQkJLy8gQ2hvaWNlIEFyZWEKLQkJLy8tLS0tLS0tLS0tLS0JCQotCQkvL2NyZWF0ZUNob2ljZUFyZWEoY29tcG9zaXRlQ2xpZW50KTsKLQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZVBhcmVudCk7Ci0JCXJldHVybiBjb21wb3NpdGVDbGllbnQ7Ci0KLQl9Ci0KLQkvKgotCSAqIENyZWF0ZXMgdGhlIEluZm9ybWF0aW9uIHRleHQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGV4dEFyZWEoQ29tcG9zaXRlIGNvbXBvc2l0ZUNsaWVudCkgewotCi0JCS8vIExhYmVsOiBJbmZvcm1hdGlvbgotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLQotCQlMYWJlbCBsYWJlbEluZm9ybWF0aW9uID0KLQkJCW5ldyBMYWJlbChjb21wb3NpdGVDbGllbnQsIFNXVC5XUkFQKTsKLQkJbGFiZWxJbmZvcm1hdGlvbi5zZXRMYXlvdXREYXRhKAotCQkJbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0gICAgICAgIFN0cmluZyBhY3Rpb25Nc2cgPSBudWxsOwotICAgICAgICBpZiAoX1ZlcmlmaWNhdGlvblJlc3VsdC5pc0ZlYXR1cmVWZXJpZmljYXRpb24oKSkgewotICAgICAgICAgICAgYWN0aW9uTXNnID0gVXBkYXRlVUlNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25EaWFsb2dfTWF5Q2hvb3NlVG9JbnN0YWxsOyAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFjdGlvbk1zZyA9IFVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX01heUNob29zZVRvQ29udGludWU7IAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdCdWZmZXIgc3RyYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc3dpdGNoIChfVmVyaWZpY2F0aW9uUmVzdWx0LmdldFZlcmlmaWNhdGlvbkNvZGUoKSkgewotCi0JCQljYXNlIElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9OT1RfU0lHTkVEIDoKLQkJCQlTdHJpbmcgbXNnID0gKF9WZXJpZmljYXRpb25SZXN1bHQuaXNGZWF0dXJlVmVyaWZpY2F0aW9uKCk/Ci0JCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0Fib3V0VG9JbnN0YWxsX0ZlYXR1cmU6Ci0JCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19BYm91dFRvSW5zdGFsbF9GaWxlKSsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcclxuIiArIGFjdGlvbk1zZzsgLy8kTk9OLU5MUy0xJAotCQkJCXNldE1lc3NhZ2UobXNnLCBXQVJOSU5HKTsKLQkJCQlzdHJiLmFwcGVuZChfVmVyaWZpY2F0aW9uUmVzdWx0LmlzRmVhdHVyZVZlcmlmaWNhdGlvbigpPwotCQkJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX05vdERpZ2l0YWxseVNpZ25lZF9GZWF0dXJlOgotCQkJCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19Ob3REaWdpdGFsbHlTaWduZWRfRmlsZSk7Ci0JCQkJc3RyYi5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN0cmIuYXBwZW5kKF9WZXJpZmljYXRpb25SZXN1bHQuaXNGZWF0dXJlVmVyaWZpY2F0aW9uKCk/Ci0JCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19DYW5ub3RWZXJpZnlQcm92aWRlcl9GZWF0dXJlOgotCQkJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0Nhbm5vdFZlcmlmeVByb3ZpZGVyX0ZpbGUpOwotICAgICAgICAgICAgICAgIAotLyoJCQkJc3RyYi5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChfVmVyaWZpY2F0aW9uUmVzdWx0LmlzRmVhdHVyZVZlcmlmaWNhdGlvbigpKSB7Ci0JCQkJCXN0cmIuYXBwZW5kKAotCQkJCQkJVXBkYXRlVUkuZ2V0UmVzb3VyY2VTdHJpbmcoIkphclZlcmlmaWNhdGlvbkRpYWxvZy5JbnN0YWxsTWF5Q29ycnVwdCIpKTsvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIHsKLQkJCQkJc3RyYi5hcHBlbmQoCi0JCQkJCQlVcGRhdGVVSS5nZXRSZXNvdXJjZVN0cmluZygiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkNvbnRpbnVlTWF5Q29ycnVwdCIpKTsvLyROT04tTkxTLTEkIAkJCQkJCi0JCQkJfQotCQkJCSovCi0JCQkJbGFiZWxJbmZvcm1hdGlvbi5zZXRUZXh0KHN0cmIudG9TdHJpbmcoKSk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX0NPUlJVUFRFRCA6Ci0JCQkJbXNnID0gX1ZlcmlmaWNhdGlvblJlc3VsdC5pc0ZlYXR1cmVWZXJpZmljYXRpb24oKT8KLQkJCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19Db3JydXB0ZWRDb250ZW50X0ZlYXR1cmU6Ci0JCQkJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX0NvcnJ1cHRlZENvbnRlbnRfRmlsZTsKLQkJCQlzZXRNZXNzYWdlKG1zZywgRVJST1IpOwotCQkJCXN0cmIuYXBwZW5kKAotCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19Db21wb25lbnROb3RJbnN0YWxsZWQpOyAKLQkJCQlsYWJlbEluZm9ybWF0aW9uLnNldFRleHQoc3RyYi50b1N0cmluZygpKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfU0lHTkVEX1VOUkVDT0dOSVpFRCA6Ci0JCQkJbXNnID0gKF9WZXJpZmljYXRpb25SZXN1bHQuaXNGZWF0dXJlVmVyaWZpY2F0aW9uKCk/Ci0JCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19TaWduZWRDb21wb25lbnRfRmVhdHVyZToKLQkJCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19TaWduZWRDb21wb25lbnRfRmVhdHVyZSkgKyAgCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHJcbiIgKyBhY3Rpb25Nc2c7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAKLQkJCQlzZXRNZXNzYWdlKG1zZywgV0FSTklORyk7Ci0JCQkJc3RyYi5hcHBlbmQoX1ZlcmlmaWNhdGlvblJlc3VsdC5pc0ZlYXR1cmVWZXJpZmljYXRpb24oKT8KLQkJCQkJVXBkYXRlVUlNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25EaWFsb2dfVW5rbm93bkNlcnRpZmljYXRlX0ZlYXR1cmU6Ci0JCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19Vbmtub3duQ2VydGlmaWNhdGVfRmlsZSk7Ci0JCQkJc3RyYi5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN0cmIuYXBwZW5kKF9WZXJpZmljYXRpb25SZXN1bHQuaXNGZWF0dXJlVmVyaWZpY2F0aW9uKCk/Ci0JCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19VbmFibGVUb1ZlcmlmeVByb3ZpZGVyX0ZlYXR1cmU6Ci0JCQkJCQkJVXBkYXRlVUlNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25EaWFsb2dfVW5hYmxlVG9WZXJpZnlQcm92aWRlcl9GaWxlKTsKLS8qCQkJCXN0cmIuYXBwZW5kKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoX1ZlcmlmaWNhdGlvblJlc3VsdC5pc0ZlYXR1cmVWZXJpZmljYXRpb24oKSkgewotCQkJCQlzdHJiLmFwcGVuZCgKLQkJCQkJCVVwZGF0ZVVJLmdldFJlc291cmNlU3RyaW5nKCJKYXJWZXJpZmljYXRpb25EaWFsb2cuSW5zdGFsbE1heUNvcnJ1cHQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgewotCQkJCQlzdHJiLmFwcGVuZCgKLQkJCQkJCVVwZGF0ZVVJLmdldFJlc291cmNlU3RyaW5nKCJKYXJWZXJpZmljYXRpb25EaWFsb2cuQ29udGludWVNYXlDb3JydXB0IikpOy8vJE5PTi1OTFMtMSQgCQkJCQkKLQkJCQl9Ci0JCQkJKi8KLQkJCQlsYWJlbEluZm9ybWF0aW9uLnNldFRleHQoc3RyYi50b1N0cmluZygpKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfU0lHTkVEX1JFQ09HTklaRUQgOgotCQkJCW1zZyA9IChfVmVyaWZpY2F0aW9uUmVzdWx0LmlzRmVhdHVyZVZlcmlmaWNhdGlvbigpPwotCQkJCQkJVXBkYXRlVUlNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25EaWFsb2dfU2lnbmVkQ29tcG9uZW50X0ZlYXR1cmU6Ci0JCQkJCQkJVXBkYXRlVUlNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25EaWFsb2dfU2lnbmVkQ29tcG9uZW50X0ZpbGUpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcclxuIiArIGFjdGlvbk1zZzsgLy8kTk9OLU5MUy0xJAotCQkJCXNldE1lc3NhZ2UobXNnLCBXQVJOSU5HKTsKLQkJCQlzdHJiLmFwcGVuZChfVmVyaWZpY2F0aW9uUmVzdWx0LmlzRmVhdHVyZVZlcmlmaWNhdGlvbigpPwotCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19Lbm93bkNlcnRpZmljYXRlX0ZlYXR1cmU6Ci0JCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19Lbm93bkNlcnRpZmljYXRlX0ZpbGUpOwotCQkJCXN0cmIuYXBwZW5kKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdHJiLmFwcGVuZChfVmVyaWZpY2F0aW9uUmVzdWx0LmlzRmVhdHVyZVZlcmlmaWNhdGlvbigpPwotCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19Qcm92aWRlcktub3duX0ZlYXR1cmU6Ci0JCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19Qcm92aWRlcktub3duX0ZpbGUpOwotCQkJCXN0cmIuYXBwZW5kKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCWxhYmVsSW5mb3JtYXRpb24uc2V0VGV4dChzdHJiLnRvU3RyaW5nKCkpOwotCi0vLwkJCQljcmVhdGVDYXV0aW9uQXJlYShjb21wb3NpdGVDbGllbnQpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCQotCi0JLyoKLQkgKiBQcmVzZW50cyBGaWxlICYgRmVhdHVyZSBpbmZvcm1hdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVJbmZvcm1hdGlvbkFyZWEoQ29tcG9zaXRlIGNvbXBvc2l0ZUNsaWVudCkgewotCi0JCS8vIENvbXBvc2l0ZTogSW5mb3JtYXRpb24gbGFiZWxzCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGVJbmZvcm1hdGlvbiA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlQ2xpZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJY29tcG9zaXRlSW5mb3JtYXRpb24uc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZUluZm9ybWF0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCS8vIGdldCBib2xkIGZhY2UKLQkJRm9udFJlZ2lzdHJ5IGZyZWdpc3RyeSA9IEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpOwotCQlGb250IGJvbGRGb250ID0gZnJlZ2lzdHJ5LmdldEJvbGQoSkZhY2VSZXNvdXJjZXMuRElBTE9HX0ZPTlQpOwotCQkKLQkJLy8gRmVhdHVyZSBuYW1lCi0JCS8vLS0tLS0tLS0tLS0tLS0tCi0JCUxhYmVsIGtleUxhYmVsID0gbnVsbDsKLQkJQ0xhYmVsIHZhbHVlTGFiZWwgPSBudWxsOwotCQlpZiAoX3N0ckZlYXR1cmVOYW1lICE9IG51bGwgJiYgX3N0ckZlYXR1cmVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJa2V5TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlSW5mb3JtYXRpb24sIFNXVC5OVUxMKTsKLQkJCWtleUxhYmVsLnNldFRleHQoCi0JCQkJVXBkYXRlVUlNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25EaWFsb2dfRmVhdHVyZU5hbWUpOyAKLQotCQkJdmFsdWVMYWJlbCA9IG5ldyBDTGFiZWwoY29tcG9zaXRlSW5mb3JtYXRpb24sIFNXVC5OVUxMKTsKLQkJCXZhbHVlTGFiZWwuc2V0Rm9udChib2xkRm9udCk7Ci0JCQl2YWx1ZUxhYmVsLnNldFRleHQoX3N0ckZlYXR1cmVOYW1lKTsKLQkJCXZhbHVlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCX0KLQkJLy8gRmVhdHVyZSBpZGVudGlmaWVyCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCWlmIChfc3RySWQgIT0gbnVsbCAmJiBfc3RySWQubGVuZ3RoKCkgPiAwKSB7Ci0JCQlrZXlMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGVJbmZvcm1hdGlvbiwgU1dULk5VTEwpOwotCQkJa2V5TGFiZWwuc2V0VGV4dCgKLQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19GZWF0dXJlSWRlbnRpZmllcik7IAotCi0JCQl2YWx1ZUxhYmVsID0gbmV3IENMYWJlbChjb21wb3NpdGVJbmZvcm1hdGlvbiwgU1dULk5VTEwpOwotCQkJdmFsdWVMYWJlbC5zZXRGb250KGJvbGRGb250KTsKLQkJCXZhbHVlTGFiZWwuc2V0VGV4dChfc3RySWQpOwotCQkJdmFsdWVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJfQotCQkvLyBQcm92aWRlciBuYW1lCi0JCS8vLS0tLS0tLS0tLS0tLS0KLQkJaWYgKF9zdHJQcm92aWRlck5hbWUgIT0gbnVsbCAmJiBfc3RyUHJvdmlkZXJOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJa2V5TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlSW5mb3JtYXRpb24sIFNXVC5OVUxMKTsKLQkJCWtleUxhYmVsLnNldFRleHQoCi0JCQkJVXBkYXRlVUlNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25EaWFsb2dfUHJvdmlkZXIpOyAKLQotCQkJdmFsdWVMYWJlbCA9IG5ldyBDTGFiZWwoY29tcG9zaXRlSW5mb3JtYXRpb24sIFNXVC5OVUxMKTsKLQkJCXZhbHVlTGFiZWwuc2V0Rm9udChib2xkRm9udCk7Ci0JCQl2YWx1ZUxhYmVsLnNldFRleHQoX3N0clByb3ZpZGVyTmFtZSk7Ci0JCQl2YWx1ZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl9Ci0JCS8vIExhYmVsOiBGaWxlIG5hbWUKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLQotCQlrZXlMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGVJbmZvcm1hdGlvbiwgU1dULk5VTEwpOwotCQlrZXlMYWJlbC5zZXRUZXh0KAotCQkJVXBkYXRlVUlNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25EaWFsb2dfRmlsZU5hbWUpOyAKLQotCQl2YWx1ZUxhYmVsID0gbmV3IENMYWJlbChjb21wb3NpdGVJbmZvcm1hdGlvbiwgU1dULk5VTEwpOwotCQl2YWx1ZUxhYmVsLnNldEZvbnQoYm9sZEZvbnQpOwotCQl2YWx1ZUxhYmVsLnNldFRleHQoX2ZpbGVOYW1lKTsKLQkJdmFsdWVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQl9Ci0KLQkvKgotCSAqIFNob3cgY2VydGlmaWNhdGUgaW5mb3JtYXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ2VydGlmaWNhdGVBcmVhKENvbXBvc2l0ZSBjb21wb3NpdGVDbGllbnQpIHsKLQotCQlpZiAoX1ZlcmlmaWNhdGlvblJlc3VsdC5nZXRWZXJpZmljYXRpb25Db2RlKCkKLQkJCT09IElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9TSUdORURfVU5SRUNPR05JWkVECi0JCQl8fCBfVmVyaWZpY2F0aW9uUmVzdWx0LmdldFZlcmlmaWNhdGlvbkNvZGUoKQotCQkJCT09IElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9TSUdORURfUkVDT0dOSVpFRCkgewotCQkJLy8gR3JvdXAgYm94Ci0JCQkvLy0tLS0tLS0tLS0KLQkJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZUNsaWVudCwgU1dULlNIQURPV19FVENIRURfSU4pOwotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJZ3JvdXAuc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19DZXJ0aWZpY2F0ZUluZm8pOyAKLQotCQkJLy8gU2lnbmVyCi0JCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCUxhYmVsIGtleUxhYmVsID0gbnVsbDsKLQkJCVRleHQgdmFsdWVUZXh0ID0gbnVsbDsKLQkJCS8vZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJLy9kYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQkJLy90ZXh0SW5mb3JtYXRpb24uc2V0TGF5b3V0RGF0YShkYXRhKTsJCQkKLQkJCWlmIChfVmVyaWZpY2F0aW9uUmVzdWx0LmdldFNpZ25lckluZm8oKSAhPSBudWxsKSB7Ci0JCQkJa2V5TGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OVUxMKTsKLQkJCQlrZXlMYWJlbC5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuSmFyVmVyaWZpY2F0aW9uRGlhbG9nX1N1YmplY3RDQSk7IAotCQkJCWtleUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCi0JCQkJdmFsdWVUZXh0ID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5NVUxUSXxTV1QuQk9SREVSfFNXVC5XUkFQfFNXVC5WX1NDUk9MTCk7Ci0JCQkJdmFsdWVUZXh0LnNldFRleHQoX1ZlcmlmaWNhdGlvblJlc3VsdC5nZXRTaWduZXJJbmZvKCkpOwotCQkJCXZhbHVlVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQkJdmFsdWVUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJfQotCQkJCi0JCQkvLyBBdXRoZW50aWNhdG9yCi0JCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJaWYgKF9WZXJpZmljYXRpb25SZXN1bHQuZ2V0VmVyaWZpZXJJbmZvKCkgIT0gbnVsbCkgewotCQkJCWtleUxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTlVMTCk7Ci0JCQkJa2V5TGFiZWwuc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkphclZlcmlmaWNhdGlvbkRpYWxvZ19Sb290Q0EpOyAKLQkJCQlrZXlMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsJCQkJCi0KLQkJCQl2YWx1ZVRleHQgPSBuZXcgVGV4dChncm91cCwgU1dULk1VTFRJfFNXVC5CT1JERVJ8U1dULldSQVB8U1dULlZfU0NST0xMKTsKLQkJCQl2YWx1ZVRleHQuc2V0VGV4dChfVmVyaWZpY2F0aW9uUmVzdWx0LmdldFZlcmlmaWVySW5mbygpKTsKLQkJCQl2YWx1ZVRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJCXZhbHVlVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogU2V0cyB0aGUgRGlhbG9nCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGl0bGVBcmVhRGlhbG9nKFRpdGxlQXJlYURpYWxvZyBkaWFsb2cpIHsKLQkJX0RpYWxvZyA9IGRpYWxvZzsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG5ld01lc3NhZ2UsIGludCBuZXdUeXBlKSB7Ci0JCXN1cGVyLnNldE1lc3NhZ2UobmV3TWVzc2FnZSwgbmV3VHlwZSk7Ci0JCWlmIChfRGlhbG9nICE9IG51bGwpIHsKLQkJCV9EaWFsb2cuc2V0TWVzc2FnZShuZXdNZXNzYWdlLCBuZXdUeXBlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvblNlcnZpY2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWN1cml0eS9KYXJWZXJpZmljYXRpb25TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MWJjMzMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvblNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlY3VyaXR5OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIEphclZlcmlmaWNhdGlvblNlcnZpY2UgaW1wbGVtZW50cyBJVmVyaWZpY2F0aW9uTGlzdGVuZXIgewotCi0JLyoKLQkgKiBUaGUgSmFyVmVyaWZpZXIgaXMgYSBpbnN0YW5jZSB2YXJpYWJsZQotCSAqIGJhY2F1c2Ugd2Ugd2FudCB0byByZXVzZSBpdCB1cG9uIG11bHRpcGxlIGNhbGxzCi0JICovCi0KLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCS8vIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgdmVyaWZ5IGNvZGUuCi0JcHJpdmF0ZSBpbnQgbGFzdFZlcmlmeUNvZGUgPSAtMTsKLQkKLQkvKioKLQkgKiBQcm9jZXNzZWQgQ29udGVudFJlZmVybmNlcy4gIFRoZXkgd2lsbCBiZSBza2lwcGVkIGlmIHByb21wdGVkCi0JICogdG8gdmVyaWZ5IHRoZSBzYW1lIHJlZmVyZW5jZSBhZ2Fpbi4KLQkgKi8KLQlwcml2YXRlIE1hcCBwcm9jZXNzZWQ9bmV3IEhhc2hNYXAoKTsKLQotCS8qCi0JICogSWYgbm8gc2hlbGwsIGNyZWF0ZSBhIG5ldyBzaGVsbCAKLQkgKi8KLQlwdWJsaWMgSmFyVmVyaWZpY2F0aW9uU2VydmljZSgpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0JCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSmFyVmVyaWZpY2F0aW9uU2VydmljZShTaGVsbCBhU2hlbGwpIHsKLQkJc2hlbGwgPSBhU2hlbGw7Ci0KLQkJLy8gZmluZCB0aGUgZGVmYXVsdCBkaXNwbGF5IGFuZCBnZXQgdGhlIGFjdGl2ZSBzaGVsbAotCQlpZiAoc2hlbGwgPT0gbnVsbCkgewotCQkJZmluYWwgRGlzcGxheSBkaXNwID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQlpZiAoZGlzcCA9PSBudWxsKSB7Ci0JCQkJc2hlbGwgPSBuZXcgU2hlbGwobmV3IERpc3BsYXkoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWRpc3Auc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlzaGVsbCA9IGRpc3AuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwcml2YXRlIGludCBvcGVuV2l6YXJkKElWZXJpZmljYXRpb25SZXN1bHQgcmVzdWx0KSB7Ci0JCWludCBjb2RlOwotCQlJRGlhbG9nUGFnZSBwYWdlID0gbmV3IEphclZlcmlmaWNhdGlvblBhZ2UocmVzdWx0KTsKLQkJSmFyVmVyaWZpY2F0aW9uRGlhbG9nIGRpYWxvZyA9Ci0JCQkJbmV3IEphclZlcmlmaWNhdGlvbkRpYWxvZyhzaGVsbCxwYWdlLHJlc3VsdCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSg2MDAsIDUwMCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5KYXJWZXJpZmljYXRpb25EaWFsb2dfd3RpdGxlKTsgCi0JCWRpYWxvZy5vcGVuKCk7Ci0JCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IEphclZlcmlmaWNhdGlvbkRpYWxvZy5PSykgewotCQkJY29kZSA9IENIT0lDRV9JTlNUQUxMX1RSVVNUX09OQ0U7Ci0JCX0gZWxzZSBpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBKYXJWZXJpZmljYXRpb25EaWFsb2cuSU5TVEFMTF9BTEwpIHsKLQkJCWNvZGUgPSBDSE9JQ0VfSU5TVEFMTF9UUlVTVF9BTFdBWVM7Ci0JCX0gZWxzZSB7IAotCQkJY29kZSA9IENIT0lDRV9BQk9SVDsKLQkJfQotCQlyZXR1cm4gY29kZTsKLQotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIGludCBwcm9tcHQoZmluYWwgSVZlcmlmaWNhdGlvblJlc3VsdCB2ZXJpZmljYXRpb25SZXN1bHQpewotCQlpZiAoIVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFVwZGF0ZUNvcmUuUF9DSEVDS19TSUdOQVRVUkUpKSAKLQkJCXJldHVybiBDSE9JQ0VfSU5TVEFMTF9UUlVTVF9BTFdBWVM7Ci0KLQkJaWYgKHZlcmlmaWNhdGlvblJlc3VsdC5hbHJlYWR5U2VlbigpKSByZXR1cm4gQ0hPSUNFX0lOU1RBTExfVFJVU1RfQUxXQVlTOwotCQkKLQkJaWYoc2VlKHZlcmlmaWNhdGlvblJlc3VsdCkpIHJldHVybiBDSE9JQ0VfSU5TVEFMTF9UUlVTVF9BTFdBWVM7Ci0JCQotCQlpZiAobGFzdFZlcmlmeUNvZGUgPT0gQ0hPSUNFX0lOU1RBTExfVFJVU1RfQUxXQVlTKSByZXR1cm4gQ0hPSUNFX0lOU1RBTExfVFJVU1RfQUxXQVlTOwotCi0JCXN3aXRjaCAodmVyaWZpY2F0aW9uUmVzdWx0LmdldFZlcmlmaWNhdGlvbkNvZGUoKSkgewotCQkJY2FzZSBJVmVyaWZpY2F0aW9uUmVzdWx0LlVOS05PV05fRVJST1IgOgotCQkJCQlyZXR1cm4gQ0hPSUNFX0VSUk9SOwotCi0JCQljYXNlIElWZXJpZmljYXRpb25SZXN1bHQuVkVSSUZJQ0FUSU9OX0NBTkNFTExFRDoKLQkJCQkJcmV0dXJuIENIT0lDRV9BQk9SVDsKLQotCQkJLy8gY2Fubm90IHZlcmlmeSBpdDogZG8gbm90IHByb21wdCB1c2VyLgotCQkJY2FzZSBJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfVU5SRUNPR05JWkVEOiAKLQkJCQlyZXR1cm4gQ0hPSUNFX0lOU1RBTExfVFJVU1RfQUxXQVlTOwkJCQkKLQkJCQotCQkJZGVmYXVsdCA6Ci0JCQkJewkJCQkKLQkJCQkJc2hlbGwuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlsYXN0VmVyaWZ5Q29kZSA9IG9wZW5XaXphcmQodmVyaWZpY2F0aW9uUmVzdWx0KTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJCXJldHVybiBsYXN0VmVyaWZ5Q29kZTsKLQkJCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBmZWF0dXJlIGFyY2hpdmUgaGFzIGJlZW4gc2VlbiBhbHJlYWR5LgotCSAqIFJlbWVtYmVycyB0aGUgZmFjdCB0aGF0IGFyY2hpdmUgaXMgYmVpbmcgc2VlbiBub3cuCi0JICogQHBhcmFtIHZlcmlmaWNhdGlvblJlc3VsdAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYXJjaGl2ZSBoYXMgYmVlbiBzZWVuIGJlZm9yZSwgZmFsc2UgaWYgZmlyc3QgdGltZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzZWUoZmluYWwgSVZlcmlmaWNhdGlvblJlc3VsdCB2ZXJpZmljYXRpb25SZXN1bHQpIHsKLQkJU3RyaW5nIGtleSA9IHZlcmlmaWNhdGlvblJlc3VsdC5nZXRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkKLQkJCSsiLyIrdmVyaWZpY2F0aW9uUmVzdWx0LmdldENvbnRlbnRSZWZlcmVuY2UoKS5nZXRJZGVudGlmaWVyKCk7IC8vJE5PTi1OTFMtMSQKLQkJTG9uZyB2YWx1ZSA9IG5ldyBMb25nKHZlcmlmaWNhdGlvblJlc3VsdC5nZXRDb250ZW50UmVmZXJlbmNlKCkuZ2V0TGFzdE1vZGlmaWVkKCkpOwotCQlMb25nIGNhY2hlZFZhbHVlID0gKExvbmcpcHJvY2Vzc2VkLmdldChrZXkpOwotCQlpZih2YWx1ZS5lcXVhbHMoY2FjaGVkVmFsdWUpKXsKLQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZXsKLQkJCXByb2Nlc3NlZC5wdXQoa2V5LCB2YWx1ZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvVXNlclZhbGlkYXRpb25EaWFsb2cuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWN1cml0eS9Vc2VyVmFsaWRhdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjYxNzI4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWN1cml0eS9Vc2VyVmFsaWRhdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VjdXJpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLQotLyoqCi0gKiBVc2VyIGF1dGhlbnRpY2F0aW9uIGRpYWxvZwotICovCi1wdWJsaWMgY2xhc3MgVXNlclZhbGlkYXRpb25EaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByb3RlY3RlZCBUZXh0IHVzZXJuYW1lRmllbGQ7Ci0JcHJvdGVjdGVkIFRleHQgcGFzc3dvcmRGaWVsZDsKLQotCXByb3RlY3RlZCBTdHJpbmcgaG9zdDsKLQlwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2U7Ci0JcHJvdGVjdGVkIEF1dGhlbnRpY2F0aW9uIHVzZXJBdXRoZW50aWNhdGlvbiA9IG51bGw7Ci0JLyoqCi0JICogR2V0cyB1c2VyIGFuZCBwYXNzd29yZCBmcm9tIGEgdXNlci4gTWF5IGJlIGNhbGxlZCBmcm9tIGFueSB0aHJlYWQKLQkgKiAKLQkgKiBAcmV0dXJuIFVzZXJBdXRoZW50aWNhdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSB1c2VyaWQgYW5kIHRoZSBwYXNzd29yZCBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGRpYWxvZyBoYXMgYmVlbiBjYW5jZWxsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEF1dGhlbnRpY2F0aW9uIGdldEF1dGhlbnRpY2F0aW9uKGZpbmFsIFN0cmluZyBob3N0LAotCQkJZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJY2xhc3MgVUlPcGVyYXRpb24gaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCQlwdWJsaWMgQXV0aGVudGljYXRpb24gYXV0aGVudGljYXRpb247Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJYXV0aGVudGljYXRpb24gPSBVc2VyVmFsaWRhdGlvbkRpYWxvZy5hc2tGb3JBdXRoZW50aWNhdGlvbigKLQkJCQkJCWhvc3QsIG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0KLQkJVUlPcGVyYXRpb24gdWlvID0gbmV3IFVJT3BlcmF0aW9uKCk7Ci0JCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSAhPSBudWxsKSB7Ci0JCQl1aW8ucnVuKCk7Ci0JCX0gZWxzZSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyh1aW8pOwotCQl9Ci0JCXJldHVybiB1aW8uYXV0aGVudGljYXRpb247Ci0JfQotCS8qKgotCSAqIEdldHMgdXNlciBhbmQgcGFzc3dvcmQgZnJvbSBhIHVzZXIgTXVzdCBiZSBjYWxsZWQgZnJvbSBVSSB0aHJlYWQKLQkgKiAKLQkgKiBAcmV0dXJuIFVzZXJBdXRoZW50aWNhdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSB1c2VyaWQgYW5kIHRoZSBwYXNzd29yZCBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGRpYWxvZyBoYXMgYmVlbiBjYW5jZWxsZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEF1dGhlbnRpY2F0aW9uIGFza0ZvckF1dGhlbnRpY2F0aW9uKFN0cmluZyBob3N0LAotCQkJU3RyaW5nIG1lc3NhZ2UpIHsKLQkJVXNlclZhbGlkYXRpb25EaWFsb2cgdWkgPSBuZXcgVXNlclZhbGlkYXRpb25EaWFsb2cobnVsbCwgaG9zdCwgbWVzc2FnZSk7IAotCQl1aS5vcGVuKCk7Ci0JCXJldHVybiB1aS5nZXRBdXRoZW50aWNhdGlvbigpOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IFVzZXJWYWxpZGF0aW9uRGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqICAgICAgICAgICAgcGFyZW50IFNoZWxsIG9yIG51bGwKLQkgKi8KLQlwcm90ZWN0ZWQgVXNlclZhbGlkYXRpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBob3N0LAotCQkJU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLmhvc3QgPSBob3N0OwotCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotCQlzZXRCbG9ja09uT3Blbih0cnVlKTsKLQl9Ci0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotCQluZXdTaGVsbC5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuVXNlclZlcmlmaWNhdGlvbkRpYWxvZ19QYXNzd29yZFJlcXVpcmVkKTsgCi0JfQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLQkJc3VwZXIuY3JlYXRlKCk7Ci0JCS8vZ2l2ZSBmb2N1cyB0byB1c2VybmFtZSBmaWVsZAotCQl1c2VybmFtZUZpZWxkLnNlbGVjdEFsbCgpOwotCQl1c2VybmFtZUZpZWxkLnNldEZvY3VzKCk7Ci0JfQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgbWFpbiA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQltYWluLnNldExheW91dChsYXlvdXQpOwotCQltYWluLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKG1haW4sIFNXVC5XUkFQKTsKLQkJU3RyaW5nIHRleHQgPSBVcGRhdGVVSU1lc3NhZ2VzLlVzZXJWZXJpZmljYXRpb25EaWFsb2dfQ29ubmVjdFRvICsgaG9zdDsgCi0JCXRleHQgKz0gIlxuXG4iICsgbWVzc2FnZTsgLy8kTk9OLU5MUy0xJCAKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQljcmVhdGVVc2VybmFtZUZpZWxkcyhtYWluKTsKLQkJY3JlYXRlUGFzc3dvcmRGaWVsZHMobWFpbik7Ci0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobWFpbiwKLQkJCQkib3JnLmVjbGlwc2UudXBkYXRlLnVpLlVzZXJWYWxpZGF0aW9uRGlhbG9nIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG1haW47Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRocmVlIHdpZGdldHMgdGhhdCByZXByZXNlbnQgdGhlIHVzZXIgbmFtZSBlbnRyeSBhcmVhLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVBhc3N3b3JkRmllbGRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5Vc2VyVmVyaWZpY2F0aW9uRGlhbG9nX1Bhc3N3b3JkKTsgCi0KLQkJcGFzc3dvcmRGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5QQVNTV09SRCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkVOVFJZX0ZJRUxEX1dJRFRIKTsKLQkJcGFzc3dvcmRGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCW5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsgLy9zcGFjZXIKLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGhyZWUgd2lkZ2V0cyB0aGF0IHJlcHJlc2VudCB0aGUgdXNlciBuYW1lIGVudHJ5IGFyZWEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVXNlcm5hbWVGaWVsZHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSkuc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLlVzZXJWZXJpZmljYXRpb25EaWFsb2dfVXNlck5hbWUpOyAKLQotCQl1c2VybmFtZUZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuRU5UUllfRklFTERfV0lEVEgpOwotCQl1c2VybmFtZUZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOyAvL3NwYWNlcgotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVc2VyQXV0aGVudGljYXRpb24gZW50ZXJlZCBieSB0aGUgdXNlciwgb3IgbnVsbCBpZiB0aGUgdXNlcgotCSAqIGNhbmNlbGVkLgotCSAqLwotCXB1YmxpYyBBdXRoZW50aWNhdGlvbiBnZXRBdXRoZW50aWNhdGlvbigpIHsKLQkJcmV0dXJuIHVzZXJBdXRoZW50aWNhdGlvbjsKLQl9Ci0JLyoqCi0JICogTm90aWZpZXMgdGhhdCB0aGUgb2sgYnV0dG9uIG9mIHRoaXMgZGlhbG9nIGhhcyBiZWVuIHByZXNzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQl1c2VyQXV0aGVudGljYXRpb24gPSBuZXcgQXV0aGVudGljYXRpb24odXNlcm5hbWVGaWVsZC5nZXRUZXh0KCksCi0JCQkJcGFzc3dvcmRGaWVsZC5nZXRUZXh0KCkpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9Db25maWd1cmF0aW9uUHJldmlldy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0NvbmZpZ3VyYXRpb25QcmV2aWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NGNiZTguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0NvbmZpZ3VyYXRpb25QcmV2aWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JTG9jYWxTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25QcmV2aWV3IGltcGxlbWVudHMgSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyIHsKLQlwcml2YXRlIFNjcm9sbGVkRm9ybSBmb3JtOwotCXByaXZhdGUgQ29uZmlndXJhdGlvblZpZXcgdmlldzsKLQlwcml2YXRlIEZvcm1Ub29sa2l0IHRvb2xraXQ7Ci0JcHJpdmF0ZSBGb3JtVGV4dCBkZXNjOwotCXByaXZhdGUgRm9ybVRleHQgdGFza0xpc3Q7Ci0JcHJpdmF0ZSBJUHJldmlld1Rhc2tbXSB0YXNrczsKLQkKLQlwdWJsaWMgQ29uZmlndXJhdGlvblByZXZpZXcoQ29uZmlndXJhdGlvblZpZXcgdmlldykgewotCQl0aGlzLnZpZXcgPSB2aWV3OwotCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCQltb2RlbC5hZGRVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJVXBkYXRlTW9kZWwgbW9kZWwgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKTsKLQkJbW9kZWwucmVtb3ZlVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCXRvb2xraXQuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG9iamVjdHNBZGRlZChPYmplY3QgcGFyZW50LCBPYmplY3RbXSBjaGlsZHJlbikgewotCX0KLQlwdWJsaWMgdm9pZCBvYmplY3RzUmVtb3ZlZChPYmplY3QgcGFyZW50LCBPYmplY3RbXSBjaGlsZHJlbikgewotCX0KLQlwdWJsaWMgdm9pZCBvYmplY3RDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCX0KLQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBmb3JtOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQl0b29sa2l0ID0gbmV3IEZvcm1Ub29sa2l0KHBhcmVudC5nZXREaXNwbGF5KCkpOwotCQlmb3JtID0gdG9vbGtpdC5jcmVhdGVTY3JvbGxlZEZvcm0ocGFyZW50KTsKLQkJVGFibGVXcmFwTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZVdyYXBMYXlvdXQoKTsKLQkJZm9ybS5nZXRCb2R5KCkuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWxheW91dC5sZWZ0TWFyZ2luID0gMTA7Ci0JCWxheW91dC5yaWdodE1hcmdpbiA9IDU7Ci0JCWxheW91dC50b3BNYXJnaW4gPSAxMDsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDIwOwotCQlJSHlwZXJsaW5rTGlzdGVuZXIgdXJsQWN0aW9uID0gbmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQlTdHJpbmcgdXJsID0gKFN0cmluZykgZS5nZXRIcmVmKCk7Ci0JCQkJaWYgKHVybCAhPSBudWxsKQotCQkJCQlVcGRhdGVVSS5zaG93VVJMKHVybCk7Ci0JCQl9Ci0JCX07Ci0JCUlIeXBlcmxpbmtMaXN0ZW5lciB0YXNrQWN0aW9uID0gbmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQlTdHJpbmcgaW5kZXhBcmcgPSAoU3RyaW5nKSBlLmdldEhyZWYoKTsKLQkJCQl0cnkgewotCQkJCQlpbnQgaW5kZXggPSBJbnRlZ2VyLnBhcnNlSW50KGluZGV4QXJnKTsKLQkJCQkJaWYgKHRhc2tzICE9IG51bGwpCi0JCQkJCQl0YXNrc1tpbmRleF0ucnVuKCk7Ci0JCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7Ci0JCQkJfQotCQkJfQotCQl9OwotCQkvL3Rhc2tBY3Rpb24uc2V0U3RhdHVzTGluZU1hbmFnZXIodmlldy5nZXRDb25maWd1cmF0aW9uV2luZG93KCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSk7Ci0JCWRlc2MgPSB0b29sa2l0LmNyZWF0ZUZvcm1UZXh0KGZvcm0uZ2V0Qm9keSgpLCB0cnVlKTsKLQkJZGVzYy5zZXRIeXBlcmxpbmtTZXR0aW5ncyh0b29sa2l0LmdldEh5cGVybGlua0dyb3VwKCkpOwotCQlkZXNjLmFkZEh5cGVybGlua0xpc3RlbmVyKHVybEFjdGlvbik7Ci0JCWRlc2Muc2V0VGV4dCgiIiwgZmFsc2UsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQlkZXNjLnNldExheW91dERhdGEodGQpOwotCQl0YXNrTGlzdCA9IHRvb2xraXQuY3JlYXRlRm9ybVRleHQoZm9ybS5nZXRCb2R5KCksIGZhbHNlKTsKLQkJdGFza0xpc3Quc2V0SHlwZXJsaW5rU2V0dGluZ3ModG9vbGtpdC5nZXRIeXBlcmxpbmtHcm91cCgpKTsKLQkJdGFza0xpc3QuYWRkSHlwZXJsaW5rTGlzdGVuZXIodGFza0FjdGlvbik7IAotCQl0YXNrTGlzdC5zZXRUZXh0KCIiLCBmYWxzZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCS8vZmFjdG9yeS5zZXRIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKEh5cGVybGlua1NldHRpbmdzLlVOREVSTElORV9ST0xMT1ZFUik7Ci0JCXRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQl0YXNrTGlzdC5zZXRMYXlvdXREYXRhKHRkKTsKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuU2l0ZUZvcm0iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBvYmplY3QgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCXRhc2tzID0gdmlldy5nZXRQcmV2aWV3VGFza3Mob2JqZWN0KTsKLQkJU3RyaW5nIHRpdGxlID0gZ2V0T2JqZWN0TGFiZWwoc2VsZWN0aW9uLnNpemUoKT4xP3NlbGVjdGlvbjpvYmplY3QpOwotCQlmb3JtLnNldFRleHQodGl0bGUpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBnZXRPYmplY3REZXNjcmlwdGlvbihzZWxlY3Rpb24uc2l6ZSgpPjE/c2VsZWN0aW9uOm9iamVjdCk7Ci0JCWJvb2xlYW4gdGFncyA9IGRlc2NyaXB0aW9uLnN0YXJ0c1dpdGgoIjxmb3JtPiIpOyAvLyROT04tTkxTLTEkCi0JCWRlc2Muc2V0VGV4dChkZXNjcmlwdGlvbiwgdGFncywgIXRhZ3MpOwotCQlTdHJpbmcgdGFza1RleHQgPSBnZXRUYXNrc1RleHQoKTsKLQkJdGFza0xpc3Quc2V0VGV4dCh0YXNrVGV4dCwgdHJ1ZSwgZmFsc2UpOwotCQlmb3JtLnJlZmxvdyh0cnVlKTsKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0T2JqZWN0TGFiZWwoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJVHJlZVZpZXdlciB2aWV3ZXIgPSB2aWV3LmdldFRyZWVWaWV3ZXIoKTsKLQkJTGFiZWxQcm92aWRlciBwcm92aWRlciA9IChMYWJlbFByb3ZpZGVyKSB2aWV3ZXIuZ2V0TGFiZWxQcm92aWRlcigpOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCVByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQkJCWludCBjb3VudGVyPTE7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKW9iamVjdCkuaXRlcmF0b3IoKTsKLQkJCQlpdGVyLmhhc05leHQoKTspIHsKLQkJCQlwdy5wcmludGxuKGNvdW50ZXIrIi4gIitwcm92aWRlci5nZXRUZXh0KGl0ZXIubmV4dCgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQljb3VudGVyKys7Ci0JCQl9Ci0JCQlyZXR1cm4gc3cudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gcHJvdmlkZXIuZ2V0VGV4dChvYmplY3QpOwotCX0KLQlwcml2YXRlIFN0cmluZyBnZXRPYmplY3REZXNjcmlwdGlvbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJRmVhdHVyZUFkYXB0ZXIpIHsKLQkJCXJldHVybiBnZXRGZWF0dXJlRGVzY3JpcHRpb24oKElGZWF0dXJlQWRhcHRlcikgb2JqZWN0KTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUNvbmZpZ3VyZWRTaXRlQWRhcHRlcikgewotCQkJcmV0dXJuIFVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblByZXZpZXdGb3JtX2luc3RhbGw7IAotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJTG9jYWxTaXRlKSB7Ci0JCQlyZXR1cm4gVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uUHJldmlld0Zvcm1fY29uZmlnRGVzY3JpcHRpb247IAotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQlwcml2YXRlIFN0cmluZyBnZXRGZWF0dXJlRGVzY3JpcHRpb24oSUZlYXR1cmVBZGFwdGVyIGFkYXB0ZXIpIHsKLQkJdHJ5IHsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyLmdldEZlYXR1cmUobnVsbCk7Ci0JCQlJVVJMRW50cnkgZW50cnkgPSBmZWF0dXJlLmdldERlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJCVN0cmluZyB0ZXh0ID0gZW50cnkuZ2V0QW5ub3RhdGlvbigpOwotCQkJCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCQkJVVJMIHVybCA9IGVudHJ5LmdldFVSTCgpOwotCQkJCQlpZiAodXJsID09IG51bGwpCi0JCQkJCQlyZXR1cm4gdGV4dDsKLQkJCQkJZWxzZSB7Ci0JCQkJCQlTdHJpbmcgbGluayA9ICIgPGEgaHJlZj1cIiIgKyB1cmwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkrICJcIj4iK1VwZGF0ZVVJTWVzc2FnZXMuTW9yZUluZm9HZW5lcmF0b3JfbW9yZUluZm8rIjwvYT4iOyAgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJCQlTdHJpbmcgZnVsbFRleHQgPSAiPGZvcm0+PHA+IiArIHRleHQgKyBsaW5rIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJKyAiPC9wPjwvZm9ybT4iOyAvLyROT04tTkxTLTEkIAotCQkJCQkJcmV0dXJuIGZ1bGxUZXh0OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGFza3NUZXh0KCkgewotCQlpZiAodGFza3MgPT0gbnVsbCB8fCB0YXNrcy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiAiPGZvcm0vPiI7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBoYXNFbmFibGVkVGFza3MgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YXNrcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRhc2tzW2ldLmlzRW5hYmxlZCgpKSB7Ci0JCQkJaGFzRW5hYmxlZFRhc2tzID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoIWhhc0VuYWJsZWRUYXNrcykKLQkJCXJldHVybiAiPGZvcm0vPiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmLmFwcGVuZCgiPGZvcm0+PHA+PGI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmLmFwcGVuZChVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25QcmV2aWV3Rm9ybV9BdmFpbGFibGVUYXNrcyk7IAotCQlidWYuYXBwZW5kKCI8L2I+PC9wPiIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFza3MubGVuZ3RoOyBpKyspIHsKLQkJCUlQcmV2aWV3VGFzayB0YXNrID0gdGFza3NbaV07Ci0JCQlpZiAodGFzay5pc0VuYWJsZWQoKSA9PSBmYWxzZSkKLQkJCQljb250aW51ZTsKLQkJCWJ1Zi5hcHBlbmQoIjxsaSBzdHlsZT1cInRleHRcIiBpbmRlbnQ9XCIwXCI+PGEgaHJlZj1cIiIgKyBpICsgIlwiPiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCSsgdGFzay5nZXROYW1lKCkgKyAiPC9hPjwvbGk+Iik7IC8vJE5PTi1OTFMtMSQgIAotCQkJYnVmLmFwcGVuZCgiPGxpIHN0eWxlPVwidGV4dFwiIGluZGVudD1cIjEwXCIgdnNwYWNlPVwiZmFsc2VcIj4iIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyB0YXNrLmdldERlc2NyaXB0aW9uKCkgKyAiPC9saT4iKTsgLy8kTk9OLU5MUy0xJCAKLQkJfQotCQlidWYuYXBwZW5kKCI8L2Zvcm0+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9Db25maWd1cmF0aW9uVmlldy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0NvbmZpZ3VyYXRpb25WaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZTdkYTAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0NvbmZpZ3VyYXRpb25WaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJhbmRpbmcuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5Mb2NhbFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIEBzZWUgVmlld1BhcnQKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25WaWV3Ci0JaW1wbGVtZW50cwotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIsCi0JCUlDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lciwKLQkJSUxvY2FsU2l0ZUNoYW5nZWRMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0JcHJpdmF0ZSBEcmlsbERvd25BZGFwdGVyIGRyaWxsRG93bkFkYXB0ZXI7Ci0JcHJpdmF0ZSBBY3Rpb24gY29sbGFwc2VBbGxBY3Rpb247Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX1NIT1dfVU5DT05GID0gIkNvbmZpZ3VyYXRpb25WaWV3LnNob3dVbmNvbmYiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX1NIT1dfU0lURVMgPSAiQ29uZmlndXJhdGlvblZpZXcuc2hvd1NpdGVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9TSE9XX05FU1RFRF9GRUFUVVJFUyA9Ci0JCSJDb25maWd1cmF0aW9uVmlldy5zaG93TmVzdGVkRmVhdHVyZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEFjdGlvbiBzaG93U2l0ZXNBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gc2hvd05lc3RlZEZlYXR1cmVzQWN0aW9uOwotCXByaXZhdGUgUmVwbGFjZVZlcnNpb25BY3Rpb24gc3dhcFZlcnNpb25BY3Rpb247Ci0JcHJpdmF0ZSBGZWF0dXJlU3RhdGVBY3Rpb24gZmVhdHVyZVN0YXRlQWN0aW9uOwotCXByaXZhdGUgVW5pbnN0YWxsRmVhdHVyZUFjdGlvbiB1bmluc3RhbGxGZWF0dXJlQWN0aW9uOwotCXByaXZhdGUgVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlQWN0aW9uIHVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZUFjdGlvbjsKLQlwcml2YXRlIEZlYXR1cmVzU3RhdGVBY3Rpb24gZmVhdHVyZXNTdGF0ZUFjdGlvbjsKLQlwcml2YXRlIFVuaW5zdGFsbEZlYXR1cmVzQWN0aW9uIHVuaW5zdGFsbEZlYXR1cmVzQWN0aW9uOwotCXByaXZhdGUgVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlc0FjdGlvbiB1bmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVzQWN0aW9uOwotCXByaXZhdGUgSW5zdGFsbE9wdGlvbmFsRmVhdHVyZUFjdGlvbiBpbnN0YWxsT3B0RmVhdHVyZUFjdGlvbjsKLQlwcml2YXRlIEFjdGlvbiBzaG93VW5jb25mRmVhdHVyZXNBY3Rpb247Ci0JcHJpdmF0ZSBSZXZlcnRDb25maWd1cmF0aW9uQWN0aW9uIHJldmVydEFjdGlvbjsKLQlwcml2YXRlIFNob3dBY3Rpdml0aWVzQWN0aW9uIHNob3dBY3Rpdml0aWVzQWN0aW9uOwotCXByaXZhdGUgQWN0aW9uIHByb3BlcnRpZXNBY3Rpb247Ci0JcHJpdmF0ZSBTaXRlU3RhdGVBY3Rpb24gc2l0ZVN0YXRlQWN0aW9uOwotCXByaXZhdGUgQWN0aW9uIGluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gbmV3RXh0ZW5zaW9uTG9jYXRpb25BY3Rpb247Ci0JcHJpdmF0ZSBGaW5kVXBkYXRlc0FjdGlvbiBmaW5kVXBkYXRlc0FjdGlvbjsKLQlwcml2YXRlIFNhc2hGb3JtIHNwbGl0dGVyOwotCXByaXZhdGUgQ29uZmlndXJhdGlvblByZXZpZXcgcHJldmlldzsKLQlwcml2YXRlIEhhc2h0YWJsZSBwcmV2aWV3VGFza3M7Ci0JCi0JcHJpdmF0ZSBJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIgbW9kZWxMaXN0ZW5lcjsKLQlwcml2YXRlIGJvb2xlYW4gcmVmcmVzaExvY2sgPSBmYWxzZTsKLQlwcml2YXRlIEltYWdlIGVjbGlwc2VJbWFnZTsKLQlwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7Ci0JcHJpdmF0ZSBDb25maWd1cmF0aW9uTWFuYWdlcldpbmRvdyBjb25maWd1cmF0aW9uV2luZG93OwotCi0JY2xhc3MgQ29uZmlndXJhdGlvblNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0JCXB1YmxpYyBpbnQgY2F0ZWdvcnkoT2JqZWN0IG9iaikgewotCQkJLy8gc2l0ZXMKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSB7Ci0JCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0KLQkJCQkJKChJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSBvYmopLmdldENvbmZpZ3VyZWRTaXRlKCk7Ci0JCQkJaWYgKGNzaXRlLmlzUHJvZHVjdFNpdGUoKSkKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJaWYgKGNzaXRlLmlzRXh0ZW5zaW9uU2l0ZSgpKQotCQkJCQlyZXR1cm4gMjsKLQkJCQlyZXR1cm4gMzsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5jYXRlZ29yeShvYmopOwotCQl9Ci0JfQotCi0JY2xhc3MgTG9jYWxTaXRlUHJvdmlkZXIKLQkJZXh0ZW5kcyBEZWZhdWx0Q29udGVudFByb3ZpZGVyCi0JCWltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoCi0JCQlWaWV3ZXIgdmlld2VyLAotCQkJT2JqZWN0IG9sZElucHV0LAotCQkJT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQlpZiAobmV3SW5wdXQgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFVwZGF0ZU1vZGVsKSB7Ci0JCQkJTG9jYWxTaXRlV29ya2JlbmNoQWRhcHRlciBsb2NhbFNpdGUgPSBnZXRVSVJlYWR5TG9jYWxTaXRlKGdldExvY2FsU2l0ZSgpKTsKLQkJCQlyZXR1cm4gKGxvY2FsU2l0ZSAhPSBudWxsKSA/IG5ldyBPYmplY3RbXSB7IGxvY2FsU2l0ZSB9Ci0JCQkJOiBuZXcgT2JqZWN0WzBdOwotCQkJfQotCi0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSUxvY2FsU2l0ZSkgewotCQkJCU9iamVjdFtdIGNzaXRlcyA9IG9wZW5Mb2NhbFNpdGUoKTsKLQkJCQlpZiAoc2hvd1NpdGVzQWN0aW9uLmlzQ2hlY2tlZCgpKQotCQkJCQlyZXR1cm4gY3NpdGVzOwotCQkJCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJYm9vbGVhbiBzaG93VW5jb25mID0gc2hvd1VuY29uZkZlYXR1cmVzQWN0aW9uLmlzQ2hlY2tlZCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3NpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlDb25maWd1cmVkU2l0ZUFkYXB0ZXIgYWRhcHRlciA9Ci0JCQkJCQkoSUNvbmZpZ3VyZWRTaXRlQWRhcHRlcikgY3NpdGVzW2ldOwotCQkJCQlPYmplY3RbXSByb290cyA9IGdldEZlYXR1cmVzKGFkYXB0ZXIsICFzaG93VW5jb25mKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCByb290cy5sZW5ndGg7IGorKykgewotCQkJCQkJcmVzdWx0LmFkZChyb290c1tqXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7Ci0JCQl9Ci0KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSB7Ci0JCQkJcmV0dXJuIGdldEZlYXR1cmVzKAotCQkJCQkoSUNvbmZpZ3VyZWRTaXRlQWRhcHRlcikgcGFyZW50LAotCQkJCQkhc2hvd1VuY29uZkZlYXR1cmVzQWN0aW9uLmlzQ2hlY2tlZCgpKTsKLQkJCX0KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIKLQkJCQkmJiBzaG93TmVzdGVkRmVhdHVyZXNBY3Rpb24uaXNDaGVja2VkKCkpIHsKLQkJCQlJRmVhdHVyZUFkYXB0ZXJbXSBuZXN0ZWQgPQotCQkJCQkoKENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgcGFyZW50KS5nZXRJbmNsdWRlZEZlYXR1cmVzKAotCQkJCQkJbnVsbCk7Ci0JCQkJaWYgKHNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbi5pc0NoZWNrZWQoKSkKLQkJCQkJcmV0dXJuIG5lc3RlZDsKLQkJCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmVzdGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICgoKENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgbmVzdGVkW2ldKS5pc0NvbmZpZ3VyZWQoKSkKLQkJCQkJCXJlc3VsdC5hZGQobmVzdGVkW2ldKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIChJRmVhdHVyZUFkYXB0ZXJbXSkgcmVzdWx0LnRvQXJyYXkoCi0JCQkJCW5ldyBJRmVhdHVyZUFkYXB0ZXJbcmVzdWx0LnNpemUoKV0pOwotCQkJfQotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgY2hpbGQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIHsKLQkJCQlpZiAoIXNob3dOZXN0ZWRGZWF0dXJlc0FjdGlvbi5pc0NoZWNrZWQoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCUlGZWF0dXJlQWRhcHRlcltdIGZlYXR1cmVzID0KLQkJCQkJKChDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIHBhcmVudCkuZ2V0SW5jbHVkZWRGZWF0dXJlcygKLQkJCQkJCW51bGwpOwotCi0JCQkJaWYgKHNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbi5pc0NoZWNrZWQoKSkKLQkJCQkJcmV0dXJuIGZlYXR1cmVzLmxlbmd0aCA+IDA7Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICgoKENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgZmVhdHVyZXNbaV0pCi0JCQkJCQkuaXNDb25maWd1cmVkKCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENvbmZpZ3VyZWRTaXRlQWRhcHRlcikgewotCQkJCUlDb25maWd1cmVkU2l0ZSBzaXRlID0KLQkJCQkJKChDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIHBhcmVudCkuZ2V0Q29uZmlndXJlZFNpdGUoKTsKLQkJCQlpZiAoc2l0ZS5pc0VuYWJsZWQoKSkgewotCQkJCQlpZiAoIXNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbi5pc0NoZWNrZWQoKSkKLQkJCQkJCXJldHVybiBzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aCA+IDA7Ci0JCQkJCXJldHVybiBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCkubGVuZ3RoID4gMDsKLQkJCQl9Ci0JCQkJcmV0dXJuIChzaG93VW5jb25mRmVhdHVyZXNBY3Rpb24uaXNDaGVja2VkKCkpOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXQpOwotCQl9Ci0JfQotCi0JY2xhc3MgTG9jYWxTaXRlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElMb2NhbFNpdGUpIHsKLQkJCQlJUHJvZHVjdCBwcm9kdWN0ID0gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpOwotCQkJCWlmIChwcm9kdWN0ICE9IG51bGwpCi0JCQkJCXJldHVybiBwcm9kdWN0LmdldE5hbWUoKTsKLQkJCQlyZXR1cm4gVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19jdXJyZW50OyAKLQkJCX0KLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIHsKLQkJCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPQotCQkJCQkoKElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIG9iaikuZ2V0Q29uZmlndXJlZFNpdGUoKTsKLQkJCQlJU2l0ZSBzaXRlID0gY3NpdGUuZ2V0U2l0ZSgpOwotCQkJCXJldHVybiBuZXcgRmlsZShzaXRlLmdldFVSTCgpLmdldEZpbGUoKSkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJRmVhdHVyZUFkYXB0ZXIpIHsKLQkJCQl0cnkgewotCQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gKChJRmVhdHVyZUFkYXB0ZXIpIG9iaikuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBNaXNzaW5nRmVhdHVyZSkgewotCQkJCQkJcmV0dXJuIE5MUy5iaW5kKFVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfbWlzc2luZ0ZlYXR1cmUsIGZlYXR1cmUuZ2V0TGFiZWwoKSk7Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIHZlcnNpb24gPSBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsKLQkJCQkJU3RyaW5nIHBlbmRpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoT3BlcmF0aW9uc01hbmFnZXIuZmluZFBlbmRpbmdPcGVyYXRpb24oZmVhdHVyZSkKLQkJCQkJCSE9IG51bGwpCi0JCQkJCQlwZW5kaW5nID0gVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19wZW5kaW5nOyAKLQkJCQkJcmV0dXJuIGZlYXR1cmUuZ2V0TGFiZWwoKSArICIgIiArIHZlcnNpb24gKyBwZW5kaW5nOyAvLyROT04tTkxTLTEkCi0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X2Vycm9yOyAKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmopOwotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLQkJCVVwZGF0ZUxhYmVsUHJvdmlkZXIgcHJvdmlkZXIgPQotCQkJCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUxvY2FsU2l0ZSkKLQkJCQlyZXR1cm4gZWNsaXBzZUltYWdlOwotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKQotCQkJCXJldHVybiBnZXRGZWF0dXJlSW1hZ2UoCi0JCQkJCXByb3ZpZGVyLAotCQkJCQkoQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKSBvYmopOwotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUNvbmZpZ3VyZWRTaXRlQWRhcHRlcikgewotCQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9Ci0JCQkJCSgoSUNvbmZpZ3VyZWRTaXRlQWRhcHRlcikgb2JqKS5nZXRDb25maWd1cmVkU2l0ZSgpOwotCQkJCWludCBmbGFncyA9Ci0JCQkJCWNzaXRlLmlzVXBkYXRhYmxlKCkgPyAwIDogVXBkYXRlTGFiZWxQcm92aWRlci5GX0xJTktFRDsKLQkJCQlpZiAoIWNzaXRlLmlzRW5hYmxlZCgpKQotCQkJCQlmbGFncyB8PSBVcGRhdGVMYWJlbFByb3ZpZGVyLkZfVU5DT05GSUdVUkVEOwotCQkJCXJldHVybiBwcm92aWRlci5nZXQoCi0JCQkJCXByb3ZpZGVyLmdldExvY2FsU2l0ZURlc2NyaXB0b3IoY3NpdGUpLAotCQkJCQlmbGFncyk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXByaXZhdGUgSW1hZ2UgZ2V0RmVhdHVyZUltYWdlKAotCQkJVXBkYXRlTGFiZWxQcm92aWRlciBwcm92aWRlciwKLQkJCUNvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlciBhZGFwdGVyKSB7Ci0JCQl0cnkgewotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBNaXNzaW5nRmVhdHVyZSkgewotCQkJCQlpZiAoKChNaXNzaW5nRmVhdHVyZSkgZmVhdHVyZSkuaXNPcHRpb25hbCgpKQotCQkJCQkJcmV0dXJuIHByb3ZpZGVyLmdldCgKLQkJCQkJCQlVcGRhdGVVSUltYWdlcy5ERVNDX05PVElOU1RfRkVBVFVSRV9PQkopOwotCQkJCQlyZXR1cm4gcHJvdmlkZXIuZ2V0KAotCQkJCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19GRUFUVVJFX09CSiwKLQkJCQkJCVVwZGF0ZUxhYmVsUHJvdmlkZXIuRl9FUlJPUik7Ci0JCQkJfQotCi0JCQkJYm9vbGVhbiBlZml4ID0gZmVhdHVyZS5pc1BhdGNoKCk7Ci0JCQkJSW1hZ2VEZXNjcmlwdG9yIGJhc2VEZXNjID0KLQkJCQkJZWZpeAotCQkJCQkJPyBVcGRhdGVVSUltYWdlcy5ERVNDX0VGSVhfT0JKCi0JCQkJCQk6IChhZGFwdGVyLmlzQ29uZmlndXJlZCgpCi0JCQkJCQkJPyBVcGRhdGVVSUltYWdlcy5ERVNDX0ZFQVRVUkVfT0JKCi0JCQkJCQkJOiBVcGRhdGVVSUltYWdlcy5ERVNDX1VOQ09ORl9GRUFUVVJFX09CSik7Ci0KLQkJCQlpbnQgZmxhZ3MgPSAwOwotCQkJCWlmIChlZml4ICYmICFhZGFwdGVyLmlzQ29uZmlndXJlZCgpKQotCQkJCQlmbGFncyB8PSBVcGRhdGVMYWJlbFByb3ZpZGVyLkZfVU5DT05GSUdVUkVEOwotCQkJCWlmIChPcGVyYXRpb25zTWFuYWdlci5maW5kUGVuZGluZ09wZXJhdGlvbihmZWF0dXJlKSA9PSBudWxsKSB7Ci0JCQkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gZ2V0TG9jYWxTaXRlKCk7Ci0JCQkJCWlmIChsb2NhbFNpdGUgIT0gbnVsbCkgewotCQkJCQkJaW50IGNvZGUgPQotCQkJCQkJCWdldFN0YXR1c0NvZGUoCi0JCQkJCQkJCWZlYXR1cmUsCi0JCQkJCQkJCWxvY2FsU2l0ZS5nZXRGZWF0dXJlU3RhdHVzKGZlYXR1cmUpKTsKLQkJCQkJCXN3aXRjaCAoY29kZSkgewotCQkJCQkJCWNhc2UgSUZlYXR1cmUuU1RBVFVTX1VOSEFQUFkgOgotCQkJCQkJCQlmbGFncyB8PSBVcGRhdGVMYWJlbFByb3ZpZGVyLkZfRVJST1I7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWNhc2UgSUZlYXR1cmUuU1RBVFVTX0FNQklHVU9VUyA6Ci0JCQkJCQkJCWZsYWdzIHw9IFVwZGF0ZUxhYmVsUHJvdmlkZXIuRl9XQVJOSU5HOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJaWYgKGFkYXB0ZXIuaXNDb25maWd1cmVkKCkKLQkJCQkJCQkJCSYmIGFkYXB0ZXIuaXNVcGRhdGVkKCkpCi0JCQkJCQkJCQlmbGFncyB8PSBVcGRhdGVMYWJlbFByb3ZpZGVyLkZfVVBEQVRFRDsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHByb3ZpZGVyLmdldChiYXNlRGVzYywgZmxhZ3MpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyLmdldCgKLQkJCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19GRUFUVVJFX09CSiwKLQkJCQkJVXBkYXRlTGFiZWxQcm92aWRlci5GX0VSUk9SKTsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIFByZXZpZXdUYXNrIGltcGxlbWVudHMgSVByZXZpZXdUYXNrIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBTdHJpbmcgZGVzYzsKLQkJcHJpdmF0ZSBJQWN0aW9uIGFjdGlvbjsKLQkJcHVibGljIFByZXZpZXdUYXNrKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzYywgSUFjdGlvbiBhY3Rpb24pIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmRlc2MgPSBkZXNjOwotCQkJdGhpcy5hY3Rpb24gPSBhY3Rpb247Ci0JCX0KLQkJcHVibGljIElBY3Rpb24gZ2V0QWN0aW9uKCkgewotCQkJcmV0dXJuIGFjdGlvbjsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlpZiAobmFtZSAhPSBudWxsKQotCQkJCXJldHVybiBuYW1lOwotCQkJcmV0dXJuIGFjdGlvbi5nZXRUZXh0KCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJCXJldHVybiBkZXNjOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjKSB7Ci0JCQl0aGlzLmRlc2MgPSBkZXNjOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWFjdGlvbi5ydW4oKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQlyZXR1cm4gYWN0aW9uLmlzRW5hYmxlZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIENvbmZpZ3VyYXRpb25WaWV3KENvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93IHdpbmRvdykgewotCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmNvbm5lY3QodGhpcyk7Ci0JCWNvbmZpZ3VyYXRpb25XaW5kb3c9d2luZG93OwotCQlpbml0aWFsaXplSW1hZ2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVJbWFnZXMoKSB7Ci0JCUlQcm9kdWN0IHByb2R1Y3QgPSBQbGF0Zm9ybS5nZXRQcm9kdWN0KCk7Ci0JCWlmIChwcm9kdWN0ICE9IG51bGwpIHsKLQkJCWVjbGlwc2VJbWFnZSA9IGdldFByb2R1Y3RJbWFnZTE2KHByb2R1Y3QpOwotCQl9Ci0JCWlmIChlY2xpcHNlSW1hZ2U9PW51bGwpIHsKLQkJCUltYWdlRGVzY3JpcHRvciBlZGVzYyA9IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfQVBQX09CSjsKLQkJCWVjbGlwc2VJbWFnZSA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0KGVkZXNjKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIEltYWdlIGdldFByb2R1Y3RJbWFnZTE2KElQcm9kdWN0IHByb2R1Y3QpIHsKLQkJLy8gTG9vcCB0aHJvdWdoIHRoZSBwcm9kdWN0IHdpbmRvdyBpbWFnZXMgYW5kCi0JCS8vIHBpY2sgdGhlIGZpcnN0IHdob3NlIHNpemUgaXMgMTZ4MTYgYW5kIGRvZXMgbm90Ci0JCS8vIGFscGhhIHRyYW5zcGFyZW5jeSB0eXBlLgotCQlTdHJpbmcgd2luZG93SW1hZ2VzVXJscyA9IHByb2R1Y3QuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuV0lORE9XX0lNQUdFUyk7Ci0JCUltYWdlIHBuZz1udWxsLCBnaWY9bnVsbCwgb3RoZXIgPSBudWxsOwotCQlpZiAod2luZG93SW1hZ2VzVXJscyAhPSBudWxsICkgewotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih3aW5kb3dJbWFnZXNVcmxzLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIHdpbmRvd0ltYWdlVVJMID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJSW1hZ2VEZXNjcmlwdG9yIGVkZXNjPW51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJZWRlc2MgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChuZXcgVVJMKHdpbmRvd0ltYWdlVVJMKSk7Ci0JCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gbXVzdCBiZSBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIHByb2R1Y3QgYnVuZGxlCi0JCQkJCUJ1bmRsZSBwcm9kdWN0QnVuZGxlID0gcHJvZHVjdC5nZXREZWZpbmluZ0J1bmRsZSgpOwotCQkJCQlpZiAocHJvZHVjdEJ1bmRsZSAhPSBudWxsKSB7IAotCQkJCQkJVVJMIHVybCA9IEZpbGVMb2NhdG9yLmZpbmQocHJvZHVjdEJ1bmRsZSwgbmV3IFBhdGgod2luZG93SW1hZ2VVUkwpLCBudWxsKTsKLQkJCQkJCWlmICh1cmwgIT0gbnVsbCkKLQkJCQkJCQllZGVzYyA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGVkZXNjIT1udWxsKSB7Ci0JCQkJCUltYWdlIGltYWdlID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5nZXQoZWRlc2MpOwotCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gaW1hZ2UuZ2V0Qm91bmRzKCk7Ci0JCQkJCWlmIChib3VuZHMud2lkdGg9PTE2ICYmIGJvdW5kcy5oZWlnaHQ9PTE2KSB7Ci0JCQkJCQkvLyBhdm9pZCBpbWFnZXMgd2l0aCBUUkFOU1BBUkVOQ1lfQUxQSEEKLQkJCQkJCS8vaWYgKGltYWdlLmdldEltYWdlRGF0YSgpLmdldFRyYW5zcGFyZW5jeVR5cGUoKSE9U1dULlRSQU5TUEFSRU5DWV9BTFBIQSkKLQkJCQkJCS8vCXJldHVybiBpbWFnZTsKLQkJCQkJCS8vSW5zdGVhZCBvZiByZXR1cm5pbmcsIGp1c3Qgc3RvcmUgdGhlIGltYWdlIGJhc2VkIG9uIHRoZQotCQkJCQkJLy8gZXh0ZW5zaW9uLgotCQkJCQkJaWYgKHdpbmRvd0ltYWdlVVJMLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5naWYiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWdpZiA9IGltYWdlOwotCQkJCQkJZWxzZSBpZiAod2luZG93SW1hZ2VVUkwudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnBuZyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJcG5nID0gaW1hZ2U7Ci0JCQkJCQllbHNlCi0JCQkJCQkJb3RoZXIgPSBpbWFnZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlJbWFnZSBjaG9pY2UgPSBudWxsOwotCQkvLyBQaWNrIHBuZyBmaXJzdCBiZWNhdXNlIG9mIHRyYW5zcGFyZW5jeQotCQlpZiAocG5nIT1udWxsKSB7Ci0JCQljaG9pY2UgPSBwbmc7Ci0JCX0KLQkJLy8gUGljayBvdGhlciBmb3JtYXQKLQkJZWxzZSBpZiAob3RoZXIhPW51bGwpCi0JCQljaG9pY2UgPSBvdGhlcjsKLQkJLy8gUGljayBnaWYKLQkJZWxzZSBpZiAoZ2lmIT1udWxsKQotCQkJY2hvaWNlID0gZ2lmOwotCQlyZXR1cm4gY2hvaWNlOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRQcm92aWRlcnMoKSB7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBMb2NhbFNpdGVQcm92aWRlcigpKTsKLQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMb2NhbFNpdGVMYWJlbFByb3ZpZGVyKCkpOwotCQl0cmVlVmlld2VyLnNldElucHV0KFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpKTsKLQkJdHJlZVZpZXdlci5zZXRTb3J0ZXIobmV3IENvbmZpZ3VyYXRpb25Tb3J0ZXIoKSk7Ci0JCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gZ2V0TG9jYWxTaXRlKCk7Ci0JCWlmIChsb2NhbFNpdGUgIT0gbnVsbCkKLQkJCWxvY2FsU2l0ZS5hZGRMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0KLQkJbW9kZWxMaXN0ZW5lciA9IG5ldyBJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBvYmplY3RzQWRkZWQoT2JqZWN0IHBhcmVudCwgT2JqZWN0W10gY2hpbGRyZW4pIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIG9iamVjdHNSZW1vdmVkKE9iamVjdCBwYXJlbnQsIE9iamVjdFtdIGNoaWxkcmVuKSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBvYmplY3RDaGFuZ2VkKGZpbmFsIE9iamVjdCBvYmosIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCWlmIChyZWZyZXNoTG9jaykKLQkJCQkJcmV0dXJuOwotCQkJCUNvbnRyb2wgY29udHJvbCA9IGdldENvbnRyb2woKTsKLQkJCQlpZiAoIWNvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWNvbnRyb2wuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCQkJaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZCgKLQkJCQkJCQkJKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0cmVlVmlld2VyCi0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCU9wZXJhdGlvbnNNYW5hZ2VyLmFkZFVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKG1vZGVsTGlzdGVuZXIpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKAotCQkJZ2V0Q29udHJvbCgpLAotCQkJIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5Db25maWd1cmF0aW9uVmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBJTG9jYWxTaXRlIGdldExvY2FsU2l0ZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gb3BlbkxvY2FsU2l0ZSgpIHsKLQkJZmluYWwgT2JqZWN0W11bXSBiYWcgPSBuZXcgT2JqZWN0WzFdW107Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldENvbnRyb2woKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IGdldExvY2FsU2l0ZSgpOwotCQkJCWlmIChsb2NhbFNpdGUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPQotCQkJCQlnZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQkJCUlDb25maWd1cmVkU2l0ZVtdIHNpdGVzID0gY29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQkJCU9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3Rbc2l0ZXMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXJlc3VsdFtpXSA9IG5ldyBDb25maWd1cmVkU2l0ZUFkYXB0ZXIoY29uZmlnLCBzaXRlc1tpXSk7Ci0JCQkJfQotCQkJCWlmICghaW5pdGlhbGl6ZWQpIHsKLQkJCQkJY29uZmlnLmFkZEluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJCQkJQ29uZmlndXJhdGlvblZpZXcudGhpcyk7Ci0JCQkJCWluaXRpYWxpemVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJYmFnWzBdID0gcmVzdWx0OwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGJhZ1swXTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmRpc2Nvbm5lY3QodGhpcyk7Ci0JCWlmIChpbml0aWFsaXplZCkgewotCQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBnZXRMb2NhbFNpdGUoKTsKLQkJCWlmIChsb2NhbFNpdGUgIT0gbnVsbCkgewotCQkJCWxvY2FsU2l0ZS5yZW1vdmVMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyA9Ci0JCQkJCWxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQkJCWNvbmZpZy5yZW1vdmVJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJCWluaXRpYWxpemVkID0gZmFsc2U7Ci0JCX0KLQkJT3BlcmF0aW9uc01hbmFnZXIucmVtb3ZlVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIobW9kZWxMaXN0ZW5lcik7Ci0JCWlmIChwcmV2aWV3ICE9IG51bGwpCi0JCQlwcmV2aWV3LmRpc3Bvc2UoKTsKLQkJLy9zdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbWFrZUFjdGlvbnMoKSB7Ci0JCWNvbGxhcHNlQWxsQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRSZWRyYXcoZmFsc2UpOwotCQkJCXRyZWVWaWV3ZXIuY29sbGFwc2VUb0xldmVsKAotCQkJCQl0cmVlVmlld2VyLmdldElucHV0KCksCi0JCQkJCVRyZWVWaWV3ZXIuQUxMX0xFVkVMUyk7Ci0JCQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KHRydWUpOwotCQkJfQotCQl9OwotCQljb2xsYXBzZUFsbEFjdGlvbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfY29sbGFwc2VMYWJlbCk7IAotCQljb2xsYXBzZUFsbEFjdGlvbi5zZXRUb29sVGlwVGV4dChVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X2NvbGxhcHNlVG9vbHRpcCk7IAotCQljb2xsYXBzZUFsbEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoVXBkYXRlVUlJbWFnZXMuREVTQ19DT0xMQVBTRV9BTEwpOwotCi0JCWRyaWxsRG93bkFkYXB0ZXIgPSBuZXcgRHJpbGxEb3duQWRhcHRlcih0cmVlVmlld2VyKTsKLQotCQlmZWF0dXJlU3RhdGVBY3Rpb24gPSBuZXcgRmVhdHVyZVN0YXRlQWN0aW9uKHRoaXMuZ2V0Q29uZmlndXJhdGlvbldpbmRvdygpLmdldFNoZWxsKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQlmZWF0dXJlc1N0YXRlQWN0aW9uID0gbmV3IEZlYXR1cmVzU3RhdGVBY3Rpb24odGhpcy5nZXRDb25maWd1cmF0aW9uV2luZG93KCkuZ2V0U2hlbGwoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJc2l0ZVN0YXRlQWN0aW9uID0gbmV3IFNpdGVTdGF0ZUFjdGlvbihnZXRDb25maWd1cmF0aW9uV2luZG93KCkuZ2V0U2hlbGwoKSk7Ci0KLQkJcmV2ZXJ0QWN0aW9uID0gbmV3IFJldmVydENvbmZpZ3VyYXRpb25BY3Rpb24oZ2V0Q29uZmlndXJhdGlvbldpbmRvdygpLmdldFNoZWxsKCksVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19yZXZlcnRMYWJlbCk7IAotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKAotCQkJcmV2ZXJ0QWN0aW9uLAotCQkJIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5Db2ZpZ3VyYXRpb25WaWV3X3JldmVydEFjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbiA9Ci0JCQluZXcgSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbihnZXRDb25maWd1cmF0aW9uV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X2luc3RhbGxIaXN0b3J5LCAKLQkJCQlVcGRhdGVVSUltYWdlcy5ERVNDX0hJU1RPUllfT0JKKTsKLQkJaW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbi5zZXRUb29sVGlwVGV4dChpbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uLmdldFRleHQoKSk7Ci0JCQotCQluZXdFeHRlbnNpb25Mb2NhdGlvbkFjdGlvbiA9Ci0JCQluZXcgTmV3RXh0ZW5zaW9uTG9jYXRpb25BY3Rpb24oZ2V0Q29uZmlndXJhdGlvbldpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19leHRMb2NhdGlvbiwgCi0JCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19FU0lURV9PQkopOwotCQkKLQkJcHJvcGVydGllc0FjdGlvbiA9Ci0JCQluZXcgUHJvcGVydHlEaWFsb2dBY3Rpb24oCi0JCQkJZ2V0Q29uZmlndXJhdGlvbldpbmRvdygpLAotCQkJCXRyZWVWaWV3ZXIpOwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKAotCQkJcHJvcGVydGllc0FjdGlvbiwKLQkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuQ29maWd1cmF0aW9uVmlld19wcm9wZXJ0aWVzQWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCQl1bmluc3RhbGxGZWF0dXJlQWN0aW9uID0gbmV3IFVuaW5zdGFsbEZlYXR1cmVBY3Rpb24oZ2V0Q29uZmlndXJhdGlvbldpbmRvdygpLmdldFNoZWxsKCksIFVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfdW5pbnN0YWxsKTsgCi0JCXVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZUFjdGlvbiA9IG5ldyBVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVBY3Rpb24oZ2V0Q29uZmlndXJhdGlvbldpbmRvdygpLmdldFNoZWxsKCksIFVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfdW5pbnN0YWxsKTsgCi0JCQotCQl1bmluc3RhbGxGZWF0dXJlc0FjdGlvbiA9IG5ldyBVbmluc3RhbGxGZWF0dXJlc0FjdGlvbihnZXRDb25maWd1cmF0aW9uV2luZG93KCkuZ2V0U2hlbGwoKSwgVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld191bmluc3RhbGwpOyAKLQkJdW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlc0FjdGlvbiA9IG5ldyBVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVzQWN0aW9uKGdldENvbmZpZ3VyYXRpb25XaW5kb3coKS5nZXRTaGVsbCgpLCBVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X3VuY29uZmlndXJlQW5kVW5pbnN0YWxsKTsgCi0KLQkJCi0JCWluc3RhbGxPcHRGZWF0dXJlQWN0aW9uID0KLQkJCW5ldyBJbnN0YWxsT3B0aW9uYWxGZWF0dXJlQWN0aW9uKAotCQkJCWdldENvbnRyb2woKS5nZXRTaGVsbCgpLAotCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfaW5zdGFsbCk7IAotCi0JCXN3YXBWZXJzaW9uQWN0aW9uID0gbmV3IFJlcGxhY2VWZXJzaW9uQWN0aW9uKGdldENvbmZpZ3VyYXRpb25XaW5kb3coKS5nZXRTaGVsbCgpLCBVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X2Fub3RoZXJWZXJzaW9uKTsgCi0KLQkJZmluZFVwZGF0ZXNBY3Rpb24gPQotCQkJbmV3IEZpbmRVcGRhdGVzQWN0aW9uKGNvbmZpZ3VyYXRpb25XaW5kb3csIFVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfZmluZFVwZGF0ZXMpOyAKLQotCQlzaG93QWN0aXZpdGllc0FjdGlvbiA9IG5ldyBTaG93QWN0aXZpdGllc0FjdGlvbihnZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwgVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19zaG93QWN0aXZpdGllc0xhYmVsKTsgCi0gICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoCi0JCQlzaG93QWN0aXZpdGllc0FjdGlvbiwKLQkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuQ29uZmlndXJhdGlvblZpZXdfc2hvd0FjdGl2aXRpZXNBY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1ha2VTaG93VW5jb25maWd1cmVkRmVhdHVyZXNBY3Rpb24oKTsKLQkJbWFrZVNob3dTaXRlc0FjdGlvbigpOwotCQltYWtlU2hvd05lc3RlZEZlYXR1cmVzQWN0aW9uKCk7Ci0JCW1ha2VQcmV2aWV3VGFza3MoKTsKLQkJY29uZmlndXJhdGlvbldpbmRvdy5zZXRQcm9wZXJ0aWVzQWN0aW9uSGFuZGxlcihwcm9wZXJ0aWVzQWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWFrZVNob3dOZXN0ZWRGZWF0dXJlc0FjdGlvbigpIHsKLQkJZmluYWwgUHJlZmVyZW5jZXMgcHJlZiA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlwcmVmLnNldERlZmF1bHQoU1RBVEVfU0hPV19ORVNURURfRkVBVFVSRVMsIHRydWUpOwotCQlzaG93TmVzdGVkRmVhdHVyZXNBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCXByZWYuc2V0VmFsdWUoCi0JCQkJCVNUQVRFX1NIT1dfTkVTVEVEX0ZFQVRVUkVTLAotCQkJCQlzaG93TmVzdGVkRmVhdHVyZXNBY3Rpb24uaXNDaGVja2VkKCkpOwotCQkJfQotCQl9OwotCQlzaG93TmVzdGVkRmVhdHVyZXNBY3Rpb24uc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X3Nob3dOZXN0ZWRGZWF0dXJlcyk7IAotCQlzaG93TmVzdGVkRmVhdHVyZXNBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19TSE9XX0hJRVJBUkNIWSk7Ci0JCXNob3dOZXN0ZWRGZWF0dXJlc0FjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcigKLQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfU0hPV19ISUVSQVJDSFlfRCk7Ci0KLQkJc2hvd05lc3RlZEZlYXR1cmVzQWN0aW9uLnNldENoZWNrZWQoCi0JCQlwcmVmLmdldEJvb2xlYW4oU1RBVEVfU0hPV19ORVNURURfRkVBVFVSRVMpKTsKLQkJc2hvd05lc3RlZEZlYXR1cmVzQWN0aW9uLnNldFRvb2xUaXBUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfc2hvd05lc3RlZFRvb2x0aXApOyAKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWFrZVNob3dTaXRlc0FjdGlvbigpIHsKLQkJZmluYWwgUHJlZmVyZW5jZXMgcHJlZiA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlwcmVmLnNldERlZmF1bHQoU1RBVEVfU0hPV19TSVRFUywgdHJ1ZSk7Ci0JCXNob3dTaXRlc0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJcHJlZi5zZXRWYWx1ZShTVEFURV9TSE9XX1NJVEVTLCBzaG93U2l0ZXNBY3Rpb24uaXNDaGVja2VkKCkpOwotCQkJCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCX0KLQkJfTsKLQkJc2hvd1NpdGVzQWN0aW9uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19zaG93SW5zdGFsbCk7IAotCQlzaG93U2l0ZXNBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFVwZGF0ZVVJSW1hZ2VzLkRFU0NfTFNJVEVfT0JKKTsKLQkJc2hvd1NpdGVzQWN0aW9uLnNldENoZWNrZWQocHJlZi5nZXRCb29sZWFuKFNUQVRFX1NIT1dfU0lURVMpKTsKLQkJc2hvd1NpdGVzQWN0aW9uLnNldFRvb2xUaXBUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfc2hvd0luc3RhbGxUb29sdGlwKTsgCi0JfQotCi0JcHJpdmF0ZSB2b2lkIG1ha2VTaG93VW5jb25maWd1cmVkRmVhdHVyZXNBY3Rpb24oKSB7Ci0JCWZpbmFsIFByZWZlcmVuY2VzIHByZWYgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcHJlZi5zZXREZWZhdWx0KFNUQVRFX1NIT1dfVU5DT05GLCBmYWxzZSk7Ci0JCXNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcHJlZi5zZXRWYWx1ZSgKLQkJCQkJU1RBVEVfU0hPV19VTkNPTkYsCi0JCQkJCXNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbi5pc0NoZWNrZWQoKSk7Ci0JCQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9OwotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKAotCQkJc2hvd1VuY29uZkZlYXR1cmVzQWN0aW9uLAotCQkJIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5Db2ZpZ3VyYXRpb25WaWV3X3Nob3dVbmNvbmZGZWF0dXJlc0FjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCXNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfc2hvd0Rpc2FibGVkKTsgCi0JCXNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoCi0JCQlVcGRhdGVVSUltYWdlcy5ERVNDX1VOQ09ORl9GRUFUVVJFX09CSik7Ci0JCXNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbi5zZXRDaGVja2VkKHByZWYuZ2V0Qm9vbGVhbihTVEFURV9TSE9XX1VOQ09ORikpOwotCQlzaG93VW5jb25mRmVhdHVyZXNBY3Rpb24uc2V0VG9vbFRpcFRleHQoVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19zaG93RGlzYWJsZWRUb29sdGlwKTsgCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlsbEFjdGlvbkJhcnMoVG9vbEJhck1hbmFnZXIgdGJtKSB7Ci0JCXRibS5hZGQoc2hvd1NpdGVzQWN0aW9uKTsKLQkJdGJtLmFkZChzaG93TmVzdGVkRmVhdHVyZXNBY3Rpb24pOwotCQl0Ym0uYWRkKHNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbik7Ci0JCXRibS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJZHJpbGxEb3duQWRhcHRlci5hZGROYXZpZ2F0aW9uQWN0aW9ucyh0Ym0pOwotCQl0Ym0uYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCXRibS5hZGQoY29sbGFwc2VBbGxBY3Rpb24pOwotCQl0Ym0uYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCXRibS5hZGQoaW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRTZWxlY3RlZE9iamVjdCgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24KLQkJCSYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkKLQkJCWlmIChzc2VsLnNpemUoKSA9PSAxKQotCQkJCXJldHVybiBzc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJZWxzZQotCQkJCXJldHVybiBzc2VsLnRvQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJT2JqZWN0IG9iaiA9IGdldFNlbGVjdGVkT2JqZWN0KCk7Ci0JCWJvb2xlYW4gYXJlTXVsdGlwbGVGZWF0dXJlc1NlbGVjdGVkID0gdHJ1ZTsKLQkJCi0JCWlmICggb2JqIGluc3RhbmNlb2YgT2JqZWN0W10pIHsKLQkJCU9iamVjdFtdIGFycmF5ID0gKE9iamVjdFtdKW9iajsKLQkJCWZvciggaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoIShhcnJheVtpXSBpbnN0YW5jZW9mIENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikpIHsKLQkJCQkJYXJlTXVsdGlwbGVGZWF0dXJlc1NlbGVjdGVkID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJYXJlTXVsdGlwbGVGZWF0dXJlc1NlbGVjdGVkID0gZmFsc2U7Ci0JCX0KLQotCQlpZiAob2JqIGluc3RhbmNlb2YgSUxvY2FsU2l0ZSkgewotCQkJbWFuYWdlci5hZGQoZmluZFVwZGF0ZXNBY3Rpb24pOwotCQkJbWFuYWdlci5hZGQocmV2ZXJ0QWN0aW9uKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSB7Ci0JCQltYW5hZ2VyLmFkZChzaXRlU3RhdGVBY3Rpb24pOwotCQl9Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElMb2NhbFNpdGUKLQkJCXx8IG9iaiBpbnN0YW5jZW9mIElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIHsKLQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQlNZW51TWFuYWdlciBtZ3IgPSBuZXcgTWVudU1hbmFnZXIoVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19uZXcpOyAKLQkJCW1nci5hZGQobmV3RXh0ZW5zaW9uTG9jYXRpb25BY3Rpb24pOwotCQkJbWFuYWdlci5hZGQobWdyKTsKLQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCX0gZWxzZSBpZiAoIChvYmogaW5zdGFuY2VvZiBDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpICYmICFhcmVNdWx0aXBsZUZlYXR1cmVzU2VsZWN0ZWQpewotCQkJdHJ5IHsKLQkJCQkKLQkJCQlNZW51TWFuYWdlciBtZ3IgPSBuZXcgTWVudU1hbmFnZXIoVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19yZXBsYWNlV2l0aCk7IAotCQkJCQotCQkJCW1hbmFnZXIuYWRkKGZpbmRVcGRhdGVzQWN0aW9uKTsKLQkJCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQkJCQotCQkJCW1nci5hZGQoc3dhcFZlcnNpb25BY3Rpb24pOwotCQkJCW1hbmFnZXIuYWRkKG1ncik7Ci0KLQkJCQltYW5hZ2VyLmFkZChmZWF0dXJlU3RhdGVBY3Rpb24pOwotCQkJCQotCi0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9Ci0JCQkJCSgoQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKSBvYmopLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBNaXNzaW5nRmVhdHVyZSkgewotCQkJCQltYW5hZ2VyLmFkZChpbnN0YWxsT3B0RmVhdHVyZUFjdGlvbik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYm9vbGVhbiBjb25maWd1cmVkID0gKChDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpb2JqKS5pc0NvbmZpZ3VyZWQoKTsKLQkJCQkJaWYgKCFjb25maWd1cmVkKQotCQkJCQkJbWFuYWdlci5hZGQodW5pbnN0YWxsRmVhdHVyZUFjdGlvbik7Ci0JCQkJCWVsc2UKLQkJCQkJCW1hbmFnZXIuYWRkKHVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZUFjdGlvbik7Ci0JCQkJfQotCQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJfQotCQl9IGVsc2UgaWYgKGFyZU11bHRpcGxlRmVhdHVyZXNTZWxlY3RlZCkgewotCi0JCQkJbWFuYWdlci5hZGQoZmluZFVwZGF0ZXNBY3Rpb24pOwotCQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0KLQkJCQltYW5hZ2VyLmFkZChmZWF0dXJlc1N0YXRlQWN0aW9uKTsKLQkJCQkKLQkJCQltYW5hZ2VyLmFkZCh1bmluc3RhbGxGZWF0dXJlc0FjdGlvbik7Ci0JCQkJbWFuYWdlci5hZGQodW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlc0FjdGlvbik7Ci0JCQkJCi0JCQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQotCQl9Ci0KLQkJZHJpbGxEb3duQWRhcHRlci5hZGROYXZpZ2F0aW9uQWN0aW9ucyhtYW5hZ2VyKTsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgSUxvY2FsU2l0ZSkgewotCQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCW1hbmFnZXIuYWRkKGluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24pOwotCQl9Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElGZWF0dXJlQWRhcHRlcgotCQkJfHwgb2JqIGluc3RhbmNlb2YgSUxvY2FsU2l0ZQotCQkJfHwgb2JqIGluc3RhbmNlb2YgSUNvbmZpZ3VyZWRTaXRlQWRhcHRlcikgewotCQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCW1hbmFnZXIuYWRkKHByb3BlcnRpZXNBY3Rpb24pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zdGFsbFNpdGVBZGRlZChJQ29uZmlndXJlZFNpdGUgY3NpdGUpIHsKLQkJYXN5bmNSZWZyZXNoKCk7Ci0JfQotCXB1YmxpYyB2b2lkIGluc3RhbGxTaXRlUmVtb3ZlZChJQ29uZmlndXJlZFNpdGUgc2l0ZSkgewotCQlhc3luY1JlZnJlc2goKTsKLQl9Ci0JcHVibGljIHZvaWQgZmVhdHVyZUluc3RhbGxlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWFzeW5jUmVmcmVzaCgpOwotCX0KLQlwdWJsaWMgdm9pZCBmZWF0dXJlUmVtb3ZlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWFzeW5jUmVmcmVzaCgpOwotCX0KLQlwdWJsaWMgdm9pZCBmZWF0dXJlQ29uZmlndXJlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgZmVhdHVyZVVuY29uZmlndXJlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgY3VycmVudEluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZChJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQlhc3luY1JlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnN0YWxsQ29uZmlndXJhdGlvblJlbW92ZWQoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJYXN5bmNSZWZyZXNoKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFzeW5jUmVmcmVzaCgpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gU1dUVXRpbC5nZXRTdGFuZGFyZERpc3BsYXkoKTsKLQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0JCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoIWdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGdldEZlYXR1cmVzKAotCQlmaW5hbCBJQ29uZmlndXJlZFNpdGVBZGFwdGVyIHNpdGVBZGFwdGVyLAotCQlmaW5hbCBib29sZWFuIGNvbmZpZ3VyZWRPbmx5KSB7Ci0JCWZpbmFsIElDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IHNpdGVBZGFwdGVyLmdldENvbmZpZ3VyZWRTaXRlKCk7Ci0JCWZpbmFsIE9iamVjdFtdW10gYmFnID0gbmV3IE9iamVjdFsxXVtdOwotCQlyZWZyZXNoTG9jayA9IHRydWU7Ci0KLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmczsKLQotCQkJCWlmIChjb25maWd1cmVkT25seSkKLQkJCQkJcmVmcyA9IGNzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQkJCWVsc2UgewotCQkJCQlJU2l0ZSBzaXRlID0gY3NpdGUuZ2V0U2l0ZSgpOwotCQkJCQlyZWZzID0gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJCX0KLQkJCQltb25pdG9yLmJlZ2luVGFzaygKLQkJCQkJVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19sb2FkaW5nLCAKLQkJCQkJcmVmcy5sZW5ndGgpOwotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHJlZnNbaV07Ci0JCQkJCUlGZWF0dXJlIGZlYXR1cmU7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltb25pdG9yLnN1YlRhc2socmVmLmdldFVSTCgpLnRvU3RyaW5nKCkpOwotCQkJCQkJZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWZlYXR1cmUgPQotCQkJCQkJCW5ldyBNaXNzaW5nRmVhdHVyZShyZWYuZ2V0U2l0ZSgpLCByZWYuZ2V0VVJMKCkpOwotCQkJCQl9Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQlyZXN1bHQuYWRkKAotCQkJCQkJbmV3IENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcigKLQkJCQkJCQlzaXRlQWRhcHRlciwKLQkJCQkJCQlmZWF0dXJlLAotCQkJCQkJCWNzaXRlLmlzQ29uZmlndXJlZChmZWF0dXJlKSwKLQkJCQkJCQlmYWxzZSwKLQkJCQkJCQlmYWxzZSkpOwotCQkJCX0KLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQliYWdbMF0gPSBnZXRSb290RmVhdHVyZXMocmVzdWx0KTsKLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJaWYgKGNvbmZpZ3VyYXRpb25XaW5kb3cuZ2V0U2hlbGwoKS5pc1Zpc2libGUoKSkKLQkJCQljb25maWd1cmF0aW9uV2luZG93LnJ1bih0cnVlLCBmYWxzZSwgb3ApOwotCQkJZWxzZQotCQkJCW9wLnJ1bihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlZnJlc2hMb2NrID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGJhZ1swXTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGdldFJvb3RGZWF0dXJlcyhBcnJheUxpc3QgbGlzdCkgewotCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIgY2YgPQotCQkJCQkoQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKSBsaXN0LmdldChpKTsKLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gY2YuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQlpZiAoZmVhdHVyZSAhPSBudWxsKQotCQkJCQlhZGRDaGlsZEZlYXR1cmVzKAotCQkJCQkJZmVhdHVyZSwKLQkJCQkJCWNoaWxkcmVuLAotCQkJCQkJY2YuaXNDb25maWd1cmVkKCkpOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyIGNmID0KLQkJCQkJKENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgbGlzdC5nZXQoaSk7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGNmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJaWYgKGZlYXR1cmUgIT0gbnVsbAotCQkJCQkmJiBpc0NoaWxkRmVhdHVyZShmZWF0dXJlLCBjaGlsZHJlbikgPT0gZmFsc2UpCi0JCQkJCXJlc3VsdC5hZGQoY2YpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQ2hpbGRGZWF0dXJlcygKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJQXJyYXlMaXN0IGNoaWxkcmVuLAotCQlib29sZWFuIGNvbmZpZ3VyZWQpIHsKLQkJdHJ5IHsKLQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBpbmNsdWRlZCA9Ci0JCQkJZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluY2x1ZGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUZlYXR1cmUgY2hpbGRGZWF0dXJlOwotCQkJCXRyeSB7Ci0JCQkJCWNoaWxkRmVhdHVyZSA9Ci0JCQkJCQlpbmNsdWRlZFtpXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQljaGlsZEZlYXR1cmUgPSBuZXcgTWlzc2luZ0ZlYXR1cmUoaW5jbHVkZWRbaV0pOwotCQkJCX0KLQkJCQljaGlsZHJlbi5hZGQoY2hpbGRGZWF0dXJlKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNDaGlsZEZlYXR1cmUoSUZlYXR1cmUgZmVhdHVyZSwgQXJyYXlMaXN0IGNoaWxkcmVuKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCUlGZWF0dXJlIGNoaWxkID0gKElGZWF0dXJlKSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQlpZiAoZmVhdHVyZQotCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkuZXF1YWxzKGNoaWxkLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZSkgewotCQlpZiAoZS5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBlLmdldFNlbGVjdGlvbigpOwotCQkJCi0JCQlPYmplY3Qgb2JqID0gc3NlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChvYmohPW51bGwpCi0JCQkJcHJvcGVydGllc0FjdGlvbi5ydW4oKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3BsaXR0ZXIgPSBuZXcgU2FzaEZvcm0ocGFyZW50LCBTV1QuSE9SSVpPTlRBTCk7Ci0JCXNwbGl0dGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlDb21wb3NpdGUgbGVmdENvbnRhaW5lciA9IGNyZWF0ZUxpbmVDb250YWluZXIoc3BsaXR0ZXIpOwotCQlDb21wb3NpdGUgcmlnaHRDb250YWluZXIgPSBjcmVhdGVMaW5lQ29udGFpbmVyKHNwbGl0dGVyKTsKLQkJY3JlYXRlVHJlZVZpZXdlcihsZWZ0Q29udGFpbmVyKTsKLQkJbWFrZUFjdGlvbnMoKTsKLQkJY3JlYXRlVmVydGljYWxMaW5lKGxlZnRDb250YWluZXIpOwotCQljcmVhdGVWZXJ0aWNhbExpbmUocmlnaHRDb250YWluZXIpOwotCQlwcmV2aWV3ID0gbmV3IENvbmZpZ3VyYXRpb25QcmV2aWV3KHRoaXMpOwotCQlwcmV2aWV3LmNyZWF0ZUNvbnRyb2wocmlnaHRDb250YWluZXIpOwotCQlwcmV2aWV3LmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKAotCQkJbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlzcGxpdHRlci5zZXRXZWlnaHRzKG5ldyBpbnRbXSB7IDIsIDMgfSk7Ci0JCWZpbGxBY3Rpb25CYXJzKGdldENvbmZpZ3VyYXRpb25XaW5kb3coKS5nZXRUb29sQmFyTWFuYWdlcigpKTsKLQotCQl0cmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwoMik7Ci0KLQkJaWYgKHRyZWVWaWV3ZXIuZ2V0VHJlZSgpLmdldEl0ZW1Db3VudCgpID4gMCkgewotCQkJVHJlZUl0ZW1bXSBpdGVtcyA9IHRyZWVWaWV3ZXIuZ2V0VHJlZSgpLmdldEl0ZW1zKCk7Ci0JCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRTZWxlY3Rpb24obmV3IFRyZWVJdGVtW10geyBpdGVtc1swXSB9KTsKLQkJCWhhbmRsZVNlbGVjdGlvbkNoYW5nZWQobmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oaXRlbXNbMF0uZ2V0RGF0YSgpKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRyZWVWaWV3ZXIgPQotCQkJbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJdHJlZVZpZXdlci5zZXRVc2VIYXNobG9va3VwKHRydWUpOwotCQlpbml0UHJvdmlkZXJzKCk7Ci0KLQkJTWVudU1hbmFnZXIgbWVudU1nciA9IG5ldyBNZW51TWFuYWdlcigiI1BvcHVwTWVudSIpOyAvLyROT04tTkxTLTEkCi0JCW1lbnVNZ3Iuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOwotCQltZW51TWdyLmFkZE1lbnVMaXN0ZW5lcihuZXcgSU1lbnVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQkJCW1hbmFnZXIuYWRkKG5ldyBHcm91cE1hcmtlcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JCQkJZmlsbENvbnRleHRNZW51KG1hbmFnZXIpOwotCQkJfQotCQl9KTsKLQotCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KAotCQkJbWVudU1nci5jcmVhdGVDb250ZXh0TWVudSh0cmVlVmlld2VyLmdldENvbnRyb2woKSkpOwotCi0JCXRyZWVWaWV3ZXIKLQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9KTsKLQotCQl0cmVlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJCWhhbmRsZURvdWJsZUNsaWNrKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQlwdWJsaWMgVHJlZVZpZXdlciBnZXRUcmVlVmlld2VyKCkgewotCQlyZXR1cm4gdHJlZVZpZXdlcjsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVMaW5lQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVWZXJ0aWNhbExpbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5WRVJUSUNBTCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQlnZC53aWR0aEhpbnQgPSAxOwotCQlsaW5lLnNldExheW91dERhdGEoZ2QpOwotCX0KLQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBzcGxpdHRlcjsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRTdGF0dXNDb2RlKElGZWF0dXJlIGZlYXR1cmUsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWludCBjb2RlID0gc3RhdHVzLmdldENvZGUoKTsKLQkJaWYgKGNvZGUgPT0gSUZlYXR1cmUuU1RBVFVTX1VOSEFQUFkpIHsKLQkJCWlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQkJSVN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQlJU3RhdHVzIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQkJCWlmIChjaGlsZC5pc011bHRpU3RhdHVzKCkKLQkJCQkJCXx8IGNoaWxkLmdldENvZGUoKSAhPSBJRmVhdHVyZS5TVEFUVVNfRElTQUJMRUQpCi0JCQkJCQlyZXR1cm4gY29kZTsKLQkJCQl9Ci0JCQkJLy8gSWYgd2UgYXJlIGhlcmUsIGdsb2JhbCBzdGF0dXMgaXMgdW5oYXBweQotCQkJCS8vIGJlY2F1c2Ugb25lIG9yIG1vcmUgaW5jbHVkZWQgZmVhdHVyZXMKLQkJCQkvLyBpcyBkaXNhYmxlZC4KLQkJCQlpZiAoVXBkYXRlVXRpbHMuaGFzT2Jzb2xldGVQYXRjaGVzKGZlYXR1cmUpKSB7Ci0JCQkJCS8vIFRoZSBkaXNhYmxlZCBpbmNsdWRlZCBmZWF0dXJlcwotCQkJCQkvLyBhcmUgb2xkIHBhdGNoZXMgdGhhdCBhcmUgbm93Ci0JCQkJCS8vIHN1YnN1bWVkIGJ5IGJldHRlciB2ZXJzaW9ucyBvZgotCQkJCQkvLyB0aGUgZmVhdHVyZXMgdGhleSB3ZXJlIGRlc2lnbmVkIHRvCi0JCQkJCS8vIHBhdGNoLgotCQkJCQlyZXR1cm4gSUZlYXR1cmUuU1RBVFVTX0hBUFBZOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwpIHsKLQkJT2JqZWN0IG9iaiA9IHNzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQotCQlib29sZWFuIGFyZU11bHRpcGxlRmVhdHVyZXNTZWxlY3RlZCA9IHRydWU7Ci0JCQotCQlpZiAoc3NlbC5zaXplKCkgPiAxKSB7Ci0JCQlPYmplY3RbXSBhcnJheSA9IHNzZWwudG9BcnJheSgpOwotCQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJCWlmICghKGFycmF5W2ldIGluc3RhbmNlb2YgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKSkgewotCQkJCQlhcmVNdWx0aXBsZUZlYXR1cmVzU2VsZWN0ZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlhcmVNdWx0aXBsZUZlYXR1cmVzU2VsZWN0ZWQgPSBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKHNzZWwuc2l6ZSgpPjEpCi0JCQlvYmogPSBudWxsOwotCQkKLQkJaWYgKG9iaiE9bnVsbCkgewotCQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IChJTGFiZWxQcm92aWRlcil0cmVlVmlld2VyLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJCVN0cmluZyB0ZXh0ID0gbGFiZWxQcm92aWRlci5nZXRUZXh0KG9iaik7Ci0JCQkvL0ltYWdlIGltZyA9IGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uob2JqKTsKLQkJCUltYWdlIGltZyA9IG51bGw7Ci0JCQljb25maWd1cmF0aW9uV2luZG93LnVwZGF0ZVN0YXR1c0xpbmUodGV4dCwgaW1nKTsKLQkJfQotCQllbHNlCi0JCQljb25maWd1cmF0aW9uV2luZG93LnVwZGF0ZVN0YXR1c0xpbmUobnVsbCwgbnVsbCk7Ci0JCQotCQlpZiAoYXJlTXVsdGlwbGVGZWF0dXJlc1NlbGVjdGVkICYmIChzc2VsLnNpemUoKSA+IDEpKSB7Ci0JCQkKLQkJCXVuaW5zdGFsbEZlYXR1cmVzQWN0aW9uLnNldFNlbGVjdGlvbihzc2VsKTsKLQkJCXVuaW5zdGFsbEZlYXR1cmVzQWN0aW9uLnNldEVuYWJsZWQodW5pbnN0YWxsRmVhdHVyZUFjdGlvbi5jYW5FeGVjdXRlQWN0aW9uKCkpOwotCQkJdW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlc0FjdGlvbi5zZXRTZWxlY3Rpb24oc3NlbCk7Ci0JCQl1bmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVzQWN0aW9uLnNldEVuYWJsZWQodW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlQWN0aW9uLmNhbkV4ZWN1dGVBY3Rpb24oKSk7Ci0JCQlmZWF0dXJlc1N0YXRlQWN0aW9uLnNldFNlbGVjdGlvbihzc2VsKTsKLQkJCWZlYXR1cmVzU3RhdGVBY3Rpb24uc2V0RW5hYmxlZChmZWF0dXJlc1N0YXRlQWN0aW9uLmNhbkV4ZWN1dGVBY3Rpb24oKSk7Ci0JCQlwcm9wZXJ0aWVzQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcHJldmlldy5zZXRTZWxlY3Rpb24oc3NlbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChvYmogaW5zdGFuY2VvZiBJRmVhdHVyZUFkYXB0ZXIpIHsKLQkJCXRyeSB7Ci0JCQkJcHJvcGVydGllc0FjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCUNvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlciBhZGFwdGVyID0gKENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgb2JqOwotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyLmdldEZlYXR1cmUobnVsbCk7Ci0KLQkJCQlib29sZWFuIG1pc3NpbmcgPSBmZWF0dXJlIGluc3RhbmNlb2YgTWlzc2luZ0ZlYXR1cmU7Ci0JCQkJYm9vbGVhbiBlbmFibGUgPSAhbWlzc2luZwotCQkJCQkJJiYgKChhZGFwdGVyLmlzT3B0aW9uYWwoKSB8fCAhYWRhcHRlci5pc0luY2x1ZGVkKCkpKTsKLQotCQkJCXVuaW5zdGFsbEZlYXR1cmVBY3Rpb24uc2V0U2VsZWN0aW9uKHNzZWwpOwotCQkJCXVuaW5zdGFsbEZlYXR1cmVBY3Rpb24uc2V0RW5hYmxlZChlbmFibGUKLQkJCQkJCSYmIHVuaW5zdGFsbEZlYXR1cmVBY3Rpb24uY2FuRXhlY3V0ZUFjdGlvbigpKTsKLQkJCQl1bmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVBY3Rpb24uc2V0U2VsZWN0aW9uKHNzZWwpOwotCQkJCXVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZSAmJiB1bmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVBY3Rpb24uY2FuRXhlY3V0ZUFjdGlvbigpKTsKLQkJCQlpZiAoYWRhcHRlci5pc0NvbmZpZ3VyZWQoKSkKLQkJCQkJc2V0RGVzY3JpcHRpb25PblRhc2soCi0JCQkJCQkJdW5pbnN0YWxsRmVhdHVyZUFjdGlvbiwKLQkJCQkJCQlhZGFwdGVyLAotCQkJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfdW5pbnN0YWxsRGVzYzIpOwotCQkJCWVsc2UKLQkJCQkJc2V0RGVzY3JpcHRpb25PblRhc2soCi0JCQkJCQkJdW5pbnN0YWxsRmVhdHVyZUFjdGlvbiwKLQkJCQkJCQlhZGFwdGVyLAotCQkJCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfdW5pbnN0YWxsRGVzYyk7Ci0KLQkJCQlmZWF0dXJlU3RhdGVBY3Rpb24uc2V0U2VsZWN0aW9uKHNzZWwpOwotCQkJCWZlYXR1cmVTdGF0ZUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQkJc3dhcFZlcnNpb25BY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJaWYgKGVuYWJsZSkgewotCQkJCQlJRmVhdHVyZVtdIGZlYXR1cmVzID0gVXBkYXRlVXRpbHMuZ2V0SW5zdGFsbGVkRmVhdHVyZXMoCi0JCQkJCQkJZmVhdHVyZSwgZmFsc2UpOwotCQkJCQlpZiAoZmVhdHVyZXMubGVuZ3RoID4gMSkgewotCQkJCQkJaWYgKGFkYXB0ZXIuaXNDb25maWd1cmVkKCkpIHsKLQkJCQkJCQkvLyBXZSBvbmx5IGVuYWJsZSByZXBsYWNlIGFjdGlvbiBpZiBjb25maWd1cmVkCi0JCQkJCQkJLy8gYW5kIHNlbGVjdGVkLiBidWcgNzQwMTkKLQkJCQkJCQlzd2FwVmVyc2lvbkFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCXN3YXBWZXJzaW9uQWN0aW9uLnNldEN1cnJlbnRGZWF0dXJlKGZlYXR1cmUpOwotCQkJCQkJCXN3YXBWZXJzaW9uQWN0aW9uLnNldEZlYXR1cmVzKGZlYXR1cmVzKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gSWYgd2UgYXJlIG5vdCBjb25maWd1cmVkIGFuZCBhbm90aGVyIHZlcnNpb24gaXMKLQkJCQkJCQkvLyB3ZSB3YW50IHRvIGRpc2FibGUgU3RhdGVBY3Rpb24uIGJ1ZyA3NDAxOQotCQkJCQkJCWZlYXR1cmVzID0gVXBkYXRlVXRpbHMuZ2V0SW5zdGFsbGVkRmVhdHVyZXMoCi0JCQkJCQkJCQlmZWF0dXJlLCB0cnVlKTsKLQkJCQkJCQlpZiAoZmVhdHVyZXMubGVuZ3RoID4gMCkgewotCQkJCQkJCQlmZWF0dXJlU3RhdGVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJZmluZFVwZGF0ZXNBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJaWYgKGVuYWJsZSAmJiBhZGFwdGVyLmlzQ29uZmlndXJlZCgpKSB7Ci0JCQkJCWlmIChmZWF0dXJlLmdldFVwZGF0ZVNpdGVFbnRyeSgpICE9IG51bGwpIHsKLQkJCQkJCWZpbmRVcGRhdGVzQWN0aW9uLnNldEZlYXR1cmUoZmVhdHVyZSk7Ci0JCQkJCQlmaW5kVXBkYXRlc0FjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWlmIChtaXNzaW5nKSB7Ci0JCQkJCU1pc3NpbmdGZWF0dXJlIG1mID0gKE1pc3NpbmdGZWF0dXJlKSBmZWF0dXJlOwotCQkJCQlpbnN0YWxsT3B0RmVhdHVyZUFjdGlvbi5zZXRFbmFibGVkKG1mLmlzT3B0aW9uYWwoKQotCQkJCQkJCSYmIG1mLmdldE9yaWdpbmF0aW5nU2l0ZVVSTCgpICE9IG51bGwpOwotCQkJCQlpbnN0YWxsT3B0RmVhdHVyZUFjdGlvbi5zZXRGZWF0dXJlKG1mKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpbnN0YWxsT3B0RmVhdHVyZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgSUxvY2FsU2l0ZSkgewotCQkJcHJvcGVydGllc0FjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJZmluZFVwZGF0ZXNBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZpbmRVcGRhdGVzQWN0aW9uLnNldEZlYXR1cmUobnVsbCk7Ci0JCQlJTG9jYWxTaXRlIHNpdGUgPSBnZXRMb2NhbFNpdGUoKTsKLQkJCXJldmVydEFjdGlvbi5zZXRFbmFibGVkKHNpdGUgIT0gbnVsbAotCQkJCQkmJiBzaXRlLmdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkubGVuZ3RoID4gMSk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSUNvbmZpZ3VyZWRTaXRlQWRhcHRlcikgewotCQkJc2l0ZVN0YXRlQWN0aW9uLnNldFNpdGUoKChJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSBvYmopCi0JCQkJCS5nZXRDb25maWd1cmVkU2l0ZSgpKTsKLQkJCXNpdGVTdGF0ZUFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQl9Ci0JCQotCQlpZiAoYXJlTXVsdGlwbGVGZWF0dXJlc1NlbGVjdGVkKSB7Ci0JCQl1bmluc3RhbGxGZWF0dXJlc0FjdGlvbi5zZXRTZWxlY3Rpb24oc3NlbCk7Ci0JCQl1bmluc3RhbGxGZWF0dXJlc0FjdGlvbi5zZXRFbmFibGVkKHVuaW5zdGFsbEZlYXR1cmVBY3Rpb24uY2FuRXhlY3V0ZUFjdGlvbigpKTsKLQkJCXVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZXNBY3Rpb24uc2V0U2VsZWN0aW9uKHNzZWwpOwotCQkJdW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlc0FjdGlvbi5zZXRFbmFibGVkKHVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZUFjdGlvbi5jYW5FeGVjdXRlQWN0aW9uKCkpOwotCQkJZmVhdHVyZXNTdGF0ZUFjdGlvbi5zZXRTZWxlY3Rpb24oc3NlbCk7Ci0JCQlmZWF0dXJlc1N0YXRlQWN0aW9uLnNldEVuYWJsZWQoZmVhdHVyZXNTdGF0ZUFjdGlvbi5jYW5FeGVjdXRlQWN0aW9uKCkpOwotCQl9Ci0JCQotCQlwcmV2aWV3LnNldFNlbGVjdGlvbihzc2VsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0JCWhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZS5nZXRTZWxlY3Rpb24oKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREZXNjcmlwdGlvbk9uVGFzayhJQWN0aW9uIGFjdGlvbiwgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyIGFkYXB0ZXIsIFN0cmluZyBkZXNjKSB7Ci0JCUlQcmV2aWV3VGFza1tdIHRhc2tzID0gZ2V0UHJldmlld1Rhc2tzKGFkYXB0ZXIpOwotCQlpZiAodGFza3MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaT0wOyBpPHRhc2tzLmxlbmd0aDsgaSsrKQotCQkJaWYgKHRhc2tzW2ldLmdldEFjdGlvbigpID09IGFjdGlvbikKLQkJCQl0YXNrc1tpXS5zZXREZXNjcmlwdGlvbihkZXNjKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG1ha2VQcmV2aWV3VGFza3MoKSB7Ci0JCXByZXZpZXdUYXNrcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJQ2xhc3Mga2V5OwotCQlBcnJheUxpc3QgYXJyYXkgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIGxvY2FsIHNpdGUgdGFza3MKLQkJa2V5ID0gSUxvY2FsU2l0ZS5jbGFzczsKLQkJYXJyYXkuYWRkKAotCQkJbmV3IFByZXZpZXdUYXNrKAotCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfdXBkYXRlTGFiZWwsIAotCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfdXBkYXRlRGVzYywgCi0JCQkJZmluZFVwZGF0ZXNBY3Rpb24pKTsKLQkJYXJyYXkuYWRkKAotCQkJbmV3IFByZXZpZXdUYXNrKAotCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfaW5zdGFsbEhpc3RMYWJlbCwgCi0JCQkJVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19pbnN0YWxsSGlzdERlc2MsIAotCQkJCWluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24pKTsKLQkJYXJyYXkuYWRkKAotCQkJbmV3IFByZXZpZXdUYXNrKAotCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfYWN0aXZpdGllc0xhYmVsLCAKLQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X2FjdGl2aXRpZXNEZXNjLCAKLQkJCQlzaG93QWN0aXZpdGllc0FjdGlvbikpOwotCQlhcnJheS5hZGQoCi0JCQkJbmV3IFByZXZpZXdUYXNrKAotCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X2V4dExvY0xhYmVsLCAKLQkJCQkJVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19leHRMb2NEZXNjLCAKLQkJCQkJbmV3RXh0ZW5zaW9uTG9jYXRpb25BY3Rpb24pKTsKLQkJYXJyYXkuYWRkKAotCQkJCW5ldyBQcmV2aWV3VGFzaygKLQkJCQkJVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19yZXZlcnRQcmV2aW91c0xhYmVsLCAKLQkJCQkJVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19yZXZlcnRQcmV2aW91c0Rlc2MsIAotCQkJCQlyZXZlcnRBY3Rpb24pKTsKLQotCQlwcmV2aWV3VGFza3MucHV0KGtleSwgYXJyYXkudG9BcnJheShuZXcgSVByZXZpZXdUYXNrW2FycmF5LnNpemUoKV0pKTsKLQotCQkvLyBjb25maWd1cmVkIHNpdGUgdGFza3MKLQkJYXJyYXkuY2xlYXIoKTsKLQkJa2V5ID0gSUNvbmZpZ3VyZWRTaXRlQWRhcHRlci5jbGFzczsKLQkJYXJyYXkuYWRkKAotCQkJbmV3IFByZXZpZXdUYXNrKAotCQkJCW51bGwsCi0JCQkJVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19lbmFibGVMb2NEZXNjLCAKLQkJCQlzaXRlU3RhdGVBY3Rpb24pKTsKLQkJYXJyYXkuYWRkKAotCQkJbmV3IFByZXZpZXdUYXNrKAotCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfZXh0TG9jTGFiZWwsIAotCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfZXh0TG9jRGVzYywgCi0JCQkJbmV3RXh0ZW5zaW9uTG9jYXRpb25BY3Rpb24pKTsKLQkJYXJyYXkuYWRkKAotCQkJbmV3IFByZXZpZXdUYXNrKAotCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfcHJvcGVydGllc0xhYmVsLCAKLQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X2luc3RhbGxQcm9wRGVzYywgCi0JCQkJcHJvcGVydGllc0FjdGlvbikpOwotCQlwcmV2aWV3VGFza3MucHV0KGtleSwgYXJyYXkudG9BcnJheShuZXcgSVByZXZpZXdUYXNrW2FycmF5LnNpemUoKV0pKTsKLQotCQkvLyBmZWF0dXJlIGFkYXB0ZXIgdGFza3MKLQkJYXJyYXkuY2xlYXIoKTsKLQkJa2V5ID0gSUZlYXR1cmVBZGFwdGVyLmNsYXNzOwotCQlhcnJheS5hZGQoCi0JCQkJbmV3IFByZXZpZXdUYXNrKAotCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X3NjYW5MYWJlbCwgCi0JCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfc2NhbkRlc2MsIAotCQkJCQlmaW5kVXBkYXRlc0FjdGlvbikpOwotCQlhcnJheS5hZGQoCi0JCQluZXcgUHJldmlld1Rhc2soCi0JCQkJVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19yZXBsYWNlVmVyc2lvbkxhYmVsLCAKLQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X3JlcGxhY2VWZXJzaW9uRGVzYywgCi0JCQkJc3dhcFZlcnNpb25BY3Rpb24pKTsKLQkJYXJyYXkuYWRkKAotCQkJbmV3IFByZXZpZXdUYXNrKAotCQkJCW51bGwsCi0JCQkJVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19lbmFibGVGZWF0dXJlRGVzYywgCi0JCQkJZmVhdHVyZVN0YXRlQWN0aW9uKSk7Ci0JCWFycmF5LmFkZCgKLQkJCW5ldyBQcmV2aWV3VGFzaygKLQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X2luc3RhbGxPcHRpb25hbExhYmVsLCAKLQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X2luc3RhbGxPcHRpb25hbERlc2MsIAotCQkJCWluc3RhbGxPcHRGZWF0dXJlQWN0aW9uKSk7Ci0JCWFycmF5LmFkZCgKLQkJCW5ldyBQcmV2aWV3VGFzaygKLQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X3VuaW5zdGFsbExhYmVsLCAKLQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkNvbmZpZ3VyYXRpb25WaWV3X3VuaW5zdGFsbERlc2MsIAotCQkJCXVuaW5zdGFsbEZlYXR1cmVBY3Rpb24pKTsKLQkJYXJyYXkuYWRkKAotCQkJbmV3IFByZXZpZXdUYXNrKAotCQkJCVVwZGF0ZVVJTWVzc2FnZXMuQ29uZmlndXJhdGlvblZpZXdfZmVhdHVyZVByb3BMYWJlbCwgCi0JCQkJVXBkYXRlVUlNZXNzYWdlcy5Db25maWd1cmF0aW9uVmlld19mZWF0dXJlUHJvcERlc2MsIAotCQkJCXByb3BlcnRpZXNBY3Rpb24pKTsKLQkJcHJldmlld1Rhc2tzLnB1dChrZXksIGFycmF5LnRvQXJyYXkobmV3IElQcmV2aWV3VGFza1thcnJheS5zaXplKCldKSk7Ci0JfQotCi0JcHVibGljIElQcmV2aWV3VGFza1tdIGdldFByZXZpZXdUYXNrcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCUlQcmV2aWV3VGFza1tdIHRhc2tzID0gbnVsbDsKLQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUZlYXR1cmVBZGFwdGVyKQotCQkJdGFza3MgPSAoSVByZXZpZXdUYXNrW10pIHByZXZpZXdUYXNrcy5nZXQoSUZlYXR1cmVBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElMb2NhbFNpdGUpCi0JCQl0YXNrcyA9IChJUHJldmlld1Rhc2tbXSkgcHJldmlld1Rhc2tzLmdldChJTG9jYWxTaXRlLmNsYXNzKTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpCi0JCQl0YXNrcyA9Ci0JCQkJKElQcmV2aWV3VGFza1tdKSBwcmV2aWV3VGFza3MuZ2V0KElDb25maWd1cmVkU2l0ZUFkYXB0ZXIuY2xhc3MpOwotCQlyZXR1cm4gKHRhc2tzICE9IG51bGwpID8gdGFza3MgOiBuZXcgSVByZXZpZXdUYXNrWzBdOwotCX0KLQotCUNvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93IGdldENvbmZpZ3VyYXRpb25XaW5kb3coKXsKLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb25XaW5kb3c7Ci0JfQotCQotCXByaXZhdGUgTG9jYWxTaXRlV29ya2JlbmNoQWRhcHRlciBnZXRVSVJlYWR5TG9jYWxTaXRlKElMb2NhbFNpdGUgbG9jYWxTaXRlKSB7Ci0JCQkKLQkJcmV0dXJuIG5ldyBMb2NhbFNpdGVXb3JrYmVuY2hBZGFwdGVyKGxvY2FsU2l0ZSk7Ci0JCQkKLQl9Ci0JCi0JCi0KLX0KLQotY2xhc3MgTG9jYWxTaXRlV29ya2JlbmNoQWRhcHRlciBleHRlbmRzIExvY2FsU2l0ZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hBZGFwdGVyIHsKLQkKLQlwcml2YXRlIElMb2NhbFNpdGUgbG9jYWxTaXRlOwotCQotCXB1YmxpYyBMb2NhbFNpdGVXb3JrYmVuY2hBZGFwdGVyKElMb2NhbFNpdGUgbG9jYWxTaXRlKSB7Ci0JCXRoaXMubG9jYWxTaXRlID0gbG9jYWxTaXRlOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8pIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyYXRpb24oSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlsb2NhbFNpdGUuYWRkQ29uZmlndXJhdGlvbihjb25maWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExvY2FsU2l0ZUNoYW5nZWRMaXN0ZW5lcihJTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxvY2FsU2l0ZS5hZGRMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb24gYWRkVG9QcmVzZXJ2ZWRDb25maWd1cmF0aW9ucyhJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbG9jYWxTaXRlLmFkZFRvUHJlc2VydmVkQ29uZmlndXJhdGlvbnMoY29uZmlndXJhdGlvbik7Ci0JfQotCi0JcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBjbG9uZUN1cnJlbnRDb25maWd1cmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbG9jYWxTaXRlLmNsb25lQ3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uW10gZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKSB7Ci0JCXJldHVybiBsb2NhbFNpdGUuZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uIGdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZ2V0RmVhdHVyZVN0YXR1cyhJRmVhdHVyZSBmZWF0dXJlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBsb2NhbFNpdGUuZ2V0RmVhdHVyZVN0YXR1cyhmZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE1heGltdW1IaXN0b3J5Q291bnQoKSB7Ci0JCXJldHVybiBsb2NhbFNpdGUuZ2V0TWF4aW11bUhpc3RvcnlDb3VudCgpOwotCX0KLQotCXB1YmxpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb25bXSBnZXRQcmVzZXJ2ZWRDb25maWd1cmF0aW9ucygpIHsKLQkJcmV0dXJuIGxvY2FsU2l0ZS5nZXRQcmVzZXJ2ZWRDb25maWd1cmF0aW9ucygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21QcmVzZXJ2ZWRDb25maWd1cmF0aW9ucyhJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQlsb2NhbFNpdGUucmVtb3ZlRnJvbVByZXNlcnZlZENvbmZpZ3VyYXRpb25zKGNvbmZpZ3VyYXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxvY2FsU2l0ZUNoYW5nZWRMaXN0ZW5lcihJTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxvY2FsU2l0ZS5yZW1vdmVMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJldmVydFRvKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9ibGVtSGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWxvY2FsU2l0ZS5yZXZlcnRUbyhjb25maWd1cmF0aW9uLCBtb25pdG9yLCBoYW5kbGVyKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzYXZlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbG9jYWxTaXRlLnNhdmUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXhpbXVtSGlzdG9yeUNvdW50KGludCBoaXN0b3J5KSB7Ci0JCWxvY2FsU2l0ZS5zZXRNYXhpbXVtSGlzdG9yeUNvdW50KGhpc3RvcnkpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9GZWF0dXJlQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvRmVhdHVyZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDk2YTQyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9GZWF0dXJlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGZWF0dXJlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHdpbmRvd1RpdGxlOwotCQotICAgIHByb3RlY3RlZCBTaGVsbCBzaGVsbDsKLQotCXB1YmxpYyBGZWF0dXJlQWN0aW9uKFNoZWxsIHNoZWxsLCBTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLSAgICAgICAgdGhpcy5zaGVsbCA9IHNoZWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbmZpcm0oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIE1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oIHNoZWxsLCB3aW5kb3dUaXRsZSwgbWVzc2FnZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFdpbmRvd1RpdGxlKCBTdHJpbmcgd2luZG93VGl0bGUpIHsKLQkJdGhpcy53aW5kb3dUaXRsZSA9IHdpbmRvd1RpdGxlOwotCX0KLQkKLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjYW5FeGVjdXRlQWN0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvRmVhdHVyZVN0YXRlQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvRmVhdHVyZVN0YXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMzg2NjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0ZlYXR1cmVTdGF0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuVXBkYXRlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5Db25maWd1cmVkRmVhdHVyZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5PcGVyYXRpb25zTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZlYXR1cmVTdGF0ZUFjdGlvbiBleHRlbmRzIEZlYXR1cmVBY3Rpb24gewotCi0JcHJpdmF0ZSBDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIgYWRhcHRlcjsKLQotICAgIHB1YmxpYyBGZWF0dXJlU3RhdGVBY3Rpb24oU2hlbGwgc2hlbGwsIFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHN1cGVyKHNoZWxsLCB0ZXh0KTsKLSAgICAgICAgc2V0V2luZG93VGl0bGUoVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlU3RhdGVBY3Rpb25fZGlhbG9nVGl0bGUpOwotICAgIH0KLSAgICAKLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQotCQl0aGlzLmFkYXB0ZXIgPSAoQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChhZGFwdGVyLmlzQ29uZmlndXJlZCgpKSB7Ci0JCQlzZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZVN0YXRlQWN0aW9uX2Rpc2FibGUpOyAKLQkJfSBlbHNlIHsKLQkJCXNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlU3RhdGVBY3Rpb25fZW5hYmxlKTsgCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCQotCQkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQkJCi0JCQlib29sZWFuIGlzQ29uZmlndXJlZCA9IGFkYXB0ZXIuaXNDb25maWd1cmVkKCk7Ci0JCQkvLyBBc2sgdXNlciB0byBjb25maXJtIHRoZSBvcGVyYXRpb24KLQkJCVN0cmluZyBtZXNzYWdlID0KLQkJCQlpc0NvbmZpZ3VyZWQKLQkJCQkJPyBVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVTdGF0ZUFjdGlvbl9kaXNhYmxlUXVlc3Rpb24KLQkJCQkJOiBVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVTdGF0ZUFjdGlvbl9FbmFibGVRdWVzdGlvbjsgCi0KLQkJCWlmICghY29uZmlybShtZXNzYWdlKSkKLQkJCQlyZXR1cm47Ci0KLQkJCS8vIElmIGN1cnJlbnQgY29uZmlnIGlzIGJyb2tlbiwgY29uZmlybSB3aXRoIHRoZSB1c2VyIHRvIGNvbnRpbnVlCi0JCQlpZiAoT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVDdXJyZW50U3RhdGUoKSAhPSBudWxsICYmCi0JCQkJCSFjb25maXJtKFVwZGF0ZVVJTWVzc2FnZXMuQWN0aW9uc19icm9rZW5Db25maWdRdWVzdGlvbikpIAotCQkJCXJldHVybjsKLQkJCQotCQkJSU9wZXJhdGlvbiB0b2dnbGVPcGVyYXRpb24gPQotCQkJCWlzQ29uZmlndXJlZAotCQkJCQk/IChJT3BlcmF0aW9uKU9wZXJhdGlvbnNNYW5hZ2VyCi0JCQkJCQkuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpCi0JCQkJCQkuY3JlYXRlVW5jb25maWdPcGVyYXRpb24oCi0JCQkJCQlhZGFwdGVyLmdldENvbmZpZ3VyZWRTaXRlKCksCi0JCQkJCQlhZGFwdGVyLmdldEZlYXR1cmUobnVsbCkpCi0JCQkJCTogT3BlcmF0aW9uc01hbmFnZXIKLQkJCQkJCS5nZXRPcGVyYXRpb25GYWN0b3J5KCkKLQkJCQkJCS5jcmVhdGVDb25maWdPcGVyYXRpb24oCi0JCQkJCQlhZGFwdGVyLmdldENvbmZpZ3VyZWRTaXRlKCksCi0JCQkJCQlhZGFwdGVyLmdldEZlYXR1cmUobnVsbCkpOwotCi0JCQlib29sZWFuIHJlc3RhcnROZWVkZWQgPSB0b2dnbGVPcGVyYXRpb24uZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJCVVwZGF0ZVVJLnJlcXVlc3RSZXN0YXJ0KHJlc3RhcnROZWVkZWQpOwotCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLAotICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBlLmdldFN0YXR1cygpKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuCi0JCQlVcGRhdGVVdGlscy5sb2dFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZUFjdGlvbigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvRmVhdHVyZXNTdGF0ZUFjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0ZlYXR1cmVzU3RhdGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAzYTI1Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvRmVhdHVyZXNTdGF0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5JbnN0YWxsUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuT3BlcmF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy5VcGRhdGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLkNvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JRmVhdHVyZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLk9wZXJhdGlvbnNNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgRmVhdHVyZXNTdGF0ZUFjdGlvbiBleHRlbmRzIEZlYXR1cmVBY3Rpb24gewotCi0JCi0JcHJpdmF0ZSBDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXJbXSBhZGFwdGVyczsKLQotICAgIHB1YmxpYyBGZWF0dXJlc1N0YXRlQWN0aW9uKFNoZWxsIHNoZWxsLCBTdHJpbmcgdGV4dCkgewotICAgICAgICBzdXBlcihzaGVsbCwgdGV4dCk7Ci0gICAgICAgIHNldFdpbmRvd1RpdGxlKFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZVN0YXRlQWN0aW9uX2RpYWxvZ1RpdGxlKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCi0JCXRoaXMuYWRhcHRlcnMgPSAoQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyW10pIHNlbGVjdGlvbi50b0xpc3QoKS50b0FycmF5KG5ldyBDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXJbc2VsZWN0aW9uLnNpemUoKV0pOwotCQlpZiAoY2FuVW5jb25maWd1cmUoKSkgewotCQkJc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVTdGF0ZUFjdGlvbl9kaXNhYmxlKTsgCi0JCX0gZWxzZSB7Ci0JCQlzZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZVN0YXRlQWN0aW9uX2VuYWJsZSk7IAotCQl9Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl0cnkgewotCQkJaWYgKCAoYWRhcHRlcnMgPT0gbnVsbCkgJiYgKGFkYXB0ZXJzLmxlbmd0aCA9PSAwKSkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCUlTdGF0dXMgc3RhdHVzID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQbGF0Zm9ybUNvbmZpZ1ZhbGlkKCk7Ci0JCQlpZiAoc3RhdHVzICE9IG51bGwpCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJCQotCQkJYm9vbGVhbiBpc0NvbmZpZ3VyZWQgPSBjYW5VbmNvbmZpZ3VyZSgpOwotCQkJLy8gQXNrIHVzZXIgdG8gY29uZmlybSB0aGUgb3BlcmF0aW9uCi0JCQlTdHJpbmcgbWVzc2FnZSA9Ci0JCQkJaXNDb25maWd1cmVkCi0JCQkJCT8gVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlU3RhdGVBY3Rpb25fZGlzYWJsZVF1ZXN0aW9uCi0JCQkJCTogVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlU3RhdGVBY3Rpb25fRW5hYmxlUXVlc3Rpb247IAotCi0JCQlpZiAoIWNvbmZpcm0obWVzc2FnZSkpCi0JCQkJcmV0dXJuOwotCi0JCQkvLyBJZiBjdXJyZW50IGNvbmZpZyBpcyBicm9rZW4sIGNvbmZpcm0gd2l0aCB0aGUgdXNlciB0byBjb250aW51ZQotCQkJaWYgKE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlQ3VycmVudFN0YXRlKCkgIT0gbnVsbCAmJgotCQkJCQkhY29uZmlybShVcGRhdGVVSU1lc3NhZ2VzLkFjdGlvbnNfYnJva2VuQ29uZmlnUXVlc3Rpb24pKSAKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCUlPcGVyYXRpb24gdG9nZ2xlT3BlcmF0aW9uID0gbnVsbDsKLQkJCQotCQkJSUZlYXR1cmVbXSBmZWF0dXJlcyA9IG5ldyBJRmVhdHVyZVthZGFwdGVycy5sZW5ndGhdOwotCQkJSUNvbmZpZ3VyZWRTaXRlW10gY29uZmlndXJlZFNpdGVzID0gbmV3IElDb25maWd1cmVkU2l0ZVthZGFwdGVycy5sZW5ndGhdOwotCQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBhZGFwdGVycy5sZW5ndGg7IGkrKykgewotCQkJCWZlYXR1cmVzW2ldID0gYWRhcHRlcnNbaV0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCQljb25maWd1cmVkU2l0ZXNbaV0gPSBhZGFwdGVyc1tpXS5nZXRDb25maWd1cmVkU2l0ZSgpOwotCQkJfQotCQkJCi0JCQlpZiAoaXNDb25maWd1cmVkKSB7Ci0JCQkJdG9nZ2xlT3BlcmF0aW9uID0gKChPcGVyYXRpb25GYWN0b3J5KU9wZXJhdGlvbnNNYW5hZ2VyLmdldE9wZXJhdGlvbkZhY3RvcnkoKSkuY3JlYXRlVW5jb25maWd1cmVGZWF0dXJlc09wZXJhdGlvbiggY29uZmlndXJlZFNpdGVzLCBmZWF0dXJlcyk7Ci0JCQl9IGVsc2UgaWYgKGNhbkNvbmZpZ3VyZSgpKXsKLQkJCQl0b2dnbGVPcGVyYXRpb24gPSAoKE9wZXJhdGlvbkZhY3RvcnkpT3BlcmF0aW9uc01hbmFnZXIuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpKS5jcmVhdGVDb25maWd1cmVGZWF0dXJlc09wZXJhdGlvbiggY29uZmlndXJlZFNpdGVzLCBmZWF0dXJlcyk7Ci0JCQl9Ci0JCQkKLQkJCWlmICh0b2dnbGVPcGVyYXRpb24gIT0gbnVsbCkgewotCQkJCWJvb2xlYW4gcmVzdGFydE5lZWRlZCA9IHRvZ2dsZU9wZXJhdGlvbi5leGVjdXRlKG51bGwsIG51bGwpOwotCQkJCVVwZGF0ZVVJLnJlcXVlc3RSZXN0YXJ0KHJlc3RhcnROZWVkZWQpOwotCQkJfQotCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLAotICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBlLmdldFN0YXR1cygpKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuCi0JCQlVcGRhdGVVdGlscy5sb2dFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZUFjdGlvbigpIHsKLQkJcmV0dXJuIGNhbkNvbmZpZ3VyZSgpIHx8IGNhblVuY29uZmlndXJlKCk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjYW5Db25maWd1cmUoKSB7Ci0JCQotCQlpZiAoYWRhcHRlcnMgPT0gbnVsbCB8fCBhZGFwdGVycy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWZvciggaW50IGkgPSAwOyBpIDwgYWRhcHRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQotCQkJaWYgKGFkYXB0ZXJzW2ldLmlzQ29uZmlndXJlZCgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCQl0cnkgewotCQkJCS8vIGNoZWNrIGZvciBwZW5kaW5nIGNoYW5nZXMgKGUuZy4gaWYgdGhlIGZlYXR1cmUgaGFzIGp1c3QgYmVlbiBkaXNhYmxlZCkKLQkJCQlJRmVhdHVyZU9wZXJhdGlvbiBwZW5kaW5nT3BlcmF0aW9uID0gT3BlcmF0aW9uc01hbmFnZXIuZmluZFBlbmRpbmdPcGVyYXRpb24oYWRhcHRlcnNbaV0uZ2V0RmVhdHVyZShudWxsKSk7Ci0JCQkJaWYgKHBlbmRpbmdPcGVyYXRpb24gIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkJaWYgKEluc3RhbGxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldCgiZmVhdHVyZV8iK2FkYXB0ZXJzW2ldLmdldEZlYXR1cmUobnVsbCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSA9PSBudWxsKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkJCQotCQlyZXR1cm4gdHJ1ZTsJCi0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjYW5VbmNvbmZpZ3VyZSgpIHsKLQkJCi0JCWlmIChhZGFwdGVycyA9PSBudWxsIHx8IGFkYXB0ZXJzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBhZGFwdGVycy5sZW5ndGg7IGkrKykgewotCQkJCi0JCQlpZiAoIWFkYXB0ZXJzW2ldLmlzQ29uZmlndXJlZCgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCQl0cnkgewotCQkJCS8vIGNoZWNrIGZvciBwZW5kaW5nIGNoYW5nZXMgKGUuZy4gaWYgdGhlIGZlYXR1cmUgaGFzIGp1c3QgYmVlbiBkaXNhYmxlZCkKLQkJCQlJRmVhdHVyZU9wZXJhdGlvbiBwZW5kaW5nT3BlcmF0aW9uID0gT3BlcmF0aW9uc01hbmFnZXIuZmluZFBlbmRpbmdPcGVyYXRpb24oYWRhcHRlcnNbaV0uZ2V0RmVhdHVyZShudWxsKSk7Ci0JCQkJaWYgKHBlbmRpbmdPcGVyYXRpb24gIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkJaWYgKEluc3RhbGxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldCgiZmVhdHVyZV8iK2FkYXB0ZXJzW2ldLmdldEZlYXR1cmUobnVsbCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSA9PSBudWxsKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkJCQotCQlyZXR1cm4gdHJ1ZTsJCi0JfQotCQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvRmluZEFuZEluc3RhbGxIYW5kbGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvRmluZEFuZEluc3RhbGxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNDQyNzEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0ZpbmRBbmRJbnN0YWxsSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuVXBkYXRlTWFuYWdlclVJOwotCi0vKioKLSAqIFRoaXMgaGFuZGxlciBpcyBob29rZWQgdG8gYSBjb21tYW5kIHByb3ZpZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiAoc3VjaAotICogYXMgb3JnLmVjbGlwc2UudWkuaWRlKS4gVGhpcyBhbGxvd3MgUkNQIGFwcGxpY2F0aW9ucyB0byBjb250cm9sIGhvdyB1cGRhdGUKLSAqIGZ1bmN0aW9uYWxpdHkgaXMgc3VyZmFjZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaW5kQW5kSW5zdGFsbEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXIjZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCVVwZGF0ZU1hbmFnZXJVSS5vcGVuSW5zdGFsbGVyKEhhbmRsZXJVdGlsLmdldEFjdGl2ZVNoZWxsKGV2ZW50KSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0ZpbmRVcGRhdGVzQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvRmluZFVwZGF0ZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNjN2FiNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvRmluZFVwZGF0ZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiAgQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Qcm9ncmVzc01vbml0b3JXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLkNvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLkluc3RhbGxXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHMuSW5zdGFsbFdpemFyZE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5PcGVyYXRpb25zTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuVXBkYXRlSm9iOwotCi1wdWJsaWMgY2xhc3MgRmluZFVwZGF0ZXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JcHJpdmF0ZSBJRmVhdHVyZSBmZWF0dXJlOwotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uTWFuYWdlcldpbmRvdyB3aW5kb3c7Ci0KLQlwcml2YXRlIGNsYXNzIFRyYWNraW5nUHJvZ3Jlc3NNb25pdG9yIGV4dGVuZHMgUHJvZ3Jlc3NNb25pdG9yV3JhcHBlciB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgc3VibmFtZTsKLQotCQlwcml2YXRlIGludCB0b3RhbFdvcms7Ci0KLQkJcHJpdmF0ZSBkb3VibGUgd29ya1NvRmFyOwotCi0JCXByb3RlY3RlZCBUcmFja2luZ1Byb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCXN1cGVyKG1vbml0b3IpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYmVnaW5UYXNrKFN0cmluZyBuYW1lLCBpbnQgdG90YWxXb3JrKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy50b3RhbFdvcmsgPSB0b3RhbFdvcms7Ci0JCQlzdXBlci5iZWdpblRhc2sobmFtZSwgdG90YWxXb3JrKTsKLQkJCXVwZGF0ZVN0YXR1cygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW50ZXJuYWxXb3JrZWQoZG91YmxlIHRpY2tzKSB7Ci0JCQlzdXBlci5pbnRlcm5hbFdvcmtlZCh0aWNrcyk7Ci0JCQl3b3JrU29GYXIgKz0gdGlja3M7Ci0JCQl1cGRhdGVTdGF0dXMoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN1YlRhc2soU3RyaW5nIHN1YlRhc2spIHsKLQkJCXN1Ym5hbWUgPSBzdWJUYXNrOwotCQkJc3VwZXIuc3ViVGFzayhzdWJUYXNrKTsKLQkJCXVwZGF0ZVN0YXR1cygpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0YXR1cygpIHsKLQkJCWlmICh3aW5kb3cuZ2V0U2hlbGwoKT09bnVsbCB8fCB3aW5kb3cuZ2V0U2hlbGwoKS5pc0Rpc3Bvc2VkKCkpCi0JCQkJcmV0dXJuOwotCQkJaWYgKHdpbmRvdy5pc1Byb2dyZXNzQ2FuY2VsZWQoKSkKLQkJCQlzZXRDYW5jZWxlZCh0cnVlKTsKLQkJCWlmICh0b3RhbFdvcmsgPD0gMCkKLQkJCQlyZXR1cm47Ci0JCQlTdHJpbmcgcGVyYyA9ICgoaW50KSAod29ya1NvRmFyICogMTAwLjApIC8gdG90YWxXb3JrKSArICIiOyAvLyROT04tTkxTLTEkCi0JCQlmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKFVwZGF0ZVVJTWVzc2FnZXMuRmluZFVwZGF0ZXNBY3Rpb25fdHJhY2tlZFByb2dyZXNzLCBuZXcgU3RyaW5nW10gewotCQkJCQluYW1lLCBzdWJuYW1lLCBwZXJjIH0pOwotCQkJU2hlbGwgc2hlbGwgPSB3aW5kb3cuZ2V0U2hlbGwoKTsKLQkJCWlmIChzaGVsbD09bnVsbCB8fCBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCXdpbmRvdy5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJd2luZG93LnVwZGF0ZVN0YXR1c0xpbmUobWVzc2FnZSwgbnVsbCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRyYWNrZWRVcGRhdGVKb2IgZXh0ZW5kcyBVcGRhdGVKb2IgewotCQlwdWJsaWMgVHJhY2tlZFVwZGF0ZUpvYihTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0F1dG9tYXRpYywKLQkJCQlib29sZWFuIGRvd25sb2FkLCBJRmVhdHVyZVtdIGZlYXR1cmVzKSB7Ci0JCQlzdXBlcihuYW1lLCBpc0F1dG9tYXRpYywgZG93bmxvYWQsIGZlYXR1cmVzKTsKLQkJfQotCi0JCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCXJldHVybiBzdXBlci5ydW4obmV3IFRyYWNraW5nUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBGaW5kVXBkYXRlc0FjdGlvbihDb25maWd1cmF0aW9uTWFuYWdlcldpbmRvdyB3aW5kb3csIFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotCQl0aGlzLndpbmRvdyA9IHdpbmRvdzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKQotCQkJCS52YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Iod2luZG93LmdldFNoZWxsKCksIG51bGwsIG51bGwsIHN0YXR1cyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBJZiBjdXJyZW50IGNvbmZpZyBpcyBicm9rZW4sIGNvbmZpcm0gd2l0aCB0aGUgdXNlciB0byBjb250aW51ZQotCQlpZiAoT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVDdXJyZW50U3RhdGUoKSAhPSBudWxsCi0JCQkJJiYgIWNvbmZpcm0oVXBkYXRlVUlNZXNzYWdlcy5BY3Rpb25zX2Jyb2tlbkNvbmZpZ1F1ZXN0aW9uKSkKLQkJCXJldHVybjsKLQotCQlpZiAoSW5zdGFsbFdpemFyZC5pc1J1bm5pbmcoKSkgewotCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24od2luZG93LmdldFNoZWxsKCksCi0JCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9pc1J1bm5pbmdUaXRsZSwKLQkJCQkJVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX2lzUnVubmluZ0luZm8pOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSUZlYXR1cmVbXSBmZWF0dXJlcyA9IG51bGw7Ci0JCWlmIChmZWF0dXJlICE9IG51bGwpCi0JCQlmZWF0dXJlcyA9IG5ldyBJRmVhdHVyZVtdIHsgZmVhdHVyZSB9OwotCi0JCVVwZGF0ZUpvYiBqb2IgPSBuZXcgVHJhY2tlZFVwZGF0ZUpvYigKLQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfam9iTmFtZSwgZmFsc2UsIGZhbHNlLCBmZWF0dXJlcyk7Ci0KLQkJam9iLnNldFVzZXIodHJ1ZSk7Ci0JCWpvYi5zZXRQcmlvcml0eShKb2IuSU5URVJBQ1RJVkUpOwotCi0JCVN0cmluZyBuYW1lID0gZmVhdHVyZSE9bnVsbD9mZWF0dXJlLmdldExhYmVsKCk6VXBkYXRlVUlNZXNzYWdlcy5GaW5kVXBkYXRlc0FjdGlvbl9hbGxGZWF0dXJlc1NlYXJjaDsKLQkJd2luZG93LnRyYWNrVXBkYXRlSm9iKGpvYiwgbmFtZSk7Ci0JCUluc3RhbGxXaXphcmRPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IEluc3RhbGxXaXphcmRPcGVyYXRpb24oKTsKLQotCQlvcGVyYXRpb24ucnVuKHdpbmRvdy5nZXRTaGVsbCgpLCBqb2IpOwotCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvbmZpcm0oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIE1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0od2luZG93LmdldFNoZWxsKCksCi0JCQkJVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlU3RhdGVBY3Rpb25fZGlhbG9nVGl0bGUsIG1lc3NhZ2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9JUHJldmlld1Rhc2suamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9JUHJldmlld1Rhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk1NzE0MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvSVByZXZpZXdUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByZXZpZXdUYXNrIHsKLQlTdHJpbmcgZ2V0TmFtZSgpOwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCXZvaWQgcnVuKCk7Ci0JYm9vbGVhbiBpc0VuYWJsZWQoKTsKLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjKTsKLQlJQWN0aW9uIGdldEFjdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0luc3RhbGxPcHRpb25hbEZlYXR1cmVBY3Rpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9JbnN0YWxsT3B0aW9uYWxGZWF0dXJlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NDQ2NzEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0luc3RhbGxPcHRpb25hbEZlYXR1cmVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlYXJjaC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLio7Ci0KLQotcHVibGljIGNsYXNzIEluc3RhbGxPcHRpb25hbEZlYXR1cmVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByaXZhdGUgTWlzc2luZ0ZlYXR1cmUgbWlzc2luZ0ZlYXR1cmU7Ci0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQotCXB1YmxpYyBJbnN0YWxsT3B0aW9uYWxGZWF0dXJlQWN0aW9uKFNoZWxsIHNoZWxsLCBTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQkJdGhpcy5zaGVsbCA9IHNoZWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoTWlzc2luZ0ZlYXR1cmUgZmVhdHVyZSkgewotCQl0aGlzLm1pc3NpbmdGZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChtaXNzaW5nRmVhdHVyZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIG51bGwsIG51bGwsIHN0YXR1cyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIElmIGN1cnJlbnQgY29uZmlnIGlzIGJyb2tlbiwgY29uZmlybSB3aXRoIHRoZSB1c2VyIHRvIGNvbnRpbnVlCi0JCWlmIChPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZUN1cnJlbnRTdGF0ZSgpICE9IG51bGwgJiYKLQkJCQkhY29uZmlybShVcGRhdGVVSU1lc3NhZ2VzLkFjdGlvbnNfYnJva2VuQ29uZmlnUXVlc3Rpb24pKSAKLQkJCXJldHVybjsKLQkJCQotCQkKLQkJVmVyc2lvbmVkSWRlbnRpZmllciB2aWQgPSBtaXNzaW5nRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCVVSTCBvcmlnaW5hdGluZ1VSTCA9IG1pc3NpbmdGZWF0dXJlLmdldE9yaWdpbmF0aW5nU2l0ZVVSTCgpOwotCi0JCVVwZGF0ZVNlYXJjaFNjb3BlIHNjb3BlID0gbmV3IFVwZGF0ZVNlYXJjaFNjb3BlKCk7Ci0JCXNjb3BlLmFkZFNlYXJjaFNpdGUob3JpZ2luYXRpbmdVUkwudG9TdHJpbmcoKSwgb3JpZ2luYXRpbmdVUkwsIG51bGwpOwotCi0JCU9wdGlvbmFsRmVhdHVyZVNlYXJjaENhdGVnb3J5IGNhdGVnb3J5ID0gbmV3IE9wdGlvbmFsRmVhdHVyZVNlYXJjaENhdGVnb3J5KCk7Ci0JCWNhdGVnb3J5LmFkZFZlcnNpb25lZElkZW50aWZpZXIodmlkKTsKLQkJZmluYWwgVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0ID0KLQkJCW5ldyBVcGRhdGVTZWFyY2hSZXF1ZXN0KGNhdGVnb3J5LCBzY29wZSk7Ci0KLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoc2hlbGwuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJb3BlbldpemFyZChzZWFyY2hSZXF1ZXN0KTsKLQkJCX0KLQkJfSk7Ci0JfQotCXByaXZhdGUgdm9pZCBvcGVuV2l6YXJkKFVwZGF0ZVNlYXJjaFJlcXVlc3Qgc2VhcmNoUmVxdWVzdCkgewotCQlpZiAoSW5zdGFsbFdpemFyZC5pc1J1bm5pbmcoKSkgewotCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oc2hlbGwsIFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9pc1J1bm5pbmdUaXRsZSwgVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX2lzUnVubmluZ0luZm8pOwotCQkJcmV0dXJuOwotCQl9Ci0JCUluc3RhbGxXaXphcmQgd2l6YXJkID0gbmV3IEluc3RhbGxXaXphcmQoc2VhcmNoUmVxdWVzdCk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgUmVzaXphYmxlSW5zdGFsbFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkLCBVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVQYWdlX29wdGlvbmFsSW5zdGFsbF90aXRsZSk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNvbmZpcm0oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIE1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oCi0JCQlzaGVsbCwKLQkJCVVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZVN0YXRlQWN0aW9uX2RpYWxvZ1RpdGxlLCAKLQkJCW1lc3NhZ2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9JbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmI3MTRhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9JbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuQ29uZmlndXJhdG9yVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0gICAgLy9wcml2YXRlIFNoZWxsIHNoZWxsOwotCXByaXZhdGUgQnVmZmVyZWRSZWFkZXIgYnVmZlJlYWQ7Ci0JcHJpdmF0ZSBQcmludFdyaXRlciBodG1sTG9nOwotCXByaXZhdGUgRmlsZSB0ZW1wRmlsZTsKLQlwcml2YXRlIFN0cmluZyByb3dUeXBlOwotCXByaXZhdGUgSVBhdGggcGF0aDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbGlnaHRCbHVlID0gIiNFRUVFRkYiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHdoaXRlID0gIiNGRkZGRkYiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRhcmtCbHVlID0gIiM5OUFBREQiOyAvLyROT04tTkxTLTEkCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTiA9ICJDT05GSUdVUkFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVklUWSA9ICJBQ1RJVklUWSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uKFNoZWxsIHNoZWxsLCBTdHJpbmcgdGV4dCwgSW1hZ2VEZXNjcmlwdG9yIGRlc2MpIHsKLQkJc3VwZXIodGV4dCwgZGVzYyk7Ci0gICAgICAgIC8vdGhpcy5zaGVsbCA9IHNoZWxsOwotCQlTdHJpbmcgbG9jYXRpb24gPQotCQkJQ29uZmlndXJhdG9yVXRpbHMKLQkJCQkuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpCi0JCQkJLmdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpCi0JCQkJLmdldEZpbGUoKTsKLQkJcGF0aCA9IG5ldyBQYXRoKGxvY2F0aW9uKS5yZW1vdmVMYXN0U2VnbWVudHMoMSkuYXBwZW5kKCJpbnN0YWxsLmxvZyIpOyAvLyROT04tTkxTLTEkCi0JCXJvd1R5cGUgPSAibGlnaHQtcm93IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJdHJ5IHsKLQkJCW9wZW5Mb2coKTsKLQkJCXBhcnNlTG9nKCk7Ci0JCQlVcGRhdGVVSS5zaG93VVJMKCJmaWxlOiIgKyBnZXRUZW1wRmlsZSgpLmdldFBhdGgoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWNsb3NlTG9nKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbkxvZygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJICAgIC8vIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0JCSAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aC50b09TU3RyaW5nKCkpOwotCQkgICAgLy8gdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLQkJICAgIElucHV0U3RyZWFtUmVhZGVyIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkgICAgYnVmZlJlYWQgPSBuZXcgQnVmZmVyZWRSZWFkZXIoaXNyKTsKLQkJCWh0bWxMb2cgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZ2V0VGVtcEZpbGUoKSksICJVVEYtOCIpKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93Q29yZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgRmlsZSBnZXRUZW1wRmlsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHRlbXBGaWxlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJdGVtcEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJpbnN0YWxsLWxvZyIsICIuaHRtbCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl0ZW1wRmlsZS5kZWxldGVPbkV4aXQoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvd0NvcmVFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRlbXBGaWxlOwotCX0KLQotCXByaXZhdGUgdm9pZCBwYXJzZUxvZygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8JCSFDT05GSUdVUkFUSU9OIDxjb25maWd1cmF0aW9uLWRhdGU+Ci0JCS8vCQkhQUNUSVZJVFkgPGRhdGU+IDx0YXJnZXQ+IDxhY3Rpb24+IDxzdGF0dXM+Ci0KLQkJdHJ5IHsKLQkJCVN0cmluZyB0eXBlLCBkYXRlLCBzdGF0dXMsIHRhcmdldCwgYWN0aW9uOwotCQkJU3RyaW5nVG9rZW5pemVyIGh0bWxDb2RlOwotCi0JCQlodG1sTG9nLnByaW50bG4oIjxodG1sPiIpOyAvLyROT04tTkxTLTEkCi0JCQlodG1sTG9nLnByaW50bG4oIjxoZWFkPiIpOyAvLyROT04tTkxTLTEkCi0JCQlodG1sTG9nLnByaW50bG4oIjxtZXRhIGh0dHAtZXF1aXY9XCJDb250ZW50LVR5cGVcIiBjb250ZW50PVwidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04XCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWh0bWxMb2cucHJpbnRsbigiPHRpdGxlPkluc3RhbGwtTG9nPC90aXRsZT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJYWRkQ1NTKCk7Ci0JCQlodG1sTG9nLnByaW50bG4oIjwvaGVhZD4iKTsgLy8kTk9OLU5MUy0xJAotCQkJaHRtbExvZy5wcmludGxuKCI8Ym9keT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHRpdGxlID0gVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uX3RpdGxlOyAKLQkJCVN0cmluZyBkZXNjID0gVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uX2Rlc2M7IAotCQkJaHRtbExvZy5wcmludGxuKCI8aDEgY2xhc3M9dGl0bGU+Iit0aXRsZSsiPC9oMT4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlodG1sTG9nLnByaW50bG4oIjxwIGNsYXNzPWJvZHlUZXh0PiIrZGVzYysiPC9wPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQotCQkJaHRtbExvZy5wcmludGxuKCI8Y2VudGVyPiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCWh0bWxMb2cucHJpbnRsbigiPHRhYmxlIHdpZHRoID0xMDAlIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTEgY2VsbHBhZGRpbmc9Mj4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQl3aGlsZSAoYnVmZlJlYWQucmVhZHkoKSkgewotCi0JCQkJaHRtbENvZGUgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGJ1ZmZSZWFkLnJlYWRMaW5lKCkpOwotCQkJCXdoaWxlICghKGh0bWxDb2RlLmhhc01vcmVFbGVtZW50cygpKSkgewotCQkJCQlpZiAoIWJ1ZmZSZWFkLnJlYWR5KCkpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCWh0bWxDb2RlID0gbmV3IFN0cmluZ1Rva2VuaXplcihidWZmUmVhZC5yZWFkTGluZSgpKTsKLQkJCQl9Ci0KLQkJCQl0eXBlID0gaHRtbENvZGUubmV4dFRva2VuKCk7Ci0JCQkJdHlwZSA9IHR5cGUuc3Vic3RyaW5nKHR5cGUuaW5kZXhPZigiISIpICsgMSwgdHlwZS5sZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCWlmICh0eXBlLmVxdWFscyhBQ1RJVklUWSkpIHsKLQkJCQkJdGFyZ2V0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJRGF0ZSBkID0gbmV3IERhdGUobmV3IExvbmcoaHRtbENvZGUubmV4dFRva2VuKCkpLmxvbmdWYWx1ZSgpKTsKLQkJCQkJRGF0ZUZvcm1hdCBkZiA9IERhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZSgpOwotCQkJCQlkYXRlID0gZGYuZm9ybWF0KGQpOwotCQkJCQkvLyBpZ25vcmUgc3RyaW5nIGRhdGUKLQkJCQkJaHRtbENvZGUubmV4dFRva2VuKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaHRtbENvZGUubmV4dFRva2VuKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJd2hpbGUgKGh0bWxDb2RlLmNvdW50VG9rZW5zKCkgPiAyKQotCQkJCQkJdGFyZ2V0ID0gdGFyZ2V0ICsgIiAiICsgaHRtbENvZGUubmV4dFRva2VuKCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQlhY3Rpb24gPSBodG1sQ29kZS5uZXh0VG9rZW4oKTsKLQkJCQkJc3RhdHVzID0gaHRtbENvZGUubmV4dFRva2VuKCk7Ci0KLQkJCQkJYWRkQWN0aXZpdHkoYWN0aW9uLCBkYXRlLCBzdGF0dXMsIHRhcmdldCk7Ci0KLQkJCQl9IGVsc2UgewotCQkJCQlodG1sTG9nLnByaW50bG4oKTsKLQkJCQkJaHRtbExvZy5wcmludGxuKAotCQkJCQkJIjx0ciBpZD1zZXBhcmF0b3I+PHRkIGNvbHNwYW49ND48L3RkPjwvdHI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaHRtbExvZy5wcmludGxuKCk7Ci0JCQkJCURhdGUgZCA9IG5ldyBEYXRlKG5ldyBMb25nKGh0bWxDb2RlLm5leHRUb2tlbigpKS5sb25nVmFsdWUoKSk7Ci0JCQkJCURhdGVGb3JtYXQgZGYgPSBEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2UoKTsKLQkJCQkJZGF0ZSA9IGRmLmZvcm1hdChkKTsKLS8vCQkJCQlkYXRlID0gIiI7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCQl3aGlsZSAoaHRtbENvZGUuY291bnRUb2tlbnMoKSA+IDApCi0vLwkJCQkJCWRhdGUgPSBkYXRlICsgIiAiICsgaHRtbENvZGUubmV4dFRva2VuKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYWRkQ29uZmlndXJhdGlvbkhlYWRlcihkYXRlKTsKLQkJCQkJYWRkQWN0aXZpdHlIZWFkZXIoKTsKLQkJCQl9Ci0KLQkJCX0KLQkJCWh0bWxMb2cucHJpbnRsbigiPC90YWJsZT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJaHRtbExvZy5wcmludGxuKCI8L2JvZHk+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWh0bWxMb2cucHJpbnRsbigiPC9odG1sPiIpOyAvLyROT04tTkxTLTEkCi0JCQlodG1sTG9nLmZsdXNoKCk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93Q29yZUV4Y2VwdGlvbihlKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEFjdGl2aXR5KAotCQlTdHJpbmcgdHlwZSwKLQkJU3RyaW5nIGRhdGUsCi0JCVN0cmluZyBzdGF0dXMsCi0JCVN0cmluZyB0YXJnZXQpIHsKLQkJaHRtbExvZy5wcmludCgiPHRyIGNsYXNzPSIgKyByb3dUeXBlICsgIj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWh0bWxMb2cucHJpbnQoIjx0ZCBjbGFzcz1sb2ctdGV4dCB3aWR0aD0zMCU+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaHRtbExvZy5wcmludChkYXRlKTsKLQkJaHRtbExvZy5wcmludGxuKCI8L3RkPiIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnQoIjx0ZCBjbGFzcz1sb2ctdGV4dCB3aWR0aD00MCU+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaHRtbExvZy5wcmludCh0YXJnZXQpOwotCQlodG1sTG9nLnByaW50bG4oIjwvdGQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaHRtbExvZy5wcmludCgiPHRkIGNsYXNzPWxvZy10ZXh0IHdpZHRoPTIwJT4iKTsgLy8kTk9OLU5MUy0xJAotCQlodG1sTG9nLnByaW50KHR5cGUpOwotCQlodG1sTG9nLnByaW50bG4oIjwvdGQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaHRtbExvZy5wcmludCgiPHRkIGNsYXNzPWxvZy10ZXh0IHdpZHRoPTEwJT4iKTsgLy8kTk9OLU5MUy0xJAotCQlodG1sTG9nLnByaW50KHN0YXR1cyk7Ci0JCWh0bWxMb2cucHJpbnRsbigiPC90ZD48L3RyPiIpOyAvLyROT04tTkxTLTEkCi0JCXRvZ2dsZVJvd0NvbG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENTUygpIHsKLQkJaHRtbExvZy5wcmludGxuKCI8U1RZTEUgdHlwZT1cInRleHQvY3NzXCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaHRtbExvZy5wcmludGxuKCJIMS50aXRsZSB7IGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyBjb2xvcjogIzk5QUFDQyB9Iik7IC8vJE5PTi1OTFMtMSQKLQkJaHRtbExvZy5wcmludGxuKCJQLmJvZHlUZXh0IHsgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogOXB0OyB9Iik7IC8vJE5PTi1OTFMtMSQKLQkJaHRtbExvZy5wcmludGxuKAotCQkJIlRELmxvZy1oZWFkZXIgeyBmb250LWZhbWlseTogc2Fucy1zZXJpZjsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiB3aGl0ZX0iKTsgLy8kTk9OLU5MUy0xJAotCQlodG1sTG9nLnByaW50bG4oCi0JCQkiVEQubG9nLXRleHQgeyBmb250LWZhbWlseTogc2Fucy1zZXJpZjsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogbGlnaHRlcjsgZm9udC1zaXplOiA4cHQ7IGNvbG9yOmJsYWNrfSIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnRsbigKLQkJLy8JIlRELmNvbmZpZy1sb2ctaGVhZGVyIHsgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtc2l6ZTogOXB0OyBjb2xvcjogd2hpdGU7IDt0ZXh0LWFsaWduOiByaWdodDsgYm9yZGVyLXRvcDoxMHB4IHNvbGlkIHdoaXRlfSIpOwotCQkiVEQuY29uZmlnLWxvZy1oZWFkZXIgeyBmb250LWZhbWlseTogc2Fucy1zZXJpZjsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyLXRvcDoxMHB4IHNvbGlkIHdoaXRlfSIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnRsbigiVFIubGlnaHQtcm93IHtiYWNrZ3JvdW5kOiIgKyB3aGl0ZSArICJ9Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlodG1sTG9nLnByaW50bG4oIlRSLmRhcmstcm93IHtiYWNrZ3JvdW5kOiIgKyBsaWdodEJsdWUgKyAifSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaHRtbExvZy5wcmludGxuKCJUUi5oZWFkZXIge2JhY2tncm91bmQ6IiArIGRhcmtCbHVlICsgIn0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWh0bWxMb2cucHJpbnRsbigiPC9TVFlMRT4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRBY3Rpdml0eUhlYWRlcigpIHsKLQkJaHRtbExvZy5wcmludCgiPHRyIGNsYXNzPWhlYWRlcj4iKTsgLy8kTk9OLU5MUy0xJAotCQlodG1sTG9nLnByaW50KCI8dGQgY2xhc3M9bG9nLWhlYWRlcj4iKTsgLy8kTk9OLU5MUy0xJAotCQlodG1sTG9nLnByaW50KFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbl9kYXRlVGltZSk7IAotCQlodG1sTG9nLnByaW50KCI8L3RkPiIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnQoIjx0ZCBjbGFzcz1sb2ctaGVhZGVyPiIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uX3RhcmdldCk7IAotCQlodG1sTG9nLnByaW50KCI8L3RkPiIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnQoIjx0ZCBjbGFzcz1sb2ctaGVhZGVyPiIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uX2FjdGlvbik7IAotCQlodG1sTG9nLnByaW50KCI8L3RkPiIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnQoIjx0ZCBjbGFzcz1sb2ctaGVhZGVyPiIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uX3N0YXR1cyk7IAotCQlodG1sTG9nLnByaW50bG4oIjwvdGQ+PC90cj4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRDb25maWd1cmF0aW9uSGVhZGVyKFN0cmluZyBkYXRlKSB7Ci0JCWlmIChkYXRlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaHRtbExvZy5wcmludCgiPHRyIGNsYXNzPWhlYWRlcj4iKTsgLy8kTk9OLU5MUy0xJAotCQlodG1sTG9nLnByaW50KCI8dGQgY2xhc3M9Y29uZmlnLWxvZy1oZWFkZXIgY29sc3Bhbj00PiIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnQoZGF0ZSk7Ci0JCWh0bWxMb2cucHJpbnRsbigiPC90ZD48L3RyPiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHRvZ2dsZVJvd0NvbG9yKCkgewotCQlpZiAocm93VHlwZS5lcXVhbHMoImxpZ2h0LXJvdyIpKSAvLyROT04tTkxTLTEkCi0JCQlyb3dUeXBlID0gImRhcmstcm93IjsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlyb3dUeXBlID0gImxpZ2h0LXJvdyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGhyb3dDb3JlRXhjZXB0aW9uKFRocm93YWJsZSBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJbmV3IFN0YXR1cygKLQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCVVwZGF0ZVVJLmdldFBsdWdpbklkKCksCi0JCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb25fZXJyb3JzLCAKLQkJCQllKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsb3NlTG9nKCkgewotCQl0cnkgewotCQkJaWYgKGJ1ZmZSZWFkICE9IG51bGwpCi0JCQkJYnVmZlJlYWQuY2xvc2UoKTsKLQkJCWlmIChodG1sTG9nICE9IG51bGwpCi0JCQkJaHRtbExvZy5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0gZmluYWxseSB7Ci0JCQlidWZmUmVhZCA9IG51bGw7Ci0JCQlodG1sTG9nID0gbnVsbDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL01hbmFnZUNvbmZpZ3VyYXRpb25IYW5kbGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvTWFuYWdlQ29uZmlndXJhdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiMjczNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvTWFuYWdlQ29uZmlndXJhdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLlVwZGF0ZU1hbmFnZXJVSTsKLQotLyoqCi0gKiBUaGlzIGhhbmRsZXIgaXMgaG9va2VkIHRvIGEgY29tbWFuZCBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24gKHN1Y2gKLSAqIGFzIG9yZy5lY2xpcHNlLnVpLmlkZSkuIFRoaXMgYWxsb3dzIFJDUCBhcHBsaWNhdGlvbnMgdG8gY29udHJvbCBob3cgdXBkYXRlCi0gKiBmdW5jdGlvbmFsaXR5IGlzIHN1cmZhY2VkLgotICovCi1wdWJsaWMgY2xhc3MgTWFuYWdlQ29uZmlndXJhdGlvbkhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXIjZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCVVwZGF0ZU1hbmFnZXJVSS5vcGVuQ29uZmlndXJhdGlvbk1hbmFnZXIoSGFuZGxlclV0aWwuZ2V0QWN0aXZlU2hlbGwoZXZlbnQpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvTmV3RXh0ZW5zaW9uTG9jYXRpb25BY3Rpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9OZXdFeHRlbnNpb25Mb2NhdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDIxZWNkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9OZXdFeHRlbnNpb25Mb2NhdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi1wdWJsaWMgY2xhc3MgTmV3RXh0ZW5zaW9uTG9jYXRpb25BY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotICAgIHByaXZhdGUgU2hlbGwgc2hlbGw7Ci0gICAgCi0JcHVibGljIE5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uKFNoZWxsIHNoZWxsLCBTdHJpbmcgdGV4dCwgSW1hZ2VEZXNjcmlwdG9yIGRlc2MpIHsKLQkJc3VwZXIodGV4dCwgZGVzYyk7Ci0gICAgICAgIHRoaXMuc2hlbGwgPSBzaGVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQotCQlJU3RhdHVzIHN0YXR1cyA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGxhdGZvcm1Db25maWdWYWxpZCgpOwotCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgbnVsbCwgbnVsbCwgc3RhdHVzKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9Ci0JCQluZXcgRGlyZWN0b3J5RGlhbG9nKHNoZWxsLCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShVcGRhdGVVSU1lc3NhZ2VzLk5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uX3NlbGVjdEV4dExvY2F0aW9uKTsgCi0KLQkJU3RyaW5nIGRpciA9IGRpYWxvZy5vcGVuKCk7Ci0JCXdoaWxlIChkaXIgIT0gbnVsbCkgewotCQkJRmlsZSBkaXJGaWxlID0gZ2V0RXh0ZW5zaW9uU2l0ZShuZXcgRmlsZShkaXIpKTsKLQkJCWlmIChkaXJGaWxlICE9IG51bGwpIHsKLQkJCQlpZiAoYWRkRXh0ZW5zaW9uTG9jYXRpb24oZGlyRmlsZSkpCi0JCQkJCXJldHVybjsKLQkJCQllbHNlIHsKLQkJCQkJLy8gcmUtb3BlbiB0aGUgZGlyZWN0b3J5IGRpYWxvZwotCQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChkaXIpOwotCQkJCQlkaXIgPSBkaWFsb2cub3BlbigpOwotCQkJCX0JCi0JCQl9IGVsc2UgewotCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKAotCQkJCQlzaGVsbCwKLQkJCQkJVXBkYXRlVUlNZXNzYWdlcy5OZXdFeHRlbnNpb25Mb2NhdGlvbkFjdGlvbl9leHRJbmZvVGl0bGUsIAotCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLk5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uX2V4dEluZm9NZXNzYWdlKTsgCi0JCQkJLy8gcmUtb3BlbiB0aGUgZGlyZWN0b3J5IGRpYWxvZwotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGRpcik7Ci0JCQkJZGlyID0gZGlhbG9nLm9wZW4oKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkaXJlY3RvcnkKLQkgKiBAcmV0dXJuIHRoZSBzaXRlIGZpbGUgKGluY2x1ZGluZyAiZWNsaXBzZSIgcGF0aCkgd2hlbiBkaXJlY3RvcnkgaXMgYW4gZWNsaXBzZSBleHN0ZW5zaW9uLCBudWxsIG90aGVyd2lzZQotCSAqLwotCXN0YXRpYyBGaWxlIGdldEV4dGVuc2lvblNpdGUoRmlsZSBkaXJlY3RvcnkpIHsKLQkJLy8gQ2hlY2sgdGhlIGVjbGlwc2UgZm9sZGVyCi0JCWlmIChkaXJlY3RvcnkuZ2V0TmFtZSgpLmVxdWFscygiZWNsaXBzZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIGlmIHdlIHBpY2tlZCB1cCB0aGUgZWNsaXBzZSBkaXJlY3RvcnksIGNoZWNrIGlmIGl0cyBwYXJlbnQgaXMgYSBzaXRlCi0JCQlGaWxlIHNpdGUgPSBnZXRFeHRlbnNpb25TaXRlKGRpcmVjdG9yeS5nZXRQYXJlbnRGaWxlKCkpOwotCQkJaWYgKHNpdGUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZGlyZWN0b3J5OwotCQkJLy8gb3RoZXJ3aXNlLCBmYWxsIHRocm91Z2gKLQkJfQotCQkKLQkJRmlsZSBlY2xpcHNlID0gbmV3IEZpbGUoZGlyZWN0b3J5LCAiZWNsaXBzZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmICghZWNsaXBzZS5leGlzdHMoKSB8fCAhZWNsaXBzZS5pc0RpcmVjdG9yeSgpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gY2hlY2sgdGhlIG1hcmtlcgotCQlGaWxlIG1hcmtlciA9IG5ldyBGaWxlKGVjbGlwc2UsICIuZWNsaXBzZWV4dGVuc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCWlmICghbWFya2VyLmV4aXN0cygpIHx8IG1hcmtlci5pc0RpcmVjdG9yeSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBlY2xpcHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhZGRFeHRlbnNpb25Mb2NhdGlvbihGaWxlIGRpcikgewotCQl0cnkgewotCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBjb25maWcuY3JlYXRlTGlua2VkQ29uZmlndXJlZFNpdGUoZGlyKTsKLQkJCWNzaXRlLnZlcmlmeVVwZGF0YWJsZVN0YXR1cygpOwotCQkJY29uZmlnLmFkZENvbmZpZ3VyZWRTaXRlKGNzaXRlKTsKLQkJCWJvb2xlYW4gcmVzdGFydE5lZWRlZCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLnNhdmUoKTsKLQkJCVVwZGF0ZVVJLnJlcXVlc3RSZXN0YXJ0KHJlc3RhcnROZWVkZWQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIHRpdGxlID0gVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfbG9jYXRpb25fZXJyb3JfdGl0bGU7IAotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCB0aXRsZSwgbnVsbCwgZS5nZXRTdGF0dXMoKSk7Ci0JCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSxmYWxzZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9SZXBsYWNlVmVyc2lvbkFjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1JlcGxhY2VWZXJzaW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YjBjOGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1JlcGxhY2VWZXJzaW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLlJlcGxhY2VGZWF0dXJlVmVyc2lvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi1wdWJsaWMgY2xhc3MgUmVwbGFjZVZlcnNpb25BY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCQotCXByaXZhdGUgSUZlYXR1cmUgY3VycmVudEZlYXR1cmU7Ci0JcHJpdmF0ZSBJRmVhdHVyZVtdIGZlYXR1cmVzOwotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0gICAgCi0JcHVibGljIFJlcGxhY2VWZXJzaW9uQWN0aW9uKFNoZWxsIHNoZWxsLCBTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLSAgICAgICAgdGhpcy5zaGVsbCA9IHNoZWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50RmVhdHVyZShJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWN1cnJlbnRGZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZXMoSUZlYXR1cmVbXSBmZWF0dXJlcykgewotCQl0aGlzLmZlYXR1cmVzID0gZmVhdHVyZXM7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChjdXJyZW50RmVhdHVyZSA9PSBudWxsIHx8IGZlYXR1cmVzID09IG51bGwgfHwgZmVhdHVyZXMubGVuZ3RoIDwgMikKLQkJCXJldHVybjsKLQkJCQotCQlJU3RhdHVzIHN0YXR1cyA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGxhdGZvcm1Db25maWdWYWxpZCgpOwotCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgbnVsbCwgbnVsbCwgc3RhdHVzKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJUmVwbGFjZUZlYXR1cmVWZXJzaW9uV2l6YXJkIHdpemFyZCA9IG5ldyBSZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmQoY3VycmVudEZlYXR1cmUsIGZlYXR1cmVzKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dChzaGVsbC5nZXRUZXh0KCkpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKDQwMCw0MDApOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvUmV2ZXJ0Q29uZmlndXJhdGlvbkFjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1JldmVydENvbmZpZ3VyYXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBkNDA4MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvUmV2ZXJ0Q29uZmlndXJhdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotcHVibGljIGNsYXNzIFJldmVydENvbmZpZ3VyYXRpb25BY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotICAgIHByaXZhdGUgU2hlbGwgc2hlbGw7Ci0gICAgCi0JcHVibGljIFJldmVydENvbmZpZ3VyYXRpb25BY3Rpb24oU2hlbGwgc2hlbGwsIFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotICAgICAgICB0aGlzLnNoZWxsID0gc2hlbGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIG51bGwsIG51bGwsIHN0YXR1cyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVJldmVydENvbmZpZ3VyYXRpb25XaXphcmQgd2l6YXJkID0gbmV3IFJldmVydENvbmZpZ3VyYXRpb25XaXphcmQoKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dChzaGVsbC5nZXRUZXh0KCkpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKDYwMCw1MDApOwotCQlkaWFsb2cub3BlbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9TaG93QWN0aXZpdGllc0FjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1Nob3dBY3Rpdml0aWVzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZjQ3YmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1Nob3dBY3Rpdml0aWVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkcy5TaG93QWN0aXZpdGllc0RpYWxvZzsKLQotcHVibGljIGNsYXNzIFNob3dBY3Rpdml0aWVzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlTaGVsbCBzaGVsbDsKLQkKLQlwdWJsaWMgU2hvd0FjdGl2aXRpZXNBY3Rpb24oU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotCQl0aGlzLnNoZWxsID0gcGFyZW50U2hlbGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJU2hvd0FjdGl2aXRpZXNEaWFsb2cgZGlhbG9nID0gbmV3IFNob3dBY3Rpdml0aWVzRGlhbG9nKHNoZWxsKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuU2hvd0FjdGl2aXRpZXNEaWFsb2dfdGl0bGUpOyAKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvU2l0ZVN0YXRlQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvU2l0ZVN0YXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNWYwMDYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1NpdGVTdGF0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotLyoqCi0gKiBUb2dnbGVzIGEgc2l0ZSdzIGVuYWJsZWQgc3RhdGUKLSAqLwotCi1wdWJsaWMgY2xhc3MgU2l0ZVN0YXRlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcml2YXRlIElDb25maWd1cmVkU2l0ZSBzaXRlOwotICAgIHByaXZhdGUgU2hlbGwgc2hlbGw7Ci0KLQlwdWJsaWMgU2l0ZVN0YXRlQWN0aW9uKFNoZWxsIHNoZWxsKSB7Ci0gICAgICAgIHRoaXMuc2hlbGwgPSBzaGVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaXRlKElDb25maWd1cmVkU2l0ZSBzaXRlKSB7Ci0JCXRoaXMuc2l0ZSA9IHNpdGU7Ci0JCWJvb2xlYW4gc3RhdGUgPSBzaXRlLmlzRW5hYmxlZCgpOwotCQlzZXRUZXh0KHN0YXRlID8gVXBkYXRlVUlNZXNzYWdlcy5TaXRlU3RhdGVBY3Rpb25fZGlzYWJsZUxhYmVsIDogVXBkYXRlVUlNZXNzYWdlcy5TaXRlU3RhdGVBY3Rpb25fZW5hYmxlTGFiZWwpOyAKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoc2l0ZSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCQotCQkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCkgewotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgbnVsbCwgbnVsbCwgc3RhdHVzKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCWJvb2xlYW4gb2xkVmFsdWUgPSBzaXRlLmlzRW5hYmxlZCgpOwotCQkJaWYgKCFjb25maXJtKCFvbGRWYWx1ZSkpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQlJT3BlcmF0aW9uIHRvZ2dsZVNpdGVPcGVyYXRpb24gPSBPcGVyYXRpb25zTWFuYWdlci5nZXRPcGVyYXRpb25GYWN0b3J5KCkuY3JlYXRlVG9nZ2xlU2l0ZU9wZXJhdGlvbihzaXRlKTsKLQkJCWJvb2xlYW4gcmVzdGFydE5lZWRlZCA9IHRvZ2dsZVNpdGVPcGVyYXRpb24uZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJCQkJCi0JCQlVcGRhdGVVSS5yZXF1ZXN0UmVzdGFydChyZXN0YXJ0TmVlZGVkKTsKLQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgbnVsbCwgbnVsbCwgZS5nZXRTdGF0dXMoKSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvbmZpcm0oYm9vbGVhbiBuZXdTdGF0ZSkgewotCQlTdHJpbmcgbmFtZSA9IHNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLnRvU3RyaW5nKCk7Ci0JCVN0cmluZyBlbmFibGVNZXNzYWdlID0gTkxTLmJpbmQoVXBkYXRlVUlNZXNzYWdlcy5TaXRlU3RhdGVBY3Rpb25fZW5hYmxlTWVzc2FnZSwgbmFtZSk7Ci0JCVN0cmluZyBkaXNhYmxlTWVzc2FnZSA9IE5MUy5iaW5kKFVwZGF0ZVVJTWVzc2FnZXMuU2l0ZVN0YXRlQWN0aW9uX2Rpc2FibGVNZXNzYWdlLCBuYW1lKTsKLQotCQlTdHJpbmcgbWVzc2FnZSA9IG5ld1N0YXRlID8gZW5hYmxlTWVzc2FnZSA6IGRpc2FibGVNZXNzYWdlOwotCQlyZXR1cm4gTWVzc2FnZURpYWxvZy5vcGVuQ29uZmlybShzaGVsbCwgVXBkYXRlVUlNZXNzYWdlcy5TaXRlU3RhdGVBY3Rpb25fZGlhbG9nVGl0bGUsIG1lc3NhZ2UpOyAKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NTUzZDUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1VuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuSW5zdGFsbFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9wZXJhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuVXBkYXRlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5Db25maWd1cmVkRmVhdHVyZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSUZlYXR1cmVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5PcGVyYXRpb25zTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIFVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZUFjdGlvbiBleHRlbmRzIEZlYXR1cmVBY3Rpb24gewotCi0JcHJpdmF0ZSBDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIgYWRhcHRlcjsKLQotCXB1YmxpYyBVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVBY3Rpb24oU2hlbGwgc2hlbGwsIFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHNoZWxsLCB0ZXh0KTsKLQkJc2V0V2luZG93VGl0bGUoVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlVW5jb25maWd1cmVBbmRVbmluc3RhbGxBY3Rpb25fZGlhbG9nVGl0bGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJdHJ5IHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQbGF0Zm9ybUNvbmZpZ1ZhbGlkKCk7Ci0JCQlpZiAoc3RhdHVzICE9IG51bGwpCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJCQotCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCB8fCAhY29uZmlybShVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEFjdGlvbl9xdWVzdGlvbikpIAotCQkJCXJldHVybjsKLQotCQkJLy8gSWYgY3VycmVudCBjb25maWcgaXMgYnJva2VuLCBjb25maXJtIHdpdGggdGhlIHVzZXIgdG8gY29udGludWUKLQkJCWlmIChPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZUN1cnJlbnRTdGF0ZSgpICE9IG51bGwgJiYKLQkJCQkJIWNvbmZpcm0oVXBkYXRlVUlNZXNzYWdlcy5BY3Rpb25zX2Jyb2tlbkNvbmZpZ1F1ZXN0aW9uKSkgCi0JCQkJcmV0dXJuOwotCi0JCQlJT3BlcmF0aW9uIG9wZXJhdGlvbiA9Ci0JCQkJKChPcGVyYXRpb25GYWN0b3J5KU9wZXJhdGlvbnNNYW5hZ2VyLmdldE9wZXJhdGlvbkZhY3RvcnkoKSkuY3JlYXRlVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKCBhZGFwdGVyLmdldENvbmZpZ3VyZWRTaXRlKCksIGFkYXB0ZXIuZ2V0RmVhdHVyZShudWxsKSk7Ci0KLQkJCWJvb2xlYW4gcmVzdGFydE5lZWRlZCA9IG9wZXJhdGlvbi5leGVjdXRlKG51bGwsIG51bGwpOwotCQkJVXBkYXRlVUkucmVxdWVzdFJlc3RhcnQocmVzdGFydE5lZWRlZCk7Ci0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIG51bGwsIG51bGwsIGUuZ2V0U3RhdHVzKCkpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4KLQkJCVVwZGF0ZVV0aWxzLmxvZ0V4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJfQotCX0KLQotCi0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQotCQl0aGlzLmFkYXB0ZXIgPSAoQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCXNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlVW5jb25maWd1cmVBbmRVbmluc3RhbGxBY3Rpb25fdW5pbnN0YWxsKTsgCi0JfQotCQotCQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGVBY3Rpb24oKSB7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAoIWFkYXB0ZXIuaXNDb25maWd1cmVkKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQl0cnkgewotCQkJLy8gY2hlY2sgZm9yIHBlbmRpbmcgY2hhbmdlcyAoZS5nLiBpZiB0aGUgZmVhdHVyZSBoYXMganVzdCBiZWVuIGRpc2FibGVkKQotCQkJSUZlYXR1cmVPcGVyYXRpb24gcGVuZGluZ09wZXJhdGlvbiA9IE9wZXJhdGlvbnNNYW5hZ2VyLmZpbmRQZW5kaW5nT3BlcmF0aW9uKGFkYXB0ZXIuZ2V0RmVhdHVyZShudWxsKSk7Ci0JCQlpZiAocGVuZGluZ09wZXJhdGlvbiAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJaWYgKEluc3RhbGxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldCgiZmVhdHVyZV8iK2FkYXB0ZXIuZ2V0RmVhdHVyZShudWxsKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpID09IG51bGwpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQkJCi0JCXJldHVybiB0cnVlOwkKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlc0FjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1VuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q1YTc1OC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5JbnN0YWxsUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuT3BlcmF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy5VcGRhdGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLkNvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JRmVhdHVyZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLk9wZXJhdGlvbnNNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgVW5jb25maWd1cmVBbmRVbmluc3RhbGxGZWF0dXJlc0FjdGlvbiBleHRlbmRzIEZlYXR1cmVBY3Rpb24gewotCi0JcHJpdmF0ZSBDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXJbXSBhZGFwdGVyczsKLQotCXB1YmxpYyBVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEZlYXR1cmVzQWN0aW9uKCBTaGVsbCBzaGVsbCwgU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIoc2hlbGwsIHRleHQpOwotCQlzZXRXaW5kb3dUaXRsZShVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEFjdGlvbl9kaWFsb2dUaXRsZSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl0cnkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQkJCi0JCQlpZiAoYWRhcHRlcnMgPT0gbnVsbCB8fCAhY29uZmlybShVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEFjdGlvbl9xdWVzdGlvbikpIAotCQkJCXJldHVybjsKLQotCQkJLy8gSWYgY3VycmVudCBjb25maWcgaXMgYnJva2VuLCBjb25maXJtIHdpdGggdGhlIHVzZXIgdG8gY29udGludWUKLQkJCWlmIChPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZUN1cnJlbnRTdGF0ZSgpICE9IG51bGwgJiYKLQkJCQkJIWNvbmZpcm0oVXBkYXRlVUlNZXNzYWdlcy5BY3Rpb25zX2Jyb2tlbkNvbmZpZ1F1ZXN0aW9uKSkgCi0JCQkJcmV0dXJuOwotCQkJCi0JCQlJRmVhdHVyZVtdIGZlYXR1cmVzID0gbmV3IElGZWF0dXJlW2FkYXB0ZXJzLmxlbmd0aF07Ci0JCQlJQ29uZmlndXJlZFNpdGVbXSBjb25maWd1cmVkU2l0ZXMgPSBuZXcgSUNvbmZpZ3VyZWRTaXRlW2FkYXB0ZXJzLmxlbmd0aF07Ci0JCQlmb3IoIGludCBpID0gMDsgaSA8IGFkYXB0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZmVhdHVyZXNbaV0gPSBhZGFwdGVyc1tpXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCWNvbmZpZ3VyZWRTaXRlc1tpXSA9IGFkYXB0ZXJzW2ldLmdldENvbmZpZ3VyZWRTaXRlKCk7Ci0JCQl9Ci0KLQkJCUlPcGVyYXRpb24gdW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24gPQotCQkJCSgoT3BlcmF0aW9uRmFjdG9yeSlPcGVyYXRpb25zTWFuYWdlci5nZXRPcGVyYXRpb25GYWN0b3J5KCkpLmNyZWF0ZVVuY29uZmlndXJlQW5kVW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24oIGNvbmZpZ3VyZWRTaXRlcywgZmVhdHVyZXMpOwotCi0JCQlib29sZWFuIHJlc3RhcnROZWVkZWQgPSB1bmluc3RhbGxGZWF0dXJlc09wZXJhdGlvbi5leGVjdXRlKG51bGwsIG51bGwpOwotCQkJVXBkYXRlVUkucmVxdWVzdFJlc3RhcnQocmVzdGFydE5lZWRlZCk7Ci0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIG51bGwsIG51bGwsIGUuZ2V0U3RhdHVzKCkpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4KLQkJCVVwZGF0ZVV0aWxzLmxvZ0V4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQotCQl0aGlzLmFkYXB0ZXJzID0gKENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcltdKSBzZWxlY3Rpb24udG9MaXN0KCkudG9BcnJheShuZXcgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyW3NlbGVjdGlvbi5zaXplKCldKTsKLQkJc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkZlYXR1cmVVbmNvbmZpZ3VyZUFuZFVuaW5zdGFsbEFjdGlvbl91bmluc3RhbGwpOyAKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZUFjdGlvbigpIHsKLQkJCi0JCWlmIChhZGFwdGVycyA9PSBudWxsIHx8IGFkYXB0ZXJzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBhZGFwdGVycy5sZW5ndGg7IGkrKykgewotCQkJCi0JCQlpZiAoIWFkYXB0ZXJzW2ldLmlzQ29uZmlndXJlZCgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCQl0cnkgewotCQkJCS8vIGNoZWNrIGZvciBwZW5kaW5nIGNoYW5nZXMgKGUuZy4gaWYgdGhlIGZlYXR1cmUgaGFzIGp1c3QgYmVlbiBkaXNhYmxlZCkKLQkJCQlJRmVhdHVyZU9wZXJhdGlvbiBwZW5kaW5nT3BlcmF0aW9uID0gT3BlcmF0aW9uc01hbmFnZXIuZmluZFBlbmRpbmdPcGVyYXRpb24oYWRhcHRlcnNbaV0uZ2V0RmVhdHVyZShudWxsKSk7Ci0JCQkJaWYgKHBlbmRpbmdPcGVyYXRpb24gIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkJaWYgKEluc3RhbGxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldCgiZmVhdHVyZV8iK2FkYXB0ZXJzW2ldLmdldEZlYXR1cmUobnVsbCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSA9PSBudWxsKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkJCQotCQlyZXR1cm4gdHJ1ZTsJCi0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvVW5pbnN0YWxsRmVhdHVyZUFjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1VuaW5zdGFsbEZlYXR1cmVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA3YjVjMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvVW5pbnN0YWxsRmVhdHVyZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuSW5zdGFsbFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklGZWF0dXJlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuT3BlcmF0aW9uc01hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBVbmluc3RhbGxGZWF0dXJlQWN0aW9uIGV4dGVuZHMgRmVhdHVyZUFjdGlvbiB7Ci0JCi0JcHJpdmF0ZSBDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIgYWRhcHRlcjsKLQotCXB1YmxpYyBVbmluc3RhbGxGZWF0dXJlQWN0aW9uKFNoZWxsIHNoZWxsLCBTdHJpbmcgdGV4dCkgewotCQlzdXBlcihzaGVsbCwgdGV4dCk7Ci0JCXNldFdpbmRvd1RpdGxlKFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZVVuaW5zdGFsbEFjdGlvbl9kaWFsb2dUaXRsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl0cnkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQkJCi0JCQlpZiAoYWRhcHRlciA9PSBudWxsIHx8ICFjb25maXJtKFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZVVuaW5zdGFsbEFjdGlvbl91bmluc3RhbGxRdWVzdGlvbikpIAotCQkJCXJldHVybjsKLQotCQkJLy8gSWYgY3VycmVudCBjb25maWcgaXMgYnJva2VuLCBjb25maXJtIHdpdGggdGhlIHVzZXIgdG8gY29udGludWUKLQkJCWlmIChPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZUN1cnJlbnRTdGF0ZSgpICE9IG51bGwgJiYKLQkJCQkJIWNvbmZpcm0oVXBkYXRlVUlNZXNzYWdlcy5BY3Rpb25zX2Jyb2tlbkNvbmZpZ1F1ZXN0aW9uKSkgCi0JCQkJcmV0dXJuOwotCi0JCQlJT3BlcmF0aW9uIHVuaW5zdGFsbE9wZXJhdGlvbiA9Ci0JCQkJT3BlcmF0aW9uc01hbmFnZXIKLQkJCQkJLmdldE9wZXJhdGlvbkZhY3RvcnkoKQotCQkJCQkuY3JlYXRlVW5pbnN0YWxsT3BlcmF0aW9uKAotCQkJCQlhZGFwdGVyLmdldENvbmZpZ3VyZWRTaXRlKCksCi0JCQkJCWFkYXB0ZXIuZ2V0RmVhdHVyZShudWxsKSk7Ci0KLQkJCWJvb2xlYW4gcmVzdGFydE5lZWRlZCA9IHVuaW5zdGFsbE9wZXJhdGlvbi5leGVjdXRlKG51bGwsIG51bGwpOwotCQkJVXBkYXRlVUkucmVxdWVzdFJlc3RhcnQocmVzdGFydE5lZWRlZCk7Ci0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIG51bGwsIG51bGwsIGUuZ2V0U3RhdHVzKCkpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4KLQkJCVVwZGF0ZVV0aWxzLmxvZ0V4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJfQotCX0KLQotCi0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQotCQl0aGlzLmFkYXB0ZXIgPSAoQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCXNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlVW5pbnN0YWxsQWN0aW9uX3VuaW5zdGFsbCk7IAotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGVBY3Rpb24oKSB7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAoYWRhcHRlci5pc0NvbmZpZ3VyZWQoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCXRyeSB7Ci0JCQkvLyBjaGVjayBmb3IgcGVuZGluZyBjaGFuZ2VzIChlLmcuIGlmIHRoZSBmZWF0dXJlIGhhcyBqdXN0IGJlZW4gZGlzYWJsZWQpCi0JCQlJRmVhdHVyZU9wZXJhdGlvbiBwZW5kaW5nT3BlcmF0aW9uID0gT3BlcmF0aW9uc01hbmFnZXIuZmluZFBlbmRpbmdPcGVyYXRpb24oYWRhcHRlci5nZXRGZWF0dXJlKG51bGwpKTsKLQkJCWlmIChwZW5kaW5nT3BlcmF0aW9uICE9IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlpZiAoSW5zdGFsbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0KCJmZWF0dXJlXyIrYWRhcHRlci5nZXRGZWF0dXJlKG51bGwpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkgPT0gbnVsbCkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCQkKLQkJcmV0dXJuIHRydWU7CQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9Vbmluc3RhbGxGZWF0dXJlc0FjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1VuaW5zdGFsbEZlYXR1cmVzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMGY5YTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1VuaW5zdGFsbEZlYXR1cmVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkluc3RhbGxSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy5PcGVyYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklGZWF0dXJlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuT3BlcmF0aW9uc01hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBVbmluc3RhbGxGZWF0dXJlc0FjdGlvbiBleHRlbmRzIEZlYXR1cmVBY3Rpb24gewotCi0JcHJpdmF0ZSBDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXJbXSBhZGFwdGVyczsKLQotCXB1YmxpYyBVbmluc3RhbGxGZWF0dXJlc0FjdGlvbiggU2hlbGwgc2hlbGwsIFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHNoZWxsLCB0ZXh0KTsKLQkJc2V0V2luZG93VGl0bGUoVXBkYXRlVUlNZXNzYWdlcy5GZWF0dXJlVW5pbnN0YWxsQWN0aW9uX2RpYWxvZ1RpdGxlKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXRyeSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGxhdGZvcm1Db25maWdWYWxpZCgpOwotCQkJaWYgKHN0YXR1cyAhPSBudWxsKQotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCQkKLQkJCWlmIChhZGFwdGVycyA9PSBudWxsIHx8ICFjb25maXJtKFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZVVuaW5zdGFsbEFjdGlvbl91bmluc3RhbGxRdWVzdGlvbikpIAotCQkJCXJldHVybjsKLQotCQkJLy8gSWYgY3VycmVudCBjb25maWcgaXMgYnJva2VuLCBjb25maXJtIHdpdGggdGhlIHVzZXIgdG8gY29udGludWUKLQkJCWlmIChPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZUN1cnJlbnRTdGF0ZSgpICE9IG51bGwgJiYKLQkJCQkJIWNvbmZpcm0oVXBkYXRlVUlNZXNzYWdlcy5BY3Rpb25zX2Jyb2tlbkNvbmZpZ1F1ZXN0aW9uKSkgCi0JCQkJcmV0dXJuOwotCQkJCi0JCQlJRmVhdHVyZVtdIGZlYXR1cmVzID0gbmV3IElGZWF0dXJlW2FkYXB0ZXJzLmxlbmd0aF07Ci0JCQlJQ29uZmlndXJlZFNpdGVbXSBjb25maWd1cmVkU2l0ZXMgPSBuZXcgSUNvbmZpZ3VyZWRTaXRlW2FkYXB0ZXJzLmxlbmd0aF07Ci0JCQlmb3IoIGludCBpID0gMDsgaSA8IGFkYXB0ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZmVhdHVyZXNbaV0gPSBhZGFwdGVyc1tpXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCWNvbmZpZ3VyZWRTaXRlc1tpXSA9IGFkYXB0ZXJzW2ldLmdldENvbmZpZ3VyZWRTaXRlKCk7Ci0JCQl9Ci0KLQkJCUlPcGVyYXRpb24gdW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24gPQotCQkJCSgoT3BlcmF0aW9uRmFjdG9yeSlPcGVyYXRpb25zTWFuYWdlci5nZXRPcGVyYXRpb25GYWN0b3J5KCkpLmNyZWF0ZVVuaW5zdGFsbEZlYXR1cmVzT3BlcmF0aW9uKCBjb25maWd1cmVkU2l0ZXMsIGZlYXR1cmVzKTsKLQotCQkJYm9vbGVhbiByZXN0YXJ0TmVlZGVkID0gdW5pbnN0YWxsRmVhdHVyZXNPcGVyYXRpb24uZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJCVVwZGF0ZVVJLnJlcXVlc3RSZXN0YXJ0KHJlc3RhcnROZWVkZWQpOwotCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBudWxsLCBudWxsLCBlLmdldFN0YXR1cygpKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuCi0JCQlVcGRhdGVVdGlscy5sb2dFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCi0JCXRoaXMuYWRhcHRlcnMgPSAoQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyW10pIHNlbGVjdGlvbi50b0xpc3QoKS50b0FycmF5KG5ldyBDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXJbc2VsZWN0aW9uLnNpemUoKV0pOwotCQlzZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuRmVhdHVyZVVuaW5zdGFsbEFjdGlvbl91bmluc3RhbGwpOyAKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZUFjdGlvbigpIHsKLQkJCi0JCWlmIChhZGFwdGVycyA9PSBudWxsIHx8IGFkYXB0ZXJzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBhZGFwdGVycy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFkYXB0ZXJzW2ldLmlzQ29uZmlndXJlZCgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCQl0cnkgewotCQkJCS8vIGNoZWNrIGZvciBwZW5kaW5nIGNoYW5nZXMgKGUuZy4gaWYgdGhlIGZlYXR1cmUgaGFzIGp1c3QgYmVlbiBkaXNhYmxlZCkKLQkJCQlJRmVhdHVyZU9wZXJhdGlvbiBwZW5kaW5nT3BlcmF0aW9uID0gT3BlcmF0aW9uc01hbmFnZXIuZmluZFBlbmRpbmdPcGVyYXRpb24oYWRhcHRlcnNbaV0uZ2V0RmVhdHVyZShudWxsKSk7Ci0JCQkJaWYgKHBlbmRpbmdPcGVyYXRpb24gIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkJaWYgKEluc3RhbGxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldCgiZmVhdHVyZV8iK2FkYXB0ZXJzW2ldLmdldEZlYXR1cmUobnVsbCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSA9PSBudWxsKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkJCQotCQlyZXR1cm4gdHJ1ZTsJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvQWN0aXZpdGllc1RhYmxlVmlld2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9BY3Rpdml0aWVzVGFibGVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE3ODk0Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9BY3Rpdml0aWVzVGFibGVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy4qOwotCi0KLS8qKgotICogVmlld2VyIGZvciBjb25maWd1cmF0aW9uIGFjdGl2aXRpZXMKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXRpZXNUYWJsZVZpZXdlcnsKLQotCXByaXZhdGUgc3RhdGljIEluc3RhbGxMb2dQYXJzZXIgcGFyc2VyOyAKLQkKLQlzdGF0aWMgY2xhc3MgQWN0aXZpdGllc0NvbnRlbnRQcm92aWRlcgotCQlleHRlbmRzIERlZmF1bHRDb250ZW50UHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JCQotCQlwcml2YXRlIGJvb2xlYW4gc2hvd0N1cnJlbnRPbmx5OwotCQkKLQkJcHVibGljIEFjdGl2aXRpZXNDb250ZW50UHJvdmlkZXIoYm9vbGVhbiBzaG93Q3VycmVudE9ubHkpewotCQkJdGhpcy5zaG93Q3VycmVudE9ubHkgPSBzaG93Q3VycmVudE9ubHk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotCQkJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IChJbnN0YWxsQ29uZmlndXJhdGlvbillbGVtZW50OwotCQkJSW5zdGFsbENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gcGFyc2VyLmdldENvbmZpZ3VyYXRpb25zKCk7Ci0JCQlib29sZWFuIGhpdEN1cnJlbnRDb25maWcgPSBmYWxzZTsKLQkJCUFycmF5TGlzdCBhY3Rpdml0aWVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpPGNvbmZpZ3MubGVuZ3RoOyBpKyspewotCQkJCWlmIChjb25maWdzW2ldLmVxdWFscyhjdXJyZW50Q29uZmlnKSAmJiAhaGl0Q3VycmVudENvbmZpZykKLQkJCQkJaGl0Q3VycmVudENvbmZpZyA9IHRydWU7Ci0JCQkJaWYgKGhpdEN1cnJlbnRDb25maWcgJiYgc2hvd0N1cnJlbnRPbmx5KQotCQkJCQlyZXR1cm4gY29uZmlnc1tpXS5nZXRBY3Rpdml0aWVzKCk7Ci0JCQkJZWxzZSBpZiAoaGl0Q3VycmVudENvbmZpZyl7Ci0JCQkJCUlBY3Rpdml0eVtdIGFjdGl2aXRpZXMgPSBjb25maWdzW2ldLmdldEFjdGl2aXRpZXMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGo8YWN0aXZpdGllcy5sZW5ndGg7IGorKykKLQkJCQkJCWFjdGl2aXRpZXNMaXN0LmFkZChhY3Rpdml0aWVzW2pdKTsJCi0JCQkJfQotCQkJCQotCQkJfQotCQkJcmV0dXJuIChJQWN0aXZpdHlbXSlhY3Rpdml0aWVzTGlzdC50b0FycmF5KG5ldyBJQWN0aXZpdHlbYWN0aXZpdGllc0xpc3Quc2l6ZSgpXSk7Ci0JCX0KLQkJCi0JfQotCi0Jc3RhdGljIGNsYXNzIEFjdGl2aXRpZXNMYWJlbFByb3ZpZGVyCi0JCWV4dGVuZHMgTGFiZWxQcm92aWRlcgotCQlpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJaWYgKGNvbHVtbkluZGV4ID09IDApIHsKLQkJCQlVcGRhdGVMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0KLQkJCQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJCQlzd2l0Y2ggKCgoSUFjdGl2aXR5KSBlbGVtZW50KS5nZXRTdGF0dXMoKSkgewotCQkJCQljYXNlIElBY3Rpdml0eS5TVEFUVVNfT0sgOgotCQkJCQkJcmV0dXJuIHByb3ZpZGVyLmdldChVcGRhdGVVSUltYWdlcy5ERVNDX09LX1NUX09CSiwgMCk7Ci0JCQkJCWNhc2UgSUFjdGl2aXR5LlNUQVRVU19OT0sgOgotCQkJCQkJcmV0dXJuIHByb3ZpZGVyLmdldChVcGRhdGVVSUltYWdlcy5ERVNDX0VSUl9TVF9PQkosIDApOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCUlBY3Rpdml0eSBhY3Rpdml0eSA9IChJQWN0aXZpdHkpIGVsZW1lbnQ7Ci0JCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJcmV0dXJuIFV0aWxpdGllcy5mb3JtYXQoYWN0aXZpdHkuZ2V0RGF0ZSgpKTsKLQkJCQljYXNlIDIgOgotCQkJCQlyZXR1cm4gYWN0aXZpdHkuZ2V0TGFiZWwoKTsKLQkJCQljYXNlIDMgOgotCQkJCQlyZXR1cm4gZ2V0QWN0aW9uTGFiZWwoYWN0aXZpdHkpOwotCQkJfQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwcml2YXRlIFN0cmluZyBnZXRBY3Rpb25MYWJlbChJQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJCWludCBhY3Rpb24gPSBhY3Rpdml0eS5nZXRBY3Rpb24oKTsKLQkJCXN3aXRjaCAoYWN0aW9uKSB7Ci0JCQkJY2FzZSBJQWN0aXZpdHkuQUNUSU9OX0NPTkZJR1VSRSA6Ci0JCQkJCXJldHVybiBVcGRhdGVVSU1lc3NhZ2VzLkFjdGl2aXRpZXNUYWJsZVZpZXdlcl9lbmFibGVkOyAKLQkJCQljYXNlIElBY3Rpdml0eS5BQ1RJT05fRkVBVFVSRV9JTlNUQUxMIDoKLQkJCQkJcmV0dXJuIFVwZGF0ZVVJTWVzc2FnZXMuQWN0aXZpdGllc1RhYmxlVmlld2VyX2ZlYXR1cmVJbnN0YWxsZWQ7IAotCQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9GRUFUVVJFX1JFTU9WRSA6Ci0JCQkJCXJldHVybiBVcGRhdGVVSU1lc3NhZ2VzLkFjdGl2aXRpZXNUYWJsZVZpZXdlcl9mZWF0dXJlUmVtb3ZlZDsgCi0JCQkJY2FzZSBJQWN0aXZpdHkuQUNUSU9OX1NJVEVfSU5TVEFMTCA6Ci0JCQkJCXJldHVybiBVcGRhdGVVSU1lc3NhZ2VzLkFjdGl2aXRpZXNUYWJsZVZpZXdlcl9zaXRlSW5zdGFsbGVkOyAKLQkJCQljYXNlIElBY3Rpdml0eS5BQ1RJT05fU0lURV9SRU1PVkUgOgotCQkJCQlyZXR1cm4gVXBkYXRlVUlNZXNzYWdlcy5BY3Rpdml0aWVzVGFibGVWaWV3ZXJfc2l0ZVJlbW92ZWQ7IAotCQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9VTkNPTkZJR1VSRSA6Ci0JCQkJCXJldHVybiBVcGRhdGVVSU1lc3NhZ2VzLkFjdGl2aXRpZXNUYWJsZVZpZXdlcl9kaXNhYmxlZDsgCi0JCQkJY2FzZSBJQWN0aXZpdHkuQUNUSU9OX1JFVkVSVCA6Ci0JCQkJCXJldHVybiBVcGRhdGVVSU1lc3NhZ2VzLkFjdGl2aXRpZXNUYWJsZVZpZXdlcl9yZXZlcnQ7IAotCQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9SRUNPTkNJTElBVElPTiA6Ci0JCQkJCXJldHVybiBVcGRhdGVVSU1lc3NhZ2VzLkFjdGl2aXRpZXNUYWJsZVZpZXdlcl9yZWNvbmNpbGU7IAotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gVXBkYXRlVUlNZXNzYWdlcy5BY3Rpdml0aWVzVGFibGVWaWV3ZXJfdW5rbm93bjsgCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRhYmxlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIHNob3dDdXJyZW50T25seSkgewotCQlwYXJzZXIgPSBuZXcgSW5zdGFsbExvZ1BhcnNlcigpOwotCQlwYXJzZXIucGFyc2VJbnN0YWxsYXRpb25Mb2coKTsKLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0KLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuQWN0aXZpdGllc1RhYmxlVmlld2VyX2RhdGUpOyAKLQotCQljb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5BY3Rpdml0aWVzVGFibGVWaWV3ZXJfdGFyZ2V0KTsgCi0KLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuQWN0aXZpdGllc1RhYmxlVmlld2VyX2FjdGlvbik7IAotCi0JCVRhYmxlVmlld2VyIGFjdGl2aXRpZXNWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQlhY3Rpdml0aWVzVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFjdGl2aXRpZXNMYWJlbFByb3ZpZGVyKCkpOwotCQlhY3Rpdml0aWVzVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWN0aXZpdGllc0NvbnRlbnRQcm92aWRlcihzaG93Q3VycmVudE9ubHkpKTsKLQkJcmV0dXJuIGFjdGl2aXRpZXNWaWV3ZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9CYW5uZXJQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9CYW5uZXJQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MWRkMDQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvQmFubmVyUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhbm5lclBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQlwcml2YXRlIEltYWdlIGJhbm5lckltYWdlOwotCXByaXZhdGUgYm9vbGVhbiBiYW5uZXJWaXNpYmxlID0gZmFsc2U7Ci0JcHVibGljIEJhbm5lclBhZ2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjbGllbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMTA7Ci0JCWNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlpZiAoYmFubmVyVmlzaWJsZSkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY2xpZW50LCBTV1QuTlVMTCk7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJCWxhYmVsLnNldEltYWdlKGdldEJhbm5lckltYWdlKCkpOwotCQl9Ci0KLQkJQ29udHJvbCBjb250ZW50cyA9IGNyZWF0ZUNvbnRlbnRzKGNsaWVudCk7Ci0JCWNvbnRlbnRzLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlzZXRDb250cm9sKGNsaWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QmFubmVyVmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJdGhpcy5iYW5uZXJWaXNpYmxlID0gdmlzaWJsZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNCYW5uZWRWaXNpYmxlKCkgewotCQlyZXR1cm4gYmFubmVyVmlzaWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVVJMIGdldEJhbm5lckltYWdlVVJMKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHJpdmF0ZSBJbWFnZSBnZXRCYW5uZXJJbWFnZSgpIHsKLQkJVVJMIGltYWdlVVJMID0gZ2V0QmFubmVySW1hZ2VVUkwoKTsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlpZiAoaW1hZ2VVUkwgPT0gbnVsbCkgewotCQkJLy8gdXNlIGRlZmF1bHQKLQkJCWJhbm5lckltYWdlID0KLQkJCQlVcGRhdGVVSUltYWdlcy5ERVNDX0lOU1RBTExfQkFOTkVSLmNyZWF0ZUltYWdlKCk7Ci0JCQlpbWFnZSA9IGJhbm5lckltYWdlOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoYmFubmVySW1hZ2UgIT0gbnVsbCkgewotCQkJYmFubmVySW1hZ2UuZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KTsKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0NvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9Db250YWluZXJDaGVja2VkVHJlZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGYwNjU2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0NvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZVZpZXdlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZUV4cGFuc2lvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLQotLyoqCi0gKiBDb3BpZWQgZnJvbSB1aSBpbnRlcm5hbCBwYWNrYWdlLgotICogCi0gKiBDaGVja2JveFRyZWVWaWV3ZXIgd2l0aCBzcGVjaWFsIGJlaGF2aW91ciBvZiB0aGUgY2hlY2tlZCAvIGdyYXkgc3RhdGUgb24gCi0gKiBjb250YWluZXIgKG5vbi1sZWFmKSBub2RlczoKLSAqIFRoZSBncmF5ZWQgc3RhdGUgaXMgdXNlZCB0byB2aXN1YWxpemUgdGhlIGNoZWNrZWQgc3RhdGUgb2YgaXRzIGNoaWxkcmVuLgotICogQ29udGFpbmVycyBhcmUgY2hlY2tlZCBhbmQgbm9uLWdhcnkgaWYgYWxsIGNvbnRhaW5lZCBsZWFmcyBhcmUgY2hlY2tlZC4gVGhlCi0gKiBjb250YWluZXIgaXMgZ3JheWVkIGlmIHNvbWUgYnV0IG5vdCBhbGwgbGVhZnMgYXJlIGNoZWNrZWQuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyIGV4dGVuZHMgQ2hlY2tib3hUcmVlVmlld2VyIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBDb250YWluZXJDaGVja2VkVHJlZVZpZXdlci4KLSAgICAgKiBAc2VlIENoZWNrYm94VHJlZVZpZXdlciNDaGVja2JveFRyZWVWaWV3ZXIoQ29tcG9zaXRlLGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgc3R5bGUpOwotICAgICAgICBpbml0Vmlld2VyKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRWaWV3ZXIoKSB7Ci0gICAgICAgIHNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0gICAgICAgIGFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBkb0NoZWNrU3RhdGVDaGFuZ2VkKGV2ZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBhZGRUcmVlTGlzdGVuZXIobmV3IElUcmVlVmlld2VyTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB0cmVlQ29sbGFwc2VkKFRyZWVFeHBhbnNpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB0cmVlRXhwYW5kZWQoVHJlZUV4cGFuc2lvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgV2lkZ2V0IGl0ZW0gPSBmaW5kSXRlbShldmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgVHJlZUl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUl0ZW0oKFRyZWVJdGVtKSBpdGVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGRvQ2hlY2tTdGF0ZUNoYW5nZWQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgV2lkZ2V0IGl0ZW0gPSBmaW5kSXRlbShlbGVtZW50KTsKLSAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUcmVlSXRlbSkgewotICAgICAgICAgICAgVHJlZUl0ZW0gdHJlZUl0ZW0gPSAoVHJlZUl0ZW0pIGl0ZW07Ci0gICAgICAgICAgICB0cmVlSXRlbS5zZXRHcmF5ZWQoZmFsc2UpOwotICAgICAgICAgICAgdXBkYXRlQ2hpbGRyZW5JdGVtcyh0cmVlSXRlbSk7Ci0gICAgICAgICAgICB1cGRhdGVQYXJlbnRJdGVtcyh0cmVlSXRlbS5nZXRQYXJlbnRJdGVtKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIGl0ZW0gaGFzIGV4cGFuZGVkLiBVcGRhdGVzIHRoZSBjaGVja2VkIHN0YXRlIG9mIGl0cyBjaGlsZHJlbi4gCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVJdGVtKFRyZWVJdGVtIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0uZ2V0Q2hlY2tlZCgpICYmICFpdGVtLmdldEdyYXllZCgpKSB7Ci0gICAgICAgICAgICB1cGRhdGVDaGlsZHJlbkl0ZW1zKGl0ZW0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgY2hlY2sgc3RhdGUgb2YgYWxsIGNyZWF0ZWQgY2hpbGRyZW4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDaGlsZHJlbkl0ZW1zKFRyZWVJdGVtIHBhcmVudCkgewotICAgICAgICBJdGVtW10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihwYXJlbnQpOwotICAgICAgICBib29sZWFuIHN0YXRlID0gcGFyZW50LmdldENoZWNrZWQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgVHJlZUl0ZW0gY3VyciA9IChUcmVlSXRlbSkgY2hpbGRyZW5baV07Ci0gICAgICAgICAgICBpZiAoY3Vyci5nZXREYXRhKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiAoKGN1cnIuZ2V0Q2hlY2tlZCgpICE9IHN0YXRlKSB8fCBjdXJyLmdldEdyYXllZCgpKSkgewotICAgICAgICAgICAgICAgIGN1cnIuc2V0Q2hlY2tlZChzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgY3Vyci5zZXRHcmF5ZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHVwZGF0ZUNoaWxkcmVuSXRlbXMoY3Vycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBjaGVjayAvIGdyYXkgc3RhdGUgb2YgYWxsIHBhcmVudCBpdGVtcwotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQYXJlbnRJdGVtcyhUcmVlSXRlbSBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZW1bXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKGl0ZW0pOwotICAgICAgICAgICAgYm9vbGVhbiBjb250YWluc0NoZWNrZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gY29udGFpbnNVbmNoZWNrZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBUcmVlSXRlbSBjdXJyID0gKFRyZWVJdGVtKSBjaGlsZHJlbltpXTsKLSAgICAgICAgICAgICAgICBjb250YWluc0NoZWNrZWQgfD0gY3Vyci5nZXRDaGVja2VkKCk7Ci0gICAgICAgICAgICAgICAgY29udGFpbnNVbmNoZWNrZWQgfD0gKCFjdXJyLmdldENoZWNrZWQoKSB8fCBjdXJyLmdldEdyYXllZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGl0ZW0uc2V0Q2hlY2tlZChjb250YWluc0NoZWNrZWQpOwotICAgICAgICAgICAgaXRlbS5zZXRHcmF5ZWQoY29udGFpbnNDaGVja2VkICYmIGNvbnRhaW5zVW5jaGVja2VkKTsKLSAgICAgICAgICAgIHVwZGF0ZVBhcmVudEl0ZW1zKGl0ZW0uZ2V0UGFyZW50SXRlbSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBJQ2hlY2thYmxlI3NldENoZWNrZWQoT2JqZWN0LCBib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNldENoZWNrZWQoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gc3RhdGUpIHsKLSAgICAgICAgaWYgKHN1cGVyLnNldENoZWNrZWQoZWxlbWVudCwgc3RhdGUpKSB7Ci0gICAgICAgICAgICBkb0NoZWNrU3RhdGVDaGFuZ2VkKGVsZW1lbnQpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBDaGVja2JveFRyZWVWaWV3ZXIjc2V0Q2hlY2tlZEVsZW1lbnRzKE9iamVjdFtdKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENoZWNrZWRFbGVtZW50cyhPYmplY3RbXSBlbGVtZW50cykgewotICAgICAgICBzdXBlci5zZXRDaGVja2VkRWxlbWVudHMoZWxlbWVudHMpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBkb0NoZWNrU3RhdGVDaGFuZ2VkKGVsZW1lbnRzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQHNlZSBBYnN0cmFjdFRyZWVWaWV3ZXIjc2V0RXhwYW5kZWQoSXRlbSwgYm9vbGVhbikKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRFeHBhbmRlZChJdGVtIGl0ZW0sIGJvb2xlYW4gZXhwYW5kKSB7Ci0gICAgICAgIHN1cGVyLnNldEV4cGFuZGVkKGl0ZW0sIGV4cGFuZCk7Ci0gICAgICAgIGlmIChleHBhbmQgJiYgaXRlbSBpbnN0YW5jZW9mIFRyZWVJdGVtKSB7Ci0gICAgICAgICAgICBpbml0aWFsaXplSXRlbSgoVHJlZUl0ZW0pIGl0ZW0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBAc2VlIENoZWNrYm94VHJlZVZpZXdlciNnZXRDaGVja2VkRWxlbWVudHMoKQotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGVja2VkRWxlbWVudHMoKSB7Ci0gICAgICAgIE9iamVjdFtdIGNoZWNrZWQgPSBzdXBlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLSAgICAgICAgLy8gYWRkIGFsbCBpdGVtcyB0aGF0IGFyZSBjaGlsZHJlbiBvZiBhIGNoZWNrZWQgbm9kZSBidXQgbm90IGNyZWF0ZWQgeWV0Ci0gICAgICAgIEFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2tlZC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgT2JqZWN0IGN1cnIgPSBjaGVja2VkW2ldOwotICAgICAgICAgICAgcmVzdWx0LmFkZChjdXJyKTsKLSAgICAgICAgICAgIFdpZGdldCBpdGVtID0gZmluZEl0ZW0oY3Vycik7Ci0gICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSXRlbVtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oaXRlbSk7Ci0gICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgY29udGFpbnMgdGhlIGR1bW15IG5vZGUKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09IDEgJiYgY2hpbGRyZW5bMF0uZ2V0RGF0YSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbm90IHlldCBjcmVhdGVkCi0gICAgICAgICAgICAgICAgICAgIGNvbGxlY3RDaGlsZHJlbihjdXJyLCByZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0LnRvQXJyYXkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29sbGVjdENoaWxkcmVuKE9iamVjdCBlbGVtZW50LCBBcnJheUxpc3QgcmVzdWx0KSB7Ci0gICAgICAgIE9iamVjdFtdIGZpbHRlcmVkQ2hpbGRyZW4gPSBnZXRGaWx0ZXJlZENoaWxkcmVuKGVsZW1lbnQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcmVkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIE9iamVjdCBjdXJyID0gZmlsdGVyZWRDaGlsZHJlbltpXTsKLSAgICAgICAgICAgIHJlc3VsdC5hZGQoY3Vycik7Ci0gICAgICAgICAgICBjb2xsZWN0Q2hpbGRyZW4oY3VyciwgcmVzdWx0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNoaWxkcmVuKGZpbmFsIFdpZGdldCB3aWRnZXQpIHsKLSAgICAJc3VwZXIuY3JlYXRlQ2hpbGRyZW4od2lkZ2V0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9EdXBsaWNhdGVDb25mbGljdHNEaWFsb2cuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0R1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjM4NThhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0R1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLio7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEdXBsaWNhdGVDb25mbGljdHNEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nIHsKLQotCXByaXZhdGUgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCXByaXZhdGUgQXJyYXlMaXN0IGNvbmZsaWN0czsKLQotCWNsYXNzIENvbmZsaWN0Q29udGVudFByb3ZpZGVyCi0JCWV4dGVuZHMgRGVmYXVsdENvbnRlbnRQcm92aWRlcgotCQlpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyLCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXQpIHsKLQkJCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGNoaWxkKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQXJyYXlMaXN0KQotCQkJCXJldHVybiB0cnVlOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQXJyYXlMaXN0KQotCQkJCXJldHVybiAoKEFycmF5TGlzdCkgcGFyZW50KS50b0FycmF5KCk7Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJfQotCX0KLQotCWNsYXNzIENvbmZsaWN0TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFycmF5TGlzdCkgewotCQkJCUFycmF5TGlzdCBsaXN0ID0gKEFycmF5TGlzdCkgb2JqOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCQlEdXBsaWNhdGVDb25mbGljdHNWYWxpZGF0b3IuSWRFbnRyeSBlbnRyeSA9Ci0JCQkJCQkoRHVwbGljYXRlQ29uZmxpY3RzVmFsaWRhdG9yLklkRW50cnkpIChsaXN0KS5nZXQoaSk7Ci0JCQkJCWlmIChlbnRyeS5pc0luc3RhbGxDYW5kaWRhdGUoKSkKLQkJCQkJCXJldHVybiBlbnRyeS5nZXRGZWF0dXJlKCkuZ2V0TGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmopOwotCQl9Ci0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7Ci0JCQlpbnQgZmxhZ3MgPSAwOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFycmF5TGlzdCkKLQkJCQlmbGFncyA9IFVwZGF0ZUxhYmVsUHJvdmlkZXIuRl9XQVJOSU5HOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIER1cGxpY2F0ZUNvbmZsaWN0c1ZhbGlkYXRvci5JZEVudHJ5Ci0JCQkJfHwgb2JqIGluc3RhbmNlb2YgQXJyYXlMaXN0KQotCQkJCXJldHVybiBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmdldCgKLQkJCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19GRUFUVVJFX09CSiwKLQkJCQkJZmxhZ3MpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nKFNoZWxsIHNoZWxsLCBBcnJheUxpc3QgY29uZmxpY3RzKSB7Ci0JCXN1cGVyKAotCQkJc2hlbGwsCi0JCQlVcGRhdGVVSU1lc3NhZ2VzLkR1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZ190aXRsZSwgCi0JCQludWxsLAotCQkJVXBkYXRlVUlNZXNzYWdlcy5EdXBsaWNhdGVDb25mbGljdHNEaWFsb2dfbWVzc2FnZSwgCi0JCQlXQVJOSU5HLAotCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMIH0sCi0JCQkwKTsKLQkJdGhpcy5jb25mbGljdHMgPSBjb25mbGljdHM7Ci0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuY29ubmVjdCh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5kaXNjb25uZWN0KHRoaXMpOwotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDdXN0b21BcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNsaWVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNsaWVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljbGllbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY2xpZW50LCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5EdXBsaWNhdGVDb25mbGljdHNEaWFsb2dfdHJlZUxhYmVsKTsgCi0KLQkJdHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGNsaWVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC5oZWlnaHRIaW50ID0gMjAwOwotCQlnZC53aWR0aEhpbnQgPSAzMDA7Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEoZ2QpOwotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQ29uZmxpY3RDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQ29uZmxpY3RMYWJlbFByb3ZpZGVyKCkpOwotCQl0cmVlVmlld2VyLnNldEF1dG9FeHBhbmRMZXZlbCgxMCk7Ci0JCXRyZWVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7Ci0JCX0pOwotCQl0cmVlVmlld2VyLnNldElucHV0KGNvbmZsaWN0cyk7Ci0JCXJldHVybiBjbGllbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9FZGl0U2l0ZURpYWxvZy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvRWRpdFNpdGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc3YTY5Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9FZGl0U2l0ZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuU2l0ZUJvb2ttYXJrOwotCi0KLXB1YmxpYyBjbGFzcyBFZGl0U2l0ZURpYWxvZyBleHRlbmRzIE5ld1VwZGF0ZVNpdGVEaWFsb2cgewotCVNpdGVCb29rbWFyayBib29rbWFyazsKLQlwcml2YXRlIGludCBpZ25vcmVCb29rbWFyayA9IC0xOwotCi0JcHVibGljIEVkaXRTaXRlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTaXRlQm9va21hcmsgYm9va21hcmssIFNpdGVCb29rbWFya1tdIHNpdGVCb29rbWFya3MpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIHNpdGVCb29rbWFya3MpOwotCQl0aGlzLmJvb2ttYXJrID0gYm9va21hcms7Ci0JCWlnbm9yZUJvb2ttYXJrKHNpdGVCb29rbWFya3MpOwotCX0KLQotCXB1YmxpYyBFZGl0U2l0ZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU2l0ZUJvb2ttYXJrIGJvb2ttYXJrLCBTaXRlQm9va21hcmtbXSBzaXRlQm9va21hcmtzLCBib29sZWFuIGVuYWJsZU9LKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBlbmFibGVPSywgc2l0ZUJvb2ttYXJrcyk7Ci0JCXRoaXMuYm9va21hcmsgPSBib29rbWFyazsKLQkJaWdub3JlQm9va21hcmsoc2l0ZUJvb2ttYXJrcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZpZWxkcygpIHsKLQkJbmFtZS5zZXRUZXh0KGJvb2ttYXJrLmdldE5hbWUoKSk7Ci0JCXVybC5zZXRUZXh0KGJvb2ttYXJrLmdldFVSTCgpLnRvU3RyaW5nKCkpOwotCQl1cmwuc2V0RWRpdGFibGUoIWJvb2ttYXJrLmlzTG9jYWwoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkgewotCQl0cnkgewotCQkJYm9va21hcmsuc2V0TmFtZShuYW1lLmdldFRleHQoKSk7Ci0JCQlib29rbWFyay5zZXRVUkwobmV3IFVSTCh1cmwuZ2V0VGV4dCgpKSk7Ci0JCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKS5maXJlT2JqZWN0Q2hhbmdlZChib29rbWFyaywgbnVsbCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGlnbm9yZUJvb2ttYXJrKCBTaXRlQm9va21hcmtbXSBzaXRlQm9va21hcmtzKSB7Ci0JCQotCQlmb3IoIGludCBpID0gMDsgaSA8IHNpdGVCb29rbWFya3MubGVuZ3RoOyBpKyspIHsKLQotCQkJaWYgKHNpdGVCb29rbWFya3NbaV0uZ2V0TGFiZWwoKS5lcXVhbHMoYm9va21hcmsuZ2V0TGFiZWwoKS50cmltKCkpICYmCi0JCQkJc2l0ZUJvb2ttYXJrc1tpXS5nZXRVUkwoKS5lcXVhbHMoYm9va21hcmsuZ2V0VVJMKCkpKSB7CQotCQkJCWlnbm9yZUJvb2ttYXJrID0gaTsJCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDdXJyZW50bHlFZGl0ZWRTaXRlQm9va21hcmsoIGludCBpbmRleCkgewotCQkKLQkJcmV0dXJuIGluZGV4ID09IGlnbm9yZUJvb2ttYXJrOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0ZlYXR1cmVTb3J0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0ZlYXR1cmVTb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVhYjJlYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9GZWF0dXJlU29ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi1wdWJsaWMgY2xhc3MgRmVhdHVyZVNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9WRVJTSU9OID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX0xBQkVMID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX1BST1ZJREVSID0gMzsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU0NFTkRJTkcgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFU0NFTkRJTkcgPSAtMTsKLQkKLQlwcml2YXRlIGludCBrZXkgPSBGRUFUVVJFX0xBQkVMOwotCXByaXZhdGUgaW50IGxhYmVsT3JkZXI7Ci0JcHJpdmF0ZSBpbnQgdmVyc2lvbk9yZGVyOwotCXByaXZhdGUgaW50IHByb3ZpZGVyT3JkZXI7Ci0JCi0JcHVibGljIEZlYXR1cmVTb3J0ZXIoaW50IGtleSwgaW50IGxhYmVsT3JkZXIsIGludCB2ZXJzaW9uT3JkZXIsIGludCBwcm92aWRlck9yZGVyKSB7Ci0JCXRoaXMua2V5ID0ga2V5OwotCQl0aGlzLmxhYmVsT3JkZXIgPSBsYWJlbE9yZGVyOwotCQl0aGlzLnZlcnNpb25PcmRlciA9IHZlcnNpb25PcmRlcjsKLQkJdGhpcy5wcm92aWRlck9yZGVyID0gcHJvdmlkZXJPcmRlcjsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJaWYgKCEoZTEgaW5zdGFuY2VvZiBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pCi0JCQl8fCAhKGUyIGluc3RhbmNlb2YgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSkKLQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgZTEsIGUyKTsKLQkJCQotCQlJRmVhdHVyZSBmMSA9ICgoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKWUxKS5nZXRGZWF0dXJlKCk7Ci0JCUlGZWF0dXJlIGYyID0gKChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pZTIpLmdldEZlYXR1cmUoKTsKLQkJCi0JCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIHYxID0gZjEuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKTsKLQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgdjIgPSBmMi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpOwotCQkKLQkJU3RyaW5nIGxhYmVsMSA9IGYxLmdldExhYmVsKCkgPT0gbnVsbCA/ICIiIDogZjEuZ2V0TGFiZWwoKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbGFiZWwyID0gZjIuZ2V0TGFiZWwoKSA9PSBudWxsID8gIiIgOiBmMi5nZXRMYWJlbCgpOyAvLyROT04tTkxTLTEkCi0JCQotCQlTdHJpbmcgcHJvdmlkZXIxID0gZjEuZ2V0UHJvdmlkZXIoKSA9PSBudWxsID8gIiIgOiBmMS5nZXRQcm92aWRlcigpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBwcm92aWRlcjIgPSBmMi5nZXRQcm92aWRlcigpID09IG51bGwgPyAiIiA6IGYyLmdldFByb3ZpZGVyKCk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWludCByZXN1bHQgPSAwOwotCQlpZiAoa2V5ID09IEZFQVRVUkVfVkVSU0lPTikgewotCQkJcmVzdWx0ID0gY29tcGFyZVZlcnNpb25zKHYxLCB2MikgKiB2ZXJzaW9uT3JkZXI7Ci0JCQlpZiAocmVzdWx0ID09IDApIHsKLQkJCQlyZXN1bHQgPSBjb2xsYXRvci5jb21wYXJlKGxhYmVsMSwgbGFiZWwyKSAqIGxhYmVsT3JkZXI7Ci0JCQkJaWYgKHJlc3VsdCA9PSAwKQotCQkJCQlyZXN1bHQgPSBjb2xsYXRvci5jb21wYXJlKHByb3ZpZGVyMSwgcHJvdmlkZXIyKSAqIHByb3ZpZGVyT3JkZXI7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoa2V5ID09IEZFQVRVUkVfTEFCRUwpIHsKLQkJCXJlc3VsdCA9IGNvbGxhdG9yLmNvbXBhcmUobGFiZWwxLCBsYWJlbDIpICogbGFiZWxPcmRlcjsKLQkJCWlmIChyZXN1bHQgPT0gMCkgewotCQkJCXJlc3VsdCA9IGNvbXBhcmVWZXJzaW9ucyh2MSwgdjIpICogdmVyc2lvbk9yZGVyOwotCQkJCWlmIChyZXN1bHQgPT0gMCkKLQkJCQkJcmVzdWx0ID0gY29sbGF0b3IuY29tcGFyZShwcm92aWRlcjEsIHByb3ZpZGVyMikgKiBwcm92aWRlck9yZGVyOwotCQkJfQotCQl9IGVsc2UgaWYgKGtleSA9PSBGRUFUVVJFX1BST1ZJREVSKSB7Ci0JCQlyZXN1bHQgPSBjb2xsYXRvci5jb21wYXJlKHByb3ZpZGVyMSwgcHJvdmlkZXIyKSAqIHByb3ZpZGVyT3JkZXI7Ci0JCQlpZiAocmVzdWx0ID09IDApIHsKLQkJCQlyZXN1bHQgPSBjb2xsYXRvci5jb21wYXJlKGxhYmVsMSwgbGFiZWwyKSAqIGxhYmVsT3JkZXI7Ci0JCQkJaWYgKHJlc3VsdCA9PSAwKQotCQkJCQlyZXN1bHQgPSBjb21wYXJlVmVyc2lvbnModjEsIHYyKSAqIHZlcnNpb25PcmRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIGludCBjb21wYXJlVmVyc2lvbnMoUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgdjEsIFBsdWdpblZlcnNpb25JZGVudGlmaWVyIHYyKSB7Ci0JCWlmICh2MS5lcXVhbHModjIpKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiB2Mi5pc0dyZWF0ZXJUaGFuKHYxKSA/IC0xIDogMTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9JRHluYW1pY1BhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0lEeW5hbWljUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYThiYWQ0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0lEeW5hbWljUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi0vKioKLSAqICBBIGR5bmFtaWMgcGFnZSBpbiB0aGUgaW5zdGFsbCB3aXphcmQKLSAqLwotcHVibGljIGludGVyZmFjZSBJRHluYW1pY1BhZ2UgewotCXB1YmxpYyB2b2lkIHNldEpvYnMoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIFtdIGpvYnMpOwotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9JU2VhcmNoUHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0lTZWFyY2hQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmYzMmNkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0lTZWFyY2hQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC5VcGRhdGVTZWFyY2hSZXF1ZXN0OwotCi0vKioKLSAqIEEgc2VhcmNoIHJlcXVlc3QgcHJvdmlkZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2VhcmNoUHJvdmlkZXIgewotCVVwZGF0ZVNlYXJjaFJlcXVlc3QgZ2V0U2VhcmNoUmVxdWVzdCgpOwotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvSW5zdGFsbFdpemFyZC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvSW5zdGFsbFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWUwOTkzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0luc3RhbGxXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlYXJjaC5TaXRlU2VhcmNoQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLkJhY2tMZXZlbEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLlVwZGF0ZVNlYXJjaFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC5VcGRhdGVTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuVXBkYXRlSm9iOwotCi1wdWJsaWMgY2xhc3MgSW5zdGFsbFdpemFyZAotCWV4dGVuZHMgV2l6YXJkCi0JaW1wbGVtZW50cyBJU2VhcmNoUHJvdmlkZXIgewotCXByaXZhdGUgTW9kZVNlbGVjdGlvblBhZ2UgbW9kZVBhZ2U7Ci0JcHJpdmF0ZSBTaXRlUGFnZSBzaXRlUGFnZTsKLQlwcml2YXRlIGludCBpbnN0YWxsQ291bnQgPSAwOwotCXByaXZhdGUgVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0OwotCXByaXZhdGUgYm9vbGVhbiBuZWVkc1Jlc3RhcnQ7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1J1bm5pbmc7Ci0JcHJpdmF0ZSBVcGRhdGVKb2Igam9iOwotCXByaXZhdGUgSW5zdGFsbFdpemFyZE9wZXJhdGlvbiBvcGVyYXRpb247Ci0KLQotCXB1YmxpYyBJbnN0YWxsV2l6YXJkKFVwZGF0ZVNlYXJjaFJlcXVlc3Qgc2VhcmNoUmVxdWVzdCkgewotCQlpc1J1bm5pbmcgPSB0cnVlOwotICAgICAgICBpZiAoc2VhcmNoUmVxdWVzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZWFyY2hSZXF1ZXN0ID0KLSAgICAgICAgICAgICAgICBuZXcgVXBkYXRlU2VhcmNoUmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFNpdGVTZWFyY2hDYXRlZ29yeSh0cnVlKSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFVwZGF0ZVNlYXJjaFNjb3BlKCkpOwotICAgICAgICAgICAgc2VhcmNoUmVxdWVzdC5hZGRGaWx0ZXIobmV3IEJhY2tMZXZlbEZpbHRlcigpKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnNlYXJjaFJlcXVlc3QgPSBzZWFyY2hSZXF1ZXN0OwotCQlzZXREaWFsb2dTZXR0aW5ncyhVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKFVwZGF0ZVVJSW1hZ2VzLkRFU0NfVVBEQVRFX1dJWik7Ci0JCXNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKLQkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JCXNldFdpbmRvd1RpdGxlKFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF93dGl0bGUpOyAKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc3RhcnROZWVkZWQoKSB7Ci0JCXJldHVybiBpbnN0YWxsQ291bnQgPiAwICYmIG5lZWRzUmVzdGFydDsgLy8gb3IgPT0gc2VsZWN0ZWRKb2JzLmxlbmd0aAotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1DYW5jZWwoKSB7Ci0JCWlzUnVubmluZyA9IGZhbHNlOwotCQlyZXR1cm4gc3VwZXIucGVyZm9ybUNhbmNlbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQltb2RlUGFnZSA9IG5ldyBNb2RlU2VsZWN0aW9uUGFnZShzZWFyY2hSZXF1ZXN0KTsKLQkJYWRkUGFnZShtb2RlUGFnZSk7Ci0JCXNpdGVQYWdlID0gbmV3IFNpdGVQYWdlKHNlYXJjaFJlcXVlc3QpOwotCQlhZGRQYWdlKHNpdGVQYWdlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZVNldHRpbmdzKCkgewotCQlpZiAobW9kZVBhZ2UgIT0gbnVsbCkKLQkJCW1vZGVQYWdlLnNhdmVTZXR0aW5ncygpOwotCX0KLQotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0KLQkJaWYgKG1vZGVQYWdlICE9IG51bGwgJiYgcGFnZS5lcXVhbHMobW9kZVBhZ2UpKSB7Ci0JCQlib29sZWFuIHVwZGF0ZSA9IG1vZGVQYWdlLmlzVXBkYXRlTW9kZSgpOwotCQkJaWYgKCF1cGRhdGUpCi0JCQkJcmV0dXJuIHNpdGVQYWdlOwotCQl9Ci0gICAgICAgIHJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLklTZWFyY2hQcm92aWRlcjIjZ2V0U2VhcmNoUmVxdWVzdCgpCi0JICovCi0JcHVibGljIFVwZGF0ZVNlYXJjaFJlcXVlc3QgZ2V0U2VhcmNoUmVxdWVzdCgpIHsKLQkJcmV0dXJuIHNlYXJjaFJlcXVlc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1J1bm5pbmcoKSB7Ci0JCXJldHVybiBpc1J1bm5pbmcgfHwgSm9iLmdldEpvYk1hbmFnZXIoKS5maW5kKFVwZGF0ZUpvYi5GQU1JTFkpLmxlbmd0aCA+IDA7Ci0JfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQotICAgICAgICBzYXZlU2V0dGluZ3MoKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChKb2IuZ2V0Sm9iTWFuYWdlcigpLmZpbmQoVXBkYXRlSm9iLkZBTUlMWSkubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgLy8gYW5vdGhlciB1cGRhdGUvaW5zdGFsbCBqb2IgaXMgcnVubmluZywgbmVlZCB0byB3YWl0IHRvIGZpbmlzaCBvciBjYW5jZWwgb2xkIGpvYgotICAgICAgICAgICAgYm9vbGVhbiBwcm9jZWVkID0gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oCi0gICAgICAgICAgICAgICAgICAgIFVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgIFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9hbm90aGVySm9iVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgIFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9hbm90aGVySm9iKTsgCi0gICAgICAgICAgICBpZiAoIXByb2NlZWQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBjYW5jZWwgdGhpcyBqb2IsIGFuZCBsZXQgdGhlIG9sZCBvbmUgZ28gb24KLSAgICAgICAgfQotICAgICAgICBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFVwZGF0ZVNlc3Npb24oKS5yZXNldCgpOwotICAgICAgICBsYXVuY2hJbkJhY2tncm91bmQoKTsKLSAgICAgICAgaXNSdW5uaW5nID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLQlwcml2YXRlIHZvaWQgbGF1bmNoSW5CYWNrZ3JvdW5kKCkgewotCQkvLyBEb3dubG9hZHMgdGhlIGZlYXR1cmUgY29udGVudCBpbiB0aGUgYmFja2dyb3VuZC4KLQkJLy8gVGhlIGpvYiBsaXN0ZW5lciB3aWxsIHRoZW4gaW5zdGFsbCB0aGUgZmVhdHVyZSB3aGVuIGRvd25sb2FkIGlzIGZpbmlzaGVkLgotCi0gICAgICAgIGlmIChpc1VwZGF0ZSgpKQotICAgICAgICAgICAgam9iID0gbmV3IFVwZGF0ZUpvYihVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfam9iTmFtZSwgZmFsc2UsIGZhbHNlKTsgIAotICAgICAgICBlbHNlCi0gICAgICAgICAgICBqb2IgPSBuZXcgVXBkYXRlSm9iKFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9qb2JOYW1lLCBzZWFyY2hSZXF1ZXN0KTsgIAotCQlqb2Iuc2V0VXNlcih0cnVlKTsKLQkJam9iLnNldFByaW9yaXR5KEpvYi5JTlRFUkFDVElWRSk7Ci0vLwkJaWYgKHdhaXQpIHsKLS8vCQkJcHJvZ3Jlc3NTZXJ2aWNlLnNob3dJbkRpYWxvZyh3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgam9iKTsgCi0vLwkJfQotCQlnZXRPcGVyYXRpb24oKS5ydW4oVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwgam9iKTsKLQl9Ci0gICAgCi0gICAgcHJpdmF0ZSBJbnN0YWxsV2l6YXJkT3BlcmF0aW9uIGdldE9wZXJhdGlvbigpIHsKLQkJaWYgKG9wZXJhdGlvbiA9PSBudWxsKQotCQkJb3BlcmF0aW9uID0gbmV3IEluc3RhbGxXaXphcmRPcGVyYXRpb24oKTsKLQkJcmV0dXJuIG9wZXJhdGlvbjsKLQl9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0gICAgCSAgICAgIAotICAgIAlpZiAoIG1vZGVQYWdlLmlzQ3VycmVudFBhZ2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIGlzVXBkYXRlKCk7Ci0gICAgCX0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gc2l0ZVBhZ2UuaXNQYWdlQ29tcGxldGUoKTsKLSAgICAJfSAgIAkKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVXBkYXRlKCkgewotICAgICAgICByZXR1cm4gKG1vZGVQYWdlICE9IG51bGwgJiYgbW9kZVBhZ2UuaXNVcGRhdGVNb2RlKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0luc3RhbGxXaXphcmQyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9JbnN0YWxsV2l6YXJkMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmQyNDZmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0luc3RhbGxXaXphcmQyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2JDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JSW5zdGFsbENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZUZlYXR1cmVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVZlcmlmaWNhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkluc3RhbGxBYm9ydGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkZlYXR1cmVEb3dubG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5MaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLkR1cGxpY2F0ZUNvbmZsaWN0c1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy5JbnN0YWxsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlY3VyaXR5LkphclZlcmlmaWNhdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSUJhdGNoT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklGZWF0dXJlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklPcGVyYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5PcGVyYXRpb25zTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLlVwZGF0ZVNlYXJjaFJlcXVlc3Q7Ci0KLQotcHVibGljIGNsYXNzIEluc3RhbGxXaXphcmQyCi0JZXh0ZW5kcyBXaXphcmQKLQlpbXBsZW1lbnRzIElPcGVyYXRpb25MaXN0ZW5lciwgSVNlYXJjaFByb3ZpZGVyIHsKLQlwcml2YXRlIFJldmlld1BhZ2UgcmV2aWV3UGFnZTsKLQlwcml2YXRlIExpY2Vuc2VQYWdlIGxpY2Vuc2VQYWdlOwotCXByaXZhdGUgT3B0aW9uYWxGZWF0dXJlc1BhZ2Ugb3B0aW9uYWxGZWF0dXJlc1BhZ2U7Ci0JcHJpdmF0ZSBUYXJnZXRQYWdlIHRhcmdldFBhZ2U7Ci0JcHJpdmF0ZSBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnOwotCXByaXZhdGUgaW50IGluc3RhbGxDb3VudCA9IDA7Ci0JcHJpdmF0ZSBVcGRhdGVTZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3Q7Ci0JcHJpdmF0ZSBBcnJheUxpc3Qgam9iczsKLQlwcml2YXRlIGJvb2xlYW4gbmVlZHNSZXN0YXJ0OwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNSdW5uaW5nOwotCXByaXZhdGUgSUJhdGNoT3BlcmF0aW9uIGluc3RhbGxPcGVyYXRpb247Ci0JcHJpdmF0ZSBKb2Igam9iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IGpvYkZhbWlseSA9IG5ldyBPYmplY3QoKTsKLQlwcml2YXRlIElKb2JDaGFuZ2VMaXN0ZW5lciBqb2JMaXN0ZW5lcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNVcGRhdGU7Ci0KLQlwdWJsaWMgSW5zdGFsbFdpemFyZDIoVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0LCBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBqb2JzLCBib29sZWFuIGlzVXBkYXRlKSB7Ci0JCXRoaXMgKHNlYXJjaFJlcXVlc3QsIG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChqb2JzKSksIGlzVXBkYXRlKTsKLQl9Ci0KLQlwdWJsaWMgSW5zdGFsbFdpemFyZDIoVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0LCBBcnJheUxpc3Qgam9icywgYm9vbGVhbiBpc1VwZGF0ZSkgewotCQl0aGlzLmlzVXBkYXRlID0gaXNVcGRhdGU7Ci0gICAgICAgIHRoaXMuc2VhcmNoUmVxdWVzdCA9IHNlYXJjaFJlcXVlc3Q7Ci0gICAgICAgIHRoaXMuam9icyA9IGpvYnM7Ci0gICAgICAgIGlzUnVubmluZyA9IHRydWU7Ci0gICAgICAgIHNldERpYWxvZ1NldHRpbmdzKFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpKTsKLSAgICAgICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoVXBkYXRlVUlJbWFnZXMuREVTQ19VUERBVEVfV0laKTsKLSAgICAgICAgc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotICAgICAgICBzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLSAgICAgICAgc2V0V2luZG93VGl0bGUoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX3d0aXRsZSk7IAotCX0KLSAgICAKLQlwdWJsaWMgaW50IGdldEluc3RhbGxDb3VudCgpIHsKLQkJcmV0dXJuIGluc3RhbGxDb3VudDsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNSZXN0YXJ0TmVlZGVkKCkgewotCQlyZXR1cm4gaW5zdGFsbENvdW50ID4gMCAmJiBuZWVkc1Jlc3RhcnQ7IC8vIG9yID09IHNlbGVjdGVkSm9icy5sZW5ndGgKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotCQlpc1J1bm5pbmcgPSBmYWxzZTsKLQkJaWYgKHRhcmdldFBhZ2UgIT0gbnVsbCkKLQkJCXRhcmdldFBhZ2UucmVtb3ZlQWRkZWRTaXRlcygpOwotCQlyZXR1cm4gc3VwZXIucGVyZm9ybUNhbmNlbCgpOwotCX0KLQkvKioKLQkgKiBAc2VlIFdpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBzZWxlY3RlZEpvYnMgPSByZXZpZXdQYWdlLmdldFNlbGVjdGVkSm9icygpOwotCQkKLQkJLy8gQ2hlY2sgZm9yIGR1cGxpY2F0aW9uIGNvbmZsaWN0cwotCQlBcnJheUxpc3QgY29uZmxpY3RzID0gRHVwbGljYXRlQ29uZmxpY3RzVmFsaWRhdG9yLmNvbXB1dGVEdXBsaWNhdGVDb25mbGljdHMoc2VsZWN0ZWRKb2JzLCBjb25maWcpOwotCQlpZiAoY29uZmxpY3RzICE9IG51bGwpIHsKLQkJCUR1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZyBkaWFsb2cgPSBuZXcgRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nKGdldFNoZWxsKCksIGNvbmZsaWN0cyk7Ci0JCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKEpvYi5nZXRKb2JNYW5hZ2VyKCkuZmluZChqb2JGYW1pbHkpLmxlbmd0aCA+IDApIHsKLQkJCS8vIGFub3RoZXIgdXBkYXRlL2luc3RhbGwgam9iIGlzIHJ1bm5pbmcsIG5lZWQgdG8gd2FpdCB0byBmaW5pc2ggb3IgY2FuY2VsIG9sZCBqb2IKLQkJCWJvb2xlYW4gcHJvY2VlZCA9IE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKAotCQkJCQlVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfYW5vdGhlckpvYlRpdGxlLAotCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfYW5vdGhlckpvYik7IAotCQkJaWYgKCFwcm9jZWVkKQotCQkJCXJldHVybiBmYWxzZTsgLy8gY2FuY2VsIHRoaXMgam9iLCBhbmQgbGV0IHRoZSBvbGQgb25lIGdvIG9uCi0JCX0KLQkJCi0JCS8vIHNldCB0aGUgaW5zdGFsbCBvcGVyYXRpb24KLQkJaW5zdGFsbE9wZXJhdGlvbiA9IGdldEJhdGNoSW5zdGFsbE9wZXJhdGlvbihzZWxlY3RlZEpvYnMpOwotCQlpZiAoaW5zdGFsbE9wZXJhdGlvbiAhPSBudWxsKQotCQkJbGF1bmNoSW5CYWNrZ3JvdW5kKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlyZXZpZXdQYWdlID0gbmV3IFJldmlld1BhZ2UoaXNVcGRhdGUsIHNlYXJjaFJlcXVlc3QsIGpvYnMpOwotCQlhZGRQYWdlKHJldmlld1BhZ2UpOwotCi0JCXRyeSB7Ci0vLwkJCWNvbmZpZyA9IFVwZGF0ZVV0aWxzLmNyZWF0ZUluc3RhbGxDb25maWd1cmF0aW9uKCk7Ci0JCQljb25maWcgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCi0JCWxpY2Vuc2VQYWdlID0gbmV3IExpY2Vuc2VQYWdlKHRydWUpOwotCQlhZGRQYWdlKGxpY2Vuc2VQYWdlKTsKLQkJb3B0aW9uYWxGZWF0dXJlc1BhZ2UgPSBuZXcgT3B0aW9uYWxGZWF0dXJlc1BhZ2UoY29uZmlnKTsKLQkJYWRkUGFnZShvcHRpb25hbEZlYXR1cmVzUGFnZSk7Ci0JCXRhcmdldFBhZ2UgPSBuZXcgVGFyZ2V0UGFnZShjb25maWcsIGlzVXBkYXRlKTsKLQkJYWRkUGFnZSh0YXJnZXRQYWdlKTsKLQl9Ci0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1BhZ2VSZXF1aXJlZChJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCWlmIChwYWdlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJaWYgKHBhZ2UuZXF1YWxzKGxpY2Vuc2VQYWdlKSkgewotCQkJcmV0dXJuIE9wZXJhdGlvbnNNYW5hZ2VyLmhhc1NlbGVjdGVkSm9ic1dpdGhMaWNlbnNlcygKLQkJCQlyZXZpZXdQYWdlLmdldFNlbGVjdGVkSm9icygpKTsKLQkJfQotCQlpZiAocGFnZS5lcXVhbHMob3B0aW9uYWxGZWF0dXJlc1BhZ2UpKSB7Ci0JCQlyZXR1cm4gT3BlcmF0aW9uc01hbmFnZXIuaGFzU2VsZWN0ZWRKb2JzV2l0aE9wdGlvbmFsRmVhdHVyZXMoCi0JCQkJcmV2aWV3UGFnZS5nZXRTZWxlY3RlZEpvYnMoKSk7Ci0JCX0KLQkJaWYgKHBhZ2UuZXF1YWxzKHRhcmdldFBhZ2UpKSB7Ci0JCQlyZXR1cm4gcmV2aWV3UGFnZS5nZXRTZWxlY3RlZEpvYnMoKS5sZW5ndGggPiAwOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCUlXaXphcmRQYWdlW10gcGFnZXMgPSBnZXRQYWdlcygpOwotCQlib29sZWFuIHN0YXJ0ID0gZmFsc2U7Ci0JCUlXaXphcmRQYWdlIG5leHRQYWdlID0gbnVsbDsKLQotCQlpZiAocGFnZS5lcXVhbHMocmV2aWV3UGFnZSkpIHsKLQkJCXVwZGF0ZUR5bmFtaWNQYWdlcygpOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHBhZ2VzW2ldLmVxdWFscyhwYWdlKSkgewotCQkJCXN0YXJ0ID0gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoc3RhcnQpIHsKLQkJCQlpZiAoaXNQYWdlUmVxdWlyZWQocGFnZXNbaV0pKSB7Ci0JCQkJCW5leHRQYWdlID0gcGFnZXNbaV07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV4dFBhZ2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUR5bmFtaWNQYWdlcygpIHsKLQkJaWYgKGxpY2Vuc2VQYWdlICE9IG51bGwpIHsKLQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGxpY2Vuc2VKb2JzID0KLQkJCQlPcGVyYXRpb25zTWFuYWdlci5nZXRTZWxlY3RlZEpvYnNXaXRoTGljZW5zZXMoCi0JCQkJCXJldmlld1BhZ2UuZ2V0U2VsZWN0ZWRKb2JzKCkpOwotCQkJbGljZW5zZVBhZ2Uuc2V0Sm9icyhsaWNlbnNlSm9icyk7Ci0JCX0KLQkJaWYgKG9wdGlvbmFsRmVhdHVyZXNQYWdlICE9IG51bGwpIHsKLQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIG9wdGlvbmFsSm9icyA9Ci0JCQkJT3BlcmF0aW9uc01hbmFnZXIuZ2V0U2VsZWN0ZWRKb2JzV2l0aE9wdGlvbmFsRmVhdHVyZXMoCi0JCQkJCXJldmlld1BhZ2UuZ2V0U2VsZWN0ZWRKb2JzKCkpOwotCQkJb3B0aW9uYWxGZWF0dXJlc1BhZ2Uuc2V0Sm9icyhvcHRpb25hbEpvYnMpOwotCQl9Ci0JCWlmICh0YXJnZXRQYWdlICE9IG51bGwpIHsKLQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGluc3RhbGxKb2JzID0KLQkJCQlyZXZpZXdQYWdlLmdldFNlbGVjdGVkSm9icygpOwotCQkJdGFyZ2V0UGFnZS5zZXRKb2JzKGluc3RhbGxKb2JzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJSVdpemFyZFBhZ2UgcGFnZSA9IGdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCk7Ci0JCXJldHVybiBwYWdlLmVxdWFscyh0YXJnZXRQYWdlKSAmJiBwYWdlLmlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByZXNlcnZlT3JpZ2luYXRpbmdVUkxzKAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMpIHsKLQkJLy8gd2FsayB0aGUgaGllcmFyY2h5IGFuZCBwcmVzZXJ2ZSB0aGUgb3JpZ2luYXRpbmcgVVJMCi0JCS8vIGZvciBhbGwgdGhlIG9wdGlvbmFsIGZlYXR1cmVzIHRoYXQgYXJlIG5vdCBjaG9zZW4gdG8KLQkJLy8gYmUgaW5zdGFsbGVkLgotCQlVUkwgdXJsID0gZmVhdHVyZS5nZXRTaXRlKCkuZ2V0VVJMKCk7Ci0JCXRyeSB7Ci0JCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gaXJlZnMgPQotCQkJCWZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpcmVmcy5sZW5ndGg7IGkrKykgewotCQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgaXJlZiA9IGlyZWZzW2ldOwotCQkJCWJvb2xlYW4gcHJlc2VydmUgPSBmYWxzZTsKLQkJCQlpZiAoaXJlZi5pc09wdGlvbmFsKCkpIHsKLQkJCQkJYm9vbGVhbiBvblRoZUxpc3QgPSBmYWxzZTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvcHRpb25hbEZlYXR1cmVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlpZiAob3B0aW9uYWxGZWF0dXJlc1tqXS5lcXVhbHMoaXJlZikpIHsKLQkJCQkJCQkvL3dhcyBvbiB0aGUgbGlzdAotCQkJCQkJCW9uVGhlTGlzdCA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCFvblRoZUxpc3QpCi0JCQkJCQlwcmVzZXJ2ZSA9IHRydWU7Ci0JCQkJfQotCQkJCWlmIChwcmVzZXJ2ZSkgewotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIGlkID0KLQkJCQkJCQlpcmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCk7Ci0JCQkJCQlVcGRhdGVVSS5zZXRPcmlnaW5hdGluZ1VSTChpZCwgdXJsKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBTaWxlbnRseSBpZ25vcmUKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJRmVhdHVyZSBpZmVhdHVyZSA9IGlyZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJCXByZXNlcnZlT3JpZ2luYXRpbmdVUkxzKGlmZWF0dXJlLCBvcHRpb25hbEZlYXR1cmVzKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBTaWxlbnRseSBpZ25vcmUKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBTaWxlbnRseSBpZ25vcmUKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklPcGVyYXRpb25MaXN0ZW5lciNhZnRlckV4ZWN1dGUob3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZnRlckV4ZWN1dGUoSU9wZXJhdGlvbiBvcGVyYXRpb24sIE9iamVjdCBkYXRhKSB7Ci0JCWlmICghKG9wZXJhdGlvbiBpbnN0YW5jZW9mIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIG9wZXJhdGlvbjsKLQkJSUZlYXR1cmUgb2xkRmVhdHVyZSA9IGpvYi5nZXRPbGRGZWF0dXJlKCk7Ci0JCWlmIChvbGRGZWF0dXJlID09IG51bGwgJiYgam9iLmdldE9wdGlvbmFsRmVhdHVyZXMoKSAhPSBudWxsKQotCQkJcHJlc2VydmVPcmlnaW5hdGluZ1VSTHMoCi0JCQkJam9iLmdldEZlYXR1cmUoKSwKLQkJCQlqb2IuZ2V0T3B0aW9uYWxGZWF0dXJlcygpKTsKLQotCQlpbnN0YWxsQ291bnQrKzsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkxpc3RlbmVyI2JlZm9yZUV4ZWN1dGUob3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBiZWZvcmVFeGVjdXRlKElPcGVyYXRpb24gb3BlcmF0aW9uLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHMuSVNlYXJjaFByb3ZpZGVyMiNnZXRTZWFyY2hSZXF1ZXN0KCkKLQkgKi8KLQlwdWJsaWMgVXBkYXRlU2VhcmNoUmVxdWVzdCBnZXRTZWFyY2hSZXF1ZXN0KCkgewotCQlyZXR1cm4gc2VhcmNoUmVxdWVzdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzUnVubmluZygpIHsKLQkJcmV0dXJuIGlzUnVubmluZyB8fCBKb2IuZ2V0Sm9iTWFuYWdlcigpLmZpbmQoam9iRmFtaWx5KS5sZW5ndGggPiAwOwotCX0KLQkKLQlwcml2YXRlIElCYXRjaE9wZXJhdGlvbiBnZXRCYXRjaEluc3RhbGxPcGVyYXRpb24oZmluYWwgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gc2VsZWN0ZWRKb2JzKSB7Ci0JCWZpbmFsIElWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciA9bmV3IEphclZlcmlmaWNhdGlvblNlcnZpY2UoCi0JCQkJLy9JbnN0YWxsV2l6YXJkLnRoaXMuZ2V0U2hlbGwoKSk7Ci0JCQkJVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSk7Ci0JCQotCQkvLyBzZXR1cCBqb2JzIHdpdGggdGhlIGNvcnJlY3QgZW52aXJvbm1lbnQKLQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gb3BlcmF0aW9ucyA9CW5ldyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bc2VsZWN0ZWRKb2JzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRKb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iID0gc2VsZWN0ZWRKb2JzW2ldOwotCQkJSUZlYXR1cmVbXSB1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzID0gbnVsbDsKLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxGZWF0dXJlcyA9IG51bGw7Ci0JCQlpZiAoVXBkYXRlVXRpbHMuaGFzT3B0aW9uYWxGZWF0dXJlcyhqb2IuZ2V0RmVhdHVyZSgpKSkgewotCQkJCW9wdGlvbmFsRmVhdHVyZXMgPSBvcHRpb25hbEZlYXR1cmVzUGFnZS5nZXRDaGVja2VkT3B0aW9uYWxGZWF0dXJlcyhqb2IpOwotCQkJCXVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMgPSBvcHRpb25hbEZlYXR1cmVzUGFnZS5nZXRVbmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzKGpvYiwgam9iLmdldFRhcmdldFNpdGUoKSk7Ci0JCQl9Ci0JCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gb3AgPQotCQkJCU9wZXJhdGlvbnNNYW5hZ2VyCi0JCQkJCS5nZXRPcGVyYXRpb25GYWN0b3J5KCkKLQkJCQkJLmNyZWF0ZUluc3RhbGxPcGVyYXRpb24oCi0JCQkJCWpvYi5nZXRUYXJnZXRTaXRlKCksCi0JCQkJCWpvYi5nZXRGZWF0dXJlKCksCi0JCQkJCW9wdGlvbmFsRmVhdHVyZXMsCi0JCQkJCXVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMsCi0JCQkJCXZlcmlmaWNhdGlvbkxpc3RlbmVyKTsKLQkJCW9wZXJhdGlvbnNbaV0gPSBvcDsKLQkJfQotCQlyZXR1cm4gT3BlcmF0aW9uc01hbmFnZXIuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpLmNyZWF0ZUJhdGNoSW5zdGFsbE9wZXJhdGlvbihvcGVyYXRpb25zKTsKLQl9Ci0KLQotCi0JcHJpdmF0ZSB2b2lkIGxhdW5jaEluQmFja2dyb3VuZCgpIHsKLQkJLy8gRG93bmxvYWRzIHRoZSBmZWF0dXJlIGNvbnRlbnQgaW4gdGhlIGJhY2tncm91bmQuCi0JCS8vIFRoZSBqb2IgbGlzdGVuZXIgd2lsbCB0aGVuIGluc3RhbGwgdGhlIGZlYXR1cmUgd2hlbiBkb3dubG9hZCBpcyBmaW5pc2hlZC4KLQkJCi0JCS8vIFRPRE86IHNob3VsZCB3ZSBjYW5jZWwgZXhpc3Rpbmcgam9icz8KLQkJaWYgKGpvYkxpc3RlbmVyICE9IG51bGwpCi0JCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLnJlbW92ZUpvYkNoYW5nZUxpc3RlbmVyKGpvYkxpc3RlbmVyKTsKLQkJaWYgKGpvYiAhPSBudWxsKQotCQkJSm9iLmdldEpvYk1hbmFnZXIoKS5jYW5jZWwoam9iKTsKLQkJam9iTGlzdGVuZXIgPSBuZXcgVXBkYXRlSm9iQ2hhbmdlTGlzdGVuZXIoKTsKLQkJSm9iLmdldEpvYk1hbmFnZXIoKS5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihqb2JMaXN0ZW5lcik7Ci0JCQotCQlqb2IgPSBuZXcgSm9iKFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9qb2JOYW1lKSB7IAotCQkJcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCWlmIChkb3dubG9hZChtb25pdG9yKSkKLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJZWxzZSB7Ci0JCQkJCWlzUnVubmluZyA9IGZhbHNlOwotCQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkJfQotCQkJfQotCQkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKLQkJCQlyZXR1cm4gSW5zdGFsbFdpemFyZDIuam9iRmFtaWx5ID09IGZhbWlseTsKLQkJCX0KLQkJfTsKLQotCQlqb2Iuc2V0VXNlcih0cnVlKTsKLQkJam9iLnNldFByaW9yaXR5KEpvYi5JTlRFUkFDVElWRSk7Ci0vLwkJaWYgKHdhaXQpIHsKLS8vCQkJcHJvZ3Jlc3NTZXJ2aWNlLnNob3dJbkRpYWxvZyh3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgam9iKTsgCi0vLwkJfQotCQlqb2Iuc2NoZWR1bGUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGluc3RhbGwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIEluc3RhbGxzIHRoZSAoYWxyZWFkeSBkb3dubG9hZGVkKSBmZWF0dXJlcyBhbmQgcHJvbXB0cyBmb3IgcmVzdGFydAotCQl0cnkgewotCQkJbmVlZHNSZXN0YXJ0ID0gaW5zdGFsbE9wZXJhdGlvbi5leGVjdXRlKG1vbml0b3IsIEluc3RhbGxXaXphcmQyLnRoaXMpOwotCQkJVXBkYXRlVUkuZ2V0U3RhbmRhcmREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCVVwZGF0ZVVJLnJlcXVlc3RSZXN0YXJ0KEluc3RhbGxXaXphcmQyLnRoaXMuaXNSZXN0YXJ0TmVlZGVkKCkpOwotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChmaW5hbCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCWZpbmFsIFRocm93YWJsZSB0YXJnZXRFeGNlcHRpb24gPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJaWYgKCEodGFyZ2V0RXhjZXB0aW9uIGluc3RhbmNlb2YgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24pKXsKLQkJCQlVcGRhdGVVSS5nZXRTdGFuZGFyZERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbih0YXJnZXRFeGNlcHRpb24pOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGZpbmFsbHkgewotCQkJaXNSdW5uaW5nID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBkb3dubG9hZChmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gRG93bmxvYWRzIHRoZSBmZWF0dXJlIGNvbnRlbnQuCi0JCS8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIGEgYmFja2dyb3VuZCBqb2IuCi0JCS8vIElmIGRvd25sb2FkIGZhaWxzLCB0aGUgdXNlciBpcyBwcm9tcHRlZCB0byByZXRyeS4KLQkJdHJ5IHsKLQkJCUlGZWF0dXJlT3BlcmF0aW9uW10gb3BzID0gaW5zdGFsbE9wZXJhdGlvbi5nZXRPcGVyYXRpb25zKCk7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfZG93bmxvYWQsIDUgKiBvcHMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIG9wID0gKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbilvcHNbaV07Ci0JCQkJCi0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIGZlYXR1cmVOYW1lID0gb3AuZ2V0RmVhdHVyZSgpLmdldExhYmVsKCk7Ci0JCQkJCWlmICgoZmVhdHVyZU5hbWUgPT0gbnVsbCApIHx8IChmZWF0dXJlTmFtZS50cmltKCkgPT0gIiIpICkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlmZWF0dXJlTmFtZSA9IG9wLmdldEZlYXR1cmUoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpOwotCQkJCQl9Ci0JCQkJCVN1YlByb2dyZXNzTW9uaXRvciBmZWF0dXJlRG93bmxvYWRNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAyKTsKLQkJCQkJCi0JCQkJCWZlYXR1cmVEb3dubG9hZE1vbml0b3IuYmVnaW5UYXNrKGZlYXR1cmVOYW1lLCAyKTsKLQkJCQkJZmVhdHVyZURvd25sb2FkTW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9kb3dubG9hZGluZ0ZlYXR1cmVKYXIsIGZlYXR1cmVOYW1lKSk7Ci0JCQkJCQotCQkJCQlpZiAob3AuZ2V0RmVhdHVyZSgpIGluc3RhbmNlb2YgTGl0ZUZlYXR1cmUpIHsKLQkJCQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmZXJlbmNlID0gZ2V0RmVhdHVyZVJlZmVyZW5jZShvcC5nZXRGZWF0dXJlKCkpOwotCQkJCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGZlYXR1cmVSZWZlcmVuY2UuZ2V0RmVhdHVyZShmZWF0dXJlRG93bmxvYWRNb25pdG9yKTsKLQkJCQkJCWlmIChvcCBpbnN0YW5jZW9mIEluc3RhbGxPcGVyYXRpb24pIHsKLQkJCQkJCQkoKEluc3RhbGxPcGVyYXRpb24pb3ApLnNldEZlYXR1cmUoZmVhdHVyZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy9mZWF0dXJlRG93bmxvYWRNb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJU3ViUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDMpOwotCQkJCQlVcGRhdGVVdGlscy5kb3dubG9hZEZlYXR1cmVDb250ZW50KG9wLmdldFRhcmdldFNpdGUoKSwgb3AuZ2V0RmVhdHVyZSgpLCBvcC5nZXRPcHRpb25hbEZlYXR1cmVzKCksIHN1Yk1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKGZpbmFsIENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlpZihlIGluc3RhbmNlb2YgRmVhdHVyZURvd25sb2FkRXhjZXB0aW9uKXsKLQkJCQkJCWJvb2xlYW4gcmV0cnkgPSByZXRyeURvd25sb2FkKChGZWF0dXJlRG93bmxvYWRFeGNlcHRpb24pZSk7Ci0JCQkJCQlpZiAocmV0cnkpIHsKLQkJCQkJCQkvLyByZWRvd25sb2FkIGN1cnJlbnQgZmVhdHVyZQotCQkJCQkJCWktLTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVVwZGF0ZUNvcmUubG9nKGUpOwotCQkJCQkJaWYgKCAhbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyggbmV3IFJ1bm5hYmxlICgpIHsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCBVcGRhdGVVSS5nZXRQbHVnaW5JZCgpLCBJU3RhdHVzLk9LLCBVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmQyX3VwZGF0ZU9wZXJhdGlvbkhhc0ZhaWxlZCwgZSk7Ci0JCQkJCQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IobnVsbCwgbnVsbCwgbnVsbCwgc3RhdHVzKTsKLQkJCQkJCQkJCi0JCQkJCQkJCX0JCQkJCQkJCi0JCQkJCQkJfSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHJldHJ5RG93bmxvYWQoZmluYWwgRmVhdHVyZURvd25sb2FkRXhjZXB0aW9uIGUpIHsKLQotCQlmaW5hbCBib29sZWFuIHJldHJ5W10gPSBuZXcgYm9vbGVhblsxXTsKLQkJVXBkYXRlVUkuZ2V0U3RhbmRhcmREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJldHJ5WzBdID0JTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oCi0JCQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJCVVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9yZXRyeVRpdGxlLCAKLQkJCQkJZS5nZXRNZXNzYWdlKCkrIlxuIiAvLyROT04tTkxTLTEkCi0JCQkJCQkrIFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9yZXRyeSk7IAotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHJldHJ5WzBdOwotCX0KLSAgICAKLQotICAgIHByaXZhdGUgY2xhc3MgVXBkYXRlSm9iQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBKb2JDaGFuZ2VBZGFwdGVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgZG9uZShmaW5hbCBJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIC8vIHRoZSBqb2IgbGlzdGVuZXIgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIGRvd25sb2FkIGpvYiBpcyBkb25lLCBhbmQgaXQgcHJvY2VlZHMKLSAgICAgICAgICAgIC8vIHdpdGggdGhlIGFjdHVhbCBpbnN0YWxsCi0gICAgICAgICAgICBpZiAoZXZlbnQuZ2V0Sm9iKCkgPT0gSW5zdGFsbFdpemFyZDIudGhpcy5qb2IgJiYgZXZlbnQuZ2V0UmVzdWx0KCkgPT0gU3RhdHVzLk9LX1NUQVRVUykgewotICAgICAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkucmVtb3ZlSm9iQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5jYW5jZWwoam9iKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBKb2IgaW5zdGFsbEpvYiA9IG5ldyBKb2IoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX2pvYk5hbWUpIHsgCi0gICAgICAgIAkJCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgCQkJCS8vaW5zdGFsbChtb25pdG9yKTsKLSAgICAgICAgCQkJCWlmIChpbnN0YWxsKG1vbml0b3IpKSB7Ci0gICAgICAgIAkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIAkJCQl9IGVsc2UgewotICAgICAgICAJCQkJCWlzUnVubmluZyA9IGZhbHNlOwotICAgICAgICAJCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLSAgICAgICAgCQkJCX0KLSAgICAgICAgCQkJfQotICAgICAgICAJCQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgewotICAgICAgICAJCQkJcmV0dXJuIEluc3RhbGxXaXphcmQyLmpvYkZhbWlseSA9PSBmYW1pbHk7Ci0gICAgICAgIAkJCX0KLSAgICAgICAgCQl9OwotCi0gICAgICAgIAkJaW5zdGFsbEpvYi5zZXRVc2VyKHRydWUpOwotICAgICAgICAJCWluc3RhbGxKb2Iuc2V0UHJpb3JpdHkoSm9iLklOVEVSQUNUSVZFKTsKLS8vICAgICAgICAJCWlmICh3YWl0KSB7Ci0vLyAgICAgICAgCQkJcHJvZ3Jlc3NTZXJ2aWNlLnNob3dJbkRpYWxvZyh3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgam9iKTsgCi0vLyAgICAgICAgCQl9Ci0gICAgICAgIAkJaW5zdGFsbEpvYi5zY2hlZHVsZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qZmluYWwgSVByb2dyZXNzU2VydmljZSBwcm9ncmVzc1NlcnZpY2U9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCk7Ci0gICAgICAgICAgICAgICAgVXBkYXRlVUkuZ2V0U3RhbmRhcmREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc1NlcnZpY2UuYnVzeUN1cnNvcldoaWxlKCBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGwobW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7ICovCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldEpvYigpID09IEluc3RhbGxXaXphcmQyLnRoaXMuam9iICYmIGV2ZW50LmdldFJlc3VsdCgpICE9IFN0YXR1cy5PS19TVEFUVVMpIHsKLSAgICAgICAgICAgICAgICBpc1J1bm5pbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLnJlbW92ZUpvYkNoYW5nZUxpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuY2FuY2VsKGpvYik7Ci0gICAgICAgICAgICAgICAgVXBkYXRlVUkuZ2V0U3RhbmRhcmREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVVSS5sb2coZXZlbnQuZ2V0UmVzdWx0KCksIHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0JCi0JcHVibGljIElTaXRlRmVhdHVyZVJlZmVyZW5jZSBnZXRGZWF0dXJlUmVmZXJlbmNlKElGZWF0dXJlIGZlYXR1cmUpIHsKLQotCQlJU2l0ZSBzaXRlID0gZmVhdHVyZS5nZXRTaXRlKCk7Ci0JCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCUlTaXRlRmVhdHVyZVJlZmVyZW5jZSBjdXJyZW50UmVmZXJlbmNlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQljdXJyZW50UmVmZXJlbmNlID0gcmVmZXJlbmNlc1tpXTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyhjdXJyZW50UmVmZXJlbmNlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpCi0JCQkJCXJldHVybiBjdXJyZW50UmVmZXJlbmNlOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlVcGRhdGVDb3JlLndhcm4oIkZlYXR1cmUgIiArIGZlYXR1cmUgKyAiIG5vdCBmb3VuZCBvbiBzaXRlIiArIHNpdGUuZ2V0VVJMKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9JbnN0YWxsV2l6YXJkT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9JbnN0YWxsV2l6YXJkT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZjRiZTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvSW5zdGFsbFdpemFyZE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5VcGRhdGVKb2I7Ci0KLXB1YmxpYyBjbGFzcyBJbnN0YWxsV2l6YXJkT3BlcmF0aW9uIHsKLQlwcml2YXRlIFVwZGF0ZUpvYiBqb2I7Ci0JcHJpdmF0ZSBJSm9iQ2hhbmdlTGlzdGVuZXIgam9iTGlzdGVuZXI7Ci0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQlwcml2YXRlIFNoZWxsIHBhcmVudFNoZWxsOwotCi0JcHVibGljIEluc3RhbGxXaXphcmRPcGVyYXRpb24oKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKFNoZWxsIHBhcmVudCwgVXBkYXRlSm9iIHRhc2spIHsKLQkJc2hlbGwgPSBwYXJlbnQ7Ci0JCWlmIChzaGVsbC5nZXRQYXJlbnQoKSE9bnVsbCAmJiBzaGVsbC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFNoZWxsKQotCQkJcGFyZW50U2hlbGwgPSAoU2hlbGwpc2hlbGwuZ2V0UGFyZW50KCk7Ci0JCS8vIGNhbmNlbCBhbnkgZXhpc3Rpbmcgam9icyBhbmQgcmVtb3ZlIGxpc3RlbmVycwotCQlpZiAoam9iTGlzdGVuZXIgIT0gbnVsbCkKLQkJCUpvYi5nZXRKb2JNYW5hZ2VyKCkucmVtb3ZlSm9iQ2hhbmdlTGlzdGVuZXIoam9iTGlzdGVuZXIpOwotCQlpZiAoam9iICE9IG51bGwpCi0JCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLmNhbmNlbChqb2IpOwotCQkKLQkJLy8gdGhlbiBzZXR1cCB0aGUgbmV3IGpvYiBhbmQgbGlzdGVuZXIgYW5kIHNjaGVkdWxlIHRoZSBqb2IKLQkJam9iID0gdGFzazsKLQkJam9iTGlzdGVuZXIgPSBuZXcgVXBkYXRlSm9iQ2hhbmdlTGlzdGVuZXIoKTsKLQkJSm9iLmdldEpvYk1hbmFnZXIoKS5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihqb2JMaXN0ZW5lcik7Ci0JCWpvYi5zY2hlZHVsZSgpOwotCX0KLQkKLQlwcml2YXRlIFNoZWxsIGdldFZhbGlkU2hlbGwoKSB7Ci0JCWlmIChzaGVsbC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm4gcGFyZW50U2hlbGw7Ci0JCXJldHVybiBzaGVsbDsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFVwZGF0ZUpvYkNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgSm9iQ2hhbmdlQWRhcHRlciB7Ci0JCXB1YmxpYyB2b2lkIGRvbmUoZmluYWwgSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlmaW5hbCBTaGVsbCB2YWxpZFNoZWxsID0gZ2V0VmFsaWRTaGVsbCgpOwotCQkJLy8gdGhlIGpvYiBsaXN0ZW5lciBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgc2VhcmNoIGpvYiBpcyBkb25lLCBhbmQgcHJvY2VlZHMgdG8gbmV4dCB3aXphcmQKLQkJCWlmIChldmVudC5nZXRKb2IoKSA9PSBqb2IpIHsKLQkJCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLnJlbW92ZUpvYkNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJCUpvYi5nZXRKb2JNYW5hZ2VyKCkuY2FuY2VsKGpvYik7Ci0JCQkJaWYgKGpvYi5nZXRTdGF0dXMoKSA9PSBTdGF0dXMuQ0FOQ0VMX1NUQVRVUykKLQkJCQkJcmV0dXJuOwotCQkJCWlmIChqb2IuZ2V0U3RhdHVzKCkgIT0gU3RhdHVzLk9LX1NUQVRVUykKLQkJCQkJZ2V0VmFsaWRTaGVsbCgpLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJVXBkYXRlVUkubG9nKGpvYi5nZXRTdGF0dXMoKSwgdHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCi0JCQkJdmFsaWRTaGVsbC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJdmFsaWRTaGVsbC5nZXREaXNwbGF5KCkuYmVlcCgpOwotCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUodmFsaWRTaGVsbC5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCW9wZW5JbnN0YWxsV2l6YXJkMigpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgb3Blbkluc3RhbGxXaXphcmQyKCkgewotCQkJaWYgKEluc3RhbGxXaXphcmQyLmlzUnVubmluZygpKSB7Ci0JCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oZ2V0VmFsaWRTaGVsbCgpLCBVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfaXNSdW5uaW5nVGl0bGUsIFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9pc1J1bm5pbmdJbmZvKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0gICAgICAgICAgICBpZiAoam9iLmdldFVwZGF0ZXMoKSA9PSBudWxsIHx8IGpvYi5nZXRVcGRhdGVzKCkubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoam9iLmlzVXBkYXRlKCkpCi0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKGdldFZhbGlkU2hlbGwoKSwgVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfemVyb1VwZGF0ZXMsIFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX3plcm9VcGRhdGVzKTsgCi0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihnZXRWYWxpZFNoZWxsKCksIFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX3plcm9GZWF0dXJlcywgVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfemVyb0ZlYXR1cmVzKTsgCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCQkJSW5zdGFsbFdpemFyZDIgd2l6YXJkID0gbmV3IEluc3RhbGxXaXphcmQyKGpvYi5nZXRTZWFyY2hSZXF1ZXN0KCksIGpvYi5nZXRVcGRhdGVzKCksIGpvYi5pc1VwZGF0ZSgpKTsKLQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgUmVzaXphYmxlSW5zdGFsbFdpemFyZERpYWxvZyhnZXRWYWxpZFNoZWxsKCksIHdpemFyZCwgVXBkYXRlVUlNZXNzYWdlcy5BdXRvbWF0aWNVcGRhdGVzSm9iX1VwZGF0ZXMpOyAKLQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9MaWNlbnNlUGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTGljZW5zZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkMGJkZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9MaWNlbnNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIExpY2Vuc2VQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIElEeW5hbWljUGFnZSB7Ci0JcHJpdmF0ZSBib29sZWFuIG11bHRpTGljZW5zZU1vZGUgPSBmYWxzZTsKLQlwcml2YXRlIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnM7Ci0JcHJpdmF0ZSBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBvbGRqSm9iczsKLQlwcml2YXRlIFRleHQgdGV4dDsKLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCXByaXZhdGUgQnV0dG9uIGFjY2VwdEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBkZWNsaW5lQnV0dG9uOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIExpY2Vuc2VQYWdlMgotCSAqLwotCXB1YmxpYyBMaWNlbnNlUGFnZShib29sZWFuIG11bHRpTGljZW5zZU1vZGUpIHsKLQkJc3VwZXIoIkxpY2Vuc2UiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUaXRsZShVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfTGljZW5zZVBhZ2VfdGl0bGUpOwotCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQl0aGlzLm11bHRpTGljZW5zZU1vZGUgPSBtdWx0aUxpY2Vuc2VNb2RlOwotCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmNvbm5lY3QodGhpcyk7Ci0JCXNldERlc2NyaXB0aW9uKG11bHRpTGljZW5zZU1vZGUgP1VwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9MaWNlbnNlUGFnZV9kZXNjMiA6IAotICAgICAgICAgICAgVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX0xpY2Vuc2VQYWdlX2Rlc2MpOwotCX0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmRpc2Nvbm5lY3QodGhpcyk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRKb2JzKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnMpIHsJCQotCQl0aGlzLmpvYnMgPSBqb2JzOwkJCi0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjbGllbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljbGllbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY2xpZW50LnNldExheW91dChsYXlvdXQpOwotCQkKLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjbGllbnQsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuTGljZW5zZVBhZ2UyIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAobXVsdGlMaWNlbnNlTW9kZSkgewotCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0KLQkJCXRhYmxlID0gbmV3IFRhYmxlKGNsaWVudCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0KLQkJCXRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJaWYgKGUuaXRlbSAhPSBudWxsKSB7Ci0JCQkJCQlPYmplY3QgZGF0YSA9IGUuaXRlbS5nZXREYXRhKCk7Ci0JCQkJCQl0ZXh0LnNldFRleHQoKGRhdGEgPT0gbnVsbCkgPyAiIiA6IChTdHJpbmcpIGRhdGEpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlnZC5oZWlnaHRIaW50ID0gMjAwOwotCQkJdGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCX0KLQkJdGV4dCA9Ci0JCQluZXcgVGV4dCgKLQkJCQljbGllbnQsCi0JCQkJU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5XUkFQIHwgU1dULlJFQURfT05MWSk7Ci0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuaGVpZ2h0SGludCA9IDIwMDsKLQkJaWYgKG11bHRpTGljZW5zZU1vZGUpCi0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXRleHQuc2V0QmFja2dyb3VuZCh0ZXh0LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY2xpZW50LCBTV1QuTlVMTCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWlmIChtdWx0aUxpY2Vuc2VNb2RlKQotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlidXR0b25Db250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlidXR0b25Db250YWluZXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJYWNjZXB0QnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5SQURJTyk7Ci0JCWFjY2VwdEJ1dHRvbi5zZXRUZXh0KG11bHRpTGljZW5zZU1vZGU/VXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX0xpY2Vuc2VQYWdlX2FjY2VwdDIKLSAgICAgICAgICAgICAgICA6IFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9MaWNlbnNlUGFnZV9hY2NlcHQpOwotCQlhY2NlcHRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGFjY2VwdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCQlkZWNsaW5lQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5SQURJTyk7Ci0JCWRlY2xpbmVCdXR0b24uc2V0VGV4dChtdWx0aUxpY2Vuc2VNb2RlP1VwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9MaWNlbnNlUGFnZV9kZWNsaW5lMgotICAgICAgICAgICAgICAgIDogVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX0xpY2Vuc2VQYWdlX2RlY2xpbmUpOwotCQlkZWNsaW5lQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShhY2NlcHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQkJc2V0Q29udHJvbChjbGllbnQpOwotCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgeyAvLyBUTyBETzogT3B0aW1pemUgb3V0IHRoZSBjYXNlIHdoZXJlIGEgZmVhdHVyZSBkb2VzIG5vdCBoYXZlIGEgbGljZW5zZT8KLQotCQlib29sZWFuIGpvYnNDaGFuZ2VkID0gZGlkSm9ic0NoYW5nZShqb2JzKTsKLQkJZGVjbGluZUJ1dHRvbi5zZXRTZWxlY3Rpb24oIWpvYnNDaGFuZ2VkICYmIGRlY2xpbmVCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQlhY2NlcHRCdXR0b24uc2V0U2VsZWN0aW9uKCFqb2JzQ2hhbmdlZCAmJiBhY2NlcHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkKLQkJaWYgKGpvYnMubGVuZ3RoID09IDEpIHsKLQkJCWFjY2VwdEJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9MaWNlbnNlUGFnZV9hY2NlcHQpOwotCQkJZGVjbGluZUJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9MaWNlbnNlUGFnZV9kZWNsaW5lKTsKLQkJfSBlbHNlIGlmIChqb2JzLmxlbmd0aCA+IDEpIHsKLQkJCWFjY2VwdEJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9MaWNlbnNlUGFnZV9hY2NlcHQyKTsKLQkJCWRlY2xpbmVCdXR0b24uc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfTGljZW5zZVBhZ2VfZGVjbGluZTIpOwotCQl9Ci0JCQotCQlpZiAodmlzaWJsZSkgewotCQkJaWYgKG11bHRpTGljZW5zZU1vZGUpIHsKLQkJCQlUYWJsZUl0ZW0gaXRlbTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGpvYnNbaV0uZ2V0RmVhdHVyZSgpOwotCQkJCQlpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkJCQlTdHJpbmcgbGFiZWwgPQotCQkJCQkJZmVhdHVyZS5nZXRMYWJlbCgpCi0JCQkJCQkJKyAiICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7Ci0JCQkJCWl0ZW0uc2V0VGV4dChsYWJlbCk7Ci0JCQkJCWl0ZW0uc2V0SW1hZ2UoCi0JCQkJCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmdldCgKLQkJCQkJCQlmZWF0dXJlLmlzUGF0Y2goKQotCQkJCQkJCQk/IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfRUZJWF9PQkoKLQkJCQkJCQkJOiBVcGRhdGVVSUltYWdlcy5ERVNDX0ZFQVRVUkVfT0JKKSk7Ci0JCQkJCVN0cmluZyBsaWNlbnNlID0gZmVhdHVyZS5nZXRMaWNlbnNlKCkuZ2V0QW5ub3RhdGlvbigpOwotCQkJCQkvLyBRdWVzdGlvbjogQ2FuIHRoaXMgZXZlciBiZSBudWxsPyBXaGF0IGlzIHRoZSBydW50aW1lIGNvc3Q/Ci0JCQkJCWl0ZW0uc2V0RGF0YShsaWNlbnNlKTsKLQkJCQl9Ci0KLQkJCQl0YWJsZS5zZXRTZWxlY3Rpb24oMCk7Ci0JCQl9Ci0JCQlzaG93TGljZW5zZVRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChtdWx0aUxpY2Vuc2VNb2RlKSB7Ci0JCQkJVGFibGVJdGVtIGl0ZW1zW10gPSB0YWJsZS5nZXRJdGVtcygpOwotCQkJCWZvciAoaW50IGkgPSBpdGVtcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotCQkJCQl0YWJsZS5nZXRJdGVtKGkpLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJb2xkakpvYnMgPSBqb2JzOwotCQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2hvd0xpY2Vuc2VUZXh0KCkgewotCQlpZiAoIW11bHRpTGljZW5zZU1vZGUpIHsKLQkJCXRleHQuc2V0VGV4dChqb2JzWzBdLmdldEZlYXR1cmUoKS5nZXRMaWNlbnNlKCkuZ2V0QW5ub3RhdGlvbigpKTsKLQkJCXJldHVybjsKLQkJfQotCQlUYWJsZUl0ZW1bXSBzZWxlY3RlZEl0ZW1zID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3RlZEl0ZW1zLmxlbmd0aCA9PSAwKSB7Ci0JCQl0ZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlPYmplY3QgZGF0YSA9IHNlbGVjdGVkSXRlbXNbMF0uZ2V0RGF0YSgpOwotCQkJdGV4dC5zZXRUZXh0KChkYXRhID09IG51bGwpID8gIiIgOiAoU3RyaW5nKSBkYXRhKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBkaWRKb2JzQ2hhbmdlKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnMpewotCQkKLQkJaWYgKCAoam9icyA9PSBudWxsKSB8fCAob2xkakpvYnMgPT0gbnVsbCkgfHwgKGpvYnMubGVuZ3RoID09IDApIHx8IChvbGRqSm9icy5sZW5ndGggPT0gMCkgKQotCQkJcmV0dXJuIHRydWU7Ci0JCQkJCi0JCWJvb2xlYW4gZm91bmRJdCA9IGZhbHNlOwotCQkKLQkJZm9yICggaW50IGkgPSAwOyBpIDwgam9icy5sZW5ndGg7IGkrKykgewotCQkJZm91bmRJdCA9IGZhbHNlOwotCQkJZm9yICggaW50IGogPSAwOyBqIDwgb2xkakpvYnMubGVuZ3RoOyBqKyspIHsKLQkJCQlpZiAoam9ic1tpXS5nZXRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyhvbGRqSm9ic1tqXS5nZXRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSApIHsKLQkJCQkJZm91bmRJdCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmRJdCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9Mb2NhbFNpdGVTZWxlY3Rvci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTG9jYWxTaXRlU2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM5ODI5OC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9Mb2NhbFNpdGVTZWxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLlNpdGVCb29rbWFyazsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbFNpdGVTZWxlY3RvciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGxhc3RMb2NhdGlvbiA9IG51bGw7Ci0JcHVibGljIExvY2FsU2l0ZVNlbGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQlwdWJsaWMgc3RhdGljIFNpdGVCb29rbWFyayBnZXRMb2NhTFNpdGUoU2hlbGwgcGFyZW50LCBTaXRlQm9va21hcmtbXSBzaXRlQm9va21hcmtzKSB7Ci0JCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHBhcmVudCk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKAotCQkJVXBkYXRlVUlNZXNzYWdlcy5Mb2NhbFNpdGVTZWxlY3Rvcl9kaWFsb2dNZXNzYWdlKTsgCi0JCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGxhc3RMb2NhdGlvbik7Ci0JCVN0cmluZyBkaXIgPSBkaWFsb2cub3BlbigpOwotCi0JCVNpdGVCb29rbWFyayBzaXRlQm9va21hcmsgPSBudWxsOwotCQl3aGlsZSAoZGlyICE9IG51bGwgJiYgc2l0ZUJvb2ttYXJrID09IG51bGwpIHsKLQkJCUZpbGUgZGlyRmlsZSA9IG5ldyBGaWxlKGRpcik7Ci0JCQlpZiAoaXNEaXJTaXRlKGRpckZpbGUpKSB7Ci0JCQkJaWYgKCFpc0R1cGxpY2F0ZSggZGlyRmlsZSwgc2l0ZUJvb2ttYXJrcykpIHsKLQkJCQkJc2l0ZUJvb2ttYXJrID0gY3JlYXRlRGlyU2l0ZShkaXJGaWxlKTsKLQkJCQkJbGFzdExvY2F0aW9uID0gZGlyOwotCQkJCX0gZWxzZSB7Ci0JCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHBhcmVudCwKLQkJCQkJCQkJCQkJCSAgVXBkYXRlVUlNZXNzYWdlcy5Mb2NhbFNpdGVTZWxlY3Rvcl9kaXJJbmZvVGl0bGUsIAotCQkJCQkJCQkJCQkJICBVcGRhdGVVSU1lc3NhZ2VzLkxvY2FsU2l0ZVNlbGVjdG9yX2RpckR1cGxpY2F0ZURlZmluaXRpb24pOyAKLQkJCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoZGlyKTsKLQkJCQkJZGlyID0gZGlhbG9nLm9wZW4oKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKAotCQkJCQlwYXJlbnQsCi0JCQkJCVVwZGF0ZVVJTWVzc2FnZXMuTG9jYWxTaXRlU2VsZWN0b3JfZGlySW5mb1RpdGxlLCAKLQkJCQkJVXBkYXRlVUlNZXNzYWdlcy5Mb2NhbFNpdGVTZWxlY3Rvcl9kaXJJbmZvTWVzc2FnZSk7IAotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGRpcik7Ci0JCQkJZGlyID0gZGlhbG9nLm9wZW4oKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2l0ZUJvb2ttYXJrOwotCX0KLQlwdWJsaWMgc3RhdGljIFNpdGVCb29rbWFyayBnZXRMb2NhTFppcHBlZFNpdGUoU2hlbGwgcGFyZW50LCBTaXRlQm9va21hcmtbXSBzaXRlQm9va21hcmtzKSB7Ci0JCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2cocGFyZW50KTsKLQkJZGlhbG9nLnNldFRleHQoCi0JCQlVcGRhdGVVSU1lc3NhZ2VzLkxvY2FsU2l0ZVNlbGVjdG9yX2RpYWxvZ01lc3NhZ2V6aXApOyAKLQkJLy9kaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyAiKi56aXAiLCAiKi5qYXIiIH0pOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqLmphcjsqLnppcCIgfSk7IC8vJE5PTi1OTFMtMSQKLQotCQlTaXRlQm9va21hcmsgc2l0ZUJvb2ttYXJrID0gbnVsbDsKLQotCQlTdHJpbmcgemlwID0gZGlhbG9nLm9wZW4oKTsKLQkJd2hpbGUgKHppcCAhPSBudWxsICYmIHNpdGVCb29rbWFyayA9PSBudWxsKSB7Ci0JCQlGaWxlIHppcEYgPSBuZXcgRmlsZSh6aXApOwotCQkJaWYgKGlzWmlwU2l0ZSh6aXBGKSkgewotCQkJCXNpdGVCb29rbWFyayA9IGNyZWF0ZVppcFNpdGUoemlwRik7Ci0JCQkJaWYgKGlzRHVwbGljYXRlKCBzaXRlQm9va21hcmsuZ2V0VVJMKCksIHNpdGVCb29rbWFya3MpKSB7Ci0JCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHBhcmVudCwKLQkJCQkJCQkgIFVwZGF0ZVVJTWVzc2FnZXMuTG9jYWxTaXRlU2VsZWN0b3JfemlwSW5mb1RpdGxlLCAKLQkJCQkJCQkgIFVwZGF0ZVVJTWVzc2FnZXMuTG9jYWxTaXRlU2VsZWN0b3JfemlwRHVwbGljYXRlRGVmaW5pdGlvbik7Ci0JCQkJCXNpdGVCb29rbWFyayA9IG51bGw7Ci0JCQkJCXppcCA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbigKLQkJCQkJcGFyZW50LAotCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkxvY2FsU2l0ZVNlbGVjdG9yX3ppcEluZm9UaXRsZSwgCi0JCQkJCVVwZGF0ZVVJTWVzc2FnZXMuTG9jYWxTaXRlU2VsZWN0b3JfemlwSW5mb01lc3NhZ2UpOyAKLQkJCQl6aXAgPSBkaWFsb2cub3BlbigpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzaXRlQm9va21hcms7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSB0aGUgemlwIGZpbGUgY29udGFpbnMgYW4gdXBkYXRlIHNpdGUKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBpc1ppcFNpdGUoRmlsZSBmaWxlKSB7Ci0JCWlmICghZmlsZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnppcCIpIC8vJE5PTi1OTFMtMSQKLQkJCSYmICFmaWxlLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuamFyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJWmlwcGVkU2l0ZVZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgWmlwcGVkU2l0ZVZhbGlkYXRvcihmaWxlKTsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoCi0JCQlVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLmdldERpc3BsYXkoKSwKLQkJCXZhbGlkYXRvcik7Ci0JCXJldHVybiB2YWxpZGF0b3IuaXNWYWxpZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGRpciBjb250YWlucyBhbiB1cGRhdGUgc2l0ZQotCSAqIAotCSAqIEBwYXJhbSBkaXIKLQkgKiBAcmV0dXJuCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gaXNEaXJTaXRlKEZpbGUgZGlyKSB7Ci0JCUZpbGUgc2l0ZVhNTCA9IG5ldyBGaWxlKGRpciwgInNpdGUueG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJRmlsZSBmZWF0dXJlc0RpciA9IG5ldyBGaWxlKGRpciwgImZlYXR1cmVzIik7IC8vJE5PTi1OTFMtMSQKLQkJRmlsZSBwbHVnaW5zRGlyID0gbmV3IEZpbGUoZGlyLCAicGx1Z2lucyIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzaXRlWE1MLmV4aXN0cygpCi0JCQl8fCBmZWF0dXJlc0Rpci5leGlzdHMoKQotCQkJJiYgZmVhdHVyZXNEaXIuaXNEaXJlY3RvcnkoKQotCQkJJiYgcGx1Z2luc0Rpci5leGlzdHMoKQotCQkJJiYgcGx1Z2luc0Rpci5pc0RpcmVjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBib29rbWFyayB0byBhIHppcHBlZCBzaXRlCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuCi0JICovCi0Jc3RhdGljIFNpdGVCb29rbWFyayBjcmVhdGVaaXBTaXRlKEZpbGUgZmlsZSkgewotCQl0cnkgewotCQkJVVJMIGZpbGVVUkwgPSBuZXcgVVJMKCJmaWxlIiwgbnVsbCwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVVSTCB1cmwgPQotCQkJCW5ldyBVUkwoCi0JCQkJCSJqYXI6IiAvLyROT04tTkxTLTEkCi0JCQkJCQkrIGZpbGVVUkwudG9FeHRlcm5hbEZvcm0oKS5yZXBsYWNlKCdcXCcsICcvJykKLQkJCQkJCSsgIiEvIik7IC8vJE5PTi1OTFMtMSQKLQkJCVNpdGVCb29rbWFyayBzaXRlID0gbmV3IFNpdGVCb29rbWFyayhmaWxlLmdldE5hbWUoKSwgdXJsLCBmYWxzZSk7Ci0JCQlzaXRlLnNldExvY2FsKHRydWUpOwotCQkJcmV0dXJuIHNpdGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBib29rbWFyayB0byBhIHNpdGUgb24gdGhlIGZpbGUgc3lzdGVtCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuCi0JICovCi0Jc3RhdGljIFNpdGVCb29rbWFyayBjcmVhdGVEaXJTaXRlKEZpbGUgZmlsZSkgewotCQl0cnkgewotCQkJVVJMIHVybCA9IGZpbGUudG9VUkwoKTsKLQkJCVN0cmluZyBwYXJlbnQgPSBmaWxlLmdldFBhcmVudCgpOwotCQkJaWYocGFyZW50ID09IG51bGwpCi0JCQkJcGFyZW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQlwYXJlbnQgPSBuZXcgRmlsZShwYXJlbnQpLmdldE5hbWUoKTsKLQkJCVN0cmluZyBzaXRlTmFtZSA9IHBhcmVudCArICIvIiArIGZpbGUuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCQlTaXRlQm9va21hcmsgc2l0ZSA9IG5ldyBTaXRlQm9va21hcmsoc2l0ZU5hbWUsIHVybCwgZmFsc2UpOwotCQkJc2l0ZS5zZXRMb2NhbCh0cnVlKTsKLQkJCXJldHVybiBzaXRlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0Jc3RhdGljIGNsYXNzIFppcHBlZFNpdGVWYWxpZGF0b3IgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCUZpbGUgZmlsZTsKLQkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCQlwdWJsaWMgWmlwcGVkU2l0ZVZhbGlkYXRvcihGaWxlIGZpbGUpIHsKLQkJCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJWmlwRmlsZSBzaXRlWmlwID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJLy8gY2hlY2sgaWYgdGhlIHppcCBmaWxlIGNvbnRhaW5zIHNpdGUueG1sCi0JCQkJc2l0ZVppcCA9IG5ldyBaaXBGaWxlKGZpbGUpOwotCQkJCWlmIChzaXRlWmlwLmdldEVudHJ5KCJzaXRlLnhtbCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQl2YWxpZCA9IHRydWU7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlib29sZWFuIGhhc0ZlYXR1cmVzID0gZmFsc2U7Ci0JCQkJYm9vbGVhbiBoYXNQbHVnaW5zID0gZmFsc2U7Ci0JCQkJZm9yIChFbnVtZXJhdGlvbiBpdGVyYXRvciA9IHNpdGVaaXAuZW50cmllcygpOwotCQkJCQlpdGVyYXRvci5oYXNNb3JlRWxlbWVudHMoKTsKLQkJCQkJKSB7Ci0JCQkJCVppcEVudHJ5IHpFbnRyeSA9IChaaXBFbnRyeSkgaXRlcmF0b3IubmV4dEVsZW1lbnQoKTsKLQkJCQkJaWYgKCFoYXNGZWF0dXJlcwotCQkJCQkJJiYgekVudHJ5LmdldE5hbWUoKS5zdGFydHNXaXRoKCJmZWF0dXJlcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWhhc0ZlYXR1cmVzID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQlpZiAoIWhhc1BsdWdpbnMKLQkJCQkJCSYmIHpFbnRyeS5nZXROYW1lKCkuc3RhcnRzV2l0aCgicGx1Z2lucyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWhhc1BsdWdpbnMgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWlmIChoYXNGZWF0dXJlcyAmJiBoYXNQbHVnaW5zKSB7Ci0JCQkJCQl2YWxpZCA9IHRydWU7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfSBmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQlpZiAoc2l0ZVppcCAhPSBudWxsKSB7Ci0JCQkJCQlzaXRlWmlwLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSB2YWxpZC4gKi8KLQkJcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJCXJldHVybiB2YWxpZDsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRHVwbGljYXRlKCBGaWxlIGZpbGUsIFNpdGVCb29rbWFya1tdIHNpdGVCb29rbWFya3MpIHsKLQkJCi0JCXRyeSB7Ci0JCQlyZXR1cm4gaXNEdXBsaWNhdGUoZmlsZS50b1VSTCgpLCBzaXRlQm9va21hcmtzKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkgewotCQkJLy8gdGhpcyBzaG91bGQgbm90IGV2ZXIgaGFwcGVuCi0JCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24obXVlKTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRHVwbGljYXRlKCBVUkwgdXJsLCBTaXRlQm9va21hcmtbXSBzaXRlQm9va21hcmtzKSB7Ci0JCQotCQlpZiAoIHNpdGVCb29rbWFya3MgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlmb3IoIGludCBpID0gMDsgaSA8IHNpdGVCb29rbWFya3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChzaXRlQm9va21hcmtzW2ldLmdldFVSTCgpLmVxdWFscyh1cmwpKQotCQkJCXJldHVybiB0cnVlOwotCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCQkKLQl9CQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9NaXJyb3JzRGlhbG9nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9NaXJyb3JzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZTU3NTYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTWlycm9yc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGVXaXRoTWlycm9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JVVJMRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKLQotCi1wdWJsaWMgY2xhc3MgTWlycm9yc0RpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JLy9wcml2YXRlIElTaXRlV2l0aE1pcnJvcnMgc2l0ZTsKLQlwcml2YXRlIFN0cmluZyBzaXRlTmFtZTsKLQlwcml2YXRlIElVUkxFbnRyeVtdIG1pcnJvcnM7Ci0JcHJpdmF0ZSBMaXN0IG1pcnJvcnNMaXN0OwotCXByaXZhdGUgSVVSTEVudHJ5IG1pcnJvclNlbGVjdGVkOwotCXByaXZhdGUgQnV0dG9uIGF1dG9tYXRpY2FsbHlDaG9vc2VNaXJyb3JDaGVja2JveDsKLQkvL3ByaXZhdGUgQnV0dG9uIG9rQnV0dG9uOwotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqLwotCXB1YmxpYyBNaXJyb3JzRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJU2l0ZVdpdGhNaXJyb3JzIHNpdGUsIFN0cmluZyBzaXRlTmFtZSkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpfFNXVC5SRVNJWkUpOwotCQkvL3RoaXMuc2l0ZSA9IHNpdGU7Ci0JCXRoaXMuc2l0ZU5hbWUgPSBzaXRlTmFtZTsKLQkJdHJ5IHsKLQkJCXRoaXMubWlycm9ycyA9IHNpdGUuZ2V0TWlycm9yU2l0ZUVudHJpZXMoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUsIGFzIHRoZSBtaXJyb3JzIGhhdmUgYWxyZWFkeSBiZWVuIHF1ZXJpZWQgZWFybGllciwgc28gd2UgZG9uJ3QgZXhwZWN0IGVycm9yIGhlcmUKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY3JlYXRlQnV0dG9uKAotCQkJCXBhcmVudCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLk9LX0lELAotCQkJCUlEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0JCQkJdHJ1ZSk7Ci0JCWNyZWF0ZUJ1dHRvbigKLQkJCXBhcmVudCwKLQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsCi0JCQlmYWxzZSk7Ci0JfQotCQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gNDUwOwotCQlkYXRhLmhlaWdodEhpbnQgPSAzMDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuV1JBUCApOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRleHQuc2V0VGV4dChOTFMuYmluZChVcGRhdGVVSU1lc3NhZ2VzLk1pcnJvcnNEaWFsb2dfdGV4dCwgc2l0ZU5hbWUpKTsKLQkJdGV4dC5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXRCYWNrZ3JvdW5kKCkpOwotCQl0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJLy8gdGhlIHRleHQgc2hvdWxkIG5vdCByZWNlaXZlIGZvY3VzCi0JCXRleHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJbWlycm9yc0xpc3Quc2V0Rm9jdXMoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQltaXJyb3JzTGlzdCA9IG5ldyBMaXN0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCW1pcnJvcnNMaXN0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlmb3IgKGludCBpPTA7IGk8bWlycm9ycy5sZW5ndGg7IGkrKykKLQkJCW1pcnJvcnNMaXN0LmFkZChtaXJyb3JzW2ldLmdldEFubm90YXRpb24oKSk7Ci0JCW1pcnJvcnNMaXN0LmFkZChzaXRlTmFtZSk7Ci0KLQkJbWlycm9yc0xpc3Quc2VsZWN0KDApOwotCQkKLQkJYXV0b21hdGljYWxseUNob29zZU1pcnJvckNoZWNrYm94ID0KLQkJCW5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0sgfCBTV1QuTEVGVCk7Ci0JCWF1dG9tYXRpY2FsbHlDaG9vc2VNaXJyb3JDaGVja2JveC5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuTWFpblByZWZlcmVuY2VQYWdlX2F1dG9tYXRpY2FsbHlDaG9vc2VNaXJyb3IpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlhdXRvbWF0aWNhbGx5Q2hvb3NlTWlycm9yQ2hlY2tib3guc2V0TGF5b3V0RGF0YShkYXRhKTsJCQotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQkKLQkJbWlycm9yc0xpc3QuYWRkTW91c2VMaXN0ZW5lciggbmV3IE1vdXNlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLQkJCQkJb2tQcmVzc2VkKCk7CQkJCi0JCQkJfQkKLQkJCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQkJCS8vIGRvIG5vdGhpbmcJCQkKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJCQkJLy8JZG8gbm90aGluZwkJCQkKLQkJCQl9CQkJCi0JCQl9Ci0JCSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCWludCBpID0gbWlycm9yc0xpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJLy8gZmlyc3QgZW50cnkgaXMgdGhlIHNpdGUgaXRzZWxmCi0JCWlmIChpIDxtaXJyb3JzLmxlbmd0aCkKLQkJCW1pcnJvclNlbGVjdGVkID0gbWlycm9yc1tpXTsKLQkJaWYgKGF1dG9tYXRpY2FsbHlDaG9vc2VNaXJyb3JDaGVja2JveC5nZXRTZWxlY3Rpb24oKSkgewotCQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQlwcmVmcy5zZXRWYWx1ZShVcGRhdGVDb3JlLlBfQVVUT01BVElDQUxMWV9DSE9PU0VfTUlSUk9SLCB0cnVlKTsKLQkJCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCX0KLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCQotCXB1YmxpYyBJVVJMRW50cnkgZ2V0TWlycm9yKCkgewotCQlyZXR1cm4gbWlycm9yU2VsZWN0ZWQ7Ci0JfQotCi0gICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotICAgICAgIHN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLSAgICAgICBzaGVsbC5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuTWlycm9yc0RpYWxvZ190aXRsZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTW9kZVNlbGVjdGlvblBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL01vZGVTZWxlY3Rpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NjNkNTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTW9kZVNlbGVjdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLlVwZGF0ZVNlYXJjaFJlcXVlc3Q7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgTW9kZVNlbGVjdGlvblBhZ2UgZXh0ZW5kcyBCYW5uZXJQYWdlIGltcGxlbWVudHMgSVNlYXJjaFByb3ZpZGVyIHsKLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRlTW9kZT10cnVlOwotCXByaXZhdGUgQnV0dG9uIHVwZGF0ZXNCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gbmV3RmVhdHVyZXNCdXR0b247Ci0JcHJpdmF0ZSBVcGRhdGVTZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3Q7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ1RJT05fSUQgPSAiTW9kZVNlbGVjdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBfTkVXX0ZFQVRVUkVTX01PREUgPSAibmV3LWZlYXR1cmVzLW1vZGUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIE1vZGVTZWxlY3Rpb25QYWdlKFVwZGF0ZVNlYXJjaFJlcXVlc3Qgc2VhcmNoUmVxdWVzdCkgewotCQlzdXBlcigibW9kZVNlbGVjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCXNldFRpdGxlKFVwZGF0ZVVJTWVzc2FnZXMuTW9kZVNlbGVjdGlvblBhZ2VfdGl0bGUpOyAKLQkJc2V0RGVzY3JpcHRpb24oVXBkYXRlVUlNZXNzYWdlcy5Nb2RlU2VsZWN0aW9uUGFnZV9kZXNjKTsgCi0JCXRoaXMuc2VhcmNoUmVxdWVzdCA9IHNlYXJjaFJlcXVlc3Q7Ci0JfQotCQotCXB1YmxpYyBVcGRhdGVTZWFyY2hSZXF1ZXN0IGdldFNlYXJjaFJlcXVlc3QoKSB7Ci0JCWluaXRpYWxpemVTZWFyY2goKTsKLQkJcmV0dXJuIHNlYXJjaFJlcXVlc3Q7Ci0JfQotCQotCXByaXZhdGUgSURpYWxvZ1NldHRpbmdzIGdldFNldHRpbmdzKCkgewotCQlJRGlhbG9nU2V0dGluZ3MgbWFzdGVyID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gbWFzdGVyLmdldFNlY3Rpb24oU0VDVElPTl9JRCk7Ci0JCWlmIChzZWN0aW9uPT1udWxsKQotCQkJc2VjdGlvbiA9IG1hc3Rlci5hZGROZXdTZWN0aW9uKFNFQ1RJT05fSUQpOwotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVNlYXJjaCgpIHsKLQkJaWYgKHNlYXJjaFJlcXVlc3QhPW51bGwpIHJldHVybjsKLQkJc2VhcmNoUmVxdWVzdCA9IFVwZGF0ZVV0aWxzLmNyZWF0ZU5ld1VwZGF0ZXNSZXF1ZXN0KG51bGwsIGZhbHNlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkcy5CYW5uZXJQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJdXBkYXRlc0J1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUkFESU8pOwotCQl1cGRhdGVzQnV0dG9uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5Nb2RlU2VsZWN0aW9uUGFnZV91cGRhdGVzKTsgCi0JCXVwZGF0ZU1vZGUgPSAhZ2V0U2V0dGluZ3MoKS5nZXRCb29sZWFuKFBfTkVXX0ZFQVRVUkVTX01PREUpOwotCQl1cGRhdGVzQnV0dG9uLnNldFNlbGVjdGlvbih1cGRhdGVNb2RlKTsKLQkJCi0JCWZpbmFsIExhYmVsIHVwZGF0ZXNUZXh0ID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQl1cGRhdGVzVGV4dC5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuTW9kZVNlbGVjdGlvblBhZ2VfdXBkYXRlc1RleHQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC53aWR0aEhpbnQgPSAxMDA7Ci0JCXVwZGF0ZXNUZXh0LnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJdXBkYXRlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl1cGRhdGVNb2RlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCQkvLyBzcGFjZXIKLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQluZXdGZWF0dXJlc0J1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUkFESU8pOwotCQluZXdGZWF0dXJlc0J1dHRvbi5zZXRTZWxlY3Rpb24oIXVwZGF0ZU1vZGUpOwotCQluZXdGZWF0dXJlc0J1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuTW9kZVNlbGVjdGlvblBhZ2VfbmV3RmVhdHVyZXMpOyAKLQkJbmV3RmVhdHVyZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdXBkYXRlTW9kZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQkJfSk7CQkKLQotCQlmaW5hbCBMYWJlbCBuZXdGZWF0dXJlc1RleHQgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCW5ld0ZlYXR1cmVzVGV4dC5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuTW9kZVNlbGVjdGlvblBhZ2VfbmV3RmVhdHVyZXNUZXh0KTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2Qud2lkdGhIaW50ID0gMTAwOwotCQluZXdGZWF0dXJlc1RleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJLyoKLQkJY29tcG9zaXRlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCUNvbXBvc2l0ZSBwYXJlbnQgPSAoQ29tcG9zaXRlKWUud2lkZ2V0OwotCQkJCVJlY3RhbmdsZSBjYXJlYSA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJR3JpZERhdGEgZ2QgPSAoR3JpZERhdGEpdXBkYXRlc1RleHQuZ2V0TGF5b3V0RGF0YSgpOwotCQkJCWdkLndpZHRoSGludCA9IGNhcmVhLndpZHRoOyAKLQkJCQlnZCA9IChHcmlkRGF0YSluZXdGZWF0dXJlc1RleHQuZ2V0TGF5b3V0RGF0YSgpOwotCQkJCWdkLndpZHRoSGludCA9IGNhcmVhLndpZHRoOyAKLQkJCX0KLQkJfSk7Ci0JCSovCi0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5Nb2RlU2VsZWN0aW9uUGFnZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2F2ZVNldHRpbmdzKCkgewotCQlib29sZWFuIHVwZGF0ZU1vZGUgPSB1cGRhdGVzQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQlnZXRTZXR0aW5ncygpLnB1dChQX05FV19GRUFUVVJFU19NT0RFLCAhdXBkYXRlTW9kZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVXBkYXRlTW9kZSgpIHsKLQkJcmV0dXJuIHVwZGF0ZU1vZGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCXJldHVybiB1cGRhdGVNb2RlICYmIHN1cGVyLmlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDdXJyZW50UGFnZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzQ3VycmVudFBhZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLQkJcmV0dXJuICF1cGRhdGVNb2RlOwotCX0KLQkKLQkKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL05ld1VwZGF0ZVNpdGVEaWFsb2cuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL05ld1VwZGF0ZVNpdGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE1ODA3Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9OZXdVcGRhdGVTaXRlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuU3RhdHVzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVSTENvZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuU2l0ZUJvb2ttYXJrOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5VcGRhdGVNb2RlbDsKLQotCi1wdWJsaWMgY2xhc3MgTmV3VXBkYXRlU2l0ZURpYWxvZyBleHRlbmRzIFN0YXR1c0RpYWxvZyB7Ci0JCi0JcHJvdGVjdGVkIFRleHQgbmFtZTsKLQlwcm90ZWN0ZWQgVGV4dCB1cmw7Ci0JcHJpdmF0ZSBCdXR0b24gb2tCdXR0b247Ci0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZU9LID0gZmFsc2U7Ci0JcHJpdmF0ZSBTaXRlQm9va21hcmtbXSBzaXRlQm9va21hcmtzOwotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqLwotCXB1YmxpYyBOZXdVcGRhdGVTaXRlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJZW5hYmxlT0sgPSBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIE5ld1VwZGF0ZVNpdGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFNpdGVCb29rbWFya1tdIHNpdGVCb29rbWFya3MpIHsKLQkJCi0JCXRoaXMocGFyZW50U2hlbGwpOwkJCi0JCXRoaXMuc2l0ZUJvb2ttYXJrcyA9IHNpdGVCb29rbWFya3M7Ci0JfQotCQotCXB1YmxpYyBOZXdVcGRhdGVTaXRlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBib29sZWFuIGVuYWJsZU9rQnV0dG9ucykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCWVuYWJsZU9LID0gZW5hYmxlT2tCdXR0b25zOwotCX0KLQkKLQlwdWJsaWMgTmV3VXBkYXRlU2l0ZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgYm9vbGVhbiBlbmFibGVPa0J1dHRvbnMsIFNpdGVCb29rbWFya1tdIHNpdGVCb29rbWFya3MpIHsKLQkJdGhpcyhwYXJlbnRTaGVsbCwgZW5hYmxlT2tCdXR0b25zKTsKLQkJdGhpcy5zaXRlQm9va21hcmtzID0gc2l0ZUJvb2ttYXJrczsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQkvL3N1cGVyLmNyZWF0ZUJ1dHRvbkJhcihwYXJlbnQpOwotCQlva0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbigKLQkJCQlwYXJlbnQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5PS19JRCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCXRydWUpOwotCQljcmVhdGVCdXR0b24oCi0JCQlwYXJlbnQsCi0JCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLAotCQkJZmFsc2UpOwotCQkKLQkJb2tCdXR0b24uc2V0RW5hYmxlZChlbmFibGVPSyk7Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAzNTA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5OZXdVcGRhdGVTaXRlRGlhbG9nX25hbWUpOyAKLQkJCi0JCW5hbWUgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQluYW1lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQluYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXZlcmlmeUNvbXBsZXRlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5OZXdVcGRhdGVTaXRlRGlhbG9nX3VybCk7IAotCQkKLQkJdXJsID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJdXJsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl1cmwuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJdmVyaWZ5Q29tcGxldGUoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlpbml0aWFsaXplRmllbGRzKCk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZpZWxkcygpIHsKLQkJdXJsLnNldFRleHQoImh0dHA6Ly8iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCXVwZGF0ZSgpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7Ci0JCXRyeSB7Ci0JCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gbmV3IFNpdGVCb29rbWFyayhuYW1lLmdldFRleHQoKSwgbmV3IFVSTCh1cmwuZ2V0VGV4dCgpKSwgZmFsc2UpOwotICAgICAgICAgICAgYm9va21hcmsuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCQltb2RlbC5hZGRCb29rbWFyayhib29rbWFyayk7Ci0JCQltb2RlbC5zYXZlQm9va21hcmtzKCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbXBsZXRlKCkgewotCQkJCi0JCWlmIChva0J1dHRvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47CQkKLQkJfQotCQkKLQkJaWYgKG5hbWUuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwIHx8IHVybC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJdGhpcy51cGRhdGVTdGF0dXMoIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVXBkYXRlVUkuZ2V0UGx1Z2luSWQoKSwgSVN0YXR1cy5PSywgVXBkYXRlVUlNZXNzYWdlcy5OZXdVcGRhdGVTaXRlRGlhbG9nX2Vycm9yX25hbWVPclVybE5vdFNwZWNpZmllZCwgbnVsbCkpOyAKLQkJCXJldHVybjsKLQkJfQotCQotCQl0cnkgewotCQkJVVJMIG5ld1VSTCA9IG5ldyBVUkwoVVJMQ29kZXIuZGVjb2RlKHVybC5nZXRUZXh0KCkudHJpbSgpKSk7Ci0JCQlpZiAodXJsLmdldEVkaXRhYmxlKCkpIHsKLQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKCFuZXdVUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAobmV3VVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJdGhpcy51cGRhdGVTdGF0dXMoIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVXBkYXRlVUkuZ2V0UGx1Z2luSWQoKSwgSVN0YXR1cy5PSywgVXBkYXRlVUlNZXNzYWdlcy5OZXdVcGRhdGVTaXRlRGlhbG9nX2Vycm9yX2luY29ycmVjdFVybCwgbnVsbCkpOyAKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJdGhpcy51cGRhdGVTdGF0dXMoIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgVXBkYXRlVUkuZ2V0UGx1Z2luSWQoKSwgSVN0YXR1cy5PSywgVXBkYXRlVUlNZXNzYWdlcy5OZXdVcGRhdGVTaXRlRGlhbG9nX2Vycm9yX2luY29ycmVjdFVybCwgbnVsbCkpOyAKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKGlzRHVwbGljYXRlKCkpIHsKLQkJCXJldHVybjsKLQkJfSBlbHNlIHsKLQkJCW9rQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl0aGlzLnVwZGF0ZVN0YXR1cyggbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBVcGRhdGVVSS5nZXRQbHVnaW5JZCgpLCBJU3RhdHVzLk9LLCAiIiwgbnVsbCkpOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzRHVwbGljYXRlKCkgewotCQkKLQkJaWYgKCBzaXRlQm9va21hcmtzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlmb3IoIGludCBpID0gMDsgaSA8IHRoaXMuc2l0ZUJvb2ttYXJrcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCAhaXNDdXJyZW50bHlFZGl0ZWRTaXRlQm9va21hcmsoaSkpIHsKLQkJCQlpZiAoc2l0ZUJvb2ttYXJrc1tpXS5nZXRMYWJlbCgpLmVxdWFscyhuYW1lLmdldFRleHQoKS50cmltKCkpKSB7Ci0JCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl0aGlzLnVwZGF0ZVN0YXR1cyggbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBVcGRhdGVVSS5nZXRQbHVnaW5JZCgpLCBJU3RhdHVzLk9LLCBVcGRhdGVVSU1lc3NhZ2VzLk5ld1VwZGF0ZVNpdGVEaWFsb2dfZXJyb3JfZHVwbGljYXRlTmFtZSwgbnVsbCkpOyAKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIGlmIChzaXRlQm9va21hcmtzW2ldLmdldFVSTCgpLnRvU3RyaW5nKCkudHJpbSgpLmVxdWFscyh1cmwuZ2V0VGV4dCgpLnRyaW0oKSkpIHsKLQkJCQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXRoaXMudXBkYXRlU3RhdHVzKCBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFVwZGF0ZVVJLmdldFBsdWdpbklkKCksIElTdGF0dXMuT0ssIE5MUy5iaW5kKFVwZGF0ZVVJTWVzc2FnZXMuTmV3VXBkYXRlU2l0ZURpYWxvZ19lcnJvcl9kdXBsaWNhdGVVcmwsIHNpdGVCb29rbWFya3NbaV0uZ2V0TGFiZWwoKSksIG51bGwpKTsgCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzQ3VycmVudGx5RWRpdGVkU2l0ZUJvb2ttYXJrKCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25zRW5hYmxlU3RhdGUoSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKG9rQnV0dG9uICE9IG51bGwgJiYgIW9rQnV0dG9uLmlzRGlzcG9zZWQoKSkKLQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKTsKLQl9Ci0JCi0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvT3B0aW9uYWxGZWF0dXJlc1BhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL09wdGlvbmFsRmVhdHVyZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMGY3NjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvT3B0aW9uYWxGZWF0dXJlc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklJbnN0YWxsQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy5GZWF0dXJlSGllcmFyY2h5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy5Kb2JSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLkRlZmF1bHRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgT3B0aW9uYWxGZWF0dXJlc1BhZ2UgZXh0ZW5kcyBCYW5uZXJQYWdlIGltcGxlbWVudHMgSUR5bmFtaWNQYWdlIHsKLQlwcml2YXRlIENoZWNrYm94VHJlZVZpZXdlciB0cmVlVmlld2VyOwotCXByaXZhdGUgQnV0dG9uIHNlbGVjdEFsbEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBkZXNlbGVjdEFsbEJ1dHRvbjsKLQlwcml2YXRlIElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JcHJpdmF0ZSBKb2JSb290W10gam9iUm9vdHM7Ci0KLQljbGFzcyBUcmVlQ29udGVudFByb3ZpZGVyCi0JCWV4dGVuZHMgRGVmYXVsdENvbnRlbnRQcm92aWRlcgotCQlpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEpvYlJvb3QpIHsKLQkJCQlyZXR1cm4gKChKb2JSb290KSBwYXJlbnQpLmdldEVsZW1lbnRzKCk7Ci0JCQl9Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQpIHsKLQkJCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudCBmZSA9IChGZWF0dXJlSGllcmFyY2h5RWxlbWVudCkgcGFyZW50OwotCQkJCU9iamVjdCByb290ID0gZmUuZ2V0Um9vdCgpOwotCQkJCWJvb2xlYW4gb2xkRmVhdHVyZSA9IGZhbHNlOwotCQkJCWlmIChyb290IGluc3RhbmNlb2YgSm9iUm9vdCkgewotCQkJCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iID0gKChKb2JSb290KXJvb3QpLmdldEpvYigpOwotCQkJCQlib29sZWFuIHBhdGNoID0gVXBkYXRlVXRpbHMuaXNQYXRjaChqb2IuZ2V0RmVhdHVyZSgpKTsKLQkJCQkJb2xkRmVhdHVyZSA9IGpvYi5nZXRPbGRGZWF0dXJlKCkgIT0gbnVsbDsKLQkJCQkJcmV0dXJuIGZlLmdldENoaWxkcmVuKG9sZEZlYXR1cmUsIHBhdGNoLCBjb25maWcpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGNoaWxkKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKLQkJCXJldHVybiBnZXRDaGlsZHJlbihwYXJlbnQpLmxlbmd0aCA+IDA7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KSB7Ci0JCQlpZiAoam9iUm9vdHMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJCXJldHVybiBqb2JSb290czsKLQkJfQotCX0KLQotCWNsYXNzIFRyZWVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSm9iUm9vdCkgewotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoKEpvYlJvb3QpIG9iaikuZ2V0Sm9iKCkuZ2V0RmVhdHVyZSgpOwotCQkJCXJldHVybiBmZWF0dXJlLmdldExhYmVsKCkKLQkJCQkJKyAiICIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50KSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoKEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50KSBvYmopLmdldExhYmVsKCk7Ci0JCQkJaWYgKG5hbWUgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0KLQkJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iaik7Ci0JCX0KLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmdldCgKLQkJCQlVcGRhdGVVSUltYWdlcy5ERVNDX0ZFQVRVUkVfT0JKKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSZXZpZXdQYWdlMgotCSAqLwotCXB1YmxpYyBPcHRpb25hbEZlYXR1cmVzUGFnZShJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXN1cGVyKCJPcHRpb25hbEZlYXR1cmVzIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VGl0bGUoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX09wdGlvbmFsRmVhdHVyZXNQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX09wdGlvbmFsRmVhdHVyZXNQYWdlX2Rlc2MpOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5jb25uZWN0KHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEpvYnMoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gam9icykgewotCQlqb2JSb290cyA9IG5ldyBKb2JSb290W2pvYnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlqb2JSb290c1tpXSA9IG5ldyBKb2JSb290KGpvYnNbaV0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5kaXNjb25uZWN0KHRoaXMpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjbGllbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQljcmVhdGVDaGVja2JveFRyZWVWaWV3ZXIoY2xpZW50KTsKLQotCQlzZWxlY3RBbGxCdXR0b24gPSBuZXcgQnV0dG9uKGNsaWVudCwgU1dULlBVU0gpOwotCQlzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0QWxsKHRydWUpOwotCQkJfQotCQl9KTsKLQkJc2VsZWN0QWxsQnV0dG9uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX09wdGlvbmFsRmVhdHVyZXNQYWdlX3NlbGVjdEFsbCk7Ci0JCUdyaWREYXRhIGdkID0KLQkJCW5ldyBHcmlkRGF0YSgKLQkJCQlHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChzZWxlY3RBbGxCdXR0b24pOwotCi0JCWRlc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihjbGllbnQsIFNXVC5QVVNIKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0QWxsKGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX09wdGlvbmFsRmVhdHVyZXNQYWdlX2Rlc2VsZWN0QWxsKTsKLQkJZ2QgPQotCQkJbmV3IEdyaWREYXRhKAotCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoZGVzZWxlY3RBbGxCdXR0b24pOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNsaWVudCwgIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5NdWx0aU9wdGlvbmFsRmVhdHVyZXNQYWdlMiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCQotCQlyZXR1cm4gY2xpZW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDaGVja2JveFRyZWVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfT3B0aW9uYWxGZWF0dXJlc1BhZ2VfdHJlZUxhYmVsKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdHJlZVZpZXdlciA9Ci0JCQluZXcgQ2hlY2tib3hUcmVlVmlld2VyKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLnZlcnRpY2FsU3BhbiA9IDI7Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEoZ2QpOwotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVHJlZUNvbnRlbnRQcm92aWRlcigpKTsKLQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUcmVlTGFiZWxQcm92aWRlcigpKTsKLQkJdHJlZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGUpIHsKLQkJCQloYW5kbGVDaGVja2VkKGUuZ2V0RWxlbWVudCgpLCBlLmdldENoZWNrZWQoKSk7Ci0JCQl9Ci0JCX0pOwotCQl0cmVlVmlld2VyLnNldEF1dG9FeHBhbmRMZXZlbChBYnN0cmFjdFRyZWVWaWV3ZXIuQUxMX0xFVkVMUyk7Ci0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJaWYgKHZpc2libGUpIHsKLQkJCXRyZWVWaWV3ZXIuc2V0SW5wdXQoam9iUm9vdHMpOwotCQkJaW5pdGlhbGl6ZVN0YXRlcygpOwotCQl9Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCWlmICh2aXNpYmxlKSB7Ci0JCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRGb2N1cygpOwotCQl9CQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVN0YXRlcygpIHsKLQkJQXJyYXlMaXN0IGNoZWNrZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFycmF5TGlzdCBncmF5ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFycmF5TGlzdCBlZGl0YWJsZSA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYlJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQljaGVja2VkLmFkZChqb2JSb290c1tpXSk7Ci0JCQlncmF5ZWQuYWRkKGpvYlJvb3RzW2ldKTsKLQkJCWJvb2xlYW4gdXBkYXRlID0gam9iUm9vdHNbaV0uZ2V0Sm9iKCkuZ2V0T2xkRmVhdHVyZSgpICE9IG51bGw7Ci0JCQlpbml0aWFsaXplU3RhdGVzKHVwZGF0ZSwgam9iUm9vdHNbaV0uZ2V0RWxlbWVudHMoKSwgY2hlY2tlZCwgZ3JheWVkLCBlZGl0YWJsZSk7Ci0JCX0KLQkJdHJlZVZpZXdlci5zZXRDaGVja2VkRWxlbWVudHMoY2hlY2tlZC50b0FycmF5KCkpOwotCQl0cmVlVmlld2VyLnNldEdyYXllZEVsZW1lbnRzKGdyYXllZC50b0FycmF5KCkpOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZS5zaXplKCk+MCk7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUuc2l6ZSgpPjApOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplU3RhdGVzKAotCQlib29sZWFuIHVwZGF0ZSwKLQkJT2JqZWN0W10gZWxlbWVudHMsCi0JCUFycmF5TGlzdCBjaGVja2VkLAotCQlBcnJheUxpc3QgZ3JheWVkLAotCQlBcnJheUxpc3QgZWRpdGFibGUpIHsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudCBlbGVtZW50ID0KLQkJCQkoRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQpIGVsZW1lbnRzW2ldOwotCQkJaWYgKGVsZW1lbnQuaXNDaGVja2VkKCkpCi0JCQkJY2hlY2tlZC5hZGQoZWxlbWVudCk7Ci0JCQlpZiAoIWVsZW1lbnQuaXNFZGl0YWJsZSgpKQotCQkJCWdyYXllZC5hZGQoZWxlbWVudCk7Ci0JCQllbHNlCi0JCQkJZWRpdGFibGUuYWRkKGVsZW1lbnQpOwotCQkJaW5pdGlhbGl6ZVN0YXRlcyh1cGRhdGUsIGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKSwgY2hlY2tlZCwgZ3JheWVkLCBlZGl0YWJsZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VsZWN0QWxsKGJvb2xlYW4gdmFsdWUpIHsKLQkJQXJyYXlMaXN0IHNlbGVjdGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYlJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iID0gam9iUm9vdHNbaV0uZ2V0Sm9iKCk7Ci0JCQlzZWxlY3RlZC5hZGQoam9iKTsKLQkJCU9iamVjdFtdIGVsZW1lbnRzID0gam9iUm9vdHNbaV0uZ2V0RWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudCBlbGVtZW50ID0gKEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50KSBlbGVtZW50c1tqXTsKLQkJCQlzZWxlY3RBbGwoam9iLmdldE9sZEZlYXR1cmUoKSAhPSBudWxsLCBlbGVtZW50LCBzZWxlY3RlZCwgdmFsdWUpOwotCQkJfQotCQl9Ci0JCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKHNlbGVjdGVkLnRvQXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdEFsbCgKLQkJYm9vbGVhbiB1cGRhdGUsCi0JCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50IHJlZiwKLQkJQXJyYXlMaXN0IHNlbGVjdGVkLAotCQlib29sZWFuIHZhbHVlKSB7Ci0KLQkJaWYgKCFyZWYuaXNPcHRpb25hbCgpKSB7Ci0JCQlzZWxlY3RlZC5hZGQocmVmKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChyZWYuaXNFZGl0YWJsZSgpKSB7Ci0JCQkJcmVmLnNldENoZWNrZWQodmFsdWUpOwotCQkJCWlmICh2YWx1ZSkKLQkJCQkJc2VsZWN0ZWQuYWRkKHJlZik7Ci0JCQl9IGVsc2UgaWYgKHJlZi5pc0NoZWNrZWQoKSkgewotCQkJCXNlbGVjdGVkLmFkZChyZWYpOwotCQkJfQotCQl9Ci0JCU9iamVjdFtdIGluY2x1ZGVkID0gcmVmLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZWQubGVuZ3RoOyBpKyspIHsKLQkJCXNlbGVjdEFsbCh1cGRhdGUsIChGZWF0dXJlSGllcmFyY2h5RWxlbWVudCkgaW5jbHVkZWRbaV0sIHNlbGVjdGVkLCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2hlY2tlZChPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBjaGVja2VkKSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSm9iUm9vdCkgewotCQkJdHJlZVZpZXdlci5zZXRDaGVja2VkKGVsZW1lbnQsICFjaGVja2VkKTsKLQkJCXJldHVybjsKLQkJfQotCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudCBmZSA9IChGZWF0dXJlSGllcmFyY2h5RWxlbWVudCkgZWxlbWVudDsKLQotCQlpZiAoIWZlLmlzRWRpdGFibGUoKSkKLQkJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChlbGVtZW50LCAhY2hlY2tlZCk7Ci0JCWVsc2UgewotCQkJLy8gdXBkYXRlIHRoZSByZXN1bHQKLQkJCWZlLnNldENoZWNrZWQoY2hlY2tlZCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElGZWF0dXJlW10gZ2V0VW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcyhJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iLCBJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYlJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoam9iLmVxdWFscyhqb2JSb290c1tpXS5nZXRKb2IoKSkpIHsKLQkJCQlyZXR1cm4gam9iUm9vdHNbaV0uZ2V0VW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcyhjb25maWcsIHRhcmdldFNpdGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgSUZlYXR1cmVbMF07Ci0JfQotCQotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZVtdIGdldENoZWNrZWRPcHRpb25hbEZlYXR1cmVzKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBjdXJyZW50Sm9iKSB7Ci0JCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJSm9iUm9vdCBqb2JSb290ID0gbnVsbDsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYlJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY3VycmVudEpvYi5lcXVhbHMoam9iUm9vdHNbaV0uZ2V0Sm9iKCkpKSB7Ci0JCQkJam9iUm9vdCA9IGpvYlJvb3RzW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChqb2JSb290ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElGZWF0dXJlUmVmZXJlbmNlWzBdOwotCi0JCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IgPSBqb2JSb290LmdldEpvYigpOwotCQlib29sZWFuIHVwZGF0ZSA9IGpvYi5nZXRPbGRGZWF0dXJlKCkgIT0gbnVsbDsKLQkJYm9vbGVhbiBwYXRjaCA9IFVwZGF0ZVV0aWxzLmlzUGF0Y2goam9iLmdldEZlYXR1cmUoKSk7Ci0JCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50W10gZWxlbWVudHMgPSBqb2JSb290LmdldEVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWVsZW1lbnRzW2ldLmFkZENoZWNrZWRPcHRpb25hbEZlYXR1cmVzKHVwZGF0ZSwgcGF0Y2gsIGNvbmZpZywgc2V0KTsKLQkJfQotCQlyZXR1cm4gKElGZWF0dXJlUmVmZXJlbmNlW10pIHNldC50b0FycmF5KG5ldyBJRmVhdHVyZVJlZmVyZW5jZVtzZXQuc2l6ZSgpXSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmVwbGFjZUZlYXR1cmVWZXJzaW9uV2l6YXJkLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyMjgzMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBSZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmQgZXh0ZW5kcyBXaXphcmQgewotCXByaXZhdGUgUmVwbGFjZUZlYXR1cmVWZXJzaW9uV2l6YXJkUGFnZSBwYWdlOwotCi0JcHVibGljIFJlcGxhY2VGZWF0dXJlVmVyc2lvbldpemFyZChJRmVhdHVyZSBjdXJyZW50RmVhdHVyZSwgSUZlYXR1cmVbXSBmZWF0dXJlcykgewotCQlzZXRXaW5kb3dUaXRsZShVcGRhdGVVSU1lc3NhZ2VzLlN3YXBGZWF0dXJlV2l6YXJkX3RpdGxlKTsgCi0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKFVwZGF0ZVVJSW1hZ2VzLkRFU0NfVVBEQVRFX1dJWik7Ci0JCXBhZ2UgPSBuZXcgUmVwbGFjZUZlYXR1cmVWZXJzaW9uV2l6YXJkUGFnZShjdXJyZW50RmVhdHVyZSwgZmVhdHVyZXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlhZGRQYWdlKHBhZ2UpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlyZXR1cm4gcGFnZS5wZXJmb3JtRmluaXNoKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmRQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NDNkNTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmVwbGFjZUZlYXR1cmVWZXJzaW9uV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi0KLXB1YmxpYyBjbGFzcyBSZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0JCi0JcHJpdmF0ZSBJRmVhdHVyZSBjdXJyZW50RmVhdHVyZTsKLQlwcml2YXRlIElGZWF0dXJlW10gZmVhdHVyZXM7Ci0JcHJpdmF0ZSBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsKLQotCXB1YmxpYyBSZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmRQYWdlKElGZWF0dXJlIGN1cnJlbnRGZWF0dXJlLCBJRmVhdHVyZVtdIGZlYXR1cmVzKSB7Ci0JCXN1cGVyKCJTd2FwRmVhdHVyZSIpOyAvLyROT04tTkxTLTEkCi0JCXNldFRpdGxlKFVwZGF0ZVVJTWVzc2FnZXMuU3dhcEZlYXR1cmVXaXphcmRQYWdlX3RpdGxlKTsgCi0JCXNldERlc2NyaXB0aW9uKFVwZGF0ZVVJTWVzc2FnZXMuU3dhcEZlYXR1cmVXaXphcmRQYWdlX2Rlc2MpOyAKLQkJdGhpcy5jdXJyZW50RmVhdHVyZSA9IGN1cnJlbnRGZWF0dXJlOwotCQl0aGlzLmZlYXR1cmVzID0gZmVhdHVyZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSB0YWJsZUNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXRhYmxlQ29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRhYmxlQ29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5Td2FwRmVhdHVyZVdpemFyZFBhZ2VfbGFiZWwpOyAKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSh0YWJsZUNvbnRhaW5lciwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUgfCBTV1QuVl9TQ1JPTEwpOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQl0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlVcGRhdGVMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0KLQkJCQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJCQlyZXR1cm4gcHJvdmlkZXIuZ2V0KFVwZGF0ZVVJSW1hZ2VzLkRFU0NfVU5DT05GX0ZFQVRVUkVfT0JKLCAwKTsKLQkJCX0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoSUZlYXR1cmUpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIGZlYXR1cmUuZ2V0TGFiZWwoKSArICIgIiArIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0pOwotCQkKLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBmZWF0dXJlczsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQkJfSk7Ci0JCQotCQl0YWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIHYxID0gKChJRmVhdHVyZSllMSkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKTsKLQkJCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciB2MiA9ICgoSUZlYXR1cmUpZTIpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCk7Ci0JCQkJcmV0dXJuIHYxLmlzR3JlYXRlck9yRXF1YWxUbyh2MikgPyAtMSA6IDE7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdGFibGVWaWV3ZXIuYWRkRmlsdGVyKG5ldyBWaWV3ZXJGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJU3RyaW5nIHZlcnNpb24gPQotCQkJCQkoKElGZWF0dXJlKSBlbGVtZW50KS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7Ci0JCQkJcmV0dXJuICF2ZXJzaW9uLmVxdWFscygKLQkJCQkJY3VycmVudEZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJdGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzc2VsID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlJRmVhdHVyZSBjaG9zZW5GZWF0dXJlID0gKElGZWF0dXJlKXNzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJSVN0YXR1cyB2YWxpZGF0aW9uU3RhdHVzID0KLQkJCQkJT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQZW5kaW5nUmVwbGFjZVZlcnNpb24oY3VycmVudEZlYXR1cmUsIGNob3NlbkZlYXR1cmUpOwotCQkJCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0aW9uU3RhdHVzID09IG51bGwgfHwgdmFsaWRhdGlvblN0YXR1cy5nZXRDb2RlKCkgPT0gSVN0YXR1cy5XQVJOSU5HKTsKLQkJCi0JCQkJaWYgKHZhbGlkYXRpb25TdGF0dXMgPT0gbnVsbCkgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJfSBlbHNlIGlmICh2YWxpZGF0aW9uU3RhdHVzLmdldENvZGUoKSA9PSBJU3RhdHVzLldBUk5JTkcpIHsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCQlzZXRNZXNzYWdlKHZhbGlkYXRpb25TdGF0dXMuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZSh2YWxpZGF0aW9uU3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCXRhYmxlVmlld2VyLnNldElucHV0KGN1cnJlbnRGZWF0dXJlKTsKLQkJdGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5zZWxlY3QoMCk7Ci0JCXNldENvbnRyb2wodGFibGVDb250YWluZXIpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udCh0YWJsZUNvbnRhaW5lcik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbil0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJSUZlYXR1cmUgY2hvc2VuRmVhdHVyZSA9IChJRmVhdHVyZSlzc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkKLQkJcmV0dXJuIHN3YXAoY3VycmVudEZlYXR1cmUsIGNob3NlbkZlYXR1cmUpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gc3dhcChmaW5hbCBJRmVhdHVyZSBjdXJyZW50RmVhdHVyZSwgZmluYWwgSUZlYXR1cmUgYW5vdGhlckZlYXR1cmUpIHsKLS8vCQlJU3RhdHVzIHN0YXR1cyA9Ci0vLwkJCU9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGVuZGluZ1JlcGxhY2VWZXJzaW9uKGN1cnJlbnRGZWF0dXJlLCBhbm90aGVyRmVhdHVyZSk7Ci0vLwkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0vLwkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcigKLS8vCQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0vLwkJCQludWxsLAotLy8JCQkJbnVsbCwKLS8vCQkJCXN0YXR1cyk7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0KLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQlJT3BlcmF0aW9uIHJldmVydE9wZXJhdGlvbiA9Ci0JCQkJCU9wZXJhdGlvbnNNYW5hZ2VyCi0JCQkJCQkuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpCi0JCQkJCQkuY3JlYXRlUmVwbGFjZUZlYXR1cmVWZXJzaW9uT3BlcmF0aW9uKGN1cnJlbnRGZWF0dXJlLCBhbm90aGVyRmVhdHVyZSk7Ci0JCQkJYm9vbGVhbiByZXN0YXJ0aW5nID0gZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJYm9vbGVhbiByZXN0YXJ0TmVlZGVkID0gcmV2ZXJ0T3BlcmF0aW9uLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JCQkJCXJlc3RhcnRpbmcgPSBVcGRhdGVVSS5yZXF1ZXN0UmVzdGFydChyZXN0YXJ0TmVlZGVkKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJLy9pZiB0aGUgc3lzdGVtIGlzIGFscmVhZHkgc2h1dGRvd24sIGVuZGluZyB0aGUgbW9uaXRvciBoZXJlIHdpbGwgZmFpbAotCQkJCQlpZiAoIXJlc3RhcnRpbmcpCi0JCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIHRydWUsIG9wZXJhdGlvbik7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgdGFyZ2V0RXhjZXB0aW9uID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJCWlmICh0YXJnZXRFeGNlcHRpb24gaW5zdGFuY2VvZiBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbikgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmVzaXphYmxlSW5zdGFsbFdpemFyZERpYWxvZy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmVzaXphYmxlSW5zdGFsbFdpemFyZERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWQyMzBhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1Jlc2l6YWJsZUluc3RhbGxXaXphcmREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLXB1YmxpYyBjbGFzcyBSZXNpemFibGVJbnN0YWxsV2l6YXJkRGlhbG9nIGV4dGVuZHMgV2l6YXJkRGlhbG9nIHsKLQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHJlc2l6YWJsZSB3aXphcmQgZGlhbG9nLgotCSAqLwotCXB1YmxpYyBSZXNpemFibGVJbnN0YWxsV2l6YXJkRGlhbG9nKFNoZWxsIHBhcmVudCwgSVdpemFyZCB3aXphcmQsIFN0cmluZyB0aXRsZSkgewotCQlzdXBlcihwYXJlbnQsIHdpemFyZCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQl9CQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY3JlYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGUoKSB7Ci0JCXN1cGVyLmNyZWF0ZSgpOwotCQkKLQkJZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQkJU1dUVXRpbC5zZXREaWFsb2dTaXplKHRoaXMsIDYwMCwgNTAwKTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNvcGVuKCkKLQkgKi8KLQlwdWJsaWMgaW50IG9wZW4oKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQbGF0Zm9ybUNvbmZpZ1ZhbGlkKCk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCkgewotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKAotCQkJCQlnZXRTaGVsbCgpLAotCQkJCQludWxsLAotCQkJCQludWxsLAotCQkJCQlzdGF0dXMpOwotCQkJcmV0dXJuIElEaWFsb2dDb25zdGFudHMuQUJPUlRfSUQ7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5vcGVuKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWU5NzQzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1JldmVydENvbmZpZ3VyYXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotCi0vKioKLSAqIEBhdXRob3IgV2Fzc2ltIE1lbGhlbQotICovCi1wdWJsaWMgY2xhc3MgUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZCBleHRlbmRzIFdpemFyZCB7Ci0JCi0JUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZFBhZ2UgcGFnZTsKLQotCXB1YmxpYyBSZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkKCkgewotCQlzdXBlcigpOwotCQlzZXRXaW5kb3dUaXRsZShVcGRhdGVVSU1lc3NhZ2VzLlJldmVydENvbmZpZ3VyYXRpb25XaXphcmRfd3RpdGxlKTsgCi0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKFVwZGF0ZVVJSW1hZ2VzLkRFU0NfQ09ORklHX1dJWik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlwYWdlID0gbmV3IFJldmVydENvbmZpZ3VyYXRpb25XaXphcmRQYWdlKCk7Ci0JCWFkZFBhZ2UocGFnZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJcmV0dXJuIHBhZ2UucGVyZm9ybUZpbmlzaCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1JldmVydENvbmZpZ3VyYXRpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNTAzN2UuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLQotcHVibGljIGNsYXNzIFJldmVydENvbmZpZ3VyYXRpb25XaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIGFjdGl2aXRpZXNWaWV3ZXI7Ci0JcHJpdmF0ZSBUYWJsZVZpZXdlciBjb25maWdWaWV3ZXI7Ci0JcHVibGljIHN0YXRpYyBDb2xvciBibHVlQkdDb2xvcjsKLQlwcml2YXRlIFNhc2hGb3JtIHNhc2hGb3JtOwotCi0JcHVibGljIFJldmVydENvbmZpZ3VyYXRpb25XaXphcmRQYWdlKCkgewotCQlzdXBlcigiUmV2ZXJ0Q29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCXNldFRpdGxlKFVwZGF0ZVVJTWVzc2FnZXMuUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZFBhZ2VfdGl0bGUpOyAKLQkJc2V0RGVzY3JpcHRpb24oVXBkYXRlVUlNZXNzYWdlcy5SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9kZXNjKTsgCi0JCWJsdWVCR0NvbG9yID0gbmV3IENvbG9yKG51bGwsIDIzOCwyMzgsMjU1KTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXNhc2hGb3JtID0gbmV3IFNhc2hGb3JtKHBhcmVudCwgU1dULlZFUlRJQ0FMKTsKLQkJc2FzaEZvcm0uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlzYXNoRm9ybS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQljcmVhdGVDb25maWd1cmF0aW9uc1NlY3Rpb24oc2FzaEZvcm0pOwotCQljcmVhdGVBY3Rpdml0aWVzU2VjdGlvbihzYXNoRm9ybSk7Ci0JCXNldENvbnRyb2woc2FzaEZvcm0pOwotCi0JCU9iamVjdCBlbGVtZW50ID0gY29uZmlnVmlld2VyLmdldEVsZW1lbnRBdCgwKTsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkKLQkJCWNvbmZpZ1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWxlbWVudCkpOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHNhc2hGb3JtKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29uZmlndXJhdGlvbnNTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHRhYmxlQ29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJdGFibGVDb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXRhYmxlQ29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRhYmxlQ29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9sYWJlbCk7IAotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHRhYmxlQ29udGFpbmVyLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJY29uZmlnVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJY29uZmlnVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlVcGRhdGVMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0KLQkJCQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJCQlyZXR1cm4gcHJvdmlkZXIuZ2V0KFVwZGF0ZVVJSW1hZ2VzLkRFU0NfQ09ORklHX09CSiwgMCk7Ci0JCQl9Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gVXRpbGl0aWVzLmZvcm1hdCgKLQkJCQkJKChJSW5zdGFsbENvbmZpZ3VyYXRpb24pIGVsZW1lbnQpLmdldENyZWF0aW9uRGF0ZSgpKTsKLQkJCX0KLQotCQl9KTsKLQkJY29uZmlnVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gKElMb2NhbFNpdGUpIGVsZW1lbnQ7Ci0JCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGN1cnJlbnQgPQlsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJCQlJSW5zdGFsbENvbmZpZ3VyYXRpb25bXSBjb25maWd1cmF0aW9ucyA9IGxvY2FsU2l0ZS5nZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpOwotCQkJCWZvciAoaW50IGkgPSBjb25maWd1cmF0aW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotCQkJCQlpZiAoIWN1cnJlbnQuZXF1YWxzKGNvbmZpZ3VyYXRpb25zW2ldKSkgewotCQkJCQkJcmVzdWx0LmFkZChjb25maWd1cmF0aW9uc1tpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZCgKLQkJCQlWaWV3ZXIgdmlld2VyLAotCQkJCU9iamVjdCBvbGRJbnB1dCwKLQkJCQlPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQotCQl9KTsKLQotCQljb25maWdWaWV3ZXIKLQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9CShJU3RydWN0dXJlZFNlbGVjdGlvbikgZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlJbnN0YWxsQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gKEluc3RhbGxDb25maWd1cmF0aW9uKXNzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJYWN0aXZpdGllc1ZpZXdlci5zZXRJbnB1dChjdXJyZW50Q29uZmlnKTsKLQkJCQlhY3Rpdml0aWVzVmlld2VyLnJlZnJlc2goKTsKLQkJCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IGFjdGl2aXRpZXNWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotCQkJCWZvciAoaW50IGkgPTA7IGk8aXRlbXMubGVuZ3RoOyBpKyspewotCQkJCQlJQWN0aXZpdHkgYWN0aXZpdHkgPSAoSUFjdGl2aXR5KWl0ZW1zW2ldLmdldERhdGEoKTsKLQkJCQkJLy8gZm9yIG5vdywgd2UgdGVzdCBleGFjdCBjb25maWcgbWF0Y2guIElmIG5lZWRlZCwgd2UgY2FuIGFsc28gY29tcGFyZSBkYXRlcywgZXRjLgotCQkJCQlpZiAoKChJbnN0YWxsQ29uZmlndXJhdGlvbilhY3Rpdml0eS5nZXRJbnN0YWxsQ29uZmlndXJhdGlvbigpKS5lcXVhbHMoY3VycmVudENvbmZpZykpCi0JCQkJCQlpdGVtc1tpXS5zZXRCYWNrZ3JvdW5kKGJsdWVCR0NvbG9yKTsKLQkJCQkJZWxzZQotCQkJCQkJaXRlbXNbaV0uc2V0QmFja2dyb3VuZChhY3Rpdml0aWVzVmlld2VyLmdldENvbnRyb2woKS5nZXRCYWNrZ3JvdW5kKCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJdHJ5IHsKLQkJCWNvbmZpZ1ZpZXdlci5zZXRJbnB1dChTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVBY3Rpdml0aWVzU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KAotCQkJVXBkYXRlVUlNZXNzYWdlcy5SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZV9hY3Rpdml0aWVzKTsgCi0KLQkJVGFibGVMYXlvdXRDb21wb3NpdGUgdGxDb21wb3NpdGU9IG5ldyBUYWJsZUxheW91dENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdGxDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWFjdGl2aXRpZXNWaWV3ZXIgPSBBY3Rpdml0aWVzVGFibGVWaWV3ZXIuY3JlYXRlVmlld2VyKHRsQ29tcG9zaXRlLCBmYWxzZSk7Ci0KLQkJdGxDb21wb3NpdGUuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uUGl4ZWxEYXRhKDE2LCB0cnVlLCB0cnVlKSk7Ci0JCXRsQ29tcG9zaXRlLmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMiwgMTUwLCB0cnVlKSk7Ci0JCXRsQ29tcG9zaXRlLmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNSwgMjAwLCB0cnVlKSk7Ci0JCXRsQ29tcG9zaXRlLmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNCwgMTAwLCB0cnVlKSk7Ci0KLQkJLy9hY3Rpdml0aWVzVmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJVGFibGVJdGVtW10gY29uZmlncyA9IGNvbmZpZ1ZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0JCWlmIChjb25maWdzLmxlbmd0aCA+MCkKLQkJCWFjdGl2aXRpZXNWaWV3ZXIuc2V0SW5wdXQoY29uZmlnc1swXS5nZXREYXRhKCkpOwotCQkKLQkJY29tcG9zaXRlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCWludCBzYXNoSGVpZ2h0ID0gZ2V0U2FzaEZvcm0oKS5nZXRTaXplKCkueTsKLQkJCQlpbnQgc2FzaFdpZHRoID0gZ2V0U2FzaEZvcm0oKS5nZXRTaXplKCkueDsKLQkJCQlpZiAoY29tcG9zaXRlLmdldFNpemUoKS55ID4gKHNhc2hIZWlnaHQqMC44NSkgJiYgY29tcG9zaXRlLmdldFNpemUoKS54ID4gKHNhc2hXaWR0aCowLjUpKXsKLQkJCQkJZ2V0U2FzaEZvcm0oKS5zZXRPcmllbnRhdGlvbihTV1QuSE9SSVpPTlRBTCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZ2V0U2FzaEZvcm0oKS5zZXRPcmllbnRhdGlvbihTV1QuVkVSVElDQUwpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlibHVlQkdDb2xvci5kaXNwb3NlKCk7Ci0JfQotCQotCXB1YmxpYyBTYXNoRm9ybSBnZXRTYXNoRm9ybSgpewotCQlyZXR1cm4gc2FzaEZvcm07Ci0JfQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCVNoZWxsIHNoZWxsID0gZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKTsKLQkJYm9vbGVhbiByZXN1bHQgPQotCQkJTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oCi0JCQkJc2hlbGwsCi0JCQkJc2hlbGwuZ2V0VGV4dCgpLAotCQkJCVVwZGF0ZVVJTWVzc2FnZXMuUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZFBhZ2VfcXVlc3Rpb24pOyAKLQkJaWYgKCFyZXN1bHQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJYm9vbGVhbiBmaW5pc2ggPSBwZXJmb3JtUmV2ZXJ0KCk7Ci0JCWlmIChmaW5pc2gpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkucmVzdGFydCgpOwotCQl9Ci0JCXJldHVybiBmaW5pc2g7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybVJldmVydCgpIHsKLQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsID0KLQkJCShJU3RydWN0dXJlZFNlbGVjdGlvbikgY29uZmlnVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlmaW5hbCBJSW5zdGFsbENvbmZpZ3VyYXRpb24gdGFyZ2V0ID0KLQkJCShJSW5zdGFsbENvbmZpZ3VyYXRpb24pIHNzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPQotCQkJT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQZW5kaW5nUmV2ZXJ0KHRhcmdldCk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0Q29kZSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcigKLQkJCQlVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJCW51bGwsCi0JCQkJbnVsbCwKLQkJCQlzdGF0dXMpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQlJT3BlcmF0aW9uIHJldmVydE9wZXJhdGlvbiA9Ci0JCQkJCU9wZXJhdGlvbnNNYW5hZ2VyCi0JCQkJCQkuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpCi0JCQkJCQkuY3JlYXRlUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbigKLQkJCQkJCXRhcmdldCwKLQkJCQkJCW5ldyBVSVByb2JsZW1IYW5kbGVyKCkpOwotCQkJCXRyeSB7Ci0JCQkJCXJldmVydE9wZXJhdGlvbi5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIHRydWUsIG9wZXJhdGlvbik7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgdGFyZ2V0RXhjZXB0aW9uID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJCWlmICh0YXJnZXRFeGNlcHRpb24gaW5zdGFuY2VvZiBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbikgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1Jldmlld1BhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1Jldmlld1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZmZWFiNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXZpZXdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eURpYWxvZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5IeXBlcmxpbmtTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TY3JvbGxlZEZvcm1UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVBsdWdpbkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlRmVhdHVyZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JVVJMRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlZlcnNpb25lZElkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuRXh0ZW5kZWRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLkZlYXR1cmVTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuT3BlcmF0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9wZXJhdGlvblZhbGlkYXRvci5JbnRlcm5hbEltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy5PcGVyYXRpb25WYWxpZGF0b3IuUmVxdWlyZWRGZWF0dXJlc1Jlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5GZWF0dXJlUmVmZXJlbmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuU2ltcGxlRmVhdHVyZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLlNpdGVCb29rbWFyazsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuU2l0ZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy5EZWZhdWx0Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy5TaGFyZWRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuT3BlcmF0aW9uc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC5JVXBkYXRlU2VhcmNoU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLlVwZGF0ZVNlYXJjaFJlcXVlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBSZXZpZXdQYWdlCWV4dGVuZHMgQmFubmVyUGFnZSB7Ci0KLQlwcml2YXRlIExhYmVsIGxhYmVsOwotCXByaXZhdGUgQXJyYXlMaXN0IGpvYnM7Ci0JcHJpdmF0ZSBMYWJlbCBjb3VudGVyTGFiZWw7Ci0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRpb25TdGF0dXM7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIHByb2JsZW1hdGljRmVhdHVyZXMgPSBuZXcgSGFzaFNldCgpOwotCS8vIGZlYXR1cmUgdGhhdCB3YXMgcmVjZW50bHkgc2VsZWN0ZWQgb3IgbnVsbAotCXByaXZhdGUgSUZlYXR1cmUgbmV3bHlTZWxlY3RlZEZlYXR1cmU7Ci0JLy8gCi0JcHJpdmF0ZSBGZWF0dXJlU3RhdHVzIGxhc3REaXNwbGF5ZWRTdGF0dXM7Ci0JcHJpdmF0ZSBQcm9wZXJ0eURpYWxvZ0FjdGlvbiBwcm9wZXJ0aWVzQWN0aW9uOwotCXByaXZhdGUgU2Nyb2xsZWRGb3JtVGV4dCBkZXNjTGFiZWw7Ci0JcHJpdmF0ZSBCdXR0b24gc3RhdHVzQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIG1vcmVJbmZvQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIHByb3BlcnRpZXNCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gc2VsZWN0UmVxdWlyZWRGZWF0dXJlc0J1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBmaWx0ZXJDaGVjazsKLQlwcml2YXRlIEJ1dHRvbiBmaWx0ZXJPbGRlclZlcnNpb25DaGVjazsKLQlwcml2YXRlIENvbnRhaW5tZW50RmlsdGVyIGZpbHRlciA9IG5ldyBDb250YWlubWVudEZpbHRlcigpOwotCXByaXZhdGUgTGF0ZXN0VmVyc2lvbkZpbHRlciBvbGRlclZlcnNpb25GaWx0ZXIgPSBuZXcgTGF0ZXN0VmVyc2lvbkZpbHRlcigpOwotCXByaXZhdGUgVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0OwotCS8vcHJpdmF0ZSBpbnQgTEFCRUxfT1JERVIgPSAxOwotCS8vcHJpdmF0ZSBpbnQgVkVSU0lPTl9PUkRFUiA9IDE7Ci0JLy9wcml2YXRlIGludCBQUk9WSURFUl9PUkRFUiA9IDE7Ci0gICAgcHJpdmF0ZSBDb250YWluZXJDaGVja2VkVHJlZVZpZXdlciB0cmVlVmlld2VyOwotICAgIHByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNVcGRhdGVTZWFyY2g7Ci0gIAotICAgIAotICAgIGNsYXNzIFRyZWVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBEZWZhdWx0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMKLSAgICAgICAgICAgIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQotICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHBhcmVudCkgewotICAgICAgICAgICAgcmV0dXJuIGdldFNpdGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oZmluYWwgT2JqZWN0IHBhcmVudCkgewotICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFNpdGVCb29rbWFyaykgewotICAgICAgICAgICAgICAgIFNpdGVCb29rbWFyayBib29rbWFyayA9IChTaXRlQm9va21hcmspIHBhcmVudDsKLSAgICAgICAgICAgICAgICBib29rbWFyay5nZXRTaXRlKG51bGwpOyAvLyB0cmlnZ2VycyBjYXRhbG9nIGNyZWF0aW9uCi0gICAgICAgICAgICAgICAgT2JqZWN0W10gY2hpbGRyZW4gPSBib29rbWFyay5nZXRDYXRhbG9nKHRydWUsbnVsbCk7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IG5vbkVtcHR5Q2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3QoY2hpbGRyZW4ubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8Y2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIGlmIChoYXNDaGlsZHJlbihjaGlsZHJlbltpXSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBub25FbXB0eUNhdGVnb3JpZXMuYWRkKGNoaWxkcmVuW2ldKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbm9uRW1wdHlDYXRlZ29yaWVzLnRvQXJyYXkoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgU2l0ZUNhdGVnb3J5KSB7Ci0gICAgICAgICAgICAgICAgU2l0ZUNhdGVnb3J5IGNhdGVnb3J5ID0gKFNpdGVDYXRlZ29yeSlwYXJlbnQ7Ci0gICAgICAgICAgICAgICAgLy9yZXR1cm4gY2F0ZWdvcnkuZ2V0Q2hpbGRyZW4oKTsKLSAgICAgICAgICAgICAgICBPYmplY3RbXSBjaGlsZHJlbiA9IGNhdGVnb3J5LmdldENoaWxkcmVuKCk7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KGNoaWxkcmVuLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXSBpbnN0YW5jZW9mIEZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IgPSBmaW5kSm9iKChGZWF0dXJlUmVmZXJlbmNlQWRhcHRlciljaGlsZHJlbltpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpvYiAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChqb2IpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlQ29yZS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxpc3QudG9BcnJheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTaXRlQ2F0ZWdvcnkpCi0gICAgICAgICAgICAgICAgcmV0dXJuICgoU2l0ZUNhdGVnb3J5KSBlbGVtZW50KS5nZXRCb29rbWFyaygpOwotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBJRmVhdHVyZSBmID0gKChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pZWxlbWVudCkuZ2V0RmVhdHVyZSgpOwotICAgICAgICAgICAgICAgIElTaXRlRmVhdHVyZVJlZmVyZW5jZSBmciA9IGYuZ2V0U2l0ZSgpLmdldEZlYXR1cmVSZWZlcmVuY2UoZik7Ci0gICAgICAgICAgICAgICAgSUNhdGVnb3J5W10gY2F0ZWdvcmllcyA9IGZyLmdldENhdGVnb3JpZXMoKTsKLS8vICAgICAgICAgICAgICAgIGlmIChjYXRlZ29yaWVzICE9IG51bGwgJiYgY2F0ZWdvcmllcy5sZW5ndGggPiAwKQotLy8gICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXRlZ29yaWVzWzBdOwotICAgICAgICAgICAgICAgIFNpdGVCb29rbWFya1tdIHNpdGVzID0gKFNpdGVCb29rbWFya1tdKSgoSVRyZWVDb250ZW50UHJvdmlkZXIpdHJlZVZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKSkuZ2V0RWxlbWVudHMobnVsbCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPHNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgCXRyeSB7Ci0gICAgICAgICAgICAgICAgCQlpZiAoc2l0ZXNbaV0uZ2V0U2l0ZShmYWxzZSwgbnVsbCkuZ2V0VVJMKCkgIT0gZi5nZXRTaXRlKCkuZ2V0U2l0ZUNvbnRlbnRQcm92aWRlcigpLmdldFVSTCgpKSB7Ci0gICAgICAgICAgICAgICAgCQkgICAgLy8gaWYgdGhlIHNpdGUgaGFzIG1pcnJvcnMgY2hlY2sgaWYgdGhpcyBpcyBmcm9tIHRoZSBtaXJyb3IgdGhhdCB1c2VyIHNlbGVjdGVkCi0gICAgICAgICAgICAgICAgCQkJaWYgKHNpdGVzW2ldLmdldFNpdGUoZmFsc2UsIG51bGwpIGluc3RhbmNlb2YgRXh0ZW5kZWRTaXRlKSB7Ci0gICAgICAgICAgICAgICAgCQkJCUV4dGVuZGVkU2l0ZSBzaXRlID0gKEV4dGVuZGVkU2l0ZSlzaXRlc1tpXS5nZXRTaXRlKGZhbHNlLCBudWxsKTsKLSAgICAgICAgICAgICAgICAJCQkJSVVSTEVudHJ5IHNpdGVNaXJyb3IgPSBzaXRlLmdldFNlbGVjdGVkTWlycm9yKCk7Ci0gICAgICAgICAgICAgICAgCQkJCWlmIChzaXRlTWlycm9yICE9IG51bGwgJiYgc2l0ZU1pcnJvci5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpLmVxdWFscyhmLmdldFNpdGUoKS5nZXRTaXRlQ29udGVudFByb3ZpZGVyKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSkpIHsgCi0gICAgICAgICAgICAgICAgCQkJCQkvLyB0aGlzIGlzIHRoZSBzaXRlIHNvIHByb2NlZWQgd2l0aCB0aGUgbG9vcAotICAgICAgICAgICAgICAgIAkJCQl9IGVsc2UgewotICAgICAgICAgICAgICAgIAkJCQkJY29udGludWU7Ci0gICAgICAgICAgICAgICAgCQkJCX0KLSAgICAgICAgICAgICAgICAJCQl9IGVsc2UgewotICAgICAgICAgICAgICAgIAkJCQljb250aW51ZTsKLSAgICAgICAgICAgICAgICAJCQl9Ci0gICAgICAgICAgICAgICAgCQl9Ci0gICAgICAgICAgICAgICAgCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICAJCXJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGNoaWxkcmVuID0gc2l0ZXNbaV0uZ2V0Q2F0YWxvZyh0cnVlLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGo8Y2hpbGRyZW4ubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGNoaWxkcmVuW2pdIGluc3RhbmNlb2YgU2l0ZUNhdGVnb3J5KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGM9MDsgYyA8IGNhdGVnb3JpZXMubGVuZ3RoOyBjKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhdGVnb3JpZXNbY10uZ2V0TmFtZSgpLmVxdWFscygoKFNpdGVDYXRlZ29yeSljaGlsZHJlbltqXSkuZ2V0TmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuW2pdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gKGVsZW1lbnQgaW5zdGFuY2VvZiBTaXRlQm9va21hcmsgfHwgKAotICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGluc3RhbmNlb2YgU2l0ZUNhdGVnb3J5ICYmIGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDApKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU2l0ZUJvb2ttYXJrW10gZ2V0U2l0ZXMoKSB7Ci0gICAgICAgICAgICBpZiAoc2VhcmNoUmVxdWVzdCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2l0ZUJvb2ttYXJrWzBdOwotICAgICAgICAgICAgZWxzZSBpZiAoc2VhcmNoUmVxdWVzdC5nZXRTY29wZSgpLmdldFNlYXJjaFNpdGVzKCkgPT0gbnVsbCB8fAotICAgICAgICAgICAgICAgIHNlYXJjaFJlcXVlc3QuZ2V0U2NvcGUoKS5nZXRTZWFyY2hTaXRlcygpLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiB1cGRhdGUgc2VhcmNoLCBzbyBzZWUgaWYgdGhlcmUgYXJlIGFueSBqb2JzIGZpcnN0LAotICAgICAgICAgICAgICAgIC8vIGFuZCBnZXQgdGhlaXIgc2l0ZXMKLSAgICAgICAgICAgICAgICBpZiAoam9icyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdCBzaXRlc0xpc3QgPSBuZXcgQXJyYXlMaXN0KGpvYnMuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gb3AgPSAoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSBqb2JzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIGEgbGFiZWwgZm9yIHRoZSBzaXRlLCBzbyB0cnkgdG8gZ2V0IGl0IGZyb20gdGhlIG9sZAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmVhdHVyZSB1cGRhdGUgdXJsCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgSUZlYXR1cmVbXSBleGlzdGluZ0ZlYXR1cmVzID0gVXBkYXRlVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEluc3RhbGxlZEZlYXR1cmVzKG9wLmdldEZlYXR1cmUoKSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdGZWF0dXJlcyAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGV4aXN0aW5nRmVhdHVyZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVUkxFbnRyeSBlbnRyeSA9IG9wLmdldEZlYXR1cmUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFVwZGF0ZVNpdGVFbnRyeSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gZW50cnkuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBvcC5nZXRGZWF0dXJlKCkuZ2V0U2l0ZSgpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIFNpdGVCb29rbWFyayBib29rbWFyayA9IG5ldyBTaXRlQm9va21hcmsobGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLmdldEZlYXR1cmUoKS5nZXRTaXRlKCkuZ2V0VVJMKCksIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXRlc0xpc3QuY29udGFpbnMoYm9va21hcmspKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVzTGlzdC5hZGQoYm9va21hcmspOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzaXRlc0xpc3QuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChTaXRlQm9va21hcmtbXSkgc2l0ZXNMaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0FycmF5KG5ldyBTaXRlQm9va21hcmtbc2l0ZXNMaXN0LnNpemUoKV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNpdGVCb29rbWFya1swXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gc2VhcmNoIGZvciBmZWF0dXJlcwotICAgICAgICAgICAgICAgIElVcGRhdGVTZWFyY2hTaXRlW10gc2l0ZXMgPSBzZWFyY2hSZXF1ZXN0LmdldFNjb3BlKCkuZ2V0U2VhcmNoU2l0ZXMoKTsKLSAgICAgICAgICAgICAgICBTaXRlQm9va21hcmtbXSBzaXRlQm9va21hcmtzID0gbmV3IFNpdGVCb29rbWFya1tzaXRlcy5sZW5ndGhdOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHNpdGVCb29rbWFya3NbaV0gPSBuZXcgU2l0ZUJvb2ttYXJrKHNpdGVzW2ldLmdldExhYmVsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZXNbaV0uZ2V0VVJMKCksIGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2l0ZUJvb2ttYXJrczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGNsYXNzIFRyZWVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgU2hhcmVkTGFiZWxQcm92aWRlciB7Ci0KLSAgICAgICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBTaXRlQm9va21hcmspCi0gICAgICAgICAgICAgICAgcmV0dXJuIFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlVUlJbWFnZXMuREVTQ19TSVRFX09CSik7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgU2l0ZUNhdGVnb3J5KQotICAgICAgICAgICAgICAgIHJldHVybiBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmdldCgKLSAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZVVJSW1hZ2VzLkRFU0NfQ0FURUdPUllfT0JKKTsKLSAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBJRmVhdHVyZSBmZWF0dXJlID0gKChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIG9iaikuZ2V0RmVhdHVyZSgpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gcGF0Y2ggPSBmZWF0dXJlLmlzUGF0Y2goKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvL2Jvb2xlYW4gcHJvYmxlbWF0aWM9cHJvYmxlbWF0aWNGZWF0dXJlcy5jb250YWlucyhmZWF0dXJlKSAmJiB0cmVlVmlld2VyLmdldENoZWNrZWQob2JqKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGZlYXR1cmVJc1Byb2JsZW1hdGljID0gaXNGZWF0dXJlUHJvYmxlbWF0aWMoZmVhdHVyZSk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBwcm9ibGVtYXRpYyA9IHRyZWVWaWV3ZXIuZ2V0Q2hlY2tlZChvYmopICYmIGZlYXR1cmVJc1Byb2JsZW1hdGljOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICghcHJvYmxlbWF0aWMgJiYgZmVhdHVyZUlzUHJvYmxlbWF0aWMpIHsKLSAgICAgICAgICAgICAgICAJT2JqZWN0IHBhcmVudCA9ICgoVHJlZUNvbnRlbnRQcm92aWRlcil0cmVlVmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpKS5nZXRQYXJlbnQob2JqKTsKLSAgICAgICAgICAgICAgICAJaWYocGFyZW50ID09IG51bGwpCi0gICAgICAgICAgICAgICAgCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqKTsKLSAgICAgICAgICAgICAgICAJcHJvYmxlbWF0aWMgPSB0cmVlVmlld2VyLmdldENoZWNrZWQocGFyZW50KSAmJiAhdHJlZVZpZXdlci5nZXRHcmF5ZWQocGFyZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHBhdGNoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQoVXBkYXRlVUlJbWFnZXMuREVTQ19FRklYX09CSiwgcHJvYmxlbWF0aWM/IEZfRVJST1IgOiAwKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KFVwZGF0ZVVJSW1hZ2VzLkRFU0NfRkVBVFVSRV9PQkosIHByb2JsZW1hdGljPyBGX0VSUk9SIDogMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iaik7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKSAKLSAgICAgICAgICAgICAgICByZXR1cm4gKChTaXRlQm9va21hcmspIG9iaikuZ2V0TGFiZWwoKTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgU2l0ZUNhdGVnb3J5KQotICAgICAgICAgICAgICAgIHJldHVybiBvYmoudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgewotICAgICAgICAgICAgICAgIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IgPSAoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSBvYmo7Ci0gICAgICAgICAgICAgICAgSUZlYXR1cmUgZmVhdHVyZSA9IGpvYi5nZXRGZWF0dXJlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZlYXR1cmUuZ2V0TGFiZWwoKSArICIgIiArIGZlYXR1cmUgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmVyc2lvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmopOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xhc3MgTW9kZWxMaXN0ZW5lciBpbXBsZW1lbnRzIElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9iamVjdENoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0gICAgICAgICAgICB0cmVlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgICAgIGNoZWNrSXRlbXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9iamVjdHNBZGRlZChPYmplY3QgcGFyZW50LCBPYmplY3RbXSBjaGlsZHJlbikgewotICAgICAgICAgICAgdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgICBjaGVja0l0ZW1zKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvYmplY3RzUmVtb3ZlZChPYmplY3QgcGFyZW50LCBPYmplY3RbXSBjaGlsZHJlbikgewotICAgICAgICAgICAgdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgICBjaGVja0l0ZW1zKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBjaGVja0l0ZW1zKCkgewotICAgICAgICAgICAgVHJlZUl0ZW1bXSBpdGVtcyA9IHRyZWVWaWV3ZXIuZ2V0VHJlZSgpLmdldEl0ZW1zKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gKFNpdGVCb29rbWFyaykgaXRlbXNbaV0uZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgIHRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChib29rbWFyaywgYm9va21hcmsuaXNTZWxlY3RlZCgpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBpZ25vcmVkQ2F0cyA9IGJvb2ttYXJrLmdldElnbm9yZWRDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICAgICAgdHJlZVZpZXdlci5zZXRHcmF5ZWQoYm9va21hcmssIGlnbm9yZWRDYXRzLmxlbmd0aCA+IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGJvb2ttYXJrLmlzU2VsZWN0ZWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQljbGFzcyBDb250YWlubWVudEZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0JCQotCQlwcml2YXRlIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIHNlbGVjdGVkSm9iczsKLQkJCi0JCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIWlzQ29udGFpbmVkKChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIGVsZW1lbnQpIHx8IGlzU2VsZWN0ZWQoIHNlbGVjdGVkSm9icywgKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbillbGVtZW50KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIChlbGVtZW50IGluc3RhbmNlb2YgU2l0ZUNhdGVnb3J5KSB8fCAoZWxlbWVudCBpbnN0YW5jZW9mIFNpdGVCb29rbWFyaykpewotICAgICAgICAgICAgCU9iamVjdFtdIGNoaWxkcmVuID0gKChJVHJlZUNvbnRlbnRQcm92aWRlcikoKENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyKXZpZXdlcikuZ2V0Q29udGVudFByb3ZpZGVyKCkpLmdldENoaWxkcmVuKGVsZW1lbnQpOwotICAgICAgICAgICAgCWZvciAoIGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAJCWlmIChzZWxlY3Qodmlld2VyLCBlbGVtZW50LCBjaGlsZHJlbltpXSkpIHsKLSAgICAgICAgICAgIAkJCXJldHVybiB0cnVlOwotICAgICAgICAgICAgCQl9Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgCXJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBib29sZWFuIGlzQ29udGFpbmVkKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IpIHsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gam9iLmdldEZlYXR1cmUoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgam9icy5zaXplKCk7IGkrKykgewotCQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBjYW5kaWRhdGUgPSAoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSBqb2JzLmdldChpKTsKLQkJCQlpZiAoY2FuZGlkYXRlLmVxdWFscyhqb2IpKQotCQkJCQljb250aW51ZTsKLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gY2FuZGlkYXRlLmdldEZlYXR1cmUoKTsKLQkJCQlpZiAoaW5jbHVkZXMoZmVhdHVyZSwgdmlkLG51bGwpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlwcml2YXRlIGJvb2xlYW4gaW5jbHVkZXMoSUZlYXR1cmUgZmVhdHVyZSwgVmVyc2lvbmVkSWRlbnRpZmllciB2aWQsIEFycmF5TGlzdCBjeWNsZUNhbmRpZGF0ZXMpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGN5Y2xlQ2FuZGlkYXRlcyA9PSBudWxsKQotCQkJCQljeWNsZUNhbmRpZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKGN5Y2xlQ2FuZGlkYXRlcy5jb250YWlucyhmZWF0dXJlKSkKLQkJCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oTkxTLmJpbmQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfY3ljbGUsIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpLCBudWxsKTsKLQkJCQllbHNlCi0JCQkJCWN5Y2xlQ2FuZGlkYXRlcy5hZGQoZmVhdHVyZSk7Ci0JCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBpcmVmcyA9Ci0JCQkJCWZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUZlYXR1cmVSZWZlcmVuY2UgaXJlZiA9IGlyZWZzW2ldOwotCQkJCQlJRmVhdHVyZSBpZmVhdHVyZSA9IFVwZGF0ZVV0aWxzLmdldEluY2x1ZGVkRmVhdHVyZShmZWF0dXJlLCBpcmVmKTsKLQkJCQkJVmVyc2lvbmVkSWRlbnRpZmllciBpdmlkID0KLQkJCQkJCWlmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCQkJaWYgKGl2aWQuZXF1YWxzKHZpZCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJaWYgKGluY2x1ZGVzKGlmZWF0dXJlLCB2aWQsIGN5Y2xlQ2FuZGlkYXRlcykpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBmaW5hbGx5IHsKLQkJCQkvLyBhZnRlciB0aGlzIGZlYXR1cmUgaGFzIGJlZW4gREZTLWVkLCBpdCBpcyBubyBsb25nZXIgYSBjeWNsZSBjYW5kaWRhdGUKLQkJCQljeWNsZUNhbmRpZGF0ZXMucmVtb3ZlKGZlYXR1cmUpOwotCQkJfQotCQl9Ci0KLQotCQlwdWJsaWMgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gZ2V0U2VsZWN0ZWRKb2JzKCkgewotCQkJcmV0dXJuIHNlbGVjdGVkSm9iczsKLQkJfQotCQkKLQotCQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEpvYnMoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gc2VsZWN0ZWRKb2JzKSB7Ci0JCQl0aGlzLnNlbGVjdGVkSm9icyA9IHNlbGVjdGVkSm9iczsKLQkJfQotCi0JCi0JfQotCi0JY2xhc3MgTGF0ZXN0VmVyc2lvbkZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0JCQotCQlwcml2YXRlIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIHNlbGVjdGVkSm9iczsKLQkJCi0JCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgZWxlbWVudCkgewotCQkJCQkJCi0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgewotICAgICAgICAgICAgICAgIHJldHVybiBpc0xhdGVzdFZlcnNpb24oKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgZWxlbWVudCkgfHwgaXNTZWxlY3RlZCggc2VsZWN0ZWRKb2JzLCAoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKWVsZW1lbnQpOwotICAgICAgICAgICAgfSBlbHNlIGlmICggKGVsZW1lbnQgaW5zdGFuY2VvZiBTaXRlQ2F0ZWdvcnkpIHx8IChlbGVtZW50IGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKSl7Ci0gICAgICAgICAgICAJT2JqZWN0W10gY2hpbGRyZW4gPSAoKElUcmVlQ29udGVudFByb3ZpZGVyKSgoQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIpdmlld2VyKS5nZXRDb250ZW50UHJvdmlkZXIoKSkuZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0gICAgICAgICAgICAJZm9yICggaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIAkJaWYgKHNlbGVjdCh2aWV3ZXIsIGVsZW1lbnQsIGNoaWxkcmVuW2ldKSkgewotICAgICAgICAgICAgCQkJcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAJCX0KLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBib29sZWFuIGlzTGF0ZXN0VmVyc2lvbihJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iKSB7Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gam9iLmdldEZlYXR1cmUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgam9icy5zaXplKCk7IGkrKykgewotCQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBjYW5kaWRhdGVKb2IgPSAoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSBqb2JzLmdldChpKTsKLQkJCQlpZiAoY2FuZGlkYXRlSm9iLmVxdWFscyhqb2IpKQotCQkJCQljb250aW51ZTsKLQkJCQlJRmVhdHVyZSBjYW5kaWRhdGUgPSBjYW5kaWRhdGVKb2IuZ2V0RmVhdHVyZSgpOwotCQkJCWlmIChmZWF0dXJlLmdldFNpdGUoKSAhPSBqb2IuZ2V0RmVhdHVyZSgpLmdldFNpdGUoKSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKCFmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKGNhbmRpZGF0ZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpKSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKCFmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkuaXNHcmVhdGVyT3JFcXVhbFRvKGNhbmRpZGF0ZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBnZXRTZWxlY3RlZEpvYnMoKSB7Ci0JCQlyZXR1cm4gc2VsZWN0ZWRKb2JzOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEpvYnMoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gc2VsZWN0ZWRKb2JzKSB7Ci0JCQl0aGlzLnNlbGVjdGVkSm9icyA9IHNlbGVjdGVkSm9iczsKLQkJfQotCQkKLQkJCi0JfQotCQotCWNsYXNzIEZlYXR1cmVQcm9wZXJ0eURpYWxvZ0FjdGlvbiBleHRlbmRzIFByb3BlcnR5RGlhbG9nQWN0aW9uIHsKLQkJcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQkJcHVibGljIEZlYXR1cmVQcm9wZXJ0eURpYWxvZ0FjdGlvbigKLQkJCVNoZWxsIHNoZWxsLAotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCQlzdXBlcihzaGVsbCwgcHJvdmlkZXIpOwotCQl9Ci0KLQkJcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKSB7Ci0JCQlyZXR1cm4gc2VsZWN0aW9uOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQl9Ci0KLQl9Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFJldmlld1BhZ2UyCi0JICovCi0JcHVibGljIFJldmlld1BhZ2UoYm9vbGVhbiBpc1VwZGF0ZVNlYXJjaCwgVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0LCBBcnJheUxpc3Qgam9icykgewotCQlzdXBlcigiUmV2aWV3Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdGhpcy5pc1VwZGF0ZVNlYXJjaCA9IGlzVXBkYXRlU2VhcmNoOwotICAgICAgICB0aGlzLmpvYnMgPSBqb2JzOwotICAgICAgICBpZiAodGhpcy5qb2JzPT1udWxsKSB0aGlzLmpvYnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHRoaXMuc2VhcmNoUmVxdWVzdCA9IHNlYXJjaFJlcXVlc3Q7Ci0gICAgICAgIAotCQlzZXRUaXRsZShVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV90aXRsZSk7IAotCQlzZXREZXNjcmlwdGlvbihVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9kZXNjKTsgCi0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuY29ubmVjdCh0aGlzKTsKLQkJc2V0QmFubmVyVmlzaWJsZShmYWxzZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5kaXNjb25uZWN0KHRoaXMpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJCi0JCS8vIHdoZW4gc2VhcmNoaW5nIGZvciB1cGRhdGVzLCBvbmx5IG5lc3RlZCBwYXRjaGVzIGNhbiBiZSBzaG93bi4KLQkJLy8gd2hlbiBzZWFyY2hpbmcgZm9yIGZlYXR1cmVzLCBmZWF0dXJlcyBhbmQgcGF0Y2hlcyBjYW4gYmUgc2hvd24KLQkJU3RyaW5nIGZpbHRlclRleHQgPSBmaWx0ZXJDaGVjay5nZXRUZXh0KCk7Ci0JCVN0cmluZyBmaWx0ZXJGZWF0dXJlcyA9IFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX2ZpbHRlckZlYXR1cmVzOyAKLQkJU3RyaW5nIGZpbHRlclBhdGNoZXMgPSBVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9maWx0ZXJQYXRjaGVzOyAKLQotCQlpZiAoaXNVcGRhdGVTZWFyY2ggJiYgZmlsdGVyVGV4dC5lcXVhbHMoZmlsdGVyRmVhdHVyZXMpKQotCQkJZmlsdGVyQ2hlY2suc2V0VGV4dChmaWx0ZXJQYXRjaGVzKTsKLQkJZWxzZSBpZiAoICFpc1VwZGF0ZVNlYXJjaCAmJiBmaWx0ZXJUZXh0LmVxdWFscyhmaWx0ZXJQYXRjaGVzKSkKLQkJCWZpbHRlckNoZWNrLnNldFRleHQoZmlsdGVyRmVhdHVyZXMpOwotCQkKLQkJaWYgKHZpc2libGUgJiYgIWluaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7Ci0vLwkJCWpvYnMuY2xlYXIoKTsKLQotLy8JCQlzZXREZXNjcmlwdGlvbihVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5zZWFyY2hpbmciKSk7IC8vJE5PTi1OTFMtMSQ7Ci0vLwkJCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCIiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0vLwkJCQkJc2VhcmNoUnVubmVyLnJ1blNlYXJjaCgpOwotCQkJCQlwZXJmb3JtUG9zdFNlYXJjaFByb2Nlc3NpbmcoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtUG9zdFNlYXJjaFByb2Nlc3NpbmcoKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKHRyZWVWaWV3ZXIgIT0gbnVsbCkgewotLy8gICAgICAgICAgICAgICAgICAgIHRyZWVWaWV3ZXIucmVmcmVzaCgpOwotLy8gICAgICAgICAgICAgICAgICAgIHRyZWVWaWV3ZXIuZ2V0VHJlZSgpLmxheW91dCh0cnVlKTsKLQkJCQkJaWYgKGlzVXBkYXRlU2VhcmNoKSB7Ci0JCQkJCQlzZWxlY3RUcnVlVXBkYXRlcygpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXBhZ2VDaGFuZ2VkKCk7Ci0JCQkJCi0JCQkJaW50IHRvdGFsQ291bnQgPSBqb2JzICE9IG51bGwgPyBqb2JzLnNpemUoKTogMDsKLQkJCQlpZih0b3RhbENvdW50ID4wKSB7Ci0JCQkJCXNldERlc2NyaXB0aW9uKFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX2Rlc2MpOyAKLQkJCQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9sYWJlbCk7IAotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChpc1VwZGF0ZVNlYXJjaCkKLQkJCQkJCXNldERlc2NyaXB0aW9uKFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX3plcm9VcGRhdGVzKTsgCi0JCQkJCWVsc2UKLQkJCQkJCXNldERlc2NyaXB0aW9uKFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX3plcm9GZWF0dXJlcyk7IAotCQkJCQlsYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZWxlY3RUcnVlVXBkYXRlcygpIHsKLQkJQXJyYXlMaXN0IHRydWVVcGRhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpPTA7IGk8am9icy5zaXplKCk7IGkrKykgewotCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pam9icy5nZXQoaSk7Ci0JCQlpZiAoIVVwZGF0ZVV0aWxzLmlzUGF0Y2goam9iLmdldEZlYXR1cmUoKSkpCi0JCQkJdHJ1ZVVwZGF0ZXMuYWRkKGpvYik7Ci0JCX0KLQkJdHJlZVZpZXdlci5zZXRDaGVja2VkRWxlbWVudHModHJ1ZVVwZGF0ZXMudG9BcnJheSgpKTsgCi0JCXZhbGlkYXRlU2VsZWN0aW9uKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0JCi0KLQkvKioKLQkgKiBAc2VlIERpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY2xpZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQljbGllbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWxhYmVsID0gbmV3IExhYmVsKGNsaWVudCwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX2xhYmVsKTsgCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLSAgICAgICAgY3JlYXRlVHJlZVZpZXdlcihjbGllbnQpOwotCi0JCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShjbGllbnQsIFNXVC5OT05FKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOwotCQkJCQotCQlDb21wb3NpdGUgYnV0dG9uQ29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShjb21wLCBTV1QuTlVMTCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlidXR0b25Db250YWluZXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOyAvLzMwPwotCQlidXR0b25Db250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWJ1dHRvbkNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfZGVzZWxlY3RBbGwpOyAKLQkJZ2QgPQotCQkJbmV3IEdyaWREYXRhKAotCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotCQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KGJ1dHRvbik7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVEZXNlbGVjdEFsbCgpOwotCQkJfQotCQl9KTsKLQotCQltb3JlSW5mb0J1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCW1vcmVJbmZvQnV0dG9uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfbW9yZUluZm8pOyAKLQkJZ2QgPQotCQkJbmV3IEdyaWREYXRhKAotCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotCQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCW1vcmVJbmZvQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQobW9yZUluZm9CdXR0b24pOwotCQltb3JlSW5mb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVNb3JlSW5mbygpOwotCQkJfQotCQl9KTsKLQkJbW9yZUluZm9CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQotCQkKLQkJcHJvcGVydGllc0J1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCXByb3BlcnRpZXNCdXR0b24uc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9wcm9wZXJ0aWVzKTsgCi0JCWdkID0KLQkJCW5ldyBHcmlkRGF0YSgKLQkJCQlHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLQkJCQkJfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlwcm9wZXJ0aWVzQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQocHJvcGVydGllc0J1dHRvbik7Ci0JCXByb3BlcnRpZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlUHJvcGVydGllcygpOwotCQkJfQotCQl9KTsKLQkJcHJvcGVydGllc0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlzZWxlY3RSZXF1aXJlZEZlYXR1cmVzQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5QVVNIKTsKLQkJc2VsZWN0UmVxdWlyZWRGZWF0dXJlc0J1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX3NlbGVjdFJlcXVpcmVkKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCi0JCQkJfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlzZWxlY3RSZXF1aXJlZEZlYXR1cmVzQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoc2VsZWN0UmVxdWlyZWRGZWF0dXJlc0J1dHRvbik7Ci0JCXNlbGVjdFJlcXVpcmVkRmVhdHVyZXNCdXR0b24KLQkJCQkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGUuZGlzcGxheSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJT2JqZWN0W10gZWxlbWVudHMgPSB0cmVlVmlld2VyLmdldEV4cGFuZGVkRWxlbWVudHMoKTsKLQkJCQkJCQkJdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQkJCQkJCQkJdHJlZVZpZXdlci5zZXRFeHBhbmRlZEVsZW1lbnRzKGVsZW1lbnRzKTsKLQkJCQkJCQkJc2VsZWN0UmVxdWlyZWRGZWF0dXJlcygpOwotCQkJCQkJCQl1cGRhdGVJdGVtQ291bnQoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCXN0YXR1c0J1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCXN0YXR1c0J1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX3Nob3dTdGF0dXMpOyAKLQkJZ2QgPQotCQkJbmV3IEdyaWREYXRhKAotCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTAotCQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCXN0YXR1c0J1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KHN0YXR1c0J1dHRvbik7Ci0JCXN0YXR1c0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzaG93U3RhdHVzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vbmV3IExhYmVsKGNsaWVudCwgU1dULk5VTEwpOwotCi0JCWNvdW50ZXJMYWJlbCA9IG5ldyBMYWJlbChjbGllbnQsIFNXVC5OVUxMKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQljb3VudGVyTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJZmlsdGVyT2xkZXJWZXJzaW9uQ2hlY2sgPSBuZXcgQnV0dG9uKGNsaWVudCwgU1dULkNIRUNLKTsKLQkJZmlsdGVyT2xkZXJWZXJzaW9uQ2hlY2suc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9maWx0ZXJPbGRlckZlYXR1cmVzKTsgCi0JCWZpbHRlck9sZGVyVmVyc2lvbkNoZWNrLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJdHJlZVZpZXdlci5hZGRGaWx0ZXIob2xkZXJWZXJzaW9uRmlsdGVyKTsKLQkJZmlsdGVyT2xkZXJWZXJzaW9uQ2hlY2suYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0KLQkJCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBqb2JzID0gZ2V0U2VsZWN0ZWRKb2JzKCk7Ci0JCQkJCi0JCQkJaWYgKGZpbHRlck9sZGVyVmVyc2lvbkNoZWNrLmdldFNlbGVjdGlvbigpKQotCQkJCQl0cmVlVmlld2VyLmFkZEZpbHRlcihvbGRlclZlcnNpb25GaWx0ZXIpOwotCQkJCWVsc2UgCi0JCQkJCXRyZWVWaWV3ZXIucmVtb3ZlRmlsdGVyKG9sZGVyVmVyc2lvbkZpbHRlcik7Ci0JCQkJCi0JCQkJb2xkZXJWZXJzaW9uRmlsdGVyLnNldFNlbGVjdGVkSm9icyhqb2JzKTsJCQkJCi0JCQkJcGFnZUNoYW5nZWQoam9icyk7Ci0JCQl9Ci0JCX0pOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZpbHRlck9sZGVyVmVyc2lvbkNoZWNrLnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJZmlsdGVyQ2hlY2sgPSBuZXcgQnV0dG9uKGNsaWVudCwgU1dULkNIRUNLKTsKLQkJZmlsdGVyQ2hlY2suc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfUmV2aWV3UGFnZV9maWx0ZXJGZWF0dXJlcyk7IAotCQlmaWx0ZXJDaGVjay5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkvL3RhYmxlVmlld2VyLmFkZEZpbHRlcihmaWx0ZXIpOwotCQlmaWx0ZXJDaGVjay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkKLQkJCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBqb2JzID0gZ2V0U2VsZWN0ZWRKb2JzKCk7Ci0JCQkJCi0JCQkJaWYgKGZpbHRlckNoZWNrLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCS8vIG1ha2Ugc3VyZSBtb2RlbCBpcyBsb2NhbAotCQkJCQlpZiAoZG93bmxvYWRJbmNsdWRlZEZlYXR1cmVzKCkpIHsKLQkJCQkJCXRyZWVWaWV3ZXIuYWRkRmlsdGVyKGZpbHRlcik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlmaWx0ZXJDaGVjay5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdHJlZVZpZXdlci5yZW1vdmVGaWx0ZXIoZmlsdGVyKTsKLQkJCQl9Ci0JCQkJCi0JCQkJZmlsdGVyLnNldFNlbGVjdGVkSm9icyhqb2JzKTsKLQkJCQkKLQkJCQlwYWdlQ2hhbmdlZChqb2JzKTsKLQkJCX0KLQkJfSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZmlsdGVyQ2hlY2suc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQlwYWdlQ2hhbmdlZCgpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY2xpZW50LCAib3JnLmVjbGlwc2UudXBkYXRlLnVpLk11bHRpUmV2aWV3UGFnZTIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQotCQlyZXR1cm4gY2xpZW50OwotCX0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVUcmVlVmlld2VyKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgU2FzaEZvcm0gc2Zvcm0gPSBuZXcgU2FzaEZvcm0ocGFyZW50LCBTV1QuVkVSVElDQUwpOwotICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBnZC53aWR0aEhpbnQgPSAyNTA7Ci0gICAgICAgIGdkLmhlaWdodEhpbnQgPTEwMDsKLSAgICAgICAgc2Zvcm0uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIAotICAgICAgICB0cmVlVmlld2VyID0gbmV3IENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyKHNmb3JtLCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwKLSAgICAgICAgICAgICAgICB8IFNXVC5CT1JERVIpOwotICAgICAgICB0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFRyZWVDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIHRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVHJlZUxhYmVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIHRyZWVWaWV3ZXIuc2V0SW5wdXQoVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCkpOwotCi0gICAgICAgIHRyZWVWaWV3ZXIKLSAgICAgICAgICAgIC5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGUuZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIHRyZWVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotICAgIAkJCS8qCi0JCQkJICogdmFsaWRhdGVTZWxlY3Rpb24oKTsgT2JqZWN0IHNpdGUgPQotCQkJCSAqIGdldFNpdGUoZXZlbnQuZ2V0RWxlbWVudCgpKTsgQXJyYXlMaXN0IGRlc2NlbmRhbnRzID0gbmV3Ci0JCQkJICogQXJyYXlMaXN0KCk7IGNvbGxlY3REZXNjZW5kYW50cyhzaXRlLCBkZXNjZW5kYW50cyk7IE9iamVjdFtdCi0JCQkJICogbm9kZXMgPSBuZXcgT2JqZWN0W2Rlc2NlbmRhbnRzLnNpemUoKV07IGZvciAoaW50IGkgPSAwOyBpIDwKLQkJCQkgKiBub2Rlcy5sZW5ndGg7IGkrKykgbm9kZXNbaV0gPSBkZXNjZW5kYW50cy5nZXQoaSk7Ci0JCQkJICogdHJlZVZpZXdlci51cGRhdGUobm9kZXMsIG51bGwpOyB1cGRhdGVJdGVtQ291bnQoKTsKLQkJCQkgKi8KLQkJCQl0cnkgewotCQkJCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgdHJ1ZSwKLQkJCQkJCQlnZXRDaGVja1N0YXRlT3BlcmF0aW9uKGV2ZW50LCBwYXJlbnQuZ2V0RGlzcGxheSgpKSk7Ci0JCQkJCWdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCQkJdXBkYXRlU3RhdHVzQnV0dG9uKCk7Ci0JCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLSAgICAgIGRlc2NMYWJlbCA9IG5ldyBTY3JvbGxlZEZvcm1UZXh0KHNmb3JtLCB0cnVlKTsKLSAgICAgIGRlc2NMYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgZGVzY0xhYmVsLnNldEJhY2tncm91bmQocGFyZW50LmdldEJhY2tncm91bmQoKSk7Ci0gICAgICBIeXBlcmxpbmtTZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBIeXBlcmxpbmtTZXR0aW5ncyhwYXJlbnQuZ2V0RGlzcGxheSgpKTsKLSAgICAgIGRlc2NMYWJlbC5nZXRGb3JtVGV4dCgpLnNldEh5cGVybGlua1NldHRpbmdzKHNldHRpbmdzKTsKLSAgICAgIGRlc2NMYWJlbC5nZXRGb3JtVGV4dCgpLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotICAgIAkgIHB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotICAgIAkJICBPYmplY3QgaHJlZiA9IGUuZ2V0SHJlZigpOwotICAgIAkJICBpZiAoaHJlZj09bnVsbCkKLSAgICAJCQkgIHJldHVybjsKLSAgICAJCSAgdHJ5IHsKLSAgICAJCQkgIFVSTCB1cmwgPSBuZXcgVVJMKGhyZWYudG9TdHJpbmcoKSk7Ci0gICAgCQkJICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEJyb3dzZXJTdXBwb3J0KCkuZ2V0RXh0ZXJuYWxCcm93c2VyKCkub3BlblVSTCh1cmwpOwotICAgIAkJICB9Ci0gICAgCQkgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleCkgewotICAgIAkJCSAgVXBkYXRlVUkubG9nRXhjZXB0aW9uKGV4KTsKLSAgICAJCSAgfQotICAgIAkJICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7Ci0gICAgCQkJICBVcGRhdGVVSS5sb2dFeGNlcHRpb24oZXgpOwotICAgIAkJICB9Ci0gICAgCSAgfQotICAgICAgfSk7Ci0gICAgICAKLSAgICAgIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0gICAgICBkZXNjTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAKLSAgICAgIHNmb3JtLnNldFdlaWdodHMobmV3IGludFtdIHsxMCwgMn0pOwotICAgIH0KLSAgICAKLQlwcml2YXRlIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBnZXRDaGVja1N0YXRlT3BlcmF0aW9uKAotCQkJZmluYWwgQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCwgZmluYWwgRGlzcGxheSBkaXNwbGF5KSB7Ci0JCXJldHVybiBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKFVwZGF0ZVVJTWVzc2FnZXMuUmV2aWV3UGFnZV92YWxpZGF0aW5nLAotCQkJCQkJSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQkJCQl2YWxpZGF0ZVNlbGVjdGlvbihtb25pdG9yKTsKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJdW5kb1N0YXRlQ2hhbmdlKGV2ZW50KTsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJT2JqZWN0IHNpdGUgPSBnZXRTaXRlKGV2ZW50LmdldEVsZW1lbnQoKSk7Ci0JCQkJQXJyYXlMaXN0IGRlc2NlbmRhbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWNvbGxlY3REZXNjZW5kYW50cyhzaXRlLCBkZXNjZW5kYW50cywgbW9uaXRvcik7Ci0JCQkJZmluYWwgT2JqZWN0W10gbm9kZXMgPSBuZXcgT2JqZWN0W2Rlc2NlbmRhbnRzLnNpemUoKV07Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCXVuZG9TdGF0ZUNoYW5nZShldmVudCk7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspCi0JCQkJCW5vZGVzW2ldID0gZGVzY2VuZGFudHMuZ2V0KGkpOwotCQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQl0cmVlVmlld2VyLnVwZGF0ZShub2RlcywgbnVsbCk7Ci0JCQkJCQl1cGRhdGVJdGVtQ291bnQoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdW5kb1N0YXRlQ2hhbmdlKGZpbmFsIENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZSkgewotCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChlLmdldEVsZW1lbnQoKSwgIWUuZ2V0Q2hlY2tlZCgpKTsKLQkJCX0KLQkJfSk7Ci0JfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwpIHsKLSAgICAgICAgCi0gICAgICAgIE9iamVjdCBpdGVtID0gc3NlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKLSAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTaXRlQm9va21hcmspIHsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gKChTaXRlQm9va21hcmspaXRlbSkuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU2l0ZUNhdGVnb3J5KSB7Ci0gICAgICAgICAgICBJVVJMRW50cnkgZGVzY0VudHJ5ID0gKChTaXRlQ2F0ZWdvcnkpaXRlbSkuZ2V0Q2F0ZWdvcnkoKS5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgaWYgKGRlc2NFbnRyeSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY0VudHJ5LmdldEFubm90YXRpb24oKTsKLSAgICAgICAgfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSB7Ci0gICAgICAgICAgICBqb2JTZWxlY3RlZChzc2VsKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAvL2Rlc2NMYWJlbC5zZXRUZXh0KFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRXcml0YWJsZVhNTFN0cmluZyhkZXNjcmlwdGlvbiksIGZhbHNlLCB0cnVlKTsKLSAgICAgICAgdXBkYXRlRGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotICAgICAgICBwcm9wZXJ0aWVzQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBtb3JlSW5mb0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICB9Ci0KLS8qCQotCXByaXZhdGUgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJaWYgKHRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKSByZXR1cm47Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX3Byb3ApIHsgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaGFuZGxlUHJvcGVydGllcygpOwotCQkJfQotCQl9OwotCQltYW5hZ2VyLmFkZChhY3Rpb24pOwotCX0KLSovCi0KLQlwcml2YXRlIHZvaWQgam9iU2VsZWN0ZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IgPSAoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCUlGZWF0dXJlIGZlYXR1cmUgPSBqb2IgIT0gbnVsbCA/IGpvYi5nZXRGZWF0dXJlKCkgOiBudWxsOwotCQlJVVJMRW50cnkgZGVzY0VudHJ5ID0gZmVhdHVyZSAhPSBudWxsID8gZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpIDogbnVsbDsKLQkJU3RyaW5nIGRlc2MgPSBudWxsOwotCQlpZiAoZGVzY0VudHJ5ICE9IG51bGwpCi0JCQlkZXNjID0gZGVzY0VudHJ5LmdldEFubm90YXRpb24oKTsKLQkJaWYgKGRlc2MgPT0gbnVsbCkKLQkJCWRlc2MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkvL2Rlc2NMYWJlbC5zZXRUZXh0KFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRXcml0YWJsZVhNTFN0cmluZyhkZXNjKSk7Ci0JCXVwZGF0ZURlc2NyaXB0aW9uKGRlc2MpOwotCQlwcm9wZXJ0aWVzQnV0dG9uLnNldEVuYWJsZWQoZmVhdHVyZSAhPSBudWxsKTsKLQkJbW9yZUluZm9CdXR0b24uc2V0RW5hYmxlZChqb2IgIT0gbnVsbCAmJiBnZXRNb3JlSW5mb1VSTChqb2IpICE9IG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlRGVzY3JpcHRpb24oU3RyaW5nIHRleHQpIHsKLQkJZGVzY0xhYmVsLmdldEZvcm1UZXh0KCkuc2V0VGV4dChVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0V3JpdGFibGVYTUxTdHJpbmcodGV4dCksIGZhbHNlLCB0cnVlKTsKLQkJZGVzY0xhYmVsLnJlZmxvdyh0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBhZ2VDaGFuZ2VkKCkgewotCQlwYWdlQ2hhbmdlZCh0aGlzLmdldFNlbGVjdGVkSm9icygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBhZ2VDaGFuZ2VkKCBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBqb2JzU2VsZWN0ZWQpIHsKLQkKLQkJaWYgKGpvYnNTZWxlY3RlZC5sZW5ndGggPT0gMCkgewotCQkJbGFzdERpc3BsYXllZFN0YXR1cyA9IG51bGw7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQkJc2V0VmFsaWRhdGlvblN0YXR1cyhudWxsKTsKLQkJCXByb2JsZW1hdGljRmVhdHVyZXMuY2xlYXIoKTsKLQkJfQotCQl0cmVlVmlld2VyLnNldENoZWNrZWRFbGVtZW50cyhqb2JzU2VsZWN0ZWQpOwotCQkvL3ZhbGlkYXRlU2VsZWN0aW9uKCk7Ci0gICAgICAgIHRyZWVWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICB0cmVlVmlld2VyLnNldENoZWNrZWRFbGVtZW50cyhqb2JzU2VsZWN0ZWQpOwotICAgICAgICB1cGRhdGVJdGVtQ291bnQoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFZhbGlkYXRpb25TdGF0dXMoSVN0YXR1cyBuZXdWYWxpZGF0aW9uU3RhdHVzKSB7Ci0JCXRoaXMudmFsaWRhdGlvblN0YXR1cyA9IG5ld1ZhbGlkYXRpb25TdGF0dXM7Ci0JCXVwZGF0ZVN0YXR1c0J1dHRvbigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlU3RhdHVzQnV0dG9uKCkgewotCQlzdGF0dXNCdXR0b24uZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlib29sZWFuIG5ld1N0YXRlID0gdmFsaWRhdGlvblN0YXR1cyAhPSBudWxsICYmIHZhbGlkYXRpb25TdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLk9LOwotCQkJCXN0YXR1c0J1dHRvbi5zZXRFbmFibGVkKG5ld1N0YXRlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVJdGVtQ291bnQoKSB7Ci0JCXVwZGF0ZUl0ZW1Db3VudCgtMSwgLTEpOwotCX0KLQkKLQlwcml2YXRlIGludCBnZXRTZWxlY3RlZEpvYnNVbmlxdWVDb3VudCgpIHsKLQkJT2JqZWN0W10gY2hlY2tlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRKb2JzKCk7Ci0JCVNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKGludCBpPTA7IGk8Y2hlY2tlZEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iID0gKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiljaGVja2VkRWxlbWVudHNbaV07Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gam9iLmdldEZlYXR1cmUoKTsKLQkJCWlmIChzZXQuY29udGFpbnMoZmVhdHVyZSkpCi0JCQkJY29udGludWU7Ci0JCQlzZXQuYWRkKGZlYXR1cmUpOwotCQl9Ci0JCXJldHVybiBzZXQuc2l6ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVJdGVtQ291bnQoaW50IGNoZWNrZWRDb3VudCwgaW50IHRvdGFsQ291bnQpIHsKLQkJaWYgKGNoZWNrZWRDb3VudCA9PSAtMSkgewotCQkJY2hlY2tlZENvdW50ID0gZ2V0U2VsZWN0ZWRKb2JzVW5pcXVlQ291bnQoKTsKLQkJfQotCQlpZiAodG90YWxDb3VudCA9PSAtMSkgewotCQkJdG90YWxDb3VudCA9IGpvYnMuc2l6ZSgpOwotCQl9Ci0JCVN0cmluZyB0b3RhbCA9ICIiICsgdG90YWxDb3VudDsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc2VsZWN0ZWQgPSAiIiArIGNoZWNrZWRDb3VudDsgLy8kTk9OLU5MUy0xJAotCQljb3VudGVyTGFiZWwuc2V0VGV4dCgKLQkJCU5MUy5iaW5kKFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX2NvdW50ZXIsIChuZXcgU3RyaW5nW10geyBzZWxlY3RlZCwgdG90YWwgfSkpKTsJCi0gICAgICAgIGNvdW50ZXJMYWJlbC5nZXRQYXJlbnQoKS5sYXlvdXQoKTsKLQl9Ci0KLS8vCXByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3RBbGwoYm9vbGVhbiBzZWxlY3QpIHsKLS8vCQl0cmVlVmlld2VyLnNldEFsbENoZWNrZWQoc2VsZWN0KTsKLS8vLy8JCSBtYWtlIHN1cmUgbW9kZWwgaXMgbG9jYWwgKGRvd25sb2FkIHVzaW5nIHByb2dyZXNzIG1vbml0b3IgZnJvbSBjb250YWluZXIpCi0vLwkJZG93bmxvYWRJbmNsdWRlZEZlYXR1cmVzKCk7IAotLy8JCQkKLS8vCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLS8vCQkJcHVibGljIHZvaWQgcnVuKCkgewotLy8JCQkJcGFnZUNoYW5nZWQoKTsKLS8vCQkJfQotLy8JCX0pOwotLy8JfQotCi0vLyAgcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdEFsbChib29sZWFuIHNlbGVjdCkgewotLy8gIHRyZWVWaWV3ZXIuc2V0QWxsQ2hlY2tlZChzZWxlY3QpOwotLy8vLyAgICAgbWFrZSBzdXJlIG1vZGVsIGlzIGxvY2FsIChkb3dubG9hZCB1c2luZyBwcm9ncmVzcyBtb25pdG9yIGZyb20gY29udGFpbmVyKQotLy8gIGRvd25sb2FkSW5jbHVkZWRGZWF0dXJlcygpOyAKLS8vICAgICAgCi0vLyAgdHJlZVZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0vLyAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLS8vICAgICAgICAgIHBhZ2VDaGFuZ2VkKCk7Ci0vLyAgICAgIH0KLS8vICB9KTsKLS8vfQotCi0gICBwcml2YXRlIHZvaWQgaGFuZGxlRGVzZWxlY3RBbGwoKSB7Ci0gICAgICAgIC8vdHJlZVZpZXdlci5zZXRDaGVja2VkRWxlbWVudHMobmV3IE9iamVjdFswXSk7Ci0gICAgICAgICBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBzZWxlY3RlZEpvYnMgPSBnZXRTZWxlY3RlZEpvYnMoKTsKLSAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRKb2JzLmxlbmd0aDsgaSsrKQotICAgICAgICAJIHRyZWVWaWV3ZXIuc2V0Q2hlY2tlZCggc2VsZWN0ZWRKb2JzW2ldLCBmYWxzZSk7Ci0gICAgICAgIC8vIG1ha2Ugc3VyZSBtb2RlbCBpcyBsb2NhbCAoZG93bmxvYWQgdXNpbmcgcHJvZ3Jlc3MgbW9uaXRvciBmcm9tCi0gICAgICAgIC8vIGNvbnRhaW5lcikKLS8vICAgICAgICBkb3dubG9hZEluY2x1ZGVkRmVhdHVyZXMoKTsKLQotICAgICAgICB0cmVlVmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBwYWdlQ2hhbmdlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLX0KLSAgICAKLQlwcml2YXRlIHZvaWQgaGFuZGxlUHJvcGVydGllcygpIHsKLQkJZmluYWwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0KLQkJCShJU3RydWN0dXJlZFNlbGVjdGlvbikgdHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQotCQlmaW5hbCBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iID0KLQkJCShJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKHByb3BlcnRpZXNBY3Rpb24gPT0gbnVsbCkgewotCQkJcHJvcGVydGllc0FjdGlvbiA9Ci0JCQkJbmV3IEZlYXR1cmVQcm9wZXJ0eURpYWxvZ0FjdGlvbihnZXRTaGVsbCgpLCB0cmVlVmlld2VyKTsKLQkJfQotCi0JCUJ1c3lJbmRpY2F0b3IKLQkJCS5zaG93V2hpbGUodHJlZVZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU2ltcGxlRmVhdHVyZUFkYXB0ZXIgYWRhcHRlciA9Ci0JCQkJCW5ldyBTaW1wbGVGZWF0dXJlQWRhcHRlcihqb2IuZ2V0RmVhdHVyZSgpKTsKLQkJCQlwcm9wZXJ0aWVzQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoCi0JCQkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGFkYXB0ZXIpKTsKLQkJCQlwcm9wZXJ0aWVzQWN0aW9uLnJ1bigpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRNb3JlSW5mb1VSTChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iKSB7Ci0JCUlVUkxFbnRyeSBkZXNjID0gam9iLmdldEZlYXR1cmUoKS5nZXREZXNjcmlwdGlvbigpOwotCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQlVUkwgdXJsID0gZGVzYy5nZXRVUkwoKTsKLQkJCXJldHVybiAodXJsID09IG51bGwpID8gbnVsbCA6IHVybC50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVNb3JlSW5mbygpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0KLQkJCShJU3RydWN0dXJlZFNlbGVjdGlvbikgdHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJZmluYWwgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIHNlbGVjdGVkSm9iID0KLQkJCShJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJQnVzeUluZGljYXRvcgotCQkJLnNob3dXaGlsZSh0cmVlVmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTdHJpbmcgdXJsTmFtZSA9IGdldE1vcmVJbmZvVVJMKHNlbGVjdGVkSm9iKTsKLQkJCQlVcGRhdGVVSS5zaG93VVJMKHVybE5hbWUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgc2VsZWN0UmVxdWlyZWRGZWF0dXJlcygpIHsKLQkJCi0JCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnMgPSBnZXRTZWxlY3RlZEpvYnMoKTsKLQkJUmVxdWlyZWRGZWF0dXJlc1Jlc3VsdCByZXF1aXJlZEZlYXR1cmVzUmVzdWx0ID0gKChPcGVyYXRpb25WYWxpZGF0b3IpT3BlcmF0aW9uc01hbmFnZXIKLQkJCQkuZ2V0VmFsaWRhdG9yKCkpLmdldFJlcXVpcmVkRmVhdHVyZXMoam9icyk7Ci0JCXNldFZhbGlkYXRpb25TdGF0dXMocmVxdWlyZWRGZWF0dXJlc1Jlc3VsdC5nZXRTdGF0dXMoKSk7Ci0JCVNldCByZXF1aXJlZEZlYXR1cmVzID0gcmVxdWlyZWRGZWF0dXJlc1Jlc3VsdC5nZXRSZXF1aXJlZEZlYXR1cmVzKCk7Ci0JCXByb2JsZW1hdGljRmVhdHVyZXMuY2xlYXIoKTsKLQkJCi0JCUl0ZXJhdG9yIHJlcXVpcmVkRmVhdHVyZXNJdGVyYXRvciA9IHJlcXVpcmVkRmVhdHVyZXMuaXRlcmF0b3IoKTsKLQkJQXJyYXlMaXN0IHRvQmVJbnN0YWxsZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQl3aGlsZSAocmVxdWlyZWRGZWF0dXJlc0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSUltcG9ydCByZXF1aXJlZEZlYXR1cmUgPSAoKEludGVybmFsSW1wb3J0KXJlcXVpcmVkRmVhdHVyZXNJdGVyYXRvci5uZXh0KCkpLmdldEltcG9ydCgpOwotCi0JCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gY3VycmVudEZlYXR1cmVTZWxlY3RlZCA9IG51bGw7Ci0JCQlUcmVlSXRlbVtdIGl0ZW1zID0gdHJlZVZpZXdlci5nZXRUcmVlKCkuZ2V0SXRlbXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlUcmVlSXRlbVtdIHNpdGVSb290Q29udGVudCA9IGl0ZW1zW2ldLmdldEl0ZW1zKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXRlUm9vdENvbnRlbnQubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKHNpdGVSb290Q29udGVudFtqXS5nZXREYXRhKCkgaW5zdGFuY2VvZiBTaXRlQ2F0ZWdvcnkpIHsKLQkJCQkJCQotCQkJCQkJaWYgKCAhdHJlZVZpZXdlci5nZXRDaGVja2VkKHNpdGVSb290Q29udGVudFtqXS5nZXREYXRhKCkpKSB7Ci0JCQkJCQkJLy8gdGhpcyBjYXRlZ29yeSBoYXMgbm90IGJlZW4gY2hlY2tlZCBhdCBhbGwgc28gd2UgaGF2ZSB0byBjcmVhdGUgaXRzIGZlYXR1cmVzCi0JCQkJCQkJdHJlZVZpZXdlci5jcmVhdGVDaGlsZHJlbihzaXRlUm9vdENvbnRlbnRbal0pOwotCQkJCQkJfQotCQkJCQkJVHJlZUl0ZW1bXSBmZWF0dXJlcyA9IHNpdGVSb290Q29udGVudFtqXS5nZXRJdGVtcygpOwotCQkJCQkJaWYgKChmZWF0dXJlcy5sZW5ndGggPiAwKSAmJiAoZmVhdHVyZXNbMF0uZ2V0RGF0YSgpID09IG51bGwpKSB7Ci0JCQkJCQkJLy8gdGhpcyBjYXRlZ29yeSBoYXMgYmVlbiBjaGVja2VkIGJ1dCBub3QgdmlzaXRlZCB5ZXQgc28gcmVzdG9yZSB0aGUgZmVhdHVyZXMgaW4gaXQKLQkJCQkJCQl0cmVlVmlld2VyLmNyZWF0ZUNoaWxkcmVuKHNpdGVSb290Q29udGVudFtqXSk7Ci0JCQkJCQkJdHJlZVZpZXdlci51cGRhdGVDaGlsZHJlbkl0ZW1zKHNpdGVSb290Q29udGVudFtqXSk7Ci0JCQkJCQkJZmVhdHVyZXMgPSBzaXRlUm9vdENvbnRlbnRbal0uZ2V0SXRlbXMoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBmZWF0dXJlcy5sZW5ndGg7IGsrKykgewotCQkJCQkJCWN1cnJlbnRGZWF0dXJlU2VsZWN0ZWQgPSBkZWNpZGVPbkZlYXR1cmVTZWxlY3Rpb24oCi0JCQkJCQkJCQlyZXF1aXJlZEZlYXR1cmUsCi0JCQkJCQkJCQkoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSBmZWF0dXJlc1trXQotCQkJCQkJCQkJCQkuZ2V0RGF0YSgpLCBjdXJyZW50RmVhdHVyZVNlbGVjdGVkKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChzaXRlUm9vdENvbnRlbnRbal0uZ2V0RGF0YSgpIGluc3RhbmNlb2YgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSB7Ci0JCQkJCQljdXJyZW50RmVhdHVyZVNlbGVjdGVkID0gZGVjaWRlT25GZWF0dXJlU2VsZWN0aW9uKAotCQkJCQkJCQlyZXF1aXJlZEZlYXR1cmUsCi0JCQkJCQkJCShJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIHNpdGVSb290Q29udGVudFtqXQotCQkJCQkJCQkJCS5nZXREYXRhKCksIGN1cnJlbnRGZWF0dXJlU2VsZWN0ZWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoY3VycmVudEZlYXR1cmVTZWxlY3RlZCAhPSBudWxsKQotCQkJCXRvQmVJbnN0YWxsZWQuYWRkKGN1cnJlbnRGZWF0dXJlU2VsZWN0ZWQpOwotCQl9Ci0KLQkJaWYgKCF0b0JlSW5zdGFsbGVkLmlzRW1wdHkoKSkgewotCQkJSXRlcmF0b3IgdG9CZUluc3RhbGxlZEl0ZXJhdG9yID0gdG9CZUluc3RhbGxlZC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKHRvQmVJbnN0YWxsZWRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gY3VycmVudCA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pdG9CZUluc3RhbGxlZEl0ZXJhdG9yLm5leHQoKTsKLQkJCQl0cmVlVmlld2VyLnNldENoZWNrZWQoY3VycmVudCwgdHJ1ZSk7CQkJCi0JCQl9Ci0JCQlyZXR1cm4gc2VsZWN0UmVxdWlyZWRGZWF0dXJlcygpOwotCQl9IGVsc2UgewotCQkJcHJvYmxlbWF0aWNGZWF0dXJlcy5jbGVhcigpOwotCQkJaWYgKHZhbGlkYXRpb25TdGF0dXMgIT0gbnVsbCkgewotCQkJCUlTdGF0dXNbXSBzdGF0dXMgPSB2YWxpZGF0aW9uU3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0dXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSVN0YXR1cyBzaW5nbGVTdGF0dXMgPSBzdGF0dXNbaV07Ci0JCQkJCWlmIChpc1NwZWNpZmljU3RhdHVzKHNpbmdsZVN0YXR1cykpIHsKLQkJCQkJCUlGZWF0dXJlIGYgPSAoKEZlYXR1cmVTdGF0dXMpIHNpbmdsZVN0YXR1cykKLQkJCQkJCQkJLmdldEZlYXR1cmUoKTsKLQkJCQkJCXByb2JsZW1hdGljRmVhdHVyZXMuYWRkKGYpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGlvblN0YXR1cyA9PSBudWxsCi0JCQkJCXx8IHZhbGlkYXRpb25TdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpOwotCi0JCQlsYXN0RGlzcGxheWVkU3RhdHVzID0gbnVsbDsKLQkJCXVwZGF0ZVdpemFyZE1lc3NhZ2UoKTsKLQkJCQotCQkJdHJlZVZpZXdlci51cGRhdGUoZ2V0U2VsZWN0ZWRKb2JzKCksIG51bGwpOwotCQkJcmV0dXJuIHZhbGlkYXRpb25TdGF0dXM7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gZ2V0U2VsZWN0ZWRKb2JzKCkgeyAgICAgIAotICAgICAgICBPYmplY3RbXSBzZWxlY3RlZCA9IHRyZWVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0gICAgICAgIEFycmF5TGlzdCBzZWxlY3RlZEpvYnMgPSBuZXcgQXJyYXlMaXN0KHNlbGVjdGVkLmxlbmd0aCk7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxzZWxlY3RlZC5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIGlmIChzZWxlY3RlZFtpXSBpbnN0YW5jZW9mIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikKLSAgICAgICAgICAgICAgICBzZWxlY3RlZEpvYnMuYWRkKHNlbGVjdGVkW2ldKTsKLSAgICAgICAgcmV0dXJuIChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSlzZWxlY3RlZEpvYnMudG9BcnJheShuZXcgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW3NlbGVjdGVkSm9icy5zaXplKCldKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGVTZWxlY3Rpb24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnM7Ci0KLQkJZmluYWwgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW11bXSBiYWcgPSBuZXcgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uWzFdW107Ci0JCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJYmFnWzBdID0gZ2V0U2VsZWN0ZWRKb2JzKCk7Ci0JCQl9Ci0JCX0pOwotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHJldHVybjsKLQkJam9icyA9IGJhZ1swXTsKLQkJc2V0VmFsaWRhdGlvblN0YXR1cyhPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKQotCQkJCS52YWxpZGF0ZVBlbmRpbmdDaGFuZ2VzKGpvYnMpKTsKLQkJcHJvYmxlbWF0aWNGZWF0dXJlcy5jbGVhcigpOwotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHJldHVybjsKLQkJaWYgKHZhbGlkYXRpb25TdGF0dXMgIT0gbnVsbCkgewotCQkJSVN0YXR1c1tdIHN0YXR1cyA9IHZhbGlkYXRpb25TdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdHVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVN0YXR1cyBzaW5nbGVTdGF0dXMgPSBzdGF0dXNbaV07Ci0JCQkJaWYgKGlzU3BlY2lmaWNTdGF0dXMoc2luZ2xlU3RhdHVzKSkgewotCQkJCQlJRmVhdHVyZSBmID0gKChGZWF0dXJlU3RhdHVzKSBzaW5nbGVTdGF0dXMpLmdldEZlYXR1cmUoKTsKLQkJCQkJcHJvYmxlbWF0aWNGZWF0dXJlcy5hZGQoZik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQlyZXR1cm47Ci0JCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRpb25TdGF0dXMgPT0gbnVsbAotCQkJCQkJfHwgdmFsaWRhdGlvblN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORyk7Ci0vKgotCQkJCXN0YXR1c0J1dHRvbi5zZXRFbmFibGVkKHZhbGlkYXRpb25TdGF0dXMgIT0gbnVsbAotCQkJCQkJJiYgdmFsaWRhdGlvblN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuT0spOwotCQkJCQkJKi8KLQotCQkJCXVwZGF0ZVdpemFyZE1lc3NhZ2UoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNob3dTdGF0dXMoKSB7Ci0JCWlmICh2YWxpZGF0aW9uU3RhdHVzICE9IG51bGwpIHsKLQkJCW5ldyBTdGF0dXNEaWFsb2coKS5vcGVuKCk7Ci0JCX0KLQotCX0KLQkvKioKLQkgKiBDaGVjayB3aGV0aGVyIHN0YXR1cyBpcyByZWxldmFudCB0byBzaG93IGZvcgotCSAqIGEgc3BlY2lmaWMgZmVhdHVyZSBvciBpcyBhIG90aGVyIHByb2JsZW0KLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogQHJldHVybiB0cnVlIGlmIHN0YXR1cyBpcyBGZWF0dXJlU3RhdHVzIHdpdGgKLQkgKiBzcGVjaWZpZWQgZmVhdHVyZSBhbmQgY2VydGFpbiBlcnJvciBjb2RlcwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1NwZWNpZmljU3RhdHVzKElTdGF0dXMgc3RhdHVzKXsKLQkJaWYoIShzdGF0dXMgaW5zdGFuY2VvZiBGZWF0dXJlU3RhdHVzKSl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYoc3RhdHVzLmdldFNldmVyaXR5KCkhPUlTdGF0dXMuRVJST1IpewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUZlYXR1cmVTdGF0dXMgZmVhdHVyZVN0YXR1cyA9IChGZWF0dXJlU3RhdHVzKSBzdGF0dXM7Ci0JCWlmKGZlYXR1cmVTdGF0dXMuZ2V0RmVhdHVyZSgpPT1udWxsKXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gMCE9IChmZWF0dXJlU3RhdHVzLmdldENvZGUoKQotCQkJCSYgRmVhdHVyZVN0YXR1cy5DT0RFX0NZQ0xFCi0JCQkJKyBGZWF0dXJlU3RhdHVzLkNPREVfRU5WSVJPTk1FTlQKLQkJCQkrIEZlYXR1cmVTdGF0dXMuQ09ERV9FWENMVVNJVkUKLQkJCQkrIEZlYXR1cmVTdGF0dXMuQ09ERV9PUFRJT05BTF9DSElMRAotCQkJCSsgRmVhdHVyZVN0YXR1cy5DT0RFX1BSRVJFUV9GRUFUVVJFCi0JCQkJKyBGZWF0dXJlU3RhdHVzLkNPREVfUFJFUkVRX1BMVUdJTik7Ci0JfQotCS8qKgotCSAqIFVwZGF0ZSBzdGF0dXMgaW4gdGhlIHdpemFyZCBzdGF0dXMgYXJlYQotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVXaXphcmRNZXNzYWdlKCkgewotCQkKLQkJaWYgKHZhbGlkYXRpb25TdGF0dXMgPT0gbnVsbCkgewotCQkJbGFzdERpc3BsYXllZFN0YXR1cz1udWxsOwotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQl9IGVsc2UgaWYgKHZhbGlkYXRpb25TdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpIHsKLQkJCWxhc3REaXNwbGF5ZWRTdGF0dXM9bnVsbDsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCXNldE1lc3NhZ2UodmFsaWRhdGlvblN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyAxLiAgRmVhdHVyZSBzZWxlY3RlZCwgY3JlYXRpbmcgYSBwcm9ibGVtIGZvciBpdCwgc2hvdyBzdGF0dXMgZm9yIGl0Ci0JCQlpZihuZXdseVNlbGVjdGVkRmVhdHVyZSAhPW51bGwpewotCQkJCUlTdGF0dXNbXSBzdGF0dXMgPSB2YWxpZGF0aW9uU3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yKGludCBzID0wOyBzPCBzdGF0dXMubGVuZ3RoOyBzKyspewotCQkJCQlpZihpc1NwZWNpZmljU3RhdHVzKHN0YXR1c1tzXSkpewotCQkJCQkJRmVhdHVyZVN0YXR1cyBmZWF0dXJlU3RhdHVzID0gKEZlYXR1cmVTdGF0dXMpc3RhdHVzW3NdOwotCQkJCQkJaWYobmV3bHlTZWxlY3RlZEZlYXR1cmUuZXF1YWxzKGZlYXR1cmVTdGF0dXMuZ2V0RmVhdHVyZSgpKSl7Ci0JCQkJCQkJbGFzdERpc3BsYXllZFN0YXR1cz1mZWF0dXJlU3RhdHVzOwotCQkJCQkJCXNldEVycm9yTWVzc2FnZShmZWF0dXJlU3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyAyLiAgc2hvdyBvbGQgc3RhdHVzIGlmIHBvc3NpYmxlIChpdCBpcyBzdGlsbCB2YWxpZCkKLQkJCWlmKGxhc3REaXNwbGF5ZWRTdGF0dXMgIT1udWxsKXsKLQkJCQlJU3RhdHVzW10gc3RhdHVzID0gdmFsaWRhdGlvblN0YXR1cy5nZXRDaGlsZHJlbigpOwotCQkJCWZvcihpbnQgaT0wOyBpPHN0YXR1cy5sZW5ndGg7IGkrKyl7Ci0JCQkJCWlmKGxhc3REaXNwbGF5ZWRTdGF0dXMuZXF1YWxzKHN0YXR1c1tpXSkpewotCQkJCQkJLy9sYXN0RGlzcGxheWVkU3RhdHVzPWxhc3REaXNwbGF5ZWRTdGF0dXM7Ci0JCQkJCQkvL3NldEVycm9yTWVzc2FnZShzdGF0dXNbaV0uZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQlsYXN0RGlzcGxheWVkU3RhdHVzID0gbnVsbDsKLQkJCX0KLQkJCQotCQkJLy8gMy4gIHBpY2sgdGhlIGZpcnN0IHByb2JsZW0gdGhhdCBpcyBzcGVjaWZpYyB0byBzb21lIGZlYXR1cmUKLQkJCUlTdGF0dXNbXSBzdGF0dXMgPSB2YWxpZGF0aW9uU3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IoaW50IHMgPTA7IHM8IHN0YXR1cy5sZW5ndGg7IHMrKyl7Ci0JCQkJaWYoaXNTcGVjaWZpY1N0YXR1cyhzdGF0dXNbc10pKXsKLQkJCQkJbGFzdERpc3BsYXllZFN0YXR1cyA9IChGZWF0dXJlU3RhdHVzKXN0YXR1c1tzXTsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKHN0YXR1c1tzXS5nZXRNZXNzYWdlKCkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJCQotCQkJLy8gNC4gIGRpc3BsYXkgdGhlIGZpcnN0IHByb2JsZW0gKG5vIHByb2JsZW1zIHNwZWNpZnkgYSBmZWF0dXJlKQotCQkJaWYoc3RhdHVzLmxlbmd0aD4wKXsKLQkJCQlJU3RhdHVzIHNpbmdsZVN0YXR1cz1zdGF0dXNbMF07Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKHNpbmdsZVN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJfWVsc2V7Ci0JCQkvLyA1LiBub3QgbXVsdGkgb3IgZW1wdHkgbXVsdGkgc3RhdHVzCi0JCQkJc2V0RXJyb3JNZXNzYWdlKFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9SZXZpZXdQYWdlX2ludmFsaWRfbG9uZyk7IAotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgU3RhdHVzRGlhbG9nIGV4dGVuZHMgRXJyb3JEaWFsb2cgewotLy8JCUJ1dHRvbiBkZXRhaWxzQnV0dG9uOwotCQlwdWJsaWMgU3RhdHVzRGlhbG9nKCkgewotCQkJc3VwZXIoZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSwgVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1Jldmlld1BhZ2VfaW52YWxpZF9zaG9ydCwgbnVsbCwgCi0JCQkJCXZhbGlkYXRpb25TdGF0dXMsIElTdGF0dXMuT0sgfCBJU3RhdHVzLklORk8KLQkJCQkJCQl8IElTdGF0dXMuV0FSTklORyB8IElTdGF0dXMuRVJST1IpOwotCQl9Ci0vLwkJcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVCdXR0b24oCi0vLwkJCQlDb21wb3NpdGUgcGFyZW50LAotLy8JCQkJaW50IGlkLAotLy8JCQkJU3RyaW5nIGxhYmVsLAotLy8JCQkJYm9vbGVhbiBkZWZhdWx0QnV0dG9uKSB7Ci0vLwkJCUJ1dHRvbiBiID0gc3VwZXIuY3JlYXRlQnV0dG9uKHBhcmVudCwgaWQsIGxhYmVsLCBkZWZhdWx0QnV0dG9uKTsKLS8vCQkJaWYoSURpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lEID09IGlkKXsKLS8vCQkJCWRldGFpbHNCdXR0b24gPSBiOwotLy8JCQl9Ci0vLwkJCXJldHVybiBiOwotLy8JCX0KLQkJcHVibGljIHZvaWQgY3JlYXRlKCkgewotCQkJc3VwZXIuY3JlYXRlKCk7Ci0JCQlidXR0b25QcmVzc2VkKElEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCk7Ci0vLwkJCWlmKGRldGFpbHNCdXR0b24hPW51bGwpewotLy8JCQkJZGV0YWlsc0J1dHRvbi5kaXNwb3NlKCk7Ci0vLwkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSwgaWYgY29tcGxldGVkLCBmYWxzZSBpZiBjYW5jZWxlZCBieSB0aGUgdXNlcgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBkb3dubG9hZEluY2x1ZGVkRmVhdHVyZXMoKSB7Ci0JCXRyeSB7Ci0JCQlEb3dubG9hZGVyIGRvd25sb2FkZXIgPSBuZXcgRG93bmxvYWRlcihqb2JzKTsKLQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCB0cnVlLCBkb3dubG9hZGVyKTsKLQkJCXJldHVybiAhZG93bmxvYWRlci5pc0NhbmNlbGVkKCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKgotCSAqIFJ1bm5hYmxlIHRvIHJlc29sdmUgaW5jbHVkZWQgZmVhdHVyZSByZWZlcmVuY2VzLgotCSAqLwotCWNsYXNzIERvd25sb2FkZXIgaW1wbGVtZW50cyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCQlib29sZWFuIGNhbmNlbGVkID0gZmFsc2U7Ci0JCS8qKgotCQkgKiBMaXN0IG9mIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbgotCQkgKi8KLQkJQXJyYXlMaXN0IG9wZXJhdGlvbnM7Ci0JCXB1YmxpYyBEb3dubG9hZGVyKEFycmF5TGlzdCBpbnN0YWxsT3BlcmF0aW9ucykgewotCQkJb3BlcmF0aW9ucyA9IGluc3RhbGxPcGVyYXRpb25zOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0JCQlyZXR1cm4gY2FuY2VsZWQ7Ci0JCX0KLQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcGVyYXRpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGNhbmRpZGF0ZSA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIG9wZXJhdGlvbnMKLQkJCQkJCS5nZXQoaSk7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGNhbmRpZGF0ZS5nZXRGZWF0dXJlKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBpcmVmcyA9IGZlYXR1cmUKLQkJCQkJCQkuZ2V0UmF3SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJCQlmb3IgKGludCBmID0gMDsgZiA8IGlyZWZzLmxlbmd0aDsgZisrKSB7Ci0JCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJCQljYW5jZWxlZCA9IHRydWU7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJSUZlYXR1cmVSZWZlcmVuY2UgaXJlZiA9IGlyZWZzW2ZdOwotCQkJCQkJaXJlZi5nZXRGZWF0dXJlKG1vbml0b3IpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJY2FuY2VsZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JfQotICAgIAotICAgIHByaXZhdGUgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGZpbmRKb2IoRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXIgZmVhdHVyZSkKLSAgICAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGpvYnMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGpvYnMuc2l6ZSgpOyBpKyspCi0gICAgICAgICAgICBpZiAoKChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIGpvYnMuZ2V0KGkpKS5nZXRGZWF0dXJlKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5lcXVhbHMoZmVhdHVyZS5nZXRGZWF0dXJlUmVmZXJlbmNlKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIGpvYnMuZ2V0KGkpOwotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIE9iamVjdCBnZXRTaXRlKE9iamVjdCBvYmplY3QpIHsKLSAgICAgICAgSVRyZWVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSAoSVRyZWVDb250ZW50UHJvdmlkZXIpdHJlZVZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKTsKLSAgICAgICAgd2hpbGUgKG9iamVjdCAhPSBudWxsICYmICEob2JqZWN0IGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKSkgewotICAgICAgICAgICAgb2JqZWN0ID0gcHJvdmlkZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9iamVjdDsKLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3REZXNjZW5kYW50cyhPYmplY3Qgcm9vdCwgQXJyYXlMaXN0IGxpc3QsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSVRyZWVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSAoSVRyZWVDb250ZW50UHJvdmlkZXIpIHRyZWVWaWV3ZXIKLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCU9iamVjdFtdIGNoaWxkcmVuID0gcHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocm9vdCk7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsICYmIGNoaWxkcmVuLmxlbmd0aCA+IDApCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQlyZXR1cm47Ci0JCQkJbGlzdC5hZGQoY2hpbGRyZW5baV0pOwotCQkJCWNvbGxlY3REZXNjZW5kYW50cyhjaGlsZHJlbltpXSwgbGlzdCwgbW9uaXRvcik7Ci0JCQl9Ci0JfQotCi0JCi0JcHVibGljIGJvb2xlYW4gaXNGZWF0dXJlR29vZChJSW1wb3J0IHJlcXVpcmVkRmVhdHVyZSwgSUZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gaXNGZWF0dXJlR29vZChyZXF1aXJlZEZlYXR1cmUsIGZlYXR1cmUsIG5ldyBBcnJheUxpc3QoKSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRmVhdHVyZUdvb2QoSUltcG9ydCBwcmVyZXEsIElGZWF0dXJlIGZlYXR1cmUsIExpc3QgdmlzaXRlZEZlYXR1cmVzKSB7Ci0KLQkJaWYgKHByZXJlcS5nZXRLaW5kKCkgPT0gSUltcG9ydC5LSU5EX0ZFQVRVUkUpIHsgCi0JCQlpZiAoKCFwcmVyZXEuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKS5lcXVhbHMoCi0JCQkJCWZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKSkpKSB7Ci0JCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGlpZnIgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWlpZnIgPSBmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkvLwlpZiB3ZSBjYW4gbm90IGdldCBpbmNsdWRlZCBmZWF0dXJlcyB0aGVuIHRoZXkgY2FuIG5vdCBzYXRpc2Z5IHJlcXVpcmVtZW50LCBzbyBqdXN0IGlnbm9yZSB0aGVtCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKGlpZnIgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBpaWZyLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlGZWF0dXJlIGN1cnJlbnQ7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljdXJyZW50ID0gVXBkYXRlVXRpbHMuZ2V0SW5jbHVkZWRGZWF0dXJlKGZlYXR1cmUsIGlpZnJbaV0pOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlmIHdlIGNhbiBub3QgZ2V0IGZlYXR1cmUgdGhlbiBpdCBjYW4gbm90IHNhdGlzZnkgcmVxdWlyZW1lbnQsIHNvIGp1c3QgaWdub3JlIGl0Ci0JCQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlpZiAoIXZpc2l0ZWRGZWF0dXJlcy5jb250YWlucyhjdXJyZW50KSkgewotCQkJCQkJdmlzaXRlZEZlYXR1cmVzLmFkZChjdXJyZW50KTsKLQkJCQkJCWlmIChpc0ZlYXR1cmVHb29kKHByZXJlcSwgY3VycmVudCwgdmlzaXRlZEZlYXR1cmVzKSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJaW50IHJ1bGUgPSAocHJlcmVxLmdldFJ1bGUoKSAhPSBJSW1wb3J0LlJVTEVfTk9ORSkgPyBwcmVyZXEuZ2V0UnVsZSgpIDogSUltcG9ydC5SVUxFX0NPTVBBVElCTEU7Ci0KLQkJCXN3aXRjaCAocnVsZSkgewotCQkJY2FzZSBJSW1wb3J0LlJVTEVfUEVSRkVDVDogcmV0dXJuIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS5pc1BlcmZlY3QoCi0JCQkJCQkJCXByZXJlcS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkJCQkJLmdldFZlcnNpb24oKSk7Ci0JCQljYXNlIElJbXBvcnQuUlVMRV9FUVVJVkFMRU5UOgotCQkJCQkJcmV0dXJuIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKQotCQkJCQkJLmlzRXF1aXZhbGVudFRvKAotCQkJCQkJCQlwcmVyZXEuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJCQkJCS5nZXRWZXJzaW9uKCkpOwotCQkJY2FzZSBJSW1wb3J0LlJVTEVfQ09NUEFUSUJMRToKLQkJCQlyZXR1cm4gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpCi0JCQkJCQkuaXNDb21wYXRpYmxlV2l0aCgKLQkJCQkJCQkJcHJlcmVxLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCQkJCQkuZ2V0VmVyc2lvbigpKTsKLQkJCWNhc2UgSUltcG9ydC5SVUxFX0dSRUFURVJfT1JfRVFVQUw6Ci0JCQkJCQlyZXR1cm4gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpCi0JCQkJCQkuaXNHcmVhdGVyT3JFcXVhbFRvKAotCQkJCQkJCQlwcmVyZXEuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJCQkJCS5nZXRWZXJzaW9uKCkpOwotCQkJfQotCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKHByZXJlcS5nZXRLaW5kKCkgPT0gSUltcG9ydC5LSU5EX1BMVUdJTikpIHsgCi0JCQkJcmV0dXJuIGNoZWNrSWZGZWF0dXJlSGFzUGx1Z2luKCBwcmVyZXEsIGZlYXR1cmUpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0lmRmVhdHVyZUhhc1BsdWdpbihJSW1wb3J0IHJlcXVpcmVkRmVhdHVyZSwgSUZlYXR1cmUgZmVhdHVyZSkgIHsKLQkJCi0JCUlQbHVnaW5FbnRyeVtdIHBsdWdpbnMgPSBmZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKLQkJdHJ5IHsJCQkKLQkJCUxpc3QgaW5jbHVkZWRQbHVnaW5zID0gZ2V0UGx1Z2luRW50cmllc0Zyb21JbmNsdWRlZEZlYXR1cmVzKGZlYXR1cmUsIG5ldyBBcnJheUxpc3QoKSwgbmV3IEFycmF5TGlzdCgpKTsKLQkJCWluY2x1ZGVkUGx1Z2lucy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwbHVnaW5zKSk7Ci0JCQlwbHVnaW5zID0gKElQbHVnaW5FbnRyeVtdKWluY2x1ZGVkUGx1Z2lucy50b0FycmF5KCBuZXcgSVBsdWdpbkVudHJ5W2luY2x1ZGVkUGx1Z2lucy5zaXplKCldKTsKLQkJfSBjYXRjaCggQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGNlKTsKLQkJCS8vIGlnbm9yZSB0aGlzIHBsdWdpbnMgY2FuIG5vdCBzdXRpc2Z5IHJlcXVpcmVtZW50IGFueXdheXMKLQkJfQotCQlpZiAocGx1Z2lucyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaXNNYXRjaChwbHVnaW5zW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSwgcmVxdWlyZWRGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSwgcmVxdWlyZWRGZWF0dXJlLmdldElkUnVsZSgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFBsdWdpbkVudHJpZXNGcm9tSW5jbHVkZWRGZWF0dXJlcyhJRmVhdHVyZSBmZWF0dXJlLCBMaXN0IHBsdWdpbnMsIExpc3QgdmlzaXRlZEZlYXR1cmVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBpaWZyID0gZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBpaWZyLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmVhdHVyZSBjdXJyZW50ID0gVXBkYXRlVXRpbHMuZ2V0SW5jbHVkZWRGZWF0dXJlKCBmZWF0dXJlLCBpaWZyW2ldKTsKLQkJCWlmICghdmlzaXRlZEZlYXR1cmVzLmNvbnRhaW5zKGN1cnJlbnQpKSB7Ci0JCQkJSVBsdWdpbkVudHJ5W10gcGx1Z2luRW50cmllcyA9IGN1cnJlbnQuZ2V0UGx1Z2luRW50cmllcygpOwotCQkJCXBsdWdpbnMuYWRkQWxsKEFycmF5cy5hc0xpc3QocGx1Z2luRW50cmllcykpOwotCQkJCXZpc2l0ZWRGZWF0dXJlcy5hZGQoY3VycmVudCk7Ci0JCQkJZ2V0UGx1Z2luRW50cmllc0Zyb21JbmNsdWRlZEZlYXR1cmVzKGN1cnJlbnQsIHBsdWdpbnMsIHZpc2l0ZWRGZWF0dXJlcyk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBwbHVnaW5zOwotCX0KLQotCS8vIHZpZDEgPSBmZWF0dXJlCi0JLy8gdmlkMiA9IHJlcXVpcmVkRmVhdHVyZQotCXByaXZhdGUgYm9vbGVhbiBpc01hdGNoKCBWZXJzaW9uZWRJZGVudGlmaWVyIHZpZDEsIFZlcnNpb25lZElkZW50aWZpZXIgdmlkMiwgaW50IHJ1bGUpIHsKLQkJCi0JCWlmICghdmlkMS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKHZpZDIuZ2V0SWRlbnRpZmllcigpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICggdmlkMi5nZXRWZXJzaW9uKCkuZ2V0TWFqb3JDb21wb25lbnQoKSA9PSAwICYmIHZpZDIuZ2V0VmVyc2lvbigpLmdldE1pbm9yQ29tcG9uZW50KCkgPT0gMCAmJiB2aWQyLmdldFZlcnNpb24oKS5nZXRTZXJ2aWNlQ29tcG9uZW50KCkgPT0gMCApIHsKLQkJCS8vdmVyc2lvbiBpcyBpZ25vcmVkCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlzd2l0Y2ggKHJ1bGUpIHsKLQkJY2FzZSBJSW1wb3J0LlJVTEVfUEVSRkVDVDoKLQkJCXJldHVybiB2aWQxLmdldFZlcnNpb24oKS5pc1BlcmZlY3QodmlkMi5nZXRWZXJzaW9uKCkpOwotCQljYXNlIElJbXBvcnQuUlVMRV9FUVVJVkFMRU5UOgotCQkJcmV0dXJuIHZpZDEuZ2V0VmVyc2lvbigpLmlzRXF1aXZhbGVudFRvKHZpZDIuZ2V0VmVyc2lvbigpKTsKLQkJY2FzZSBJSW1wb3J0LlJVTEVfQ09NUEFUSUJMRToKLQkJCXJldHVybiB2aWQxLmdldFZlcnNpb24oKS5pc0NvbXBhdGlibGVXaXRoKHZpZDIuZ2V0VmVyc2lvbigpKTsKLQkJY2FzZSBJSW1wb3J0LlJVTEVfR1JFQVRFUl9PUl9FUVVBTDoKLQkJCXJldHVybiB2aWQxLmdldFZlcnNpb24oKS5pc0dyZWF0ZXJPckVxdWFsVG8odmlkMi5nZXRWZXJzaW9uKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZlYXR1cmVCZXR0ZXIoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGZlYXR1cmUsCi0JCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gY3VycmVudEZlYXR1cmVTZWxlY3RlZCkgewotCi0JCWlmIChjdXJyZW50RmVhdHVyZVNlbGVjdGVkID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJLy8gSWYgdGhlIGZlYXR1cmUgaXMgdGhlIHNhbWUsIHBpY2sgdGhlIG5ld2VyIG9uZQotCQlpZiAoY3VycmVudEZlYXR1cmVTZWxlY3RlZC5nZXRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZS5nZXRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKSkpIHsKLQkJCXJldHVybiAhY3VycmVudEZlYXR1cmVTZWxlY3RlZC5nZXRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkuZ2V0VmVyc2lvbigpLmlzR3JlYXRlck9yRXF1YWxUbygKLQkJCQkJZmVhdHVyZS5nZXRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJCQkJLmdldFZlcnNpb24oKSk7CQkJCi0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBEaWZmZXJlbnQgZmVhdHVyZXMuCi0JCQkvLyBQaWNrIGEgZmVhdHVyZSB3aXRoIHNtYWxsZXIgbnVtYmVyIG9mIHBsdWctaW5zCi0JCQlOdWxsUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJaW50IGN1cnJlbnROdW1iZXIgPSBnZXRUb3RhbE51bWJlck9mUGx1Z2luRW50cmllcyhjdXJyZW50RmVhdHVyZVNlbGVjdGVkLmdldEZlYXR1cmUoKSwgbW9uaXRvcik7Ci0JCQlpbnQgbmV3TnVtYmVyID0gZ2V0VG90YWxOdW1iZXJPZlBsdWdpbkVudHJpZXMoZmVhdHVyZS5nZXRGZWF0dXJlKCksIG1vbml0b3IpOwotCQkJcmV0dXJuIG5ld051bWJlcjxjdXJyZW50TnVtYmVyOwotCQl9Ci0JfQotCQotCXByaXZhdGUgaW50IGdldFRvdGFsTnVtYmVyT2ZQbHVnaW5FbnRyaWVzKElGZWF0dXJlIGZlYXR1cmUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpbnQgY291bnQgPSAwOwotCQl0cnkgewotCQkJY291bnQgPSBmZWF0dXJlLmdldFBsdWdpbkVudHJ5Q291bnQoKTsKLQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgW10gaXJlZnMgPSBmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxpcmVmcy5sZW5ndGg7IGkrKykgewotCQkJCUlGZWF0dXJlIGNoaWxkID0gaXJlZnNbaV0uZ2V0RmVhdHVyZShtb25pdG9yKTsKLQkJCQljb3VudCArPSBnZXRUb3RhbE51bWJlck9mUGx1Z2luRW50cmllcyhjaGlsZCwgbW9uaXRvcik7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlwdWJsaWMgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGRlY2lkZU9uRmVhdHVyZVNlbGVjdGlvbigKLQkJCUlJbXBvcnQgcmVxdWlyZWRGZWF0dXJlLCBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gZmVhdHVyZSwKLQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBjdXJyZW50RmVhdHVyZVNlbGVjdGVkKSB7Ci0KLQkJaWYgKGlzRmVhdHVyZUdvb2QocmVxdWlyZWRGZWF0dXJlLCBmZWF0dXJlLmdldEZlYXR1cmUoKSkgJiYgaXNGZWF0dXJlQmV0dGVyKGZlYXR1cmUsIGN1cnJlbnRGZWF0dXJlU2VsZWN0ZWQpKSB7Ci0JCQkJcmV0dXJuIGZlYXR1cmU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gY3VycmVudEZlYXR1cmVTZWxlY3RlZDsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNGZWF0dXJlUHJvYmxlbWF0aWMoSUZlYXR1cmUgZmVhdHVyZSkgewotCQkKLQkJaWYgKCBwcm9ibGVtYXRpY0ZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpICkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJSUltcG9ydFtdIGlpbXBvcnRzID0gZmVhdHVyZS5nZXRJbXBvcnRzKCk7Ci0JCQotCQlmb3IoaW50IGkgPSAwOyBpIDwgaWltcG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCUl0ZXJhdG9yIHByb2JsZW1hdGljRmVhdHVyZXMgPSB0aGlzLnByb2JsZW1hdGljRmVhdHVyZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKHByb2JsZW1hdGljRmVhdHVyZXMuaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKGlpbXBvcnRzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5lcXVhbHMoICgoSUZlYXR1cmUpcHJvYmxlbWF0aWNGZWF0dXJlcy5uZXh0KCkpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkgKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0cnkgewotCQkJSXRlcmF0b3IgaW5jbHVkZWRGZWF0dXJlcyA9IE9wZXJhdGlvblZhbGlkYXRvci5jb21wdXRlRmVhdHVyZVN1YnRyZWUoZmVhdHVyZSwgbnVsbCwgbnVsbCwgZmFsc2UsIG5ldyBBcnJheUxpc3QoKSwgbnVsbCApLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaW5jbHVkZWRGZWF0dXJlcy5oYXNOZXh0KCkpIHsKLQkJCQlJdGVyYXRvciBwcm9ibGVtYXRpY0ZlYXR1cmVzID0gdGhpcy5wcm9ibGVtYXRpY0ZlYXR1cmVzLml0ZXJhdG9yKCk7CQkKLQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIGN1cnJlbnRJbmNsdWRlZEZlYXR1cmVzVkkgPSAoKElGZWF0dXJlKWluY2x1ZGVkRmVhdHVyZXMubmV4dCgpKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQkJd2hpbGUgKHByb2JsZW1hdGljRmVhdHVyZXMuaGFzTmV4dCgpKSB7Ci0JCQkJCU9iamVjdCBjdXJyZW50UHJvYmxlbWF0aWNGZWF0dXJlcyA9IHByb2JsZW1hdGljRmVhdHVyZXMubmV4dCgpOwotCQkJCQlpZiAoY3VycmVudFByb2JsZW1hdGljRmVhdHVyZXMgaW5zdGFuY2VvZiBJRmVhdHVyZSkgewotCQkJCQkJVmVyc2lvbmVkSWRlbnRpZmllciBjdXJyZW50UHJvYmxlbWF0aWNGZWF0dXJlc1ZJID0gKChJRmVhdHVyZSljdXJyZW50UHJvYmxlbWF0aWNGZWF0dXJlcykuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwkJCQkJCQotCQkJCQkJaWYgKGN1cnJlbnRQcm9ibGVtYXRpY0ZlYXR1cmVzVkkuZXF1YWxzKCBjdXJyZW50SW5jbHVkZWRGZWF0dXJlc1ZJKSApIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQl9Ci0gCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1NlbGVjdGVkKCBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBzZWxlY3RlZEpvYnMsIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBpSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIHsKLQkJCi0JCWlmIChzZWxlY3RlZEpvYnMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWZvciggaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRKb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkKLQkJCWlmIChpSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24uZ2V0RmVhdHVyZSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5lcXVhbHMoc2VsZWN0ZWRKb2JzW2ldLmdldEZlYXR1cmUoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpICYmCi0JCQkJaUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uLmdldEZlYXR1cmUoKS5nZXRTaXRlKCkuZ2V0VVJMKCkuZXF1YWxzKHNlbGVjdGVkSm9ic1tpXS5nZXRGZWF0dXJlKCkuZ2V0U2l0ZSgpLmdldFVSTCgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvU2hvd0FjdGl2aXRpZXNEaWFsb2cuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1Nob3dBY3Rpdml0aWVzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMjI5ZDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvU2hvd0FjdGl2aXRpZXNEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkluc3RhbGxDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUlNZXNzYWdlczsKLQotCi0KLXB1YmxpYyBjbGFzcyBTaG93QWN0aXZpdGllc0RpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJpdmF0ZSBUYWJsZVZpZXdlciBhY3Rpdml0aWVzVmlld2VyOwotCi0JLy8gbG9jYXRpb24gY29uZmlndXJhdGlvbgotCXByaXZhdGUgSURpYWxvZ1NldHRpbmdzIGRpYWxvZ1NldHRpbmdzOwotCXByaXZhdGUgUG9pbnQgZGlhbG9nTG9jYXRpb247Ci0JcHJpdmF0ZSBQb2ludCBkaWFsb2dTaXplOwotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICovCi0JcHVibGljIFNob3dBY3Rpdml0aWVzRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJc2V0U2hlbGxTdHlsZShTV1QuUkVTSVpFIHwgU1dULk1JTiB8IFNXVC5NQVggfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCQlyZWFkQ29uZmlndXJhdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGUoKSB7Ci0JCXN1cGVyLmNyZWF0ZSgpOwotCQkvLyBkaWFsb2cgbG9jYXRpb24gCi0JCWlmIChkaWFsb2dMb2NhdGlvbiAhPSBudWxsKQotCQkJZ2V0U2hlbGwoKS5zZXRMb2NhdGlvbihkaWFsb2dMb2NhdGlvbik7Ci0JCQotCQkvLyBkaWFsb2cgc2l6ZQotCQlpZiAoZGlhbG9nU2l6ZSAhPSBudWxsKQotCQkJZ2V0U2hlbGwoKS5zZXRTaXplKGRpYWxvZ1NpemUpOwotCQllbHNlCi0JCQlnZXRTaGVsbCgpLnNldFNpemUoNTAwLDUwMCk7Ci0JCQotCQkKLQkJYXBwbHlEaWFsb2dGb250KGJ1dHRvbkJhcik7Ci0JCWdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRGb2N1cygpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSBmYWxzZTsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ2QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWNyZWF0ZURlc2NyaXB0aW9uU2VjdGlvbihjb250YWluZXIpOwotCQljcmVhdGVBY3Rpdml0aWVzVmlld2VyKGNvbnRhaW5lcik7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29udGFpbmVyKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEZXNjcmlwdGlvblNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCl7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IGZhbHNlOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdHJ5IHsKLQkJCUxhYmVsIHRhcmdldExhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQkJdGFyZ2V0TGFiZWwuc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLlNob3dBY3Rpdml0aWVzRGlhbG9nX2RhdGUpOyAKLQkJCUxhYmVsIHRhcmdldCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OT05FKTsKLQkJCURhdGVGb3JtYXQgZGYgPSBEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2UoKTsKLQkJCVN0cmluZyBsb2NhbGl6ZWREYXRlID0gZGYuZm9ybWF0KFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q3JlYXRpb25EYXRlKCkpOwotCQkJdGFyZ2V0LnNldFRleHQobG9jYWxpemVkRGF0ZSk7Ci0JCQkKLQkJCUxhYmVsIHVybExhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQkJdXJsTGFiZWwuc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLlNob3dBY3Rpdml0aWVzRGlhbG9nX2xvYyk7IAotCQkJTGFiZWwgdXJsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQkJdXJsLnNldFRleHQoKChJbnN0YWxsQ29uZmlndXJhdGlvbilTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpKS5nZXRVUkwoKS5nZXRGaWxlKCkpOwotCQkJCi0JCQkKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQWN0aXZpdGllc1ZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IGdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSA0OwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0vLwkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0vLwkJZ2QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCi0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5TaG93QWN0aXZpdGllc0RpYWxvZ19sYWJlbCk7IAotCQlhY3Rpdml0aWVzVmlld2VyID0gQWN0aXZpdGllc1RhYmxlVmlld2VyLmNyZWF0ZVZpZXdlcihjb21wb3NpdGUsIHRydWUpOwotCi0JCVRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg4LCAyMCwgZmFsc2UpKTsKLQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIDE2MCwgdHJ1ZSkpOwotCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg1MCwgMTgzLCB0cnVlKSk7Ci0JCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDUwLCAxMDAsIHRydWUpKTsKLQotCQlhY3Rpdml0aWVzVmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXRyeSB7Ci0JCQlhY3Rpdml0aWVzVmlld2VyLnNldElucHV0KFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBPSyBidXR0b24gb25seSBieSBkZWZhdWx0Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCQlzdG9yZVNldHRpbmdzKCk7Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLQkKLQkvKioKLQkgKiBTdG9yZXMgdGhlIGN1cnJlbnQgc3RhdGUgaW4gdGhlIGRpYWxvZyBzZXR0aW5ncy4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlU2V0dGluZ3MoKSB7Ci0JCXdyaXRlQ29uZmlndXJhdGlvbigpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaWFsb2cgc2V0dGluZ3Mgb2JqZWN0IHVzZWQgdG8gc2hhcmUgc3RhdGUKLQkgKiBiZXR3ZWVuIHNldmVyYWwgZXZlbnQgZGV0YWlsIGRpYWxvZ3MuCi0JICogCi0JICogQHJldHVybiB0aGUgZGlhbG9nIHNldHRpbmdzIHRvIGJlIHVzZWQKLQkgKi8KLQlwcml2YXRlIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCWRpYWxvZ1NldHRpbmdzID0gc2V0dGluZ3MuZ2V0U2VjdGlvbihnZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCWlmIChkaWFsb2dTZXR0aW5ncyA9PSBudWxsKQotCQkJZGlhbG9nU2V0dGluZ3M9IHNldHRpbmdzLmFkZE5ld1NlY3Rpb24oZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQlyZXR1cm4gZGlhbG9nU2V0dGluZ3M7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgaXRzZWxmIGZyb20gdGhlIGRpYWxvZyBzZXR0aW5ncyB3aXRoIHRoZSBzYW1lIHN0YXRlCi0JICogYXMgYXQgdGhlIHByZXZpb3VzIGludm9jYXRpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlYWRDb25maWd1cmF0aW9uKCkgewotCQlJRGlhbG9nU2V0dGluZ3Mgcz0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJdHJ5IHsKLQkJCWludCB4PSBzLmdldEludCgieCIpOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgeT0gcy5nZXRJbnQoInkiKTsgLy8kTk9OLU5MUy0xJAotCQkJZGlhbG9nTG9jYXRpb249IG5ldyBQb2ludCh4LCB5KTsKLQkJCQotCQkJeCA9IHMuZ2V0SW50KCJ3aWR0aCIpOyAvLyROT04tTkxTLTEkCi0JCQl5ID0gcy5nZXRJbnQoImhlaWdodCIpOyAvLyROT04tTkxTLTEkCi0JCQlkaWFsb2dTaXplID0gbmV3IFBvaW50KHgseSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlkaWFsb2dMb2NhdGlvbj0gbnVsbDsKLQkJCWRpYWxvZ1NpemUgPSBudWxsOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCB3cml0ZUNvbmZpZ3VyYXRpb24oKXsKLQkJSURpYWxvZ1NldHRpbmdzIHMgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotCQlQb2ludCBsb2NhdGlvbiA9IGdldFNoZWxsKCkuZ2V0TG9jYXRpb24oKTsKLQkJcy5wdXQoIngiLCBsb2NhdGlvbi54KTsgLy8kTk9OLU5MUy0xJAotCQlzLnB1dCgieSIsIGxvY2F0aW9uLnkpOyAvLyROT04tTkxTLTEkCi0JCQotCQlQb2ludCBzaXplID0gZ2V0U2hlbGwoKS5nZXRTaXplKCk7Ci0JCXMucHV0KCJ3aWR0aCIsIHNpemUueCk7IC8vJE5PTi1OTFMtMSQKLQkJcy5wdXQoImhlaWdodCIsIHNpemUueSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9TaXRlUGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvU2l0ZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZiYTdlNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9TaXRlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLkh5cGVybGlua1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZU1hbmFnZXJVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5EaXNjb3ZlcnlGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLlNpdGVCb29rbWFyazsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuU2l0ZUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5VcGRhdGVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHMuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5JVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC5FbnZpcm9ubWVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLlVwZGF0ZVNlYXJjaFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC5VcGRhdGVTZWFyY2hTY29wZTsKLQotcHVibGljIGNsYXNzIFNpdGVQYWdlIGV4dGVuZHMgQmFubmVyUGFnZSBpbXBsZW1lbnRzIElTZWFyY2hQcm92aWRlciB7Ci0KLQljbGFzcyBTaXRlc0xhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFNpdGVCb29rbWFyaykKLQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5nZXQoCi0JCQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfU0lURV9PQkopOwotCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iaik7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFNpdGVCb29rbWFyaykgewotCQkJCXJldHVybiAoKFNpdGVCb29rbWFyaykgb2JqKS5nZXRMYWJlbCgpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqKTsKLQkJfQotCX0KLQotCWNsYXNzIE1vZGVsTGlzdGVuZXIgaW1wbGVtZW50cyBJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBvYmplY3RDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCWNoZWNrSXRlbXMoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG9iamVjdHNBZGRlZChPYmplY3QgcGFyZW50LCBPYmplY3RbXSBjaGlsZHJlbikgewotICAgICAgICAgICAgdmlld2VyLnJlZnJlc2goKTsKLQkJCWNoZWNrSXRlbXMoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG9iamVjdHNSZW1vdmVkKE9iamVjdCBwYXJlbnQsIE9iamVjdFtdIGNoaWxkcmVuKSB7Ci0JCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJY2hlY2tJdGVtcygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGlzY292ZXJ5Rm9sZGVyIGRpc2NvdmVyeUZvbGRlciA9IG5ldyBEaXNjb3ZlcnlGb2xkZXIoKTsKLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgdmlld2VyOwotCXByaXZhdGUgU2Nyb2xsZWRGb3JtVGV4dCBkZXNjTGFiZWw7Ci0JcHJpdmF0ZSBCdXR0b24gYWRkU2l0ZUJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBhZGRMb2NhbEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBhZGRMb2NhbFppcHBlZEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBlZGl0QnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBleHBvcnRCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gaW1wb3J0QnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGVudkZpbHRlckNoZWNrOwotCXByaXZhdGUgQnV0dG9uIGF1dG9tYXRpY2FsbHlTZWxlY3RNaXJyb3JzQ2hlY2tib3g7Ci0JcHJpdmF0ZSBFbnZpcm9ubWVudEZpbHRlciBlbnZGaWx0ZXI7Ci0JcHJpdmF0ZSBVcGRhdGVTZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3Q7Ci0JcHJpdmF0ZSBNb2RlbExpc3RlbmVyIG1vZGVsTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGF1dG9tYXRpY2FsbHlTZWxlY3RNaXJyb3JzID0gdHJ1ZTsKLQotCXB1YmxpYyBTaXRlUGFnZShVcGRhdGVTZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3QpIHsKLQkJc3VwZXIoIlNpdGVQYWdlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdGhpcy5zZWFyY2hSZXF1ZXN0ID0gc2VhcmNoUmVxdWVzdDsKLQkJc2V0VGl0bGUoVXBkYXRlVUlNZXNzYWdlcy5TaXRlUGFnZV90aXRsZSk7IAotCQlzZXREZXNjcmlwdGlvbihVcGRhdGVVSU1lc3NhZ2VzLlNpdGVQYWdlX2Rlc2MpOyAKLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5jb25uZWN0KHRoaXMpOwotICAgIAllbnZGaWx0ZXIgPSBuZXcgRW52aXJvbm1lbnRGaWx0ZXIoKTsKLQotCQltb2RlbExpc3RlbmVyID0gbmV3IE1vZGVsTGlzdGVuZXIoKTsKLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCkuYWRkVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIoCi0JCQltb2RlbExpc3RlbmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdG9nZ2xlRW52RmlsdGVyKGJvb2xlYW4gYWRkKSB7Ci0JCWlmIChhZGQpCi0JCQlzZWFyY2hSZXF1ZXN0LmFkZEZpbHRlcihlbnZGaWx0ZXIpOwotCQllbHNlCi0JCQlzZWFyY2hSZXF1ZXN0LnJlbW92ZUZpbHRlcihlbnZGaWx0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZGlzY29ubmVjdCh0aGlzKTsKLQkJVXBkYXRlVUkKLQkJCS5nZXREZWZhdWx0KCkKLQkJCS5nZXRVcGRhdGVNb2RlbCgpCi0JCQkucmVtb3ZlVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIoCi0JCQltb2RlbExpc3RlbmVyKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBAc2VlCi0JICogb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHMuQmFubmVyUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY2xpZW50ID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjbGllbnQsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLlNpdGVQYWdlX2xhYmVsKTsgCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJY3JlYXRlVmlld2VyKGNsaWVudCk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY2xpZW50LCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbkNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlidXR0b25Db250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJYWRkU2l0ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCWFkZFNpdGVCdXR0b24uc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLlNpdGVQYWdlX2FkZFVwZGF0ZVNpdGUpOyAKLQkJYWRkU2l0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKAotCQkJbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoYWRkU2l0ZUJ1dHRvbik7Ci0JCWFkZFNpdGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlQWRkU2l0ZSgpOwotCQkJfQotCQl9KTsKLQotCQlhZGRMb2NhbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCWFkZExvY2FsQnV0dG9uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5TaXRlUGFnZV9hZGRMb2NhbFNpdGUpOyAKLQkJYWRkTG9jYWxCdXR0b24uc2V0TGF5b3V0RGF0YSgKLQkJCW5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KGFkZExvY2FsQnV0dG9uKTsKLQkJYWRkTG9jYWxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlQWRkTG9jYWwoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYWRkTG9jYWxaaXBwZWRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlBVU0gpOwotCQlhZGRMb2NhbFppcHBlZEJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuU2l0ZVBhZ2VfYWRkTG9jYWxaaXBwZWRTaXRlKTsgCi0JCWFkZExvY2FsWmlwcGVkQnV0dG9uLnNldExheW91dERhdGEoCi0JCQluZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChhZGRMb2NhbFppcHBlZEJ1dHRvbik7Ci0JCWFkZExvY2FsWmlwcGVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUFkZExvY2FsWmlwcGVkKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gc2VwYXJhdG9yCi0JCW5ldyBMYWJlbChidXR0b25Db250YWluZXIsIFNXVC5Ob25lKTsKLQkJCi0JCWVkaXRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlBVU0gpOwotCQllZGl0QnV0dG9uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5TaXRlUGFnZV9lZGl0KTsgCi0JCWVkaXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVkaXRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChlZGl0QnV0dG9uKTsKLQkJZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVFZGl0KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuU2l0ZVBhZ2VfcmVtb3ZlKTsgCi0JCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEoCi0JCQluZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChyZW1vdmVCdXR0b24pOwotCQlyZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlUmVtb3ZlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJLy8gc2VwYXJhdG9yCi0JCW5ldyBMYWJlbChidXR0b25Db250YWluZXIsIFNXVC5Ob25lKTsKLQkJCi0JCWltcG9ydEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCWltcG9ydEJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuU2l0ZVBhZ2VfaW1wb3J0KTsgCi0JCWltcG9ydEJ1dHRvbi5zZXRMYXlvdXREYXRhKAotCQkJbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoaW1wb3J0QnV0dG9uKTsKLQkJaW1wb3J0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUltcG9ydCgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWV4cG9ydEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCWV4cG9ydEJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuU2l0ZVBhZ2VfZXhwb3J0KTsgCi0JCWV4cG9ydEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KGV4cG9ydEJ1dHRvbik7Ci0JCWV4cG9ydEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVFeHBvcnQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZGVzY0xhYmVsID0gbmV3IFNjcm9sbGVkRm9ybVRleHQoY2xpZW50LCB0cnVlKTsKLQkJZGVzY0xhYmVsLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWRlc2NMYWJlbC5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXRCYWNrZ3JvdW5kKCkpOwotCQlIeXBlcmxpbmtTZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBIeXBlcmxpbmtTZXR0aW5ncyhwYXJlbnQuZ2V0RGlzcGxheSgpKTsKLQkJZGVzY0xhYmVsLmdldEZvcm1UZXh0KCkuc2V0SHlwZXJsaW5rU2V0dGluZ3Moc2V0dGluZ3MpOwotCQkKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotICAgICAgICBnZC5oZWlnaHRIaW50ID0gMzA7Ci0JCWRlc2NMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCWVudkZpbHRlckNoZWNrID0gbmV3IEJ1dHRvbihjbGllbnQsIFNXVC5DSEVDSyk7Ci0JCWVudkZpbHRlckNoZWNrLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5TaXRlUGFnZV9pZ25vcmUpOyAKLQkJZW52RmlsdGVyQ2hlY2suc2V0U2VsZWN0aW9uKHRydWUpOwotCQl0b2dnbGVFbnZGaWx0ZXIodHJ1ZSk7Ci0JCWVudkZpbHRlckNoZWNrLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXRvZ2dsZUVudkZpbHRlcihlbnZGaWx0ZXJDaGVjay5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGdkLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJPVFRPTTsKLQkJZW52RmlsdGVyQ2hlY2suc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCi0JCWF1dG9tYXRpY2FsbHlTZWxlY3RNaXJyb3JzQ2hlY2tib3ggPSBuZXcgQnV0dG9uKGNsaWVudCwgU1dULkNIRUNLKTsKLQkJYXV0b21hdGljYWxseVNlbGVjdE1pcnJvcnNDaGVja2JveC5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuU2l0ZVBhZ2VfYXV0b21hdGljYWxseVNlbGVjdE1pcnJvcnMpOyAKLQkJYXV0b21hdGljYWxseVNlbGVjdE1pcnJvcnNDaGVja2JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWF1dG9tYXRpY2FsbHlTZWxlY3RNaXJyb3JzQ2hlY2tib3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYXV0b21hdGljYWxseVNlbGVjdE1pcnJvcnMgPSBhdXRvbWF0aWNhbGx5U2VsZWN0TWlycm9yc0NoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCQkJCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShVcGRhdGVDb3JlLlBfQVVUT01BVElDQUxMWV9DSE9PU0VfTUlSUk9SLCBhdXRvbWF0aWNhbGx5U2VsZWN0TWlycm9ycyk7Ci0JCQl9Ci0JCX0pOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGdkLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkJPVFRPTTsKLSAgICAgICAgYXV0b21hdGljYWxseVNlbGVjdE1pcnJvcnNDaGVja2JveC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNsaWVudCwgIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5TaXRlUGFnZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIGNsaWVudDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdmlld2VyID0KLQkJCUNoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KAotCQkJCXBhcmVudCwKLQkJCQlTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJdmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBwYXJlbnQpIHsKLQkJCQlyZXR1cm4gZ2V0QWxsU2l0ZUJvb2ttYXJrcygpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LAotCQkJCQlPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQkJfSk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBTaXRlc0xhYmVsUHJvdmlkZXIoKSk7Ci0JCXZpZXdlci5zZXRJbnB1dChVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKSk7Ci0JCQotCQkvLyBidWcgIyA4MzIxMgotCQl2aWV3ZXIuc2V0U29ydGVyKCBuZXcgVmlld2VyU29ydGVyKCkpOwotCQkKLQkJCi0JCWluaXRpYWxpemVJdGVtcygpOwotCi0JCXZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGUpIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGUuZ2V0RWxlbWVudCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKQotCQkJCQloYW5kbGVTaXRlQ2hlY2tlZCgoU2l0ZUJvb2ttYXJrKSBlbGVtZW50LCBlLmdldENoZWNrZWQoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXZpZXdlcgotCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUpIHsKLQkJCQloYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVJdGVtcygpIHsKLQkJY2hlY2tJdGVtcygpOwotCQl1cGRhdGVTZWFyY2hSZXF1ZXN0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrSXRlbXMoKSB7Ci0JCVRhYmxlSXRlbVtdIGl0ZW1zID0gdmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gKFNpdGVCb29rbWFyaykgaXRlbXNbaV0uZ2V0RGF0YSgpOwotCQkJdmlld2VyLnNldENoZWNrZWQoYm9va21hcmssIGJvb2ttYXJrLmlzU2VsZWN0ZWQoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQWRkU2l0ZSgpIHsKLQkJTmV3VXBkYXRlU2l0ZURpYWxvZyBkaWFsb2cgPSBuZXcgTmV3VXBkYXRlU2l0ZURpYWxvZyhnZXRTaGVsbCgpLCBnZXRBbGxTaXRlQm9va21hcmtzKCkpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5TaXRlUGFnZV9uZXcpOyAKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gTmV3VXBkYXRlU2l0ZURpYWxvZy5PSykKLQkJCXVwZGF0ZVNlYXJjaFJlcXVlc3QoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQWRkTG9jYWwoKSB7Ci0JCVNpdGVCb29rbWFyayBzaXRlQm9va21hcmsgPSBMb2NhbFNpdGVTZWxlY3Rvci5nZXRMb2NhTFNpdGUoZ2V0U2hlbGwoKSwgdGhpcy5nZXRBbGxTaXRlQm9va21hcmtzKCkpOwotCQlpZiAoc2l0ZUJvb2ttYXJrICE9IG51bGwpIHsKLQkJCWlmIChoYW5kbGVOYW1lRWRpdChzaXRlQm9va21hcmspID09IEVkaXRTaXRlRGlhbG9nLk9LKSB7Ci0JCQkJc2l0ZUJvb2ttYXJrLnNldFNlbGVjdGVkKHRydWUpOwotCQkJCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCQkJbW9kZWwuYWRkQm9va21hcmsoc2l0ZUJvb2ttYXJrKTsKLQkJCQltb2RlbC5zYXZlQm9va21hcmtzKCk7Ci0JCQkJdXBkYXRlU2VhcmNoUmVxdWVzdCgpOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQWRkTG9jYWxaaXBwZWQoKSB7Ci0JCVNpdGVCb29rbWFyayBzaXRlQm9va21hcmsgPSBMb2NhbFNpdGVTZWxlY3RvcgotCQkJCS5nZXRMb2NhTFppcHBlZFNpdGUoZ2V0U2hlbGwoKSwgdGhpcy5nZXRBbGxTaXRlQm9va21hcmtzKCkpOwotCQlpZiAoc2l0ZUJvb2ttYXJrICE9IG51bGwpIHsKLQkJCWlmIChoYW5kbGVOYW1lRWRpdChzaXRlQm9va21hcmspID09IEVkaXRTaXRlRGlhbG9nLk9LKSB7Ci0JCQkJc2l0ZUJvb2ttYXJrLnNldFNlbGVjdGVkKHRydWUpOwotCQkJCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCQkJbW9kZWwuYWRkQm9va21hcmsoc2l0ZUJvb2ttYXJrKTsKLQkJCQltb2RlbC5zYXZlQm9va21hcmtzKCk7Ci0JCQkJdXBkYXRlU2VhcmNoUmVxdWVzdCgpOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlUmVtb3ZlKCkgewotCQlCdXN5SW5kaWNhdG9yCi0JCQkuc2hvd1doaWxlKHZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVXBkYXRlTW9kZWwgdXBkYXRlTW9kZWwgPQotCQkJCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKTsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsID0KLQkJCQkJKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gKFNpdGVCb29rbWFyaykgc3NlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgc2VsTmFtZSA9IGJvb2ttYXJrLmdldExhYmVsKCk7Ci0JCQkJYm9vbGVhbiBhbnN3ZXIgPSBNZXNzYWdlRGlhbG9nCi0JCQkJCQkJCS5vcGVuUXVlc3Rpb24oCi0JCQkJCQkJCQkJZ2V0U2hlbGwoKSwKLQkJCQkJCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLlNpdGVQYWdlX3JlbW92ZV9sb2NhdGlvbl9jb25mX3RpdGxlLCAKLQkJCQkJCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLlNpdGVQYWdlX3JlbW92ZV9sb2NhdGlvbl9jb25mCi0JCQkJCQkJCQkJCQkrICIgIiArIHNlbE5hbWUpOyAvLyROT04tTkxTLTEkCi0KLQkJCQlpZiAoYW5zd2VyICYmICFib29rbWFyay5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJdXBkYXRlTW9kZWwucmVtb3ZlQm9va21hcmsoYm9va21hcmspOwotCQkJCQl1cGRhdGVTZWFyY2hSZXF1ZXN0KCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRWRpdCgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9Ci0JCQkoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gKFNpdGVCb29rbWFyaykgc3NlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJVVJMIG9sZFVSTCA9IGJvb2ttYXJrLmdldFVSTCgpOwotCQlFZGl0U2l0ZURpYWxvZyBkaWFsb2cgPSBuZXcgRWRpdFNpdGVEaWFsb2coZ2V0U2hlbGwoKSwgYm9va21hcmssIGdldEFsbFNpdGVCb29rbWFya3MoKSk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJU3RyaW5nIHRpdGxlID0gYm9va21hcmsuaXNMb2NhbCgpID8gVXBkYXRlVUlNZXNzYWdlcy5TaXRlUGFnZV9kaWFsb2dFZGl0TG9jYWwgOiBVcGRhdGVVSU1lc3NhZ2VzLlNpdGVQYWdlX2RpYWxvZ0VkaXRVcGRhdGVTaXRlOyAKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0yJAotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gRWRpdFNpdGVEaWFsb2cuT0sgKSB7Ci0JCQlVUkwgbmV3VVJMID0gYm9va21hcmsuZ2V0VVJMKCk7Ci0JCQlpZiAoIVVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKG9sZFVSTCwgbmV3VVJMKSkgewotCQkJCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCQkJbW9kZWwuZmlyZU9iamVjdENoYW5nZWQoYm9va21hcmssIG51bGwpOwotCQkJCXVwZGF0ZVNlYXJjaFJlcXVlc3QoKTsJCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlSW1wb3J0KCkgewotCQlTaXRlQm9va21hcmtbXSBzaXRlQm9va21hcmtzID0gU2l0ZXNJbXBvcnRFeHBvcnQuZ2V0SW1wb3J0ZWRCb29rbWFya3MoZ2V0U2hlbGwoKSk7Ci0JCWlmIChzaXRlQm9va21hcmtzICE9IG51bGwgJiYgc2l0ZUJvb2ttYXJrcy5sZW5ndGggPiAwKSB7Ci0JCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCQkJU2l0ZUJvb2ttYXJrW10gY3VycmVudEJvb2ttYXJrcyA9IGdldEFsbFNpdGVCb29rbWFya3MoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxzaXRlQm9va21hcmtzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYm9vbGVhbiBzaXRlRXhpc3RzID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaj0wOyAhc2l0ZUV4aXN0cyAmJiBqPGN1cnJlbnRCb29rbWFya3MubGVuZ3RoOyBqKyspCi0JCQkJCWlmIChjdXJyZW50Qm9va21hcmtzW2pdLmdldFVSTCgpLmVxdWFscyhzaXRlQm9va21hcmtzW2ldLmdldFVSTCgpKSkKLQkJCQkJCXNpdGVFeGlzdHMgPSB0cnVlOwotCQkJCWlmICghc2l0ZUV4aXN0cykKLQkJCQkJbW9kZWwuYWRkQm9va21hcmsoc2l0ZUJvb2ttYXJrc1tpXSk7Ci0JCQl9Ci0JCQltb2RlbC5zYXZlQm9va21hcmtzKCk7Ci0JCQl1cGRhdGVTZWFyY2hSZXF1ZXN0KCk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlRXhwb3J0KCkgewotCQlTaXRlc0ltcG9ydEV4cG9ydC5leHBvcnRCb29rbWFya3MoZ2V0U2hlbGwoKSwgZ2V0QWxsU2l0ZUJvb2ttYXJrcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgaGFuZGxlTmFtZUVkaXQoU2l0ZUJvb2ttYXJrIGJvb2ttYXJrKSB7Ci0JCUVkaXRTaXRlRGlhbG9nIGRpYWxvZyA9IG5ldyBFZGl0U2l0ZURpYWxvZyhnZXRTaGVsbCgpLCBib29rbWFyaywgZ2V0QWxsU2l0ZUJvb2ttYXJrcygpLCB0cnVlKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlTdHJpbmcgdGl0bGUgPSBib29rbWFyay5pc0xvY2FsKCkgPyBVcGRhdGVVSU1lc3NhZ2VzLlNpdGVQYWdlX2RpYWxvZ0VkaXRMb2NhbCA6IFVwZGF0ZVVJTWVzc2FnZXMuU2l0ZVBhZ2VfZGlhbG9nRWRpdFVwZGF0ZVNpdGU7IAotCQkvLyAvLyROT04tTkxTLTIkCi0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQodGl0bGUpOwotCQlpbnQgcmMgPSBkaWFsb2cub3BlbigpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNpdGVDaGVja2VkKFNpdGVCb29rbWFyayBib29rbWFyaywgYm9vbGVhbiBjaGVja2VkKSB7Ci0JCWlmIChib29rbWFyay5pc1VuYXZhaWxhYmxlKCkpIHsKLQkJCWJvb2ttYXJrLnNldFNlbGVjdGVkKGZhbHNlKTsKLQkJCXZpZXdlci5zZXRDaGVja2VkKGJvb2ttYXJrLCBmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWJvb2ttYXJrLnNldFNlbGVjdGVkKGNoZWNrZWQpOwotCQl1cGRhdGVTZWFyY2hSZXF1ZXN0KCk7Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsKSB7Ci0JCWJvb2xlYW4gZW5hYmxlID0gZmFsc2U7Ci0JCU9iamVjdCBpdGVtID0gc3NlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gbnVsbDsKLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBTaXRlQm9va21hcmspIHsKLQkJCWVuYWJsZSA9ICEoKFNpdGVCb29rbWFyaykgaXRlbSkuaXNSZWFkT25seSgpOwotCQkJZGVzY3JpcHRpb24gPSAoKFNpdGVCb29rbWFyaylpdGVtKS5nZXREZXNjcmlwdGlvbigpOwotCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTaXRlQ2F0ZWdvcnkpIHsKLS8vCQkJSVVSTEVudHJ5IGRlc2NFbnRyeSA9ICgoU2l0ZUNhdGVnb3J5KWl0ZW0pLmdldENhdGVnb3J5KCkuZ2V0RGVzY3JpcHRpb24oKTsKLS8vCQkJaWYgKGRlc2NFbnRyeSAhPSBudWxsKQotLy8JCQkJZGVzY3JpcHRpb24gPSBkZXNjRW50cnkuZ2V0QW5ub3RhdGlvbigpOwotCQl9Ci0JCWVkaXRCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCi0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJZGVzY3JpcHRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlkZXNjTGFiZWwuc2V0VGV4dChVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0V3JpdGFibGVYTUxTdHJpbmcoZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlU2VhcmNoUmVxdWVzdCgpIHsKLQkJT2JqZWN0W10gY2hlY2tlZCA9IHZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQotCQlVcGRhdGVTZWFyY2hTY29wZSBzY29wZSA9IG5ldyBVcGRhdGVTZWFyY2hTY29wZSgpOwotCQlpbnQgbnNpdGVzID0gMDsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrZWQubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjaGVja2VkW2ldIGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKSB7Ci0JCQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gKFNpdGVCb29rbWFyaykgY2hlY2tlZFtpXTsKLQkJCQlzY29wZS5hZGRTZWFyY2hTaXRlKAotCQkJCQlib29rbWFyay5nZXRMYWJlbCgpLAotCQkJCQlib29rbWFyay5nZXRVUkwoKSwKLQkJCQkJYm9va21hcmsuZ2V0SWdub3JlZENhdGVnb3JpZXMoKSk7Ci0JCQkJbnNpdGVzKys7Ci0JCQl9Ci0JCX0KLQkJc2VhcmNoUmVxdWVzdC5zZXRTY29wZShzY29wZSk7Ci0JCXNldFBhZ2VDb21wbGV0ZShuc2l0ZXMgPiAwKTsKLQl9Ci0KLQlwdWJsaWMgVXBkYXRlU2VhcmNoUmVxdWVzdCBnZXRTZWFyY2hSZXF1ZXN0KCkgewotCQlyZXR1cm4gc2VhcmNoUmVxdWVzdDsKLQl9Ci0gICAgCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZhbHVlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmFsdWUpOwotCQlpZiAodmFsdWUpIHsKLQkJCS8vIFJlc2V0IGFsbCB1bmF2YWlsYWJsZSBzaXRlcywgc28gdGhleSBjYW4gYmUgdHJpZWQgYWdhaW4gaWYgdGhlIHVzZXIgd2FudHMgaXQKLQkJCVNpdGVCb29rbWFya1tdIGJvb2ttYXJrcyA9IGdldEFsbFNpdGVCb29rbWFya3MoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxib29rbWFya3MubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoYm9va21hcmtzW2ldLmlzVW5hdmFpbGFibGUoKSkKLQkJCQkJYm9va21hcmtzW2ldLnNldFVuYXZhaWxhYmxlKGZhbHNlKTsKLQkJCX0KLQkJCWF1dG9tYXRpY2FsbHlTZWxlY3RNaXJyb3JzID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oVXBkYXRlQ29yZS5QX0FVVE9NQVRJQ0FMTFlfQ0hPT1NFX01JUlJPUik7Ci0JCQlhdXRvbWF0aWNhbGx5U2VsZWN0TWlycm9yc0NoZWNrYm94LnNldFNlbGVjdGlvbihhdXRvbWF0aWNhbGx5U2VsZWN0TWlycm9ycyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTaXRlQm9va21hcmtbXSBnZXRBbGxTaXRlQm9va21hcmtzKCkgewotCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCQlPYmplY3RbXSBib29rbWFya3MgPSBtb2RlbC5nZXRCb29rbWFya0xlYWZzKCk7Ci0JCU9iamVjdFtdIHNpdGVzVG9WaXNpdCA9Ci0JCQlkaXNjb3ZlcnlGb2xkZXIuZ2V0Q2hpbGRyZW4oZGlzY292ZXJ5Rm9sZGVyKTsKLQkJU2l0ZUJvb2ttYXJrW10gYWxsID0gbmV3IFNpdGVCb29rbWFya1tib29rbWFya3MubGVuZ3RoICsgc2l0ZXNUb1Zpc2l0Lmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYm9va21hcmtzLCAwLCBhbGwsIDAsIGJvb2ttYXJrcy5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KAotCQkJc2l0ZXNUb1Zpc2l0LAotCQkJMCwKLQkJCWFsbCwKLQkJCWJvb2ttYXJrcy5sZW5ndGgsCi0JCQlzaXRlc1RvVmlzaXQubGVuZ3RoKTsKLQkJcmV0dXJuIGFsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKS5sZW5ndGggIT0gMDsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9TaXRlc0ltcG9ydEV4cG9ydC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvU2l0ZXNJbXBvcnRFeHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE4NGFmMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9TaXRlc0ltcG9ydEV4cG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBTaXRlc0ltcG9ydEV4cG9ydCB7Ci0KLQlzdGF0aWMgU3RyaW5nIGxhc3RMb2NhdGlvbiA9IG51bGw7Ci0JCi0JcHVibGljIFNpdGVzSW1wb3J0RXhwb3J0KCkgewotCQlzdXBlcigpOwotCX0KLQkKLQotCXB1YmxpYyBzdGF0aWMgU2l0ZUJvb2ttYXJrW10gZ2V0SW1wb3J0ZWRCb29rbWFya3MoU2hlbGwgcGFyZW50KSB7Ci0JCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2cocGFyZW50KTsKLQkJZGlhbG9nLnNldFRleHQoCi0JCQlVcGRhdGVVSU1lc3NhZ2VzLkxvY2FsU2l0ZVNlbGVjdG9yX2RpYWxvZ01lc3NhZ2VJbXBvcnQpOyAKLQotCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyAiKi54bWwiLCAiKiIgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCVNpdGVCb29rbWFya1tdIHNpdGVCb29rbWFya3MgPSBudWxsOwotCi0JCVN0cmluZyBib29rbWFya3NGaWxlID0gZGlhbG9nLm9wZW4oKTsKLQkJd2hpbGUgKGJvb2ttYXJrc0ZpbGUgIT0gbnVsbCAmJiBzaXRlQm9va21hcmtzID09IG51bGwpIHsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGJvb2ttYXJrc0ZpbGUpOwotCQkJc2l0ZUJvb2ttYXJrcyA9IGNyZWF0ZUltcG9ydGVkQm9va21hcmtzKGZpbGUpOwotCQkJaWYgKHNpdGVCb29rbWFya3MgPT0gbnVsbCB8fCBzaXRlQm9va21hcmtzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oCi0JCQkJCXBhcmVudCwKLQkJCQkJVXBkYXRlVUlNZXNzYWdlcy5Mb2NhbFNpdGVTZWxlY3Rvcl9pbXBvcnRJbmZvVGl0bGUsIAotCQkJCQlVcGRhdGVVSU1lc3NhZ2VzLkxvY2FsU2l0ZVNlbGVjdG9yX2ltcG9ydEluZm9NZXNzYWdlKTsgCi0JCQkJYm9va21hcmtzRmlsZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBzaXRlQm9va21hcmtzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBleHBvcnRCb29rbWFya3MoU2hlbGwgcGFyZW50LCBTaXRlQm9va21hcmtbXSBzaXRlQm9va21hcmtzKSB7Ci0JCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2cocGFyZW50LCBTV1QuU0FWRSk7Ci0JCWRpYWxvZy5zZXRUZXh0KAotCQkJVXBkYXRlVUlNZXNzYWdlcy5Mb2NhbFNpdGVTZWxlY3Rvcl9kaWFsb2dNZXNzYWdlRXhwb3J0KTsgCi0KLQkJZGlhbG9nLnNldEZpbGVOYW1lKCJib29rbWFya3MueG1sIik7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgYm9va21hcmtzRmlsZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChib29rbWFya3NGaWxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlWZWN0b3IgYm9va21hcmtzID0gbmV3IFZlY3RvcihzaXRlQm9va21hcmtzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGk9MDsgaTxzaXRlQm9va21hcmtzLmxlbmd0aDsgaSsrKQotCQkJYm9va21hcmtzLmFkZChzaXRlQm9va21hcmtzW2ldKTsKLQkJQm9va21hcmtVdGlsLnN0b3JlKGJvb2ttYXJrc0ZpbGUsIGJvb2ttYXJrcyk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYm9va21hcmtzIG91dCBmcm9tIHRoZSBnaXZlbiBmaWxlCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuCi0JICovCi0Jc3RhdGljIFNpdGVCb29rbWFya1tdIGNyZWF0ZUltcG9ydGVkQm9va21hcmtzKEZpbGUgZmlsZSkgewotCQlWZWN0b3IgYm9va21hcmtzID0gbmV3IFZlY3RvcigpOwotCQlCb29rbWFya1V0aWwucGFyc2UoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgYm9va21hcmtzKTsKLQkJcmV0dXJuIEJvb2ttYXJrVXRpbC5nZXRCb29rbWFya3MoYm9va21hcmtzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1RhYmxlTGF5b3V0Q29tcG9zaXRlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9UYWJsZUxheW91dENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWFhNGY0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1RhYmxlTGF5b3V0Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbkxheW91dERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5QaXhlbERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotCi0vKioKLSAqIEEgc3BlY2lhbCBjb21wb3NpdGUgdG8gbGF5b3V0IGNvbHVtbnMgaW5zaWRlIGEgdGFibGUuIFRoZSBjb21wb3NpdGUgaXMgbmVlZGVkIHNpbmNlIHdlIGhhdmUKLSAqIHRvIGxheW91dCB0aGUgY29sdW1ucyAiYmVmb3JlIiB0aGUgYWN0dWFsIHRhYmxlIGdldHMgbGF5b3V0ZWQuIEhlbmNlIHdlIGNhbid0IHVzZSBhIG5vcm1hbAotICogbGF5b3V0IG1hbmFnZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWJsZUxheW91dENvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0KLQlwcml2YXRlIExpc3QgY29sdW1ucz0gbmV3IEFycmF5TGlzdCgpOwotCQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2YgZXh0cmEgcGl4ZWxzIHRha2VuIGFzIGhvcml6b250YWwgdHJpbSBieSB0aGUgdGFibGUgY29sdW1uLiAKLQkgKiBUbyBlbnN1cmUgdGhlcmUgYXJlIE4gcGl4ZWxzIGF2YWlsYWJsZSBmb3IgdGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiwKLQkgKiBhc3NpZ24gTitDT0xVTU5fVFJJTSBmb3IgdGhlIGNvbHVtbiB3aWR0aC4KLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IENPTFVNTl9UUklNID0gImNhcmJvbiIuZXF1YWxzKFNXVC5nZXRQbGF0Zm9ybSgpKSA/IDI0IDogMzsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UYWJsZUxheW91dENvbXBvc2l0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIFRhYmxlTGF5b3V0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLSAgICAgICAgYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGFyZWE9IGdldENsaWVudEFyZWEoKTsKLSAgICAgICAgICAgICAgICBUYWJsZSB0YWJsZT0gKFRhYmxlKWdldENoaWxkcmVuKClbMF07Ci0gICAgICAgICAgICAgICAgUG9pbnQgcHJlZmVycmVkU2l6ZT0gY29tcHV0ZVRhYmxlU2l6ZSh0YWJsZSk7Ci0gICAgICAgICAgICAgICAgaW50IHdpZHRoPSBhcmVhLndpZHRoIC0gMiAqIHRhYmxlLmdldEJvcmRlcldpZHRoKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZlcnJlZFNpemUueSA+IGFyZWEuaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFN1YnRyYWN0IHRoZSBzY3JvbGxiYXIgd2lkdGggZnJvbSB0aGUgdG90YWwgY29sdW1uIHdpZHRoCi0gICAgICAgICAgICAgICAgICAgIC8vIGlmIGEgdmVydGljYWwgc2Nyb2xsYmFyIHdpbGwgYmUgcmVxdWlyZWQKLSAgICAgICAgICAgICAgICAgICAgUG9pbnQgdkJhclNpemUgPSB0YWJsZS5nZXRWZXJ0aWNhbEJhcigpLmdldFNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgd2lkdGggLT0gdkJhclNpemUueDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGF5b3V0VGFibGUodGFibGUsIHdpZHRoLCBhcmVhLCB0YWJsZS5nZXRTaXplKCkueCA8IGFyZWEud2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyBhIG5ldyBjb2x1bW4gb2YgZGF0YSB0byB0aGlzIHRhYmxlIGxheW91dC4KLQkgKgotCSAqIEBwYXJhbSBkYXRhIHRoZSBjb2x1bW4gbGF5b3V0IGRhdGEKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb2x1bW5EYXRhKENvbHVtbkxheW91dERhdGEgZGF0YSkgewotCQljb2x1bW5zLmFkZChkYXRhKTsKLQl9Ci0JCi0JLy8tLS0tIEhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQotCXByaXZhdGUgUG9pbnQgY29tcHV0ZVRhYmxlU2l6ZShUYWJsZSB0YWJsZSkgewotCQlQb2ludCByZXN1bHQ9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQotCQlpbnQgd2lkdGg9IDA7Ci0JCWludCBzaXplPSBjb2x1bW5zLnNpemUoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHNpemU7ICsraSkgewotCQkJQ29sdW1uTGF5b3V0RGF0YSBsYXlvdXREYXRhPSAoQ29sdW1uTGF5b3V0RGF0YSkgY29sdW1ucy5nZXQoaSk7Ci0JCQlpZiAobGF5b3V0RGF0YSBpbnN0YW5jZW9mIENvbHVtblBpeGVsRGF0YSkgewotCQkJCUNvbHVtblBpeGVsRGF0YSBjb2w9IChDb2x1bW5QaXhlbERhdGEpIGxheW91dERhdGE7Ci0JCQkJd2lkdGggKz0gY29sLndpZHRoOwotCQkJCWlmIChjb2wuYWRkVHJpbSkgewotCQkJCQl3aWR0aCArPSBDT0xVTU5fVFJJTTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGxheW91dERhdGEgaW5zdGFuY2VvZiBDb2x1bW5XZWlnaHREYXRhKSB7Ci0JCQkJQ29sdW1uV2VpZ2h0RGF0YSBjb2w9IChDb2x1bW5XZWlnaHREYXRhKSBsYXlvdXREYXRhOwotCQkJCXdpZHRoICs9IGNvbC5taW5pbXVtV2lkdGg7Ci0JCQl9IGVsc2UgewotCQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJVbmtub3duIGNvbHVtbiBsYXlvdXQgZGF0YSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJaWYgKHdpZHRoID4gcmVzdWx0LngpCi0JCQlyZXN1bHQueD0gd2lkdGg7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsYXlvdXRUYWJsZShUYWJsZSB0YWJsZSwgaW50IHdpZHRoLCBSZWN0YW5nbGUgYXJlYSwgYm9vbGVhbiBpbmNyZWFzZSkgewotCQkvLyBYWFg6IExheW91dCBpcyBiZWluZyBjYWxsZWQgd2l0aCBhbiBpbnZhbGlkIHZhbHVlIHRoZSBmaXJzdCB0aW1lCi0JCS8vIGl0IGlzIGJlaW5nIGNhbGxlZCBvbiBMaW51eC4gVGhpcyBtZXRob2QgcmVzZXRzIHRoZQotCQkvLyBMYXlvdXQgdG8gbnVsbCBzbyB3ZSBtYWtlIHN1cmUgd2UgcnVuIGl0IG9ubHkgd2hlbgotCQkvLyB0aGUgdmFsdWUgaXMgT0suCi0JCWlmICh3aWR0aCA8PSAxKQotCQkJcmV0dXJuOwotCi0JCVRhYmxlQ29sdW1uW10gdGFibGVDb2x1bW5zPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JCWludCBzaXplPSBNYXRoLm1pbihjb2x1bW5zLnNpemUoKSwgdGFibGVDb2x1bW5zLmxlbmd0aCk7Ci0JCWludFtdIHdpZHRocz0gbmV3IGludFtzaXplXTsKLQkJaW50IGZpeGVkV2lkdGg9IDA7Ci0JCWludCBudW1iZXJPZldlaWdodENvbHVtbnM9IDA7Ci0JCWludCB0b3RhbFdlaWdodD0gMDsKLQotCQkvLyBGaXJzdCBjYWxjIHNwYWNlIG9jY3VwaWVkIGJ5IGZpeGVkIGNvbHVtbnMKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJQ29sdW1uTGF5b3V0RGF0YSBjb2w9IChDb2x1bW5MYXlvdXREYXRhKSBjb2x1bW5zLmdldChpKTsKLQkJCWlmIChjb2wgaW5zdGFuY2VvZiBDb2x1bW5QaXhlbERhdGEpIHsKLQkJCQlDb2x1bW5QaXhlbERhdGEgY3BkID0gKENvbHVtblBpeGVsRGF0YSkgY29sOwotCQkJCWludCBwaXhlbHMgPSBjcGQud2lkdGg7Ci0JCQkJaWYgKGNwZC5hZGRUcmltKSB7Ci0JCQkJCXBpeGVscyArPSBDT0xVTU5fVFJJTTsKLQkJCQl9Ci0JCQkJd2lkdGhzW2ldPSBwaXhlbHM7Ci0JCQkJZml4ZWRXaWR0aCArPSBwaXhlbHM7Ci0JCQl9IGVsc2UgaWYgKGNvbCBpbnN0YW5jZW9mIENvbHVtbldlaWdodERhdGEpIHsKLQkJCQlDb2x1bW5XZWlnaHREYXRhIGN3PSAoQ29sdW1uV2VpZ2h0RGF0YSkgY29sOwotCQkJCW51bWJlck9mV2VpZ2h0Q29sdW1ucysrOwotCQkJCS8vIGZpcnN0IHRpbWUsIHVzZSB0aGUgd2VpZ2h0IHNwZWNpZmllZCBieSB0aGUgY29sdW1uIGRhdGEsIG90aGVyd2lzZSB1c2UgdGhlIGFjdHVhbCB3aWR0aCBhcyB0aGUgd2VpZ2h0Ci0JCQkJLy8gaW50IHdlaWdodCA9IGZpcnN0VGltZSA/IGN3LndlaWdodCA6IHRhYmxlQ29sdW1uc1tpXS5nZXRXaWR0aCgpOwotCQkJCWludCB3ZWlnaHQ9IGN3LndlaWdodDsKLQkJCQlmaXhlZFdpZHRoKz1jdy5taW5pbXVtV2lkdGg7Ci0JCQkJdG90YWxXZWlnaHQgKz0gd2VpZ2h0OwotCQkJfSBlbHNlIHsKLQkJCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAiVW5rbm93biBjb2x1bW4gbGF5b3V0IGRhdGEiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJLy8gRG8gd2UgaGF2ZSBjb2x1bW5zIHRoYXQgaGF2ZSBhIHdlaWdodAotCQlpZiAobnVtYmVyT2ZXZWlnaHRDb2x1bW5zID4gMCkgewotCQkJLy8gTm93IGRpc3RyaWJ1dGUgdGhlIHJlc3QgdG8gdGhlIGNvbHVtbnMgd2l0aCB3ZWlnaHQuCi0JCQlpbnQgcmVzdD0gd2lkdGggLSBmaXhlZFdpZHRoOwotCQkJaW50IHRvdGFsRGlzdHJpYnV0ZWQ9IDA7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0JCQkJQ29sdW1uTGF5b3V0RGF0YSBjb2w9IChDb2x1bW5MYXlvdXREYXRhKSBjb2x1bW5zLmdldChpKTsKLQkJCQlpZiAoY29sIGluc3RhbmNlb2YgQ29sdW1uV2VpZ2h0RGF0YSkgewotCQkJCQlDb2x1bW5XZWlnaHREYXRhIGN3PSAoQ29sdW1uV2VpZ2h0RGF0YSkgY29sOwotCQkJCQkvLyBjYWxjdWxhdGUgd2VpZ2h0IGFzIGFib3ZlCi0JCQkJCS8vIGludCB3ZWlnaHQgPSBmaXJzdFRpbWUgPyBjdy53ZWlnaHQgOiB0YWJsZUNvbHVtbnNbaV0uZ2V0V2lkdGgoKTsKLQkJCQkJaW50IHdlaWdodD0gY3cud2VpZ2h0OwotCQkJCQlpbnQgc3BhcmVQaXhlbHM9IHRvdGFsV2VpZ2h0ID09IDAgPyAwIDogd2VpZ2h0ICogcmVzdCAvIHRvdGFsV2VpZ2h0OwotCQkJCQlpbnQgbmV3V2lkdGggPSBjdy5taW5pbXVtV2lkdGg7Ci0JCQkJCWlmIChzcGFyZVBpeGVscyA+MCApCi0JCQkJCQluZXdXaWR0aCArPSBzcGFyZVBpeGVsczsKLQkJCQkJdG90YWxEaXN0cmlidXRlZCArPSBuZXdXaWR0aDsKLQkJCQkJd2lkdGhzW2ldPSBuZXdXaWR0aDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIERpc3RyaWJ1dGUgYW55IHJlbWFpbmluZyBwaXhlbHMgdG8gY29sdW1ucyB3aXRoIHdlaWdodC4KLQkJCWludCBkaWZmPSByZXN0IC0gdG90YWxEaXN0cmlidXRlZDsKLQkJCWZvciAoaW50IGk9IDA7IGRpZmYgPiAwOyArK2kpIHsKLQkJCQlpZiAoaSA9PSBzaXplKQotCQkJCQlpPSAwOwotCQkJCUNvbHVtbkxheW91dERhdGEgY29sPSAoQ29sdW1uTGF5b3V0RGF0YSkgY29sdW1ucy5nZXQoaSk7Ci0JCQkJaWYgKGNvbCBpbnN0YW5jZW9mIENvbHVtbldlaWdodERhdGEpIHsKLQkJCQkJKyt3aWR0aHNbaV07Ci0JCQkJCS0tZGlmZjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChpbmNyZWFzZSkgewotCQkJdGFibGUuc2V0U2l6ZShhcmVhLndpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCX0KLQkJZm9yIChpbnQgaT0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdGFibGVDb2x1bW5zW2ldLnNldFdpZHRoKHdpZHRoc1tpXSk7Ci0JCX0KLQkJaWYgKCFpbmNyZWFzZSkgewotCQkJdGFibGUuc2V0U2l6ZShhcmVhLndpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9UYXJnZXRQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9UYXJnZXRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NDIzZWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvVGFyZ2V0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUluc3RhbGxDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5Mb2NhbFN5c3RlbUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuQ29uZmlndXJlZFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy5VcGRhdGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy5EZWZhdWx0Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFRhcmdldFBhZ2UgZXh0ZW5kcyBCYW5uZXJQYWdlIGltcGxlbWVudHMgSUR5bmFtaWNQYWdlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkVBVFVSRV9OQU1FX0NPTFVNTiA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfVkVSU0lPTl9DT0xVTU4gPSAxOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX1NJWkVfQ09MVU1OID0gMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5TVEFMTEFUSU9OX0RJUkVDVE9SWV9DT0xVTU4gPSAzOwotCQotCXByaXZhdGUgZmxvYXQgZmVhdHVyZU5hbWVDb2x1bW5Qcm9jZXRhbmdlID0gMC4yNWY7Ci0JcHJpdmF0ZSBmbG9hdCBmZWF0dXJlVmVyc2lvbkNvbHVtblByb2NldGFuZ2UgPSAwLjI1ZjsKLQlwcml2YXRlIGZsb2F0IGZlYXR1cmVTaXplQ29sdW1uUHJvY2V0YW5nZSA9IDAuMTVmOwotCQotCXByaXZhdGUgVGFibGVWaWV3ZXIgam9iVmlld2VyOwotCXByaXZhdGUgSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZzsKLQlwcml2YXRlIExhYmVsIHJlcXVpcmVkU3BhY2VMYWJlbDsKLQlwcml2YXRlIExhYmVsIGF2YWlsYWJsZVNwYWNlTGFiZWw7Ci0JcHJpdmF0ZSBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBqb2JzOwotICAgIC8vcHJpdmF0ZSBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gY3VycmVudEpvYjsKLSAgICBwcml2YXRlIExhYmVsIGluc3RhbGxMb2NhdGlvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBjaGFuZ2VMb2NhdGlvbjsKLSAgICBwcml2YXRlIElDb25maWd1cmVkU2l0ZSBbXSBhZGRlZFNpdGVzOwotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc1VwZGF0ZTsgLy8gd2hldGhlciB0aGUgd2l6YXJkIGlzIHVwZGF0aW5nIGEgZmVhdHVyZSBvciBpbnN0YWxsaW5nIGEgbmV3IG9uZQotCi0JY2xhc3MgSm9ic0NvbnRlbnRQcm92aWRlcgotCQlleHRlbmRzIERlZmF1bHRDb250ZW50UHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgcGFyZW50KSB7Ci0JCQlyZXR1cm4gam9iczsKLQkJfQotCX0KLQotCWNsYXNzIEpvYnNMYWJlbFByb3ZpZGVyCi0JCWV4dGVuZHMgTGFiZWxQcm92aWRlcgotCQlpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCQkJCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqLCBpbnQgY29sKSB7Ci0JCQkKLQkJCWlmIChjb2wgPiAwKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCVVwZGF0ZUxhYmVsUHJvdmlkZXIgcHJvdmlkZXIgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpOwotCi0JCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iID0gKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgb2JqOwotCQkJSW1hZ2VEZXNjcmlwdG9yIGJhc2UgPQotCQkJCWpvYi5nZXRGZWF0dXJlKCkuaXNQYXRjaCgpCi0JCQkJCT8gVXBkYXRlVUlJbWFnZXMuREVTQ19FRklYX09CSgotCQkJCQk6IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfRkVBVFVSRV9PQko7Ci0JCQlpbnQgZmxhZ3MgPSAwOwotCQkJaWYgKGpvYi5nZXRUYXJnZXRTaXRlKCkgPT0gbnVsbCkKLQkJCQlmbGFncyA9IFVwZGF0ZUxhYmVsUHJvdmlkZXIuRl9FUlJPUjsKLQkJCXJldHVybiBwcm92aWRlci5nZXQoYmFzZSwgZmxhZ3MpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmosIGludCBjb2wpIHsKLQkJCQotCQkJSUZlYXR1cmUgZmVhdHVyZSA9ICgoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSBvYmopLmdldEZlYXR1cmUoKTsKLQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9KChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pb2JqKS5nZXRUYXJnZXRTaXRlKCk7IAotCQkJSVNpdGUgc2l0ZSA9IGNzaXRlIT1udWxsP2NzaXRlLmdldFNpdGUoKTpudWxsOwotCQkJaWYgKGNvbCA9PSBGRUFUVVJFX05BTUVfQ09MVU1OKSB7CQkJCQotCQkJCXJldHVybiBmZWF0dXJlLmdldExhYmVsKCk7Ci0JCQl9IGVsc2UgaWYgKGNvbCA9PSBGRUFUVVJFX1ZFUlNJT05fQ09MVU1OKSB7Ci0JCQkJcmV0dXJuIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpOwotCQkJfSBlbHNlIGlmIChjb2wgPT0gRkVBVFVSRV9TSVpFX0NPTFVNTikgewotCQkJCWlmIChzaXRlPT1udWxsKQotCQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlsb25nIHJlcXVpcmVkU3BhY2UgPSBzaXRlLmdldERvd25sb2FkU2l6ZUZvcihmZWF0dXJlKSArIHNpdGUuZ2V0SW5zdGFsbFNpemVGb3IoZmVhdHVyZSk7Ci0JCQkJcmV0dXJuIGdldFNpemVTdHJpbmcocmVxdWlyZWRTcGFjZSk7Ci0JCQl9IGVsc2UgaWYgKGNvbCA9PSBJTlNUQUxMQVRJT05fRElSRUNUT1JZX0NPTFVNTikgewotCQkJCWlmIChzaXRlPT1udWxsKQotCQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gc2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCWNsYXNzIEpvYlZpZXdlclNvcnRlciBleHRlbmRzIFZpZXdlclNvcnRlciB7Ci0JCQotCQkKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFTQ0VORElORyA9IDA7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFU0NFTkRJTkcgPSAxOwotCi0JCXByaXZhdGUgaW50IGNvbHVtbjsKLQotCQlwcml2YXRlIGludCBkaXJlY3Rpb247Ci0KLQkJcHVibGljIHZvaWQgZG9Tb3J0KGludCBjb2x1bW4pIHsKLQotCQkJaWYgKGNvbHVtbiA9PSB0aGlzLmNvbHVtbikgewotCQkJCWRpcmVjdGlvbiA9IDEgLSBkaXJlY3Rpb247Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuY29sdW1uID0gY29sdW1uOwotCQkJCWRpcmVjdGlvbiA9IEFTQ0VORElORzsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBDb21wYXJlcyB0aGUgb2JqZWN0IGZvciBzb3J0aW5nCi0JCSAqLwotCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQotCQkJaW50IHJjID0gMDsKLQkJCQotCQkJSUZlYXR1cmUgZmVhdHVyZTEgPSAoKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgbzEpLmdldEZlYXR1cmUoKTsKLQkJCUlGZWF0dXJlIGZlYXR1cmUyID0gKChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIG8yKS5nZXRGZWF0dXJlKCk7Ci0KLQkJCVN0cmluZyBmZWF0dXJlTmFtZTEgPSBmZWF0dXJlMS5nZXRMYWJlbCgpOwotCQkJU3RyaW5nIGZlYXR1cmVOYW1lMiA9IGZlYXR1cmUyLmdldExhYmVsKCk7Ci0JCQkKLQkJCVN0cmluZyBmZWF0dXJlSWQxID0gZmVhdHVyZTEuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpOwotCQkJU3RyaW5nIGZlYXR1cmVJZDIgPSBmZWF0dXJlMi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7Ci0KLQkJCVN0cmluZyBpbnN0YWxsYXRpb25EaXJlY3RvcnkxID0gKChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pbzEpLmdldFRhcmdldFNpdGUoKS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpLnRvU3RyaW5nKCk7Ci0JCQlTdHJpbmcgaW5zdGFsbGF0aW9uRGlyZWN0b3J5MiA9ICgoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKW8yKS5nZXRUYXJnZXRTaXRlKCkuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKS50b1N0cmluZygpOwotCi0JCQlzd2l0Y2ggKGNvbHVtbikgewotCQkJY2FzZSBGRUFUVVJFX05BTUVfQ09MVU1OOgotCQkJCXJjID0gY29sbGF0b3IuY29tcGFyZShmZWF0dXJlTmFtZTEsIGZlYXR1cmVOYW1lMik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEZFQVRVUkVfVkVSU0lPTl9DT0xVTU46Ci0JCQkJcmMgPSBjb2xsYXRvci5jb21wYXJlKGZlYXR1cmVJZDEsIGZlYXR1cmVJZDIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJTlNUQUxMQVRJT05fRElSRUNUT1JZX0NPTFVNTjoKLQkJCQlyYyA9IGNvbGxhdG9yLmNvbXBhcmUoaW5zdGFsbGF0aW9uRGlyZWN0b3J5MSwgaW5zdGFsbGF0aW9uRGlyZWN0b3J5Mik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8vIElmIGRlc2NlbmRpbmcgb3JkZXIsIGZsaXAgdGhlIGRpcmVjdGlvbgotCQkJaWYgKGRpcmVjdGlvbiA9PSBERVNDRU5ESU5HKQotCQkJCXJjID0gLXJjOwotCi0JCQlyZXR1cm4gcmM7Ci0JCX0KLQl9Ci0JCi0JY2xhc3MgQ29uZmlnTGlzdGVuZXIgaW1wbGVtZW50cyBJSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBpbnN0YWxsU2l0ZUFkZGVkKElDb25maWd1cmVkU2l0ZSBjc2l0ZSkgewotCQkJCi0JCQkvLyBzZXQgdGhlIHNpdGUgYXMgdGFyZ2V0IGZvciBhbGwgam9icyB3aXRob3V0IGEgdGFyZ2V0Ci0JCQlmb3IgKGludCBpPTA7IGpvYnMgIT0gbnVsbCAmJiBpPGpvYnMubGVuZ3RoOyBpKyspCi0JCQkJaWYgKGpvYnNbaV0uZ2V0VGFyZ2V0U2l0ZSgpID09IG51bGwgJiYgZ2V0U2l0ZVZpc2liaWxpdHkoY3NpdGUsIGpvYnNbaV0pKSB7Ci0JCQkJCWpvYnNbaV0uc2V0VGFyZ2V0U2l0ZShjc2l0ZSk7Ci0JCQkJfQotCi0JCQlqb2JWaWV3ZXIucmVmcmVzaCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5zdGFsbFNpdGVSZW1vdmVkKElDb25maWd1cmVkU2l0ZSBjc2l0ZSkgewotCQkJLy8gcmVtb3ZlIHRoZSB0YXJnZXQgc2l0ZSBmb3IgYWxsIGpvYnMgdGhhdCB1c2UgaXQKLQkJCS8vIHNldCB0aGUgc2l0ZSBhcyB0YXJnZXQgZm9yIGFsbCBqb2JzIHdpdGhvdXQgYSB0YXJnZXQKLQkJCWJvb2xlYW4gcmVmcmVzaEpvYnMgPSBmYWxzZTsKLQkJCWZvciAoaW50IGk9MDsgam9icyAhPSBudWxsICYmIGk8am9icy5sZW5ndGg7IGkrKykKLQkJCQlpZiAoam9ic1tpXS5nZXRUYXJnZXRTaXRlKCkgPT0gY3NpdGUpIHsKLQkJCQkJam9ic1tpXS5zZXRUYXJnZXRTaXRlKG51bGwpOwotCQkJCQlyZWZyZXNoSm9icyA9IHRydWU7Ci0JCQkJfQotCQkJCQotCQkJcGFnZUNoYW5nZWQoKTsKLQkJCQotCQkJam9iVmlld2VyLnJlZnJlc2goKTsKLQkJCWlmIChyZWZyZXNoSm9icykgewotCQkJCWpvYlZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSZXZpZXdQYWdlMgotCSAqLwotCXB1YmxpYyBUYXJnZXRQYWdlKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsIGJvb2xlYW4gaXNVcGRhdGUpIHsKLQkJc3VwZXIoIlRhcmdldCIpOyAvLyROT04tTkxTLTEkCi0JCXNldFRpdGxlKFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX3RpdGxlKTsgCi0JCXNldERlc2NyaXB0aW9uKFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX2Rlc2MpOyAKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuY29ubmVjdCh0aGlzKTsKLQkJdGhpcy5pc1VwZGF0ZSA9IGlzVXBkYXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEpvYnMoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gam9icykgewotCQkvL3dlIG5lZWQgb25seSB1bmlxdWUgZmVhdHVyZXMKLQkJLy91c2luZyBTZXQgaGVyZSBhbGxvd3MgdXMgdG8gZ2V0IHJpZCBvZiBhIGR1cGxpY2F0ZSBlbGVtZW50cwotCQlTZXQgam9ic1NldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgam9icy5sZW5ndGg7IGkrKykgewotCQkJam9ic1NldC5hZGQoam9ic1tpXSk7Ci0JCX0KLQkJCi0JCXRoaXMuam9icyA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSkgam9ic1NldC50b0FycmF5KG5ldyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bam9ic1NldC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmRpc2Nvbm5lY3QodGhpcyk7Ci0vLwkJY29uZmlnLnJlbW92ZUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKGNvbmZpZ0xpc3RlbmVyKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNsaWVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJY2xpZW50LnNldExheW91dChsYXlvdXQpOwotCQljbGllbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjbGllbnQsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9qb2JzTGFiZWwpOyAKLQkJY3JlYXRlSm9iVmlld2VyKGNsaWVudCk7Ci0KLQkJbGFiZWwgPSBuZXcgTGFiZWwoY2xpZW50LCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfbG9jYXRpb24pOyAKLSAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotICAgICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlpbnN0YWxsTG9jYXRpb24gPSBuZXcgTGFiZWwoY2xpZW50LCBTV1QuTlVMTCk7Ci0gICAgICAgIGluc3RhbGxMb2NhdGlvbi5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBpbnN0YWxsTG9jYXRpb24uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIAotICAgICAgICBjaGFuZ2VMb2NhdGlvbiA9IG5ldyBCdXR0b24oY2xpZW50LCBTV1QuUFVTSCk7Ci0gICAgICAgIGNoYW5nZUxvY2F0aW9uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfbG9jYXRpb25fY2hhbmdlKTsgCi0gICAgICAgIGNoYW5nZUxvY2F0aW9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNoYW5nZUxvY2F0aW9uT2ZGZWF0dXJlcygpOwotICAgICAgICAgICAgfQotCi0JCQkKLSAgICAgICAgfSk7Ci0JCQkKLQkJQ29tcG9zaXRlIHN0YXR1cyA9IG5ldyBDb21wb3NpdGUoY2xpZW50LCBTV1QuTlVMTCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJc3RhdHVzLnNldExheW91dERhdGEoZ2QpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCXN0YXR1cy5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbGFiZWwgPSBuZXcgTGFiZWwoc3RhdHVzLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfcmVxdWlyZWRTcGFjZSk7IAotCQlyZXF1aXJlZFNwYWNlTGFiZWwgPSBuZXcgTGFiZWwoc3RhdHVzLCBTV1QuTlVMTCk7Ci0JCXJlcXVpcmVkU3BhY2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbGFiZWwgPSBuZXcgTGFiZWwoc3RhdHVzLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfYXZhaWxhYmxlU3BhY2UpOyAKLQkJYXZhaWxhYmxlU3BhY2VMYWJlbCA9IG5ldyBMYWJlbChzdGF0dXMsIFNXVC5OVUxMKTsKLQkJYXZhaWxhYmxlU3BhY2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNsaWVudCwgIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5NdWx0aVRhcmdldFBhZ2UyIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJCi0JCXJldHVybiBjbGllbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUpvYlZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlmaW5hbCBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuUkVTSVpFIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJCi0JCVRhYmxlQ29sdW1uIGZlYXR1cmVOYW1lQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCwgRkVBVFVSRV9OQU1FX0NPTFVNTik7Ci0JCWZlYXR1cmVOYW1lQ29sdW1uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5UYXJnZXRQYWdlX0ZlYXR1cmVOYW1lQ29sdW1uKTsgCi0JCWZlYXR1cmVOYW1lQ29sdW1uLnNldFdpZHRoKDc1KTsKLQkJCi0JCVRhYmxlQ29sdW1uIGZlYXR1cmVWZXJzaW9uQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCwgRkVBVFVSRV9WRVJTSU9OX0NPTFVNTik7Ci0JCWZlYXR1cmVWZXJzaW9uQ29sdW1uLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5UYXJnZXRQYWdlX0ZlYXR1cmVfVmVyc2lvbik7IAotCQlmZWF0dXJlVmVyc2lvbkNvbHVtbi5zZXRXaWR0aCg3NSk7Ci0JCQotCQlUYWJsZUNvbHVtbiBmZWF0dXJlU2l6ZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULkxFRlQsIEZFQVRVUkVfU0laRV9DT0xVTU4pOwotCQlmZWF0dXJlU2l6ZUNvbHVtbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuVGFyZ2V0UGFnZV9GZWF0dXJlX1NpemUpOyAKLQkJZmVhdHVyZVNpemVDb2x1bW4uc2V0V2lkdGgoNzUpOwotCQkKLQkJVGFibGVDb2x1bW4gZmVhdHVyZUxvY2F0aW9uQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCwgSU5TVEFMTEFUSU9OX0RJUkVDVE9SWV9DT0xVTU4pOwotCQlmZWF0dXJlTG9jYXRpb25Db2x1bW4uc2V0VGV4dChVcGRhdGVVSU1lc3NhZ2VzLlRhcmdldFBhZ2VfSW5zdGFsbGF0aW9uRGlyZWN0b3J5Q29sdW1uKTsgCi0JCWZlYXR1cmVMb2NhdGlvbkNvbHVtbi5zZXRXaWR0aCg3NSk7Ci0JCWpvYlZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCQotCQkvL2pvYlZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIgfCBTV1QuTVVMVEkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWdkLndpZHRoSGludCA9IDE1MDsKLQkJZ2QuaGVpZ2h0SGludCA9IDIwMDsKLQkJam9iVmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWpvYlZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEpvYnNDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWpvYlZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBKb2JzTGFiZWxQcm92aWRlcigpKTsKLQkJam9iVmlld2VyLnNldFNvcnRlcihuZXcgSm9iVmlld2VyU29ydGVyKCkpOwotCQkKLQkJam9iVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJCQkJY2hhbmdlTG9jYXRpb25PZkZlYXR1cmVzKCk7CQkJCQotCQkJCX0KLQkJCX0KLQkJKTsKLQkJCi0JCXRhYmxlLmFkZExpc3RlbmVyKFNXVC5NZW51RGV0ZWN0LCBuZXcgTGlzdGVuZXIoKSB7Ci0JCSAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCSAgICAJICBNZW51IG1lbnUgPSBuZXcgTWVudSAoZ2V0U2hlbGwoKSwgU1dULlBPUF9VUCk7Ci0JCQkJCU1lbnVJdGVtIGl0ZW0gPSBuZXcgTWVudUl0ZW0gKG1lbnUsIFNXVC5QVVNIKTsKLQkJCQkJaXRlbS5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX2xvY2F0aW9uX2NoYW5nZSk7Ci0JCQkJCWl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyICgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCAoRXZlbnQgZSkgewotCQkJCQkJCQljaGFuZ2VMb2NhdGlvbk9mRmVhdHVyZXMoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCSk7Ci0JCQkJCW1lbnUuc2V0TG9jYXRpb24gKGV2ZW50LngsIGV2ZW50LnkpOwotCQkJCQltZW51LnNldFZpc2libGUgKHRydWUpOwotCQkgICAgICB9Ci0JCQl9Ci0JCSk7Ci0JCWZlYXR1cmVOYW1lQ29sdW1uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCSgoSm9iVmlld2VyU29ydGVyKSBqb2JWaWV3ZXIuZ2V0U29ydGVyKCkpLmRvU29ydChGRUFUVVJFX05BTUVfQ09MVU1OKTsKLQkJCQkJam9iVmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCSAgICB9Ci0JCSk7Ci0JCQotCQlmZWF0dXJlVmVyc2lvbkNvbHVtbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJICAgICAgCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCSAgICAgIAkJKChKb2JWaWV3ZXJTb3J0ZXIpIGpvYlZpZXdlci5nZXRTb3J0ZXIoKSkuZG9Tb3J0KEZFQVRVUkVfVkVSU0lPTl9DT0xVTU4pOwotCQkgICAgICAJCWpvYlZpZXdlci5yZWZyZXNoKCk7Ci0JCSAgICAgIAl9Ci0JCSAgICB9Ci0JCSk7Ci0JCQotCQlmZWF0dXJlU2l6ZUNvbHVtbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJICAgICAgCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCSAgICAgIAkJKChKb2JWaWV3ZXJTb3J0ZXIpIGpvYlZpZXdlci5nZXRTb3J0ZXIoKSkuZG9Tb3J0KEZFQVRVUkVfU0laRV9DT0xVTU4pOwotCQkgICAgICAJCWpvYlZpZXdlci5yZWZyZXNoKCk7Ci0JCSAgICAgIAl9Ci0JCSAgICB9Ci0JCSk7Ci0JCQotCQlmZWF0dXJlTG9jYXRpb25Db2x1bW4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCSAgICAgIAlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkgICAgICAJCSgoSm9iVmlld2VyU29ydGVyKSBqb2JWaWV3ZXIuZ2V0U29ydGVyKCkpLmRvU29ydChJTlNUQUxMQVRJT05fRElSRUNUT1JZX0NPTFVNTik7Ci0JCSAgICAgIAkJam9iVmlld2VyLnJlZnJlc2goKTsKLQkJICAgICAgCX0KLQkJICAgIH0KLQkJKTsKLQkJCi0JCXRhYmxlLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCi0KLQkJCQlSZWN0YW5nbGUgYXJlYSA9IHRhYmxlLmdldENsaWVudEFyZWEoKTsKLQkJCQlQb2ludCBwcmVmZXJyZWRTaXplID0gdGFibGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQotCQkJCWludCB0YWJsZVdpZHRoID0gYXJlYS53aWR0aCAtIDMgKiB0YWJsZS5nZXRCb3JkZXJXaWR0aCgpOwotCQkJCWlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCArIHRhYmxlLmdldEhlYWRlckhlaWdodCgpKXsKLQkJCQkJUG9pbnQgdkJhclNpemUgPSB0YWJsZS5nZXRWZXJ0aWNhbEJhcigpLmdldFNpemUoKTsKLQkJCQkJdGFibGVXaWR0aCAtPSB2QmFyU2l6ZS54OwotCQkJCX0JCQotCQkJCQotCQkJCVRhYmxlQ29sdW1uIGZlYXR1cmVOYW1lQ29sdW1uID0gdGFibGUuZ2V0Q29sdW1uKEZFQVRVUkVfTkFNRV9DT0xVTU4pOwotCQkJCVRhYmxlQ29sdW1uIGZlYXR1cmVWZXJzaW9uQ29sdW1uID0gdGFibGUuZ2V0Q29sdW1uKEZFQVRVUkVfVkVSU0lPTl9DT0xVTU4pOwotCQkJCVRhYmxlQ29sdW1uIGZlYXR1cmVTaXplQ29sdW1uID0gdGFibGUuZ2V0Q29sdW1uKEZFQVRVUkVfU0laRV9DT0xVTU4pOwotCQkJCVRhYmxlQ29sdW1uIGZlYXR1cmVMb2NhdGlvbkNvbHVtbiA9IHRhYmxlLmdldENvbHVtbihJTlNUQUxMQVRJT05fRElSRUNUT1JZX0NPTFVNTik7Ci0KLQkJCQlmZWF0dXJlTmFtZUNvbHVtbi5zZXRXaWR0aCgoaW50KSh0YWJsZVdpZHRoICogZmVhdHVyZU5hbWVDb2x1bW5Qcm9jZXRhbmdlKSk7Ci0JCQkJZmVhdHVyZVZlcnNpb25Db2x1bW4uc2V0V2lkdGgoKGludCkodGFibGVXaWR0aCAqIGZlYXR1cmVWZXJzaW9uQ29sdW1uUHJvY2V0YW5nZSkpOwotCQkJCWZlYXR1cmVTaXplQ29sdW1uLnNldFdpZHRoKChpbnQpKHRhYmxlV2lkdGggKiBmZWF0dXJlU2l6ZUNvbHVtblByb2NldGFuZ2UpKTsKLQkJCQlmZWF0dXJlTG9jYXRpb25Db2x1bW4uc2V0V2lkdGgodGFibGVXaWR0aCAtIGZlYXR1cmVOYW1lQ29sdW1uLmdldFdpZHRoKCkgLSBmZWF0dXJlVmVyc2lvbkNvbHVtbi5nZXRXaWR0aCgpIC0gZmVhdHVyZVNpemVDb2x1bW4uZ2V0V2lkdGgoKSk7CQkgICAgCQotCi0JCQkJCi0JCQkJZmVhdHVyZU5hbWVDb2x1bW5Qcm9jZXRhbmdlID0gZmVhdHVyZU5hbWVDb2x1bW4uZ2V0V2lkdGgoKSAvIChmbG9hdCl0YWJsZVdpZHRoOwotCQkJCWZlYXR1cmVWZXJzaW9uQ29sdW1uUHJvY2V0YW5nZSA9IGZlYXR1cmVWZXJzaW9uQ29sdW1uLmdldFdpZHRoKCkgLyAoZmxvYXQpdGFibGVXaWR0aDsKLQkJCQlmZWF0dXJlU2l6ZUNvbHVtblByb2NldGFuZ2UgPSBmZWF0dXJlU2l6ZUNvbHVtbi5nZXRXaWR0aCgpIC8gKGZsb2F0KXRhYmxlV2lkdGg7Ci0JCQl9Ci0JCX0pOwotCi0KLQkJam9iVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlU3RhdHVzKCk7Ci0KLQkJCX0KLQkJfSk7Ci0JCQotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCSAgICB0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJaWYgKHZpc2libGUpIHsKLQkJCWluaXRpYWxpemVEZWZhdWx0VGFyZ2V0U2l0ZXMoKTsKLQkJCWpvYlZpZXdlci5zZXRJbnB1dChqb2JzKTsKLQkJCWlmIChqb2JWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpICYmIGpvYnMubGVuZ3RoID4gMCkKLQkJCQlqb2JWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGpvYnNbMF0pKTsKLQkJfQotCQkKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Tm90RW1wdHkoYm9vbGVhbiBlbXB0eSkgewotCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJaWYgKGVtcHR5KQotCQkJZXJyb3JNZXNzYWdlID0gVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfbG9jYXRpb25fZW1wdHk7IAotCQlzZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQkJc2V0UGFnZUNvbXBsZXRlKCFlbXB0eSk7Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgdXBkYXRlU3RhdHVzKCkgewotCQkKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0ZWRKb2JzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKWpvYlZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIHNlbGVjdGVkSm9iID0gKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbilzZWxlY3RlZEpvYnMuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCi0JCXJlcXVpcmVkU3BhY2VMYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlhdmFpbGFibGVTcGFjZUxhYmVsLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWluc3RhbGxMb2NhdGlvbi5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYgKHNlbGVjdGVkSm9iID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPSBzZWxlY3RlZEpvYi5nZXRUYXJnZXRTaXRlKCk7IC8qKElDb25maWd1cmVkU2l0ZSkgZWxlbWVudDsqLwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCkpOwotCQlsb25nIGF2YWlsYWJsZSA9IC0xOwotCQlsb25nIHJlcXVpcmVkID0gLTE7Ci0JCWlmIChhcmVBbGxUYXJnZXRTaXRlc1NhbWUoKSkgewotCQkJYXZhaWxhYmxlID0gTG9jYWxTeXN0ZW1JbmZvLmdldEZyZWVTcGFjZShmaWxlKTsKLQkJCXJlcXVpcmVkID0gY29tcHV0ZVJlcXVpcmVkU2l6ZUZvcihzaXRlKTsKLQkJCS8vYWRkIHRoZSBkb3dubG9hZCBzaXplIHRvIHNwYWNlIHJlcXVpcmVkIHRvIGRvIG9wZXJhdGlvbiBzaW5jZSBhbGwgcGx1Z2lucyBhbmQgbm9ucGx1Z2luIGRhdGEgd2lsbCBiZSBkb3dubG9hZGVkIGZpcnN0Ci0JCQlyZXF1aXJlZCArPSBjb21wdXRlRG93bmxvYWRTaXplRm9yKHNpdGUpOyAKLQkJCWluc3RhbGxMb2NhdGlvbi5zZXRUZXh0KG5ldyBGaWxlKHNlbGVjdGVkSm9iLmdldFRhcmdldFNpdGUoKS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpKS50b1N0cmluZygpKTsKLQkJfQkJCi0JCQotCQlpZiAoYXZhaWxhYmxlID09IExvY2FsU3lzdGVtSW5mby5TSVpFX1VOS05PV04pCi0JCQlhdmFpbGFibGUgPSAtMTsKLQkJCi0JCXJlcXVpcmVkU3BhY2VMYWJlbC5zZXRUZXh0KGdldFNpemVTdHJpbmcocmVxdWlyZWQpKTsKLQkJYXZhaWxhYmxlU3BhY2VMYWJlbC5zZXRUZXh0KGdldFNpemVTdHJpbmcoYXZhaWxhYmxlKSk7Ci0JCQotCQkKLQkJLy9pZiB0aGUgYXZhaWxhYmxlIHNwYWNlIHdhcyByZXRpcmV2ZWQgZnJvbSB0aGUgT1MgYW5kIHRoZSByZXF1aXJlZCBzcGFjZSBpcyBncmVhdGVyIHRoYXQgdGhlIGF2YWlsYWJsZSBzcGFjZSwgZG8gbm90IGxldCB0aGUgdXNlciBjb250aW51ZQotCQlpZihhdmFpbGFibGUgIT0gTG9jYWxTeXN0ZW1JbmZvLlNJWkVfVU5LTk9XTiAmJiByZXF1aXJlZCA+IGF2YWlsYWJsZSl7Ci0JCQl0aGlzLnNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCQkvL1RPRE86IHNldCBlcnJvciBtZXNzYWdlOiAiLi4ubm90IGVub3VnaCBzcGFjZS4uLiIKLQkJfWVsc2UKLQkJCXRoaXMuc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gYXJlQWxsVGFyZ2V0U2l0ZXNTYW1lKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3RlZEpvYnMgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pam9iVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHNlbGVjdGVkSm9icy5pdGVyYXRvcigpOwotCQlVUkwgc2l0ZSA9IG51bGw7Ci0JCWlmIChpdGVyYXRvciAhPSBudWxsKSB7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gY3VycmVudCA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsJCQkJCi0JCQkJaWYgKHNpdGUgIT0gbnVsbCkgewotCQkJCQlpZiAoIXNpdGUuZXF1YWxzKGN1cnJlbnQuZ2V0VGFyZ2V0U2l0ZSgpLmdldFNpdGUoKS5nZXRVUkwoKSkpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXNpdGUgPSBjdXJyZW50LmdldFRhcmdldFNpdGUoKS5nZXRTaXRlKCkuZ2V0VVJMKCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFNpemVTdHJpbmcobG9uZyBzaXplKSB7Ci0JCWlmIChzaXplIDw9IDApIHsKLQkJCXJldHVybiBVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV91bmtub3duU2l6ZTsKLQkJfSBlbHNlIHsKLQkJCWRvdWJsZSBvcmRlciA9IDEwMjQuMDsKLQkJCWRvdWJsZSBzaXplSW5NQiA9IHNpemUgLyBvcmRlcjsKLQkJCWRvdWJsZSBzaXplSW5HQiA9IHNpemUgLyBvcmRlciAvIG9yZGVyOwotCQkJaWYgKCBzaXplSW5NQiA8IDEpIHsKLQkJCQlyZXR1cm4gTkxTLmJpbmQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2Vfc2l6ZV9LQiwgIiIgKyBzaXplKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgcGF0dGVybiA9ICIjLiMjIjsgLy8kTk9OLU5MUy0xJAotCQkJCURlY2ltYWxGb3JtYXQgZm9ybWF0dGVyID0gbmV3IERlY2ltYWxGb3JtYXQocGF0dGVybik7Ci0JCQkJaWYgKHNpemVJbkdCIDwgMSkgewkJCQkJCi0JCQkJCXJldHVybiBOTFMuYmluZChVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9zaXplX01CLCBmb3JtYXR0ZXIuZm9ybWF0KHNpemVJbk1CKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX3NpemVfR0IsIGZvcm1hdHRlci5mb3JtYXQoc2l6ZUluR0IpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGxvbmcgY29tcHV0ZVJlcXVpcmVkU2l6ZUZvcihJQ29uZmlndXJlZFNpdGUgc2l0ZSkgewotCQlsb25nIHRvdGFsU2l6ZSA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgam9icy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHNpdGUuZXF1YWxzKGpvYnNbaV0uZ2V0VGFyZ2V0U2l0ZSgpKSkgewotCQkJCWxvbmcgam9iU2l6ZSA9IHNpdGUuZ2V0U2l0ZSgpLmdldEluc3RhbGxTaXplRm9yKGpvYnNbaV0uZ2V0RmVhdHVyZSgpKTsKLQkJCQlpZiAoam9iU2l6ZSA9PSAtMSkKLQkJCQkJcmV0dXJuIC0xOwotCQkJCXRvdGFsU2l6ZSArPSBqb2JTaXplOwotCQkJfQotCQl9Ci0JCXJldHVybiB0b3RhbFNpemU7Ci0JfQotCQotCXByaXZhdGUgbG9uZyBjb21wdXRlRG93bmxvYWRTaXplRm9yKElDb25maWd1cmVkU2l0ZSBzaXRlKSB7Ci0JCWxvbmcgdG90YWxTaXplID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoc2l0ZS5lcXVhbHMoam9ic1tpXS5nZXRUYXJnZXRTaXRlKCkpKSB7Ci0JCQkJbG9uZyBqb2JTaXplID0gc2l0ZS5nZXRTaXRlKCkuZ2V0RG93bmxvYWRTaXplRm9yKGpvYnNbaV0uZ2V0RmVhdHVyZSgpKTsKLQkJCQlpZiAoam9iU2l6ZSA9PSAtMSkKLQkJCQkJcmV0dXJuIC0xOwotCQkJCXRvdGFsU2l6ZSArPSBqb2JTaXplOwotCQkJfQotCQl9Ci0JCXJldHVybiB0b3RhbFNpemU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhZ2VDaGFuZ2VkKCkgewotCQlib29sZWFuIGVtcHR5ID0gZmFsc2U7Ci0JCWZvciAoaW50IGk9MDsgam9icyE9bnVsbCAmJiBpPGpvYnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChqb2JzW2ldLmdldFRhcmdldFNpdGUoKSA9PSBudWxsKSB7Ci0JCQkJZW1wdHkgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBqb2JzW2ldLmdldEZlYXR1cmUoKTsKLQkJCWlmIChmZWF0dXJlLmlzUGF0Y2goKSkgewotCQkJCS8vIFBhdGNoZXMgbXVzdCBnbyB0b2dldGhlciB3aXRoIHRoZSBmZWF0dXJlcwotCQkJCS8vIHRoZXkgYXJlIHBhdGNoaW5nLgotCQkJCQotCQkJCS8vIENoZWNrIGN1cnJlbnQgam9icwotCQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBwYXRjaGVkRmVhdHVyZUpvYiA9IGZpbmRQYXRjaGVkRmVhdHVyZShmZWF0dXJlKTsKLQkJCQlpZiAocGF0Y2hlZEZlYXR1cmVKb2IgIT0gbnVsbAotCQkJCQkmJiBwYXRjaGVkRmVhdHVyZUpvYi5nZXRUYXJnZXRTaXRlKCkgIT0gbnVsbAotCQkJCQkmJiAham9ic1tpXS5nZXRUYXJnZXRTaXRlKCkuZXF1YWxzKHBhdGNoZWRGZWF0dXJlSm9iLmdldFRhcmdldFNpdGUoKSkpIHsKLQkJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX3BhdGNoRXJyb3IsIChuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICAgICBmZWF0dXJlLmdldExhYmVsKCksCi0gICAgICAgICAgICAgICAgICAgIHBhdGNoZWRGZWF0dXJlSm9iLmdldEZlYXR1cmUoKS5nZXRMYWJlbCgpfSkpOwotCQkJCQlzZXRFcnJvck1lc3NhZ2UobXNnKTsKLQkJCQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkvLyBDaGVjayBpbnN0YWxsZWQgZmVhdHVyZXMKLQkJCQlJRmVhdHVyZSBwYXRjaGVkRmVhdHVyZSA9IFVwZGF0ZVV0aWxzLmdldFBhdGNoZWRGZWF0dXJlKGZlYXR1cmUpOwotCQkJCWlmIChwYXRjaGVkRmVhdHVyZSAhPSBudWxsICAKLQkJCQkJJiYgIWpvYnNbaV0uZ2V0VGFyZ2V0U2l0ZSgpLmVxdWFscyhwYXRjaGVkRmVhdHVyZS5nZXRTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCkpKSB7Ci0JCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChVcGRhdGVVSU1lc3NhZ2VzLkluc3RhbGxXaXphcmRfVGFyZ2V0UGFnZV9wYXRjaEVycm9yMiwgKG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICAgICAgICAgIGZlYXR1cmUuZ2V0TGFiZWwoKSwKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hlZEZlYXR1cmUuZ2V0TGFiZWwoKSwKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hlZEZlYXR1cmUuZ2V0U2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCl9KSk7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShtc2cpOwotCQkJCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXZlcmlmeU5vdEVtcHR5KGVtcHR5KTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSAgYm9vbGVhbiBnZXRTaXRlVmlzaWJpbGl0eShJQ29uZmlndXJlZFNpdGUgc2l0ZSwgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYikgewotCQkvLyBEbyBub3QgYWxsb3cgaW5zdGFsbGluZyBpbnRvIGEgbm9uLXVwZGF0ZWFibGUgc2l0ZQotCQlpZiAoIXNpdGUuaXNVcGRhdGFibGUoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCS8vIElmIGFmZmluaXR5IHNpdGUgaXMga25vd24sIG9ubHkgaXQgc2hvdWxkIGJlIHNob3duCi0JCUlDb25maWd1cmVkU2l0ZSBhZmZpbml0eVNpdGUgPSBVcGRhdGVVdGlscy5nZXRBZmZpbml0eVNpdGUoY29uZmlnLCBqb2IuZ2V0RmVhdHVyZSgpKTsKLQkJaWYgKGFmZmluaXR5U2l0ZSAhPSBudWxsKSB7Ci0JCQkvLyBNdXN0IGNvbXBhcmUgcmVmZXJlbmNlZCBzaXRlcyBiZWNhdXNlCi0JCQkvLyBjb25maWd1cmVkIHNpdGVzIHRoZW1zZWx2ZXMgbWF5IGNvbWUgZnJvbSAKLQkJCS8vIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucwotCQkJcmV0dXJuIHNpdGUuZ2V0U2l0ZSgpLmVxdWFscyhhZmZpbml0eVNpdGUuZ2V0U2l0ZSgpKTsKLQkJfQotCQkKLQkJLy8gQ28tbG9jYXRlIHVwZGF0ZXMgd2l0aCB0aGUgb2xkIGZlYXR1cmUKLQkJaWYgKGpvYi5nZXRPbGRGZWF0dXJlKCkgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyZWRTaXRlIG9sZFNpdGUgPSBVcGRhdGVVdGlscy5nZXRTaXRlV2l0aEZlYXR1cmUoY29uZmlnLCBqb2IuZ2V0T2xkRmVhdHVyZSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkpOwotCQkJcmV0dXJuIChzaXRlID09IG9sZFNpdGUpOwotCQl9Ci0KLQkJLy8gQWxsb3cgaW5zdGFsbGluZyBpbnRvIGFueSBzaXRlIHRoYXQgaXMgdXBkYXRlYWJsZSBhbmQgdGhlcmUgaXMgbm8gYWZmaW5pdHkgc3BlY2lmaWVkCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRUYXJnZXRTaXRlcygpIHsKLQkJCi0JCQotCQlJQ29uZmlndXJlZFNpdGUgbW9zdFJlY2VhbnRseVVzZWRTaXRlID0gZ2V0TW9zdFJlY2VhbnRseVVzZWRTaXRlKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgam9icy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGpvYnNbaV0uZ2V0VGFyZ2V0U2l0ZSgpICE9IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQkKLQkJCUlDb25maWd1cmVkU2l0ZSBhZmZpbml0eVNpdGUgPQlVcGRhdGVVdGlscy5nZXRBZmZpbml0eVNpdGUoY29uZmlnLCBqb2JzW2ldLmdldEZlYXR1cmUoKSk7Ci0JCQlpZiAoYWZmaW5pdHlTaXRlICE9IG51bGwpIHsKLQkJCQlqb2JzW2ldLnNldFRhcmdldFNpdGUoYWZmaW5pdHlTaXRlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJSUNvbmZpZ3VyZWRTaXRlIGRlZmF1bHRTaXRlID0gVXBkYXRlVXRpbHMuZ2V0RGVmYXVsdFRhcmdldFNpdGUoY29uZmlnLCBqb2JzW2ldLCBmYWxzZSk7Ci0JCQlpZiAoZGVmYXVsdFNpdGUgIT0gbnVsbCkgewotCQkJCWpvYnNbaV0uc2V0VGFyZ2V0U2l0ZShkZWZhdWx0U2l0ZSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCWlmIChtb3N0UmVjZWFudGx5VXNlZFNpdGUgIT0gbnVsbCkgewotCQkJCWpvYnNbaV0uc2V0VGFyZ2V0U2l0ZShtb3N0UmVjZWFudGx5VXNlZFNpdGUpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBnZXRGaXJzdFRhcmdldFNpdGUoam9ic1tpXSk7Ci0JCQlpZiAoY3NpdGUgPT0gbnVsbCAmJiBQbGF0Zm9ybS5nZXRJbnN0YWxsTG9jYXRpb24oKS5pc1JlYWRPbmx5KCkgJiYgaXNVcGRhdGUgPT0gZmFsc2UpIHsKLQkJCQkvLyB0aGVyZSBhcmUgbm8gdXBkYXRlYWJsZSBzaXRlcywgdGhlIGluc3RhbGxhdGlvbiBsb2NhdGlvbiBpcyByZWFkLW9ubHkgYW5kIHdlIGFyZSBpbnN0YWxsaW5nIGEgbmV3IGZlYXR1cmUKLQkJCQkvLyBtYWtlIGFuIHVwZGF0ZSBzaXRlIGluIHRoZSBjb25maWd1cmF0aW9uIGFyZWEKLQkJCQlTdHJpbmcgY29uZmlndXJhdGlvbkxvY2F0aW9uID0gUGxhdGZvcm0uZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOwotCQkJCUZpbGUgc2l0ZSA9IG5ldyBGaWxlKGNvbmZpZ3VyYXRpb25Mb2NhdGlvbik7Ci0JCQkJaWYgKCFDb25maWd1cmVkU2l0ZS5jYW5Xcml0ZShzaXRlKSkgewotCQkJCQkvLyBpZiB3ZSBjYW5ub3Qgd3JpdGUgdG8gdGhlIGNvbmZpZ3VyYXRpb24gYXJlYSB0aGVuIG1ha2UgYW4gdXBkYXRlIHNpdGUgaW4gdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeQotCQkJCQlzaXRlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSArIEZpbGUuc2VwYXJhdG9yICsgIi5lY2xpcHNlIiArIEZpbGUuc2VwYXJhdG9yICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldElkKCkgKyBGaWxlLnNlcGFyYXRvciArICJ1cGRhdGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJY3NpdGUgPSBjb25maWcuY3JlYXRlQ29uZmlndXJlZFNpdGUoc2l0ZSk7Ci0JCQkJCWNvbmZpZy5hZGRDb25maWd1cmVkU2l0ZShjc2l0ZSk7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gY3NpdGUudmVyaWZ5VXBkYXRhYmxlU3RhdHVzKCk7Ci0JCQkJCWlmICghc3RhdHVzLmlzT0soKSkKLQkJCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIHRoZXJlIHdhcyBhIHByb2JsZW0sIHRoZSB1c2VyIG11c3QgY2hvb3NlIGFuIGluc3RhbGxhdGlvbiBzaXRlCi0JCQkJCWNzaXRlID0gbnVsbDsKLQkJCQkJLy8gbm8gbmVlZCB0byBjaGVjayBpZiB0aGUgZGlyZWN0b3J5IGV4aXN0cyBiZWNhdXNlIEZpbGUuZGVsZXRlKCkgcmV0dXJucyBmYWxzZSBpZiBpdCdzIG5vdCB0aGVyZQotCQkJCQlkZWxldGVEaXIoc2l0ZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlqb2JzW2ldLnNldFRhcmdldFNpdGUoY3NpdGUpOwotCQl9Ci0JfQotCQotCQlwcml2YXRlIGJvb2xlYW4gZGVsZXRlRGlyKEZpbGUgZGlyKSB7Ci0JCWlmIChkaXIuaXNEaXJlY3RvcnkoKSkgewotCQkJU3RyaW5nW10gZmlsZXMgPSBkaXIubGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghZGVsZXRlRGlyKG5ldyBGaWxlKGRpciwgZmlsZXNbaV0pKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBkaXIuZGVsZXRlKCk7Ci0JfQotCQotCXByaXZhdGUgSUNvbmZpZ3VyZWRTaXRlIGdldE1vc3RSZWNlYW50bHlVc2VkU2l0ZSgpIHsKLQkJSURpYWxvZ1NldHRpbmdzIG1hc3RlciA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbiA9IG1hc3Rlci5nZXRTZWN0aW9uKFRhcmdldFNpdGVEaWFsb2cuTU9TVF9SRUNFQU5UTFlfVVNFRF9TSVRFX1VSTCk7Ci0JCWlmIChzZWN0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBtb3N0UmVjZWFudGx5VXNlZFNpdGVVUkxTdHJpbmcgPSBzZWN0aW9uLmdldChUYXJnZXRTaXRlRGlhbG9nLk1PU1RfUkVDRUFOVExZX1VTRURfU0lURV9VUkwpOyAKLQkJaWYgKG1vc3RSZWNlYW50bHlVc2VkU2l0ZVVSTFN0cmluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJVVJMIG1vc3RSZWNlYW50bHlVc2VkU2l0ZVVSTCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb3N0UmVjZWFudGx5VXNlZFNpdGVVUkwgPSBuZXcgVVJMKG1vc3RSZWNlYW50bHlVc2VkU2l0ZVVSTFN0cmluZyk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpIHsKLQkJCVVwZGF0ZUNvcmUubG9nKCJVcmwgZm9ybWF0IGlzIHdyb25nIGZvciB0aGUgbW9zdFJlY2VhbnRseVVzZWRTaXRlVVJMIGluIHByZWZlcmVuY2VzIiwgbXVlKTsgLy8kTk9OLU5MUy0xJAotCQkJbXVlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSUNvbmZpZ3VyZWRTaXRlW10gc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSA9IHNpdGVzW2ldOwotCQkJaWYgKG1vc3RSZWNlYW50bHlVc2VkU2l0ZVVSTC5lcXVhbHMoY29uZmlndXJlZFNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpKSkgewotCQkJCXJldHVybiBjb25maWd1cmVkU2l0ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0KLQlwcml2YXRlIElDb25maWd1cmVkU2l0ZSBnZXRGaXJzdFRhcmdldFNpdGUoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYikgewotCQlJQ29uZmlndXJlZFNpdGVbXSBzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gc2l0ZXNbaV07Ci0JCQlpZiAoZ2V0U2l0ZVZpc2liaWxpdHkoY3NpdGUsIGpvYikgJiYgY3NpdGUuZ2V0U2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpLnZlcmlmeVVwZGF0YWJsZVN0YXR1cygpLmlzT0soKSkKLQkJCQlyZXR1cm4gY3NpdGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gZmluZFBhdGNoZWRGZWF0dXJlKElGZWF0dXJlIHBhdGNoKSB7Ci0JCWZvciAoaW50IGk9MDsgaTxqb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmVhdHVyZSB0YXJnZXQgPSBqb2JzW2ldLmdldEZlYXR1cmUoKTsKLQkJCWlmICghdGFyZ2V0LmVxdWFscyhwYXRjaCkgJiYgVXBkYXRlVXRpbHMuaXNQYXRjaCh0YXJnZXQsIHBhdGNoKSkKLQkJCQlyZXR1cm4gam9ic1tpXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotICAgICAgICAvLyBjaGVjayBpZiBhbGwgam9icyBoYXZlIGEgdGFyZ2V0IHNpdGUgc2V0Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBqb2JzICE9IG51bGwgJiYgaSA8IGpvYnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChqb2JzW2ldLmdldFRhcmdldFNpdGUoKSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuaXNQYWdlQ29tcGxldGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gam9iCi0gICAgICovCi0vKiAgICBwcml2YXRlIHZvaWQgc2V0VGFyZ2V0TG9jYXRpb24oSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYikgewotICAgICAgICBpZiAoam9iICE9IG51bGwgJiYgam9iLmdldFRhcmdldFNpdGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnN0YWxsTG9jYXRpb24uc2V0VGV4dChuZXcgRmlsZShqb2IuZ2V0VGFyZ2V0U2l0ZSgpLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCkpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgdXBkYXRlU3RhdHVzKGpvYi5nZXRUYXJnZXRTaXRlKCkpOwotICAgICAgICB9Ci0gICAgfSovCi0gICAgCi0gICAgcHJpdmF0ZSBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSB0b0pvYkFycmF5KEl0ZXJhdG9yIHNlbGVjdGVkSm9icykgewotCQkKLSAgICAJaWYgKHNlbGVjdGVkSm9icyA9PSBudWxsKSAKLSAgICAJCXJldHVybiBuZXcgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uWzBdOwotICAgIAkKLSAgICAJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAJCi0gICAgCXdoaWxlIChzZWxlY3RlZEpvYnMuaGFzTmV4dCgpKSB7Ci0gICAgCQlyZXN1bHQuYWRkKHNlbGVjdGVkSm9icy5uZXh0KCkpOwotICAgIAl9Ci0gICAgCQotICAgIAlyZXR1cm4gKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdKXJlc3VsdC50b0FycmF5KG5ldyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGFuZ2VMb2NhdGlvbk9mRmVhdHVyZXMoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgam9iVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uID09IG51bGwpCi0JCSAgICByZXR1cm47Ci0JCUl0ZXJhdG9yIHNlbGVjdGVkSm9iID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCWlmIChzZWxlY3RlZEpvYiA9PSBudWxsKSAKLQkJICAgIHJldHVybjsKLQkJCi0JCVRhcmdldFNpdGVEaWFsb2cgZGlhbG9nID0gbmV3IFRhcmdldFNpdGVEaWFsb2coZ2V0U2hlbGwoKSwgY29uZmlnLCB0b0pvYkFycmF5KHNlbGVjdGlvbi5pdGVyYXRvcigpKSk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQotCQlTV1RVdGlsLnNldERpYWxvZ1NpemUoZGlhbG9nLCA0MDAsIDMwMCk7Ci0JCQotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuU2l0ZVBhZ2VfbmV3KTsgCi0JCWlmICggZGlhbG9nLm9wZW4oKSA9PSBEaWFsb2cuT0spIHsKLQkJCXBhZ2VDaGFuZ2VkKCk7Ci0JCQlqb2JWaWV3ZXIucmVmcmVzaCgpOwotCQkJdXBkYXRlU3RhdHVzKCk7Ci0JCQlhZGRlZFNpdGVzID0gZGlhbG9nLmdldEFkZGVkU2l0ZXMoKTsKLQkJfQotCX0KLQkKLQl2b2lkIHJlbW92ZUFkZGVkU2l0ZXMoKSB7Ci0JCWlmIChhZGRlZFNpdGVzIT1udWxsKSB7Ci0JCQlmb3IgKGludCBpPTA7IGk8YWRkZWRTaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCWNvbmZpZy5yZW1vdmVDb25maWd1cmVkU2l0ZShhZGRlZFNpdGVzW2ldKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1RhcmdldFNpdGVEaWFsb2cuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1RhcmdldFNpdGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQxNTM0Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9UYXJnZXRTaXRlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5PYnNlcnZhYmxlOwotaW1wb3J0IGphdmEudXRpbC5PYnNlcnZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklJbnN0YWxsQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy5VcGRhdGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLkRlZmF1bHRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGFyZ2V0U2l0ZURpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9TVF9SRUNFQU5UTFlfVVNFRF9TSVRFX1VSTCA9ICJtb3N0UmVjZWFudGx5VXNlZFNpdGVVUkwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBzaXRlVmlld2VyOwotCXByaXZhdGUgSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZzsKLQlwcml2YXRlIEJ1dHRvbiBhZGRCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gZGVsZXRlQnV0dG9uOwotICAgIHByaXZhdGUgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gam9iczsKLSAgICBwcml2YXRlIFdvcmtpbmdDb3B5IHdvcmtpbmdDb3B5OwotICAgIAotICAgIGNsYXNzIFdvcmtpbmdDb3B5IGV4dGVuZHMgT2JzZXJ2YWJsZSB7Ci0gICAgCXByaXZhdGUgQXJyYXlMaXN0IHNpdGVzPW5ldyBBcnJheUxpc3QoKTsKLSAgICAJcHJpdmF0ZSBBcnJheUxpc3QgYWRkZWQ9bmV3IEFycmF5TGlzdCgpOwotICAgIAlwcml2YXRlIElDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlOwotCi0gICAgCXB1YmxpYyBXb3JraW5nQ29weSgpIHsKLSAgICAJCU9iamVjdCBbXSBpbml0aWFsID0gY29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOwotICAgIAkJZm9yIChpbnQgaT0wOyBpPGluaXRpYWwubGVuZ3RoOyBpKyspCi0gICAgCQkJc2l0ZXMuYWRkKGluaXRpYWxbaV0pOwotICAgIAkJZm9yIChpbnQgaT0wOyBpPGpvYnMubGVuZ3RoOyBpKyspIHsKLSAgICAJCQlJQ29uZmlndXJlZFNpdGUganNpdGUgPSBqb2JzW2ldLmdldFRhcmdldFNpdGUoKTsKLSAgICAJCQlpZiAodGFyZ2V0U2l0ZT09bnVsbCkKLSAgICAJCQkJdGFyZ2V0U2l0ZSA9IGpzaXRlOwotICAgIAkJCWVsc2UKLSAgICAJCQkJaWYgKCF0YXJnZXRTaXRlLmVxdWFscyhqc2l0ZSkpCi0gICAgCQkJCQl0YXJnZXRTaXRlID0gbnVsbDsKLSAgICAJCX0KLSAgICAJfQotICAgIAkKLSAgICAJcHVibGljIHZvaWQgYWRkU2l0ZShJQ29uZmlndXJlZFNpdGUgc2l0ZSkgewotICAgIAkJc2l0ZXMuYWRkKHNpdGUpOwotICAgIAkJYWRkZWQuYWRkKHNpdGUpOwotICAgIAkJc2V0Q2hhbmdlZCgpOwotICAgIAkJbm90aWZ5T2JzZXJ2ZXJzKHNpdGUpOwotICAgIAkJY2xlYXJDaGFuZ2VkKCk7Ci0gICAgCX0KLSAgICAJCi0gICAgCXB1YmxpYyB2b2lkIHJlbW92ZVNpdGUoSUNvbmZpZ3VyZWRTaXRlIHNpdGUpIHsKLSAgICAJCXNpdGVzLnJlbW92ZShzaXRlKTsKLSAgICAJCWFkZGVkLnJlbW92ZShzaXRlKTsKLSAgICAJCXNldENoYW5nZWQoKTsKLSAgICAJCW5vdGlmeU9ic2VydmVycyhzaXRlKTsKLSAgICAJCWNsZWFyQ2hhbmdlZCgpOwotICAgIAl9Ci0gICAgCQotICAgIAlwdWJsaWMgYm9vbGVhbiBpc05ld2x5QWRkZWQoSUNvbmZpZ3VyZWRTaXRlIHNpdGUpIHsKLSAgICAJCXJldHVybiBhZGRlZC5jb250YWlucyhzaXRlKTsKLSAgICAJfQotICAgIAkKLSAgICAJcHVibGljIHZvaWQgY29tbWl0KCkgewotICAgIAkJLy8gYWRkIG5ldyBzaXRlcyB0byB0aGUgY29uZmlnCi0gICAgCQlmb3IgKGludCBpPTA7IGk8YWRkZWQuc2l6ZSgpOyBpKyspIHsKLSAgICAJCQljb25maWcuYWRkQ29uZmlndXJlZFNpdGUoKElDb25maWd1cmVkU2l0ZSlhZGRlZC5nZXQoaSkpOwotICAgIAkJfQotICAgIAkJLy8gc2V0IHNlbGVjdGVkIHNpdGUgdG8gdGhlIGpvYgotICAgIAkJZm9yIChpbnQgaT0wOyBpPGpvYnMubGVuZ3RoOyBpKyspIHsKLSAgICAJCQlqb2JzW2ldLnNldFRhcmdldFNpdGUodGFyZ2V0U2l0ZSk7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAJCi0gICAgCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgW10gZ2V0U2l0ZXMoKSB7Ci0gICAgCQlyZXR1cm4gKElDb25maWd1cmVkU2l0ZVtdKXNpdGVzLnRvQXJyYXkobmV3IElDb25maWd1cmVkU2l0ZVtzaXRlcy5zaXplKCldKTsKLSAgICAJfQotICAgIAkKLSAgICAJcHVibGljIElDb25maWd1cmVkU2l0ZSBbXSBnZXRBZGRlZFNpdGVzKCkgewotICAgIAkJcmV0dXJuIChJQ29uZmlndXJlZFNpdGVbXSlhZGRlZC50b0FycmF5KG5ldyBJQ29uZmlndXJlZFNpdGVbYWRkZWQuc2l6ZSgpXSk7Ci0gICAgCX0gICAgCQotICAgIAkKLSAgICAJcHVibGljIElDb25maWd1cmVkU2l0ZSBnZXRUYXJnZXRTaXRlKCkgewotICAgIAkJcmV0dXJuIHRhcmdldFNpdGU7Ci0gICAgCX0KLSAgICAJCi0gICAgCXB1YmxpYyB2b2lkIHNldFRhcmdldFNpdGUoSUNvbmZpZ3VyZWRTaXRlIHNpdGUpIHsKLSAgICAJCXRoaXMudGFyZ2V0U2l0ZSA9IHNpdGU7Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0gICAgY2xhc3MgU2l0ZXNDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBEZWZhdWx0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHBhcmVudCkgewotCQkJcmV0dXJuIHdvcmtpbmdDb3B5LmdldFNpdGVzKCk7Ci0JCX0KLQl9Ci0JCi0JY2xhc3MgU2l0ZXNMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCQkKLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmosIGludCBjb2wpIHsKLQkJCVVwZGF0ZUxhYmVsUHJvdmlkZXIgcHJvdmlkZXIgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpOwotCQkJcmV0dXJuIHByb3ZpZGVyLmdldExvY2FsU2l0ZUltYWdlKChJQ29uZmlndXJlZFNpdGUpIG9iaik7Ci0JCX0KLQkKLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmosIGludCBjb2wpIHsKLQkJCWlmIChjb2wgPT0gMCkgewotCQkJCUlTaXRlIHNpdGUgPSAoKElDb25maWd1cmVkU2l0ZSkgb2JqKS5nZXRTaXRlKCk7Ci0JCQkJcmV0dXJuIG5ldyBGaWxlKHNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpKS50b1N0cmluZygpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSZXZpZXdQYWdlMgotCSAqLwotCXB1YmxpYyBUYXJnZXRTaXRlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLCBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBqb2JzKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuY29ubmVjdCh0aGlzKTsKLQkJdGhpcy5qb2JzID0gam9iczsKLQkJd29ya2luZ0NvcHkgPSBuZXcgV29ya2luZ0NvcHkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5kaXNjb25uZWN0KHRoaXMpOwotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci0KLSAgICBwdWJsaWMgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAJQ29tcG9zaXRlIGNsaWVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0JCWNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY2xpZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUNvbXBvc2l0ZSBsZWZ0UGFuZWwgPSBuZXcgQ29tcG9zaXRlKGNsaWVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGNlbnRlckxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNlbnRlckxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJY2VudGVyTGF5b3V0Lm1hcmdpbldpZHRoID0gY2VudGVyTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxlZnRQYW5lbC5zZXRMYXlvdXQoY2VudGVyTGF5b3V0KTsKLQkJbGVmdFBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICAKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwobGVmdFBhbmVsLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2Vfc2l0ZUxhYmVsKTsgCi0JCWNyZWF0ZVNpdGVWaWV3ZXIobGVmdFBhbmVsKTsKLQotCQlDb21wb3NpdGUgcmlnaHRQYW5lbCA9IG5ldyBDb21wb3NpdGUoY2xpZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgcmlnaHRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlyaWdodExheW91dC5udW1Db2x1bW5zID0gMTsKLQkJcmlnaHRMYXlvdXQubWFyZ2luV2lkdGggPSByaWdodExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlyaWdodFBhbmVsLnNldExheW91dChyaWdodExheW91dCk7Ci0JCXJpZ2h0UGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOwotCi0JCW5ldyBMYWJlbChyaWdodFBhbmVsLCBTV1QuTlVMTCk7Ci0JCUNvbXBvc2l0ZSBidXR0b25Db250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHJpZ2h0UGFuZWwsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBibGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJYmxheW91dC5tYXJnaW5XaWR0aCA9IGJsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJYnV0dG9uQ29udGFpbmVyLnNldExheW91dChibGF5b3V0KTsKLQkJYnV0dG9uQ29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpKTsKLQkJCi0JCWFkZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCWFkZEJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX25ldyk7IAotCQlhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYWRkVGFyZ2V0TG9jYXRpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYWRkQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoYWRkQnV0dG9uKTsKLQkJCi0JCWRlbGV0ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCWRlbGV0ZUJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX2RlbGV0ZSk7IAotCQlkZWxldGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVtb3ZlU2VsZWN0aW9uKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlkZWxldGVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChkZWxldGVCdXR0b24pOwkJCi0KLSAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjbGllbnQsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuTXVsdGlUYXJnZXRQYWdlMiIpOyAvLyROT04tTkxTLTEkCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLSAgICAgICAgCi0gICAgICAgIHNpdGVWaWV3ZXIuc2V0SW5wdXQoam9ic1swXSk7Ci0gICAgICAgIElDb25maWd1cmVkU2l0ZSBhZmZpbml0eVNpdGUgPSBVcGRhdGVVdGlscy5nZXREZWZhdWx0VGFyZ2V0U2l0ZShjb25maWcsIGpvYnNbMF0sIHRydWUpOwotICAgICAgICBpZiAoam9ic1swXS5nZXRUYXJnZXRTaXRlKCkgIT0gbnVsbCkgCi0gICAgICAgIAlzaXRlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihqb2JzWzBdLmdldFRhcmdldFNpdGUoKSkpOwotICAgICAgICBhZGRCdXR0b24uc2V0RW5hYmxlZChhZmZpbml0eVNpdGUgPT0gbnVsbCk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gY2xpZW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVTaXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc2l0ZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC53aWR0aEhpbnQgPSAyMDA7Ci0JCXNpdGVWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2l0ZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFNpdGVzQ29udGVudFByb3ZpZGVyKCkpOwotCQlzaXRlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFNpdGVzTGFiZWxQcm92aWRlcigpKTsKLQkJc2l0ZVZpZXdlci5hZGRGaWx0ZXIobmV3IFZpZXdlckZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdiwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IG9iaikgewotCQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IgPSAoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSBzaXRlVmlld2VyLmdldElucHV0KCk7Ci0JCQkJcmV0dXJuIGdldFNpdGVWaXNpYmlsaXR5KChJQ29uZmlndXJlZFNpdGUpIG9iaiwgam9iKTsKLQkJCX0KLQkJfSk7Ci0JCXNpdGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlzZWxlY3RUYXJnZXRTaXRlKHNzZWwpOwotCQkJCXVwZGF0ZUJ1dHRvbnMoc3NlbCk7Ci0JCQl9Ci0JCX0pOwotCQl3b3JraW5nQ29weS5hZGRPYnNlcnZlcihuZXcgT2JzZXJ2ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB1cGRhdGUoT2JzZXJ2YWJsZSBhcmcwLCBPYmplY3QgYXJnMSkgewotCQkJCXNpdGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0gICAgcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotICAgIAl3b3JraW5nQ29weS5jb21taXQoKTsKLSAgICAgICAgc3VwZXIub2tQcmVzc2VkKCk7Ci0gICAgfQotICAgIAotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKHBhcmVudCk7Ci0JCXVwZGF0ZUJ1dHRvbnMoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNpdGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVCdXR0b25zKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlkZWxldGVCdXR0b24uc2V0RW5hYmxlZChjYW5EZWxldGUoc2VsZWN0aW9uKSk7Ci0JCUJ1dHRvbiBva0J1dHRvbiA9IGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKLQkJaWYgKG9rQnV0dG9uIT1udWxsKQotCQkJb2tCdXR0b24uc2V0RW5hYmxlZCghc2VsZWN0aW9uLmlzRW1wdHkoKSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjYW5EZWxldGUoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKSByZXR1cm4gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlDb25maWd1cmVkU2l0ZSBzaXRlID0gKElDb25maWd1cmVkU2l0ZSlpdGVyLm5leHQoKTsKLQkJCWlmICghd29ya2luZ0NvcHkuaXNOZXdseUFkZGVkKHNpdGUpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VsZWN0VGFyZ2V0U2l0ZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPSAoSUNvbmZpZ3VyZWRTaXRlKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChzaXRlIT1udWxsKSB7Ci0JCQlJRGlhbG9nU2V0dGluZ3MgbWFzdGVyID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCQlJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbiA9IG1hc3Rlci5nZXRTZWN0aW9uKE1PU1RfUkVDRUFOVExZX1VTRURfU0lURV9VUkwpOwotCQkJaWYgKHNlY3Rpb249PW51bGwpCi0JCQkJc2VjdGlvbiA9IG1hc3Rlci5hZGROZXdTZWN0aW9uKE1PU1RfUkVDRUFOVExZX1VTRURfU0lURV9VUkwpOwotCQkJc2VjdGlvbi5wdXQoTU9TVF9SRUNFQU5UTFlfVVNFRF9TSVRFX1VSTCwgc2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCQl3b3JraW5nQ29weS5zZXRUYXJnZXRTaXRlKHNpdGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFRhcmdldExvY2F0aW9uKCkgewotCQlEaXJlY3RvcnlEaWFsb2cgZGQgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGdldFNoZWxsKCkpOwotCQlkZC5zZXRNZXNzYWdlKFVwZGF0ZVVJTWVzc2FnZXMuSW5zdGFsbFdpemFyZF9UYXJnZXRQYWdlX2xvY2F0aW9uX21lc3NhZ2UpOyAKLQkJU3RyaW5nIHBhdGggPSBkZC5vcGVuKCk7Ci0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCWFkZENvbmZpZ3VyZWRTaXRlKGdldFNoZWxsKCksIGNvbmZpZywgbmV3IEZpbGUocGF0aCkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW1vdmVTZWxlY3Rpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2l0ZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUgPSAoSUNvbmZpZ3VyZWRTaXRlKSBpdGVyLm5leHQoKTsKLQkJCXdvcmtpbmdDb3B5LnJlbW92ZVNpdGUodGFyZ2V0U2l0ZSk7Ci0JCX0KLQkJc2l0ZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29uZmlndXJlZFNpdGUgYWRkQ29uZmlndXJlZFNpdGUoU2hlbGwgc2hlbGwsIElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsIEZpbGUgZmlsZSkgewotCQl0cnkgewotCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gY29uZmlnLmNyZWF0ZUNvbmZpZ3VyZWRTaXRlKGZpbGUpOwotCQkJSVN0YXR1cyBzdGF0dXMgPSBjc2l0ZS52ZXJpZnlVcGRhdGFibGVTdGF0dXMoKTsKLQkJCWlmIChzdGF0dXMuaXNPSygpKQotCQkJCXdvcmtpbmdDb3B5LmFkZFNpdGUoY3NpdGUpOwotCQkJZWxzZSAKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotICAgICAgICAgICAgc2l0ZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY3NpdGUpKTsKLSAgICAgICAgICAgIHNpdGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7Ci0JCQlyZXR1cm4gY3NpdGU7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIHRpdGxlID0gVXBkYXRlVUlNZXNzYWdlcy5JbnN0YWxsV2l6YXJkX1RhcmdldFBhZ2VfbG9jYXRpb25fZXJyb3JfdGl0bGU7IAotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCB0aXRsZSwgbnVsbCwgZS5nZXRTdGF0dXMoKSk7Ci0JCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSxmYWxzZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwcml2YXRlICBib29sZWFuIGdldFNpdGVWaXNpYmlsaXR5KElDb25maWd1cmVkU2l0ZSBzaXRlLCBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iKSB7Ci0JCS8vIERvIG5vdCBhbGxvdyBpbnN0YWxsaW5nIGludG8gYSBub24tdXBkYXRlYWJsZSBzaXRlCi0JCWlmICghc2l0ZS5pc1VwZGF0YWJsZSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJLy8gSWYgYWZmaW5pdHkgc2l0ZSBpcyBrbm93biwgb25seSBpdCBzaG91bGQgYmUgc2hvd24KLQkJSUNvbmZpZ3VyZWRTaXRlIGFmZmluaXR5U2l0ZSA9IFVwZGF0ZVV0aWxzLmdldEFmZmluaXR5U2l0ZShjb25maWcsIGpvYi5nZXRGZWF0dXJlKCkpOwotCQlpZiAoYWZmaW5pdHlTaXRlICE9IG51bGwpIHsKLQkJCS8vIE11c3QgY29tcGFyZSByZWZlcmVuY2VkIHNpdGVzIGJlY2F1c2UKLQkJCS8vIGNvbmZpZ3VyZWQgc2l0ZXMgdGhlbXNlbHZlcyBtYXkgY29tZSBmcm9tIAotCQkJLy8gZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zCi0JCQlyZXR1cm4gc2l0ZS5nZXRTaXRlKCkuZXF1YWxzKGFmZmluaXR5U2l0ZS5nZXRTaXRlKCkpOwotCQl9Ci0JCQotCQkvLyBDby1sb2NhdGUgdXBkYXRlcyB3aXRoIHRoZSBvbGQgZmVhdHVyZQotCQlpZiAoam9iLmdldE9sZEZlYXR1cmUoKSAhPSBudWxsKSB7Ci0JCQlJQ29uZmlndXJlZFNpdGUgb2xkU2l0ZSA9IFVwZGF0ZVV0aWxzLmdldFNpdGVXaXRoRmVhdHVyZShjb25maWcsIGpvYi5nZXRPbGRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKSk7Ci0JCQlyZXR1cm4gKHNpdGUgPT0gb2xkU2l0ZSk7Ci0JCX0KLQotCQkvLyBBbGxvdyBpbnN0YWxsaW5nIGludG8gYW55IHNpdGUgdGhhdCBpcyB1cGRhdGVhYmxlIGFuZCB0aGVyZSBpcyBubyBhZmZpbml0eSBzcGVjaWZpZWQKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgW10gZ2V0QWRkZWRTaXRlcygpIHsKLQkJcmV0dXJuIHdvcmtpbmdDb3B5LmdldEFkZGVkU2l0ZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9VSVByb2JsZW1IYW5kbGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9VSVByb2JsZW1IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YzA4NGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvVUlQcm9ibGVtSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFVJUHJvYmxlbUhhbmRsZXIgaW1wbGVtZW50cyBJUHJvYmxlbUhhbmRsZXIgewotCi0JLyoKLQkgKiBAc2VlIElQcm9ibGVtSGFuZGxlciNyZXBvcnRQcm9ibGVtKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXBvcnRQcm9ibGVtKFN0cmluZyBwcm9ibGVtVGV4dCkgewotCQlTdHJpbmcgdGl0bGUgPSBVcGRhdGVVSU1lc3NhZ2VzLlJldmVydF9Qcm9ibGVtRGlhbG9nX3RpdGxlOyAKLQkJcmV0dXJuIE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKFVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksIHRpdGxlLCBwcm9ibGVtVGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmNfd2ViYXBwL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZXJ2bGV0cy9JbnN0YWxsU2VydmxldC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmNfd2ViYXBwL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZXJ2bGV0cy9JbnN0YWxsU2VydmxldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTU1YjBlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjX3dlYmFwcC9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VydmxldHMvSW5zdGFsbFNlcnZsZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlcnZsZXRzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlZlcnNpb25lZElkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlYXJjaC5TaXRlU2VhcmNoQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZXJ2bGV0cy5TZXJ2bGV0c1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHMuSW5zdGFsbFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy5PcGVyYXRpb25zTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLkJhY2tMZXZlbEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLkVudmlyb25tZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guVXBkYXRlU2VhcmNoUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLlVwZGF0ZVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guVmVyc2lvbmVkSWRlbnRpZmllcnNGaWx0ZXI7Ci0KLS8qKgotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuCi0gKiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEluc3RhbGxTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgewotCXByaXZhdGUgU2VydmxldENvbmZpZyBzZXJ2bGV0Q29uZmlnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZMRVRfTkFNRSA9ICIvSW5zdGFsbFNlcnZsZXQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc2VydmxldENvbmZpZyA9IGNvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZXN0cm95KCkgewotCX0KLQotCXB1YmxpYyBTZXJ2bGV0Q29uZmlnIGdldFNlcnZsZXRDb25maWcoKSB7Ci0JCXJldHVybiBzZXJ2bGV0Q29uZmlnOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldEluZm8oKSB7Ci0JCXJldHVybiAiRWNsaXBzZSBJbnN0YWxsIHNlcnZsZXQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2VydmljZSgKLQkJSHR0cFNlcnZsZXRSZXF1ZXN0IHNlcnZsZXRSZXF1ZXN0LAotCQlIdHRwU2VydmxldFJlc3BvbnNlIHNlcnZsZXRSZXNwb25zZSkKLQkJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJUHJpbnRXcml0ZXIgd3JpdGVyID0KLQkJCVNlcnZsZXRzVXRpbC5jcmVhdGVSZXNwb25zZVByb2xvZ3VlKHNlcnZsZXRSZXNwb25zZSk7Ci0JCWV4ZWN1dGUod3JpdGVyLCBzZXJ2bGV0UmVxdWVzdCk7Ci0JCVNlcnZsZXRzVXRpbC5jcmVhdGVSZXNwb25zZUVwaWxvZ3VlKAotCQkJc2VydmxldFJlcXVlc3QsCi0JCQlzZXJ2bGV0UmVzcG9uc2UsCi0JCQl3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBleGVjdXRlLgotCSAqIEBwYXJhbSBzZXJ2bGV0UmVxdWVzdAotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlKAotCQlQcmludFdyaXRlciB3cml0ZXIsCi0JCUh0dHBTZXJ2bGV0UmVxdWVzdCBzZXJ2bGV0UmVxdWVzdCkgewotCQlTdHJpbmcgc2VydmVyVVJMID0gc2VydmxldFJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZXJ2ZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbGljZW5zZSA9IHNlcnZsZXRSZXF1ZXN0LmdldFBhcmFtZXRlcigibGljZW5zZSIpOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gbmVlZExpY2Vuc2VQYWdlID0gdHJ1ZTsKLQkJaWYgKGxpY2Vuc2UgIT0gbnVsbCAmJiBsaWNlbnNlLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikpIC8vJE5PTi1OTFMtMSQKLQkJCW5lZWRMaWNlbnNlUGFnZSA9IGZhbHNlOwotCi0JCVN0cmluZ1tdIHZlcnNpb25lZElkcyA9IHNlcnZsZXRSZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcygiZmVhdHVyZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKHNlcnZlclVSTCA9PSBudWxsKSB7Ci0JCQljcmVhdGVQYWdlRXJyb3Iod3JpdGVyLCBVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxTZXJ2bGV0LnVua25vd25TZXJ2ZXJVUkwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCQlpZiAodmVyc2lvbmVkSWRzID09IG51bGwpIHsKLQkJCWNyZWF0ZVBhZ2VFcnJvcih3cml0ZXIsIFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFNlcnZsZXQubm9GZWF0dXJlcyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChPcGVyYXRpb25zTWFuYWdlci5pc0luUHJvZ3Jlc3MoKSkgewotCQkJU2VydmxldHNVdGlsLmNyZWF0ZUVycm9yKHdyaXRlciwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsU2VydmxldC5pblByb2dyZXNzIiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLS8vCQlpZiAoRGV0YWlsc0Zvcm0uaXNJblByb2dyZXNzKCkpIHsKLS8vCQkJU2VydmxldHNVdGlsLmNyZWF0ZUVycm9yKHdyaXRlciwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsU2VydmxldC5pblByb2dyZXNzIiksIG51bGwpOwotLy8JCQlyZXR1cm47Ci0vLwkJfQotCQl0cnkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwoc2VydmVyVVJMKTsKLQkJCVZlcnNpb25lZElkZW50aWZpZXJbXSB2aWRzID0KLQkJCQljb21wdXRlVmVyc2lvbmVkSWRlbnRpZmllcnModmVyc2lvbmVkSWRzKTsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9Ci0JCQkJZXhlY3V0ZUluc3RhbGwod3JpdGVyLCB1cmwsIHZpZHMsIG5lZWRMaWNlbnNlUGFnZSk7Ci0JCQlpZiAoc3VjY2VzcykKLQkJCQlTZXJ2bGV0c1V0aWwuY3JlYXRlSW5mbyh3cml0ZXIpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJY3JlYXRlUGFnZUVycm9yKHdyaXRlciwgVXBkYXRlVUkuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgiSW5zdGFsbFNlcnZsZXQuaW5jb3JyZWN0VVJMRm9ybWF0IiwgLy8kTk9OLU5MUy0xJAotCQkJc2VydmVyVVJMLnRvU3RyaW5nKCkpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVQYWdlRXJyb3IoUHJpbnRXcml0ZXIgd3JpdGVyLCBTdHJpbmcgcHJvYmxlbSkgewotCQlTZXJ2bGV0c1V0aWwuY3JlYXRlRXJyb3Iod3JpdGVyLCBwcm9ibGVtLCBVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxTZXJ2bGV0LmNvbnRhY3RXZWJtYXN0ZXIiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIFZlcnNpb25lZElkZW50aWZpZXJbXSBjb21wdXRlVmVyc2lvbmVkSWRlbnRpZmllcnMoU3RyaW5nW10gYXJyYXkpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGlkX3ZlcnNpb24gPSBhcnJheVtpXTsKLQkJCWludCBzZXAgPSBpZF92ZXJzaW9uLmxhc3RJbmRleE9mKCdfJyk7Ci0JCQlpZiAoc2VwID09IC0xKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIGlkID0gaWRfdmVyc2lvbi5zdWJzdHJpbmcoMCwgc2VwKTsKLQkJCVN0cmluZyB2ZXJzaW9uID0gaWRfdmVyc2lvbi5zdWJzdHJpbmcoc2VwICsgMSk7Ci0JCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKGlkLCB2ZXJzaW9uKTsKLQkJCXJlc3VsdC5hZGQodmlkKTsKLQkJfQotCQlyZXR1cm4gKFZlcnNpb25lZElkZW50aWZpZXJbXSkgcmVzdWx0LnRvQXJyYXkoCi0JCQluZXcgVmVyc2lvbmVkSWRlbnRpZmllcltyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGV4ZWN1dGVJbnN0YWxsKAotCQlmaW5hbCBQcmludFdyaXRlciB3cml0ZXIsCi0JCWZpbmFsIFVSTCBzaXRlVVJMLAotCQlmaW5hbCBWZXJzaW9uZWRJZGVudGlmaWVyW10gdmlkcywKLQkJZmluYWwgYm9vbGVhbiBuZWVkTGljZW5zZVBhZ2UpIHsKLQotCQlEaXNwbGF5IGRpc3BsYXkgPSBTV1RVdGlsLmdldFN0YW5kYXJkRGlzcGxheSgpOwotCQlmaW5hbCBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bXSB7IGZhbHNlIH07Ci0KLQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZmluYWwgU2hlbGwgc2hlbGwgPSBVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpOwotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKHNoZWxsLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlyZXN1bHRbMF0gPQotCQkJCQkJCWRvRXhlY3V0ZUluc3RhbGwoCi0JCQkJCQkJCXdyaXRlciwKLQkJCQkJCQkJc2hlbGwsCi0JCQkJCQkJCXNpdGVVUkwsCi0JCQkJCQkJCXZpZHMsCi0JCQkJCQkJCW5lZWRMaWNlbnNlUGFnZSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiByZXN1bHRbMF07Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGRvRXhlY3V0ZUluc3RhbGwoCi0JCVByaW50V3JpdGVyIHdyaXRlciwKLQkJZmluYWwgU2hlbGwgc2hlbGwsCi0JCVVSTCBzaXRlVVJMLAotCQlWZXJzaW9uZWRJZGVudGlmaWVyW10gdmlkcywKLQkJZmluYWwgYm9vbGVhbiBuZWVkTGljZW5zZVBhZ2UpIHsKLQkJCQotCQlzaGVsbC5mb3JjZUFjdGl2ZSgpOwotCi0JCVVwZGF0ZVNlYXJjaFNjb3BlIHNlYXJjaFNjb3BlID0gbmV3IFVwZGF0ZVNlYXJjaFNjb3BlKCk7Ci0JCXNlYXJjaFNjb3BlLmFkZFNlYXJjaFNpdGUoCi0JCQlzaXRlVVJMLnRvU3RyaW5nKCksCi0JCQlzaXRlVVJMLAotCQkJbmV3IFN0cmluZ1swXSk7Ci0KLQkJZmluYWwgVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0ID0KLQkJCW5ldyBVcGRhdGVTZWFyY2hSZXF1ZXN0KAotCQkJCW5ldyBTaXRlU2VhcmNoQ2F0ZWdvcnkoKSwKLQkJCQlzZWFyY2hTY29wZSk7Ci0JCi0JCXNlYXJjaFJlcXVlc3QuYWRkRmlsdGVyKG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyc0ZpbHRlcih2aWRzKSk7Ci0JCXNlYXJjaFJlcXVlc3QuYWRkRmlsdGVyKG5ldyBFbnZpcm9ubWVudEZpbHRlcigpKTsKLQkJc2VhcmNoUmVxdWVzdC5hZGRGaWx0ZXIobmV3IEJhY2tMZXZlbEZpbHRlcigpKTsKLQotCQlzaGVsbC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlvcGVuV2l6YXJkKHNoZWxsLCBzZWFyY2hSZXF1ZXN0KTsKLQkJCX0KLQkJfSk7CQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBvcGVuV2l6YXJkKFNoZWxsIHNoZWxsLCBVcGRhdGVTZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3QpIHsKLQkJSW5zdGFsbFdpemFyZCB3aXphcmQgPSBuZXcgSW5zdGFsbFdpemFyZChzZWFyY2hSZXF1ZXN0KTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBSZXNpemFibGVXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLS8vCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KAotLy8JCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX09QVElPTkFMX0lOU1RBTExfVElUTEUpKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSg2MDAsIDUwMCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCWlmICh3aXphcmQuaXNTdWNjZXNzZnVsSW5zdGFsbCgpKQotCQkJVXBkYXRlVUkucmVxdWVzdFJlc3RhcnQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyY193ZWJhcHAvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlcnZsZXRzL1NlcnZsZXRzVXRpbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmNfd2ViYXBwL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZXJ2bGV0cy9TZXJ2bGV0c1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU1NzE4Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyY193ZWJhcHAvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlcnZsZXRzL1NlcnZsZXRzVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VydmxldHM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuYm9vdC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFNlcnZsZXRzVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2ZXJJbmZvKEh0dHBTZXJ2bGV0UmVxdWVzdCBzZXJ2bGV0UmVxdWVzdCkgewotCQlTdHJpbmcgaG9zdCA9IHNlcnZsZXRSZXF1ZXN0LmdldFNlcnZlck5hbWUoKTsKLQkJaW50IHBvcnQgPSBzZXJ2bGV0UmVxdWVzdC5nZXRTZXJ2ZXJQb3J0KCk7Ci0JCVN0cmluZyBjb250ZXh0ID0gc2VydmxldFJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKTsKLQotCQlFbnVtZXJhdGlvbiBhdHRzID0gc2VydmxldFJlcXVlc3QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoOyBhdHRzLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJU3RyaW5nIGF0dE5hbWUgPSAoU3RyaW5nKSBhdHRzLm5leHRFbGVtZW50KCk7Ci0JCQlPYmplY3QgYXR0VmFsdWUgPSBzZXJ2bGV0UmVxdWVzdC5nZXRQYXJhbWV0ZXIoYXR0TmFtZSk7Ci0JCQlidWZmLmFwcGVuZChhdHROYW1lICsgIj0iICsgIlwiIiArIGF0dFZhbHVlICsgIlwiKyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCXJldHVybiBob3N0ICsgIjoiICsgcG9ydCArIGNvbnRleHQgKyAiPyIgKyBidWZmLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJpbnRXcml0ZXIgY3JlYXRlUmVzcG9uc2VQcm9sb2d1ZShIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKQotCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXNwb25zZS5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJUHJpbnRXcml0ZXIgd3JpdGVyID0gcmVzcG9uc2UuZ2V0V3JpdGVyKCk7Ci0JCVN0cmluZyB0aXRsZSA9IFVwZGF0ZVVJLmdldFN0cmluZygiU2VydmxldHNVdGlsLnJlc3BvbnNlVGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnRsbigKLQkJCSIiIC8vJE5PTi1OTFMtMSQKLQkJCQkrICI8IURPQ1RZUEUgSFRNTCBQVUJMSUMgXCIgLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTlwiPiIgLy8kTk9OLU5MUy0xJAotCQkJCSsgIlxuIDxIVE1MPiBcbiA8SEVBRD4gXG4iIC8vJE5PTi1OTFMtMSQKLQkJCQkrICI8VElUTEU+Iit0aXRsZSsiPC9USVRMRT5cbiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJKyAiPE1FVEEgaHR0cC1lcXVpdj1cIkNvbnRlbnQtVHlwZVwiIGNvbnRlbnQ9XCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLThcIj5cbiIgLy8kTk9OLU5MUy0xJAotCQkJCSsgIjwvSEVBRD4iKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnRsbigiIDxCT0RZIHRvcG1hcmdpbj1cIjBcIiBsZWZ0bWFyZ2luPVwiMFwiPiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiB3cml0ZXI7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUVycm9yKAotCQlQcmludFdyaXRlciB3cml0ZXIsCi0JCVN0cmluZyBwcm9ibGVtLAotCQlTdHJpbmcgcmVzb2x1dGlvbikgewotCQljcmVhdGVIZWFkaW5nKHdyaXRlciwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJTZXJ2bGV0c1V0aWwudXBkYXRlRmFpbGVkIikpOyAvLyROT04tTkxTLTEkCi0JCXN0YXJ0VGV4dEFyZWEod3JpdGVyKTsKLQkJY3JlYXRlUGFyYWdyYXBoKHdyaXRlciwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJTZXJ2bGV0c1V0aWwucHJvYmxlbSIpLCBwcm9ibGVtKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVzb2x1dGlvbiAhPSBudWxsKSB7Ci0JCQl3cml0ZXIucHJpbnRsbigiPHA+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWNyZWF0ZVBhcmFncmFwaCh3cml0ZXIsIFVwZGF0ZVVJLmdldFN0cmluZygiU2VydmxldHNVdGlsLndoYXRUb0RvIiksIHJlc29sdXRpb24pOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZW5kVGV4dEFyZWEod3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlUGFyYWdyYXBoKAotCQlQcmludFdyaXRlciB3cml0ZXIsCi0JCVN0cmluZyBoZWFkaW5nLAotCQlTdHJpbmcgdGV4dCkgewotCQl3cml0ZXIucHJpbnQoIjxiPjxmb250IGNvbG9yPVwiIzVCNzhBQ1wiPiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludChoZWFkaW5nKTsKLQkJd3JpdGVyLnByaW50bG4oIjwvYj48L2ZvbnQ+PGJyPiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludGxuKHRleHQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVJbmZvKFByaW50V3JpdGVyIHdyaXRlcikgewotCQljcmVhdGVIZWFkaW5nKHdyaXRlciwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJTZXJ2bGV0c1V0aWwudXBkYXRlSW5Qcm9ncmVzcyIpKTsgLy8kTk9OLU5MUy0xJAotCQlzdGFydFRleHRBcmVhKHdyaXRlcik7Ci0JCXdyaXRlci5wcmludGxuKAotCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJTZXJ2bGV0c1V0aWwudXBkYXRlSW5pdGlhdGVkIikpOyAvLyROT04tTkxTLTEkCi0JCWVuZFRleHRBcmVhKHdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNXaW4zMigpIHsKLQkJcmV0dXJuIEJvb3RMb2FkZXIuZ2V0V1MoKS5lcXVhbHMoIndpbjMyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHN0YXJ0VGV4dEFyZWEoUHJpbnRXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlci5wcmludGxuKAotCQkJIjx0YWJsZSBib3JkZXI9XCIwXCIgd2lkdGg9XCIxMDAlXCIgY2VsbHNwYWNpbmc9XCI1XCIgY2VsbHBhZGRpbmc9XCI1XCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oIjx0cj4iKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnQoIjx0ZCB3aWR0aD1cIjEwMCVcIj4iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaXNXaW4zMigpKQotCQkJd3JpdGVyLnByaW50bG4oIjxmb250IGZhY2U9XCJNUyBTYW5zIFNlcmlmXCIgc2l6ZT1cIjFcIj4iKTsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQl3cml0ZXIucHJpbnRsbigiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbmRUZXh0QXJlYShQcmludFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKGlzV2luMzIoKSkKLQkJCXdyaXRlci5wcmludGxuKCI8L2ZvbnQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oIjwvdGQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oIjwvdHI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oIjwvdGFibGU+Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlSGVhZGluZyhQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZyB0aXRsZSkgewotCQl3cml0ZXIucHJpbnRsbigKLQkJCSI8dGFibGUgY29scz0xIHdpZHRoPVwiNTg4XCIgY2VsbHNwYWNpbmc9XCIwXCIgY2VsbHBhZGRpbmc9XCIwXCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oIjx0cj4iKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnRsbigKLQkJCSI8dGQgYmFja2dyb3VuZD1cImltYWdlcy9mb3JtX2Jhbm5lci5qcGdcIiB3aWR0aD1cIjU4MFwiIGhlaWdodD1cIjMwXCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50KCI8cD48Yj48Zm9udCBzaXplPVwiM1wiIGZhY2U9XCJUYWhvbWFcIj4mbmJzcDsiKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnQodGl0bGUpOwotCQl3cml0ZXIucHJpbnRsbigiPC9mb250PjwvYj48L3A+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oIjwvdGQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oIjwvdHI+Iik7IC8vJE5PTi1OTFMtMSQKLQotCQl3cml0ZXIucHJpbnRsbigiPHRyPiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludGxuKAotCQkJIjx0ZCB3aWR0aD1cIjU4MFwiPjxpbWcgYm9yZGVyPVwiMFwiIHNyYz1cImltYWdlcy9mb3JtX3VuZGVybGluZS5qcGdcIiB3aWR0aD1cIjYwMFwiIGhlaWdodD1cIjE1XCI+PC90ZD4iKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnRsbigiPC90ZD4iKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnRsbigiPC90cj4iKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnRsbigiPC90YWJsZT4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVSZXNwb25zZUVwaWxvZ3VlKAotCQlIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKLQkJSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKLQkJUHJpbnRXcml0ZXIgd3JpdGVyKSB7Ci0KLQkJU3RyaW5nIGJhY2tVUkwgPSBnZXRPcmlnaW5hdGluZ1VSTChyZXF1ZXN0KTsKLQkJaWYgKGJhY2tVUkwgIT0gbnVsbCkgewotCQkJc3RhcnRUZXh0QXJlYSh3cml0ZXIpOwotCQkJU3RyaW5nIGJhY2tUZXh0ID0gVXBkYXRlVUkuZ2V0U3RyaW5nKCJTZXJ2bGV0c1V0aWwuYmFjayIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIucHJpbnQoIjxpbWcgYm9yZGVyPVwiMFwiIHNyYz1cImltYWdlcy9iYWNrd2FyZF9uYXYuZ2lmXCIvPjxhIGhyZWY9XCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLnByaW50KGdldE9yaWdpbmF0aW5nVVJMKHJlcXVlc3QpKTsKLQkJCXdyaXRlci5wcmludCgiXCI+IitiYWNrVGV4dCsiPC9hPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWVuZFRleHRBcmVhKHdyaXRlcik7Ci0JCX0KLQkJd3JpdGVyLnByaW50bG4oIiA8L0JPRFk+ICIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludGxuKCI8L0hUTUw+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLmNsb3NlKCk7Ci0JfQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRPcmlnaW5hdGluZ1VSTChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgewotCQlyZXR1cm4gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoImJhY2tVUkwiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL1dFQi1JTkYvLmN2c2lnbm9yZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL1dFQi1JTkYvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBiMDdlOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9XRUItSU5GLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1jbGFzc2VzCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9XRUItSU5GL2xpYi8uY3ZzaWdub3JlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvV0VCLUlORi9saWIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQyOTJhMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9XRUItSU5GL2xpYi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdXBkYXRlLXNlcnZsZXRzLmphcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjg0Nzc0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLQotCi08IURPQ1RZUEUgd2ViLWFwcAotICAgIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjIvL0VOIgotICAgICJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZHRkcy93ZWItYXBwXzIuMi5kdGQiPgotCi08d2ViLWFwcD4KLQotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPmluc3RhbGw8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlcnZsZXRzLkluc3RhbGxTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotICAgIDwvc2VydmxldD4KLSAgICAKLQk8c2VydmxldC1tYXBwaW5nPgotCQk8c2VydmxldC1uYW1lPmluc3RhbGw8L3NlcnZsZXQtbmFtZT4KLQkJPHVybC1wYXR0ZXJuPi9pbnN0YWxsPC91cmwtcGF0dGVybj4KLQk8L3NlcnZsZXQtbWFwcGluZz4KLQotPC93ZWItYXBwPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL2ltYWdlcy9iYWNrd2FyZF9uYXYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvaW1hZ2VzL2JhY2t3YXJkX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MTg4YjcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvaW1hZ2VzL2JhY2t3YXJkX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9pbWFnZXMvZm9ybV9iYW5uZXIuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvaW1hZ2VzL2Zvcm1fYmFubmVyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUzZTJkMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9pbWFnZXMvZm9ybV9iYW5uZXIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvaW1hZ2VzL2Zvcm1fdW5kZXJsaW5lLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL2ltYWdlcy9mb3JtX3VuZGVybGluZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZjNkMGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvaW1hZ2VzL2Zvcm1fdW5kZXJsaW5lLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTYwZjc2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS51cGRhdGU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL1JFQURNRS5UWFQgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL1JFQURNRS5UWFQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMzUzN2MuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9SRUFETUUuVFhUCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1UaGlzIGJ1bmRsZSBpcyBvYnNvbGV0ZS4gRnVuY3Rpb25hbGl0eSBmcm9tIHRoaXMgYnVuZGxlIHdhcyBzcGxpdCBpbnRvIHRoZQotb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUgYW5kIG9yZy5lY2xpcHNlLnVwZGF0ZS51aSBidW5kbGVzIGluIHRoZSBFY2xpcHNlIDIuMSByZWxlYXNlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK